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.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/apnsConfigStore.d.ts +22 -0
  4. package/dist/apnsConfigStore.js +50 -0
  5. package/dist/apnsConfigStore.js.map +1 -0
  6. package/dist/apnsJwtProvider.d.ts +50 -0
  7. package/dist/apnsJwtProvider.js +158 -0
  8. package/dist/apnsJwtProvider.js.map +1 -0
  9. package/dist/apnsSender.d.ts +69 -0
  10. package/dist/apnsSender.js +155 -0
  11. package/dist/apnsSender.js.map +1 -0
  12. package/dist/approvalPushNotifier.d.ts +100 -0
  13. package/dist/approvalPushNotifier.js +236 -0
  14. package/dist/approvalPushNotifier.js.map +1 -0
  15. package/dist/broker.d.ts +24 -0
  16. package/dist/broker.js +197 -0
  17. package/dist/broker.js.map +1 -0
  18. package/dist/chatTailController.d.ts +87 -0
  19. package/dist/chatTailController.js +292 -0
  20. package/dist/chatTailController.js.map +1 -0
  21. package/dist/claudeSessionStore.d.ts +15 -0
  22. package/dist/claudeSessionStore.js +201 -0
  23. package/dist/claudeSessionStore.js.map +1 -0
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +53 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/codexRolloutTailer.d.ts +56 -0
  28. package/dist/codexRolloutTailer.js +303 -0
  29. package/dist/codexRolloutTailer.js.map +1 -0
  30. package/dist/codexSessionStore.d.ts +23 -0
  31. package/dist/codexSessionStore.js +274 -0
  32. package/dist/codexSessionStore.js.map +1 -0
  33. package/dist/codexUsage.d.ts +16 -0
  34. package/dist/codexUsage.js +144 -0
  35. package/dist/codexUsage.js.map +1 -0
  36. package/dist/deviceTokenStore.d.ts +38 -0
  37. package/dist/deviceTokenStore.js +73 -0
  38. package/dist/deviceTokenStore.js.map +1 -0
  39. package/dist/dirLister.d.ts +9 -0
  40. package/dist/dirLister.js +98 -0
  41. package/dist/dirLister.js.map +1 -0
  42. package/dist/doctor.d.ts +36 -0
  43. package/dist/doctor.js +162 -0
  44. package/dist/doctor.js.map +1 -0
  45. package/dist/engine.d.ts +85 -0
  46. package/dist/engine.js +962 -0
  47. package/dist/engine.js.map +1 -0
  48. package/dist/hook.d.ts +67 -0
  49. package/dist/hook.js +511 -0
  50. package/dist/hook.js.map +1 -0
  51. package/dist/hookSettings.d.ts +40 -0
  52. package/dist/hookSettings.js +128 -0
  53. package/dist/hookSettings.js.map +1 -0
  54. package/dist/idleReaper.d.ts +13 -0
  55. package/dist/idleReaper.js +30 -0
  56. package/dist/idleReaper.js.map +1 -0
  57. package/dist/imageService.d.ts +53 -0
  58. package/dist/imageService.js +280 -0
  59. package/dist/imageService.js.map +1 -0
  60. package/dist/kick.d.ts +8 -0
  61. package/dist/kick.js +60 -0
  62. package/dist/kick.js.map +1 -0
  63. package/dist/launch.d.ts +107 -0
  64. package/dist/launch.js +396 -0
  65. package/dist/launch.js.map +1 -0
  66. package/dist/legacyHomeMigration.d.ts +1 -0
  67. package/dist/legacyHomeMigration.js +23 -0
  68. package/dist/legacyHomeMigration.js.map +1 -0
  69. package/dist/lineWriter.d.ts +9 -0
  70. package/dist/lineWriter.js +19 -0
  71. package/dist/lineWriter.js.map +1 -0
  72. package/dist/mdnsAdvertiser.d.ts +46 -0
  73. package/dist/mdnsAdvertiser.js +268 -0
  74. package/dist/mdnsAdvertiser.js.map +1 -0
  75. package/dist/observationLog.d.ts +54 -0
  76. package/dist/observationLog.js +108 -0
  77. package/dist/observationLog.js.map +1 -0
  78. package/dist/pairingCode.d.ts +60 -0
  79. package/dist/pairingCode.js +282 -0
  80. package/dist/pairingCode.js.map +1 -0
  81. package/dist/paths.d.ts +13 -0
  82. package/dist/paths.js +46 -0
  83. package/dist/paths.js.map +1 -0
  84. package/dist/permissionMode.d.ts +8 -0
  85. package/dist/permissionMode.js +32 -0
  86. package/dist/permissionMode.js.map +1 -0
  87. package/dist/planUsageFetcher.d.ts +35 -0
  88. package/dist/planUsageFetcher.js +172 -0
  89. package/dist/planUsageFetcher.js.map +1 -0
  90. package/dist/protocol.d.ts +329 -0
  91. package/dist/protocol.js +544 -0
  92. package/dist/protocol.js.map +1 -0
  93. package/dist/pushTokenCommand.d.ts +9 -0
  94. package/dist/pushTokenCommand.js +85 -0
  95. package/dist/pushTokenCommand.js.map +1 -0
  96. package/dist/pushTypes.d.ts +41 -0
  97. package/dist/pushTypes.js +68 -0
  98. package/dist/pushTypes.js.map +1 -0
  99. package/dist/sendLog.d.ts +14 -0
  100. package/dist/sendLog.js +64 -0
  101. package/dist/sendLog.js.map +1 -0
  102. package/dist/sessionActivityProvider.d.ts +7 -0
  103. package/dist/sessionActivityProvider.js +44 -0
  104. package/dist/sessionActivityProvider.js.map +1 -0
  105. package/dist/sessionIdleTracker.d.ts +19 -0
  106. package/dist/sessionIdleTracker.js +42 -0
  107. package/dist/sessionIdleTracker.js.map +1 -0
  108. package/dist/sessionListService.d.ts +27 -0
  109. package/dist/sessionListService.js +85 -0
  110. package/dist/sessionListService.js.map +1 -0
  111. package/dist/sessionMetadataStore.d.ts +33 -0
  112. package/dist/sessionMetadataStore.js +122 -0
  113. package/dist/sessionMetadataStore.js.map +1 -0
  114. package/dist/sessionSearch.d.ts +29 -0
  115. package/dist/sessionSearch.js +139 -0
  116. package/dist/sessionSearch.js.map +1 -0
  117. package/dist/setup.d.ts +83 -0
  118. package/dist/setup.js +412 -0
  119. package/dist/setup.js.map +1 -0
  120. package/dist/sleep.d.ts +4 -0
  121. package/dist/sleep.js +25 -0
  122. package/dist/sleep.js.map +1 -0
  123. package/dist/socketPath.d.ts +12 -0
  124. package/dist/socketPath.js +51 -0
  125. package/dist/socketPath.js.map +1 -0
  126. package/dist/subagentTailer.d.ts +15 -0
  127. package/dist/subagentTailer.js +399 -0
  128. package/dist/subagentTailer.js.map +1 -0
  129. package/dist/tmux.d.ts +62 -0
  130. package/dist/tmux.js +163 -0
  131. package/dist/tmux.js.map +1 -0
  132. package/dist/transcriptTailer.d.ts +61 -0
  133. package/dist/transcriptTailer.js +606 -0
  134. package/dist/transcriptTailer.js.map +1 -0
  135. package/dist/usageAggregator.d.ts +12 -0
  136. package/dist/usageAggregator.js +55 -0
  137. package/dist/usageAggregator.js.map +1 -0
  138. package/dist/version.d.ts +10 -0
  139. package/dist/version.js +45 -0
  140. package/dist/version.js.map +1 -0
  141. package/package.json +50 -0
package/dist/cli.js ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ // cli.ts — tailii ホスト CLI エントリ(Swift 版 Dispatcher の移植先)
3
+ //
4
+ // サブコマンド(Swift 版と同一の面 + setup を統合):
5
+ // engine 横断制御チャネル(セッション一覧/起動/モード/使用量/tool_activity 中継 …)
6
+ // serve 承認チャネル(--session <name>)
7
+ // hook Claude Code hook 受け口(承認要求の投入)
8
+ // launch tmux セッション起動
9
+ // kick 承認待ちの起床
10
+ // push-token APNs デバイストークン登録
11
+ // setup ペアリング(鍵生成 + QR / ペアリングコード受け渡し)
12
+ //
13
+ // 移植は protocol → engine → serve/hook → launch/setup の順に段階的に行う。
14
+ // 未移植サブコマンドは明示エラーで落ちる(黙って別挙動をしない)。
15
+ import { runEngineCommand } from "./engine.js";
16
+ import { runLaunchCommand } from "./launch.js";
17
+ import { runServeCommand } from "./broker.js";
18
+ import { runHookCommand } from "./hook.js";
19
+ import { runKickCommand } from "./kick.js";
20
+ import { runPushTokenCommand } from "./pushTokenCommand.js";
21
+ import { runSetupCommand } from "./setup.js";
22
+ import { runDoctorCommand } from "./doctor.js";
23
+ import { migrateLegacyHome } from "./legacyHomeMigration.js";
24
+ const PORTED = {
25
+ engine: runEngineCommand,
26
+ launch: runLaunchCommand,
27
+ serve: runServeCommand,
28
+ hook: runHookCommand,
29
+ kick: runKickCommand,
30
+ "push-token": runPushTokenCommand,
31
+ setup: runSetupCommand,
32
+ doctor: runDoctorCommand,
33
+ };
34
+ async function main() {
35
+ migrateLegacyHome();
36
+ const [subcommand, ...rest] = process.argv.slice(2);
37
+ if (!subcommand || subcommand === "--help" || subcommand === "-h") {
38
+ process.stderr.write("usage: tailii <engine|serve|hook|launch|kick|push-token|setup|doctor> [options]\n");
39
+ return 64;
40
+ }
41
+ const handler = PORTED[subcommand];
42
+ if (!handler) {
43
+ process.stderr.write(`tailii: subcommand '${subcommand}' は TypeScript 版に未移植です。` +
44
+ `当面は Swift 版 (tailii-host) を使用してください。\n`);
45
+ return 69;
46
+ }
47
+ return handler(rest);
48
+ }
49
+ main().then((code) => process.exit(code), (error) => {
50
+ process.stderr.write(`tailii: ${String(error)}\n`);
51
+ process.exit(70);
52
+ });
53
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,wDAAwD;AACxD,EAAE;AACF,oCAAoC;AACpC,kEAAkE;AAClE,2CAA2C;AAC3C,gDAAgD;AAChD,+BAA+B;AAC/B,0BAA0B;AAC1B,kCAAkC;AAClC,iDAAiD;AACjD,EAAE;AACF,+DAA+D;AAC/D,mCAAmC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,GAAwD;IAClE,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,eAAe;IACtB,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,cAAc;IACpB,YAAY,EAAE,mBAAmB;IACjC,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,iBAAiB,EAAE,CAAC;IACpB,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mFAAmF,CACpF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,UAAU,yBAAyB;YACxD,wCAAwC,CAC3C,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC,CACF,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { type ControlMessage } from "./protocol.js";
2
+ /** 履歴再生完了マーカーの streamId(claude 側と共通。iOS `ChatLogModel` と対で解釈)。 */
3
+ export declare const HISTORY_DONE_STREAM_ID = "pc:history-done";
4
+ /** 現在コンテキストトークン数通知マーカーの streamId(claude 側と共通)。 */
5
+ export declare const CONTEXT_STREAM_ID = "pc:context";
6
+ /** 既定の codex セッションルート(`~/.codex/sessions`)。 */
7
+ export declare function defaultCodexSessionsRoot(): string;
8
+ export interface CodexRolloutTailerOptions {
9
+ /** 追記ポーリング間隔(ms)。既定 50ms。 */
10
+ pollIntervalMs?: number;
11
+ /** tail 継続の最大 ms。null/未指定なら EOF で即終了(tail しない)。 */
12
+ tailDeadlineMs?: number | null;
13
+ /** EOF 後も abort まで無期限に tail するか。既定 false(本番 engine は true)。 */
14
+ tailIndefinitely?: boolean;
15
+ /** 初回 EOF で履歴再生完了マーカーを流すか。既定 false。 */
16
+ emitReplayDoneMarker?: boolean;
17
+ /** rollout 走査ルート。テスト注入用。省略時は `~/.codex/sessions`。 */
18
+ sessionsRoot?: string;
19
+ }
20
+ interface TailState {
21
+ seq: number;
22
+ lastContextTokens: number | null;
23
+ }
24
+ export declare class CodexRolloutTailer {
25
+ private readonly pollIntervalMs;
26
+ private readonly tailDeadlineMs;
27
+ private readonly tailIndefinitely;
28
+ private readonly emitReplayDoneMarker;
29
+ private readonly sessionsRoot;
30
+ constructor(options?: CodexRolloutTailerOptions);
31
+ /** この tailer の走査ルートで `cwd` 対応の rollout を解決する(未出現は null)。 */
32
+ resolve(cwd: string, newerThanMs?: number | null): string | null;
33
+ /**
34
+ * `cwd` に対応する rollout JSONL を解決して tail する。
35
+ * まだ無ければ出現をポーリングで待つ(無期限 tail は abort まで、上限 tail は deadline まで)。
36
+ */
37
+ streamForCwd(cwd: string, newerThanMs?: number | null, signal?: AbortSignal): AsyncGenerator<ControlMessage, void, void>;
38
+ /**
39
+ * `sessionsRoot` 配下(日付階層)から `cwd` 一致の rollout を解決する。
40
+ * 各 *.jsonl の先頭行 `session_meta.payload.cwd` を canonical 比較し、mtime 最新を選ぶ。
41
+ * newerThanMs 指定時はそれより後に更新された rollout のみを候補にする。無ければ null。
42
+ */
43
+ static resolveRollout(cwd: string, sessionsRoot: string, newerThanMs?: number | null): string | null;
44
+ /** 単一 rollout JSONL を頭から読み、tail する共有ループ(TranscriptTailer と同構造)。 */
45
+ private runTail;
46
+ }
47
+ /**
48
+ * codex rollout の 1 行(JSONL)をパースし、生成メッセージを列挙する。
49
+ * 対象は `event_msg`:
50
+ * - user_message → user ロールの chat_output
51
+ * - agent_message(phase == final_answer)→ assistant ロールの chat_output
52
+ * - token_count → コンテキストトークン数マーカー
53
+ * 解釈できない行・対象外イベントはスキップ。
54
+ */
55
+ export declare function emitLine(line: Buffer, state: TailState): Generator<ControlMessage, void, void>;
56
+ export {};
@@ -0,0 +1,303 @@
1
+ // codexRolloutTailer.ts
2
+ // tailii (TS host) — codex(OpenAI Codex CLI)会話出力キャプチャ(rollout tail)
3
+ // claude 用 TranscriptTailer の codex 版。`~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl` を
4
+ // tail し、`event_msg`(user_message / agent_message / token_count)を
5
+ // `chat_output` デルタ(1 ターン = 1 streamId、確定で eof:true)へ変換する。
6
+ //
7
+ // claude との差:
8
+ // - 解決キーが「claude projects slug」ではなく「session_meta.payload.cwd == 実 cwd」。
9
+ // rollout は日付ディレクトリに散らばるため、cwd 一致の最新 rollout を走査で選ぶ。
10
+ // - 抽出は event_msg に限定する(response_item は同内容の重複なので使わない)。
11
+ // - tool 実行 / reasoning / 承認は本スライスでは扱わない(後続 Milestone)。
12
+ import * as fs from "node:fs";
13
+ import * as os from "node:os";
14
+ import * as path from "node:path";
15
+ import { PROTOCOL_V1 } from "./protocol.js";
16
+ import { canonicalPath } from "./paths.js";
17
+ import { abortableSleep } from "./sleep.js";
18
+ /** 履歴再生完了マーカーの streamId(claude 側と共通。iOS `ChatLogModel` と対で解釈)。 */
19
+ export const HISTORY_DONE_STREAM_ID = "pc:history-done";
20
+ /** 現在コンテキストトークン数通知マーカーの streamId(claude 側と共通)。 */
21
+ export const CONTEXT_STREAM_ID = "pc:context";
22
+ /** 既定の codex セッションルート(`~/.codex/sessions`)。 */
23
+ export function defaultCodexSessionsRoot() {
24
+ return path.join(os.homedir(), ".codex", "sessions");
25
+ }
26
+ /** session_meta 行の解決で読み取る先頭バイト上限(base_instructions が大きいため広めに取る)。 */
27
+ const META_READ_LIMIT_BYTES = 512 * 1024;
28
+ export class CodexRolloutTailer {
29
+ pollIntervalMs;
30
+ tailDeadlineMs;
31
+ tailIndefinitely;
32
+ emitReplayDoneMarker;
33
+ sessionsRoot;
34
+ constructor(options = {}) {
35
+ this.pollIntervalMs = options.pollIntervalMs ?? 50;
36
+ this.tailDeadlineMs = options.tailDeadlineMs ?? null;
37
+ this.tailIndefinitely = options.tailIndefinitely ?? false;
38
+ this.emitReplayDoneMarker = options.emitReplayDoneMarker ?? false;
39
+ this.sessionsRoot = options.sessionsRoot ?? defaultCodexSessionsRoot();
40
+ }
41
+ /** この tailer の走査ルートで `cwd` 対応の rollout を解決する(未出現は null)。 */
42
+ resolve(cwd, newerThanMs = null) {
43
+ return CodexRolloutTailer.resolveRollout(cwd, this.sessionsRoot, newerThanMs);
44
+ }
45
+ /**
46
+ * `cwd` に対応する rollout JSONL を解決して tail する。
47
+ * まだ無ければ出現をポーリングで待つ(無期限 tail は abort まで、上限 tail は deadline まで)。
48
+ */
49
+ async *streamForCwd(cwd, newerThanMs = null, signal) {
50
+ const start = Date.now();
51
+ let resolved = null;
52
+ while (!signal?.aborted) {
53
+ resolved = CodexRolloutTailer.resolveRollout(cwd, this.sessionsRoot, newerThanMs);
54
+ if (resolved !== null)
55
+ break;
56
+ if (!this.tailIndefinitely) {
57
+ if (this.tailDeadlineMs === null || Date.now() - start >= this.tailDeadlineMs)
58
+ return;
59
+ }
60
+ await abortableSleep(this.pollIntervalMs, signal);
61
+ }
62
+ if (resolved !== null && !signal?.aborted) {
63
+ yield* this.runTail(resolved, signal);
64
+ }
65
+ }
66
+ /**
67
+ * `sessionsRoot` 配下(日付階層)から `cwd` 一致の rollout を解決する。
68
+ * 各 *.jsonl の先頭行 `session_meta.payload.cwd` を canonical 比較し、mtime 最新を選ぶ。
69
+ * newerThanMs 指定時はそれより後に更新された rollout のみを候補にする。無ければ null。
70
+ */
71
+ static resolveRollout(cwd, sessionsRoot, newerThanMs = null) {
72
+ const target = canonicalPath(cwd);
73
+ const files = listRolloutFiles(sessionsRoot);
74
+ // 最新から順に見て、cwd 一致の最初の 1 本を返す(新しい会話を優先)。
75
+ files.sort((a, b) => b.mtimeMs - a.mtimeMs);
76
+ for (const file of files) {
77
+ if (newerThanMs !== null && file.mtimeMs <= newerThanMs)
78
+ continue;
79
+ const metaCwd = readRolloutCwd(file.path);
80
+ if (metaCwd === null)
81
+ continue;
82
+ if (canonicalPath(metaCwd) === target)
83
+ return file.path;
84
+ }
85
+ return null;
86
+ }
87
+ /** 単一 rollout JSONL を頭から読み、tail する共有ループ(TranscriptTailer と同構造)。 */
88
+ async *runTail(rolloutPath, signal) {
89
+ let fd;
90
+ try {
91
+ fd = fs.openSync(rolloutPath, "r");
92
+ }
93
+ catch {
94
+ return;
95
+ }
96
+ try {
97
+ let position = 0;
98
+ let lineBuf = Buffer.alloc(0);
99
+ const state = { seq: 0, lastContextTokens: null };
100
+ const start = Date.now();
101
+ let announcedReplayDone = false;
102
+ const chunk = Buffer.alloc(4096);
103
+ while (!signal?.aborted) {
104
+ let bytesRead = 0;
105
+ try {
106
+ bytesRead = fs.readSync(fd, chunk, 0, chunk.length, position);
107
+ }
108
+ catch {
109
+ bytesRead = 0;
110
+ }
111
+ if (bytesRead === 0) {
112
+ // 初回 EOF = 既存内容の再生完了。マーカー有効時は完了シグナルを 1 通流す。
113
+ if (this.emitReplayDoneMarker && !announcedReplayDone) {
114
+ announcedReplayDone = true;
115
+ if (lineBuf.length > 0) {
116
+ yield* emitLine(lineBuf, state);
117
+ lineBuf = Buffer.alloc(0);
118
+ }
119
+ yield {
120
+ type: "chat_output",
121
+ v: PROTOCOL_V1,
122
+ streamId: HISTORY_DONE_STREAM_ID,
123
+ role: "system",
124
+ text: "",
125
+ eof: true,
126
+ };
127
+ }
128
+ if (!this.tailIndefinitely) {
129
+ if (this.tailDeadlineMs === null || Date.now() - start >= this.tailDeadlineMs) {
130
+ if (lineBuf.length > 0)
131
+ yield* emitLine(lineBuf, state);
132
+ return;
133
+ }
134
+ }
135
+ await abortableSleep(this.pollIntervalMs, signal);
136
+ continue;
137
+ }
138
+ position += bytesRead;
139
+ lineBuf = Buffer.concat([lineBuf, chunk.subarray(0, bytesRead)]);
140
+ let nl = lineBuf.indexOf(0x0a);
141
+ while (nl >= 0) {
142
+ const line = lineBuf.subarray(0, nl);
143
+ lineBuf = lineBuf.subarray(nl + 1);
144
+ yield* emitLine(line, state);
145
+ nl = lineBuf.indexOf(0x0a);
146
+ }
147
+ }
148
+ }
149
+ finally {
150
+ try {
151
+ fs.closeSync(fd);
152
+ }
153
+ catch {
154
+ // 二重 close 等は無視。
155
+ }
156
+ }
157
+ }
158
+ }
159
+ /** rollout ファイル(mtime 付き)を日付階層から列挙する。 */
160
+ function listRolloutFiles(sessionsRoot) {
161
+ const out = [];
162
+ const walk = (dir) => {
163
+ let entries;
164
+ try {
165
+ entries = fs.readdirSync(dir, { withFileTypes: true });
166
+ }
167
+ catch {
168
+ return;
169
+ }
170
+ for (const entry of entries) {
171
+ const p = path.join(dir, entry.name);
172
+ if (entry.isDirectory()) {
173
+ walk(p);
174
+ }
175
+ else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
176
+ let mtimeMs = 0;
177
+ try {
178
+ mtimeMs = fs.statSync(p).mtimeMs;
179
+ }
180
+ catch {
181
+ mtimeMs = 0;
182
+ }
183
+ out.push({ path: p, mtimeMs });
184
+ }
185
+ }
186
+ };
187
+ walk(sessionsRoot);
188
+ return out;
189
+ }
190
+ /** rollout の先頭 `session_meta` 行から `payload.cwd` を読む。読めなければ null。 */
191
+ function readRolloutCwd(rolloutPath) {
192
+ let fd;
193
+ try {
194
+ fd = fs.openSync(rolloutPath, "r");
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ try {
200
+ const buf = Buffer.alloc(META_READ_LIMIT_BYTES);
201
+ const bytesRead = fs.readSync(fd, buf, 0, buf.length, 0);
202
+ if (bytesRead === 0)
203
+ return null;
204
+ const slice = buf.subarray(0, bytesRead);
205
+ const nl = slice.indexOf(0x0a);
206
+ const firstLine = (nl >= 0 ? slice.subarray(0, nl) : slice).toString("utf8");
207
+ const parsed = JSON.parse(firstLine);
208
+ if (typeof parsed === "object" &&
209
+ parsed !== null &&
210
+ parsed.type === "session_meta") {
211
+ const payload = parsed.payload;
212
+ if (typeof payload === "object" && payload !== null) {
213
+ const cwd = payload.cwd;
214
+ if (typeof cwd === "string" && cwd.length > 0)
215
+ return cwd;
216
+ }
217
+ }
218
+ return null;
219
+ }
220
+ catch {
221
+ return null;
222
+ }
223
+ finally {
224
+ try {
225
+ fs.closeSync(fd);
226
+ }
227
+ catch {
228
+ // 無視。
229
+ }
230
+ }
231
+ }
232
+ /**
233
+ * codex rollout の 1 行(JSONL)をパースし、生成メッセージを列挙する。
234
+ * 対象は `event_msg`:
235
+ * - user_message → user ロールの chat_output
236
+ * - agent_message(phase == final_answer)→ assistant ロールの chat_output
237
+ * - token_count → コンテキストトークン数マーカー
238
+ * 解釈できない行・対象外イベントはスキップ。
239
+ */
240
+ export function* emitLine(line, state) {
241
+ const text = line.toString("utf8").replaceAll("\r", "");
242
+ if (!text)
243
+ return;
244
+ let parsed;
245
+ try {
246
+ parsed = JSON.parse(text);
247
+ }
248
+ catch {
249
+ return;
250
+ }
251
+ if (typeof parsed !== "object" || parsed === null)
252
+ return;
253
+ if (parsed.type !== "event_msg")
254
+ return;
255
+ const payload = parsed.payload;
256
+ if (typeof payload !== "object" || payload === null)
257
+ return;
258
+ const kind = payload.type;
259
+ if (kind === "user_message" || kind === "agent_message") {
260
+ // agent_message は phase == final_answer のみ採用(中間 phase の重複を避ける)。
261
+ if (kind === "agent_message") {
262
+ const phase = payload.phase;
263
+ if (phase !== undefined && phase !== "final_answer")
264
+ return;
265
+ }
266
+ const message = payload.message;
267
+ if (typeof message !== "string" || message.length === 0)
268
+ return;
269
+ const role = kind === "user_message" ? "user" : "assistant";
270
+ state.seq += 1;
271
+ yield {
272
+ type: "chat_output",
273
+ v: PROTOCOL_V1,
274
+ streamId: `codex-turn-${state.seq}`,
275
+ role,
276
+ text: message,
277
+ eof: true,
278
+ };
279
+ return;
280
+ }
281
+ if (kind === "token_count") {
282
+ const info = payload.info;
283
+ if (typeof info === "object" && info !== null) {
284
+ const usage = info.total_token_usage;
285
+ if (typeof usage === "object" && usage !== null) {
286
+ const total = usage.total_tokens;
287
+ if (typeof total === "number" && total !== state.lastContextTokens) {
288
+ state.lastContextTokens = total;
289
+ yield {
290
+ type: "chat_output",
291
+ v: PROTOCOL_V1,
292
+ streamId: CONTEXT_STREAM_ID,
293
+ role: "system",
294
+ text: String(total),
295
+ eof: true,
296
+ };
297
+ }
298
+ }
299
+ }
300
+ return;
301
+ }
302
+ }
303
+ //# sourceMappingURL=codexRolloutTailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexRolloutTailer.js","sourceRoot":"","sources":["../src/codexRolloutTailer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ClaudeSessionInfo } from "./protocol.js";
2
+ /** 既定の codex ホーム(`~/.codex`)。 */
3
+ export declare function defaultCodexHome(): string;
4
+ /** codex のマシン内会話一覧を導出する値型サービス(agent-tag)。 */
5
+ export declare class CodexSessionStore {
6
+ private readonly sessionsRoot;
7
+ private readonly indexPath;
8
+ private readonly maxSessions;
9
+ /**
10
+ * @param home codex ホーム(既定 `~/.codex`)。テストは一時 dir を注入する。
11
+ * @param maxSessions 走査上限(既定 200、mtime 新しい順)。
12
+ */
13
+ constructor(home?: string, maxSessions?: number);
14
+ /**
15
+ * codex 会話一覧を updatedAt 降順で返す(同値は sessionId 昇順で安定化)。
16
+ * `baseDir` 指定時は cwd が baseDir 自身/配下の会話のみに絞る(engine は無指定で呼ぶ)。
17
+ */
18
+ list(baseDir?: string): ClaudeSessionInfo[];
19
+ /** `session_index.jsonl` を id → { title, updatedAt(秒) } に読む(無ければ空マップ)。 */
20
+ private readIndex;
21
+ /** rollout ファイル(`rollout-*.jsonl`)を再帰列挙する(path + mtimeMs)。 */
22
+ private listRollouts;
23
+ }