ui-chan-mcp 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/context/VOCABULARY.md +26 -1
- package/cue.schema.json +7 -19
- package/cues/emo_antic_lo.json +11 -2
- package/cues/emo_disgust.json +2 -2
- package/cues/emo_disgust_hi.json +2 -2
- package/cues/emo_disgust_lo.json +10 -2
- package/cues/emo_fear_lo.json +2 -2
- package/cues/emo_joy.json +2 -2
- package/cues/emo_sad_hi.json +2 -2
- package/cues/emo_sad_lo.json +1 -1
- package/cues/emo_surprise.json +7 -1
- package/cues/emo_surprise_hi.json +7 -1
- package/cues/emo_surprise_lo.json +7 -1
- package/cues/emo_trust.json +2 -2
- package/cues/emo_trust_lo.json +9 -2
- package/cues/mix_anger_antic.json +1 -1
- package/cues/mix_antic_joy.json +2 -2
- package/cues/mix_disgust_anger.json +1 -2
- package/cues/mix_sad_disgust.json +7 -1
- package/cues/mix_surprise_sad.json +2 -2
- package/cues/mix_surprise_sad_hi.json +7 -1
- package/cues/mix_trust_fear.json +2 -2
- package/cues/pose_arms_crossed.json +7 -1
- package/cues/pose_smug_arms.json +7 -1
- package/cues/pose_smug_hips.json +7 -1
- package/cues/pose_think.json +7 -1
- package/cues/pose_umbrella.json +6 -1
- package/cues/self_pride.json +7 -1
- package/cues/self_shame.json +1 -1
- package/cues/sys_address.json +7 -1
- package/cues/sys_blank.json +6 -1
- package/cues/sys_confused.json +7 -1
- package/cues/sys_dazed.json +7 -1
- package/cues/sys_neutral.json +6 -1
- package/cues/sys_present.json +7 -1
- package/cues/sys_sleepy.json +7 -1
- package/cues/sys_smirk.json +8 -1
- package/cues/sys_think.json +7 -1
- package/dist/app/cues.js +0 -25
- package/dist/app/editor-main.js +97 -17
- package/dist/app/editor-preload.js +7 -2
- package/dist/app/main.js +40 -5
- package/dist/app/persona.js +2 -2
- package/dist/app/prosody.js +471 -0
- package/dist/app/sequences.js +264 -0
- package/dist/app/state.js +118 -74
- package/dist/app/tts.js +133 -17
- package/dist/app/watch.js +56 -0
- package/dist/mcp-server.js +3 -2
- package/dist/renderer/bundle.js +5 -5
- package/dist/renderer/editor.html +220 -57
- package/dist/renderer/editor.js +1424 -431
- package/dist/shared/paths.js +4 -0
- package/dist/shared/set-cue-schema.js +14 -25
- package/docs/ARCHITECTURE.md +894 -0
- package/docs/CLIENTS.md +2 -2
- package/docs/CUE_AUTHORING.md +52 -9
- package/docs/DEVELOPMENT.md +5 -5
- package/docs/PERSONA.md +1 -1
- package/docs/PSD_LAYERS.md +6 -9
- package/docs/README.md +3 -1
- package/docs/STYLE.md +1 -1
- package/docs/TOOLS.md +1 -1
- package/docs/TROUBLESHOOTING.md +5 -5
- package/docs/TTS.md +7 -2
- package/docs/design/CUE_CATALOG.md +3 -4
- package/docs/design/PROSODY.md +383 -0
- package/hooks/lib/mascot.js +4 -4
- package/hooks/notify.js +2 -2
- package/hooks/reaction.js +1 -1
- package/package.json +4 -2
- package/persona/ui-chan.md +21 -1
- package/plugins/hermes/ui-chan/__init__.py +1 -1
- package/plugins/opencode/ui-chan.mjs +2 -2
- package/sequence.schema.json +115 -0
- package/sequences/event/agent_back/agent_back_done.json +21 -0
- package/sequences/event/agent_back/agent_back_oh.json +24 -0
- package/sequences/event/agent_back/agent_back_welcome.json +21 -0
- package/sequences/event/agent_out/agent_out_called.json +21 -0
- package/sequences/event/agent_out/agent_out_threw.json +23 -0
- package/sequences/event/agent_out/agent_out_wait.json +21 -0
- package/sequences/event/compact/compact_long.json +20 -0
- package/sequences/event/compact/compact_memory.json +21 -0
- package/sequences/event/idle_wait/idle_bored.json +22 -0
- package/sequences/event/idle_wait/idle_left_behind.json +27 -0
- package/sequences/event/idle_wait/idle_where.json +20 -0
- package/sequences/event/permission/permission_call.json +21 -0
- package/sequences/event/permission/permission_jito.json +24 -0
- package/sequences/event/permission/permission_soft.json +19 -0
- package/sequences/event/tool_failure/fail_again.json +24 -0
- package/sequences/event/tool_failure/fail_koketa.json +28 -0
- package/sequences/event/tool_failure/fail_ouch.json +23 -0
- package/sequences/event/tool_failure/fail_red.json +26 -0
- package/sequences/event/tool_failure/fail_shrug.json +23 -0
- package/sequences/event/turn_done/done_ask.json +21 -0
- package/sequences/event/turn_done/done_break.json +23 -0
- package/sequences/event/turn_done/done_handoff.json +21 -0
- package/sequences/event/turn_done/done_rest.json +21 -0
- package/sequences/event/turn_done/done_watching.json +21 -0
- package/sequences/fidget/poke/poke_cold.json +24 -0
- package/sequences/fidget/poke/poke_cold_glare.json +26 -0
- package/sequences/fidget/poke/poke_cold_line.json +24 -0
- package/sequences/fidget/poke/poke_dere.json +26 -0
- package/sequences/fidget/poke/poke_normal.json +26 -0
- package/sequences/fidget/poke/poke_normal_annoyed.json +25 -0
- package/sequences/fidget/poke/poke_shy.json +24 -0
- package/sequences/fidget/poke/poke_surprise.json +30 -0
- package/sequences/fidget/poke/poke_ticklish.json +24 -0
- package/sequences/fidget/spam/spam_glare_cold.json +26 -0
- package/sequences/fidget/spam/spam_pout_dere.json +24 -0
- package/sequences/fidget/spam/spam_stop_cold.json +22 -0
- package/sequences/fidget/spam/spam_stop_normal.json +25 -0
- package/sequences/idling/annoyed.json +23 -0
- package/sequences/idling/bored.json +38 -0
- package/sequences/idling/bored_chat.json +23 -0
- package/sequences/idling/call.json +33 -0
- package/sequences/idling/dere.json +26 -0
- package/sequences/idling/doya.json +42 -0
- package/sequences/idling/doze.json +32 -0
- package/sequences/idling/evening.json +27 -0
- package/sequences/idling/forgotten.json +26 -0
- package/sequences/idling/giggle.json +23 -0
- package/sequences/idling/here_for_you.json +21 -0
- package/sequences/idling/lookaround.json +35 -0
- package/sequences/idling/morning.json +24 -0
- package/sequences/idling/night_owl.json +22 -0
- package/sequences/idling/night_sleepy.json +25 -0
- package/sequences/idling/ponder.json +14 -0
- package/sequences/idling/rain_wait.json +22 -0
- package/sequences/idling/rest_reminder.json +25 -0
- package/sequences/idling/salty.json +24 -0
- package/sequences/idling/shoulder_rub.json +25 -0
- package/sequences/idling/sigh.json +27 -0
- package/sequences/idling/sleep_cold.json +28 -0
- package/sequences/idling/sleep_nudge_warm.json +30 -0
- package/sequences/idling/sleepy.json +21 -0
- package/sequences/idling/thinking.json +51 -0
- package/sequences/idling/umbrella.json +66 -0
- package/sequences/idling/yawn.json +38 -0
- package/sequences/presence/away.json +47 -0
- package/sequences/presence/wake.json +46 -0
- package/ui-chan.config.json +26 -854
- package/cues/idling_doze_1.json +0 -9
- package/cues/idling_doze_2.json +0 -9
- package/cues/idling_doze_3.json +0 -9
- package/cues/idling_giggle_1.json +0 -9
- package/cues/idling_giggle_2.json +0 -9
- package/cues/idling_lookaround_1.json +0 -10
- package/cues/idling_lookaround_2.json +0 -10
- package/cues/idling_lookaround_3.json +0 -10
- package/cues/idling_ponder.json +0 -9
- package/cues/idling_sigh_1.json +0 -11
- package/cues/idling_sigh_2.json +0 -11
- package/cues/idling_yawn_1.json +0 -9
- package/cues/idling_yawn_2.json +0 -12
- package/cues/idling_yawn_3.json +0 -12
package/README.md
CHANGED
|
@@ -164,6 +164,19 @@ VoiSona Talk が起きてないか、REST API が有効になってないか、
|
|
|
164
164
|
| 新しい表情を作りたい | [docs/CUE_AUTHORING.md](docs/CUE_AUTHORING.md) |
|
|
165
165
|
| わたしの性格を変えたい | [docs/PERSONA.md](docs/PERSONA.md) |
|
|
166
166
|
| **中のコードを直したい** | [docs/](docs/README.md) — 開発者向けの資料はこっちに全部ある |
|
|
167
|
+
| なぜこの設計なのか知りたい | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — 設計判断と、そう決めた理由 |
|
|
168
|
+
|
|
169
|
+
> [!NOTE]
|
|
170
|
+
> **AI エージェントへ。** このリポジトリに `CLAUDE.md` / `AGENTS.md` は**ありません**。
|
|
171
|
+
> 公開リポジトリなので、それらは手元固有のメモ(アカウントの使い分け、認証、個人の
|
|
172
|
+
> 作業手順)専用として `.gitignore` してあります。**自動で読まれるファイルが無い**ので、
|
|
173
|
+
> コードに触る前に自分で **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** を開いて
|
|
174
|
+
> ください。二つの Electron プロセスの分担、Cue の仕組み、意図的に却下した設計まで
|
|
175
|
+
> 全部そこにあります——読まずに書くと、たいてい却下済みの案を再発明します。
|
|
176
|
+
>
|
|
177
|
+
> 用語(Idling / Cue / EventCue …)は [VISION.md](VISION.md)、準備とコマンドは
|
|
178
|
+
> [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)。手元のメモを残すなら `CLAUDE.md` に
|
|
179
|
+
> 書けば、コミットに混ざりません。
|
|
167
180
|
| 手伝ってくれるなら | [CONTRIBUTING.md](CONTRIBUTING.md) — 歓迎するもの/お断りするもの |
|
|
168
181
|
|
|
169
182
|
---
|
package/context/VOCABULARY.md
CHANGED
|
@@ -87,6 +87,31 @@
|
|
|
87
87
|
- 困り:「うーん…」「あちゃー」「むむむ」
|
|
88
88
|
- タメ口で通す(丁寧になりすぎたら崩す)
|
|
89
89
|
|
|
90
|
+
## 音になる書き方
|
|
91
|
+
|
|
92
|
+
**書いたとおりに読まれる。** 記号は飾りではなく、そのまま喋り方になる。
|
|
93
|
+
|
|
94
|
+
| 書き方 | 音 |
|
|
95
|
+
|---|---|
|
|
96
|
+
| `、` `…` | そこで一拍おく |
|
|
97
|
+
| `〜` `ー` | 直前の母音が伸びる(「ふ〜ん」「はーい」) |
|
|
98
|
+
| `っ`(語末) | 詰まって短くなる(「えっ」「わっ」) |
|
|
99
|
+
| `?` | 語尾が上がる。`。` なら上がらない |
|
|
100
|
+
| `**語**` | その語を立てる。**1行に1〜2語まで** |
|
|
101
|
+
|
|
102
|
+
公式の口癖の「~」は**本当に伸びる**(「はい、どうも~」「ふ~ん」「やだよ~ん」)。
|
|
103
|
+
崩した表記はそのままの音になるので、崩したまま書く。
|
|
104
|
+
|
|
105
|
+
同じ語でも、書き分けで別の意味になる:
|
|
106
|
+
|
|
107
|
+
- `へえ?`(鋭い聞き返し) / `へえ〜?`(引っかかってる)
|
|
108
|
+
- `えっ?`(虚をつかれた) / `え?`(聞き直した)
|
|
109
|
+
- `はい。`(ふつうの返事) / `はーい。`(気の抜けた返事)
|
|
110
|
+
- `ねえ〜。`(呼びかけ) / `〜だよねぇ?`(同意を求める)
|
|
111
|
+
|
|
112
|
+
`text` に英字や数字が混ざる行では `reading` のほうが読み上げられるので、
|
|
113
|
+
**そのときは `reading` 側にも同じ記号を書く**。
|
|
114
|
+
|
|
90
115
|
## 技術用語の扱い
|
|
91
116
|
|
|
92
117
|
- 技術用語はそのまま使ってよい(ビルド、コミット、デプロイ等)
|
|
@@ -104,4 +129,4 @@
|
|
|
104
129
|
persona の「`text` と `reading` の書き分け」が正。ここはういの口癖まわりだけ:
|
|
105
130
|
|
|
106
131
|
- 伸ばし棒や崩した表記(「やめてよー」「むりぃ…」「え〜ん」)は、崩したまま `reading` にも書く(口癖の「間」がそこにある)
|
|
107
|
-
-
|
|
132
|
+
- 「!」「?」「…」はそのまま残す(→「音になる書き方」)
|
package/cue.schema.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"internal": {
|
|
20
20
|
"type": "boolean",
|
|
21
|
-
"description": "trueなら、このCueはAI向けのCue一覧(persona プロンプトが生成するset_cue用カタログ)から除外される。set_cue
|
|
21
|
+
"description": "trueなら、このCueはAI向けのCue一覧(persona プロンプトが生成するset_cue用カタログ)から除外される。set_cueで直接指定すれば動作はする(実行を禁止するフラグではない)。エージェントに直接選ばせたくないCueに付ける。固定セリフ(sequences/)の見た目はシーケンスのステップ側が自前で持つので、そのための部品Cueは作らない。ファイル名のprefix等の暗黙の命名規則ではなく、この明示的なフラグで判定する。省略時はfalse扱い。",
|
|
22
22
|
"default": false
|
|
23
23
|
},
|
|
24
24
|
"select": {
|
|
@@ -56,34 +56,20 @@
|
|
|
56
56
|
},
|
|
57
57
|
"voice": {
|
|
58
58
|
"type": "object",
|
|
59
|
-
"description": "このCue
|
|
59
|
+
"description": "このCue固有の声色。**感情スタイルの重みだけ**を持つ。声質を直に歪めるパラメータ(alp/huskiness)と、1行ごとの数値(pitch/speed/volume/intonation)は意図的に持たない——手で数値を書く設計をやめ、読み方はセリフの記法(**強調**・…・〜・?)とCueの delivery からアプリが導出する。→ src/app/prosody.ts",
|
|
60
60
|
"additionalProperties": false,
|
|
61
61
|
"properties": {
|
|
62
62
|
"style_weights": {
|
|
63
63
|
"type": "object",
|
|
64
|
-
"description": "スタイル名 → 重み。例 {\"Happy\": 0.
|
|
64
|
+
"description": "スタイル名 → 重み。例 {\"Happy\": 0.6, \"Bashful\": 0.4}。実行時にボイスの style_names 順の配列へ変換して送信する。**エンジンは重みを正規化するので、効くのは比率だけ。合計値には意味がない**(実測:{\"Sad\":0.3} と {\"Sad\":2.0} はバイト単位で同一の音声になる)。したがって {\"Sad\":0.3} は「控えめな悲しみ」ではなく {\"Sad\":1} と同じ。弱めたいときは他のスタイルとの比率で書く(例 {\"Sad\":0.3,\"Normal\":0.7})。**合計は1に揃えて書くこと**——音は変わらないが、読む人の誤解を防ぐため。スタイル名は使用するVoiSonaボイスに依存するため、GET /api/talk/v1/voices/{voice_name}/{voice_version} の style_names で実在を確認すること。",
|
|
65
65
|
"additionalProperties": {
|
|
66
66
|
"type": "number",
|
|
67
67
|
"minimum": 0,
|
|
68
|
-
"description": "
|
|
68
|
+
"description": "個々のスタイルの重み(比率)。合計1で書く。"
|
|
69
69
|
},
|
|
70
70
|
"propertyNames": {
|
|
71
71
|
"minLength": 1
|
|
72
72
|
}
|
|
73
|
-
},
|
|
74
|
-
"alp": {
|
|
75
|
-
"type": "number",
|
|
76
|
-
"minimum": -1,
|
|
77
|
-
"maximum": 1,
|
|
78
|
-
"default": 0,
|
|
79
|
-
"description": "声質パラメータ。VoiSona global_parameters.alp をそのまま焼き込む。"
|
|
80
|
-
},
|
|
81
|
-
"huskiness": {
|
|
82
|
-
"type": "number",
|
|
83
|
-
"minimum": -20,
|
|
84
|
-
"maximum": 20,
|
|
85
|
-
"default": 0,
|
|
86
|
-
"description": "かすれ具合。VoiSona global_parameters.huskiness をそのまま焼き込む。"
|
|
87
73
|
}
|
|
88
74
|
}
|
|
89
75
|
}
|
|
@@ -100,7 +86,9 @@
|
|
|
100
86
|
"hide": [],
|
|
101
87
|
"blink": false,
|
|
102
88
|
"voice": {
|
|
103
|
-
"style_weights": {
|
|
89
|
+
"style_weights": {
|
|
90
|
+
"Happy": 1.0
|
|
91
|
+
},
|
|
104
92
|
"alp": 0,
|
|
105
93
|
"huskiness": 0
|
|
106
94
|
}
|
package/cues/emo_antic_lo.json
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"label": "関心・興味",
|
|
3
3
|
"description": "関心・興味(ちょっと気になる。期待 emo_antic より手前の軽い興味)",
|
|
4
|
-
"select": [
|
|
5
|
-
|
|
4
|
+
"select": [
|
|
5
|
+
"!眉/*上がり",
|
|
6
|
+
"!目/*上向き1",
|
|
7
|
+
"!口/*お"
|
|
8
|
+
],
|
|
9
|
+
"voice": {
|
|
10
|
+
"style_weights": {
|
|
11
|
+
"Normal": 0.571,
|
|
12
|
+
"Happy": 0.429
|
|
13
|
+
}
|
|
14
|
+
}
|
|
6
15
|
}
|
package/cues/emo_disgust.json
CHANGED
package/cues/emo_disgust_hi.json
CHANGED
package/cues/emo_disgust_lo.json
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"label": "軽い嫌悪・うんざり",
|
|
3
3
|
"description": "軽い嫌悪・うんざり(少し顔をしかめ受け流す。嫌悪 emo_disgust より弱い)",
|
|
4
|
-
"select": [
|
|
5
|
-
|
|
4
|
+
"select": [
|
|
5
|
+
"!眉/*困り",
|
|
6
|
+
"!目/*基本目セット/*目そらし1",
|
|
7
|
+
"!口/*む"
|
|
8
|
+
],
|
|
9
|
+
"voice": {
|
|
10
|
+
"style_weights": {
|
|
11
|
+
"Sad": 1.0
|
|
12
|
+
}
|
|
13
|
+
}
|
|
6
14
|
}
|
package/cues/emo_fear_lo.json
CHANGED
package/cues/emo_joy.json
CHANGED
package/cues/emo_sad_hi.json
CHANGED
package/cues/emo_sad_lo.json
CHANGED
package/cues/emo_surprise.json
CHANGED
package/cues/emo_trust.json
CHANGED
package/cues/emo_trust_lo.json
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"label": "容認・受け入れ",
|
|
3
3
|
"description": "軽い信頼・容認(穏やかに受け入れる。信頼 emo_trust より手前)",
|
|
4
|
-
"select": [
|
|
5
|
-
|
|
4
|
+
"select": [
|
|
5
|
+
"!目/*にっこり1",
|
|
6
|
+
"!口/*ほほえみ"
|
|
7
|
+
],
|
|
8
|
+
"voice": {
|
|
9
|
+
"style_weights": {
|
|
10
|
+
"Normal": 1.0
|
|
11
|
+
}
|
|
12
|
+
}
|
|
6
13
|
}
|
package/cues/mix_antic_joy.json
CHANGED
package/cues/mix_trust_fear.json
CHANGED
package/cues/pose_smug_arms.json
CHANGED
package/cues/pose_smug_hips.json
CHANGED
package/cues/pose_think.json
CHANGED
package/cues/pose_umbrella.json
CHANGED
package/cues/self_pride.json
CHANGED
package/cues/self_shame.json
CHANGED
package/cues/sys_address.json
CHANGED
package/cues/sys_blank.json
CHANGED
package/cues/sys_confused.json
CHANGED
package/cues/sys_dazed.json
CHANGED
package/cues/sys_neutral.json
CHANGED
package/cues/sys_present.json
CHANGED
package/cues/sys_sleepy.json
CHANGED
package/cues/sys_smirk.json
CHANGED
package/cues/sys_think.json
CHANGED
package/dist/app/cues.js
CHANGED
|
@@ -38,8 +38,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.loadCues = loadCues;
|
|
40
40
|
exports.validateCueObject = validateCueObject;
|
|
41
|
-
exports.watchCues = watchCues;
|
|
42
|
-
exports.extractCueVoice = extractCueVoice;
|
|
43
41
|
const fs = __importStar(require("node:fs"));
|
|
44
42
|
const path = __importStar(require("node:path"));
|
|
45
43
|
const _2020_js_1 = __importDefault(require("ajv/dist/2020.js"));
|
|
@@ -105,26 +103,3 @@ function validateCueObject(obj, schemaPath) {
|
|
|
105
103
|
return null;
|
|
106
104
|
return (validate.errors ?? []).map((e) => `${e.instancePath || '/'} ${e.message}`).join('; ');
|
|
107
105
|
}
|
|
108
|
-
function watchCues(dirs, onChange) {
|
|
109
|
-
let timer = null;
|
|
110
|
-
const fire = () => {
|
|
111
|
-
if (timer)
|
|
112
|
-
clearTimeout(timer);
|
|
113
|
-
timer = setTimeout(() => {
|
|
114
|
-
timer = null;
|
|
115
|
-
onChange();
|
|
116
|
-
}, 300);
|
|
117
|
-
};
|
|
118
|
-
for (const dir of Array.isArray(dirs) ? dirs : [dirs]) {
|
|
119
|
-
if (fs.existsSync(dir))
|
|
120
|
-
fs.watch(dir, fire);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
function extractCueVoice(set) {
|
|
124
|
-
const out = {};
|
|
125
|
-
for (const [name, cue] of Object.entries(set.cues)) {
|
|
126
|
-
if (cue.voice)
|
|
127
|
-
out[name] = cue.voice;
|
|
128
|
-
}
|
|
129
|
-
return out;
|
|
130
|
-
}
|