@gajae-code/coding-agent 0.11.11 → 0.12.1

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 (344) hide show
  1. package/CHANGELOG.md +131 -4
  2. package/dist/types/async/job-manager.d.ts +17 -3
  3. package/dist/types/cli/read-cli.d.ts +1 -0
  4. package/dist/types/commands/deep-interview.d.ts +9 -0
  5. package/dist/types/commands/harness.d.ts +22 -0
  6. package/dist/types/commands/read.d.ts +6 -0
  7. package/dist/types/config/model-registry.d.ts +4 -0
  8. package/dist/types/config/provider-auth-health.d.ts +14 -0
  9. package/dist/types/config/provider-ranking.d.ts +59 -0
  10. package/dist/types/config/settings-schema.d.ts +83 -1
  11. package/dist/types/config/settings.d.ts +2 -0
  12. package/dist/types/exa/mcp-client.d.ts +10 -1
  13. package/dist/types/exec/bash-executor.d.ts +45 -12
  14. package/dist/types/extensibility/extensions/types.d.ts +38 -4
  15. package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
  16. package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
  17. package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
  18. package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
  19. package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
  20. package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
  21. package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
  22. package/dist/types/extensibility/shared-events.d.ts +6 -0
  23. package/dist/types/gjc-runtime/deep-interview-ambiguity.d.ts +5 -12
  24. package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +17 -32
  25. package/dist/types/gjc-runtime/deep-interview-stage.d.ts +37 -0
  26. package/dist/types/gjc-runtime/deep-interview-state.d.ts +4 -135
  27. package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
  28. package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
  29. package/dist/types/gjc-runtime/memory-guard-owner-claims.d.ts +47 -0
  30. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +70 -1
  31. package/dist/types/gjc-runtime/state-writer.d.ts +5 -46
  32. package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
  33. package/dist/types/gjc-runtime/team-runtime.d.ts +27 -1
  34. package/dist/types/gjc-runtime/team-store.d.ts +12 -0
  35. package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
  36. package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +92 -0
  37. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +17 -0
  38. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +8 -0
  39. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
  40. package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -5
  41. package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
  42. package/dist/types/main.d.ts +1 -1
  43. package/dist/types/memories/index.d.ts +2 -0
  44. package/dist/types/modes/acp/acp-agent.d.ts +10 -19
  45. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  46. package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
  47. package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
  48. package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
  49. package/dist/types/modes/components/read-tool-group.d.ts +4 -4
  50. package/dist/types/modes/components/session-observer-overlay.d.ts +22 -0
  51. package/dist/types/modes/components/settings-selector.d.ts +11 -0
  52. package/dist/types/modes/components/status-line/gh.d.ts +5 -0
  53. package/dist/types/modes/components/tool-execution.d.ts +8 -0
  54. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
  55. package/dist/types/modes/controllers/event-controller.d.ts +3 -0
  56. package/dist/types/modes/interactive-mode.d.ts +2 -0
  57. package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
  58. package/dist/types/modes/types.d.ts +2 -0
  59. package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
  60. package/dist/types/reminders/star-reminder.d.ts +3 -13
  61. package/dist/types/runtime-mcp/manager.d.ts +1 -0
  62. package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
  63. package/dist/types/sdk/acp/adapter.d.ts +3 -1
  64. package/dist/types/sdk/broker/lifecycle.d.ts +5 -0
  65. package/dist/types/sdk/broker/transport.d.ts +2 -0
  66. package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
  67. package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
  68. package/dist/types/sdk/bus/config.d.ts +6 -2
  69. package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
  70. package/dist/types/sdk/bus/index.d.ts +44 -1
  71. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +44 -0
  72. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  73. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +2 -1
  74. package/dist/types/sdk/bus/reconciliation-store.d.ts +69 -0
  75. package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
  76. package/dist/types/sdk/bus/rich-render.d.ts +2 -0
  77. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
  78. package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
  79. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
  80. package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
  81. package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
  82. package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
  83. package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
  84. package/dist/types/sdk/host/control/operations.d.ts +1 -1
  85. package/dist/types/sdk/host/host.d.ts +2 -0
  86. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  87. package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
  88. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  89. package/dist/types/sdk/prompt-status.d.ts +23 -3
  90. package/dist/types/sdk/session.d.ts +6 -0
  91. package/dist/types/session/agent-session.d.ts +82 -12
  92. package/dist/types/session/artifacts.d.ts +8 -0
  93. package/dist/types/session/blob-store.d.ts +57 -4
  94. package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
  95. package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
  96. package/dist/types/session/session-manager.d.ts +48 -19
  97. package/dist/types/session/session-storage.d.ts +4 -0
  98. package/dist/types/session/streaming-output.d.ts +96 -12
  99. package/dist/types/setup/credential-import.d.ts +12 -0
  100. package/dist/types/skill-state/active-state.d.ts +12 -4
  101. package/dist/types/skill-state/workflow-hud.d.ts +9 -0
  102. package/dist/types/task/executor.d.ts +3 -2
  103. package/dist/types/task/index.d.ts +3 -1
  104. package/dist/types/task/provider-retry-status.d.ts +8 -0
  105. package/dist/types/task/receipt.d.ts +7 -1
  106. package/dist/types/task/types.d.ts +23 -0
  107. package/dist/types/tools/ask-answer-registry.d.ts +2 -2
  108. package/dist/types/tools/bash-interactive.d.ts +4 -1
  109. package/dist/types/tools/bash.d.ts +3 -1
  110. package/dist/types/tools/browser/launch.d.ts +7 -0
  111. package/dist/types/tools/fetch.d.ts +17 -1
  112. package/dist/types/tools/image-gen.d.ts +4 -0
  113. package/dist/types/tools/index.d.ts +4 -0
  114. package/dist/types/tools/output-meta.d.ts +44 -3
  115. package/dist/types/tools/path-utils.d.ts +1 -0
  116. package/dist/types/tools/read-internals.d.ts +12 -0
  117. package/dist/types/tools/read.d.ts +45 -7
  118. package/dist/types/tools/resource-gc.d.ts +4 -0
  119. package/dist/types/tools/review.d.ts +5 -7
  120. package/dist/types/tools/subagent.d.ts +2 -0
  121. package/dist/types/tools/tool-result.d.ts +7 -1
  122. package/dist/types/utils/gh.d.ts +13 -0
  123. package/dist/types/utils/image-resize.d.ts +1 -0
  124. package/dist/types/web/search/providers/kimi.d.ts +2 -0
  125. package/dist/types/web/search/providers/searxng.d.ts +7 -0
  126. package/dist/types/web/search/providers/xai.d.ts +2 -0
  127. package/package.json +11 -13
  128. package/scripts/acp-conformance-agent.ts +218 -0
  129. package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
  130. package/scripts/capture-gjc-bundle-settings.ts +306 -0
  131. package/scripts/capture-sticky-viewport-showcase.ts +292 -0
  132. package/scripts/generate-sdk-operation-inventory.ts +5 -0
  133. package/scripts/resident-memory-bench.ts +1341 -0
  134. package/scripts/run-acp-conformance.ts +285 -0
  135. package/scripts/verify-gjc-sdk-canonicalization.ts +122 -18
  136. package/scripts/verify-sticky-viewport-showcase.ts +611 -0
  137. package/src/async/job-manager.ts +78 -20
  138. package/src/capability/index.ts +8 -0
  139. package/src/cli/fast-help.ts +1 -1
  140. package/src/cli/plugin-cli.ts +176 -18
  141. package/src/cli/read-cli.ts +2 -1
  142. package/src/cli.ts +1 -0
  143. package/src/commands/deep-interview.ts +29 -9
  144. package/src/commands/harness.ts +35 -12
  145. package/src/commands/read.ts +11 -2
  146. package/src/commands/team.ts +20 -2
  147. package/src/config/file-lock.ts +11 -2
  148. package/src/config/model-registry.ts +21 -2
  149. package/src/config/provider-auth-health.ts +42 -0
  150. package/src/config/provider-ranking.ts +119 -0
  151. package/src/config/settings-schema.ts +74 -1
  152. package/src/config/settings.ts +246 -108
  153. package/src/coordinator-mcp/question-gate-codec.ts +1 -1
  154. package/src/coordinator-mcp/server.ts +5 -12
  155. package/src/defaults/gjc/skills/deep-interview/SKILL.md +230 -82
  156. package/src/defaults/gjc/skills/ralplan/SKILL.md +77 -41
  157. package/src/defaults/gjc/skills/team/SKILL.md +3 -1
  158. package/src/defaults/gjc/skills/ultragoal/SKILL.md +62 -39
  159. package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
  160. package/src/defaults/gjc-defaults.ts +4 -4
  161. package/src/eval/py/executor.ts +7 -2
  162. package/src/exa/mcp-client.ts +12 -3
  163. package/src/exec/bash-executor.ts +144 -27
  164. package/src/extensibility/extensions/runner.ts +15 -0
  165. package/src/extensibility/extensions/types.ts +46 -5
  166. package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
  167. package/src/extensibility/gjc-plugins/index.ts +19 -2
  168. package/src/extensibility/gjc-plugins/installer.ts +189 -50
  169. package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
  170. package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
  171. package/src/extensibility/gjc-plugins/observability.ts +3 -3
  172. package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
  173. package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
  174. package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
  175. package/src/extensibility/gjc-plugins/schema.ts +84 -12
  176. package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
  177. package/src/extensibility/gjc-plugins/types.ts +141 -0
  178. package/src/extensibility/gjc-plugins/validation.ts +9 -0
  179. package/src/extensibility/shared-events.ts +5 -0
  180. package/src/gjc-runtime/deep-interview-ambiguity.ts +47 -82
  181. package/src/gjc-runtime/deep-interview-recorder.ts +227 -310
  182. package/src/gjc-runtime/deep-interview-runtime.ts +109 -270
  183. package/src/gjc-runtime/deep-interview-stage.ts +1016 -0
  184. package/src/gjc-runtime/deep-interview-state.ts +12 -943
  185. package/src/gjc-runtime/gc-render.ts +1 -0
  186. package/src/gjc-runtime/gc-runtime.ts +11 -1
  187. package/src/gjc-runtime/launch-tmux.ts +25 -6
  188. package/src/gjc-runtime/managed-owner-admission.ts +1 -1
  189. package/src/gjc-runtime/memory-guard-owner-claims.ts +389 -0
  190. package/src/gjc-runtime/ralplan-runtime.ts +1149 -98
  191. package/src/gjc-runtime/state-runtime.ts +2 -1
  192. package/src/gjc-runtime/state-writer.ts +70 -222
  193. package/src/gjc-runtime/team-launch.ts +42 -5
  194. package/src/gjc-runtime/team-runtime.ts +1085 -40
  195. package/src/gjc-runtime/team-store.ts +32 -0
  196. package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
  197. package/src/gjc-runtime/team-worker-memory-guard.ts +363 -0
  198. package/src/gjc-runtime/team-workers.ts +1 -0
  199. package/src/gjc-runtime/tmux-owner-isolation.ts +28 -0
  200. package/src/gjc-runtime/tmux-sessions.ts +58 -13
  201. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +20 -0
  202. package/src/gjc-runtime/ultragoal-runtime.ts +414 -618
  203. package/src/gjc-runtime/workflow-manifest.generated.json +105 -449
  204. package/src/gjc-runtime/workflow-manifest.ts +38 -247
  205. package/src/hooks/native-skill-hook.ts +17 -4
  206. package/src/hooks/skill-state.ts +1 -23
  207. package/src/internal-urls/docs-index.generated.ts +21 -22
  208. package/src/internal-urls/local-root-gc.ts +127 -0
  209. package/src/main.ts +9 -5
  210. package/src/memories/index.ts +10 -0
  211. package/src/modes/DESIGN.md +98 -0
  212. package/src/modes/acp/acp-agent.ts +339 -191
  213. package/src/modes/acp/acp-event-mapper.ts +14 -7
  214. package/src/modes/acp/acp-mode.ts +39 -3
  215. package/src/modes/components/assistant-message.ts +123 -22
  216. package/src/modes/components/gjc-bundle-settings.ts +508 -0
  217. package/src/modes/components/irc-sidebar.ts +176 -62
  218. package/src/modes/components/model-selector.ts +61 -4
  219. package/src/modes/components/notifications-settings-editor.ts +12 -1
  220. package/src/modes/components/oauth-selector.ts +96 -28
  221. package/src/modes/components/read-tool-group.ts +82 -14
  222. package/src/modes/components/session-observer-overlay.ts +457 -83
  223. package/src/modes/components/settings-selector.ts +116 -23
  224. package/src/modes/components/status-line/gh.ts +16 -0
  225. package/src/modes/components/tool-execution.ts +138 -27
  226. package/src/modes/components/tool-status-header.ts +3 -14
  227. package/src/modes/components/transcript-viewer-overlay.ts +99 -24
  228. package/src/modes/controllers/command-controller.ts +4 -0
  229. package/src/modes/controllers/event-controller.ts +109 -27
  230. package/src/modes/controllers/extension-ui-controller.ts +26 -2
  231. package/src/modes/controllers/input-controller.ts +18 -3
  232. package/src/modes/controllers/selector-controller.ts +127 -36
  233. package/src/modes/interactive-mode.ts +62 -3
  234. package/src/modes/irc-observation-ledger.ts +71 -15
  235. package/src/modes/runtime-init.ts +22 -2
  236. package/src/modes/types.ts +2 -0
  237. package/src/modes/utils/ui-helpers.ts +94 -1
  238. package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
  239. package/src/prompts/agents/architect.md +9 -1
  240. package/src/prompts/agents/critic.md +9 -0
  241. package/src/prompts/system/eager-todo.md +8 -4
  242. package/src/prompts/system/system-prompt.md +11 -5
  243. package/src/prompts/tools/bash.md +5 -5
  244. package/src/prompts/tools/read.md +4 -2
  245. package/src/prompts/tools/search-tool-bm25.md +5 -0
  246. package/src/prompts/tools/task.md +1 -1
  247. package/src/reminders/star-reminder.ts +4 -42
  248. package/src/runtime-mcp/manager.ts +19 -4
  249. package/src/runtime-mcp/smithery-auth.ts +17 -2
  250. package/src/runtime-mcp/smithery-connect.ts +11 -1
  251. package/src/sdk/acp/adapter.ts +22 -6
  252. package/src/sdk/broker/lifecycle.ts +25 -6
  253. package/src/sdk/broker/transport.ts +35 -3
  254. package/src/sdk/bus/attachment-registry.ts +5 -1
  255. package/src/sdk/bus/chat-daemon-cli.ts +4 -39
  256. package/src/sdk/bus/chat-daemon-control.ts +6 -3
  257. package/src/sdk/bus/config.ts +18 -2
  258. package/src/sdk/bus/control-drain-lease.ts +104 -0
  259. package/src/sdk/bus/index.ts +984 -146
  260. package/src/sdk/bus/kind-aware-reconciliation.ts +317 -0
  261. package/src/sdk/bus/lifecycle-commands.ts +4 -1
  262. package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
  263. package/src/sdk/bus/prompt-reconciliation.ts +2 -1
  264. package/src/sdk/bus/reconciliation-store.ts +303 -0
  265. package/src/sdk/bus/rich-draft.ts +1 -1
  266. package/src/sdk/bus/rich-render.ts +2 -2
  267. package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
  268. package/src/sdk/bus/telegram-cli.ts +33 -8
  269. package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
  270. package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
  271. package/src/sdk/bus/telegram-daemon.ts +916 -23
  272. package/src/sdk/bus/telegram-reference.ts +40 -3
  273. package/src/sdk/bus/threaded-render.ts +48 -3
  274. package/src/sdk/bus/topic-registry.ts +20 -0
  275. package/src/sdk/host/control/dispatch.ts +5 -1
  276. package/src/sdk/host/control/operations.ts +1 -1
  277. package/src/sdk/host/host.ts +23 -1
  278. package/src/sdk/host/query/handlers.ts +55 -0
  279. package/src/sdk/host/query/revision-store.ts +36 -2
  280. package/src/sdk/host/reverse-leases.ts +44 -7
  281. package/src/sdk/mcp/server.ts +46 -18
  282. package/src/sdk/prompt-status.ts +16 -3
  283. package/src/sdk/protocol/operation-inventory.generated.json +51 -0
  284. package/src/sdk/protocol/operation-registry.ts +7 -2
  285. package/src/sdk/session.ts +101 -10
  286. package/src/session/agent-session.ts +1286 -220
  287. package/src/session/artifacts.ts +22 -0
  288. package/src/session/auth-broker-config.ts +10 -3
  289. package/src/session/blob-store.ts +915 -24
  290. package/src/session/internal/managed-session-scope.ts +44 -6
  291. package/src/session/internal/managed-session-storage.ts +48 -6
  292. package/src/session/memory-guard-checkpoint-participant.ts +131 -0
  293. package/src/session/session-manager.ts +2364 -438
  294. package/src/session/session-storage.ts +9 -1
  295. package/src/session/streaming-output.ts +500 -111
  296. package/src/setup/credential-import.ts +75 -13
  297. package/src/setup/provider-onboarding.ts +19 -4
  298. package/src/skill-state/active-state.ts +32 -10
  299. package/src/skill-state/workflow-hud.ts +42 -2
  300. package/src/skill-state/workflow-mutation-guard.ts +560 -8
  301. package/src/task/executor.ts +122 -39
  302. package/src/task/index.ts +23 -14
  303. package/src/task/provider-retry-status.ts +16 -0
  304. package/src/task/receipt.ts +23 -7
  305. package/src/task/render.ts +6 -2
  306. package/src/task/types.ts +108 -0
  307. package/src/tools/ask-answer-registry.ts +12 -6
  308. package/src/tools/ask.ts +169 -118
  309. package/src/tools/ast-edit.ts +1 -0
  310. package/src/tools/ast-grep.ts +1 -0
  311. package/src/tools/bash-interactive.ts +8 -3
  312. package/src/tools/bash.ts +503 -60
  313. package/src/tools/browser/launch.ts +41 -6
  314. package/src/tools/fetch.ts +114 -23
  315. package/src/tools/find.ts +1 -0
  316. package/src/tools/image-gen.ts +29 -5
  317. package/src/tools/index.ts +4 -0
  318. package/src/tools/output-meta.ts +281 -20
  319. package/src/tools/path-utils.ts +8 -3
  320. package/src/tools/read-internals.ts +44 -0
  321. package/src/tools/read.ts +1560 -310
  322. package/src/tools/resource-gc.ts +182 -18
  323. package/src/tools/review.ts +5 -7
  324. package/src/tools/search.ts +1 -0
  325. package/src/tools/subagent-render.ts +6 -2
  326. package/src/tools/subagent.ts +6 -0
  327. package/src/tools/telegram-send.ts +6 -3
  328. package/src/tools/tool-result.ts +14 -1
  329. package/src/utils/gh.ts +39 -0
  330. package/src/utils/image-resize.ts +3 -0
  331. package/src/web/search/providers/anthropic.ts +4 -4
  332. package/src/web/search/providers/codex.ts +1 -1
  333. package/src/web/search/providers/kimi.ts +15 -5
  334. package/src/web/search/providers/searxng.ts +47 -4
  335. package/src/web/search/providers/xai.ts +7 -2
  336. package/dist/types/gjc-runtime/deep-interview-draft.d.ts +0 -8
  337. package/dist/types/gjc-runtime/deep-interview-payload.d.ts +0 -41
  338. package/dist/types/gjc-runtime/deep-interview-repair.d.ts +0 -17
  339. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
  340. package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
  341. package/src/gjc-runtime/deep-interview-draft.ts +0 -843
  342. package/src/gjc-runtime/deep-interview-payload.ts +0 -262
  343. package/src/gjc-runtime/deep-interview-repair.ts +0 -1674
  344. package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
@@ -407,6 +407,7 @@ export function createGjcTmuxSession(
407
407
  pid: 1,
408
408
  startTime: "not-applicable",
409
409
  cgroup: { classification: "not_applicable" },
410
+ pidProven: false,
410
411
  };
411
412
  }
412
413
  const result = Bun.spawnSync([tmuxCommand, "display-message", "-p", "#{pid}"], {
@@ -534,6 +535,7 @@ export function createGjcTmuxSession(
534
535
  env,
535
536
  server.pid,
536
537
  server.startTime,
538
+ server.pidProven,
537
539
  );
538
540
  },
539
541
  });
@@ -551,7 +553,7 @@ export function createGjcTmuxSession(
551
553
  tagCreatedTmuxSession(
552
554
  nativeSessionId,
553
555
  sessionName,
554
- outcome.server_pid,
556
+ { pid: outcome.server_pid, pidProven: server.pidProven },
555
557
  env,
556
558
  {
557
559
  sessionId,
@@ -571,6 +573,7 @@ export function createGjcTmuxSession(
571
573
  env,
572
574
  outcome.server_pid,
573
575
  outcome.server_start_time,
576
+ server.pidProven,
574
577
  );
575
578
  } catch (cleanupError) {
576
579
  throw new AggregateError([tagError, cleanupError], "gjc_tmux_profile_tag_failed_cleanup_failed");
@@ -597,6 +600,7 @@ export function createGjcTmuxSession(
597
600
  env,
598
601
  outcome.server_pid,
599
602
  outcome.server_start_time,
603
+ finalServer.pidProven,
600
604
  );
601
605
  } catch (cleanupError) {
602
606
  throw new AggregateError(
@@ -619,6 +623,7 @@ export function createGjcTmuxSession(
619
623
  env,
620
624
  outcome.server_pid,
621
625
  outcome.server_start_time,
626
+ server.pidProven,
622
627
  );
623
628
  } catch (cleanupError) {
624
629
  throw new AggregateError(
@@ -645,8 +650,18 @@ function tmuxCommandArgument(value: string): string {
645
650
  return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("$", "\\$").replaceAll("`", "\\`")}"`;
646
651
  }
647
652
 
653
+ /**
654
+ * Build the guard predicate for an exact tmux session mutation.
655
+ *
656
+ * The `#{pid}` clause is emitted only when the server proof actually proved a
657
+ * PID. Non-Linux probes report a placeholder PID (see {@link TmuxServerProof}),
658
+ * and pinning `#{pid}` to a placeholder produces a predicate no live tmux
659
+ * server can satisfy, which refuses every mutation on those platforms. The
660
+ * remaining clauses still pin the exact session id, session name and owner
661
+ * generation.
662
+ */
648
663
  function guardedTmuxSessionPredicate(
649
- expectedPid: number,
664
+ expectedServer: { pid: number; pidProven?: boolean },
650
665
  nativeSessionId: string,
651
666
  sessionName: string,
652
667
  expectedOwnerGeneration?: string,
@@ -654,13 +669,14 @@ function guardedTmuxSessionPredicate(
654
669
  const ownerGenerationPredicate = expectedOwnerGeneration
655
670
  ? `#{==:#{${GJC_TMUX_OWNER_GENERATION_OPTION}},${expectedOwnerGeneration}}`
656
671
  : "1";
657
- return `#{&&:#{==:#{pid},${expectedPid}},#{&&:#{==:#{session_id},${nativeSessionId}},#{&&:#{==:#{session_name},${sessionName}},${ownerGenerationPredicate}}}}`;
672
+ const serverPidPredicate = expectedServer.pidProven === false ? "1" : `#{==:#{pid},${expectedServer.pid}}`;
673
+ return `#{&&:${serverPidPredicate},#{&&:#{==:#{session_id},${nativeSessionId}},#{&&:#{==:#{session_name},${sessionName}},${ownerGenerationPredicate}}}}`;
658
674
  }
659
675
 
660
676
  function runGuardedTmuxSessionCommand(
661
677
  nativeSessionId: string,
662
678
  sessionName: string,
663
- expectedPid: number,
679
+ expectedServer: { pid: number; pidProven?: boolean },
664
680
  env: NodeJS.ProcessEnv,
665
681
  thenCommand: string,
666
682
  expectedOwnerGeneration?: string,
@@ -671,7 +687,7 @@ function runGuardedTmuxSessionCommand(
671
687
  "-t",
672
688
  normalizeExactTmuxTarget(nativeSessionId, env, "session"),
673
689
  "-F",
674
- guardedTmuxSessionPredicate(expectedPid, nativeSessionId, sessionName, expectedOwnerGeneration),
690
+ guardedTmuxSessionPredicate(expectedServer, nativeSessionId, sessionName, expectedOwnerGeneration),
675
691
  `${thenCommand} ; display-message -p __gjc_tmux_guarded_mutation_ok__`,
676
692
  "display-message -p __gjc_tmux_guarded_mutation_refused__",
677
693
  ],
@@ -683,7 +699,7 @@ function runGuardedTmuxSessionCommand(
683
699
  function tagCreatedTmuxSession(
684
700
  nativeSessionId: string,
685
701
  sessionName: string,
686
- expectedPid: number,
702
+ expectedServer: { pid: number; pidProven?: boolean },
687
703
  env: NodeJS.ProcessEnv,
688
704
  metadata: {
689
705
  branch?: string | null;
@@ -701,7 +717,7 @@ function tagCreatedTmuxSession(
701
717
  const commands = buildGjcTmuxProfileCommands(target, env, metadata, { tmuxCommand })
702
718
  .map(command => command.args.map(tmuxCommandArgument).join(" "))
703
719
  .join(" ; ");
704
- runGuardedTmuxSessionCommand(nativeSessionId, sessionName, expectedPid, env, commands);
720
+ runGuardedTmuxSessionCommand(nativeSessionId, sessionName, expectedServer, env, commands);
705
721
  }
706
722
 
707
723
  function cleanupExactCreatedTmuxSession(
@@ -711,6 +727,7 @@ function cleanupExactCreatedTmuxSession(
711
727
  env: NodeJS.ProcessEnv,
712
728
  expectedPid: number,
713
729
  expectedStartTime: string,
730
+ expectedPidProven?: boolean,
714
731
  ): void {
715
732
  const server = requireSafeTmuxServerForMutation(tmuxCommand, env);
716
733
  if (server.pid !== expectedPid || server.startTime !== expectedStartTime)
@@ -718,7 +735,7 @@ function cleanupExactCreatedTmuxSession(
718
735
  runGuardedTmuxSessionCommand(
719
736
  nativeSessionId,
720
737
  sessionName,
721
- expectedPid,
738
+ { pid: expectedPid, pidProven: expectedPidProven ?? server.pidProven },
722
739
  env,
723
740
  `kill-session -t ${tmuxCommandArgument(normalizeExactTmuxTarget(nativeSessionId, env, "session"))}`,
724
741
  );
@@ -727,7 +744,7 @@ function cleanupExactCreatedTmuxSession(
727
744
  function requireSafeTmuxServerForMutation(
728
745
  tmuxCommand: string,
729
746
  env: NodeJS.ProcessEnv,
730
- ): { pid: number; startTime: string } {
747
+ ): { pid: number; startTime: string; pidProven?: boolean } {
731
748
  if (mutationServerProofTestDependency) {
732
749
  const proof = mutationServerProofTestDependency(tmuxCommand, env);
733
750
  if (
@@ -739,7 +756,7 @@ function requireSafeTmuxServerForMutation(
739
756
  return proof as { pid: number; startTime: string };
740
757
  return { pid: 1, startTime: "test" };
741
758
  }
742
- if (process.platform !== "linux") return { pid: 1, startTime: "not-applicable" };
759
+ if (process.platform !== "linux") return { pid: 1, startTime: "not-applicable", pidProven: false };
743
760
  const result = Bun.spawnSync([tmuxCommand, "display-message", "-p", "#{pid}"], {
744
761
  stdout: "pipe",
745
762
  stderr: "pipe",
@@ -953,7 +970,7 @@ export function removeGjcTmuxSession(
953
970
  runGuardedTmuxSessionCommand(
954
971
  nativeSessionId,
955
972
  session.name,
956
- finalServer.pid,
973
+ finalServer,
957
974
  env,
958
975
  `kill-session -t '${nativeSessionId}'`,
959
976
  expectedIdentity?.ownerGeneration,
@@ -962,6 +979,13 @@ export function removeGjcTmuxSession(
962
979
  }
963
980
 
964
981
  async function readProcessStartTime(pid: number): Promise<string | null> {
982
+ // `/proc/<pid>/stat` only exists on Linux. Everywhere else the natives
983
+ // process reference carries the same kernel-derived start identity (macOS
984
+ // reports `darwin:<start_tvsec>:<start_tvusec>` from the BSD proc info), and
985
+ // callers only ever compare these values for equality against another value
986
+ // produced here. Returning null off Linux made every owner-identity proof
987
+ // unverifiable, so no session could be closed there.
988
+ if (process.platform !== "linux") return Process.fromPid(pid)?.incarnation ?? null;
965
989
  return readLinuxProcStartTime(pid);
966
990
  }
967
991
 
@@ -973,6 +997,27 @@ function exactManagedOwnerSupervisor(supervisorPid: number, supervisorStartTime:
973
997
  return supervisor;
974
998
  }
975
999
 
1000
+ /**
1001
+ * Deliver SIGTERM to exactly one already-proved owner PID.
1002
+ *
1003
+ * `Process.signalRoot` routes through the owned pidfd on Linux and the owned
1004
+ * process handle on Windows, so PID reuse cannot redirect the signal. macOS has
1005
+ * no equivalent kernel authority and the native binding deliberately fails
1006
+ * closed there, which would leave every macOS force-close unable to signal its
1007
+ * owner at all. On that platform the caller has already re-proved the PID's
1008
+ * start-time incarnation immediately before this call — the same evidence the
1009
+ * native macOS signal path re-validates — so deliver to that exact PID.
1010
+ */
1011
+ function signalManagedOwnerTerm(supervisor: Process, pid: number): boolean {
1012
+ if (process.platform !== "darwin") return supervisor.signalRoot(15);
1013
+ try {
1014
+ process.kill(pid, "SIGTERM");
1015
+ return true;
1016
+ } catch {
1017
+ return false;
1018
+ }
1019
+ }
1020
+
976
1021
  async function readCurrentGeneration(stateDir: string, sessionId: string): Promise<string | null> {
977
1022
  try {
978
1023
  const value: unknown = JSON.parse(
@@ -1185,7 +1230,7 @@ export async function forceCloseGjcTmuxSession(
1185
1230
  deps.signalTerm(pid);
1186
1231
  } else {
1187
1232
  const supervisor = exactManagedOwnerSupervisor(pid, identity.startTime);
1188
- if (!supervisor.signalRoot(15)) throw new Error("managed_owner_supervisor_signal_failed");
1233
+ if (!signalManagedOwnerTerm(supervisor, pid)) throw new Error("managed_owner_supervisor_signal_failed");
1189
1234
  operatorVerdict = supervisor
1190
1235
  .waitForExit({ timeoutMs: FORCE_CLOSE_VERDICT_TIMEOUT_MS - 500 })
1191
1236
  .then(async exited => {
@@ -1227,7 +1272,7 @@ export async function forceCloseGjcTmuxSession(
1227
1272
  runGuardedTmuxSessionCommand(
1228
1273
  nativeSessionId,
1229
1274
  session.name,
1230
- initialServer.pid,
1275
+ initialServer,
1231
1276
  env,
1232
1277
  `kill-session -t '${nativeSessionId}'`,
1233
1278
  identity.generation,
@@ -290,6 +290,26 @@ export function findLedgerReceiptEvent(
290
290
  }) ?? null
291
291
  );
292
292
  }
293
+ /**
294
+ * A final-aggregate receipt whose recorded ledger checkpoint quality gate is
295
+ * missing a clean `criticReview` OKAY can never satisfy the completion guard,
296
+ * yet is not "stale" under {@link validateReceiptFreshBase}. Detect it so an
297
+ * identical-evidence complete replay can re-verify and re-mint with a
298
+ * corrected gate instead of no-opping into a permanently blocked run.
299
+ */
300
+ export function finalAggregateReceiptMissingCriticOkay(
301
+ ledger: readonly UltragoalLedgerEvent[],
302
+ receipt: UltragoalCompletionVerification,
303
+ ): boolean {
304
+ if (receipt.receiptKind !== "final-aggregate") return false;
305
+ const event = findLedgerReceiptEvent(ledger, receipt);
306
+ if (!event) return false;
307
+ const gate = event.qualityGateJson;
308
+ if (typeof gate !== "object" || gate === null || Array.isArray(gate)) return true;
309
+ const criticReview = (gate as Record<string, unknown>).criticReview;
310
+ if (typeof criticReview !== "object" || criticReview === null || Array.isArray(criticReview)) return true;
311
+ return (criticReview as Record<string, unknown>).verdict !== "OKAY";
312
+ }
293
313
 
294
314
  export function validateReceiptFreshBase(input: {
295
315
  plan: UltragoalPlan;