# エコシステム統合設計書

## 注意事項

`console.log`は絶対に書かないようにしてください。

ハードコードしないようにしてください。必ず、`./my-blog/config.toml`や`./oauth/.env.production`を使用するように。または`~/.config/syui/ai/log/config.json`を使用するように。

重複する名前のenvを作らないようにしてください。新しい環境変数を作る際は必ず検討してください。

```sh
# ダメな例
VITE_OAUTH_COLLECTION_USER=ai.syui.log.user
VITE_OAUTH_COLLECTION_CHAT=ai.syui.log.chat
```

## oauth appの設計

> ./oauth/.env.production

```sh
VITE_ATPROTO_PDS=syu.is
VITE_ADMIN_HANDLE=ai.syui.ai
VITE_AI_HANDLE=ai.syui.ai
VITE_OAUTH_COLLECTION=ai.syui.log
```

これらは非常にシンプルな流れになっており、すべての項目は、共通します。短縮できる場合があります。handleは変わる可能性があるので、できる限りdidを使いましょう。

1. handleからpds, didを取得できる ... com.atproto.repo.describeRepo
2. pdsが分かれば、pdsApi, bskyApi, plcApiを割り当てられる
3. bskyApiが分かれば、getProfileでavatar-uriを取得できる ... app.bsky.actor.getProfile
4. pdsAPiからアカウントにあるcollectionのrecordの情報を取得できる ... com.atproto.repo.listRecords

### コメントを表示する

1. VITE_ADMIN_HANDLEから管理者のhandleを取得する。
2. VITE_ATPROTO_PDSから管理者のアカウントのpdsを取得する。
3. pdsからpdsApi, bskApi, plcApiを割り当てる。

```rust
    match pds {
        "bsky.social" | "bsky.app" => NetworkConfig {
            pds_api: format!("https://{}", pds),
            plc_api: "https://plc.directory".to_string(),
            bsky_api: "https://public.api.bsky.app".to_string(),
            web_url: "https://bsky.app".to_string(),
        },
        "syu.is" => NetworkConfig {
            pds_api: "https://syu.is".to_string(),
            plc_api: "https://plc.syu.is".to_string(),
            bsky_api: "https://bsky.syu.is".to_string(),
            web_url: "https://web.syu.is".to_string(),
        },
        _ => {
            // Default to Bluesky network for unknown PDS
            NetworkConfig {
                pds_api: format!("https://{}", pds),
                plc_api: "https://plc.directory".to_string(),
                bsky_api: "https://public.api.bsky.app".to_string(),
                web_url: "https://bsky.app".to_string(),
            }
        }
    }
```

4. 管理者アカウントであるVITE_ADMIN_HANDLEとVITE_ATPROTO_PDSから`ai.syui.log.user`というuserlistを取得する。

```sh
curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.listRecords?repo=${VITE_ADMIN_HANDLE}&collection=ai.syui.log.user" 
---
syui.ai
```

5. ユーザーがわかったら、そのユーザーのpdsを判定する。

```sh
curl -sL "https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=syui.ai" |jq -r ".didDoc.service.[].serviceEndpoint"
---
https://shiitake.us-east.host.bsky.network

curl -sL "https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=syui.ai" |jq -r ".did"
---
did:plc:uqzpqmrjnptsxezjx4xuh2mn
```

6. pdsからpdsApi, bskApi, plcApiを割り当てる。

```rust
    match pds {
        "bsky.social" | "bsky.app" => NetworkConfig {
            pds_api: format!("https://{}", pds),
            plc_api: "https://plc.directory".to_string(),
            bsky_api: "https://public.api.bsky.app".to_string(),
            web_url: "https://bsky.app".to_string(),
        },
        "syu.is" => NetworkConfig {
            pds_api: "https://syu.is".to_string(),
            plc_api: "https://plc.syu.is".to_string(),
            bsky_api: "https://bsky.syu.is".to_string(),
            web_url: "https://web.syu.is".to_string(),
        },
        _ => {
            // Default to Bluesky network for unknown PDS
            NetworkConfig {
                pds_api: format!("https://{}", pds),
                plc_api: "https://plc.directory".to_string(),
                bsky_api: "https://public.api.bsky.app".to_string(),
                web_url: "https://bsky.app".to_string(),
            }
        }
    }
```

7. ユーザーの情報を取得、表示する

```sh
bsky_api=https://public.api.bsky.app
user_did=did:plc:uqzpqmrjnptsxezjx4xuh2mn
curl -sL "$bsky_api/xrpc/app.bsky.actor.getProfile?actor=$user_did"|jq -r .avatar
---
https://cdn.bsky.app/img/avatar/plain/did:plc:uqzpqmrjnptsxezjx4xuh2mn/bafkreid6kcc5pnn4b3ar7mj6vi3eiawhxgkcrw3edgbqeacyrlnlcoetea@jpeg
```

### AIの情報を表示する

AIが持つ`ai.syui.log.chat.lang`, `ai.syui.log.chat.comment`を表示します。

なお、これは通常、`VITE_ADMIN_HANDLE`にputRecordされます。そこから情報を読み込みます。`VITE_AI_HANDLE`はそのrecordの`author`のところに入ります。

```json
"author": {
  "did": "did:plc:4hqjfn7m6n5hno3doamuhgef",
  "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreiaxkv624mffw3cfyi67ufxtwuwsy2mjw2ygezsvtd44ycbgkfdo2a@jpeg",
  "handle": "yui.syui.ai",
  "displayName": "ai"
}
```

1. VITE_ADMIN_HANDLEから管理者のhandleを取得する。
2. VITE_ATPROTO_PDSから管理者のアカウントのpdsを取得する。
3. pdsからpdsApi, bskApi, plcApiを割り当てる。

```rust
    match pds {
        "bsky.social" | "bsky.app" => NetworkConfig {
            pds_api: format!("https://{}", pds),
            plc_api: "https://plc.directory".to_string(),
            bsky_api: "https://public.api.bsky.app".to_string(),
            web_url: "https://bsky.app".to_string(),
        },
        "syu.is" => NetworkConfig {
            pds_api: "https://syu.is".to_string(),
            plc_api: "https://plc.syu.is".to_string(),
            bsky_api: "https://bsky.syu.is".to_string(),
            web_url: "https://web.syu.is".to_string(),
        },
        _ => {
            // Default to Bluesky network for unknown PDS
            NetworkConfig {
                pds_api: format!("https://{}", pds),
                plc_api: "https://plc.directory".to_string(),
                bsky_api: "https://public.api.bsky.app".to_string(),
                web_url: "https://bsky.app".to_string(),
            }
        }
    }
```

4. 管理者アカウントであるVITE_ADMIN_HANDLEとVITE_ATPROTO_PDSから`ai.syui.log.chat.lang`, `ai.syui.log.chat.comment`を取得する。

```sh
curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.listRecords?repo=${VITE_ADMIN_HANDLE}&collection=ai.syui.log.chat.comment" 
```

5. AIのprofileを取得する。

```sh
curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.describeRepo?repo=$VITE_AI_HANDLE" |jq -r ".didDoc.service.[].serviceEndpoint"
---
https://syu.is

curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.describeRepo?repo=$VITE_AI_HANDLE" |jq -r ".did"
did:plc:6qyecktefllvenje24fcxnie
```

6. pdsからpdsApi, bskApi, plcApiを割り当てる。

```rust
    match pds {
        "bsky.social" | "bsky.app" => NetworkConfig {
            pds_api: format!("https://{}", pds),
            plc_api: "https://plc.directory".to_string(),
            bsky_api: "https://public.api.bsky.app".to_string(),
            web_url: "https://bsky.app".to_string(),
        },
        "syu.is" => NetworkConfig {
            pds_api: "https://syu.is".to_string(),
            plc_api: "https://plc.syu.is".to_string(),
            bsky_api: "https://bsky.syu.is".to_string(),
            web_url: "https://web.syu.is".to_string(),
        },
        _ => {
            // Default to Bluesky network for unknown PDS
            NetworkConfig {
                pds_api: format!("https://{}", pds),
                plc_api: "https://plc.directory".to_string(),
                bsky_api: "https://public.api.bsky.app".to_string(),
                web_url: "https://bsky.app".to_string(),
            }
        }
    }
```

7. AIの情報を取得、表示する

```sh
bsky_api=https://bsky.syu.is
user_did=did:plc:6qyecktefllvenje24fcxnie
curl -sL "$bsky_api/xrpc/app.bsky.actor.getProfile?actor=$user_did"|jq -r .avatar
---
https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg
```

## 中核思想
- **存在子理論**: この世界で最も小さいもの（存在子/ai）の探求
- **唯一性原則**: 現実の個人の唯一性をすべてのシステムで担保
- **現実の反映**: 現実→ゲーム→現実の循環的影響

## システム構成図

```
存在子(ai) - 最小単位の意識
    ↓
[ai.moji] 文字システム
    ↓
[ai.os] + [ai.game device] ← 統合ハードウェア
    ├── ai.shell (Claude Code的機能)
    ├── ai.gpt (自律人格・記憶システム)
    ├── ai.log (AIと連携するブログシステム)
    ├── ai.ai (個人特化AI・心を読み取るAI)
    ├── ai.card (カードゲーム・iOS/Web/API)
    └── ai.bot (分散SNS連携・カード配布)
    ↓
[ai.verse] メタバース
    ├── world system (惑星型3D世界)
    ├── at system (atproto/分散SNS)
    ├── yui system (唯一性担保)
    └── ai system (存在属性)
```

## 名前規則

名前規則は他のprojectと全て共通しています。exampleを示しますので、このルールに従ってください。

ここでは`ai.os`の場合の名前規則の例を記述します。

name: ai.os

- **[ "package", "code", "command" ]**: aios
- **[ "dir", "url" ]**: ai/os
- **[ "domain", "json" ]**: ai.os

```sh
$ curl -sL https://git.syui.ai/ai/ai/raw/branch/main/ai.json|jq .ai.os
{ "type": "os" }
```

```json
{
  "ai": {
    "os":{}
  }
}
```

他のprojectも同じ名前規則を採用します。`ai.gpt`ならpackageは`aigpt`です。

## config(設定ファイル, env, 環境依存)

`config`を置く場所は統一されており、各projectの名前規則の`dir`項目を使用します。例えば、aiosの場合は`~/.config/syui/ai/os/`以下となります。pythonなどを使用する場合、`python -m venv`などでこのpackage config dirに環境を構築して実行するようにしてください。

domain形式を採用して、私は各projectを`git.syui.ai/ai`にhostしていますから、`~/.config/syui/ai`とします。

```sh
[syui.ai]
syui/ai
```

```sh
# example
~/.config/syui/ai
    ├── card
    ├── gpt
    ├── os
    └── shell
```

## 各システム詳細

### ai.gpt - 自律的送信AI
**目的**: 関係性に基づく自発的コミュニケーション

**中核概念**:
- **人格**: 記憶（過去の発話）と関係性パラメータで構成
- **唯一性**: atproto accountとの1:1紐付け、改変不可能
- **自律送信**: 関係性が閾値を超えると送信機能が解禁

**技術構成**:
- `MemoryManager`: 完全ログ→AI要約→コア判定→選択的忘却
- `RelationshipTracker`: 時間減衰・日次制限付き関係性スコア
- `TransmissionController`: 閾値判定・送信トリガー
- `Persona`: AI運勢（1-10ランダム）による人格変動

**実装仕様**:
```
- 言語: Python (fastapi_mcp)
- ストレージ: JSON/SQLite選択式
- インターフェース: Python CLI (click/typer)
- スケジューリング: cron-like自律処理
```

### ai.card - カードゲームシステム
**目的**: atproto基盤でのユーザーデータ主権カードゲーム

**現在の状況**:
- ai.botの機能として実装済み
- atproto accountでmentionすると1日1回カードを取得
- ai.api (MCP server予定) でユーザー管理

**移行計画**:
- **iOS移植**: Claudeが担当予定
- **データ保存**: atproto collection recordに保存（ユーザーがデータを所有）
- **不正防止**: OAuth 2.1 scope (実装待ち) + MCP serverで対応
- **画像ファイル**: Cloudflare Pagesが最適

**yui system適用**:
- カードの効果がアカウント固有
- 改ざん防止によるゲームバランス維持
- 将来的にai.verseとの統合で固有スキルと連動

### ai.ai - 心を読み取るAI
**目的**: 個人特化型AI・深層理解システム

**ai.gptとの関係**:
- ai.gpt → ai.ai: 自律送信AIから心理分析AIへの連携
- 関係性パラメータの深層分析
- ユーザーの思想コア部分の特定支援

### ai.verse - UEメタバース
**目的**: 現実反映型3D世界

**yui system実装**:
- キャラクター ↔ プレイヤー 1:1紐付け
- unique skill: そのプレイヤーのみ使用可能
- 他プレイヤーは同キャラでも同スキル使用不可

**統合要素**:
- ai.card: ゲーム内アイテムとしてのカード
- ai.gpt: NPCとしての自律AI人格
- atproto: ゲーム内プロフィール連携

## データフロー設計

### 唯一性担保の実装
```
現実の個人 → atproto account (DID) → ゲーム内avatar → 固有スキル
    ↑_______________________________|  (現実の反映)
```

### AI駆動変換システム
```
遊び・創作活動 → ai.gpt分析 → 業務成果変換 → 企業価値創出
    ↑________________________|  (Play-to-Work)
```

### カードゲーム・データ主権フロー
```
ユーザー → ai.bot mention → カード生成 → atproto collection → ユーザー所有
    ↑                                ↓
    ← iOS app表示 ← ai.card API ←
```

## 技術スタック統合

### Core Infrastructure
- **OS**: Rust-based ai.os (Arch Linux base)
- **Container**: Docker image distribution
- **Identity**: atproto selfhost server + DID管理
- **AI**: fastapi_mcp server architecture
- **CLI**: Python unified (click/typer) - Rustから移行

### Game Engine Integration
- **Engine**: Unreal Engine (Blueprint)
- **Data**: atproto → UE → atproto sync
- **Avatar**: 分散SNS profile → 3D character
- **Streaming**: game screen = broadcast screen

### Mobile/Device
- **iOS**: ai.card移植 (Claude担当)
- **Hardware**: ai.game device (future)
- **Interface**: controller-first design

## 実装優先順位

### Phase 1: AI基盤強化 (現在進行)
- [ ] ai.gpt memory system完全実装
  - 記憶の階層化（完全ログ→要約→コア→忘却）
  - 関係性パラメータの時間減衰システム
  - AI運勢による人格変動機能
- [ ] ai.card iOS移植
  - atproto collection record連携
  - MCP server化（ai.api刷新）
- [ ] fastapi_mcp統一基盤構築

### Phase 2: ゲーム統合
- [ ] ai.verse yui system実装
  - unique skill機能
  - atproto連携強化
- [ ] ai.gpt ↔ ai.ai連携機能
- [ ] 分散SNS ↔ ゲーム同期

### Phase 3: メタバース浸透
- [ ] VTuber配信機能統合
- [ ] Play-to-Work変換システム
- [ ] ai.game device prototype

## 将来的な連携構想

### システム間連携（現在は独立実装）
```
ai.gpt (自律送信) ←→ ai.ai (心理分析)
ai.card (iOS,Web,API) ←→ ai.verse (UEゲーム世界)
```

**共通基盤**: fastapi_mcp
**共通思想**: yui system（現実の反映・唯一性担保）

### データ改ざん防止戦略
- **短期**: MCP serverによる検証
- **中期**: OAuth 2.1 scope実装待ち
- **長期**: ブロックチェーン的整合性チェック

## AIコミュニケーション最適化

### プロジェクト要件定義テンプレート
```markdown
# [プロジェクト名] 要件定義

## 哲学的背景
- 存在子理論との関連：
- yui system適用範囲：
- 現実反映の仕組み：

## 技術要件
- 使用技術（fastapi_mcp統一）：
- atproto連携方法：
- データ永続化方法：

## ユーザーストーリー
1. ユーザーが...すると
2. システムが...を実行し
3. 結果として...が実現される

## 成功指標
- 技術的：
- 哲学的（唯一性担保）：
```

### Claude Code活用戦略
1. **小さく始める**: ai.gptのMCP機能拡張から
2. **段階的統合**: 各システムを個別に完成させてから統合
3. **哲学的一貫性**: 各実装でyui systemとの整合性を確認
4. **現実反映**: 実装がどう現実とゲームを繋ぐかを常に明記

## 開発上の留意点

### MCP Server設計指針
- 各AI（gpt, card, ai, bot）は独立したMCPサーバー
- fastapi_mcp基盤で統一
- atproto DIDによる認証・認可

### 記憶・データ管理
- **ai.gpt**: 関係性の不可逆性重視
- **ai.card**: ユーザーデータ主権重視
- **ai.verse**: ゲーム世界の整合性重視

### 唯一性担保実装
- atproto accountとの1:1紐付け必須
- 改変不可能性をハッシュ・署名で保証
- 他システムでの再現不可能性を技術的に実現

## 継続的改善
- 各プロジェクトでこの設計書を参照
- 新機能追加時はyui systemとの整合性をチェック
- 他システムへの影響を事前評価
- Claude Code導入時の段階的移行計画

## ai.gpt深層設計思想

### 人格の不可逆性
- **関係性の破壊は修復不可能**: 現実の人間関係と同じ重み
- **記憶の選択的忘却**: 重要でない情報は忘れるが、コア記憶は永続
- **時間減衰**: すべてのパラメータは時間とともに自然減衰

### AI運勢システム
- 1-10のランダム値で日々の人格に変化
- 連続した幸運/不運による突破条件
- 環境要因としての人格形成

### 記憶の階層構造
1. **完全ログ**: すべての会話を記録
2. **AI要約**: 重要な部分を抽出して圧縮
3. **思想コア判定**: ユーザーの本質的な部分を特定
4. **選択的忘却**: 重要度の低い情報を段階的に削除

### 実装における重要な決定事項
- **言語統一**: Python (fastapi_mcp) で統一、CLIはclick/typer
- **データ形式**: JSON/SQLite選択式
- **認証**: atproto DIDによる唯一性担保
- **段階的実装**: まず会話→記憶→関係性→送信機能の順で実装

### 送信機能の段階的実装
- **Phase 1**: CLIでのprint出力（現在）
- **Phase 2**: atproto直接投稿
- **Phase 3**: ai.bot (Rust/seahorse) との連携
- **将来**: マルチチャネル対応（SNS、Webhook等）

## ai.gpt実装状況（2025/01/06）

### 完成した機能
- 階層的記憶システム（MemoryManager）
- 不可逆的関係性システム（RelationshipTracker）
- AI運勢システム（FortuneSystem）
- 統合人格システム（Persona）
- スケジューラー（5種類のタスク）
- MCP Server（9種類のツール）
- 設定管理（~/.config/aigpt/）
- 全CLIコマンド実装

### 次の開発ポイント
- `ai_gpt/DEVELOPMENT_STATUS.md` を参照
- 自律送信: transmission.pyでatproto実装
- ai.bot連携: 新規bot_connector.py作成
- テスト: tests/ディレクトリ追加

## このprojectはai.log

このprojectは`ai.log`にあたります。

package, codeは`ailog`となります。

```sh
$ curl -sL https://git.syui.ai/ai/ai/raw/branch/main/ai.json|jq .ai.log
{
  "type": "blog",
  "text": "今はhugoでblogを作ってる。それをclaude codeでrustの静的ブログジェネレーターを作る。AI機能を付け加える。AI機能は具体的に記事の修正、情報の追加、lang:jaを自動翻訳してlang:en(page)を生成。アイが一言コメントするコメント欄の追加を行う。なお、コメント欄はatprotoと連携し、atprotoアカウントのoauthでログインして書き込める"
}
```

rustで静的ブログジェネレーターを作ります。参考になるのが`zola`です。

- https://github.com/getzola/zola

また、atprotoとの連携は`ai.card`の`atproto/oauth`の実装が参考になります。

- https://github.com/bluesky-social/atproto/blob/main/packages/api/OAUTH.md

```json
{
  "client_id": "https://example.com/client-metadata.json",
  "client_name": "Example atproto Browser App",
  "client_uri": "https://example.com",
  "logo_uri": "https://example.com/logo.png",
  "tos_uri": "https://example.com/tos",
  "policy_uri": "https://example.com/policy",
  "redirect_uris": ["https://example.com/callback"],
  "scope": "atproto",
  "grant_types": ["authorization_code", "refresh_token"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none",
  "application_type": "web",
  "dpop_bound_access_tokens": true
}
```

```js
// package
import { Agent } from '@atproto/api'
import { BrowserOAuthClient } from '@atproto/oauth-client-browser'

async function main() {
  const oauthClient = await BrowserOAuthClient.load({
    clientId: '<YOUR_CLIENT_ID>',
    handleResolver: 'https://bsky.social/',
  })

  // TO BE CONTINUED
}

document.addEventListener('DOMContentLoaded', main)

// client 
const result = await oauthClient.init()

if (result) {
  if ('state' in result) {
    console.log('The user was just redirected back from the authorization page')
  }

  console.log(`The user is currently signed in as ${result.session.did}`)
}

const session = result?.session

// session
if (session) {
  const agent = new Agent(session)

  const fetchProfile = async () => {
    const profile = await agent.getProfile({ actor: agent.did })
    return profile.data
  }

  // Update the user interface

  document.body.textContent = `Authenticated as ${agent.did}`

  const profileBtn = document.createElement('button')
  document.body.appendChild(profileBtn)
  profileBtn.textContent = 'Fetch Profile'
  profileBtn.onclick = async () => {
    const profile = await fetchProfile()
    outputPre.textContent = JSON.stringify(profile, null, 2)
  }

  const logoutBtn = document.createElement('button')
  document.body.appendChild(logoutBtn)
  logoutBtn.textContent = 'Logout'
  logoutBtn.onclick = async () => {
    await session.signOut()
    window.location.reload()
  }

  const outputPre = document.createElement('pre')
  document.body.appendChild(outputPre)
}
```

AIとの連携は`ai.gpt`をみてください。

- https://git.syui.ai/ai/gpt

`claude.md`があるので、`../gpt/claude.md`を読み込んでください。

### build deploy

主に`github-actions`, `cloudflare pages`を使用することを想定しています。

build, deploy, AIとの連携は記事をpushすると、自動で行われます。

```yml
// .github/workflows/gh-pages.yml
name: github pages

on:
  push:
    branches:
    - main

jobs:
  build-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Setup Hugo
      uses: peaceiris/actions-hugo@v3
      with:
        hugo-version: "0.139.2"
        extended: true

    - name: Build
      env: 
        TZ: "Asia/Tokyo"
      run: |
          hugo version
          TZ=Asia/Tokyo hugo
          touch ./public/.nojekyll

    - name: Deploy
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./public
        publish_branch: gh-pages
```

# footer

© syui
