tailii-host 0.1.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/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/apnsConfigStore.d.ts +22 -0
- package/dist/apnsConfigStore.js +50 -0
- package/dist/apnsConfigStore.js.map +1 -0
- package/dist/apnsJwtProvider.d.ts +50 -0
- package/dist/apnsJwtProvider.js +158 -0
- package/dist/apnsJwtProvider.js.map +1 -0
- package/dist/apnsSender.d.ts +69 -0
- package/dist/apnsSender.js +155 -0
- package/dist/apnsSender.js.map +1 -0
- package/dist/approvalPushNotifier.d.ts +100 -0
- package/dist/approvalPushNotifier.js +236 -0
- package/dist/approvalPushNotifier.js.map +1 -0
- package/dist/broker.d.ts +24 -0
- package/dist/broker.js +197 -0
- package/dist/broker.js.map +1 -0
- package/dist/chatTailController.d.ts +87 -0
- package/dist/chatTailController.js +292 -0
- package/dist/chatTailController.js.map +1 -0
- package/dist/claudeSessionStore.d.ts +15 -0
- package/dist/claudeSessionStore.js +201 -0
- package/dist/claudeSessionStore.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/codexRolloutTailer.d.ts +56 -0
- package/dist/codexRolloutTailer.js +303 -0
- package/dist/codexRolloutTailer.js.map +1 -0
- package/dist/codexSessionStore.d.ts +23 -0
- package/dist/codexSessionStore.js +274 -0
- package/dist/codexSessionStore.js.map +1 -0
- package/dist/codexUsage.d.ts +16 -0
- package/dist/codexUsage.js +144 -0
- package/dist/codexUsage.js.map +1 -0
- package/dist/deviceTokenStore.d.ts +38 -0
- package/dist/deviceTokenStore.js +73 -0
- package/dist/deviceTokenStore.js.map +1 -0
- package/dist/dirLister.d.ts +9 -0
- package/dist/dirLister.js +98 -0
- package/dist/dirLister.js.map +1 -0
- package/dist/doctor.d.ts +36 -0
- package/dist/doctor.js +162 -0
- package/dist/doctor.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.js +962 -0
- package/dist/engine.js.map +1 -0
- package/dist/hook.d.ts +67 -0
- package/dist/hook.js +511 -0
- package/dist/hook.js.map +1 -0
- package/dist/hookSettings.d.ts +40 -0
- package/dist/hookSettings.js +128 -0
- package/dist/hookSettings.js.map +1 -0
- package/dist/idleReaper.d.ts +13 -0
- package/dist/idleReaper.js +30 -0
- package/dist/idleReaper.js.map +1 -0
- package/dist/imageService.d.ts +53 -0
- package/dist/imageService.js +280 -0
- package/dist/imageService.js.map +1 -0
- package/dist/kick.d.ts +8 -0
- package/dist/kick.js +60 -0
- package/dist/kick.js.map +1 -0
- package/dist/launch.d.ts +107 -0
- package/dist/launch.js +396 -0
- package/dist/launch.js.map +1 -0
- package/dist/legacyHomeMigration.d.ts +1 -0
- package/dist/legacyHomeMigration.js +23 -0
- package/dist/legacyHomeMigration.js.map +1 -0
- package/dist/lineWriter.d.ts +9 -0
- package/dist/lineWriter.js +19 -0
- package/dist/lineWriter.js.map +1 -0
- package/dist/mdnsAdvertiser.d.ts +46 -0
- package/dist/mdnsAdvertiser.js +268 -0
- package/dist/mdnsAdvertiser.js.map +1 -0
- package/dist/observationLog.d.ts +54 -0
- package/dist/observationLog.js +108 -0
- package/dist/observationLog.js.map +1 -0
- package/dist/pairingCode.d.ts +60 -0
- package/dist/pairingCode.js +282 -0
- package/dist/pairingCode.js.map +1 -0
- package/dist/paths.d.ts +13 -0
- package/dist/paths.js +46 -0
- package/dist/paths.js.map +1 -0
- package/dist/permissionMode.d.ts +8 -0
- package/dist/permissionMode.js +32 -0
- package/dist/permissionMode.js.map +1 -0
- package/dist/planUsageFetcher.d.ts +35 -0
- package/dist/planUsageFetcher.js +172 -0
- package/dist/planUsageFetcher.js.map +1 -0
- package/dist/protocol.d.ts +329 -0
- package/dist/protocol.js +544 -0
- package/dist/protocol.js.map +1 -0
- package/dist/pushTokenCommand.d.ts +9 -0
- package/dist/pushTokenCommand.js +85 -0
- package/dist/pushTokenCommand.js.map +1 -0
- package/dist/pushTypes.d.ts +41 -0
- package/dist/pushTypes.js +68 -0
- package/dist/pushTypes.js.map +1 -0
- package/dist/sendLog.d.ts +14 -0
- package/dist/sendLog.js +64 -0
- package/dist/sendLog.js.map +1 -0
- package/dist/sessionActivityProvider.d.ts +7 -0
- package/dist/sessionActivityProvider.js +44 -0
- package/dist/sessionActivityProvider.js.map +1 -0
- package/dist/sessionIdleTracker.d.ts +19 -0
- package/dist/sessionIdleTracker.js +42 -0
- package/dist/sessionIdleTracker.js.map +1 -0
- package/dist/sessionListService.d.ts +27 -0
- package/dist/sessionListService.js +85 -0
- package/dist/sessionListService.js.map +1 -0
- package/dist/sessionMetadataStore.d.ts +33 -0
- package/dist/sessionMetadataStore.js +122 -0
- package/dist/sessionMetadataStore.js.map +1 -0
- package/dist/sessionSearch.d.ts +29 -0
- package/dist/sessionSearch.js +139 -0
- package/dist/sessionSearch.js.map +1 -0
- package/dist/setup.d.ts +83 -0
- package/dist/setup.js +412 -0
- package/dist/setup.js.map +1 -0
- package/dist/sleep.d.ts +4 -0
- package/dist/sleep.js +25 -0
- package/dist/sleep.js.map +1 -0
- package/dist/socketPath.d.ts +12 -0
- package/dist/socketPath.js +51 -0
- package/dist/socketPath.js.map +1 -0
- package/dist/subagentTailer.d.ts +15 -0
- package/dist/subagentTailer.js +399 -0
- package/dist/subagentTailer.js.map +1 -0
- package/dist/tmux.d.ts +62 -0
- package/dist/tmux.js +163 -0
- package/dist/tmux.js.map +1 -0
- package/dist/transcriptTailer.d.ts +61 -0
- package/dist/transcriptTailer.js +606 -0
- package/dist/transcriptTailer.js.map +1 -0
- package/dist/usageAggregator.d.ts +12 -0
- package/dist/usageAggregator.js +55 -0
- package/dist/usageAggregator.js.map +1 -0
- package/dist/version.d.ts +10 -0
- package/dist/version.js +45 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { LineWriter } from "./lineWriter.js";
|
|
2
|
+
import type { ImageService } from "./imageService.js";
|
|
3
|
+
import { TranscriptTailer } from "./transcriptTailer.js";
|
|
4
|
+
import { SubagentTailer } from "./subagentTailer.js";
|
|
5
|
+
import { CodexRolloutTailer } from "./codexRolloutTailer.js";
|
|
6
|
+
/** tail 対象エージェント種別(claude=既定 / codex=Codex CLI)。 */
|
|
7
|
+
export type ChatAgent = "claude" | "codex";
|
|
8
|
+
/** セッション連動で transcript を tail し chat_output を engine チャネルへ流す制御子。 */
|
|
9
|
+
export declare class ChatTailController {
|
|
10
|
+
private readonly writer;
|
|
11
|
+
private readonly tailer;
|
|
12
|
+
private readonly subagentTailer;
|
|
13
|
+
private readonly projectsRoot;
|
|
14
|
+
/** チャット添付(user 発話の `@"path"`)のサムネ発行に使う。null なら発行しない。 */
|
|
15
|
+
private readonly imageService;
|
|
16
|
+
/** subagent_node の送出可否を判断する negotiated protocol version。 */
|
|
17
|
+
private readonly protocolVersion;
|
|
18
|
+
/** 既定エージェント(open で明示指定が無いときのフォールバック)。 */
|
|
19
|
+
private readonly agent;
|
|
20
|
+
/** 現在 open 中のセッションのエージェント(open 毎に確定。per-session 切替に対応)。 */
|
|
21
|
+
private openAgent;
|
|
22
|
+
/** codex モードの rollout tailer(agent==="codex" のときのみ使用)。 */
|
|
23
|
+
private readonly codexTailer;
|
|
24
|
+
private abortController;
|
|
25
|
+
private currentPump;
|
|
26
|
+
private currentSubagentPump;
|
|
27
|
+
/** 現在 tail 中の解決入力(usage 集計が同じ規則で対象 jsonl を解決するために保持)。 */
|
|
28
|
+
private currentDir;
|
|
29
|
+
private currentPreferred;
|
|
30
|
+
private currentNewerThanMs;
|
|
31
|
+
/** open 時点で解決できた tail 対象 jsonl(同一会話への張り直しスキップ判定に使う)。 */
|
|
32
|
+
private currentResolvedPath;
|
|
33
|
+
constructor(options: {
|
|
34
|
+
writer: LineWriter;
|
|
35
|
+
tailer: TranscriptTailer;
|
|
36
|
+
subagentTailer?: SubagentTailer;
|
|
37
|
+
projectsRoot: string;
|
|
38
|
+
imageService?: ImageService | null;
|
|
39
|
+
protocolVersion?: () => number;
|
|
40
|
+
agent?: ChatAgent;
|
|
41
|
+
codexTailer?: CodexRolloutTailer;
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* `cwd` からそのセッションの project dir を解決し、transcript tail を開始/切替する。
|
|
45
|
+
* 同一会話(解決先 jsonl が同じ)への張り直しはスキップする。
|
|
46
|
+
*/
|
|
47
|
+
open(cwd: string, preferredSessionId: string | null, newerThanMs?: number | null, agent?: ChatAgent): void;
|
|
48
|
+
/**
|
|
49
|
+
* codex モードの tail 開始/切替。claude の slug/subagent/添付は使わず、
|
|
50
|
+
* cwd から rollout を解決して chat_output を流す。同一 rollout への張り直しはスキップする。
|
|
51
|
+
*/
|
|
52
|
+
private openCodex;
|
|
53
|
+
/** 画像として扱う拡張子集合(小文字・ドットなし)。添付検出と Read サムネ判定で共有。 */
|
|
54
|
+
private static readonly IMAGE_EXTENSIONS;
|
|
55
|
+
/**
|
|
56
|
+
* user 発話テキストから添付「画像」ファイルの絶対パスを抽出する(chat-attachments, TESTABLE)。
|
|
57
|
+
* `@"/path with space.png"`(引用形式)と `@/path/to/file.png`(非引用)の両方を対象にする。
|
|
58
|
+
*/
|
|
59
|
+
static attachmentImagePaths(text: string): string[];
|
|
60
|
+
/**
|
|
61
|
+
* Read ツールの tool_activity が「画像ファイル」を対象にしているとき、その絶対パスを返す
|
|
62
|
+
* (chat-inline-read-image, TESTABLE)。Read 以外・パス無し・非画像拡張子は null。
|
|
63
|
+
*/
|
|
64
|
+
static readImagePath(activity: {
|
|
65
|
+
name: string;
|
|
66
|
+
file?: string;
|
|
67
|
+
}): string | null;
|
|
68
|
+
/** 現在 tail 中の会話 jsonl の絶対パスを解決して返す(usage 集計用)。未開始・未出現は null。 */
|
|
69
|
+
currentTranscriptPath(): string | null;
|
|
70
|
+
/**
|
|
71
|
+
* 現在 tail 中の codex rollout の絶対パス(usage 集計用, codex-input)。
|
|
72
|
+
* codex で tail 中かつ rollout 解決済みのときのみ返す。それ以外(claude/未解決)は null。
|
|
73
|
+
*/
|
|
74
|
+
currentCodexRolloutPath(): string | null;
|
|
75
|
+
/**
|
|
76
|
+
* 現在 open 中の tail エージェント種別(usage/status の分岐用)。
|
|
77
|
+
*
|
|
78
|
+
* usage_request は「rollout が解決済みか」ではなく「開いている会話が codex か」で分岐する必要がある。
|
|
79
|
+
* codex 会話で rollout 未解決のときに claude 分岐へ落ちると、Claude の OAuth プラン使用量
|
|
80
|
+
* (=Claude の状態)が codex 会話に表示されてしまうため(2026-07-07 ユーザー指摘)。
|
|
81
|
+
*/
|
|
82
|
+
currentAgent(): ChatAgent;
|
|
83
|
+
/** tail を停止する(engine チャネル断)。 */
|
|
84
|
+
stop(): void;
|
|
85
|
+
/** 診断ログ(`~/.tailii/engine-tail.log` に追記)。失敗は握り潰す。 */
|
|
86
|
+
static diag(message: string): void;
|
|
87
|
+
}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// chatTailController.ts
|
|
2
|
+
// tailii (TS host) — セッション連動の会話出力 tail 制御
|
|
3
|
+
// Swift 版 ChatTailController.swift の移植。
|
|
4
|
+
// セッションを開いた(session_reattach / session_start)タイミングで transcript を解決して
|
|
5
|
+
// tail し、生成された chat_output を engine チャネル(LineWriter)へ流す。新しいセッションを
|
|
6
|
+
// 開いたら前の tail を止めて切り替える。engine チャネル断で stop()。
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as os from "node:os";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { TranscriptTailer } from "./transcriptTailer.js";
|
|
11
|
+
import { SubagentTailer } from "./subagentTailer.js";
|
|
12
|
+
import { CodexRolloutTailer } from "./codexRolloutTailer.js";
|
|
13
|
+
import { canonicalPath } from "./paths.js";
|
|
14
|
+
/** セッション連動で transcript を tail し chat_output を engine チャネルへ流す制御子。 */
|
|
15
|
+
export class ChatTailController {
|
|
16
|
+
writer;
|
|
17
|
+
tailer;
|
|
18
|
+
subagentTailer;
|
|
19
|
+
projectsRoot;
|
|
20
|
+
/** チャット添付(user 発話の `@"path"`)のサムネ発行に使う。null なら発行しない。 */
|
|
21
|
+
imageService;
|
|
22
|
+
/** subagent_node の送出可否を判断する negotiated protocol version。 */
|
|
23
|
+
protocolVersion;
|
|
24
|
+
/** 既定エージェント(open で明示指定が無いときのフォールバック)。 */
|
|
25
|
+
agent;
|
|
26
|
+
/** 現在 open 中のセッションのエージェント(open 毎に確定。per-session 切替に対応)。 */
|
|
27
|
+
openAgent;
|
|
28
|
+
/** codex モードの rollout tailer(agent==="codex" のときのみ使用)。 */
|
|
29
|
+
codexTailer;
|
|
30
|
+
abortController = null;
|
|
31
|
+
currentPump = null;
|
|
32
|
+
currentSubagentPump = null;
|
|
33
|
+
/** 現在 tail 中の解決入力(usage 集計が同じ規則で対象 jsonl を解決するために保持)。 */
|
|
34
|
+
currentDir = null;
|
|
35
|
+
currentPreferred = null;
|
|
36
|
+
currentNewerThanMs = null;
|
|
37
|
+
/** open 時点で解決できた tail 対象 jsonl(同一会話への張り直しスキップ判定に使う)。 */
|
|
38
|
+
currentResolvedPath = null;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.writer = options.writer;
|
|
41
|
+
this.tailer = options.tailer;
|
|
42
|
+
this.subagentTailer = options.subagentTailer ?? new SubagentTailer();
|
|
43
|
+
this.projectsRoot = options.projectsRoot;
|
|
44
|
+
this.imageService = options.imageService ?? null;
|
|
45
|
+
this.protocolVersion = options.protocolVersion ?? (() => 1);
|
|
46
|
+
this.agent = options.agent ?? "claude";
|
|
47
|
+
this.openAgent = this.agent;
|
|
48
|
+
this.codexTailer =
|
|
49
|
+
options.codexTailer ?? new CodexRolloutTailer({ tailIndefinitely: true, emitReplayDoneMarker: true });
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `cwd` からそのセッションの project dir を解決し、transcript tail を開始/切替する。
|
|
53
|
+
* 同一会話(解決先 jsonl が同じ)への張り直しはスキップする。
|
|
54
|
+
*/
|
|
55
|
+
open(cwd, preferredSessionId, newerThanMs = null, agent = this.agent) {
|
|
56
|
+
if (!cwd) {
|
|
57
|
+
ChatTailController.diag("open skipped: empty cwd");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.openAgent = agent;
|
|
61
|
+
if (agent === "codex") {
|
|
62
|
+
this.openCodex(cwd, newerThanMs);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// claude はシンボリックリンクを解決した canonical パスで project slug を作る
|
|
66
|
+
//(例 /tmp → /private/tmp)。tail も同じく解決してから slug 化する。
|
|
67
|
+
const canonicalCwd = canonicalPath(cwd);
|
|
68
|
+
const slug = canonicalCwd.replaceAll("/", "-");
|
|
69
|
+
const dir = path.join(this.projectsRoot, slug);
|
|
70
|
+
const dirExists = fs.existsSync(dir);
|
|
71
|
+
ChatTailController.diag(`open cwd=${cwd} preferred=${preferredSessionId ?? "nil"} dir=${dir} dirExists=${dirExists}`);
|
|
72
|
+
const resolvedNow = TranscriptTailer.resolveJsonl(dir, preferredSessionId, newerThanMs);
|
|
73
|
+
if (resolvedNow !== null && this.currentPump !== null && resolvedNow === this.currentResolvedPath) {
|
|
74
|
+
ChatTailController.diag(`open skipped: same conversation already tailing (${resolvedNow})`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.abortController?.abort();
|
|
78
|
+
const ac = new AbortController();
|
|
79
|
+
this.abortController = ac;
|
|
80
|
+
this.currentDir = dir;
|
|
81
|
+
this.currentPreferred = preferredSessionId;
|
|
82
|
+
this.currentNewerThanMs = newerThanMs;
|
|
83
|
+
this.currentResolvedPath = resolvedNow;
|
|
84
|
+
const { writer, tailer, subagentTailer, imageService, protocolVersion } = this;
|
|
85
|
+
this.currentPump = (async () => {
|
|
86
|
+
ChatTailController.diag(`tail task started for dir=${dir} newerThan=${newerThanMs === null ? "nil" : String(newerThanMs)}`);
|
|
87
|
+
let count = 0;
|
|
88
|
+
try {
|
|
89
|
+
for await (const message of tailer.streamProjectDir(dir, preferredSessionId, newerThanMs, ac.signal)) {
|
|
90
|
+
if (ac.signal.aborted) {
|
|
91
|
+
ChatTailController.diag(`tail cancelled (emitted ${count})`);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
count += 1;
|
|
95
|
+
if (count <= 3 || count % 25 === 0)
|
|
96
|
+
ChatTailController.diag(`emit chat_output #${count}`);
|
|
97
|
+
try {
|
|
98
|
+
writer.write(message);
|
|
99
|
+
// user 発話中の添付画像(@"path")はサムネ(image_available)を後続で発行し、
|
|
100
|
+
// iOS にインライン表示させる(chat-attachments)。id は決定的(att-<streamId>-<n>)。
|
|
101
|
+
if (imageService !== null && message.type === "chat_output" && message.role === "user") {
|
|
102
|
+
const paths = ChatTailController.attachmentImagePaths(message.text);
|
|
103
|
+
for (let n = 0; n < paths.length; n += 1) {
|
|
104
|
+
const available = await imageService.makeAvailable(paths[n], `att-${message.streamId}-${n}`);
|
|
105
|
+
if (available !== null)
|
|
106
|
+
writer.write(available);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Read ツールで画像ファイルを読んだら、そのサムネ(image_available)を後続で発行し
|
|
110
|
+
// iOS にインライン表示させる(既存 chat-attachments と同じ描画経路を再利用)。
|
|
111
|
+
// id は tool_use id 由来で決定的(read-<id>)→ 再 tail/再オープンでも二重挿入されない。
|
|
112
|
+
if (imageService !== null && message.type === "tool_activity") {
|
|
113
|
+
const readPath = ChatTailController.readImagePath(message.activity);
|
|
114
|
+
if (readPath !== null) {
|
|
115
|
+
const available = await imageService.makeAvailable(readPath, `read-${message.activity.id}`);
|
|
116
|
+
if (available !== null)
|
|
117
|
+
writer.write(available);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
ChatTailController.diag(`write failed at #${count}: ${String(error)}`);
|
|
123
|
+
process.stderr.write(`[tailii-host engine] chat_output 書込失敗(tail 停止): ${String(error)}\n`);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
ChatTailController.diag(`tail stream ended (emitted ${count})`);
|
|
130
|
+
}
|
|
131
|
+
})();
|
|
132
|
+
this.currentSubagentPump = (async () => {
|
|
133
|
+
try {
|
|
134
|
+
for await (const message of subagentTailer.streamProjectDir(dir, preferredSessionId, newerThanMs, ac.signal)) {
|
|
135
|
+
if (ac.signal.aborted)
|
|
136
|
+
break;
|
|
137
|
+
if (protocolVersion() < 2)
|
|
138
|
+
continue;
|
|
139
|
+
try {
|
|
140
|
+
writer.write(message);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
ChatTailController.diag(`subagent_node 書込失敗: ${String(error)}`);
|
|
144
|
+
process.stderr.write(`[tailii-host engine] subagent_node 書込失敗(tail 停止): ${String(error)}\n`);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
ChatTailController.diag("subagent tail stream ended");
|
|
151
|
+
}
|
|
152
|
+
})();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* codex モードの tail 開始/切替。claude の slug/subagent/添付は使わず、
|
|
156
|
+
* cwd から rollout を解決して chat_output を流す。同一 rollout への張り直しはスキップする。
|
|
157
|
+
*/
|
|
158
|
+
openCodex(cwd, newerThanMs) {
|
|
159
|
+
const resolvedNow = this.codexTailer.resolve(cwd, newerThanMs);
|
|
160
|
+
if (resolvedNow !== null && this.currentPump !== null && resolvedNow === this.currentResolvedPath) {
|
|
161
|
+
ChatTailController.diag(`openCodex skipped: same rollout already tailing (${resolvedNow})`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.abortController?.abort();
|
|
165
|
+
const ac = new AbortController();
|
|
166
|
+
this.abortController = ac;
|
|
167
|
+
this.currentDir = cwd;
|
|
168
|
+
this.currentPreferred = null;
|
|
169
|
+
this.currentNewerThanMs = newerThanMs;
|
|
170
|
+
this.currentResolvedPath = resolvedNow;
|
|
171
|
+
this.currentSubagentPump = null;
|
|
172
|
+
const { writer, codexTailer } = this;
|
|
173
|
+
ChatTailController.diag(`openCodex cwd=${cwd} newerThan=${newerThanMs === null ? "nil" : String(newerThanMs)} resolved=${resolvedNow ?? "nil"}`);
|
|
174
|
+
this.currentPump = (async () => {
|
|
175
|
+
let count = 0;
|
|
176
|
+
try {
|
|
177
|
+
for await (const message of codexTailer.streamForCwd(cwd, newerThanMs, ac.signal)) {
|
|
178
|
+
if (ac.signal.aborted)
|
|
179
|
+
break;
|
|
180
|
+
count += 1;
|
|
181
|
+
if (count <= 3 || count % 25 === 0)
|
|
182
|
+
ChatTailController.diag(`emit codex chat_output #${count}`);
|
|
183
|
+
try {
|
|
184
|
+
writer.write(message);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
ChatTailController.diag(`codex write failed at #${count}: ${String(error)}`);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
ChatTailController.diag(`codex tail stream ended (emitted ${count})`);
|
|
194
|
+
}
|
|
195
|
+
})();
|
|
196
|
+
}
|
|
197
|
+
/** 画像として扱う拡張子集合(小文字・ドットなし)。添付検出と Read サムネ判定で共有。 */
|
|
198
|
+
static IMAGE_EXTENSIONS = new Set([
|
|
199
|
+
"png", "jpg", "jpeg", "gif", "webp", "heic", "heif", "bmp", "tiff", "tif",
|
|
200
|
+
]);
|
|
201
|
+
/**
|
|
202
|
+
* user 発話テキストから添付「画像」ファイルの絶対パスを抽出する(chat-attachments, TESTABLE)。
|
|
203
|
+
* `@"/path with space.png"`(引用形式)と `@/path/to/file.png`(非引用)の両方を対象にする。
|
|
204
|
+
*/
|
|
205
|
+
static attachmentImagePaths(text) {
|
|
206
|
+
if (!text.includes("@"))
|
|
207
|
+
return [];
|
|
208
|
+
const paths = [];
|
|
209
|
+
for (const match of text.matchAll(/@"(\/[^"]+)"/g)) {
|
|
210
|
+
if (match[1] !== undefined)
|
|
211
|
+
paths.push(match[1]);
|
|
212
|
+
}
|
|
213
|
+
for (const match of text.matchAll(/@(\/[^\s"]+)/g)) {
|
|
214
|
+
if (match[1] !== undefined)
|
|
215
|
+
paths.push(match[1]);
|
|
216
|
+
}
|
|
217
|
+
const seen = new Set();
|
|
218
|
+
return paths.filter((p) => {
|
|
219
|
+
const ext = path.extname(p).slice(1).toLowerCase();
|
|
220
|
+
if (!ChatTailController.IMAGE_EXTENSIONS.has(ext))
|
|
221
|
+
return false;
|
|
222
|
+
if (seen.has(p))
|
|
223
|
+
return false;
|
|
224
|
+
seen.add(p);
|
|
225
|
+
return true;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Read ツールの tool_activity が「画像ファイル」を対象にしているとき、その絶対パスを返す
|
|
230
|
+
* (chat-inline-read-image, TESTABLE)。Read 以外・パス無し・非画像拡張子は null。
|
|
231
|
+
*/
|
|
232
|
+
static readImagePath(activity) {
|
|
233
|
+
if (activity.name !== "Read")
|
|
234
|
+
return null;
|
|
235
|
+
const file = activity.file;
|
|
236
|
+
if (typeof file !== "string" || file.length === 0)
|
|
237
|
+
return null;
|
|
238
|
+
const ext = path.extname(file).slice(1).toLowerCase();
|
|
239
|
+
return ChatTailController.IMAGE_EXTENSIONS.has(ext) ? file : null;
|
|
240
|
+
}
|
|
241
|
+
/** 現在 tail 中の会話 jsonl の絶対パスを解決して返す(usage 集計用)。未開始・未出現は null。 */
|
|
242
|
+
currentTranscriptPath() {
|
|
243
|
+
if (this.currentDir === null)
|
|
244
|
+
return null;
|
|
245
|
+
// codex の usage 集計は claude 用パーサと非互換のため対象外(null)。open 中の agent で判定。
|
|
246
|
+
if (this.openAgent === "codex")
|
|
247
|
+
return null;
|
|
248
|
+
return TranscriptTailer.resolveJsonl(this.currentDir, this.currentPreferred, this.currentNewerThanMs);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* 現在 tail 中の codex rollout の絶対パス(usage 集計用, codex-input)。
|
|
252
|
+
* codex で tail 中かつ rollout 解決済みのときのみ返す。それ以外(claude/未解決)は null。
|
|
253
|
+
*/
|
|
254
|
+
currentCodexRolloutPath() {
|
|
255
|
+
if (this.openAgent !== "codex")
|
|
256
|
+
return null;
|
|
257
|
+
return this.currentResolvedPath;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 現在 open 中の tail エージェント種別(usage/status の分岐用)。
|
|
261
|
+
*
|
|
262
|
+
* usage_request は「rollout が解決済みか」ではなく「開いている会話が codex か」で分岐する必要がある。
|
|
263
|
+
* codex 会話で rollout 未解決のときに claude 分岐へ落ちると、Claude の OAuth プラン使用量
|
|
264
|
+
* (=Claude の状態)が codex 会話に表示されてしまうため(2026-07-07 ユーザー指摘)。
|
|
265
|
+
*/
|
|
266
|
+
currentAgent() {
|
|
267
|
+
return this.openAgent;
|
|
268
|
+
}
|
|
269
|
+
/** tail を停止する(engine チャネル断)。 */
|
|
270
|
+
stop() {
|
|
271
|
+
this.abortController?.abort();
|
|
272
|
+
this.abortController = null;
|
|
273
|
+
this.currentPump = null;
|
|
274
|
+
this.currentSubagentPump = null;
|
|
275
|
+
this.currentDir = null;
|
|
276
|
+
this.currentPreferred = null;
|
|
277
|
+
this.currentNewerThanMs = null;
|
|
278
|
+
this.currentResolvedPath = null;
|
|
279
|
+
}
|
|
280
|
+
/** 診断ログ(`~/.tailii/engine-tail.log` に追記)。失敗は握り潰す。 */
|
|
281
|
+
static diag(message) {
|
|
282
|
+
try {
|
|
283
|
+
const dir = path.join(os.homedir(), ".tailii");
|
|
284
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
285
|
+
fs.appendFileSync(path.join(dir, "engine-tail.log"), `[${new Date().toISOString()}] ${message}\n`);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// 診断ログの失敗は無視。
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=chatTailController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatTailController.js","sourceRoot":"","sources":["../src/chatTailController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ClaudeSessionInfo } from "./protocol.js";
|
|
2
|
+
/** slug(`/`→`-` 置換済み)から cwd を復元する(lossy フォールバック)。 */
|
|
3
|
+
export declare function cwdFromSlug(slug: string): string;
|
|
4
|
+
/** Claude Code のマシン内会話一覧を導出する値型サービス。 */
|
|
5
|
+
export declare class ClaudeSessionStore {
|
|
6
|
+
private readonly root;
|
|
7
|
+
constructor(root?: string);
|
|
8
|
+
/** 指定会話 ID の jsonl パスを projects root から探す。見つからない場合は null。 */
|
|
9
|
+
transcriptPath(sessionId: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* 会話一覧を updatedAt 降順で返す(nil は末尾、同値は sessionId 昇順で安定化)。
|
|
12
|
+
* `baseDir` 指定時は cwd が baseDir 自身/配下の会話のみに絞る(engine は無指定で呼ぶ)。
|
|
13
|
+
*/
|
|
14
|
+
list(baseDir?: string): ClaudeSessionInfo[];
|
|
15
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// claudeSessionStore.ts
|
|
2
|
+
// tailii (TS host) — Claude Code のマシン内会話一覧の導出(claude-sessions)
|
|
3
|
+
// Swift 版 ClaudeSessionStore.swift の移植。
|
|
4
|
+
// `~/.claude/projects/<slug>/<uuid>.jsonl` を列挙し、各 jsonl の先頭チャンクから
|
|
5
|
+
// ClaudeSessionInfo(sessionId / cwd / title / updatedAt)を導出して updatedAt 降順で返す。
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { isInsideBase } from "./paths.js";
|
|
10
|
+
/** タイトル抽出の最大長(先頭 ~60 字)。 */
|
|
11
|
+
const TITLE_MAX_LENGTH = 60;
|
|
12
|
+
/** cwd/title を探すためにスキャンする最大行数。 */
|
|
13
|
+
const SCAN_LINE_CAP = 400;
|
|
14
|
+
/** jsonl から先頭を読む最大バイト数(1 ファイル数十MBになり得るため全読みを避ける)。 */
|
|
15
|
+
const HEAD_BYTES_CAP = 256 * 1024;
|
|
16
|
+
/** slug(`/`→`-` 置換済み)から cwd を復元する(lossy フォールバック)。 */
|
|
17
|
+
export function cwdFromSlug(slug) {
|
|
18
|
+
const replaced = slug.replaceAll("-", "/");
|
|
19
|
+
return replaced.length === 0 ? "/" : replaced;
|
|
20
|
+
}
|
|
21
|
+
/** Claude Code のマシン内会話一覧を導出する値型サービス。 */
|
|
22
|
+
export class ClaudeSessionStore {
|
|
23
|
+
root;
|
|
24
|
+
constructor(root) {
|
|
25
|
+
this.root = root ?? path.join(os.homedir(), ".claude", "projects");
|
|
26
|
+
}
|
|
27
|
+
/** 指定会話 ID の jsonl パスを projects root から探す。見つからない場合は null。 */
|
|
28
|
+
transcriptPath(sessionId) {
|
|
29
|
+
let slugs;
|
|
30
|
+
try {
|
|
31
|
+
slugs = fs.readdirSync(this.root);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
for (const slug of slugs) {
|
|
37
|
+
const candidate = path.join(this.root, slug, `${sessionId}.jsonl`);
|
|
38
|
+
try {
|
|
39
|
+
if (fs.statSync(candidate).isFile())
|
|
40
|
+
return candidate;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// 読めない slug は無視する。
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 会話一覧を updatedAt 降順で返す(nil は末尾、同値は sessionId 昇順で安定化)。
|
|
50
|
+
* `baseDir` 指定時は cwd が baseDir 自身/配下の会話のみに絞る(engine は無指定で呼ぶ)。
|
|
51
|
+
*/
|
|
52
|
+
list(baseDir) {
|
|
53
|
+
let slugs;
|
|
54
|
+
try {
|
|
55
|
+
slugs = fs.readdirSync(this.root);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
let result = [];
|
|
61
|
+
for (const slug of slugs) {
|
|
62
|
+
const slugDir = path.join(this.root, slug);
|
|
63
|
+
let stat;
|
|
64
|
+
try {
|
|
65
|
+
stat = fs.statSync(slugDir);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!stat.isDirectory())
|
|
71
|
+
continue;
|
|
72
|
+
let files;
|
|
73
|
+
try {
|
|
74
|
+
files = fs.readdirSync(slugDir);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
if (!file.endsWith(".jsonl"))
|
|
81
|
+
continue;
|
|
82
|
+
const sessionId = file.slice(0, -".jsonl".length);
|
|
83
|
+
if (!sessionId)
|
|
84
|
+
continue;
|
|
85
|
+
result.push(deriveInfo(path.join(slugDir, file), sessionId, slug));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (baseDir) {
|
|
89
|
+
result = result.filter((info) => isInsideBase(info.cwd, baseDir));
|
|
90
|
+
}
|
|
91
|
+
return result.sort((lhs, rhs) => {
|
|
92
|
+
const l = lhs.updatedAt ?? Number.MIN_SAFE_INTEGER;
|
|
93
|
+
const r = rhs.updatedAt ?? Number.MIN_SAFE_INTEGER;
|
|
94
|
+
if (l !== r)
|
|
95
|
+
return r - l;
|
|
96
|
+
return lhs.sessionId < rhs.sessionId ? -1 : lhs.sessionId > rhs.sessionId ? 1 : 0;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** 1 つの jsonl から ClaudeSessionInfo を導出する(先頭チャンクのみ読む)。 */
|
|
101
|
+
function deriveInfo(filePath, sessionId, slug) {
|
|
102
|
+
let updatedAt;
|
|
103
|
+
try {
|
|
104
|
+
updatedAt = Math.floor(fs.statSync(filePath).mtimeMs / 1000);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
updatedAt = undefined;
|
|
108
|
+
}
|
|
109
|
+
let cwd = null;
|
|
110
|
+
let title = null;
|
|
111
|
+
try {
|
|
112
|
+
const fd = fs.openSync(filePath, "r");
|
|
113
|
+
try {
|
|
114
|
+
const buf = Buffer.alloc(HEAD_BYTES_CAP);
|
|
115
|
+
const bytesRead = fs.readSync(fd, buf, 0, HEAD_BYTES_CAP, 0);
|
|
116
|
+
// 末尾は行の途中で切れ得るが、その行は JSON パースに失敗して skip されるだけで安全。
|
|
117
|
+
const content = buf.subarray(0, bytesRead).toString("utf8");
|
|
118
|
+
let scanned = 0;
|
|
119
|
+
for (const line of content.split("\n")) {
|
|
120
|
+
if (!line)
|
|
121
|
+
continue;
|
|
122
|
+
if (scanned >= SCAN_LINE_CAP)
|
|
123
|
+
break;
|
|
124
|
+
scanned += 1;
|
|
125
|
+
let obj;
|
|
126
|
+
try {
|
|
127
|
+
obj = JSON.parse(line);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (typeof obj !== "object" || obj === null)
|
|
133
|
+
continue;
|
|
134
|
+
const rec = obj;
|
|
135
|
+
if (cwd === null && typeof rec["cwd"] === "string" && rec["cwd"].length > 0) {
|
|
136
|
+
cwd = rec["cwd"];
|
|
137
|
+
}
|
|
138
|
+
if (title === null && rec["type"] === "user") {
|
|
139
|
+
const t = extractUserText(rec);
|
|
140
|
+
if (t !== null)
|
|
141
|
+
title = t;
|
|
142
|
+
}
|
|
143
|
+
if (cwd !== null && title !== null)
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
fs.closeSync(fd);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// 読めないファイルはフォールバックのみで返す。
|
|
153
|
+
}
|
|
154
|
+
const info = {
|
|
155
|
+
sessionId,
|
|
156
|
+
cwd: cwd ?? cwdFromSlug(slug),
|
|
157
|
+
title: title ?? sessionId.slice(0, 8),
|
|
158
|
+
};
|
|
159
|
+
if (updatedAt !== undefined)
|
|
160
|
+
info.updatedAt = updatedAt;
|
|
161
|
+
return info;
|
|
162
|
+
}
|
|
163
|
+
/** `type=="user"` 行のメッセージ本文を取り出し、先頭 ~60 字へ整形する。 */
|
|
164
|
+
function extractUserText(obj) {
|
|
165
|
+
const message = obj["message"];
|
|
166
|
+
if (typeof message !== "object" || message === null)
|
|
167
|
+
return null;
|
|
168
|
+
const content = message["content"];
|
|
169
|
+
let raw = null;
|
|
170
|
+
if (typeof content === "string") {
|
|
171
|
+
raw = content;
|
|
172
|
+
}
|
|
173
|
+
else if (Array.isArray(content)) {
|
|
174
|
+
raw = firstText(content);
|
|
175
|
+
}
|
|
176
|
+
if (raw === null)
|
|
177
|
+
return null;
|
|
178
|
+
let text = raw.replaceAll("\n", " ").replaceAll("\r", " ").trim();
|
|
179
|
+
if (!text)
|
|
180
|
+
return null;
|
|
181
|
+
// slash コマンドのメタ包み(`<command-…>` で始まる)はタイトルに向かないので除外。
|
|
182
|
+
if (text.startsWith("<command-") || text.startsWith("<local-command"))
|
|
183
|
+
return null;
|
|
184
|
+
if (text.length > TITLE_MAX_LENGTH)
|
|
185
|
+
text = text.slice(0, TITLE_MAX_LENGTH);
|
|
186
|
+
return text;
|
|
187
|
+
}
|
|
188
|
+
/** content 配列から最初のテキストを取り出す。 */
|
|
189
|
+
function firstText(arr) {
|
|
190
|
+
for (const element of arr) {
|
|
191
|
+
if (typeof element === "string" && element.length > 0)
|
|
192
|
+
return element;
|
|
193
|
+
if (typeof element === "object" && element !== null) {
|
|
194
|
+
const t = element["text"];
|
|
195
|
+
if (typeof t === "string" && t.length > 0)
|
|
196
|
+
return t;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=claudeSessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeSessionStore.js","sourceRoot":"","sources":["../src/claudeSessionStore.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED