tailii-host 0.8.0 → 0.8.2

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.
@@ -1,41 +1,79 @@
1
- // 別セッションからのメッセージ封筒(<cross-session-message …>)の転写。
1
+ // 別セッション / 別エージェントからのメッセージ封筒の転写。
2
2
  //
3
- // Claude Code のセッション間メッセージ(SendMessage)は、受信側 transcript へ 2 形で残る:
4
- // ① idle 起こし: user 行(isMeta)。前置き 1 行 "Another Claude session sent a message:" +
5
- // 封筒 + 封筒の後ろに取り扱いガイダンスの英文段落。
3
+ // Claude Code のエージェント間メッセージ(SendMessage・サブエージェントの完了報告)は、受信側
4
+ // transcript へ 2 形で残る:
5
+ // ① idle 起こし: user 行(isMeta)。前置き 1 行 "Another Claude session sent a message:"
6
+ // ("… while you were working:" 等の揺れあり)+ 封筒 + 封筒の後ろに取り扱いガイダンスの英文段落。
6
7
  // ② ターン処理中: attachment(queued_command) の prompt(封筒のみ。前置き/後置きなし)。
7
- // どちらも本文は
8
- // <cross-session-message from="uds:/…" from-name="bay-3d" from-mode="prompting">
9
- // 本文…
10
- // </cross-session-message>
11
- // の行構造。生 XML を表示へ出さないよう、from-name と本文だけを取り出す。
8
+ // 封筒のタグは 2 種(2.1.273 実測):
9
+ // <cross-session-message from="uds:/…" from-name="bay-3d" from-mode="prompting"> … 別セッション間
10
+ // <agent-message from="general-purpose"> … 同一セッション内の
11
+ // サブエージェント/チームメイト
12
+ // どちらも「開始タグ 1 行 / 本文 / 閉じタグ 1 行(column 0)」の行構造。生 XML を表示へ出さないよう、
13
+ // 送信元名と本文だけを取り出す。1 行完結形(`<tag …>本文</tag>`)も受理する。
14
+ //
15
+ // `<agent-message>` の本文が `[Subagent hand-back]` で始まり定型前置き行("… The report follows:")を
16
+ // 持つものは、委任したサブエージェントの最終レポートの自動配送(hand-back)。前置き行の後にレポート
17
+ // 全行が 2 空白でインデントされて続く。`kind: "handback"` で区別し、body には前置きとインデントを外した
18
+ // レポート全文を入れる(表示側は「サブエージェントの報告」として本文ごと見せる。レポートは親 transcript
19
+ // ではこの封筒にしか残らないので、畳んで隠してはいけない)。
20
+ //
21
+ // hand-back 判定の権威は user 行の `origin:{kind:"peer", handback:true}`(実測)。host の消費側は
22
+ // `crossSessionOriginHint()` でそれを渡す。本文の形だけで判定する経路(iOS のチャット面・origin の無い
23
+ // 行)は「マーカー + 定型前置き行」の両方を要求し、片方だけ(文言ドリフト / 本文をマーカーで始めた
24
+ // ピア)はピアとして全文を見せる側へ倒す(隠す側には倒さない)。
12
25
  //
13
26
  // 会話画面の転写は iOS 側 `ChatLogModel.crossSessionMessage()` が同じ規則で行う。本 helper は
14
27
  // 一覧プレビュー/タイトル(claudeSessionStore)・会話検索(sessionSearch)・サブエージェント
15
28
  // transcript ビューア(subagentTranscript)で共有する。判定の門番は harnessReminder と同じ流儀:
16
29
  // 封筒が(既知の前置き行を除き)先頭から始まる場合だけ反応し、本文途中の言及・引用には
17
- // 反応しない。行比較は行末の `\r` を除いた本体で行う(CRLF 耐性)。
18
- const OPEN_PREFIX = "<cross-session-message";
19
- const CLOSER = "</cross-session-message>";
30
+ // 反応しない。行比較は行末の `\r` を除いた本体で行う(CRLF 耐性)。閉じタグは column 0 の行だけ
31
+ // (harness がレポート全行を 2 空白でインデントするのは、まさに column 0 の枠線風の行を本文で偽造
32
+ // させないためなので、インデントされた同文は本文として残す)。
33
+ /** 封筒として受理するタグ名(開始行は `<タグ名` + 空白か `>`)。 */
34
+ const ENVELOPE_TAGS = ["cross-session-message", "agent-message"];
20
35
  /**
21
- * idle 起こし形(①)の前置き行。実測は "Another Claude session sent a message:"。
22
- * 文言はバージョンで揺れ得るため(reply 等)、"Another Claude …:" の 1 行として許容する。
36
+ * idle 起こし形(①)の前置き行。実測は "Another Claude session sent a message:" と
37
+ * "Another Claude session sent a message while you were working:"。文言はバージョンで揺れ得るため
38
+ * "Another Claude …:" の 1 行として許容する。
23
39
  */
24
40
  const WAKE_PREFIX = /^Another Claude .*:$/u;
41
+ /** サブエージェント完了報告(hand-back)の本文先頭マーカー。 */
42
+ const HANDBACK_MARKER = "[Subagent hand-back]";
43
+ /** hand-back の定型前置き行の末尾。この行の次からがレポート本文(各行 2 空白インデント)。 */
44
+ const HANDBACK_REPORT_FOLLOWS = "The report follows:";
45
+ /** hand-back のレポート各行に harness が付けるインデント。 */
46
+ const HANDBACK_INDENT = " ";
47
+ /** サブエージェントの完了報告(hand-back)の見出し(チャット面のカードヘッダ / 一覧・検索・サブエージェント表示で共通)。 */
48
+ export const SUBAGENT_HANDBACK_LABEL = "サブエージェントの報告";
49
+ /**
50
+ * transcript の user 行から hand-back 判定の権威値を取り出す: `origin.kind === "peer"` の行は
51
+ * `origin.handback === true` かどうか(真偽が確定)。origin が無い / peer でない行は undefined
52
+ * (本文の形で判定する)。
53
+ */
54
+ export function crossSessionOriginHint(record) {
55
+ const origin = record["origin"];
56
+ if (typeof origin !== "object" || origin === null)
57
+ return undefined;
58
+ const fields = origin;
59
+ if (fields["kind"] !== "peer")
60
+ return undefined;
61
+ return fields["handback"] === true;
62
+ }
25
63
  /**
26
- * text が別セッションからのメッセージ封筒なら送信元名と本文を返す。封筒でなければ null。
27
- * 閉じタグが無い場合は末尾までを本文とする。封筒より後ろ(取り扱いガイダンス)は落とす。
64
+ * text が別セッション / 別エージェントからのメッセージ封筒なら送信元名と本文を返す。封筒でなければ
65
+ * null。閉じタグが無い場合は末尾までを本文とする。封筒より後ろ(取り扱いガイダンス)は落とす。
66
+ * `handbackHint` は `crossSessionOriginHint()` の権威値(与えられれば本文の形より優先)。
28
67
  */
29
- export function presentCrossSessionMessage(text) {
30
- if (!text.includes(OPEN_PREFIX))
68
+ export function presentCrossSessionMessage(text, handbackHint) {
69
+ if (!ENVELOPE_TAGS.some((tag) => text.includes(`<${tag}`)))
31
70
  return null;
32
- const lines = text.split("\n");
33
- const core = (line) => (line.endsWith("\r") ? line.slice(0, -1) : line);
71
+ const lines = text.split("\n").map(unfold);
34
72
  // 先頭の空行と(1 回だけ)前置き行を読み飛ばし、封筒の開始行へ到達するか確認する。
35
73
  let index = 0;
36
74
  let sawWakePrefix = false;
37
75
  while (index < lines.length) {
38
- const line = core(lines[index] ?? "").trim();
76
+ const line = (lines[index] ?? "").trim();
39
77
  if (line === "") {
40
78
  index += 1;
41
79
  continue;
@@ -47,24 +85,137 @@ export function presentCrossSessionMessage(text) {
47
85
  }
48
86
  break;
49
87
  }
50
- const openLine = core(lines[index] ?? "").trim();
51
- if (!openLine.startsWith(OPEN_PREFIX) || !openLine.endsWith(">"))
52
- return null;
53
- // タグ名の直後は属性区切りか終端のみ(<cross-session-messages 等の別タグを誤検知しない)。
54
- const boundary = openLine.charAt(OPEN_PREFIX.length);
55
- if (boundary !== " " && boundary !== ">")
88
+ const open = parseOpenLine((lines[index] ?? "").trim());
89
+ if (open === null)
56
90
  return null;
57
- const name = / from-name="([^"]*)"/u.exec(openLine)?.[1] ?? "";
91
+ const fromName = attributeValue("from-name", open.openTag);
92
+ // `<cross-session-message>` の from は uds ソケットパスなので名前には使わない。
93
+ const name = fromName ?? (open.tag === "agent-message" ? attributeValue("from", open.openTag) : null);
58
94
  const bodyLines = [];
59
- for (let cursor = index + 1; cursor < lines.length; cursor += 1) {
60
- if (core(lines[cursor] ?? "").trim() === CLOSER)
61
- break;
62
- bodyLines.push(lines[cursor] ?? "");
95
+ if (open.inlineBody !== null) {
96
+ bodyLines.push(open.inlineBody);
97
+ }
98
+ else {
99
+ const closer = `</${open.tag}>`;
100
+ for (let cursor = index + 1; cursor < lines.length; cursor += 1) {
101
+ const line = lines[cursor] ?? "";
102
+ // 閉じタグは column 0 の行だけ(インデントされた同文は本文)。行末の空白は許容する。
103
+ if (line.trimEnd() === closer)
104
+ break;
105
+ bodyLines.push(line);
106
+ }
107
+ }
108
+ const handback = handbackHint ?? (open.tag === "agent-message" && looksLikeHandback(bodyLines));
109
+ if (handback)
110
+ return { kind: "handback", senderName: name, body: handbackReport(bodyLines) };
111
+ return { kind: "peer", senderName: name, body: bodyLines.join("\n").trim() };
112
+ }
113
+ /** 行末の `\r` を除いた行本体(CRLF 耐性)。 */
114
+ function unfold(line) {
115
+ return line.endsWith("\r") ? line.slice(0, -1) : line;
116
+ }
117
+ /**
118
+ * 開始行を解釈する。受理タグの開始タグ(`<タグ名` の直後は属性区切りか終端のみ)で、行が開始タグ
119
+ * で終わる(複数行形)か、開始タグの直後から同じタグの閉じタグで終わる(1 行完結形)場合だけ受理。
120
+ * 開始タグの後に閉じタグ無しで本文が続く行(タグに言及しただけの発話 `<tag> の表示を直して` 等)は
121
+ * 封筒ではない。
122
+ */
123
+ function parseOpenLine(line) {
124
+ for (const tag of ENVELOPE_TAGS) {
125
+ const prefix = `<${tag}`;
126
+ if (!line.startsWith(prefix))
127
+ continue;
128
+ // タグ名の直後は属性区切りか終端のみ(<cross-session-messages 等の別タグを誤検知しない)。
129
+ const boundary = line.charAt(prefix.length);
130
+ if (boundary !== " " && boundary !== ">")
131
+ continue;
132
+ const end = openTagEnd(line, prefix.length);
133
+ if (end < 0)
134
+ return null;
135
+ const openTag = line.slice(0, end + 1);
136
+ const rest = line.slice(end + 1);
137
+ if (rest === "")
138
+ return { tag, openTag, inlineBody: null };
139
+ const closer = `</${tag}>`;
140
+ if (!rest.endsWith(closer))
141
+ return null;
142
+ return { tag, openTag, inlineBody: rest.slice(0, rest.length - closer.length) };
63
143
  }
64
- return { senderName: name === "" ? null : name, body: bodyLines.join("\n").trim() };
144
+ return null;
145
+ }
146
+ /** 開始タグの終端 `>` の位置(属性値の "…" 内の `>` は読み飛ばす)。無ければ -1。 */
147
+ function openTagEnd(line, from) {
148
+ let quoted = false;
149
+ for (let i = from; i < line.length; i += 1) {
150
+ const ch = line.charAt(i);
151
+ if (ch === '"')
152
+ quoted = !quoted;
153
+ else if (ch === ">" && !quoted)
154
+ return i;
155
+ }
156
+ return -1;
157
+ }
158
+ /** 開始タグから ` name="value"` 形の属性値を取り出す(無し/空は null)。 */
159
+ function attributeValue(name, openTag) {
160
+ const value = new RegExp(` ${name}="([^"]*)"`, "u").exec(openTag)?.[1] ?? "";
161
+ return value === "" ? null : value;
162
+ }
163
+ /** 本文の最初の非空行の添字(無ければ -1)。 */
164
+ function firstContentLine(bodyLines) {
165
+ return bodyLines.findIndex((line) => line.trim() !== "");
166
+ }
167
+ /**
168
+ * first 行から始まる定型前置きブロックの中で "… The report follows:" で終わる行の添字(無ければ -1)。
169
+ * 前置きは実測 1 行だが折り返しに備え、連続する非インデント行は前置きの続きとみなす。空行や
170
+ * 2 空白インデントの行(= レポート)を越えては探さない: マーカーで本文を始めたピアがレポート風の
171
+ * 本文の途中に同フレーズを含んでも、その前の行を落とさない(ピアとして全文を見せる)。
172
+ */
173
+ function reportFollowsLine(bodyLines, first) {
174
+ if (first < 0)
175
+ return -1;
176
+ for (let i = first; i < bodyLines.length; i += 1) {
177
+ const line = bodyLines[i] ?? "";
178
+ if (i > first && (line.trim() === "" || line.startsWith(HANDBACK_INDENT)))
179
+ return -1;
180
+ if (line.trimEnd().endsWith(HANDBACK_REPORT_FOLLOWS))
181
+ return i;
182
+ }
183
+ return -1;
184
+ }
185
+ /**
186
+ * 本文の形だけからの hand-back 判定(iOS と同じ規則): 先頭行がマーカーで始まり、かつ定型前置き行が
187
+ * ある。マーカーだけ(定型行なし = 文言ドリフト、またはマーカーで本文を始めたピア)はピアとして全文を
188
+ * 見せる。
189
+ */
190
+ function looksLikeHandback(bodyLines) {
191
+ const first = firstContentLine(bodyLines);
192
+ if (first < 0 || !(bodyLines[first] ?? "").trimStart().startsWith(HANDBACK_MARKER))
193
+ return false;
194
+ return reportFollowsLine(bodyLines, first) >= 0;
195
+ }
196
+ /**
197
+ * hand-back 封筒の中身からレポート全文を取り出す: 定型前置き行までを落とし、残る各行の先頭インデント
198
+ * (2 空白)を外す。前置き行が無ければマーカー行だけを落とし、マーカーも無ければ(権威値で hand-back と
199
+ * 分かっているが本文の形が違う場合)全行を使う。
200
+ */
201
+ function handbackReport(bodyLines) {
202
+ const first = firstContentLine(bodyLines);
203
+ const follows = reportFollowsLine(bodyLines, first);
204
+ let start = 0;
205
+ if (follows >= 0)
206
+ start = follows + 1;
207
+ else if (first >= 0 && (bodyLines[first] ?? "").trimStart().startsWith(HANDBACK_MARKER))
208
+ start = first + 1;
209
+ return bodyLines
210
+ .slice(start)
211
+ .map((line) => (line.startsWith(HANDBACK_INDENT) ? line.slice(HANDBACK_INDENT.length) : line))
212
+ .join("\n")
213
+ .trim();
65
214
  }
66
- /** 表示用の送信元ラベル(名前が無い封筒のフォールバック込み)。 */
215
+ /** 表示用の送信元ラベル(hand-back は固定の見出し。名前が無い封筒のフォールバック込み)。 */
67
216
  export function crossSessionSenderLabel(message) {
217
+ if (message.kind === "handback")
218
+ return SUBAGENT_HANDBACK_LABEL;
68
219
  return message.senderName ?? "別セッション";
69
220
  }
70
221
  /** 一覧プレビュー/タイトル/検索スニペット向けの転写(「⇄ 送信元名: 本文」。本文なしは名前だけ)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"crossSession.js","sourceRoot":"","sources":["../../src/shared/crossSession.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crossSession.js","sourceRoot":"","sources":["../../src/shared/crossSession.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,4DAA4D;AAC5D,uBAAuB;AACvB,gFAAgF;AAChF,wEAAwE;AACxE,mEAAmE;AACnE,0BAA0B;AAC1B,+FAA+F;AAC/F,kGAAkG;AAClG,uGAAuG;AACvG,iEAAiE;AACjE,iDAAiD;AACjD,EAAE;AACF,qFAAqF;AACrF,wDAAwD;AACxD,mEAAmE;AACnE,2DAA2D;AAC3D,gCAAgC;AAChC,EAAE;AACF,gFAAgF;AAChF,wEAAwE;AACxE,sDAAsD;AACtD,kCAAkC;AAClC,EAAE;AACF,0EAA0E;AAC1E,gEAAgE;AAChE,yEAAyE;AACzE,6CAA6C;AAC7C,4DAA4D;AAC5D,6DAA6D;AAC7D,iCAAiC;AAEjC,2CAA2C;AAC3C,MAAM,aAAa,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAU,CAAC;AAE1E;;;;GAIG;AACH,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,wCAAwC;AACxC,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,yDAAyD;AACzD,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AACtD,4CAA4C;AAC5C,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAcrD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA+B;IACpE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,YAAsB;IAC7E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE3C,4CAA4C;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,aAAa,GAAG,IAAI,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE/B,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,4DAA4D;IAC5D,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC;QAChC,KAAK,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,iDAAiD;YACjD,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM;gBAAE,MAAM;YACrC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;IAChG,IAAI,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,iCAAiC;AACjC,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAUD;;;;;GAKG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QACvC,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;YAAE,SAAS;QACnD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY;IAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,KAAK,GAAG;YAAE,MAAM,GAAG,CAAC,MAAM,CAAC;aAC5B,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,qDAAqD;AACrD,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7E,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED,6BAA6B;AAC7B,SAAS,gBAAgB,CAAC,SAAmB;IAC3C,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,SAAmB,EAAE,KAAa;IAC3D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,SAAmB;IAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,KAAK,CAAC;IACjG,OAAO,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,SAAmB;IACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,IAAI,CAAC;QAAE,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC;SACjC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAC3G,OAAO,SAAS;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC7F,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,uBAAuB,CAAC,OAA4B;IAClE,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,uBAAuB,CAAC;IAChE,OAAO,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC;AACxC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,uBAAuB,CAAC,OAA4B;IAClE,MAAM,KAAK,GAAG,KAAK,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,OAAO,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailii-host",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "Tailii host — control Claude Code / Codex sessions on your machine from the Tailii mobile app",
5
5
  "author": "Namasugi",
6
6
  "license": "MIT",
@@ -50,7 +50,7 @@
50
50
  "ws": "^8.21.1"
51
51
  },
52
52
  "optionalDependencies": {
53
- "@tailii/quic-gw-darwin-arm64": "0.8.0",
54
- "@tailii/quic-gw-darwin-x64": "0.8.0"
53
+ "@tailii/quic-gw-darwin-arm64": "0.8.2",
54
+ "@tailii/quic-gw-darwin-x64": "0.8.2"
55
55
  }
56
56
  }