cueline 0.1.6 → 0.1.7

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 (162) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +27 -0
  4. package/README.ja.md +29 -7
  5. package/README.ko.md +29 -7
  6. package/README.md +78 -11
  7. package/README.zh-CN.md +29 -7
  8. package/README.zh-TW.md +36 -8
  9. package/config/routing.schema.json +3 -0
  10. package/dist/src/api-caller-work.js +58 -14
  11. package/dist/src/api-caller-work.js.map +1 -1
  12. package/dist/src/api-contracts.d.ts +49 -0
  13. package/dist/src/api-controller-handoff.js +30 -38
  14. package/dist/src/api-controller-handoff.js.map +1 -1
  15. package/dist/src/api-run-verification.d.ts +3 -0
  16. package/dist/src/api-run-verification.js +174 -0
  17. package/dist/src/api-run-verification.js.map +1 -0
  18. package/dist/src/api-runtime-lifecycle.d.ts +6 -1
  19. package/dist/src/api-runtime-lifecycle.js +97 -8
  20. package/dist/src/api-runtime-lifecycle.js.map +1 -1
  21. package/dist/src/api.d.ts +17 -3
  22. package/dist/src/api.js +105 -38
  23. package/dist/src/api.js.map +1 -1
  24. package/dist/src/browser/browser-adapter.d.ts +15 -0
  25. package/dist/src/browser/codex-iab/bootstrap.d.ts +20 -0
  26. package/dist/src/browser/codex-iab/bootstrap.js +173 -9
  27. package/dist/src/browser/codex-iab/bootstrap.js.map +1 -1
  28. package/dist/src/browser/codex-iab/chatgpt-client.d.ts +3 -0
  29. package/dist/src/browser/codex-iab/chatgpt-client.js +115 -57
  30. package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
  31. package/dist/src/browser/codex-iab/probe.d.ts +36 -0
  32. package/dist/src/browser/codex-iab/probe.js +217 -0
  33. package/dist/src/browser/codex-iab/probe.js.map +1 -0
  34. package/dist/src/browser/codex-iab/recovery-evidence.d.ts +1 -1
  35. package/dist/src/browser/codex-iab/recovery-evidence.js +7 -10
  36. package/dist/src/browser/codex-iab/recovery-evidence.js.map +1 -1
  37. package/dist/src/browser/codex-iab/selectors.d.ts +1 -0
  38. package/dist/src/browser/codex-iab/selectors.js +1 -0
  39. package/dist/src/browser/codex-iab/selectors.js.map +1 -1
  40. package/dist/src/browser/codex-iab/send-button.d.ts +5 -0
  41. package/dist/src/browser/codex-iab/send-button.js +62 -0
  42. package/dist/src/browser/codex-iab/send-button.js.map +1 -0
  43. package/dist/src/browser/codex-iab/submission-url.js +6 -15
  44. package/dist/src/browser/codex-iab/submission-url.js.map +1 -1
  45. package/dist/src/browser/codex-iab/tab-discovery.js +45 -12
  46. package/dist/src/browser/codex-iab/tab-discovery.js.map +1 -1
  47. package/dist/src/browser/codex-iab/timing-options.d.ts +1 -0
  48. package/dist/src/browser/codex-iab/timing-options.js +5 -0
  49. package/dist/src/browser/codex-iab/timing-options.js.map +1 -0
  50. package/dist/src/cli/health-commands.d.ts +2 -0
  51. package/dist/src/cli/health-commands.js +191 -0
  52. package/dist/src/cli/health-commands.js.map +1 -0
  53. package/dist/src/cli/io.d.ts +4 -0
  54. package/dist/src/cli/io.js +2 -0
  55. package/dist/src/cli/io.js.map +1 -0
  56. package/dist/src/cli/main.d.ts +1 -5
  57. package/dist/src/cli/main.js +159 -77
  58. package/dist/src/cli/main.js.map +1 -1
  59. package/dist/src/cli/observation-commands.d.ts +2 -0
  60. package/dist/src/cli/observation-commands.js +239 -0
  61. package/dist/src/cli/observation-commands.js.map +1 -0
  62. package/dist/src/cli/run-status-view.d.ts +79 -0
  63. package/dist/src/cli/run-status-view.js +112 -0
  64. package/dist/src/cli/run-status-view.js.map +1 -0
  65. package/dist/src/core/controller-command-execution.d.ts +2 -2
  66. package/dist/src/core/controller-command-execution.js +82 -16
  67. package/dist/src/core/controller-command-execution.js.map +1 -1
  68. package/dist/src/core/controller-conversation-archive.d.ts +11 -0
  69. package/dist/src/core/controller-conversation-archive.js +109 -0
  70. package/dist/src/core/controller-conversation-archive.js.map +1 -0
  71. package/dist/src/core/controller-loop.d.ts +7 -1
  72. package/dist/src/core/controller-loop.js +114 -23
  73. package/dist/src/core/controller-loop.js.map +1 -1
  74. package/dist/src/core/controller-turn.d.ts +14 -2
  75. package/dist/src/core/controller-turn.js +109 -40
  76. package/dist/src/core/controller-turn.js.map +1 -1
  77. package/dist/src/core/controller-types.d.ts +2 -0
  78. package/dist/src/core/conversation-url.d.ts +3 -0
  79. package/dist/src/core/conversation-url.js +34 -0
  80. package/dist/src/core/conversation-url.js.map +1 -0
  81. package/dist/src/core/run-status.d.ts +9 -2
  82. package/dist/src/core/run-status.js +38 -25
  83. package/dist/src/core/run-status.js.map +1 -1
  84. package/dist/src/core/state-machine.d.ts +21 -1
  85. package/dist/src/core/state-machine.js +138 -13
  86. package/dist/src/core/state-machine.js.map +1 -1
  87. package/dist/src/core/timing.d.ts +9 -0
  88. package/dist/src/core/timing.js +22 -0
  89. package/dist/src/core/timing.js.map +1 -0
  90. package/dist/src/diagnostics/run-doctor.d.ts +22 -0
  91. package/dist/src/diagnostics/run-doctor.js +197 -0
  92. package/dist/src/diagnostics/run-doctor.js.map +1 -0
  93. package/dist/src/jobs/status.d.ts +5 -2
  94. package/dist/src/jobs/status.js +172 -12
  95. package/dist/src/jobs/status.js.map +1 -1
  96. package/dist/src/jobs/supervisor.js +57 -8
  97. package/dist/src/jobs/supervisor.js.map +1 -1
  98. package/dist/src/observation/run-handoff.d.ts +86 -0
  99. package/dist/src/observation/run-handoff.js +309 -0
  100. package/dist/src/observation/run-handoff.js.map +1 -0
  101. package/dist/src/observation/run-timeline.d.ts +32 -0
  102. package/dist/src/observation/run-timeline.js +278 -0
  103. package/dist/src/observation/run-timeline.js.map +1 -0
  104. package/dist/src/observation/run-watch.d.ts +15 -0
  105. package/dist/src/observation/run-watch.js +82 -0
  106. package/dist/src/observation/run-watch.js.map +1 -0
  107. package/dist/src/protocol/limits.d.ts +3 -0
  108. package/dist/src/protocol/limits.js +4 -0
  109. package/dist/src/protocol/limits.js.map +1 -0
  110. package/dist/src/protocol/lint-command.d.ts +24 -0
  111. package/dist/src/protocol/lint-command.js +210 -0
  112. package/dist/src/protocol/lint-command.js.map +1 -0
  113. package/dist/src/protocol/parse-command.js +4 -0
  114. package/dist/src/protocol/parse-command.js.map +1 -1
  115. package/dist/src/protocol/types.d.ts +12 -0
  116. package/dist/src/protocol/validate-command.js +76 -3
  117. package/dist/src/protocol/validate-command.js.map +1 -1
  118. package/dist/src/router/config-loader.js +23 -2
  119. package/dist/src/router/config-loader.js.map +1 -1
  120. package/dist/src/router/resolver.js +8 -3
  121. package/dist/src/router/resolver.js.map +1 -1
  122. package/dist/src/runners/process-runner.js +55 -12
  123. package/dist/src/runners/process-runner.js.map +1 -1
  124. package/dist/src/runners/runner-adapter.d.ts +2 -0
  125. package/dist/src/runners/runner-adapter.js.map +1 -1
  126. package/dist/src/state/atomic-write.d.ts +6 -0
  127. package/dist/src/state/atomic-write.js +43 -2
  128. package/dist/src/state/atomic-write.js.map +1 -1
  129. package/dist/src/state/cancellation.js +38 -4
  130. package/dist/src/state/cancellation.js.map +1 -1
  131. package/dist/src/state/event-log.js +5 -4
  132. package/dist/src/state/event-log.js.map +1 -1
  133. package/dist/src/state/private-directory.d.ts +5 -0
  134. package/dist/src/state/private-directory.js +37 -0
  135. package/dist/src/state/private-directory.js.map +1 -0
  136. package/dist/src/state/runtime-lease.js +19 -39
  137. package/dist/src/state/runtime-lease.js.map +1 -1
  138. package/dist/src/state/runtime-record-validation.d.ts +6 -0
  139. package/dist/src/state/runtime-record-validation.js +44 -0
  140. package/dist/src/state/runtime-record-validation.js.map +1 -0
  141. package/dist/src/state/runtime-retirement.js +58 -18
  142. package/dist/src/state/runtime-retirement.js.map +1 -1
  143. package/dist/src/state/runtime-takeover-intent.js +2 -2
  144. package/dist/src/state/runtime-takeover-intent.js.map +1 -1
  145. package/dist/src/state/store.d.ts +1 -0
  146. package/dist/src/state/store.js +12 -6
  147. package/dist/src/state/store.js.map +1 -1
  148. package/dist/src/version.d.ts +1 -1
  149. package/dist/src/version.js +1 -1
  150. package/docs/architecture.md +4 -4
  151. package/docs/compatibility.md +1 -1
  152. package/docs/controller-protocol.md +38 -7
  153. package/docs/experiments/protocol-lint.md +40 -0
  154. package/docs/experiments/run-doctor.md +39 -0
  155. package/docs/experiments/run-handoff.md +39 -0
  156. package/docs/experiments/run-timeline.md +35 -0
  157. package/docs/experiments/run-watch.md +31 -0
  158. package/docs/runner-contract.md +4 -3
  159. package/docs/state-and-recovery.md +15 -5
  160. package/package.json +1 -1
  161. package/schemas/controller-command.schema.json +89 -4
  162. package/skills/cueline/SKILL.md +13 -7
package/README.zh-TW.md CHANGED
@@ -17,6 +17,15 @@
17
17
 
18
18
  CueLine 是獨立實作,**沒有任何 runtime npm 相依套件**,也不是 Omnilane 或 GPT Relay 的包裝層。
19
19
 
20
+ ## 最新版本:0.1.7
21
+
22
+ - 新增安全的 run 清單、doctor、watch、timeline、handoff、完整性驗證、協定 lint、瀏覽器診斷與 inspect 證據分頁。
23
+ - 強化分頁/按鈕證據、指令與路由上限、原子 job 狀態、私有持久資料、workdir 身分、runtime/取消紀錄,以及 CLI 去敏感資訊。
24
+ - 新增選用的 `complete` 後精確對話封存:點擊前有持久 fence,Pro 又開始回答或換頁就拒絕,進入含糊狀態後絕不重點。
25
+ - 完成 454/454 測試與一次可丟棄的真實 ChatGPT Web Pro 驗收;主控自然完成、只封存一次,原本使用者對話完全未動。
26
+
27
+ 完整內容請看 [changelog](CHANGELOG.md#017---2026-07-16) 或不可變的 [v0.1.7 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.1.7)。
28
+
20
29
  ## 一次執行實際上怎麼跑
21
30
 
22
31
  <img alt="Caller-first CueLine 執行:ChatGPT 下文字命令,目前的 Codex 做本機唯讀查驗,CueLine 回送有界證據直到 complete。" src="docs/assets/cueline-loop-zh-TW.svg" width="100%">
@@ -25,7 +34,7 @@ CueLine 是獨立實作,**沒有任何 runtime npm 相依套件**,也不是
25
34
 
26
35
  非預設的 `maxRounds` 會在建立 run 時固定,並跨所有無 owner 的暫停累計主控總輪數。之後續跑通常省略它、沿用持久值;若傳入不同數字,CueLine 會拒絕,不會偷偷重設或放寬預算。
27
36
 
28
- `startCueLineRun` 與 `runCueLine` 都預設使用 `caller` executor。使用內建瀏覽器時,CueLine 只送一次、保存精確對話 URL,然後回傳 `awaiting_controller` 並釋放 runtime lease,不會讓單一工具呼叫卡著等 Pro 思考。之後的 `continueCueLineRun` 只做一次唯讀觀測;若仍未完成,就再次回傳 `awaiting_controller`,絕不重送。`advise` 派工回傳 `awaiting_caller`,沒有副作用 claim,需協調單一 session。`work` 派工回傳 `awaiting_caller_work`,在目前 Codex 呼叫 `claimCueLineCallerJob` 與 `startCueLineCallerJob` 前,絕對尚未開始本機修改。claim 綁定 run、job、task hash、絕對 workdir、caller identity 與 fencing token;已開始的工作不會自動重試,claim 逾期則成為 `ambiguous`。Pro 只提出與審查文字指令,沒有親自使用本機工具。
37
+ `startCueLineRun` 與 `runCueLine` 都預設使用 `caller` executor。使用內建瀏覽器時,CueLine 只送一次、保存精確對話 URL,然後回傳 `awaiting_controller` 並釋放 runtime lease,不會讓單一工具呼叫卡著等 Pro 思考。之後的 `continueCueLineRun` 只做一次唯讀觀測;若仍未完成,就再次回傳 `awaiting_controller`,絕不重送。`advise` 派工回傳 `awaiting_caller`,沒有副作用 claim,需協調單一 session。`work` 派工回傳 `awaiting_caller_work`,在目前 Codex 呼叫 `claimCueLineCallerJob` 與 `startCueLineCallerJob` 前,絕對尚未開始本機修改。claim 綁定 run、job、task hash、絕對 workdir、canonical 目錄身分、caller identity 與 fencing token;本機工作只能使用它回傳的 `resolvedWorkdir`。已開始的工作不會自動重試,claim 逾期則成為 `ambiguous`。Pro 只提出與審查文字指令,沒有親自使用本機工具。
29
38
 
30
39
  Process 模式必須同時指定 `executor: "process"` 與 `allowProcessExecution: true`,非終態續跑也要再次傳入第二道授權。內建 route 另加 `--ignore-user-config`,不讓隱藏 worker 載入使用者設定的 MCP server 或其命令參數。通道(lane)必須啟用、候選項必須在任何程序啟動**之前**就確認可用、`argv[0]` 必須早已由路由設定註冊。沒有任何東西會經過 shell。唯讀工作預設全域與每 lane 最多同時 2 個;只要批次包含 `work` 就維持串行。狀態會顯示解析後 runner、PID、phase、最後進度時間,以及安全辨識到的 model/provider。
31
40
 
@@ -48,15 +57,15 @@ ChatGPT Pro 訂閱方案與「選定的 Pro 模型」是兩回事。帳號或個
48
57
  從 npm registry 安裝:
49
58
 
50
59
  ```bash
51
- npm install -g cueline@0.1.6
60
+ npm install -g cueline@0.1.7
52
61
  cueline install
53
62
  cueline doctor
54
63
  ```
55
64
 
56
- 作為備援,也可以安裝 [v0.1.6 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.1.6) 上的打包 tarball,該 release 同時附上它的 `.sha256` 校驗碼:
65
+ 作為備援,也可以安裝 [v0.1.7 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.1.7) 上的打包 tarball,該 release 同時附上它的 `.sha256` 校驗碼:
57
66
 
58
67
  ```bash
59
- npm install -g https://github.com/Seraphim0916/cueline/releases/download/v0.1.6/cueline-0.1.6.tgz
68
+ npm install -g https://github.com/Seraphim0916/cueline/releases/download/v0.1.7/cueline-0.1.7.tgz
60
69
  cueline install
61
70
  cueline doctor
62
71
  ```
@@ -101,6 +110,7 @@ import {
101
110
  let result = await runCueLine({
102
111
  request: "Inspect the repository, delegate an implementation plan, and report the evidence.",
103
112
  browser: createCodexIabAdapter({ browser: globalThis.browser }),
113
+ // 選填並明確啟用:archiveControllerConversationOnComplete: true,
104
114
  // 選填:conversationUrl、routingConfig / routingConfigPath、home、cwd、
105
115
  // runTimeoutMs、signal,以及各工作/預設期限。
106
116
  }); // 預設 executor: "caller"
@@ -128,7 +138,7 @@ while (["awaiting_controller", "awaiting_caller", "awaiting_caller_work"].includ
128
138
  fencingToken: claim.fencingToken,
129
139
  };
130
140
  await startCueLineCallerJob(result.runId, job.jobId, proof);
131
- const stdout = await executeExactLocalWork(job.spec.task, claim.workdir, {
141
+ const stdout = await executeExactLocalWork(job.spec.task, claim.resolvedWorkdir, {
132
142
  heartbeat: () => heartbeatCueLineCallerJob(result.runId, job.jobId, proof),
133
143
  });
134
144
  await submitCueLineCallerJobResult(
@@ -147,22 +157,28 @@ if (result.status === "complete") {
147
157
  }
148
158
  ```
149
159
 
160
+ `archiveControllerConversationOnComplete` 預設為 `false`,並在建立 run 時固定。啟用後,CueLine 會先把 `complete` 寫進持久紀錄,再於 Pro 未回答時封存那一個精確對話。點擊 fence 前能證明尚未點擊的失敗可以重試;fence 後只要逾時、重開、換頁或缺少完成證據,就標成 `ambiguous` 且永不再點。`blocked` 與 `cancelled` 一律保留原對話。
161
+
150
162
  若回傳 `awaiting_controller`,代表同一個精確 request 已送出、但 Pro 回覆尚未被觀測;稍後續跑只會唯讀觀測,不會重送。`awaiting_caller` 交接 `advise`;`awaiting_caller_work` 則必須依序 claim、start、執行、heartbeat 與帶 claim proof 提交結果。Pro 網頁從未直接使用本機工具。
151
163
 
164
+ `listCueLineRuns()` 是唯讀且已去敏感資訊的 run 清單,可用來找回持久化的 run ID;它不包含主控文字、對話網址、工作內容或 worker 輸出。
165
+
166
+ `verifyCueLineRun(runId)` 是唯讀完整性檢查,會核對建立 marker、event replay 與 authority fence、選用 snapshot、runtime lease 和 job status 證據;只回傳穩定 finding,不回傳持久 run 內容。
167
+
152
168
  在 Codex 的 runtime 裡,import `cueline api path` 印出的那個絕對路徑模組——那就是你安裝的那份套件建置出來的 API。
153
169
 
154
- `startCueLineRun` 只建立持久 run 並回傳 `ready`;`runCueLine` 會建立並推進到持久 controller 觀測暫停、caller 交接或終態。續跑前先執行 `cueline run status <run-id> --json`。單一正常送出、非人工、具精確 URL、無 job/pending command/取消的 stale caller observer 可被 fencing 後唯讀恢復;其他 stale 狀態仍須正式接管。`caller_work_pending`、`caller_work_claimed`、`caller_work_running` 分別只允許 `claim_caller_work`、`start_caller_work`、`continue_caller_work`,主控的 `dispatch` 本身不代表本機工作已開始。
170
+ `startCueLineRun` 只建立持久 run 並回傳 `ready`;`runCueLine` 會建立並推進到持久 controller 觀測暫停、caller 交接或終態。續跑前先執行 `cueline run status <run-id> --json`。單一正常送出、非人工、具精確 URL、無 job/pending command/取消的 stale caller observer 可被 fencing 後唯讀恢復;其他 stale 狀態仍須正式接管。`caller_work_pending`、`caller_work_claimed`、`caller_work_running` 分別只允許 `claim_caller_work`、`start_caller_work`、`continue_caller_work`,主控的 `dispatch` 本身不代表本機工作已開始。CLI 的 `run status` 只輸出交接所需 metadata,不包含 task 內文、caller 身分、task hash、workdir 或 runtime owner ID;完成正式 claim 後,API 才會把精確 task 與 workdir 交給獲授權的 caller。
155
171
 
156
172
  ## CLI
157
173
 
158
- CLI 不驅動瀏覽器。`doctor`、`routing`、`jobs`、`run status`、`api path`、`config path` 都是唯讀;`install`/`uninstall` 只改套件擁有的 skill 連結;`run reconcile`、`run takeover`、`run reconcile-runtime`、`run cancel`/`run stop`、`job cancel` 會追加稽核證據或修改持久 run/job 狀態。執行寫入狀態的命令前,先用 `cueline help` 核對完整參數。
174
+ CLI 不驅動瀏覽器。`doctor`、`routing`、`jobs`、`runs`、`run status`、`run verify`、`api path`、`config path` 都是唯讀;`install`/`uninstall` 只改套件擁有的 skill 連結;`run reconcile`、`run takeover`、`run reconcile-runtime`、`run cancel`/`run stop`、`job cancel` 會追加稽核證據或修改持久 run/job 狀態。執行寫入狀態的命令前,先用 `cueline help` 核對完整參數。
159
175
 
160
176
  ```console
161
177
  $ cueline install
162
178
  CueLine skill installed: /Users/you/.codex/skills/cueline
163
179
 
164
180
  $ cueline doctor
165
- CueLine 0.1.6
181
+ CueLine 0.1.7
166
182
  status ok
167
183
  node 22.14.0 ok
168
184
  config /usr/local/lib/node_modules/cueline/config/routing.default.json valid
@@ -171,18 +187,30 @@ caller_ready yes
171
187
  caller_lanes 1
172
188
  process_available_lanes 1
173
189
 
190
+ $ cueline doctor --json
191
+ {"version":"0.1.7","status":"ok","node":{"version":"22.14.0","ok":true,"requirement":">=22"},...}
192
+
174
193
  $ cueline api path
175
194
  /usr/local/lib/node_modules/cueline/dist/src/api.js
176
195
 
177
196
  $ cueline routing
178
197
  default codex-default available
179
198
 
199
+ $ cueline routing --json
200
+ {"version":"0.1.7","availableLanes":1,"lanes":[{"name":"default","status":"available","selectedRunnerId":"codex-default"}],...}
201
+
180
202
  $ cueline jobs
181
203
  No jobs.
182
204
 
205
+ $ cueline runs
206
+ No runs.
207
+
183
208
  $ cueline run status run_... --json
184
209
  {"status":"running","executor":"caller","phase":"caller_jobs_pending","runtime":{"ownership":"missing"},...}
185
210
 
211
+ $ cueline run verify run_... --json
212
+ {"runId":"run_...","outcome":"verified","marker":"valid",...}
213
+
186
214
  $ cueline run takeover stale_run_... --json
187
215
  {"runId":"stale_run_...","outcome":"taken_over","next":"continue",...}
188
216
 
@@ -13,6 +13,9 @@
13
13
  "lanes": {
14
14
  "type": "object",
15
15
  "minProperties": 1,
16
+ "propertyNames": {
17
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
18
+ },
16
19
  "additionalProperties": {
17
20
  "type": "object",
18
21
  "required": ["enabled", "candidates"],
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { stat } from "node:fs/promises";
2
+ import { realpath, stat } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { CueLineError } from "./core/errors.js";
5
5
  import { jobSpecHash } from "./core/ids.js";
@@ -47,13 +47,41 @@ function callerWorkJob(store, jobId) {
47
47
  }
48
48
  return job;
49
49
  }
50
- async function assertWorkdirAvailable(workdir) {
51
- const metadata = await stat(workdir).catch((error) => {
50
+ async function inspectWorkdir(workdir) {
51
+ const resolvedPath = await realpath(workdir).catch((error) => {
52
+ throw new CueLineError("CALLER_WORKDIR_UNAVAILABLE", `Caller workdir '${workdir}' is unavailable.`, { cause: error });
53
+ });
54
+ const metadata = await stat(resolvedPath).catch((error) => {
52
55
  throw new CueLineError("CALLER_WORKDIR_UNAVAILABLE", `Caller workdir '${workdir}' is unavailable.`, { cause: error });
53
56
  });
54
57
  if (!metadata.isDirectory()) {
55
58
  throw new CueLineError("CALLER_WORKDIR_UNAVAILABLE", `Caller workdir '${workdir}' is not a directory.`);
56
59
  }
60
+ return {
61
+ resolvedPath,
62
+ device: String(metadata.dev),
63
+ inode: String(metadata.ino),
64
+ };
65
+ }
66
+ function sameWorkdirIdentity(left, right) {
67
+ return (left.resolvedPath === right.resolvedPath &&
68
+ left.device === right.device &&
69
+ left.inode === right.inode);
70
+ }
71
+ async function assertClaimedWorkdir(claim) {
72
+ if (claim.workdirIdentity === undefined) {
73
+ throw new CueLineError("CALLER_WORKDIR_IDENTITY_REQUIRED", `Caller work claim '${claim.claimId}' predates directory pinning; reclaim it with the same caller before starting local work.`);
74
+ }
75
+ const observed = await inspectWorkdir(claim.workdir);
76
+ if (!sameWorkdirIdentity(observed, claim.workdirIdentity)) {
77
+ throw new CueLineError("CALLER_WORKDIR_IDENTITY_MISMATCH", `Caller workdir '${claim.workdir}' no longer identifies the directory pinned by claim '${claim.claimId}'.`, {
78
+ details: {
79
+ expected_resolved_path: claim.workdirIdentity.resolvedPath,
80
+ observed_resolved_path: observed.resolvedPath,
81
+ },
82
+ });
83
+ }
84
+ return observed;
57
85
  }
58
86
  function claimExpired(claim, now) {
59
87
  const expiresAt = Date.parse(claim.expiresAt);
@@ -77,6 +105,9 @@ function expiration(now, ttlMs) {
77
105
  async function writeClaimJobStatus(home, store, job, status, timestamp, error) {
78
106
  const statusStore = new JobStatusStore(home);
79
107
  const existing = await statusStore.read(job.jobId);
108
+ const startedAt = status === "running" && existing?.status !== "running"
109
+ ? timestamp
110
+ : (existing?.startedAt ?? timestamp);
80
111
  const next = {
81
112
  jobId: job.jobId,
82
113
  runId: store.runId,
@@ -85,7 +116,7 @@ async function writeClaimJobStatus(home, store, job, status, timestamp, error) {
85
116
  mode: job.spec.mode,
86
117
  execution: "foreground",
87
118
  status,
88
- startedAt: existing?.startedAt ?? timestamp,
119
+ startedAt,
89
120
  ...(status === "ambiguous" ? { finishedAt: timestamp } : {}),
90
121
  ...(error === undefined ? {} : { error }),
91
122
  };
@@ -111,13 +142,13 @@ async function persistStartedClaimAmbiguous(store, job, claim, home, now) {
111
142
  await writeClaimJobStatus(home, store, job, "ambiguous", now.toISOString(), reason);
112
143
  return reason;
113
144
  }
114
- async function releaseExpiredUnstartedClaim(store, job, claim, home, now) {
145
+ async function releaseExpiredUnstartedClaim(store, job, claim, home, now, reason = "expired_before_start") {
115
146
  await store.append("caller_work_claim_released", {
116
147
  job_id: job.jobId,
117
148
  claim_id: claim.claimId,
118
149
  fencing_token: claim.fencingToken,
119
150
  caller_id: claim.callerId,
120
- reason: "expired_before_start",
151
+ reason,
121
152
  released_at: now.toISOString(),
122
153
  });
123
154
  await writeClaimJobStatus(home, store, job, "pending", now.toISOString());
@@ -154,6 +185,7 @@ function claimResult(runId, job, claim, outcome) {
154
185
  task: job.spec.task,
155
186
  taskHash: claim.taskHash,
156
187
  workdir: claim.workdir,
188
+ resolvedWorkdir: claim.workdirIdentity?.resolvedPath ?? claim.workdir,
157
189
  claimId: claim.claimId,
158
190
  callerId: claim.callerId,
159
191
  fencingToken: claim.fencingToken,
@@ -203,21 +235,29 @@ export async function claimCueLineCallerJob(runId, jobId, options) {
203
235
  if (existing !== null && existing !== undefined) {
204
236
  if (!claimExpired(existing, currentTime)) {
205
237
  if (existing.callerId === options.callerId) {
206
- return claimResult(runId, job, existing, "already_claimed");
238
+ if (existing.workdirIdentity !== undefined || existing.startedAt !== null) {
239
+ return claimResult(runId, job, existing, "already_claimed");
240
+ }
241
+ await releaseExpiredUnstartedClaim(store, job, existing, home, currentTime, "identity_upgrade_before_start");
242
+ job = callerWorkJob(store, jobId);
243
+ }
244
+ else {
245
+ throw new CueLineError("CALLER_WORK_ALREADY_CLAIMED", `Caller work job '${jobId}' already has an active claim.`, { details: { job_id: jobId, expires_at: existing.expiresAt } });
207
246
  }
208
- throw new CueLineError("CALLER_WORK_ALREADY_CLAIMED", `Caller work job '${jobId}' already has an active claim.`, { details: { job_id: jobId, expires_at: existing.expiresAt } });
209
247
  }
210
- if (existing.startedAt !== null) {
211
- await markStartedClaimAmbiguous(store, job, existing, home, currentTime);
248
+ else {
249
+ if (existing.startedAt !== null) {
250
+ await markStartedClaimAmbiguous(store, job, existing, home, currentTime);
251
+ }
252
+ await releaseExpiredUnstartedClaim(store, job, existing, home, currentTime);
253
+ job = callerWorkJob(store, jobId);
212
254
  }
213
- await releaseExpiredUnstartedClaim(store, job, existing, home, currentTime);
214
- job = callerWorkJob(store, jobId);
215
255
  }
216
256
  if (job.status !== "pending") {
217
257
  throw new CueLineError("CALLER_WORK_CLAIM_STATE_INVALID", `Caller work job '${jobId}' is running without an active claim and cannot be reclaimed safely.`);
218
258
  }
219
259
  const workdir = job.spec.workdir;
220
- await assertWorkdirAvailable(workdir);
260
+ const workdirIdentity = await inspectWorkdir(workdir);
221
261
  const timestamp = currentTime.toISOString();
222
262
  const fencingToken = (job.callerWork?.nextFencingToken ?? 0) + 1;
223
263
  const claim = {
@@ -225,6 +265,7 @@ export async function claimCueLineCallerJob(runId, jobId, options) {
225
265
  callerId: options.callerId,
226
266
  taskHash: jobSpecHash(job.spec),
227
267
  workdir,
268
+ workdirIdentity,
228
269
  fencingToken,
229
270
  claimedAt: timestamp,
230
271
  heartbeatAt: timestamp,
@@ -261,7 +302,7 @@ export async function startCueLineCallerJob(runId, jobId, proof, options = {}) {
261
302
  expiresAt: claim.expiresAt,
262
303
  };
263
304
  }
264
- await assertWorkdirAvailable(claim.workdir);
305
+ await assertClaimedWorkdir(claim);
265
306
  const timestamp = currentTime.toISOString();
266
307
  const expiresAt = expiration(currentTime, claim.ttlMs);
267
308
  await store.append("caller_work_started", {
@@ -271,6 +312,9 @@ export async function startCueLineCallerJob(runId, jobId, proof, options = {}) {
271
312
  fencing_token: claim.fencingToken,
272
313
  task_hash: claim.taskHash,
273
314
  workdir: claim.workdir,
315
+ ...(claim.workdirIdentity === undefined
316
+ ? {}
317
+ : { workdir_identity: claim.workdirIdentity }),
274
318
  started_at: timestamp,
275
319
  expires_at: expiresAt,
276
320
  });
@@ -1 +1 @@
1
- {"version":3,"file":"api-caller-work.js","sourceRoot":"","sources":["../../src/api-caller-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMvD,OAAO,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAGlC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AACjD,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAC3C,MAAM,4BAA4B,GAAG,UAAU,CAAC;AAIhD,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,8EAA8E,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,KAAK,GAAG,KAAK,IAAI,gCAAgC,CAAC;IACxD,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAC5B,KAAK,GAAG,4BAA4B;QACpC,KAAK,GAAG,4BAA4B,EACpC,CAAC;QACD,MAAM,IAAI,YAAY,CACpB,+BAA+B,EAC/B,mDAAmD,4BAA4B,OAAO,4BAA4B,GAAG,CACtH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkC;IAC1D,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,YAAY,CACpB,iCAAiC,EACjC,iFAAiF,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAgC,EAAE,KAAa;IACpE,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,YAAY,CACpB,0BAA0B,EAC1B,QAAQ,KAAK,CAAC,KAAK,6DAA6D,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,WAAW,KAAK,oBAAoB,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,YAAY,CACpB,0BAA0B,EAC1B,QAAQ,KAAK,wDAAwD,CACtE,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,YAAY,CACpB,yBAAyB,EACzB,oBAAoB,KAAK,wCAAwC,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,OAAe;IACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC5D,MAAM,IAAI,YAAY,CACpB,4BAA4B,EAC5B,mBAAmB,OAAO,mBAAmB,EAC7C,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,YAAY,CACpB,4BAA4B,EAC5B,mBAAmB,OAAO,uBAAuB,CAClD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB,EAAE,GAAS;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAsB,EAAE,GAAS;IAClE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;QACjE,MAAM,IAAI,YAAY,CACpB,8BAA8B,EAC9B,mEAAmE,KAAK,CAAC,OAAO,+DAA+D,EAC/I;YACE,OAAO,EAAE;gBACP,QAAQ,EAAE,KAAK,CAAC,OAAO;gBACvB,YAAY,EAAE,KAAK,CAAC,WAAW;gBAC/B,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;aAC/B;SACF,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAS,EAAE,KAAa;IAC1C,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,IAAY,EACZ,KAAgC,EAChC,GAAc,EACd,MAA2C,EAC3C,SAAiB,EACjB,KAAc;IAEd,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,IAAI,GAAc;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;QACnB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;QACnB,SAAS,EAAE,YAAY;QACvB,MAAM;QACN,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,SAAS;QAC3C,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KAC1C,CAAC;IACF,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,KAAgC,EAChC,GAAc,EACd,KAAsB,EACtB,IAAY,EACZ,GAAS;IAET,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAChF,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvB,MAAM,IAAI,YAAY,CAAC,8BAA8B,EAAE,MAAM,EAAE;QAC7D,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE;KAC7E,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,KAAgC,EAChC,GAAc,EACd,KAAsB,EACtB,IAAY,EACZ,GAAS;IAET,MAAM,MAAM,GACV,iGAAiG,CAAC;IACpG,MAAM,KAAK,CAAC,MAAM,CAAC,8BAA8B,EAAE;QACjD,MAAM,EAAE,GAAG,CAAC,KAAK;QACjB,QAAQ,EAAE,KAAK,CAAC,OAAO;QACvB,aAAa,EAAE,KAAK,CAAC,YAAY;QACjC,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,MAAM;QACN,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;KAC/B,CAAC,CAAC;IACH,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,KAAgC,EAChC,GAAc,EACd,KAAsB,EACtB,IAAY,EACZ,GAAS;IAET,MAAM,KAAK,CAAC,MAAM,CAAC,4BAA4B,EAAE;QAC/C,MAAM,EAAE,GAAG,CAAC,KAAK;QACjB,QAAQ,EAAE,KAAK,CAAC,OAAO;QACvB,aAAa,EAAE,KAAK,CAAC,YAAY;QACjC,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,MAAM,EAAE,sBAAsB;QAC9B,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;KAC/B,CAAC,CAAC;IACH,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAAgC,EAChC,GAAc,EACd,KAAsB,EACtB,IAAY,EACZ,GAAS;IAET,yBAAyB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC;QAAE,OAAO;IACtC,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,yBAAyB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,4BAA4B,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvB,MAAM,IAAI,YAAY,CACpB,2BAA2B,EAC3B,sBAAsB,KAAK,CAAC,OAAO,sCAAsC,EACzE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CACjF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAc,EAAE,KAAkC;IACpE,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;IACpC,IACE,CAAC,KAAK;QACN,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC/B,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QACjC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY;QACzC,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QACxC,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,EAClC,CAAC;QACD,MAAM,IAAI,YAAY,CACpB,4BAA4B,EAC5B,wEAAwE,GAAG,CAAC,KAAK,IAAI,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,GAAc,EACd,KAAsB,EACtB,OAAgD;IAEhD,OAAO;QACL,KAAK;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO;QACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;QACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI;KAClC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAa,EACb,OAAwE,EACxE,SAIoB;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAChB,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;QACjE,OAAO,CAAC,OAAO,KAAK,SAAS;QAC7B,CAAC,MAAM,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;QAC5D,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,MAAM,CAAC,4BAA4B,EAAE;gBAC/C,QAAQ,EAAE,YAAY,CAAC,OAAO;gBAC9B,kBAAkB,EAAE,YAAY,CAAC,SAAS;aAC3C,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,KAAa,EACb,OAAsC;IAEtC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACpE,IAAI,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CACpB,2BAA2B,EAC3B,oBAAoB,KAAK,iBAAiB,GAAG,CAAC,MAAM,0BAA0B,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;QACvC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;gBACzC,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC3C,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;gBAC9D,CAAC;gBACD,MAAM,IAAI,YAAY,CACpB,6BAA6B,EAC7B,oBAAoB,KAAK,gCAAgC,EACzD,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAC/D,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAChC,MAAM,yBAAyB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,4BAA4B,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5E,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,YAAY,CACpB,iCAAiC,EACjC,oBAAoB,KAAK,sEAAsE,CAChG,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAQ,CAAC;QAClC,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,KAAK,GAAoB;YAC7B,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAC/B,OAAO;YACP,YAAY;YACZ,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,SAAS;YACtB,SAAS,EAAE,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC;YACzC,KAAK;YACL,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE;YACxC,MAAM,EAAE,GAAG,CAAC,KAAK;YACjB,KAAK;SACN,CAAC,CAAC;QACH,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,KAAa,EACb,KAAkC,EAClC,OAAO,GAA8B,EAAE;IAEvC,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CACpB,2BAA2B,EAC3B,oBAAoB,KAAK,0BAA0B,GAAG,CAAC,MAAM,IAAI,CAClE,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;QAC1B,MAAM,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO;gBACL,KAAK;gBACL,KAAK;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,iBAAiB;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC;QACJ,CAAC;QACD,MAAM,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE;YACxC,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO;YACL,KAAK;YACL,KAAK;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,SAAS;YACtB,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAa,EACb,KAAa,EACb,KAAkC,EAClC,OAAO,GAA8B,EAAE;IAEvC,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CACpB,wBAAwB,EACxB,oBAAoB,KAAK,0BAA0B,GAAG,CAAC,MAAM,IAAI,CAClE,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;QAC1B,MAAM,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC,MAAM,CAAC,uBAAuB,EAAE;YAC1C,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,YAAY,EAAE,SAAS;YACvB,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,MAAM,mBAAmB,CACvB,IAAI,EACJ,KAAK,EACL,GAAG,EACH,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAChD,SAAS,CACV,CAAC;QACF,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO;YACL,KAAK;YACL,KAAK;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,oBAAoB;YAC7B,WAAW,EAAE,SAAS;YACtB,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAa,EACb,KAAa,EACb,KAAkC,EAClC,OAAO,GAA8B,EAAE;IAEvC,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;QAC1B,MAAM,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,YAAY,CACpB,2CAA2C,EAC3C,uHAAuH,CACxH,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC,MAAM,CAAC,4BAA4B,EAAE;YAC/C,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,MAAM,EAAE,8BAA8B;YACtC,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QACH,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO;YACL,KAAK;YACL,KAAK;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,KAAa,EACb,OAAO,GAA8B,EAAE;IAEvC,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACpE,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;YACpC,IACE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;gBACxB,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;gBACtD,KAAK,KAAK,IAAI;gBACd,KAAK,KAAK,SAAS;gBACnB,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,EACjC,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,4BAA4B,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,4BAA4B,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3E,CAAC;YACD,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,KAAgC,EAChC,GAAc,EACd,KAAkC,EAClC,IAAY,EACZ,GAAS,EACT,OAAO,GAAwC,EAAE;IAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IAC7E,IAAI,eAAe;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IACvD,IAAI,OAAO,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CACpB,yBAAyB,EACzB,oBAAoB,GAAG,CAAC,KAAK,gEAAgE,CAC9F,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,YAAY,CACpB,yBAAyB,EACzB,oBAAoB,GAAG,CAAC,KAAK,uDAAuD,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"api-caller-work.js","sourceRoot":"","sources":["../../src/api-caller-work.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { BrowserAdapter } from "./browser/browser-adapter.js";
2
2
  import type { CodexIabAdapterOptions } from "./browser/codex-iab/chatgpt-client.js";
3
+ import type { CueLineRunStatusSummary } from "./core/run-status.js";
3
4
  import type { RoutingConfig } from "./router/types.js";
4
5
  import type { JobResultStatus } from "./runners/runner-adapter.js";
5
6
  export interface CueLineRuntimeOptions {
@@ -23,11 +24,57 @@ export interface CueLineRuntimeOptions {
23
24
  allowProcessExecution?: boolean;
24
25
  maxConcurrency?: number;
25
26
  laneConcurrency?: Readonly<Record<string, number>>;
27
+ /** Opt in to archiving the exact ChatGPT controller conversation after a durable complete. */
28
+ archiveControllerConversationOnComplete?: boolean;
26
29
  }
27
30
  export interface StartCueLineRunOptions extends CueLineRuntimeOptions {
28
31
  request: string;
29
32
  runId?: string;
30
33
  }
34
+ export type CueLineRunListEntry = {
35
+ runId: string;
36
+ readable: true;
37
+ status: CueLineRunStatusSummary["status"];
38
+ executor: CueLineRunStatusSummary["executor"];
39
+ phase: CueLineRunStatusSummary["phase"];
40
+ round: number;
41
+ pendingTurns: number;
42
+ activeJobs: number;
43
+ runtimeOwnership: CueLineRunStatusSummary["runtime"]["ownership"];
44
+ safeNextAction: CueLineRunStatusSummary["safeNextAction"];
45
+ lastEventSequence: number;
46
+ lastEventAt: string;
47
+ } | {
48
+ runId: string;
49
+ readable: false;
50
+ errorCode: string;
51
+ };
52
+ export type CueLineRunVerificationOutcome = "verified" | "degraded" | "unreadable";
53
+ export interface CueLineRunVerificationFinding {
54
+ code: string;
55
+ severity: "warning" | "error";
56
+ surface: "marker" | "events" | "snapshot" | "runtime" | "jobs";
57
+ message: string;
58
+ }
59
+ export interface CueLineRunVerificationReport {
60
+ runId: string;
61
+ outcome: CueLineRunVerificationOutcome;
62
+ marker: "valid" | "missing" | "invalid";
63
+ eventLog: {
64
+ readable: true;
65
+ totalEvents: number;
66
+ authoritativeEvents: number;
67
+ lastSequence: number;
68
+ } | {
69
+ readable: false;
70
+ totalEvents: 0;
71
+ authoritativeEvents: 0;
72
+ lastSequence: null;
73
+ };
74
+ snapshot: "missing" | "valid" | "stale" | "invalid";
75
+ runtimeOwnership: "missing" | "active" | "stale" | "released" | "invalid";
76
+ findings: CueLineRunVerificationFinding[];
77
+ }
31
78
  export interface ContinueCueLineRunOptions extends CueLineRuntimeOptions {
32
79
  runId: string;
33
80
  reconcileRequestId?: string;
@@ -71,6 +118,8 @@ export interface CueLineCallerWorkClaimResult extends CueLineCallerWorkClaimProo
71
118
  task: string;
72
119
  taskHash: string;
73
120
  workdir: string;
121
+ /** Canonical directory pinned by the durable claim; execute work only here. */
122
+ resolvedWorkdir: string;
74
123
  claimedAt: string;
75
124
  heartbeatAt: string;
76
125
  expiresAt: string;
@@ -1,4 +1,6 @@
1
1
  import { validateCallerWorkResultClaim } from "./api-caller-work.js";
2
+ import { boundedControllerEventEvidence } from "./core/controller-turn.js";
3
+ import { isExactChatGptConversationUrl, sameChatGptConversationUrl, } from "./core/conversation-url.js";
2
4
  import { CueLineError } from "./core/errors.js";
3
5
  import { loadPersistedRunStore } from "./core/persisted-run.js";
4
6
  import { runtimeEnvironment } from "./core/runtime.js";
@@ -6,26 +8,6 @@ import { JobStatusStore } from "./jobs/status.js";
6
8
  import { defaultCueLineHome } from "./state/paths.js";
7
9
  import { readRuntimeLease, retireDeadRuntimeLease, RuntimeLease, } from "./state/runtime-lease.js";
8
10
  import { readAuthoritativeRunEvents } from "./state/store.js";
9
- function normalizedConversationUrl(value) {
10
- try {
11
- const parsed = new URL(value);
12
- return `${parsed.origin}${parsed.pathname}`;
13
- }
14
- catch {
15
- return value;
16
- }
17
- }
18
- function isChatGptConversationUrl(value) {
19
- try {
20
- const parsed = new URL(value);
21
- return (parsed.protocol === "https:" &&
22
- parsed.hostname === "chatgpt.com" &&
23
- /^\/c\/[^/]+\/?$/.test(parsed.pathname));
24
- }
25
- catch {
26
- return false;
27
- }
28
- }
29
11
  export async function confirmManualControllerSubmission(runId, options) {
30
12
  const environment = options.environment ?? runtimeEnvironment();
31
13
  const home = options.home ?? defaultCueLineHome(environment);
@@ -58,20 +40,19 @@ export async function confirmManualControllerSubmission(runId, options) {
58
40
  if (!turn) {
59
41
  throw new CueLineError("CONTROLLER_RECONCILIATION_REQUEST_NOT_FOUND", `Controller request '${options.requestId}' is neither pending nor recoverably abandoned in run '${runId}'.`);
60
42
  }
61
- const conversationUrl = options.conversationUrl ?? turn.conversationUrl ?? state.conversationUrl;
62
- if (!conversationUrl || !isChatGptConversationUrl(conversationUrl)) {
43
+ const suppliedConversationUrl = options.conversationUrl ?? turn.conversationUrl ?? state.conversationUrl;
44
+ if (!isExactChatGptConversationUrl(suppliedConversationUrl)) {
63
45
  throw new CueLineError("CONTROLLER_RECONCILIATION_URL_REQUIRED", "Manual submission confirmation requires the exact ChatGPT conversation URL.");
64
46
  }
65
47
  if (state.conversationUrl !== null &&
66
- normalizedConversationUrl(conversationUrl) !==
67
- normalizedConversationUrl(state.conversationUrl)) {
48
+ !sameChatGptConversationUrl(suppliedConversationUrl, state.conversationUrl)) {
68
49
  throw new CueLineError("CONTROLLER_RECONCILIATION_CONVERSATION_MISMATCH", "The operator-confirmed conversation URL does not match the persisted CueLine conversation.");
69
50
  }
70
51
  if (turn.conversationUrl !== null &&
71
- normalizedConversationUrl(conversationUrl) !==
72
- normalizedConversationUrl(turn.conversationUrl)) {
52
+ !sameChatGptConversationUrl(suppliedConversationUrl, turn.conversationUrl)) {
73
53
  throw new CueLineError("CONTROLLER_RECONCILIATION_CONVERSATION_MISMATCH", "The operator-confirmed conversation URL does not match the exact conversation bound to this controller turn.");
74
54
  }
55
+ const conversationUrl = state.conversationUrl ?? turn.conversationUrl ?? suppliedConversationUrl;
75
56
  const events = await readAuthoritativeRunEvents(home, runId);
76
57
  for (const event of events) {
77
58
  if (event.type !== "controller_command_accepted")
@@ -164,6 +145,21 @@ function assertCallerJobResultInput(input) {
164
145
  throw new CueLineError("CALLER_JOB_RESULT_INVALID", "Caller job result exitCode must be a safe integer or null when provided.");
165
146
  }
166
147
  }
148
+ function resolveCallerJobResultTimestamps(input, observedAt) {
149
+ let observedTimestamp;
150
+ try {
151
+ observedTimestamp = observedAt.toISOString();
152
+ }
153
+ catch (error) {
154
+ throw new CueLineError("CALLER_JOB_RESULT_INVALID", "Caller job result observation time must be a valid timestamp.", { cause: error });
155
+ }
156
+ const startedAt = input.startedAt ?? observedTimestamp;
157
+ const finishedAt = input.finishedAt ?? observedTimestamp;
158
+ if (Date.parse(finishedAt) < Date.parse(startedAt)) {
159
+ throw new CueLineError("CALLER_JOB_RESULT_INVALID", "Caller job result finishedAt cannot precede startedAt.");
160
+ }
161
+ return { startedAt, finishedAt };
162
+ }
167
163
  function workResultIntentStatus(events, jobId, proof) {
168
164
  for (const event of events) {
169
165
  if (event.type !== "caller_work_result_submission_started")
@@ -226,6 +222,7 @@ export async function submitCueLineCallerJobResult(runId, jobId, input, options
226
222
  }
227
223
  }
228
224
  const events = await readAuthoritativeRunEvents(home, runId);
225
+ let resultObservedAt;
229
226
  if (job.spec.mode === "work") {
230
227
  if (options.claim === undefined) {
231
228
  throw new CueLineError("CALLER_WORK_CLAIM_REQUIRED", `Caller work result for '${jobId}' requires the exact active claim proof.`);
@@ -236,7 +233,8 @@ export async function submitCueLineCallerJobResult(runId, jobId, input, options
236
233
  intentStatus !== (terminal?.status ?? effectiveStatus)) {
237
234
  throw new CueLineError("CALLER_JOB_RESULT_CONFLICT", `Caller work result intent for '${jobId}' is already bound to status '${intentStatus}'.`);
238
235
  }
239
- const validation = await validateCallerWorkResultClaim(store, job, options.claim, home, now(), { durableTerminalIntent });
236
+ resultObservedAt = now();
237
+ const validation = await validateCallerWorkResultClaim(store, job, options.claim, home, resultObservedAt, { durableTerminalIntent });
240
238
  if (validation.alreadyTerminal) {
241
239
  return { runId, jobId, outcome: "already_terminal" };
242
240
  }
@@ -247,6 +245,9 @@ export async function submitCueLineCallerJobResult(runId, jobId, input, options
247
245
  else if (job.status !== "pending" && job.status !== "running") {
248
246
  return { runId, jobId, outcome: "already_terminal" };
249
247
  }
248
+ const resultTimestamps = terminal === undefined
249
+ ? resolveCallerJobResultTimestamps(input, resultObservedAt ?? now())
250
+ : undefined;
250
251
  if (job.spec.mode === "work" && options.claim !== undefined) {
251
252
  const intentStatus = workResultIntentStatus(events, jobId, options.claim);
252
253
  if (intentStatus === undefined) {
@@ -268,11 +269,7 @@ export async function submitCueLineCallerJobResult(runId, jobId, input, options
268
269
  : stderr === ""
269
270
  ? stdout
270
271
  : `${stdout}${stdout.endsWith("\n") ? "" : "\n"}${stderr}`);
271
- const startedAt = input.startedAt ?? now().toISOString();
272
- const finishedAt = input.finishedAt ?? now().toISOString();
273
- if (Date.parse(finishedAt) < Date.parse(startedAt)) {
274
- throw new CueLineError("CALLER_JOB_RESULT_INVALID", "Caller job result finishedAt cannot precede startedAt.");
275
- }
272
+ const { startedAt, finishedAt } = resultTimestamps;
276
273
  const result = {
277
274
  status: effectiveStatus,
278
275
  exitCode: input.exitCode ?? (input.status === "succeeded" ? 0 : null),
@@ -327,15 +324,10 @@ export async function submitCueLineCallerJobResult(runId, jobId, input, options
327
324
  });
328
325
  }
329
326
  }
330
- const terminalResult = terminal.result;
331
- const controllerOutput = terminal.status === "succeeded" && terminalResult?.stdout.trim() !== ""
332
- ? terminalResult?.stdout
333
- : terminalResult?.output;
334
327
  await store.append("job_status", {
335
328
  job_id: jobId,
336
329
  status: terminal.status,
337
- ...(controllerOutput === undefined ? {} : { output: controllerOutput }),
338
- ...(terminal.error === undefined ? {} : { error: terminal.error }),
330
+ ...boundedControllerEventEvidence(terminal),
339
331
  });
340
332
  await store.snapshot();
341
333
  return { runId, jobId, outcome: "submitted" };