@gajae-code/coding-agent 0.18.7 → 0.18.9

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 +377 -1
  2. package/dist/types/async/endpoint-id.d.ts +16 -0
  3. package/dist/types/async/job-manager.d.ts +1 -1
  4. package/dist/types/async/support.d.ts +0 -14
  5. package/dist/types/capability/mcp.d.ts +2 -0
  6. package/dist/types/capability/skill.d.ts +2 -0
  7. package/dist/types/capability/types.d.ts +2 -0
  8. package/dist/types/cli/public-command-errors.d.ts +3 -1
  9. package/dist/types/cli/setup-cli.d.ts +1 -1
  10. package/dist/types/commands/deep-interview.d.ts +3 -0
  11. package/dist/types/commands/mcp-serve.d.ts +4 -0
  12. package/dist/types/config/autorouting-tier-map.d.ts +348 -9
  13. package/dist/types/config/file-lock.d.ts +1 -0
  14. package/dist/types/config/model-bindings-applier.d.ts +2 -0
  15. package/dist/types/config/model-profile-activation.d.ts +11 -3
  16. package/dist/types/config/model-registry.d.ts +4 -9
  17. package/dist/types/config/skill-settings-defaults.d.ts +2 -0
  18. package/dist/types/cursor-delete-path.d.ts +1 -0
  19. package/dist/types/cursor-mcp-name.d.ts +8 -0
  20. package/dist/types/customization/inventory.d.ts +2 -0
  21. package/dist/types/debug/report-bundle-parent.d.ts +2 -0
  22. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.d.ts +1 -0
  23. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.d.ts +31 -0
  24. package/dist/types/defaults/gjc-skills.generated.d.ts +5 -6
  25. package/dist/types/discovery/helpers.d.ts +6 -1
  26. package/dist/types/discovery/mcp-json.d.ts +1 -0
  27. package/dist/types/eval/py/kernel.d.ts +18 -0
  28. package/dist/types/export/html/css-color.d.ts +2 -0
  29. package/dist/types/export/html/html-export-destination.d.ts +2 -0
  30. package/dist/types/export/html/template.generated.d.ts +1 -1
  31. package/dist/types/extensibility/extensions/function-hooks-internal.d.ts +5 -0
  32. package/dist/types/extensibility/extensions/types.d.ts +7 -0
  33. package/dist/types/extensibility/gjc-plugins/runtime-adapters.d.ts +14 -1
  34. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +2 -0
  35. package/dist/types/extensibility/plugins/plugin-link-path.d.ts +2 -0
  36. package/dist/types/extensibility/runtime-skill-discovery.d.ts +3 -1
  37. package/dist/types/extensibility/skill-management.d.ts +4 -1
  38. package/dist/types/extensibility/skills.d.ts +2 -0
  39. package/dist/types/gjc-runtime/deep-interview-crystallize.d.ts +74 -0
  40. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +11 -0
  41. package/dist/types/gjc-runtime/gc-runtime.d.ts +5 -0
  42. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -3
  43. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +0 -5
  44. package/dist/types/gjc-runtime/sidecar-bootstrap-env.d.ts +6 -0
  45. package/dist/types/gjc-runtime/state-argv.d.ts +1 -1
  46. package/dist/types/gjc-runtime/state-migrations.d.ts +8 -0
  47. package/dist/types/gjc-runtime/state-runtime.d.ts +95 -0
  48. package/dist/types/gjc-runtime/state-writer.d.ts +14 -1
  49. package/dist/types/gjc-runtime/tmux-common.d.ts +8 -5
  50. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -0
  51. package/dist/types/internal-urls/skill-path.d.ts +1 -0
  52. package/dist/types/lsp/config.d.ts +8 -5
  53. package/dist/types/lsp/workspace-path.d.ts +1 -0
  54. package/dist/types/modes/acp/acp-agent.d.ts +7 -0
  55. package/dist/types/modes/components/custom-editor.d.ts +6 -0
  56. package/dist/types/modes/components/customization/customization-dashboard.d.ts +1 -0
  57. package/dist/types/modes/components/extensions/state-manager.d.ts +4 -3
  58. package/dist/types/modes/controllers/input-controller.d.ts +9 -0
  59. package/dist/types/modes/interactive-mode.d.ts +1 -0
  60. package/dist/types/modes/utils/interrupt-ownership.d.ts +3 -0
  61. package/dist/types/modes/utils/keybinding-matchers.d.ts +1 -0
  62. package/dist/types/modes/utils/macos-option-forwarding.d.ts +17 -0
  63. package/dist/types/progress/collect-project-progress.d.ts +38 -0
  64. package/dist/types/progress/progress-contract.d.ts +154 -0
  65. package/dist/types/progress/progress-snapshot.d.ts +11 -0
  66. package/dist/types/progress/project-progress.d.ts +141 -0
  67. package/dist/types/progress/render-progress.d.ts +28 -0
  68. package/dist/types/runtime-mcp/manager.d.ts +2 -1
  69. package/dist/types/runtime-mcp/mcp-redirect.d.ts +9 -0
  70. package/dist/types/runtime-mcp/oauth-public-url.d.ts +3 -0
  71. package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +1 -0
  72. package/dist/types/runtime-mcp/project-host-values.d.ts +27 -0
  73. package/dist/types/runtime-mcp/smithery-registry.d.ts +24 -0
  74. package/dist/types/runtime-mcp/types.d.ts +6 -0
  75. package/dist/types/sdk/acp/adapter.d.ts +1 -1
  76. package/dist/types/sdk/broker/broker-exit.d.ts +6 -2
  77. package/dist/types/sdk/broker/broker.d.ts +24 -2
  78. package/dist/types/sdk/broker/doctor-restart.d.ts +5 -0
  79. package/dist/types/sdk/broker/ensure.d.ts +14 -1
  80. package/dist/types/sdk/broker/session-index.d.ts +12 -6
  81. package/dist/types/sdk/bus/index.d.ts +12 -1
  82. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +6 -1
  83. package/dist/types/sdk/client/client.d.ts +2 -0
  84. package/dist/types/sdk/host/query/handlers.d.ts +3 -0
  85. package/dist/types/sdk/index.d.ts +1 -0
  86. package/dist/types/sdk/router/session-router.d.ts +2 -0
  87. package/dist/types/sdk/session-list.d.ts +1 -1
  88. package/dist/types/sdk/session.d.ts +8 -0
  89. package/dist/types/session/agent-session.d.ts +38 -9
  90. package/dist/types/session/artifacts.d.ts +2 -2
  91. package/dist/types/session/internal/managed-gc-retirement-codec.d.ts +32 -0
  92. package/dist/types/session/internal/managed-session-scope.d.ts +79 -2
  93. package/dist/types/session/internal/managed-session-storage.d.ts +26 -1
  94. package/dist/types/session/internal/managed-task-owner-cleanup.d.ts +62 -0
  95. package/dist/types/session/internal/task-artifact-owner-access.d.ts +2 -0
  96. package/dist/types/session/internal/task-artifact-owner-transcript.d.ts +9 -1
  97. package/dist/types/session/session-manager.d.ts +31 -5
  98. package/dist/types/session/session-retirement.d.ts +31 -7
  99. package/dist/types/session/session-storage.d.ts +69 -2
  100. package/dist/types/session/task-artifact-owner-codec.d.ts +2 -0
  101. package/dist/types/setup/credential-auto-import.d.ts +1 -1
  102. package/dist/types/setup/credential-import.d.ts +6 -4
  103. package/dist/types/skill-state/active-state.d.ts +38 -0
  104. package/dist/types/skill-state/workflow-mutation-guard.d.ts +3 -0
  105. package/dist/types/slash-commands/helpers/progress-report.d.ts +8 -0
  106. package/dist/types/task/executor.d.ts +3 -0
  107. package/dist/types/task/isolation-dir.d.ts +26 -0
  108. package/dist/types/tools/ast-edit-write-path.d.ts +13 -0
  109. package/dist/types/tools/bash-skill-urls.d.ts +1 -1
  110. package/dist/types/tools/browser/cdp-url.d.ts +2 -0
  111. package/dist/types/tools/github-side-effect.d.ts +22 -0
  112. package/dist/types/tools/index.d.ts +3 -0
  113. package/dist/types/tools/monitor-mutation.d.ts +9 -0
  114. package/dist/types/tools/python.d.ts +9 -1
  115. package/dist/types/tools/recipe/recipe-guard.d.ts +7 -0
  116. package/dist/types/tools/restricted-cwd.d.ts +1 -0
  117. package/dist/types/tools/todo-write.d.ts +6 -0
  118. package/dist/types/utils/tools-checksum.d.ts +7 -0
  119. package/package.json +7 -7
  120. package/scripts/generate-sdk-operation-inventory.ts +21 -0
  121. package/scripts/verify-managed-empty-stop.ts +28 -0
  122. package/src/async/endpoint-id.ts +26 -0
  123. package/src/async/job-manager.ts +247 -132
  124. package/src/async/support.ts +0 -25
  125. package/src/capability/index.ts +15 -0
  126. package/src/capability/mcp.ts +2 -0
  127. package/src/capability/skill.ts +2 -0
  128. package/src/capability/types.ts +2 -0
  129. package/src/cli/auth-broker-cli.ts +1 -1
  130. package/src/cli/customize-doctor.ts +15 -2
  131. package/src/cli/doctor/repairs.ts +4 -1
  132. package/src/cli/doctor-supervisor.ts +3 -0
  133. package/src/cli/public-command-errors.ts +21 -1
  134. package/src/cli/public-command-registry.ts +28 -6
  135. package/src/cli/setup-cli.ts +4 -4
  136. package/src/cli/skills-cli.ts +5 -0
  137. package/src/commands/deep-interview.ts +47 -8
  138. package/src/commands/mcp-serve.ts +7 -0
  139. package/src/commands/sdk.ts +455 -397
  140. package/src/config/autorouting-tier-map.ts +117 -7
  141. package/src/config/file-lock.ts +316 -79
  142. package/src/config/mcp-schema.json +4 -0
  143. package/src/config/model-bindings-applier.ts +20 -0
  144. package/src/config/model-profile-activation.ts +240 -46
  145. package/src/config/model-registry.ts +47 -153
  146. package/src/config/skill-settings-defaults.ts +7 -0
  147. package/src/coordinator-mcp/policy.ts +3 -2
  148. package/src/coordinator-mcp/server.ts +2 -0
  149. package/src/cursor-delete-path.ts +10 -0
  150. package/src/cursor-mcp-name.ts +15 -0
  151. package/src/cursor.ts +13 -2
  152. package/src/customization/inventory.ts +4 -13
  153. package/src/dap/config.ts +2 -2
  154. package/src/debug/report-bundle-parent.ts +22 -0
  155. package/src/debug/report-bundle.ts +3 -0
  156. package/src/debug/system-info.ts +13 -1
  157. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.ts +10 -6
  158. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.ts +67 -4
  159. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.ts +80 -0
  160. package/src/defaults/gjc/skills/deep-interview/SKILL.md +105 -10
  161. package/src/defaults/gjc/skills/ralplan/SKILL.md +6 -4
  162. package/src/defaults/gjc-defaults.test.ts +18 -1
  163. package/src/defaults/gjc-defaults.ts +3 -0
  164. package/src/defaults/gjc-skills.generated.ts +58 -36
  165. package/src/discovery/agents.ts +6 -1
  166. package/src/discovery/builtin.ts +13 -1
  167. package/src/discovery/helpers.ts +171 -29
  168. package/src/discovery/mcp-json.ts +26 -12
  169. package/src/discovery/ssh.ts +1 -1
  170. package/src/discovery/substitute-plugin-root.ts +3 -1
  171. package/src/edit/file-read-cache.ts +1 -1
  172. package/src/eval/py/executor.ts +796 -154
  173. package/src/eval/py/kernel.ts +79 -13
  174. package/src/eval/py/tool-bridge.ts +4 -0
  175. package/src/export/html/css-color.ts +9 -0
  176. package/src/export/html/html-export-destination.ts +16 -0
  177. package/src/export/html/index.ts +7 -10
  178. package/src/export/html/template.generated.ts +1 -1
  179. package/src/extensibility/extensions/function-hooks-internal.ts +27 -0
  180. package/src/extensibility/extensions/runner.ts +15 -1
  181. package/src/extensibility/extensions/types.ts +7 -0
  182. package/src/extensibility/gjc-plugins/mcp-policy.ts +2 -1
  183. package/src/extensibility/gjc-plugins/runtime-adapters.ts +85 -8
  184. package/src/extensibility/plugins/manager.ts +3 -2
  185. package/src/extensibility/plugins/marketplace/cache.ts +15 -0
  186. package/src/extensibility/plugins/marketplace/manager.ts +11 -3
  187. package/src/extensibility/plugins/plugin-link-path.ts +12 -0
  188. package/src/extensibility/runtime-skill-discovery.ts +20 -2
  189. package/src/extensibility/skill-management.ts +9 -2
  190. package/src/extensibility/skills.ts +6 -1
  191. package/src/gjc-runtime/deep-interview-crystallize.ts +1814 -0
  192. package/src/gjc-runtime/deep-interview-recorder.ts +20 -2
  193. package/src/gjc-runtime/deep-interview-runtime.ts +1415 -13
  194. package/src/gjc-runtime/deep-interview-stage.ts +98 -21
  195. package/src/gjc-runtime/gc-runtime.ts +206 -9
  196. package/src/gjc-runtime/launch-worktree.ts +70 -9
  197. package/src/gjc-runtime/psmux-detect.ts +28 -4
  198. package/src/gjc-runtime/ralplan-runtime.ts +447 -52
  199. package/src/gjc-runtime/session-state-sidecar.ts +3 -2
  200. package/src/gjc-runtime/sidecar-bootstrap-env.ts +19 -0
  201. package/src/gjc-runtime/state-argv.ts +2 -0
  202. package/src/gjc-runtime/state-migrations.ts +91 -29
  203. package/src/gjc-runtime/state-runtime.ts +3716 -135
  204. package/src/gjc-runtime/state-writer.ts +105 -16
  205. package/src/gjc-runtime/tmux-common.ts +8 -5
  206. package/src/gjc-runtime/ultragoal-runtime.ts +16 -4
  207. package/src/gjc-runtime/workflow-manifest.generated.json +70 -42
  208. package/src/gjc-runtime/workflow-manifest.ts +54 -21
  209. package/src/harness-control-plane/operate.ts +12 -4
  210. package/src/harness-control-plane/owner.ts +5 -1
  211. package/src/hashline/parser.ts +48 -9
  212. package/src/hashline/recovery.ts +13 -4
  213. package/src/internal-urls/docs-index.generated.ts +20 -19
  214. package/src/internal-urls/skill-path.ts +19 -0
  215. package/src/internal-urls/skill-protocol.ts +2 -0
  216. package/src/lsp/config.ts +12 -63
  217. package/src/lsp/edits.ts +6 -0
  218. package/src/lsp/workspace-path.ts +51 -0
  219. package/src/main.ts +195 -31
  220. package/src/memories/index.ts +88 -7
  221. package/src/modes/acp/acp-agent.ts +88 -4
  222. package/src/modes/components/custom-editor.ts +14 -0
  223. package/src/modes/components/customization/customization-dashboard.ts +12 -0
  224. package/src/modes/components/extensions/extension-dashboard.ts +2 -2
  225. package/src/modes/components/extensions/state-manager.ts +15 -5
  226. package/src/modes/components/hook-editor.ts +1 -1
  227. package/src/modes/components/hook-selector.ts +1 -1
  228. package/src/modes/components/model-selector.ts +1 -4
  229. package/src/modes/components/provider-onboarding-selector.ts +1 -1
  230. package/src/modes/components/status-line/segments.ts +4 -0
  231. package/src/modes/controllers/event-controller.ts +11 -4
  232. package/src/modes/controllers/input-controller.ts +76 -31
  233. package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -16
  234. package/src/modes/controllers/selector-controller.ts +24 -15
  235. package/src/modes/controllers/todo-command-controller.ts +1 -1
  236. package/src/modes/interactive-mode.ts +5 -1
  237. package/src/modes/runtime-init.ts +4 -0
  238. package/src/modes/utils/abort-message.ts +3 -1
  239. package/src/modes/utils/interrupt-ownership.ts +12 -0
  240. package/src/modes/utils/keybinding-matchers.ts +4 -0
  241. package/src/modes/utils/macos-option-forwarding.ts +80 -0
  242. package/src/progress/collect-project-progress.ts +153 -0
  243. package/src/progress/progress-contract.ts +172 -0
  244. package/src/progress/progress-snapshot.ts +140 -0
  245. package/src/progress/project-progress.ts +446 -0
  246. package/src/progress/render-progress.ts +209 -0
  247. package/src/prompts/system/master-mode.md +1 -0
  248. package/src/prompts/tools/skill-discovery.md +1 -1
  249. package/src/runtime-mcp/client.ts +4 -2
  250. package/src/runtime-mcp/config-writer.ts +10 -6
  251. package/src/runtime-mcp/config.ts +1 -0
  252. package/src/runtime-mcp/json-rpc.ts +2 -1
  253. package/src/runtime-mcp/manager.ts +29 -11
  254. package/src/runtime-mcp/mcp-redirect.ts +73 -0
  255. package/src/runtime-mcp/oauth-flow.ts +14 -2
  256. package/src/runtime-mcp/oauth-public-url.ts +14 -0
  257. package/src/runtime-mcp/plugin-network-boundary.ts +4 -0
  258. package/src/runtime-mcp/pool.ts +6 -0
  259. package/src/runtime-mcp/project-host-values.ts +46 -0
  260. package/src/runtime-mcp/smithery-registry.ts +22 -3
  261. package/src/runtime-mcp/transports/http.ts +4 -3
  262. package/src/runtime-mcp/types.ts +6 -0
  263. package/src/sdk/acp/adapter.ts +95 -8
  264. package/src/sdk/broker/broker-exit.ts +52 -23
  265. package/src/sdk/broker/broker.ts +81 -6
  266. package/src/sdk/broker/doctor-restart.ts +4 -0
  267. package/src/sdk/broker/ensure.ts +31 -2
  268. package/src/sdk/broker/lifecycle.ts +711 -66
  269. package/src/sdk/broker/session-index.ts +191 -81
  270. package/src/sdk/bus/chat-daemon-cli.ts +38 -1
  271. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  272. package/src/sdk/bus/index.ts +238 -43
  273. package/src/sdk/bus/telegram-daemon-contract.ts +6 -1
  274. package/src/sdk/cli/session-cli.ts +17 -3
  275. package/src/sdk/client/client.ts +28 -8
  276. package/src/sdk/host/query/handlers.ts +9 -1
  277. package/src/sdk/host/session-runtime.test.ts +2705 -303
  278. package/src/sdk/host/session-runtime.ts +490 -143
  279. package/src/sdk/host/surface-policy.ts +1 -0
  280. package/src/sdk/index.ts +8 -0
  281. package/src/sdk/lifecycle-session.ts +3 -1
  282. package/src/sdk/prompt-deadline-manager.ts +15 -0
  283. package/src/sdk/protocol/operation-inventory.generated.json +146 -0
  284. package/src/sdk/protocol/operation-registry.ts +9 -2
  285. package/src/sdk/router/session-router.ts +82 -18
  286. package/src/sdk/session-list.ts +1 -0
  287. package/src/sdk/session.ts +69 -45
  288. package/src/session/agent-session.ts +679 -238
  289. package/src/session/artifacts.ts +176 -71
  290. package/src/session/internal/managed-gc-retirement-codec.ts +319 -0
  291. package/src/session/internal/managed-session-scope.ts +3779 -462
  292. package/src/session/internal/managed-session-storage.ts +501 -78
  293. package/src/session/internal/managed-task-owner-cleanup.ts +473 -0
  294. package/src/session/internal/task-artifact-owner-access.ts +19 -3
  295. package/src/session/internal/task-artifact-owner-transcript.ts +547 -1
  296. package/src/session/session-manager.ts +951 -133
  297. package/src/session/session-retirement.ts +573 -14
  298. package/src/session/session-storage.ts +447 -15
  299. package/src/session/task-artifact-owner-codec.ts +71 -8
  300. package/src/session/task-artifact-owner-retirement.ts +21 -19
  301. package/src/setup/credential-auto-import.ts +12 -3
  302. package/src/setup/credential-import.ts +176 -5
  303. package/src/setup/paseo/announce.ts +6 -1
  304. package/src/skill-state/active-state.ts +145 -2
  305. package/src/skill-state/workflow-mutation-guard.ts +102 -10
  306. package/src/slash-commands/builtin-registry.ts +39 -9
  307. package/src/slash-commands/helpers/mcp.ts +8 -4
  308. package/src/slash-commands/helpers/progress-report.ts +23 -0
  309. package/src/stt/setup.ts +3 -5
  310. package/src/task/commands.ts +3 -1
  311. package/src/task/executor.ts +4 -0
  312. package/src/task/index.ts +6 -0
  313. package/src/task/isolation-dir.ts +143 -0
  314. package/src/task/worktree.ts +16 -7
  315. package/src/tools/ask.ts +205 -6
  316. package/src/tools/ast-edit-write-path.ts +68 -0
  317. package/src/tools/ast-edit.ts +10 -1
  318. package/src/tools/bash-allowed-prefixes.ts +15 -0
  319. package/src/tools/bash-skill-urls.ts +56 -3
  320. package/src/tools/bash.ts +48 -79
  321. package/src/tools/browser/cdp-url.ts +18 -0
  322. package/src/tools/browser.ts +8 -1
  323. package/src/tools/descriptors.ts +5 -1
  324. package/src/tools/eval.ts +56 -36
  325. package/src/tools/gh.ts +10 -0
  326. package/src/tools/github-side-effect.ts +112 -0
  327. package/src/tools/image-gen.ts +1 -1
  328. package/src/tools/index.ts +3 -0
  329. package/src/tools/monitor-mutation.ts +27 -0
  330. package/src/tools/monitor.ts +7 -0
  331. package/src/tools/python.ts +188 -66
  332. package/src/tools/recipe/index.ts +9 -0
  333. package/src/tools/recipe/recipe-guard.ts +19 -0
  334. package/src/tools/restricted-cwd.ts +10 -0
  335. package/src/tools/skill-discovery.ts +5 -0
  336. package/src/tools/skill.ts +28 -1
  337. package/src/tools/todo-write.ts +10 -1
  338. package/src/tools/tool-catalog.generated.ts +1 -1
  339. package/src/tools/write.ts +1 -0
  340. package/src/utils/external-editor.ts +3 -2
  341. package/src/utils/tools-checksum.ts +34 -0
  342. package/src/utils/tools-manager.ts +24 -6
  343. package/src/web/insane/url-guard.ts +2 -1
  344. package/src/web/search/providers/codex.ts +3 -2
@@ -1,3 +1,11 @@
1
- import { type TaskArtifactOwnerLocator } from "../task-artifact-owner-codec";
1
+ import type { FileSessionStorage } from "../session-storage";
2
+ import { type TaskArtifactOwnerLocator, type TaskArtifactOwnerStorageContext } from "../task-artifact-owner-codec";
3
+ import type { ManagedGcProtocolScopeInspector } from "./managed-session-scope";
2
4
  /** Resolve the path-free owner locator using transcript replay's header-patch semantics. */
3
5
  export declare function taskArtifactOwnerLocatorFromTranscriptBytes(bytes: Uint8Array, expectedSessionId: string): TaskArtifactOwnerLocator | undefined;
6
+ /**
7
+ * Read-only inventory of every authenticated managed cwd directory under one profile's
8
+ * sessions root. Any incomplete, replaced, or unrecognized inventory conservatively
9
+ * blocks owner retirement.
10
+ */
11
+ export declare function hasSiblingTaskArtifactOwnerTranscript(storage: Pick<FileSessionStorage, "readSnapshotSync">, transcriptPath: string, locator: TaskArtifactOwnerLocator, context: TaskArtifactOwnerStorageContext, inspectProtocol?: ManagedGcProtocolScopeInspector): Promise<boolean>;
@@ -638,6 +638,21 @@ export interface ResumeSessionIdentity {
638
638
  ctimeNs?: bigint;
639
639
  sha256: string;
640
640
  }
641
+ /** Descriptor-bound bounded fingerprint for private explicit-session rollback authority.
642
+ * JSON-safe: all bigint fields are stored as strings to survive JSON serialization,
643
+ * spread, structuredClone, and JSON round-trip. */
644
+ export type ExplicitPersistIdentity = {
645
+ dev: string;
646
+ ino: string;
647
+ nlink?: string;
648
+ size: number;
649
+ mtimeMs: number;
650
+ mtimeNs: string;
651
+ ctimeNs?: string;
652
+ canonicalPath: string;
653
+ sessionId: string;
654
+ fingerprintSha256: string;
655
+ };
641
656
  export interface ResumeTailResumable {
642
657
  kind: "resumable";
643
658
  identity: ResumeSessionIdentity;
@@ -953,7 +968,8 @@ export interface ReadonlySessionManager {
953
968
  /** Creates an immutable facade that never exposes SessionManager mutation authority. */
954
969
  export declare function createReadonlySessionManager(manager: SessionManager): ReadonlySessionManager;
955
970
  /** Internal artifact-writing capability. Read-only facades expose it only through a private weak-map lookup. */
956
- export type SessionArtifactCapability = Readonly<Pick<SessionManager, "allocateArtifactPath" | "saveArtifact" | "putBlob">>;
971
+ export type SessionArtifactPublication = (content: string, toolType: string) => Promise<string | undefined>;
972
+ export type SessionArtifactCapability = Readonly<Pick<SessionManager, "allocateArtifactPath" | "saveArtifact" | "putBlob" | "captureArtifactPublication">>;
957
973
  /**
958
974
  * Returns the artifact capability for a concrete persistence owner or one of its
959
975
  * immutable read-only facades. Structural lookalikes remain unauthorized.
@@ -1038,6 +1054,8 @@ export declare function materializeResidentEntriesThrowingForTests<T>(entries: T
1038
1054
  sessionFile?: string;
1039
1055
  }): T[];
1040
1056
  export declare function materializeResidentEntriesForPersistenceForTests<T>(entries: T[], textStore: BlobStore, imageStore?: BlobStore): T[];
1057
+ export declare function isProjectSessionTranscriptPath(projectGjcDir: string, filePath: string): boolean;
1058
+ export declare function readAuthorizedProjectSessionTranscript(projectGjcDir: string, filePath: string, maxBytes: number): Buffer | undefined;
1041
1059
  /**
1042
1060
  * Discover resumable transcripts intentionally stored inside a project's `.gjc`.
1043
1061
  * Runtime token/audit JSONL files are excluded by requiring a known transcript
@@ -1084,10 +1102,12 @@ interface SessionManagerStateSnapshot {
1084
1102
  flushed: boolean;
1085
1103
  ensuredOnDisk: boolean;
1086
1104
  needsFullRewriteOnNextPersist: boolean;
1087
- fileEntries: FileEntry[];
1088
- materializedFileEntries: FileEntry[];
1105
+ fileEntries: readonly FileEntry[];
1106
+ materializedFileEntries: readonly FileEntry[];
1089
1107
  adoptedArtifactManager: ArtifactManager | null;
1090
1108
  coldRestoreFile?: string;
1109
+ /** Explicit persistence identity for snapshot serialization safety. Preserved across cross-manager adoptions. */
1110
+ readonly explicitPersistIdentity?: ExplicitPersistIdentity;
1091
1111
  }
1092
1112
  /** Benchmark-derived cap for strong materialized session snapshots. */
1093
1113
  export declare const MATERIALIZED_CACHE_MAX_BYTES: number;
@@ -1109,6 +1129,7 @@ export declare const SessionManagerTestHooks: {
1109
1129
  beforeManagedMissingReturn?: (filePath: string, storage: SessionStorage) => void | Promise<void>;
1110
1130
  afterManagedMissingAssertion?: (filePath: string, storage: SessionStorage) => void | Promise<void>;
1111
1131
  beforeManagedSwitchIdentity?: (filePath: string, storage: SessionStorage) => void | Promise<void>;
1132
+ beforeColdRollbackCommit?: (filePath: string, storage: SessionStorage) => void | Promise<void>;
1112
1133
  /** Internal first-open GC strategy override; omitted means current. */
1113
1134
  firstOpenGcStrategy?: SessionMemoryGcStrategy;
1114
1135
  /** Internal first-open secondary-artifact mode override; omitted means auto. */
@@ -1428,8 +1449,11 @@ export declare class SessionManager {
1428
1449
  * one bound to the current session file unless an external manager was
1429
1450
  * adopted via `adoptArtifactManager`. Falls back to the lazily created
1430
1451
  * ephemeral filesystem store once a non-persistent session has saved an
1431
- * artifact, so `artifact://` stays resolvable. Returns null only when no
1432
- * store has been established yet.
1452
+ * artifact, so `artifact://` stays resolvable. Returns null when no store has
1453
+ * been established yet and once the manager has released its artifact
1454
+ * authority while closing — released authority stays observable as absence
1455
+ * (matching `isArtifactManagerAuthorized`), while artifact *operations* are
1456
+ * fenced by `#assertArtifactOpen()` and keep throwing.
1433
1457
  */
1434
1458
  getArtifactManager(): ArtifactManager | null;
1435
1459
  /** Linearizably establish this session's persistent or ephemeral artifact manager. */
@@ -1449,6 +1473,8 @@ export declare class SessionManager {
1449
1473
  * read back from the filesystem instead of being retained in memory.
1450
1474
  */
1451
1475
  saveArtifact(content: string, toolType: string): Promise<string | undefined>;
1476
+ /** Capture artifact publication authority for one session lifecycle. */
1477
+ captureArtifactPublication(): SessionArtifactPublication;
1452
1478
  /** Inspect an evicted artifact using a bounded range read; never rehydrates by default. */
1453
1479
  inspectEvictedToolOutput(handle: unknown, range?: {
1454
1480
  start?: number;
@@ -1,4 +1,10 @@
1
+ import type { ManagedGcSessionRetirementReceipt } from "./internal/managed-gc-retirement-codec";
2
+ import { type ManagedScope } from "./internal/managed-session-scope";
1
3
  import { type FileSessionStorage } from "./session-storage";
4
+ import type { TaskArtifactOwnerDeletionEvidence, TaskArtifactOwnerRetirementContinuation, TaskArtifactOwnerRetirementOutcome } from "./task-artifact-owner-codec";
5
+ export interface SessionRetirementContinuation {
6
+ readonly managedScope: ManagedScope;
7
+ }
2
8
  /**
3
9
  * Outcome of a disk-retention retirement attempt.
4
10
  *
@@ -11,12 +17,34 @@ import { type FileSessionStorage } from "./session-storage";
11
17
  */
12
18
  export type SessionRetirementOutcome = {
13
19
  kind: "retired";
20
+ taskArtifactOwnerRetired?: true;
14
21
  } | {
15
22
  kind: "kept";
16
23
  reason: string;
17
24
  } | {
18
25
  kind: "cleanup_pending";
19
26
  reason: string;
27
+ phase?: "artifacts" | "transcript";
28
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
29
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
30
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
31
+ taskArtifactOwnerPayloadRetired?: true;
32
+ taskArtifactOwnerNamespaceRetained?: true;
33
+ taskArtifactOwnerRetired?: true;
34
+ };
35
+ export type SessionRetirementProbeOutcome = Extract<SessionRetirementOutcome, {
36
+ kind: "cleanup_pending";
37
+ }> | {
38
+ kind: "retirable";
39
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
40
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
41
+ taskArtifactOwnerRetired?: true;
42
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
43
+ taskArtifactOwnerPayloadRetired?: true;
44
+ taskArtifactOwnerNamespaceRetained?: true;
45
+ } | {
46
+ kind: "kept";
47
+ reason: string;
20
48
  };
21
49
  /**
22
50
  * Non-mutating projection of {@link retireSessionTranscript}: would the
@@ -27,12 +55,8 @@ export type SessionRetirementOutcome = {
27
55
  * authority's verdict (containment, identity, artifact tree) is deliberately
28
56
  * not predicted here — it is re-derived against live state at delete time.
29
57
  */
30
- export declare function probeSessionRetirement(storage: FileSessionStorage, sessionsRoot: string, transcriptPath: string): {
31
- kind: "retirable";
32
- } | {
33
- kind: "kept";
34
- reason: string;
35
- };
58
+ export declare function probeSessionRetirement(storage: FileSessionStorage, sessionsRoot: string, transcriptPath: string, continuation?: SessionRetirementContinuation): Promise<SessionRetirementProbeOutcome>;
59
+ export declare function retireOrphanSessionTranscript(storage: FileSessionStorage, sessionsRoot: string, continuation: SessionRetirementContinuation, receipt: ManagedGcSessionRetirementReceipt): Promise<SessionRetirementOutcome>;
36
60
  /**
37
61
  * Retire one managed session transcript through the verified hard-delete
38
62
  * authority.
@@ -44,4 +68,4 @@ export declare function probeSessionRetirement(storage: FileSessionStorage, sess
44
68
  * caller owns the retention policy; this function owns nothing but the delete
45
69
  * authority.
46
70
  */
47
- export declare function retireSessionTranscript(storage: FileSessionStorage, sessionsRoot: string, transcriptPath: string): Promise<SessionRetirementOutcome>;
71
+ export declare function retireSessionTranscript(storage: FileSessionStorage, sessionsRoot: string, transcriptPath: string, continuation?: SessionRetirementContinuation): Promise<SessionRetirementOutcome>;
@@ -1,5 +1,7 @@
1
1
  import type * as native from "@gajae-code/natives";
2
+ import type { ManagedGcProtocolScopeInspector } from "./internal/managed-session-scope";
2
3
  import { type ManagedDirectoryRoot } from "./internal/managed-session-storage";
4
+ import { type TaskArtifactOwnerDeletionEvidence, type TaskArtifactOwnerRetirementContinuation, type TaskArtifactOwnerRetirementOutcome, type TaskArtifactOwnerStorageContext } from "./task-artifact-owner-codec";
3
5
  export interface SessionStorageStat {
4
6
  dev: bigint;
5
7
  ino: bigint;
@@ -312,8 +314,24 @@ export interface VerifiedSessionDeleteTarget {
312
314
  retainedTranscriptSuccessorPath?: string;
313
315
  /** Native-retained exchange placeholder observed during transcript cleanup. */
314
316
  retainedTranscriptPlaceholderPath?: string;
315
- /** Native-retained transcript entry whose identity could not be verified. */
317
+ /** Native-retained entry whose identity could not be verified. */
316
318
  retainedTranscriptUnknownPath?: string;
319
+ /** Trusted managed authority for the path-free persisted task-artifact locator. */
320
+ taskArtifactOwnerStorageContext?: TaskArtifactOwnerStorageContext;
321
+ /** Exact owner-tree evidence captured before deletion and retained across retries. */
322
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
323
+ /** Owning journal persists the full native disposition across delete effects. */
324
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
325
+ /** Native terminal evidence of logical transcript deletion; pathname absence alone is insufficient. */
326
+ taskArtifactOwnerTranscriptDeleted?: true;
327
+ /** Explicitly leave owner retirement to its owning coordinator. */
328
+ deferTaskArtifactOwnerRetirement?: true;
329
+ /** Durable evidence that exact owner retirement completed. */
330
+ taskArtifactOwnerRetired?: true;
331
+ /** Exact native remnant, separate from immutable original authority. */
332
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
333
+ taskArtifactOwnerPayloadRetired?: true;
334
+ taskArtifactOwnerNamespaceRetained?: true;
317
335
  /** Native-retained publisher successor observed during cleanup. */
318
336
  retainedArtifactsSuccessorPath?: string;
319
337
  /** Native-retained exchange placeholder observed during cleanup. */
@@ -337,8 +355,22 @@ export type VerifiedSessionDeleteResult = {
337
355
  kind: "artifacts_removed";
338
356
  phase: "artifacts";
339
357
  transcriptIdentity: SessionStorageFileIdentity;
358
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
359
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
360
+ taskArtifactOwnerTranscriptDeleted?: true;
361
+ taskArtifactOwnerRetired?: true;
362
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
363
+ taskArtifactOwnerPayloadRetired?: true;
364
+ taskArtifactOwnerNamespaceRetained?: true;
340
365
  } | {
341
366
  kind: "deleted";
367
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
368
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
369
+ taskArtifactOwnerTranscriptDeleted?: true;
370
+ taskArtifactOwnerRetired?: true;
371
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
372
+ taskArtifactOwnerPayloadRetired?: true;
373
+ taskArtifactOwnerNamespaceRetained?: true;
342
374
  } | {
343
375
  kind: "cleanup_pending";
344
376
  phase: "artifacts";
@@ -355,6 +387,27 @@ export type VerifiedSessionDeleteResult = {
355
387
  retainedSuccessorPath?: string;
356
388
  retainedPlaceholderPath?: string;
357
389
  retainedUnknownPath?: string;
390
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
391
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
392
+ taskArtifactOwnerTranscriptDeleted?: true;
393
+ taskArtifactOwnerRetired?: true;
394
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
395
+ taskArtifactOwnerPayloadRetired?: true;
396
+ taskArtifactOwnerNamespaceRetained?: true;
397
+ } | {
398
+ kind: "cleanup_pending";
399
+ phase: "task_artifact_owner";
400
+ /** True only after verified artifact completion, never inferred from the failure phase. */
401
+ artifactsRemoved: boolean;
402
+ error: Error;
403
+ transcriptIdentity: SessionStorageFileIdentity;
404
+ taskArtifactOwnerDeletionEvidence: TaskArtifactOwnerDeletionEvidence;
405
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
406
+ taskArtifactOwnerTranscriptDeleted?: true;
407
+ taskArtifactOwnerRetired?: true;
408
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
409
+ taskArtifactOwnerPayloadRetired?: true;
410
+ taskArtifactOwnerNamespaceRetained?: true;
358
411
  } | {
359
412
  kind: "cleanup_pending";
360
413
  phase: "transcript";
@@ -367,6 +420,13 @@ export type VerifiedSessionDeleteResult = {
367
420
  retainedSuccessorPath?: string;
368
421
  retainedPlaceholderPath?: string;
369
422
  retainedUnknownPath?: string;
423
+ taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
424
+ taskArtifactOwnerRetirementOutcome?: TaskArtifactOwnerRetirementOutcome;
425
+ taskArtifactOwnerTranscriptDeleted?: true;
426
+ taskArtifactOwnerRetired?: true;
427
+ taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
428
+ taskArtifactOwnerPayloadRetired?: true;
429
+ taskArtifactOwnerNamespaceRetained?: true;
370
430
  };
371
431
  type NativeDirectoryTreeEntry = {
372
432
  relativePath: string;
@@ -384,6 +444,13 @@ export type NativeDirectoryTreeSnapshot = {
384
444
  rootIno: string;
385
445
  entries: NativeDirectoryTreeEntry[];
386
446
  };
447
+ /**
448
+ * Replace an explicit session file. Creation mode `0600` does not install a
449
+ * Windows owner-only DACL, so this applies and verifies the same native path a
450
+ * primary transcript uses when it has no managed security context. POSIX mode
451
+ * stays `0600`.
452
+ */
453
+ export declare function writeExplicitOwnerOnlyTextSync(pathname: string, content: string): void;
387
454
  /** Physically observed commit-marker state; corrupt JSON is still `present`. */
388
455
  export type SessionCommitMarkerState = {
389
456
  kind: "missing";
@@ -469,7 +536,7 @@ export declare class FileSessionStorage implements SessionStorage {
469
536
  * revalidate, transcript last. Partial deletion returns typed cleanup_pending
470
537
  * evidence; identity/symlink/containment/header/cwd mismatch throws.
471
538
  */
472
- deleteSessionVerified(target: VerifiedSessionDeleteTarget): Promise<VerifiedSessionDeleteResult>;
539
+ deleteSessionVerified(target: VerifiedSessionDeleteTarget, inspectProtocol?: ManagedGcProtocolScopeInspector): Promise<VerifiedSessionDeleteResult>;
473
540
  }
474
541
  export declare class MemorySessionStorage implements SessionStorage {
475
542
  #private;
@@ -87,6 +87,8 @@ export declare function manifestRelativePath(ownerId: string): string;
87
87
  export declare function assertSafeRelativePath(relativePath: string): void;
88
88
  export declare function assertSessionRoot(context: TaskArtifactOwnerStorageContext): void;
89
89
  export declare function freezeTreeSnapshot(snapshot: NativeDirectoryTreeSnapshot): NativeDirectoryTreeSnapshot;
90
+ /** Project only authenticated remaining entries; never restore an omitted entry's authority. */
91
+ export declare function normalizeRetainedTreeSnapshot(expected: NativeDirectoryTreeSnapshot, retained: NativeDirectoryTreeSnapshot): NativeDirectoryTreeSnapshot | undefined;
90
92
  export declare function retainedTreeDoesNotExpandAuthority(expected: NativeDirectoryTreeSnapshot, retained: NativeDirectoryTreeSnapshot): boolean;
91
93
  export declare function sameTreeContents(left: NativeDirectoryTreeSnapshot, right: NativeDirectoryTreeSnapshot): boolean;
92
94
  export declare function sameOwnerParentIdentity(left: TaskArtifactOwnerParentIdentity, right: TaskArtifactOwnerParentIdentity): boolean;
@@ -7,7 +7,7 @@ export declare const CREDENTIAL_AUTO_IMPORT_REFRESH_WARNING = "Imported credenti
7
7
  export declare const CREDENTIAL_AUTO_IMPORT_DISCOVERY_WARNING = "External credential discovery could not be completed. Use /provider to import credentials manually.";
8
8
  export declare const CREDENTIAL_AUTO_IMPORT_RETRY_WARNING = "Some external credentials could not be imported. Use /provider to retry.";
9
9
  export declare const CREDENTIAL_AUTO_IMPORT_STATE_UNREADABLE_WARNING = "Credential import preference could not be read. External credential discovery was skipped; use /provider to import credentials manually.";
10
- export type CredentialAutoImportSourceLabel = "claude-code-file" | "claude-code-keychain" | "codex-file";
10
+ export type CredentialAutoImportSourceLabel = "claude-code-file" | "claude-code-keychain" | "codex-file" | "kiro-cli-social";
11
11
  export type CredentialAutoImportTrigger = "startup" | "bare-login" | "setup-cli";
12
12
  export type InitialImportResolution = "accepted" | "declined";
13
13
  export type CredentialAutoImportStateProblem = "invalid-initial-import-resolution" | "invalid-last-import-version" | "malformed-json" | "malformed-root";
@@ -1,8 +1,8 @@
1
1
  import type { AuthCredential } from "@gajae-code/ai/core";
2
2
  /** gjc provider ids that external credentials map onto. */
3
- export type ExternalProvider = "anthropic" | "openai-codex";
3
+ export type ExternalProvider = "anthropic" | "openai-codex" | "kiro";
4
4
  /** Where a discovered credential came from. */
5
- export type CredentialOrigin = "claude-code-file" | "claude-code-keychain" | "codex-file";
5
+ export type CredentialOrigin = "claude-code-file" | "claude-code-keychain" | "codex-file" | "kiro-cli-social";
6
6
  export declare const AUTO_IMPORT_OAUTH_PROVIDER_ORIGINS: Record<ExternalProvider, ReadonlySet<CredentialOrigin>>;
7
7
  /** Human labels for providers, used in redacted summaries. */
8
8
  export declare const EXTERNAL_PROVIDER_LABELS: Record<ExternalProvider, string>;
@@ -66,6 +66,8 @@ export interface DiscoveryOptions {
66
66
  * or `null` when no entry exists.
67
67
  */
68
68
  readClaudeKeychain?: () => Promise<string | null>;
69
+ /** Absolute Kiro CLI data.sqlite3 override, primarily for tests and embedders. */
70
+ kiroCliDatabasePath?: string;
69
71
  }
70
72
  export type CredentialUpserter = (provider: string, credential: AuthCredential) => unknown | Promise<unknown>;
71
73
  export interface ImportSummary {
@@ -76,8 +78,8 @@ export interface ImportSummary {
76
78
  }>;
77
79
  }
78
80
  /**
79
- * Discover Claude Code and Codex CLI credentials across files, the macOS
80
- * Keychain, and environment variables. Never throws for individual unreadable or
81
+ * Discover Claude Code, Codex CLI, and Kiro CLI credentials across their local
82
+ * stores and environment variables. Never throws for individual unreadable or
81
83
  * malformed sources — those land in {@link CredentialDiscoveryResult.skipped}.
82
84
  */
83
85
  export declare function discoverExternalCredentials(options?: DiscoveryOptions): Promise<CredentialDiscoveryResult>;
@@ -135,6 +135,44 @@ interface ActiveStateSignature {
135
135
  }
136
136
  export declare function computeActiveStateSignature(cwd: string, sessionId: string): Promise<ActiveStateSignature>;
137
137
  export declare function invalidateVisibleSkillActiveStateCache(cwd?: string, sessionId?: string): void;
138
+ /**
139
+ * Outcome of a failure-observable workflow-state read:
140
+ * - `absent`: neither a session snapshot nor a per-skill entry is recorded.
141
+ * - `read`: every recorded source was read and no snapshot row lacks authority.
142
+ * - `recovered`: the session snapshot was unreadable, but authoritative per-skill
143
+ * entries (which the snapshot is rebuilt from) supplied the visible state.
144
+ * - `discarded`: the snapshot is a derived cache that still lists active workflows
145
+ * whose per-skill entry is gone or inactive (e.g. a deactivation whose snapshot
146
+ * rebuild never ran); those stale rows were dropped and the visible state comes
147
+ * from the per-skill entries alone.
148
+ * - `unresolved`: the snapshot lists active workflows without an active per-skill
149
+ * entry, but it cannot be shown to be a derived cache, so those rows may be legacy
150
+ * authority or stale cache; they are excluded without confirming their absence.
151
+ * - `failed`: the session snapshot was unreadable and no per-skill entry could
152
+ * replace it (e.g. a corrupt legacy root-only record), so the state is unknown.
153
+ */
154
+ export type VisibleSkillActiveStateReadStatus = "absent" | "read" | "recovered" | "discarded" | "unresolved" | "failed";
155
+ export interface VisibleSkillActiveStateRead {
156
+ status: VisibleSkillActiveStateReadStatus;
157
+ /** Visible active state; `null` when nothing is active or the read failed. */
158
+ state: SkillActiveState | null;
159
+ }
160
+ /**
161
+ * Uncached, failure-observable counterpart of `readVisibleSkillActiveState` for
162
+ * read-only projections that must not present unreadable state as absence. The
163
+ * tolerant reader keeps mapping an unreadable session snapshot to `null` for
164
+ * HUD and guard callers; this variant reports `failed` or `recovered` instead.
165
+ *
166
+ * Unlike the tolerant reader, a snapshot row never survives without authority: an
167
+ * active row with no active per-skill entry is dropped as stale (`discarded`) when
168
+ * the snapshot is provably derived, or excluded as `unresolved` when it is not.
169
+ * Only a legacy root-only record keeps its own row. Per-skill entry read failures
170
+ * propagate, as they do from the tolerant reader, and so does an entry file that
171
+ * exists but holds no usable skill entry (e.g. `{}`): the tolerant reader skips
172
+ * it, which would make it indistinguishable from a deleted entry and let it pass
173
+ * as proof that a snapshot row is stale. The read never repairs state.
174
+ */
175
+ export declare function readVisibleSkillActiveStateWithStatus(cwd: string, sessionId: string): Promise<VisibleSkillActiveStateRead>;
138
176
  export declare function readVisibleSkillActiveState(cwd: string, sessionId?: string, opts?: ReadVisibleSkillActiveStateOptions): Promise<SkillActiveState | null>;
139
177
  export declare function syncSkillActiveState(options: SyncSkillActiveStateOptions): Promise<GuardedWriteResult | undefined>;
140
178
  export interface ApplyHandoffOptions {
@@ -5,6 +5,9 @@ export declare const WORKFLOW_STATE_MUTATION_BLOCK_MESSAGE = ".gjc workflow stat
5
5
  export declare const RALPLAN_MUTATION_BLOCK_MESSAGE = "Ralplan planning phase boundary: keep refining the consensus plan and persist plan artifacts through `gjc ralplan --write` (stage scratch files under a temp dir if needed). Product-code mutation tools and patch execution are blocked while ralplan is active; mutate only after the plan is approved and execution begins.";
6
6
  export declare const ULTRAGOAL_GOAL_PLANNING_MUTATION_BLOCK_MESSAGE = "Ultragoal goal-planning phase boundary: finish goal planning and record goals through `gjc ultragoal` before editing code. Product-code mutation tools and patch execution are blocked until goal planning completes and execution begins.";
7
7
  export declare const AUTORESEARCH_MUTATION_BLOCK_MESSAGE = "Autoresearch research-only boundary: this workflow produces findings, evidence, and a verdict \u2014 never product code. Product-code mutation tools and patch execution are blocked everywhere, on every branch. Mission research artifacts (`autoresearch.sh` at the workdir root and mission state through the sanctioned `gjc autoresearch` CLI) stay writable; run experiments through the `python` tool, or finish the mission and hand off to an approved implementation workflow.";
8
+ /** Tools whose execute path can mutate product state. `github` is included so side-effect ops share this guard. */
9
+ export declare const WORKFLOW_MUTATION_TOOL_NAMES: readonly ["edit", "write", "ast_edit", "bash", "github"];
10
+ export declare function isWorkflowMutationTool(name: string): boolean;
8
11
  type ToolWithEditMode = AgentTool & {
9
12
  mode?: unknown;
10
13
  customWireName?: unknown;
@@ -0,0 +1,8 @@
1
+ import type { ProjectProgressReport } from "../../progress/project-progress";
2
+ import { type ProgressRenderStyle } from "../../progress/render-progress";
3
+ /** Bound untrusted durable text (objectives, titles, HUD values) to one sanitized display line of `max` columns. */
4
+ export declare function clipProgressText(text: string, max: number): string;
5
+ /** TUI view: the `session.progress` snapshot rendered with column-aware clipping and theme colours. */
6
+ export declare function renderProgressReportLines(report: ProjectProgressReport, style?: ProgressRenderStyle): string[];
7
+ /** Plain text view: identical to what production ACP renders from the `session.progress` query. */
8
+ export declare function renderProgressReportText(report: ProjectProgressReport): string;
@@ -7,6 +7,7 @@ import type { AgentTelemetryConfig, ThinkingLevel } from "@gajae-code/agent-core
7
7
  import { type Model, type ServiceTier } from "@gajae-code/ai/core";
8
8
  import { AsyncJobManager } from "../async";
9
9
  import { type AutoroutingReasonCode } from "../config/autorouting-contract";
10
+ import type { ModelProfileOwnershipMarker } from "../config/model-profile-ownership";
10
11
  import { ModelRegistry } from "../config/model-registry";
11
12
  import type { PromptTemplate } from "../config/prompt-templates";
12
13
  import { Settings } from "../config/settings";
@@ -71,6 +72,8 @@ export interface ExecutorOptions {
71
72
  * Manual/direct parents (no active profile) keep exact resolution.
72
73
  */
73
74
  parentActiveModelProfile?: string;
75
+ /** Parent session's model profile ownership marker for propagating to subagent sessions. */
76
+ parentModelProfileOwnershipMarker?: ModelProfileOwnershipMarker;
74
77
  parentSessionId?: string;
75
78
  parentCredentialSessionId?: string;
76
79
  thinkingLevel?: ThinkingLevel;
@@ -0,0 +1,26 @@
1
+ import * as path from "node:path";
2
+ type PathApi = Pick<typeof path, "dirname" | "isAbsolute" | "relative" | "resolve" | "sep">;
3
+ /**
4
+ * Parent directory of `mergedDir`, but only when it is a single entry inside
5
+ * `worktreeRoot`. Root, empty, nested, and escaped paths are refused so
6
+ * cleanup cannot delete the worktree root or another session's tree by
7
+ * walking up.
8
+ */
9
+ export declare function resolveIsolationRemovalTarget(mergedDir: string, worktreeRoot: string, pathApi?: PathApi): string;
10
+ /**
11
+ * Create an exclusive directory next to `canonicalBaseDir`. Never removes
12
+ * `canonicalBaseDir` or any path that already exists.
13
+ */
14
+ export declare function allocateDisjointIsolationDir(canonicalBaseDir: string, tokenFactory?: () => string): Promise<string>;
15
+ /**
16
+ * Confirm native teardown may see `mergedDir`.
17
+ *
18
+ * `isoStop` deletes that path. The parent entry and `merged` itself must
19
+ * already be real directories, because native removal follows symlinks.
20
+ * A missing parent means there is nothing to stop. This does not close a
21
+ * replacement that happens after the lstat returns.
22
+ */
23
+ export declare function assertIsolationTeardownTarget(mergedDir: string, worktreeRoot: string): Promise<"stop" | "skip">;
24
+ /** Remove the isolation directory that owns `mergedDir`. Missing directories are ignored. */
25
+ export declare function removeIsolationDirectory(mergedDir: string, worktreeRoot: string): Promise<void>;
26
+ export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Path the native writer will mutate: realpath of an existing file, or realpath
3
+ * of the nearest existing ancestor plus the missing tail.
4
+ */
5
+ export declare function canonicalizeAstEditWritePath(absolutePath: string): Promise<string>;
6
+ /**
7
+ * Preview paths as the workflow guard must see them.
8
+ *
9
+ * The guard compares lexically against the session cwd. A raw realpath misses
10
+ * `.gjc/**` when that cwd is not already canonical (`/var` vs `/private/var`,
11
+ * or a symlinked workspace), so an in-workspace real path is reattached to `cwd`.
12
+ */
13
+ export declare function resolveAstEditPreviewWritePaths(cwd: string, previewedPaths: readonly string[]): Promise<string[]>;
@@ -1,5 +1,5 @@
1
1
  import type { Skill } from "../extensibility/skills";
2
- import { type LocalProtocolOptions } from "../internal-urls";
2
+ import { type LocalProtocolOptions } from "../internal-urls/local-protocol";
3
3
  import type { InternalResource } from "../internal-urls/types";
4
4
  interface InternalUrlResolver {
5
5
  canHandle(input: string): boolean;
@@ -0,0 +1,2 @@
1
+ /** Require an http(s) CDP URL whose host is loopback. */
2
+ export declare function assertLoopbackCdpUrl(cdpUrl: string): string;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Classify `github` tool operations for the approval gate and the planning
3
+ * mutation guard. Read-only ops stay available. Every other op, including a
4
+ * missing or unrecognized one, is a side effect and fails closed.
5
+ */
6
+ import type { AgentTool } from "@gajae-code/agent-core";
7
+ /** Name-only tool the planning guard uses when `GithubTool.execute` checks itself. */
8
+ export declare const githubMutationTool: AgentTool;
9
+ export declare function githubOp(args: unknown): string | undefined;
10
+ /** True only for a known read-only github op. Missing and unknown ops are not read-only. */
11
+ export declare function isGithubReadOnlyArgs(args: unknown): boolean;
12
+ export declare function isGithubReadOnlyOp(op: string): boolean;
13
+ /**
14
+ * Approval summary for a side-effect github call. The PR body is omitted so a
15
+ * token pasted into `body` is not copied into the permission title.
16
+ */
17
+ export declare function describeGithubSideEffect(args: unknown): string;
18
+ export declare function githubPermissionIntent(args: unknown): {
19
+ toolName: string;
20
+ title: string;
21
+ cacheKey: string;
22
+ } | undefined;
@@ -14,6 +14,7 @@ import type { ArtifactManager } from "../session/artifacts";
14
14
  import type { ClientBridge } from "../session/client-bridge";
15
15
  import type { FoldAdapter } from "../session/fold-coordinator";
16
16
  import type { CustomMessage } from "../session/messages";
17
+ import type { SessionArtifactPublication } from "../session/session-manager";
17
18
  import type { ToolChoiceQueue } from "../session/tool-choice-queue";
18
19
  import type { SkillActiveEntry } from "../skill-state/active-state";
19
20
  import type { AgentOutputManager } from "../task/output-manager";
@@ -258,6 +259,8 @@ export interface ToolSession {
258
259
  id?: string;
259
260
  path?: string;
260
261
  }>;
262
+ /** Capture owner-bound artifact publication authority for one session lifecycle. */
263
+ captureArtifactPublication?: () => SessionArtifactPublication;
261
264
  /** Get session spawns */
262
265
  getSessionSpawns: () => string | null;
263
266
  /** Get resolved model string if explicitly set for this session */
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Judge a monitor command with the same mutation rules as bash. Monitor is a
3
+ * background shell, so a planning-phase mutation must fail before the job starts.
4
+ */
5
+ export declare function assertMonitorMutationAllowed(input: {
6
+ cwd: string;
7
+ sessionId?: string;
8
+ command: string;
9
+ }): Promise<void>;
@@ -5,11 +5,19 @@ export declare function pythonKernelOwnerId(sessionId: string): string;
5
5
  export interface SessionPythonToolInput {
6
6
  /** Working directory for kernel execution (session cwd). */
7
7
  cwd: string;
8
+ /** Resolve the current working directory for each admitted invocation. */
9
+ getCwd?: () => string;
8
10
  /** Session settings used for Python runtime policy. */
9
11
  settings?: SettingsType;
12
+ /** Resolve the session file associated with each admitted invocation. */
13
+ getSessionFile?: () => string | null;
10
14
  /** Resolve the GJC session id used for the kernel owner and transcript paths. */
11
15
  getSessionId: () => string | null;
12
16
  /** Register cleanup with the current logical session lifecycle. */
13
- registerSessionCleanup: (cleanup: () => Promise<void> | void) => void;
17
+ registerSessionCleanup: (cleanup: () => Promise<void> | void) => (() => void) | void;
18
+ /** Reject execution after the owning session has begun disposal. */
19
+ assertEvalExecutionAllowed?: () => void;
20
+ /** Track this whole invocation through its transcript append. */
21
+ trackEvalExecution?: <T>(execution: Promise<T>, abortController: AbortController) => Promise<T>;
14
22
  }
15
23
  export declare function createSessionPythonTool(input: SessionPythonToolInput): AgentTool;
@@ -0,0 +1,7 @@
1
+ /** Apply the session bash planning guard to a recipe command before it runs. */
2
+ export declare function assertRecipeCommandAllowed(input: {
3
+ cwd: string;
4
+ sessionId?: string;
5
+ command: string;
6
+ commandCwd?: string;
7
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ export declare function assertCwdInsideWorkspace(workspace: string, commandCwd: string): Promise<void>;
@@ -51,6 +51,12 @@ declare const todoWriteSchema: z.ZodObject<{
51
51
  type TodoWriteParams = z.infer<typeof todoWriteSchema>;
52
52
  export declare const USER_TODO_EDIT_CUSTOM_TYPE = "user_todo_edit";
53
53
  export declare function getLatestTodoPhasesFromEntries(entries: SessionEntry[]): TodoPhase[];
54
+ /**
55
+ * Latest persisted todo list on the branch, terminal items included. `undefined`
56
+ * means no todo state was ever persisted; an empty array is an authoritative
57
+ * empty list (for example after a bare `/todo rm`).
58
+ */
59
+ export declare function findLatestTodoPhasesFromEntries(entries: SessionEntry[]): TodoPhase[] | undefined;
54
60
  /** Apply an array of `todo_write`-style ops to existing phases. Used by /todo slash command. */
55
61
  export declare function applyOpsToPhases(currentPhases: TodoPhase[], ops: TodoWriteParams["ops"]): {
56
62
  phases: TodoPhase[];
@@ -0,0 +1,7 @@
1
+ export interface ReleaseAssetDigest {
2
+ name?: string;
3
+ digest?: string | null;
4
+ }
5
+ export declare function sha256FromReleaseDigest(digest: string | null | undefined): string | null;
6
+ export declare function requireAssetSha256(assets: readonly ReleaseAssetDigest[], assetName: string): string;
7
+ export declare function assertFileMatchesSha256(filePath: string, expectedSha256: string): Promise<void>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@gajae-code/coding-agent",
4
- "version": "0.18.7",
4
+ "version": "0.18.9",
5
5
  "description": "Gajae Code CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://gajae-code.com",
7
7
  "author": "Yeachan-Heo and Gajae Code Contributors",
@@ -57,12 +57,12 @@
57
57
  "@agentclientprotocol/sdk": "1.3.0",
58
58
  "@babel/parser": "^7.29.3",
59
59
  "@mozilla/readability": "^0.6.0",
60
- "@gajae-code/stats": "0.18.7",
61
- "@gajae-code/agent-core": "0.18.7",
62
- "@gajae-code/ai": "0.18.7",
63
- "@gajae-code/natives": "0.18.7",
64
- "@gajae-code/tui": "0.18.7",
65
- "@gajae-code/utils": "0.18.7",
60
+ "@gajae-code/stats": "0.18.9",
61
+ "@gajae-code/agent-core": "0.18.9",
62
+ "@gajae-code/ai": "0.18.9",
63
+ "@gajae-code/natives": "0.18.9",
64
+ "@gajae-code/tui": "0.18.9",
65
+ "@gajae-code/utils": "0.18.9",
66
66
  "@puppeteer/browsers": "^2.13.0",
67
67
  "@types/turndown": "5.0.6",
68
68
  "@xterm/headless": "^6.0.0",