tailii-host 0.8.1 → 0.9.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/dist/backend/herdr.d.ts +15 -8
- package/dist/backend/herdr.js +72 -35
- package/dist/backend/herdr.js.map +1 -1
- package/dist/backend/tmux.d.ts +105 -3
- package/dist/backend/tmux.js +192 -12
- package/dist/backend/tmux.js.map +1 -1
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.js +40 -12
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/launch.d.ts +3 -1
- package/dist/commands/launch.js +4 -4
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/pairingCode.d.ts +11 -0
- package/dist/commands/pairingCode.js +23 -5
- package/dist/commands/pairingCode.js.map +1 -1
- package/dist/commands/selfUpdate.js +5 -2
- package/dist/commands/selfUpdate.js.map +1 -1
- package/dist/commands/setup.d.ts +44 -0
- package/dist/commands/setup.js +156 -40
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/statusLine.d.ts +22 -0
- package/dist/commands/statusLine.js +76 -0
- package/dist/commands/statusLine.js.map +1 -0
- package/dist/hub/hubDaemon.js +6 -1
- package/dist/hub/hubDaemon.js.map +1 -1
- package/dist/hub/sessionHub.js +5 -2
- package/dist/hub/sessionHub.js.map +1 -1
- package/dist/services/quicGateway.d.ts +46 -5
- package/dist/services/quicGateway.js +63 -10
- package/dist/services/quicGateway.js.map +1 -1
- package/dist/shared/clientBuild.d.ts +1 -1
- package/dist/shared/clientBuild.js +1 -1
- package/dist/shared/invisibleText.d.ts +17 -0
- package/dist/shared/invisibleText.js +83 -0
- package/dist/shared/invisibleText.js.map +1 -0
- package/package.json +3 -3
|
@@ -187,16 +187,35 @@ ${programArguments}
|
|
|
187
187
|
`;
|
|
188
188
|
}
|
|
189
189
|
const defaultLaunchctl = (args) => new Promise((resolve, reject) => {
|
|
190
|
-
execFile("launchctl", args, { timeout: 15_000 }, (error) => {
|
|
190
|
+
execFile("launchctl", args, { timeout: 15_000 }, (error, stdout) => {
|
|
191
191
|
if (error)
|
|
192
192
|
reject(error);
|
|
193
193
|
else
|
|
194
|
-
resolve();
|
|
194
|
+
resolve(stdout);
|
|
195
195
|
});
|
|
196
196
|
});
|
|
197
|
+
/**
|
|
198
|
+
* `launchctl print` の出力から稼働状態を読む。
|
|
199
|
+
* 見るのはトップレベルの `state = running` / `pid = N` / `runs = N` / `last exit code = N` 行だけ
|
|
200
|
+
* (`state = not running` や endpoint 配下の `state = active` は一致しない。
|
|
201
|
+
* 他の書式は macOS 版で揺れるため依存せず、読めない項目は null にする)。
|
|
202
|
+
*/
|
|
203
|
+
export function parseLaunchctlPrintState(output) {
|
|
204
|
+
const num = (pattern) => {
|
|
205
|
+
const m = pattern.exec(output);
|
|
206
|
+
return m === null ? null : Number(m[1]);
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
running: /^\s*state = running\s*$/m.test(output),
|
|
210
|
+
pid: num(/^\s*pid = (\d+)\s*$/m),
|
|
211
|
+
runs: num(/^\s*runs = (\d+)\s*$/m),
|
|
212
|
+
lastExitCode: num(/^\s*last exit code = (\d+)\s*$/m),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
197
215
|
/**
|
|
198
216
|
* LaunchAgent を設置して(再)起動する(冪等)。
|
|
199
217
|
* 既存ジョブは bootout してから bootstrap し、plist 更新を確実に反映する。
|
|
218
|
+
* bootstrap 後に kickstart で起動を確定させ、`launchctl print` で稼働を実確認して返す。
|
|
200
219
|
*
|
|
201
220
|
* gateway バイナリは非 TCC 保護の `~/.tailii/bin` へコピーしてから launchd に渡す
|
|
202
221
|
* (`installQuicGatewayBinary` 参照。TCC 保護フォルダ由来の dyld ストール回避)。
|
|
@@ -232,16 +251,49 @@ export async function installQuicLaunchAgent(options) {
|
|
|
232
251
|
// 旧 macOS / 非 GUI セッション向けフォールバック。
|
|
233
252
|
await launchctl(["load", "-w", plistPath]);
|
|
234
253
|
}
|
|
254
|
+
// 実機で判明した罠(2026-09-18): ログインセッションの launchd ドメインが
|
|
255
|
+
// 「on-demand-only モード」(`launchctl print gui/<uid>` の `on-demand count` > 0。入る
|
|
256
|
+
// きっかけは launchd がログに残さないため未特定。再ログイン / 再起動で解ける)に居ると、
|
|
257
|
+
// RunAtLoad / KeepAlive による自動起動は "pending spawn, domain in on-demand-only mode"
|
|
258
|
+
// で保留される。bootstrap 自体は成功扱いなので、setup 再実行で稼働中の gw を bootout
|
|
259
|
+
// した直後に「登録済みなのに誰も居ない」状態になり、アプリは SSH に落ちたまま復帰しない。
|
|
260
|
+
// kickstart は demand 起動なので保留を突き抜ける。稼働中なら no-op(`-k` は付けない:
|
|
261
|
+
// 直前に spawn した正常系プロセスを殺して入れ替える無駄と競合を避ける)。
|
|
262
|
+
try {
|
|
263
|
+
await launchctl(["kickstart", `gui/${uid}/${QUIC_GW_LAUNCHD_LABEL}`]);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// 失敗は直後の状態確認で「未起動」として呼び出し側に伝わる。
|
|
267
|
+
}
|
|
268
|
+
const state = await quicGatewayServiceState(uid, launchctl);
|
|
269
|
+
return state.loaded ? { running: state.running, pid: state.pid } : { running: false, pid: null };
|
|
235
270
|
}
|
|
236
|
-
/** launchd
|
|
237
|
-
export async function
|
|
271
|
+
/** launchd ジョブの状態を読む(doctor / quic-info / setup 用・副作用なし)。 */
|
|
272
|
+
export async function quicGatewayServiceState(uid = process.getuid?.() ?? 501, launchctl = defaultLaunchctl) {
|
|
273
|
+
let output;
|
|
238
274
|
try {
|
|
239
|
-
await launchctl(["print", `gui/${uid}/${QUIC_GW_LAUNCHD_LABEL}`]);
|
|
240
|
-
return true;
|
|
275
|
+
output = await launchctl(["print", `gui/${uid}/${QUIC_GW_LAUNCHD_LABEL}`]);
|
|
241
276
|
}
|
|
242
277
|
catch {
|
|
243
|
-
return false;
|
|
278
|
+
return { loaded: false };
|
|
279
|
+
}
|
|
280
|
+
// stdout を返さない実行子(テスト注入)は「登録済み・稼働不明」として未起動側に倒す。
|
|
281
|
+
if (typeof output !== "string") {
|
|
282
|
+
return { loaded: true, running: false, pid: null, runs: null, lastExitCode: null };
|
|
244
283
|
}
|
|
284
|
+
return { loaded: true, ...parseLaunchctlPrintState(output) };
|
|
285
|
+
}
|
|
286
|
+
/** launchd ジョブが登録されているか(起動保留中でも true。稼働判定は `isQuicGatewayRunning`)。 */
|
|
287
|
+
export async function isQuicGatewayLoaded(uid = process.getuid?.() ?? 501, launchctl = defaultLaunchctl) {
|
|
288
|
+
return (await quicGatewayServiceState(uid, launchctl)).loaded;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* launchd ジョブが実際に稼働しているか。登録済みでも launchd が起動を保留している間は false
|
|
292
|
+
* (print は成功するため「登録済み」だけでは死んだゲートウェイを配ってしまう)。
|
|
293
|
+
*/
|
|
294
|
+
export async function isQuicGatewayRunning(uid = process.getuid?.() ?? 501, launchctl = defaultLaunchctl) {
|
|
295
|
+
const state = await quicGatewayServiceState(uid, launchctl);
|
|
296
|
+
return state.loaded && state.running;
|
|
245
297
|
}
|
|
246
298
|
/**
|
|
247
299
|
* 証明書 PEM から SPKI SHA-256 ピン(base64)を計算する。
|
|
@@ -275,10 +327,11 @@ export async function collectQuicInfo(options) {
|
|
|
275
327
|
if (creds === null) {
|
|
276
328
|
return { available: false, reason: "credentials-missing" };
|
|
277
329
|
}
|
|
278
|
-
const
|
|
279
|
-
if (!
|
|
280
|
-
//
|
|
330
|
+
const running = await (options?.isRunning ?? (() => isQuicGatewayRunning()))();
|
|
331
|
+
if (!running) {
|
|
332
|
+
// 稼働していないのに資格情報だけ配ると、クライアントが再接続のたびに
|
|
281
333
|
// 死んだゲートウェイへ 1.5s の接続試行税を払う。配らない方が安全側。
|
|
334
|
+
// 「登録済み(print 成功)」は launchd が起動を保留していても真になるため稼働状態で判定する。
|
|
282
335
|
return { available: false, reason: "gateway-not-running" };
|
|
283
336
|
}
|
|
284
337
|
return { available: true, port: QUIC_GW_DEFAULT_PORT, pin: creds.pin, token: creds.token };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quicGateway.js","sourceRoot":"","sources":["../../src/services/quicGateway.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"quicGateway.js","sourceRoot":"","sources":["../../src/services/quicGateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export interface ClientBuildRecord {
|
|
|
18
18
|
* ビルドへの更新を促すことになる(host のピンをアプリ側が持つ関係の裏返し。
|
|
19
19
|
* 順序は docs/host-auto-update.md を参照)。
|
|
20
20
|
*/
|
|
21
|
-
export declare const CLIENT_BUILD_PIN = "
|
|
21
|
+
export declare const CLIENT_BUILD_PIN = "9";
|
|
22
22
|
/** 記録ファイルの既定パス(self-update の管理ルートと同じ ~/.tailii/host/ 配下)。 */
|
|
23
23
|
export declare function clientBuildRecordPath(): string;
|
|
24
24
|
/** "4" / "1.2.3" を整数タプルへ。Apple の CFBundleVersion 規約外は null。 */
|
|
@@ -26,7 +26,7 @@ import path from "node:path";
|
|
|
26
26
|
* ビルドへの更新を促すことになる(host のピンをアプリ側が持つ関係の裏返し。
|
|
27
27
|
* 順序は docs/host-auto-update.md を参照)。
|
|
28
28
|
*/
|
|
29
|
-
export const CLIENT_BUILD_PIN = "
|
|
29
|
+
export const CLIENT_BUILD_PIN = "9";
|
|
30
30
|
/** 記録ファイルの既定パス(self-update の管理ルートと同じ ~/.tailii/host/ 配下)。 */
|
|
31
31
|
export function clientBuildRecordPath() {
|
|
32
32
|
return path.join(os.homedir(), ".tailii", "host", "client-build.json");
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 不可視・書式制御のコードポイントレンジ(両端含む)。
|
|
3
|
+
*
|
|
4
|
+
* **昇順・非重複であることが `isInvisibleCodePoint` の早期 return の前提**(末尾へ追記すると
|
|
5
|
+
* 到達しない)。不変条件はテストで守る(`invisibleText.test.ts`)。
|
|
6
|
+
* TAB(0x09) / LF(0x0A) は CLI も残すので含めない(空白の正規化は呼び出し側の責務)。
|
|
7
|
+
*/
|
|
8
|
+
export declare const INVISIBLE_RANGES: ReadonlyArray<readonly [number, number]>;
|
|
9
|
+
/** 不可視・書式制御のコードポイントか(純ロジック, TESTABLE)。 */
|
|
10
|
+
export declare function isInvisibleCodePoint(codePoint: number): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* 照合用に不可視文字を落とす(純ロジック, TESTABLE)。
|
|
13
|
+
* **送信本文の加工には使わない**(モジュール冒頭の注意を参照)。
|
|
14
|
+
*/
|
|
15
|
+
export declare function stripInvisibleForComparison(text: string): string;
|
|
16
|
+
/** 照合用の正規化(不可視文字 + 空白類をすべて落とす)。 */
|
|
17
|
+
export declare function normalizeForTextMatch(text: string): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// invisibleText.ts
|
|
2
|
+
// tailii (TS host) - 不可視文字の比較用正規化(iOS `InvisibleText.swift` と同値実装)。
|
|
3
|
+
//
|
|
4
|
+
// Claude Code 2.1.277 から、composer へ入れた本文に不可視文字(ゼロ幅・双方向制御・
|
|
5
|
+
// 異体字セレクタ・タグ文字ほか)が含まれていると、最初の Enter では**送信されず**、
|
|
6
|
+
// 除去後の本文を入力欄に残したまま「Removed N invisible characters . review and press
|
|
7
|
+
// Enter to send」を出して確認待ちになる(2 回目の Enter で送信。2.1.278 実測)。
|
|
8
|
+
// transcript に残るのは**除去後**の本文なので、
|
|
9
|
+
// - 送信した本文(iOS の楽観バブル・host の記録本文)
|
|
10
|
+
// - transcript / 入力欄に現れる本文
|
|
11
|
+
// の 2 つが不可視文字の分だけ食い違い、同文照合がすべて外れる。
|
|
12
|
+
//
|
|
13
|
+
// **この正規化は「照合」専用**。送信する本文の加工には決して使わない:
|
|
14
|
+
// CLI は文脈しだいで ZWJ / 異体字セレクタを**残す**(絵文字の連結・VS16 など)ため、
|
|
15
|
+
// ここと同じ一律除去を送信本文へ適用すると家族絵文字が 3 人へ割れるといった破壊になる。
|
|
16
|
+
// 照合では両辺へ同じ除去を掛けるので、CLI が残したか消したかに関わらず一致する
|
|
17
|
+
// (= CLI の保持規則を再実装しなくてよい)。
|
|
18
|
+
//
|
|
19
|
+
// レンジは CLI の「不可視候補」判定(2.1.278 バイナリ実測)と同一。CLI が実際に除去するのは
|
|
20
|
+
// この候補の**部分集合**(文脈しだいで残す)なので、候補の全除去は常に安全な上界になる。
|
|
21
|
+
// 文字クラス正規表現ではなくコードポイント表で持つのは、CLI 側の判定が数値レンジであり
|
|
22
|
+
// 一対一で突き合わせられるため(Swift 版も同じ表を持つ)。
|
|
23
|
+
/**
|
|
24
|
+
* 不可視・書式制御のコードポイントレンジ(両端含む)。
|
|
25
|
+
*
|
|
26
|
+
* **昇順・非重複であることが `isInvisibleCodePoint` の早期 return の前提**(末尾へ追記すると
|
|
27
|
+
* 到達しない)。不変条件はテストで守る(`invisibleText.test.ts`)。
|
|
28
|
+
* TAB(0x09) / LF(0x0A) は CLI も残すので含めない(空白の正規化は呼び出し側の責務)。
|
|
29
|
+
*/
|
|
30
|
+
export const INVISIBLE_RANGES = [
|
|
31
|
+
[0x0000, 0x0008], // C0 制御(TAB 未満)
|
|
32
|
+
[0x000b, 0x001f], // C0 制御(LF 超。CR を含む)
|
|
33
|
+
[0x007f, 0x009f], // DEL + C1 制御(NEL 0x85 を含む)
|
|
34
|
+
[0x00ad, 0x00ad], // SOFT HYPHEN
|
|
35
|
+
[0x034f, 0x034f], // COMBINING GRAPHEME JOINER
|
|
36
|
+
[0x061c, 0x061c], // ARABIC LETTER MARK
|
|
37
|
+
[0x115f, 0x1160], // HANGUL CHOSEONG/JUNGSEONG FILLER
|
|
38
|
+
[0x17b4, 0x17b5], // KHMER VOWEL INHERENT AQ/AA
|
|
39
|
+
[0x180b, 0x180f], // MONGOLIAN FVS / VOWEL SEPARATOR
|
|
40
|
+
[0x200b, 0x200f], // ZWSP / ZWNJ / ZWJ / LRM / RLM
|
|
41
|
+
[0x2028, 0x202e], // LINE|PARAGRAPH SEPARATOR / 双方向埋め込み・上書き
|
|
42
|
+
[0x2060, 0x206f], // WORD JOINER / 不可視演算子 / 非推奨書式文字
|
|
43
|
+
[0x3164, 0x3164], // HANGUL FILLER
|
|
44
|
+
[0xfe00, 0xfe0f], // VARIATION SELECTOR-1..16
|
|
45
|
+
[0xfeff, 0xfeff], // BOM (ZERO WIDTH NO-BREAK SPACE)
|
|
46
|
+
[0xffa0, 0xffa0], // HALFWIDTH HANGUL FILLER
|
|
47
|
+
[0xfff0, 0xfffb], // 未割当 + 行間注釈(INTERLINEAR ANNOTATION)
|
|
48
|
+
[0x1107f, 0x1107f], // BRAHMI NUMBER JOINER
|
|
49
|
+
[0x13430, 0x1343f], // EGYPTIAN HIEROGLYPH FORMAT CONTROLS
|
|
50
|
+
[0x16fe4, 0x16fe4], // KHITAN SMALL SCRIPT FILLER
|
|
51
|
+
[0x1bca0, 0x1bca3], // SHORTHAND FORMAT CONTROLS
|
|
52
|
+
[0x1d173, 0x1d17a], // MUSICAL SYMBOL BEAM/SLUR/PHRASE
|
|
53
|
+
[0xe0000, 0xe0fff], // タグ文字 + VARIATION SELECTOR SUPPLEMENT
|
|
54
|
+
];
|
|
55
|
+
/** 不可視・書式制御のコードポイントか(純ロジック, TESTABLE)。 */
|
|
56
|
+
export function isInvisibleCodePoint(codePoint) {
|
|
57
|
+
for (const [low, high] of INVISIBLE_RANGES) {
|
|
58
|
+
if (codePoint < low)
|
|
59
|
+
return false; // 表は昇順。以降は必ず範囲外。
|
|
60
|
+
if (codePoint <= high)
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 照合用に不可視文字を落とす(純ロジック, TESTABLE)。
|
|
67
|
+
* **送信本文の加工には使わない**(モジュール冒頭の注意を参照)。
|
|
68
|
+
*/
|
|
69
|
+
export function stripInvisibleForComparison(text) {
|
|
70
|
+
let result = "";
|
|
71
|
+
// for...of は文字列をコードポイント単位で回す(サロゲートペアを割らない)。
|
|
72
|
+
for (const character of text) {
|
|
73
|
+
if (isInvisibleCodePoint(character.codePointAt(0) ?? 0))
|
|
74
|
+
continue;
|
|
75
|
+
result += character;
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/** 照合用の正規化(不可視文字 + 空白類をすべて落とす)。 */
|
|
80
|
+
export function normalizeForTextMatch(text) {
|
|
81
|
+
return stripInvisibleForComparison(text).replace(/\s+/gu, "");
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=invisibleText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invisibleText.js","sourceRoot":"","sources":["../../src/shared/invisibleText.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,oEAAoE;AACpE,EAAE;AACF,0DAA0D;AAC1D,iDAAiD;AACjD,qEAAqE;AACrE,yDAAyD;AACzD,iCAAiC;AACjC,oCAAoC;AACpC,6BAA6B;AAC7B,mCAAmC;AACnC,EAAE;AACF,uCAAuC;AACvC,sDAAsD;AACtD,+CAA+C;AAC/C,2CAA2C;AAC3C,2BAA2B;AAC3B,EAAE;AACF,wDAAwD;AACxD,gDAAgD;AAChD,+CAA+C;AAC/C,kCAAkC;AAElC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6C;IACxE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB;IAClC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,qBAAqB;IACvC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,4BAA4B;IAC9C,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc;IAChC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,4BAA4B;IAC9C,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,qBAAqB;IACvC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,mCAAmC;IACrD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,6BAA6B;IAC/C,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,kCAAkC;IACpD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,gCAAgC;IAClD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,yCAAyC;IAC3D,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,iCAAiC;IACnD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB;IAClC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,2BAA2B;IAC7C,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,kCAAkC;IACpD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,0BAA0B;IAC5C,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,qCAAqC;IACvD,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAC3C,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,sCAAsC;IAC1D,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,6BAA6B;IACjD,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,4BAA4B;IAChD,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,kCAAkC;IACtD,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,uCAAuC;CAC5D,CAAC;AAEF,0CAA0C;AAC1C,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC3C,IAAI,SAAS,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,iBAAiB;QACpD,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,4CAA4C;IAC5C,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,oBAAoB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QAClE,MAAM,IAAI,SAAS,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tailii-host",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
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.
|
|
54
|
-
"@tailii/quic-gw-darwin-x64": "0.
|
|
53
|
+
"@tailii/quic-gw-darwin-arm64": "0.9.0",
|
|
54
|
+
"@tailii/quic-gw-darwin-x64": "0.9.0"
|
|
55
55
|
}
|
|
56
56
|
}
|