@sayknow-cli/coding-agent 0.2.2

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 (2036) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +37 -0
  3. package/dist/types/async/index.d.ts +2 -0
  4. package/dist/types/async/job-manager.d.ts +326 -0
  5. package/dist/types/async/support.d.ts +2 -0
  6. package/dist/types/autoresearch/dashboard.d.ts +4 -0
  7. package/dist/types/autoresearch/git.d.ts +36 -0
  8. package/dist/types/autoresearch/helpers.d.ts +24 -0
  9. package/dist/types/autoresearch/index.d.ts +2 -0
  10. package/dist/types/autoresearch/state.d.ts +17 -0
  11. package/dist/types/autoresearch/storage.d.ts +142 -0
  12. package/dist/types/autoresearch/tools/init-experiment.d.ts +31 -0
  13. package/dist/types/autoresearch/tools/log-experiment.d.ts +23 -0
  14. package/dist/types/autoresearch/tools/run-experiment.d.ts +8 -0
  15. package/dist/types/autoresearch/tools/update-notes.d.ts +12 -0
  16. package/dist/types/autoresearch/types.d.ts +154 -0
  17. package/dist/types/capability/context-file.d.ts +17 -0
  18. package/dist/types/capability/extension-module.d.ts +15 -0
  19. package/dist/types/capability/extension.d.ts +28 -0
  20. package/dist/types/capability/fs.d.ts +20 -0
  21. package/dist/types/capability/hook.d.ts +19 -0
  22. package/dist/types/capability/index.d.ts +80 -0
  23. package/dist/types/capability/instruction.d.ts +17 -0
  24. package/dist/types/capability/mcp.d.ts +45 -0
  25. package/dist/types/capability/prompt.d.ts +15 -0
  26. package/dist/types/capability/rule.d.ts +61 -0
  27. package/dist/types/capability/settings.d.ts +15 -0
  28. package/dist/types/capability/skill.d.ts +36 -0
  29. package/dist/types/capability/slash-command.d.ts +17 -0
  30. package/dist/types/capability/ssh.d.ts +23 -0
  31. package/dist/types/capability/system-prompt.d.ts +15 -0
  32. package/dist/types/capability/tool.d.ts +19 -0
  33. package/dist/types/capability/types.d.ts +154 -0
  34. package/dist/types/cli/agents-cli.d.ts +12 -0
  35. package/dist/types/cli/args.d.ts +56 -0
  36. package/dist/types/cli/auth-broker-cli.d.ts +25 -0
  37. package/dist/types/cli/auth-gateway-cli.d.ts +18 -0
  38. package/dist/types/cli/classify-install-target.d.ts +18 -0
  39. package/dist/types/cli/commands/init-xdg.d.ts +1 -0
  40. package/dist/types/cli/config-cli.d.ts +22 -0
  41. package/dist/types/cli/fast-help.d.ts +1 -0
  42. package/dist/types/cli/file-processor.d.ts +11 -0
  43. package/dist/types/cli/grep-cli.d.ts +17 -0
  44. package/dist/types/cli/initial-message.d.ts +17 -0
  45. package/dist/types/cli/list-models.d.ts +36 -0
  46. package/dist/types/cli/plugin-cli.d.ts +32 -0
  47. package/dist/types/cli/read-cli.d.ts +4 -0
  48. package/dist/types/cli/session-picker.d.ts +3 -0
  49. package/dist/types/cli/setup-cli.d.ts +54 -0
  50. package/dist/types/cli/shell-cli.d.ts +8 -0
  51. package/dist/types/cli/skills-cli.d.ts +9 -0
  52. package/dist/types/cli/ssh-cli.d.ts +21 -0
  53. package/dist/types/cli/stats-cli.d.ts +17 -0
  54. package/dist/types/cli/update-cli.d.ts +41 -0
  55. package/dist/types/cli/web-search-cli.d.ts +32 -0
  56. package/dist/types/cli/worktree-cli.d.ts +26 -0
  57. package/dist/types/cli.d.ts +3 -0
  58. package/dist/types/commands/acp.d.ts +12 -0
  59. package/dist/types/commands/agents.d.ts +34 -0
  60. package/dist/types/commands/auth-broker.d.ts +54 -0
  61. package/dist/types/commands/auth-gateway.d.ts +32 -0
  62. package/dist/types/commands/codex-native-hook.d.ts +6 -0
  63. package/dist/types/commands/commit.d.ts +27 -0
  64. package/dist/types/commands/config.d.ts +30 -0
  65. package/dist/types/commands/contribution-prep.d.ts +18 -0
  66. package/dist/types/commands/coordinator.d.ts +19 -0
  67. package/dist/types/commands/deep-interview.d.ts +51 -0
  68. package/dist/types/commands/gc.d.ts +26 -0
  69. package/dist/types/commands/grep.d.ts +42 -0
  70. package/dist/types/commands/harness.d.ts +43 -0
  71. package/dist/types/commands/launch.d.ts +127 -0
  72. package/dist/types/commands/mcp-serve.d.ts +24 -0
  73. package/dist/types/commands/plugin.d.ts +52 -0
  74. package/dist/types/commands/ralplan.d.ts +7 -0
  75. package/dist/types/commands/read.d.ts +15 -0
  76. package/dist/types/commands/rlm.d.ts +10 -0
  77. package/dist/types/commands/session.d.ts +24 -0
  78. package/dist/types/commands/setup.d.ts +105 -0
  79. package/dist/types/commands/shell.d.ts +21 -0
  80. package/dist/types/commands/skills.d.ts +26 -0
  81. package/dist/types/commands/ssh.d.ts +48 -0
  82. package/dist/types/commands/state.d.ts +7 -0
  83. package/dist/types/commands/stats.d.ts +25 -0
  84. package/dist/types/commands/team.d.ts +24 -0
  85. package/dist/types/commands/ultragoal.d.ts +8 -0
  86. package/dist/types/commands/update.d.ts +20 -0
  87. package/dist/types/commands/web-search.d.ts +87 -0
  88. package/dist/types/commands/worktree.d.ts +34 -0
  89. package/dist/types/commit/agentic/agent.d.ts +31 -0
  90. package/dist/types/commit/agentic/fallback.d.ts +5 -0
  91. package/dist/types/commit/agentic/index.d.ts +2 -0
  92. package/dist/types/commit/agentic/state.d.ts +58 -0
  93. package/dist/types/commit/agentic/tools/analyze-file.d.ts +19 -0
  94. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +10 -0
  95. package/dist/types/commit/agentic/tools/git-hunk.d.ts +9 -0
  96. package/dist/types/commit/agentic/tools/git-overview.d.ts +9 -0
  97. package/dist/types/commit/agentic/tools/index.d.ts +16 -0
  98. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +28 -0
  99. package/dist/types/commit/agentic/tools/propose-commit.d.ts +36 -0
  100. package/dist/types/commit/agentic/tools/recent-commits.d.ts +7 -0
  101. package/dist/types/commit/agentic/tools/schemas.d.ts +27 -0
  102. package/dist/types/commit/agentic/tools/split-commit.d.ts +53 -0
  103. package/dist/types/commit/agentic/topo-sort.d.ts +4 -0
  104. package/dist/types/commit/agentic/trivial.d.ts +7 -0
  105. package/dist/types/commit/agentic/validation.d.ts +20 -0
  106. package/dist/types/commit/analysis/conventional.d.ts +22 -0
  107. package/dist/types/commit/analysis/index.d.ts +4 -0
  108. package/dist/types/commit/analysis/scope.d.ts +6 -0
  109. package/dist/types/commit/analysis/summary.d.ts +19 -0
  110. package/dist/types/commit/analysis/validation.d.ts +8 -0
  111. package/dist/types/commit/changelog/detect.d.ts +2 -0
  112. package/dist/types/commit/changelog/generate.d.ts +30 -0
  113. package/dist/types/commit/changelog/index.d.ts +30 -0
  114. package/dist/types/commit/changelog/parse.d.ts +2 -0
  115. package/dist/types/commit/cli.d.ts +3 -0
  116. package/dist/types/commit/git/diff.d.ts +5 -0
  117. package/dist/types/commit/index.d.ts +4 -0
  118. package/dist/types/commit/map-reduce/index.d.ts +28 -0
  119. package/dist/types/commit/map-reduce/map-phase.d.ts +17 -0
  120. package/dist/types/commit/map-reduce/reduce-phase.d.ts +13 -0
  121. package/dist/types/commit/map-reduce/utils.d.ts +2 -0
  122. package/dist/types/commit/message.d.ts +2 -0
  123. package/dist/types/commit/model-selection.d.ts +15 -0
  124. package/dist/types/commit/pipeline.d.ts +5 -0
  125. package/dist/types/commit/shared-llm.d.ts +54 -0
  126. package/dist/types/commit/types.d.ts +78 -0
  127. package/dist/types/commit/utils/exclusions.d.ts +4 -0
  128. package/dist/types/commit/utils.d.ts +20 -0
  129. package/dist/types/config/config-file.d.ts +58 -0
  130. package/dist/types/config/file-lock-gc.d.ts +5 -0
  131. package/dist/types/config/file-lock.d.ts +35 -0
  132. package/dist/types/config/keybindings.d.ts +349 -0
  133. package/dist/types/config/model-equivalence.d.ts +24 -0
  134. package/dist/types/config/model-profile-activation.d.ts +39 -0
  135. package/dist/types/config/model-profiles.d.ts +37 -0
  136. package/dist/types/config/model-registry.d.ts +457 -0
  137. package/dist/types/config/model-resolver.d.ts +217 -0
  138. package/dist/types/config/models-config-schema.d.ts +690 -0
  139. package/dist/types/config/prompt-templates.d.ts +32 -0
  140. package/dist/types/config/resolve-config-value.d.ts +17 -0
  141. package/dist/types/config/settings-schema.d.ts +3581 -0
  142. package/dist/types/config/settings.d.ts +134 -0
  143. package/dist/types/config/skill-settings-defaults.d.ts +14 -0
  144. package/dist/types/config.d.ts +66 -0
  145. package/dist/types/coordinator/contract.d.ts +4 -0
  146. package/dist/types/coordinator-mcp/policy.d.ts +24 -0
  147. package/dist/types/coordinator-mcp/safety.d.ts +26 -0
  148. package/dist/types/coordinator-mcp/server.d.ts +58 -0
  149. package/dist/types/cursor.d.ts +24 -0
  150. package/dist/types/dap/client.d.ts +39 -0
  151. package/dist/types/dap/config.d.ts +6 -0
  152. package/dist/types/dap/index.d.ts +4 -0
  153. package/dist/types/dap/session.d.ts +108 -0
  154. package/dist/types/dap/types.d.ts +524 -0
  155. package/dist/types/debug/crash-diagnostics.d.ts +45 -0
  156. package/dist/types/debug/index.d.ts +15 -0
  157. package/dist/types/debug/log-formatting.d.ts +4 -0
  158. package/dist/types/debug/log-viewer.d.ts +68 -0
  159. package/dist/types/debug/profiler.d.ts +24 -0
  160. package/dist/types/debug/raw-sse-buffer.d.ts +44 -0
  161. package/dist/types/debug/raw-sse.d.ts +16 -0
  162. package/dist/types/debug/report-bundle.d.ts +55 -0
  163. package/dist/types/debug/runtime-gauges.d.ts +6 -0
  164. package/dist/types/debug/system-info.d.ts +26 -0
  165. package/dist/types/deep-interview/render-middleware.d.ts +6 -0
  166. package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +1 -0
  167. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +1 -0
  168. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +25 -0
  169. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +27 -0
  170. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +8 -0
  171. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +5 -0
  172. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +10 -0
  173. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +2 -0
  174. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +2 -0
  175. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +38 -0
  176. package/dist/types/defaults/skc-defaults.d.ts +57 -0
  177. package/dist/types/defaults/skc-grok-cli.d.ts +5 -0
  178. package/dist/types/discovery/agents-md.d.ts +1 -0
  179. package/dist/types/discovery/agents.d.ts +12 -0
  180. package/dist/types/discovery/builtin.d.ts +1 -0
  181. package/dist/types/discovery/claude-plugins.d.ts +1 -0
  182. package/dist/types/discovery/claude.d.ts +1 -0
  183. package/dist/types/discovery/cline.d.ts +1 -0
  184. package/dist/types/discovery/codex.d.ts +1 -0
  185. package/dist/types/discovery/cursor.d.ts +16 -0
  186. package/dist/types/discovery/gemini.d.ts +1 -0
  187. package/dist/types/discovery/github.d.ts +1 -0
  188. package/dist/types/discovery/helpers.d.ts +271 -0
  189. package/dist/types/discovery/index.d.ts +48 -0
  190. package/dist/types/discovery/mcp-json.d.ts +1 -0
  191. package/dist/types/discovery/opencode.d.ts +1 -0
  192. package/dist/types/discovery/plugin-dir-roots.d.ts +15 -0
  193. package/dist/types/discovery/ssh.d.ts +1 -0
  194. package/dist/types/discovery/substitute-plugin-root.d.ts +5 -0
  195. package/dist/types/discovery/vscode.d.ts +1 -0
  196. package/dist/types/discovery/windsurf.d.ts +13 -0
  197. package/dist/types/edit/apply-patch/index.d.ts +35 -0
  198. package/dist/types/edit/apply-patch/parser.d.ts +34 -0
  199. package/dist/types/edit/diff.d.ts +75 -0
  200. package/dist/types/edit/file-read-cache.d.ts +25 -0
  201. package/dist/types/edit/index.d.ts +58 -0
  202. package/dist/types/edit/modes/apply-patch.d.ts +24 -0
  203. package/dist/types/edit/modes/patch.d.ts +99 -0
  204. package/dist/types/edit/modes/replace.d.ts +149 -0
  205. package/dist/types/edit/normalize.d.ts +43 -0
  206. package/dist/types/edit/notebook.d.ts +26 -0
  207. package/dist/types/edit/read-file.d.ts +8 -0
  208. package/dist/types/edit/renderer.d.ts +110 -0
  209. package/dist/types/edit/streaming.d.ts +66 -0
  210. package/dist/types/eval/backend.d.ts +40 -0
  211. package/dist/types/eval/index.d.ts +4 -0
  212. package/dist/types/eval/js/context-manager.d.ts +27 -0
  213. package/dist/types/eval/js/executor.d.ts +29 -0
  214. package/dist/types/eval/js/index.d.ts +10 -0
  215. package/dist/types/eval/js/shared/helpers.d.ts +38 -0
  216. package/dist/types/eval/js/shared/indirect-eval.d.ts +14 -0
  217. package/dist/types/eval/js/shared/prelude.d.ts +1 -0
  218. package/dist/types/eval/js/shared/rewrite-imports.d.ts +6 -0
  219. package/dist/types/eval/js/shared/runtime.d.ts +47 -0
  220. package/dist/types/eval/js/shared/types.d.ts +24 -0
  221. package/dist/types/eval/js/tool-bridge.d.ts +18 -0
  222. package/dist/types/eval/js/worker-core.d.ts +5 -0
  223. package/dist/types/eval/js/worker-entry.d.ts +1 -0
  224. package/dist/types/eval/js/worker-protocol.d.ts +77 -0
  225. package/dist/types/eval/py/display.d.ts +25 -0
  226. package/dist/types/eval/py/executor.d.ts +88 -0
  227. package/dist/types/eval/py/index.d.ts +10 -0
  228. package/dist/types/eval/py/kernel.d.ts +65 -0
  229. package/dist/types/eval/py/prelude.d.ts +1 -0
  230. package/dist/types/eval/py/runtime.d.ts +29 -0
  231. package/dist/types/eval/py/tool-bridge.d.ts +20 -0
  232. package/dist/types/eval/types.d.ts +52 -0
  233. package/dist/types/exa/factory.d.ts +13 -0
  234. package/dist/types/exa/index.d.ts +20 -0
  235. package/dist/types/exa/mcp-client.d.ts +45 -0
  236. package/dist/types/exa/render.d.ts +19 -0
  237. package/dist/types/exa/researcher.d.ts +9 -0
  238. package/dist/types/exa/search.d.ts +9 -0
  239. package/dist/types/exa/types.d.ts +155 -0
  240. package/dist/types/exa/websets.d.ts +9 -0
  241. package/dist/types/exec/bash-executor.d.ts +64 -0
  242. package/dist/types/exec/exec.d.ts +25 -0
  243. package/dist/types/exec/idle-timeout-watchdog.d.ts +18 -0
  244. package/dist/types/exec/non-interactive-env.d.ts +1 -0
  245. package/dist/types/export/custom-share.d.ts +20 -0
  246. package/dist/types/export/html/index.d.ts +10 -0
  247. package/dist/types/export/html/template.generated.d.ts +1 -0
  248. package/dist/types/export/html/template.macro.d.ts +5 -0
  249. package/dist/types/export/ttsr.d.ts +44 -0
  250. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +9 -0
  251. package/dist/types/extensibility/custom-commands/bundled/review/index.d.ts +10 -0
  252. package/dist/types/extensibility/custom-commands/index.d.ts +2 -0
  253. package/dist/types/extensibility/custom-commands/loader.d.ts +29 -0
  254. package/dist/types/extensibility/custom-commands/types.d.ts +106 -0
  255. package/dist/types/extensibility/custom-tools/index.d.ts +6 -0
  256. package/dist/types/extensibility/custom-tools/loader.d.ts +69 -0
  257. package/dist/types/extensibility/custom-tools/types.d.ts +229 -0
  258. package/dist/types/extensibility/custom-tools/wrapper.d.ts +24 -0
  259. package/dist/types/extensibility/extensions/compact-handler.d.ts +26 -0
  260. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +29 -0
  261. package/dist/types/extensibility/extensions/index.d.ts +9 -0
  262. package/dist/types/extensibility/extensions/loader.d.ts +43 -0
  263. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +35 -0
  264. package/dist/types/extensibility/extensions/runner.d.ts +134 -0
  265. package/dist/types/extensibility/extensions/types.d.ts +891 -0
  266. package/dist/types/extensibility/extensions/wrapper.d.ts +55 -0
  267. package/dist/types/extensibility/hooks/index.d.ts +5 -0
  268. package/dist/types/extensibility/hooks/loader.d.ts +89 -0
  269. package/dist/types/extensibility/hooks/runner.d.ts +126 -0
  270. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +25 -0
  271. package/dist/types/extensibility/hooks/types.d.ts +431 -0
  272. package/dist/types/extensibility/plugins/doctor.d.ts +3 -0
  273. package/dist/types/extensibility/plugins/git-url.d.ts +34 -0
  274. package/dist/types/extensibility/plugins/index.d.ts +7 -0
  275. package/dist/types/extensibility/plugins/installer.d.ts +5 -0
  276. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +2 -0
  277. package/dist/types/extensibility/plugins/loader.d.ts +31 -0
  278. package/dist/types/extensibility/plugins/manager.d.ts +65 -0
  279. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +41 -0
  280. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +48 -0
  281. package/dist/types/extensibility/plugins/marketplace/index.d.ts +6 -0
  282. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +57 -0
  283. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +34 -0
  284. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +28 -0
  285. package/dist/types/extensibility/plugins/marketplace/types.d.ts +130 -0
  286. package/dist/types/extensibility/plugins/parser.d.ts +52 -0
  287. package/dist/types/extensibility/plugins/types.d.ts +149 -0
  288. package/dist/types/extensibility/shared-events.d.ts +280 -0
  289. package/dist/types/extensibility/skc-plugins/activation.d.ts +14 -0
  290. package/dist/types/extensibility/skc-plugins/index.d.ts +9 -0
  291. package/dist/types/extensibility/skc-plugins/injection.d.ts +31 -0
  292. package/dist/types/extensibility/skc-plugins/loader.d.ts +3 -0
  293. package/dist/types/extensibility/skc-plugins/paths.d.ts +8 -0
  294. package/dist/types/extensibility/skc-plugins/schema.d.ts +3 -0
  295. package/dist/types/extensibility/skc-plugins/state.d.ts +9 -0
  296. package/dist/types/extensibility/skc-plugins/tools.d.ts +8 -0
  297. package/dist/types/extensibility/skc-plugins/types.d.ts +64 -0
  298. package/dist/types/extensibility/skc-plugins/validation.d.ts +4 -0
  299. package/dist/types/extensibility/skills.d.ts +82 -0
  300. package/dist/types/extensibility/slash-commands.d.ts +48 -0
  301. package/dist/types/extensibility/tool-proxy.d.ts +4 -0
  302. package/dist/types/extensibility/typebox.d.ts +155 -0
  303. package/dist/types/extensibility/utils.d.ts +12 -0
  304. package/dist/types/goals/index.d.ts +3 -0
  305. package/dist/types/goals/runtime.d.ts +62 -0
  306. package/dist/types/goals/state.d.ts +32 -0
  307. package/dist/types/goals/tools/goal-tool.d.ts +62 -0
  308. package/dist/types/harness-control-plane/classifier.d.ts +13 -0
  309. package/dist/types/harness-control-plane/control-endpoint.d.ts +31 -0
  310. package/dist/types/harness-control-plane/finalize.d.ts +60 -0
  311. package/dist/types/harness-control-plane/gc-adapter.d.ts +3 -0
  312. package/dist/types/harness-control-plane/operate.d.ts +35 -0
  313. package/dist/types/harness-control-plane/owner.d.ts +53 -0
  314. package/dist/types/harness-control-plane/phase-rollup.d.ts +23 -0
  315. package/dist/types/harness-control-plane/preserve.d.ts +19 -0
  316. package/dist/types/harness-control-plane/receipt-ingest.d.ts +19 -0
  317. package/dist/types/harness-control-plane/receipt-spool.d.ts +19 -0
  318. package/dist/types/harness-control-plane/receipts.d.ts +149 -0
  319. package/dist/types/harness-control-plane/rpc-adapter.d.ts +69 -0
  320. package/dist/types/harness-control-plane/seams.d.ts +21 -0
  321. package/dist/types/harness-control-plane/session-lease.d.ts +65 -0
  322. package/dist/types/harness-control-plane/state-machine.d.ts +24 -0
  323. package/dist/types/harness-control-plane/storage.d.ts +80 -0
  324. package/dist/types/harness-control-plane/types.d.ts +187 -0
  325. package/dist/types/hashline/anchors.d.ts +20 -0
  326. package/dist/types/hashline/apply.d.ts +14 -0
  327. package/dist/types/hashline/constants.d.ts +19 -0
  328. package/dist/types/hashline/diff-preview.d.ts +2 -0
  329. package/dist/types/hashline/diff.d.ts +17 -0
  330. package/dist/types/hashline/execute.d.ts +4 -0
  331. package/dist/types/hashline/hash.d.ts +123 -0
  332. package/dist/types/hashline/index.d.ts +13 -0
  333. package/dist/types/hashline/input.d.ts +11 -0
  334. package/dist/types/hashline/parser.d.ts +7 -0
  335. package/dist/types/hashline/prefixes.d.ts +7 -0
  336. package/dist/types/hashline/recovery.d.ts +27 -0
  337. package/dist/types/hashline/stream.d.ts +2 -0
  338. package/dist/types/hashline/types.d.ts +77 -0
  339. package/dist/types/hindsight/backend.d.ts +13 -0
  340. package/dist/types/hindsight/bank.d.ts +54 -0
  341. package/dist/types/hindsight/client.d.ts +224 -0
  342. package/dist/types/hindsight/config.d.ts +51 -0
  343. package/dist/types/hindsight/content.d.ts +70 -0
  344. package/dist/types/hindsight/index.d.ts +8 -0
  345. package/dist/types/hindsight/mental-models.d.ts +125 -0
  346. package/dist/types/hindsight/state.d.ts +99 -0
  347. package/dist/types/hindsight/transcript.d.ts +28 -0
  348. package/dist/types/hooks/codex-native-hooks-config.d.ts +29 -0
  349. package/dist/types/hooks/native-skill-hook.d.ts +16 -0
  350. package/dist/types/hooks/skill-keywords.d.ts +18 -0
  351. package/dist/types/hooks/skill-state.d.ts +85 -0
  352. package/dist/types/i18n/index.d.ts +38 -0
  353. package/dist/types/i18n/messages/de.d.ts +2 -0
  354. package/dist/types/i18n/messages/de.messages.d.ts +1 -0
  355. package/dist/types/i18n/messages/de.settings.d.ts +1 -0
  356. package/dist/types/i18n/messages/en.d.ts +66 -0
  357. package/dist/types/i18n/messages/es.d.ts +2 -0
  358. package/dist/types/i18n/messages/es.messages.d.ts +1 -0
  359. package/dist/types/i18n/messages/es.settings.d.ts +1 -0
  360. package/dist/types/i18n/messages/fr.d.ts +2 -0
  361. package/dist/types/i18n/messages/fr.messages.d.ts +1 -0
  362. package/dist/types/i18n/messages/fr.settings.d.ts +1 -0
  363. package/dist/types/i18n/messages/ja.d.ts +2 -0
  364. package/dist/types/i18n/messages/ja.messages.d.ts +1 -0
  365. package/dist/types/i18n/messages/ja.settings.d.ts +1 -0
  366. package/dist/types/i18n/messages/ko.d.ts +2 -0
  367. package/dist/types/i18n/messages/ko.messages.d.ts +1 -0
  368. package/dist/types/i18n/messages/ko.settings.d.ts +1 -0
  369. package/dist/types/i18n/messages/zh.d.ts +2 -0
  370. package/dist/types/i18n/messages/zh.messages.d.ts +1 -0
  371. package/dist/types/i18n/messages/zh.settings.d.ts +1 -0
  372. package/dist/types/index.d.ts +33 -0
  373. package/dist/types/internal-urls/agent-protocol.d.ts +12 -0
  374. package/dist/types/internal-urls/artifact-protocol.d.ts +6 -0
  375. package/dist/types/internal-urls/docs-index.generated.d.ts +2 -0
  376. package/dist/types/internal-urls/index.d.ts +20 -0
  377. package/dist/types/internal-urls/issue-pr-protocol.d.ts +17 -0
  378. package/dist/types/internal-urls/json-query.d.ts +30 -0
  379. package/dist/types/internal-urls/local-protocol.d.ts +39 -0
  380. package/dist/types/internal-urls/mcp-protocol.d.ts +12 -0
  381. package/dist/types/internal-urls/memory-protocol.d.ts +23 -0
  382. package/dist/types/internal-urls/parse.d.ts +19 -0
  383. package/dist/types/internal-urls/registry-helpers.d.ts +11 -0
  384. package/dist/types/internal-urls/router.d.ts +14 -0
  385. package/dist/types/internal-urls/rule-protocol.d.ts +6 -0
  386. package/dist/types/internal-urls/skc-protocol.d.ts +12 -0
  387. package/dist/types/internal-urls/skill-protocol.d.ts +13 -0
  388. package/dist/types/internal-urls/types.d.ts +109 -0
  389. package/dist/types/lsp/client.d.ts +66 -0
  390. package/dist/types/lsp/clients/biome-client.d.ts +16 -0
  391. package/dist/types/lsp/clients/index.d.ts +19 -0
  392. package/dist/types/lsp/clients/lsp-linter-client.d.ts +16 -0
  393. package/dist/types/lsp/clients/swiftlint-client.d.ts +20 -0
  394. package/dist/types/lsp/config.d.ts +65 -0
  395. package/dist/types/lsp/edits.d.ts +23 -0
  396. package/dist/types/lsp/index.d.ts +130 -0
  397. package/dist/types/lsp/lspmux.d.ts +58 -0
  398. package/dist/types/lsp/render.d.ts +32 -0
  399. package/dist/types/lsp/startup-events.d.ts +11 -0
  400. package/dist/types/lsp/types.d.ts +304 -0
  401. package/dist/types/lsp/utils.d.ts +108 -0
  402. package/dist/types/main.d.ts +70 -0
  403. package/dist/types/memories/index.d.ts +28 -0
  404. package/dist/types/memories/storage.d.ts +110 -0
  405. package/dist/types/memory-backend/index.d.ts +4 -0
  406. package/dist/types/memory-backend/local-backend.d.ts +9 -0
  407. package/dist/types/memory-backend/off-backend.d.ts +7 -0
  408. package/dist/types/memory-backend/resolve.d.ts +15 -0
  409. package/dist/types/memory-backend/types.d.ts +61 -0
  410. package/dist/types/modes/acp/acp-agent.d.ts +61 -0
  411. package/dist/types/modes/acp/acp-client-bridge.d.ts +9 -0
  412. package/dist/types/modes/acp/acp-event-mapper.d.ts +34 -0
  413. package/dist/types/modes/acp/acp-mode.d.ts +5 -0
  414. package/dist/types/modes/acp/index.d.ts +2 -0
  415. package/dist/types/modes/acp/terminal-auth.d.ts +6 -0
  416. package/dist/types/modes/bridge/auth.d.ts +12 -0
  417. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +9 -0
  418. package/dist/types/modes/bridge/bridge-mode.d.ts +47 -0
  419. package/dist/types/modes/bridge/bridge-ui-context.d.ts +88 -0
  420. package/dist/types/modes/bridge/event-stream.d.ts +8 -0
  421. package/dist/types/modes/components/agent-dashboard.d.ts +21 -0
  422. package/dist/types/modes/components/assistant-message.d.ts +16 -0
  423. package/dist/types/modes/components/bash-execution.d.ts +29 -0
  424. package/dist/types/modes/components/bordered-loader.d.ts +11 -0
  425. package/dist/types/modes/components/branch-summary-message.d.ts +13 -0
  426. package/dist/types/modes/components/btw-panel.d.ts +16 -0
  427. package/dist/types/modes/components/compaction-summary-message.d.ts +13 -0
  428. package/dist/types/modes/components/countdown-timer.d.ts +14 -0
  429. package/dist/types/modes/components/custom-editor.d.ts +62 -0
  430. package/dist/types/modes/components/custom-message.d.ts +15 -0
  431. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +12 -0
  432. package/dist/types/modes/components/custom-provider-wizard.d.ts +10 -0
  433. package/dist/types/modes/components/diff.d.ts +11 -0
  434. package/dist/types/modes/components/dynamic-border.d.ts +14 -0
  435. package/dist/types/modes/components/eval-execution.d.ts +23 -0
  436. package/dist/types/modes/components/execution-shared.d.ts +46 -0
  437. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +26 -0
  438. package/dist/types/modes/components/extensions/extension-list.d.ts +39 -0
  439. package/dist/types/modes/components/extensions/index.d.ts +8 -0
  440. package/dist/types/modes/components/extensions/inspector-panel.d.ts +8 -0
  441. package/dist/types/modes/components/extensions/state-manager.d.ts +50 -0
  442. package/dist/types/modes/components/extensions/types.d.ts +151 -0
  443. package/dist/types/modes/components/footer.d.ts +30 -0
  444. package/dist/types/modes/components/history-search.d.ts +7 -0
  445. package/dist/types/modes/components/hook-editor.d.ts +18 -0
  446. package/dist/types/modes/components/hook-input.d.ts +15 -0
  447. package/dist/types/modes/components/hook-message.d.ts +15 -0
  448. package/dist/types/modes/components/hook-selector.d.ts +48 -0
  449. package/dist/types/modes/components/index.d.ts +35 -0
  450. package/dist/types/modes/components/jobs-overlay-model.d.ts +31 -0
  451. package/dist/types/modes/components/jobs-overlay.d.ts +30 -0
  452. package/dist/types/modes/components/keybinding-hints.d.ts +40 -0
  453. package/dist/types/modes/components/login-dialog.d.ts +32 -0
  454. package/dist/types/modes/components/message-frame.d.ts +42 -0
  455. package/dist/types/modes/components/model-selector.d.ts +46 -0
  456. package/dist/types/modes/components/oauth-selector.d.ts +15 -0
  457. package/dist/types/modes/components/plugin-selector.d.ts +26 -0
  458. package/dist/types/modes/components/plugin-settings.d.ts +66 -0
  459. package/dist/types/modes/components/provider-onboarding-selector.d.ts +7 -0
  460. package/dist/types/modes/components/queue-mode-selector.d.ts +9 -0
  461. package/dist/types/modes/components/read-tool-group.d.ts +30 -0
  462. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +26 -0
  463. package/dist/types/modes/components/session-observer-overlay.d.ts +11 -0
  464. package/dist/types/modes/components/session-selector.d.ts +30 -0
  465. package/dist/types/modes/components/settings-defs.d.ts +50 -0
  466. package/dist/types/modes/components/settings-selector.d.ts +56 -0
  467. package/dist/types/modes/components/show-images-selector.d.ts +9 -0
  468. package/dist/types/modes/components/skill-hud/render.d.ts +2 -0
  469. package/dist/types/modes/components/skill-message.d.ts +9 -0
  470. package/dist/types/modes/components/status-line/context-thresholds.d.ts +4 -0
  471. package/dist/types/modes/components/status-line/git-utils.d.ts +22 -0
  472. package/dist/types/modes/components/status-line/index.d.ts +4 -0
  473. package/dist/types/modes/components/status-line/presets.d.ts +3 -0
  474. package/dist/types/modes/components/status-line/segments.d.ts +5 -0
  475. package/dist/types/modes/components/status-line/separators.d.ts +3 -0
  476. package/dist/types/modes/components/status-line/token-rate.d.ts +10 -0
  477. package/dist/types/modes/components/status-line/types.d.ts +79 -0
  478. package/dist/types/modes/components/status-line.d.ts +82 -0
  479. package/dist/types/modes/components/theme-selector.d.ts +10 -0
  480. package/dist/types/modes/components/thinking-selector.d.ts +10 -0
  481. package/dist/types/modes/components/todo-reminder.d.ts +13 -0
  482. package/dist/types/modes/components/tool-execution.d.ts +54 -0
  483. package/dist/types/modes/components/tree-selector.d.ts +31 -0
  484. package/dist/types/modes/components/ttsr-notification.d.ts +13 -0
  485. package/dist/types/modes/components/user-message-selector.d.ts +28 -0
  486. package/dist/types/modes/components/user-message.d.ts +7 -0
  487. package/dist/types/modes/components/visual-truncate.d.ts +19 -0
  488. package/dist/types/modes/components/welcome.d.ts +35 -0
  489. package/dist/types/modes/controllers/btw-controller.d.ts +10 -0
  490. package/dist/types/modes/controllers/command-controller-shared.d.ts +47 -0
  491. package/dist/types/modes/controllers/command-controller.d.ts +38 -0
  492. package/dist/types/modes/controllers/event-controller.d.ts +12 -0
  493. package/dist/types/modes/controllers/extension-ui-controller.d.ts +80 -0
  494. package/dist/types/modes/controllers/input-controller.d.ts +39 -0
  495. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +10 -0
  496. package/dist/types/modes/controllers/selector-controller.d.ts +57 -0
  497. package/dist/types/modes/controllers/ssh-command-controller.d.ts +10 -0
  498. package/dist/types/modes/controllers/todo-command-controller.d.ts +7 -0
  499. package/dist/types/modes/emoji-autocomplete.d.ts +16 -0
  500. package/dist/types/modes/index.d.ts +10 -0
  501. package/dist/types/modes/interactive-mode.d.ts +266 -0
  502. package/dist/types/modes/jobs-observer.d.ts +57 -0
  503. package/dist/types/modes/oauth-manual-input.d.ts +8 -0
  504. package/dist/types/modes/print-mode.d.ts +33 -0
  505. package/dist/types/modes/prompt-action-autocomplete.d.ts +46 -0
  506. package/dist/types/modes/rpc/host-tools.d.ts +1 -0
  507. package/dist/types/modes/rpc/host-uris.d.ts +1 -0
  508. package/dist/types/modes/rpc/rpc-client.d.ts +288 -0
  509. package/dist/types/modes/rpc/rpc-mode.d.ts +87 -0
  510. package/dist/types/modes/rpc/rpc-socket-security.d.ts +7 -0
  511. package/dist/types/modes/rpc/rpc-types.d.ts +779 -0
  512. package/dist/types/modes/runtime-init.d.ts +21 -0
  513. package/dist/types/modes/session-observer-registry.d.ts +26 -0
  514. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +57 -0
  515. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +18 -0
  516. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +37 -0
  517. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +2 -0
  518. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +60 -0
  519. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +84 -0
  520. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +38 -0
  521. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +37 -0
  522. package/dist/types/modes/shared/agent-wire/handshake.d.ts +56 -0
  523. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +16 -0
  524. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +17 -0
  525. package/dist/types/modes/shared/agent-wire/protocol.d.ts +25 -0
  526. package/dist/types/modes/shared/agent-wire/responses.d.ts +4 -0
  527. package/dist/types/modes/shared/agent-wire/scopes.d.ts +18 -0
  528. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +25 -0
  529. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +42 -0
  530. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +27 -0
  531. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +29 -0
  532. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +68 -0
  533. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +161 -0
  534. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +72 -0
  535. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +114 -0
  536. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +39 -0
  537. package/dist/types/modes/shared.d.ts +15 -0
  538. package/dist/types/modes/theme/defaults/index.d.ts +553 -0
  539. package/dist/types/modes/theme/mermaid-cache.d.ts +9 -0
  540. package/dist/types/modes/theme/shimmer.d.ts +38 -0
  541. package/dist/types/modes/theme/theme.d.ts +275 -0
  542. package/dist/types/modes/types.d.ts +278 -0
  543. package/dist/types/modes/utils/abort-message.d.ts +4 -0
  544. package/dist/types/modes/utils/context-usage.d.ts +51 -0
  545. package/dist/types/modes/utils/hotkeys-markdown.d.ts +5 -0
  546. package/dist/types/modes/utils/keybinding-matchers.d.ts +10 -0
  547. package/dist/types/modes/utils/tools-markdown.d.ts +5 -0
  548. package/dist/types/modes/utils/ui-helpers.d.ts +53 -0
  549. package/dist/types/plan-mode/approved-plan.d.ts +49 -0
  550. package/dist/types/plan-mode/state.d.ts +6 -0
  551. package/dist/types/registry/agent-registry.d.ts +62 -0
  552. package/dist/types/reminders/star-reminder.d.ts +115 -0
  553. package/dist/types/rlm/artifacts.d.ts +9 -0
  554. package/dist/types/rlm/complete-research-tool.d.ts +35 -0
  555. package/dist/types/rlm/data-context.d.ts +6 -0
  556. package/dist/types/rlm/index.d.ts +35 -0
  557. package/dist/types/rlm/notebook.d.ts +12 -0
  558. package/dist/types/rlm/preset.d.ts +23 -0
  559. package/dist/types/rlm/python-tool.d.ts +16 -0
  560. package/dist/types/rlm/report.d.ts +14 -0
  561. package/dist/types/rlm/types.d.ts +37 -0
  562. package/dist/types/runtime/process-lifecycle.d.ts +108 -0
  563. package/dist/types/runtime-mcp/client.d.ts +74 -0
  564. package/dist/types/runtime-mcp/config-writer.d.ts +53 -0
  565. package/dist/types/runtime-mcp/config.d.ts +75 -0
  566. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +7 -0
  567. package/dist/types/runtime-mcp/index.d.ts +18 -0
  568. package/dist/types/runtime-mcp/json-rpc.d.ts +22 -0
  569. package/dist/types/runtime-mcp/loader.d.ts +43 -0
  570. package/dist/types/runtime-mcp/manager.d.ts +193 -0
  571. package/dist/types/runtime-mcp/oauth-discovery.d.ts +40 -0
  572. package/dist/types/runtime-mcp/oauth-flow.d.ts +59 -0
  573. package/dist/types/runtime-mcp/render.d.ts +25 -0
  574. package/dist/types/runtime-mcp/smithery-auth.d.ts +16 -0
  575. package/dist/types/runtime-mcp/smithery-connect.d.ts +38 -0
  576. package/dist/types/runtime-mcp/smithery-registry.d.ts +51 -0
  577. package/dist/types/runtime-mcp/tool-bridge.d.ts +86 -0
  578. package/dist/types/runtime-mcp/tool-cache.d.ts +8 -0
  579. package/dist/types/runtime-mcp/transports/http.d.ts +36 -0
  580. package/dist/types/runtime-mcp/transports/index.d.ts +5 -0
  581. package/dist/types/runtime-mcp/transports/stdio.d.ts +29 -0
  582. package/dist/types/runtime-mcp/types.d.ts +335 -0
  583. package/dist/types/sdk.d.ts +243 -0
  584. package/dist/types/secrets/index.d.ts +9 -0
  585. package/dist/types/secrets/obfuscator.d.ts +23 -0
  586. package/dist/types/secrets/regex.d.ts +2 -0
  587. package/dist/types/session/agent-session.d.ts +1078 -0
  588. package/dist/types/session/agent-storage.d.ts +100 -0
  589. package/dist/types/session/artifacts.d.ts +64 -0
  590. package/dist/types/session/auth-broker-config.d.ts +13 -0
  591. package/dist/types/session/auth-storage.d.ts +6 -0
  592. package/dist/types/session/blob-store.d.ts +135 -0
  593. package/dist/types/session/client-bridge.d.ts +88 -0
  594. package/dist/types/session/contribution-prep.d.ts +47 -0
  595. package/dist/types/session/history-storage.d.ts +16 -0
  596. package/dist/types/session/messages.d.ts +165 -0
  597. package/dist/types/session/session-dump-format.d.ts +22 -0
  598. package/dist/types/session/session-manager.d.ts +587 -0
  599. package/dist/types/session/session-storage.d.ts +88 -0
  600. package/dist/types/session/streaming-output.d.ts +209 -0
  601. package/dist/types/session/tool-choice-queue.d.ts +84 -0
  602. package/dist/types/session/yield-queue.d.ts +24 -0
  603. package/dist/types/setup/credential-import.d.ts +79 -0
  604. package/dist/types/setup/hermes-setup.d.ts +78 -0
  605. package/dist/types/setup/model-onboarding-guidance.d.ts +9 -0
  606. package/dist/types/setup/provider-onboarding.d.ts +52 -0
  607. package/dist/types/skc-runtime/cli-write-receipt.d.ts +24 -0
  608. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +103 -0
  609. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +36 -0
  610. package/dist/types/skc-runtime/deep-interview-state.d.ts +112 -0
  611. package/dist/types/skc-runtime/gc-render.d.ts +6 -0
  612. package/dist/types/skc-runtime/gc-runtime.d.ts +134 -0
  613. package/dist/types/skc-runtime/goal-mode-request.d.ts +53 -0
  614. package/dist/types/skc-runtime/launch-tmux.d.ts +76 -0
  615. package/dist/types/skc-runtime/launch-worktree.d.ts +46 -0
  616. package/dist/types/skc-runtime/ledger-event-renderer.d.ts +68 -0
  617. package/dist/types/skc-runtime/ralplan-runtime.d.ts +25 -0
  618. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +2 -0
  619. package/dist/types/skc-runtime/session-state-sidecar.d.ts +27 -0
  620. package/dist/types/skc-runtime/state-graph.d.ts +4 -0
  621. package/dist/types/skc-runtime/state-migrations.d.ts +33 -0
  622. package/dist/types/skc-runtime/state-renderer.d.ts +65 -0
  623. package/dist/types/skc-runtime/state-runtime.d.ts +37 -0
  624. package/dist/types/skc-runtime/state-schema.d.ts +317 -0
  625. package/dist/types/skc-runtime/state-validation.d.ts +6 -0
  626. package/dist/types/skc-runtime/state-writer.d.ts +209 -0
  627. package/dist/types/skc-runtime/team-gc.d.ts +7 -0
  628. package/dist/types/skc-runtime/team-runtime.d.ts +353 -0
  629. package/dist/types/skc-runtime/tmux-common.d.ts +61 -0
  630. package/dist/types/skc-runtime/tmux-gc.d.ts +7 -0
  631. package/dist/types/skc-runtime/tmux-sessions.d.ts +40 -0
  632. package/dist/types/skc-runtime/ultragoal-guard.d.ts +36 -0
  633. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +210 -0
  634. package/dist/types/skc-runtime/workflow-command-ref.d.ts +43 -0
  635. package/dist/types/skc-runtime/workflow-manifest.d.ts +54 -0
  636. package/dist/types/skill-state/active-state.d.ts +114 -0
  637. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +33 -0
  638. package/dist/types/skill-state/initial-phase.d.ts +12 -0
  639. package/dist/types/skill-state/workflow-hud.d.ts +81 -0
  640. package/dist/types/skill-state/workflow-state-contract.d.ts +57 -0
  641. package/dist/types/skill-state/workflow-state-version.d.ts +3 -0
  642. package/dist/types/slash-commands/acp-builtins.d.ts +18 -0
  643. package/dist/types/slash-commands/builtin-registry.d.ts +24 -0
  644. package/dist/types/slash-commands/helpers/context-report.d.ts +7 -0
  645. package/dist/types/slash-commands/helpers/fast-status-report.d.ts +76 -0
  646. package/dist/types/slash-commands/helpers/format.d.ts +10 -0
  647. package/dist/types/slash-commands/helpers/mcp.d.ts +3 -0
  648. package/dist/types/slash-commands/helpers/parse.d.ts +33 -0
  649. package/dist/types/slash-commands/helpers/ssh.d.ts +3 -0
  650. package/dist/types/slash-commands/helpers/todo.d.ts +3 -0
  651. package/dist/types/slash-commands/helpers/usage-report.d.ts +7 -0
  652. package/dist/types/slash-commands/types.d.ts +118 -0
  653. package/dist/types/ssh/config-writer.d.ts +49 -0
  654. package/dist/types/ssh/connection-manager.d.ts +33 -0
  655. package/dist/types/ssh/ssh-executor.d.ts +37 -0
  656. package/dist/types/ssh/sshfs-mount.d.ts +6 -0
  657. package/dist/types/ssh/utils.d.ts +2 -0
  658. package/dist/types/stt/downloader.d.ts +9 -0
  659. package/dist/types/stt/index.d.ts +3 -0
  660. package/dist/types/stt/recorder.d.ts +13 -0
  661. package/dist/types/stt/setup.d.ts +18 -0
  662. package/dist/types/stt/stt-controller.d.ts +16 -0
  663. package/dist/types/stt/transcriber.d.ts +16 -0
  664. package/dist/types/system-prompt.d.ts +93 -0
  665. package/dist/types/task/agents.d.ts +28 -0
  666. package/dist/types/task/commands.d.ts +35 -0
  667. package/dist/types/task/discovery.d.ts +19 -0
  668. package/dist/types/task/executor.d.ts +113 -0
  669. package/dist/types/task/fork-context-advisory.d.ts +13 -0
  670. package/dist/types/task/id.d.ts +7 -0
  671. package/dist/types/task/index.d.ts +43 -0
  672. package/dist/types/task/name-generator.d.ts +16 -0
  673. package/dist/types/task/output-manager.d.ts +36 -0
  674. package/dist/types/task/parallel.d.ts +34 -0
  675. package/dist/types/task/receipt.d.ts +87 -0
  676. package/dist/types/task/render.d.ts +28 -0
  677. package/dist/types/task/roi-reconciliation.d.ts +27 -0
  678. package/dist/types/task/simple-mode.d.ts +8 -0
  679. package/dist/types/task/skc-command.d.ts +7 -0
  680. package/dist/types/task/spawn-gate.d.ts +38 -0
  681. package/dist/types/task/subprocess-tool-registry.d.ts +72 -0
  682. package/dist/types/task/types.d.ts +508 -0
  683. package/dist/types/task/worktree.d.ts +94 -0
  684. package/dist/types/thinking-metadata.d.ts +16 -0
  685. package/dist/types/thinking.d.ts +22 -0
  686. package/dist/types/tool-discovery/tool-index.d.ts +112 -0
  687. package/dist/types/tools/archive-reader.d.ts +40 -0
  688. package/dist/types/tools/ask.d.ts +123 -0
  689. package/dist/types/tools/ast-edit.d.ts +77 -0
  690. package/dist/types/tools/ast-grep.d.ts +69 -0
  691. package/dist/types/tools/auto-generated-guard.d.ts +17 -0
  692. package/dist/types/tools/bash-allowed-prefixes.d.ts +10 -0
  693. package/dist/types/tools/bash-command-fixup.d.ts +11 -0
  694. package/dist/types/tools/bash-interactive.d.ts +16 -0
  695. package/dist/types/tools/bash-interceptor.d.ts +24 -0
  696. package/dist/types/tools/bash-pty-selection.d.ts +7 -0
  697. package/dist/types/tools/bash-skill-urls.d.ts +31 -0
  698. package/dist/types/tools/bash.d.ts +157 -0
  699. package/dist/types/tools/browser/actions.d.ts +54 -0
  700. package/dist/types/tools/browser/attach.d.ts +50 -0
  701. package/dist/types/tools/browser/launch.d.ts +62 -0
  702. package/dist/types/tools/browser/readable.d.ts +17 -0
  703. package/dist/types/tools/browser/registry.d.ts +57 -0
  704. package/dist/types/tools/browser/render.d.ts +53 -0
  705. package/dist/types/tools/browser/tab-protocol.d.ts +144 -0
  706. package/dist/types/tools/browser/tab-supervisor.d.ts +72 -0
  707. package/dist/types/tools/browser/tab-worker-entry.d.ts +1 -0
  708. package/dist/types/tools/browser/tab-worker.d.ts +19 -0
  709. package/dist/types/tools/browser.d.ts +211 -0
  710. package/dist/types/tools/calculator.d.ts +76 -0
  711. package/dist/types/tools/checkpoint.d.ts +63 -0
  712. package/dist/types/tools/computer/render.d.ts +17 -0
  713. package/dist/types/tools/computer.d.ts +465 -0
  714. package/dist/types/tools/conflict-detect.d.ts +205 -0
  715. package/dist/types/tools/context.d.ts +19 -0
  716. package/dist/types/tools/cron.d.ts +116 -0
  717. package/dist/types/tools/debug.d.ts +209 -0
  718. package/dist/types/tools/eval.d.ts +108 -0
  719. package/dist/types/tools/fetch.d.ts +61 -0
  720. package/dist/types/tools/file-recorder.d.ts +13 -0
  721. package/dist/types/tools/find.d.ts +95 -0
  722. package/dist/types/tools/fs-cache-invalidation.d.ts +15 -0
  723. package/dist/types/tools/gh-format.d.ts +6 -0
  724. package/dist/types/tools/gh-renderer.d.ts +25 -0
  725. package/dist/types/tools/gh.d.ts +356 -0
  726. package/dist/types/tools/github-cache.d.ts +103 -0
  727. package/dist/types/tools/grouped-file-output.d.ts +36 -0
  728. package/dist/types/tools/hindsight-recall.d.ts +21 -0
  729. package/dist/types/tools/hindsight-reflect.d.ts +23 -0
  730. package/dist/types/tools/hindsight-retain.d.ts +27 -0
  731. package/dist/types/tools/image-gen.d.ts +79 -0
  732. package/dist/types/tools/index.d.ts +297 -0
  733. package/dist/types/tools/inspect-image-renderer.d.ts +26 -0
  734. package/dist/types/tools/inspect-image.d.ts +31 -0
  735. package/dist/types/tools/irc.d.ts +79 -0
  736. package/dist/types/tools/job.d.ts +78 -0
  737. package/dist/types/tools/json-tree.d.ts +23 -0
  738. package/dist/types/tools/jtd-to-json-schema.d.ts +29 -0
  739. package/dist/types/tools/jtd-to-typescript.d.ts +26 -0
  740. package/dist/types/tools/jtd-utils.d.ts +42 -0
  741. package/dist/types/tools/list-limit.d.ts +12 -0
  742. package/dist/types/tools/match-line-format.d.ts +11 -0
  743. package/dist/types/tools/monitor.d.ts +54 -0
  744. package/dist/types/tools/output-meta.d.ts +204 -0
  745. package/dist/types/tools/path-utils.d.ts +147 -0
  746. package/dist/types/tools/plan-mode-guard.d.ts +18 -0
  747. package/dist/types/tools/read.d.ts +85 -0
  748. package/dist/types/tools/recipe/index.d.ts +45 -0
  749. package/dist/types/tools/recipe/render.d.ts +36 -0
  750. package/dist/types/tools/recipe/runner.d.ts +60 -0
  751. package/dist/types/tools/recipe/runners/cargo.d.ts +16 -0
  752. package/dist/types/tools/recipe/runners/index.d.ts +2 -0
  753. package/dist/types/tools/recipe/runners/just.d.ts +2 -0
  754. package/dist/types/tools/recipe/runners/make.d.ts +2 -0
  755. package/dist/types/tools/recipe/runners/pkg.d.ts +2 -0
  756. package/dist/types/tools/recipe/runners/task.d.ts +2 -0
  757. package/dist/types/tools/render-mermaid.d.ts +37 -0
  758. package/dist/types/tools/render-utils.d.ts +158 -0
  759. package/dist/types/tools/renderers.d.ts +26 -0
  760. package/dist/types/tools/resolve.d.ts +80 -0
  761. package/dist/types/tools/review.d.ts +63 -0
  762. package/dist/types/tools/search-tool-bm25.d.ts +65 -0
  763. package/dist/types/tools/search.d.ts +93 -0
  764. package/dist/types/tools/skill.d.ts +47 -0
  765. package/dist/types/tools/sqlite-reader.d.ts +94 -0
  766. package/dist/types/tools/ssh.d.ts +67 -0
  767. package/dist/types/tools/subagent-render.d.ts +31 -0
  768. package/dist/types/tools/subagent.d.ts +114 -0
  769. package/dist/types/tools/todo-write.d.ts +120 -0
  770. package/dist/types/tools/tool-errors.d.ts +33 -0
  771. package/dist/types/tools/tool-result.d.ts +30 -0
  772. package/dist/types/tools/tool-timeouts.d.ts +56 -0
  773. package/dist/types/tools/ultragoal-ask-guard.d.ts +5 -0
  774. package/dist/types/tools/vim.d.ts +58 -0
  775. package/dist/types/tools/write.d.ts +59 -0
  776. package/dist/types/tools/yield.d.ts +25 -0
  777. package/dist/types/tui/code-cell.d.ts +32 -0
  778. package/dist/types/tui/file-list.d.ts +22 -0
  779. package/dist/types/tui/hyperlink.d.ts +42 -0
  780. package/dist/types/tui/index.d.ts +11 -0
  781. package/dist/types/tui/output-block.d.ts +28 -0
  782. package/dist/types/tui/status-line.d.ts +18 -0
  783. package/dist/types/tui/tree-list.d.ts +19 -0
  784. package/dist/types/tui/types.d.ts +13 -0
  785. package/dist/types/tui/utils.d.ts +36 -0
  786. package/dist/types/utils/changelog.d.ts +36 -0
  787. package/dist/types/utils/clipboard.d.ts +22 -0
  788. package/dist/types/utils/command-args.d.ts +9 -0
  789. package/dist/types/utils/commit-message-generator.d.ts +7 -0
  790. package/dist/types/utils/edit-mode.d.ts +13 -0
  791. package/dist/types/utils/event-bus.d.ts +6 -0
  792. package/dist/types/utils/external-editor.d.ts +17 -0
  793. package/dist/types/utils/file-display-mode.d.ts +27 -0
  794. package/dist/types/utils/file-mentions.d.ts +11 -0
  795. package/dist/types/utils/git.d.ts +361 -0
  796. package/dist/types/utils/image-loading.d.ts +26 -0
  797. package/dist/types/utils/image-resize.d.ts +39 -0
  798. package/dist/types/utils/lang-from-path.d.ts +8 -0
  799. package/dist/types/utils/markit.d.ts +7 -0
  800. package/dist/types/utils/open.d.ts +2 -0
  801. package/dist/types/utils/session-color.d.ts +10 -0
  802. package/dist/types/utils/shell-snapshot.d.ts +5 -0
  803. package/dist/types/utils/sixel.d.ts +21 -0
  804. package/dist/types/utils/title-generator.d.ts +31 -0
  805. package/dist/types/utils/tool-choice.d.ts +20 -0
  806. package/dist/types/utils/tools-manager.d.ts +9 -0
  807. package/dist/types/vim/buffer.d.ts +41 -0
  808. package/dist/types/vim/commands.d.ts +6 -0
  809. package/dist/types/vim/engine.d.ts +47 -0
  810. package/dist/types/vim/parser.d.ts +3 -0
  811. package/dist/types/vim/render.d.ts +25 -0
  812. package/dist/types/vim/types.d.ts +182 -0
  813. package/dist/types/web/kagi.d.ts +23 -0
  814. package/dist/types/web/parallel.d.ts +58 -0
  815. package/dist/types/web/scrapers/artifacthub.d.ts +6 -0
  816. package/dist/types/web/scrapers/arxiv.d.ts +5 -0
  817. package/dist/types/web/scrapers/aur.d.ts +5 -0
  818. package/dist/types/web/scrapers/biorxiv.d.ts +5 -0
  819. package/dist/types/web/scrapers/bluesky.d.ts +5 -0
  820. package/dist/types/web/scrapers/brew.d.ts +5 -0
  821. package/dist/types/web/scrapers/cheatsh.d.ts +8 -0
  822. package/dist/types/web/scrapers/chocolatey.d.ts +5 -0
  823. package/dist/types/web/scrapers/choosealicense.d.ts +2 -0
  824. package/dist/types/web/scrapers/cisa-kev.d.ts +5 -0
  825. package/dist/types/web/scrapers/clojars.d.ts +5 -0
  826. package/dist/types/web/scrapers/coingecko.d.ts +5 -0
  827. package/dist/types/web/scrapers/crates-io.d.ts +5 -0
  828. package/dist/types/web/scrapers/crossref.d.ts +2 -0
  829. package/dist/types/web/scrapers/devto.d.ts +5 -0
  830. package/dist/types/web/scrapers/discogs.d.ts +8 -0
  831. package/dist/types/web/scrapers/discourse.d.ts +5 -0
  832. package/dist/types/web/scrapers/dockerhub.d.ts +5 -0
  833. package/dist/types/web/scrapers/docs-rs.d.ts +2 -0
  834. package/dist/types/web/scrapers/fdroid.d.ts +5 -0
  835. package/dist/types/web/scrapers/firefox-addons.d.ts +2 -0
  836. package/dist/types/web/scrapers/flathub.d.ts +2 -0
  837. package/dist/types/web/scrapers/github-gist.d.ts +5 -0
  838. package/dist/types/web/scrapers/github.d.ts +12 -0
  839. package/dist/types/web/scrapers/gitlab.d.ts +5 -0
  840. package/dist/types/web/scrapers/go-pkg.d.ts +5 -0
  841. package/dist/types/web/scrapers/hackage.d.ts +5 -0
  842. package/dist/types/web/scrapers/hackernews.d.ts +2 -0
  843. package/dist/types/web/scrapers/hex.d.ts +5 -0
  844. package/dist/types/web/scrapers/huggingface.d.ts +2 -0
  845. package/dist/types/web/scrapers/iacr.d.ts +5 -0
  846. package/dist/types/web/scrapers/index.d.ts +84 -0
  847. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +2 -0
  848. package/dist/types/web/scrapers/lemmy.d.ts +2 -0
  849. package/dist/types/web/scrapers/lobsters.d.ts +5 -0
  850. package/dist/types/web/scrapers/mastodon.d.ts +5 -0
  851. package/dist/types/web/scrapers/maven.d.ts +6 -0
  852. package/dist/types/web/scrapers/mdn.d.ts +2 -0
  853. package/dist/types/web/scrapers/metacpan.d.ts +5 -0
  854. package/dist/types/web/scrapers/musicbrainz.d.ts +5 -0
  855. package/dist/types/web/scrapers/npm.d.ts +5 -0
  856. package/dist/types/web/scrapers/nuget.d.ts +5 -0
  857. package/dist/types/web/scrapers/nvd.d.ts +5 -0
  858. package/dist/types/web/scrapers/ollama.d.ts +2 -0
  859. package/dist/types/web/scrapers/open-vsx.d.ts +5 -0
  860. package/dist/types/web/scrapers/opencorporates.d.ts +5 -0
  861. package/dist/types/web/scrapers/openlibrary.d.ts +5 -0
  862. package/dist/types/web/scrapers/orcid.d.ts +5 -0
  863. package/dist/types/web/scrapers/osv.d.ts +5 -0
  864. package/dist/types/web/scrapers/packagist.d.ts +5 -0
  865. package/dist/types/web/scrapers/pub-dev.d.ts +5 -0
  866. package/dist/types/web/scrapers/pubmed.d.ts +5 -0
  867. package/dist/types/web/scrapers/pypi.d.ts +5 -0
  868. package/dist/types/web/scrapers/rawg.d.ts +2 -0
  869. package/dist/types/web/scrapers/readthedocs.d.ts +2 -0
  870. package/dist/types/web/scrapers/reddit.d.ts +5 -0
  871. package/dist/types/web/scrapers/repology.d.ts +5 -0
  872. package/dist/types/web/scrapers/rfc.d.ts +5 -0
  873. package/dist/types/web/scrapers/rubygems.d.ts +5 -0
  874. package/dist/types/web/scrapers/searchcode.d.ts +2 -0
  875. package/dist/types/web/scrapers/sec-edgar.d.ts +5 -0
  876. package/dist/types/web/scrapers/semantic-scholar.d.ts +2 -0
  877. package/dist/types/web/scrapers/snapcraft.d.ts +2 -0
  878. package/dist/types/web/scrapers/sourcegraph.d.ts +2 -0
  879. package/dist/types/web/scrapers/spdx.d.ts +5 -0
  880. package/dist/types/web/scrapers/spotify.d.ts +8 -0
  881. package/dist/types/web/scrapers/stackoverflow.d.ts +6 -0
  882. package/dist/types/web/scrapers/terraform.d.ts +5 -0
  883. package/dist/types/web/scrapers/tldr.d.ts +7 -0
  884. package/dist/types/web/scrapers/twitter.d.ts +5 -0
  885. package/dist/types/web/scrapers/types.d.ts +78 -0
  886. package/dist/types/web/scrapers/utils.d.ts +26 -0
  887. package/dist/types/web/scrapers/vimeo.d.ts +5 -0
  888. package/dist/types/web/scrapers/vscode-marketplace.d.ts +5 -0
  889. package/dist/types/web/scrapers/w3c.d.ts +2 -0
  890. package/dist/types/web/scrapers/wikidata.d.ts +5 -0
  891. package/dist/types/web/scrapers/wikipedia.d.ts +5 -0
  892. package/dist/types/web/scrapers/youtube.d.ts +5 -0
  893. package/dist/types/web/search/index.d.ts +115 -0
  894. package/dist/types/web/search/provider.d.ts +24 -0
  895. package/dist/types/web/search/providers/anthropic.d.ts +32 -0
  896. package/dist/types/web/search/providers/base.d.ts +90 -0
  897. package/dist/types/web/search/providers/brave.d.ts +27 -0
  898. package/dist/types/web/search/providers/codex.d.ts +35 -0
  899. package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
  900. package/dist/types/web/search/providers/exa.d.ts +52 -0
  901. package/dist/types/web/search/providers/gemini.d.ts +57 -0
  902. package/dist/types/web/search/providers/jina.d.ts +26 -0
  903. package/dist/types/web/search/providers/kagi.d.ts +24 -0
  904. package/dist/types/web/search/providers/kimi.d.ts +27 -0
  905. package/dist/types/web/search/providers/openai-compatible.d.ts +9 -0
  906. package/dist/types/web/search/providers/parallel.d.ts +15 -0
  907. package/dist/types/web/search/providers/perplexity.d.ts +38 -0
  908. package/dist/types/web/search/providers/searxng.d.ts +44 -0
  909. package/dist/types/web/search/providers/synthetic.d.ts +21 -0
  910. package/dist/types/web/search/providers/tavily.d.ts +29 -0
  911. package/dist/types/web/search/providers/utils.d.ts +52 -0
  912. package/dist/types/web/search/providers/xai.d.ts +64 -0
  913. package/dist/types/web/search/providers/zai.d.ts +28 -0
  914. package/dist/types/web/search/render.d.ts +35 -0
  915. package/dist/types/web/search/types.d.ts +364 -0
  916. package/dist/types/web/search/utils.d.ts +4 -0
  917. package/dist/types/workspace-tree.d.ts +42 -0
  918. package/examples/README.md +21 -0
  919. package/examples/custom-tools/README.md +104 -0
  920. package/examples/custom-tools/hello/index.ts +20 -0
  921. package/examples/extensions/README.md +120 -0
  922. package/examples/extensions/api-demo.ts +79 -0
  923. package/examples/extensions/chalk-logger.ts +25 -0
  924. package/examples/extensions/hello.ts +31 -0
  925. package/examples/extensions/pirate.ts +43 -0
  926. package/examples/extensions/plan-mode.ts +549 -0
  927. package/examples/extensions/reload-runtime.ts +38 -0
  928. package/examples/extensions/tools.ts +144 -0
  929. package/examples/extensions/with-deps/index.ts +36 -0
  930. package/examples/extensions/with-deps/package-lock.json +31 -0
  931. package/examples/extensions/with-deps/package.json +16 -0
  932. package/examples/hooks/README.md +56 -0
  933. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  934. package/examples/hooks/confirm-destructive.ts +58 -0
  935. package/examples/hooks/custom-compaction.ts +115 -0
  936. package/examples/hooks/dirty-repo-guard.ts +51 -0
  937. package/examples/hooks/file-trigger.ts +40 -0
  938. package/examples/hooks/git-checkpoint.ts +52 -0
  939. package/examples/hooks/handoff.ts +149 -0
  940. package/examples/hooks/permission-gate.ts +33 -0
  941. package/examples/hooks/protected-paths.ts +29 -0
  942. package/examples/hooks/qna.ts +118 -0
  943. package/examples/hooks/status-line.ts +39 -0
  944. package/examples/sdk/01-minimal.ts +21 -0
  945. package/examples/sdk/02-custom-model.ts +49 -0
  946. package/examples/sdk/03-custom-prompt.ts +46 -0
  947. package/examples/sdk/04-skills.ts +43 -0
  948. package/examples/sdk/06-extensions.ts +82 -0
  949. package/examples/sdk/06-hooks.ts +61 -0
  950. package/examples/sdk/07-context-files.ts +35 -0
  951. package/examples/sdk/08-prompt-templates.ts +41 -0
  952. package/examples/sdk/08-slash-commands.ts +46 -0
  953. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  954. package/examples/sdk/11-sessions.ts +47 -0
  955. package/examples/sdk/README.md +172 -0
  956. package/package.json +540 -0
  957. package/scripts/build-binary.ts +95 -0
  958. package/scripts/format-prompts.ts +68 -0
  959. package/scripts/generate-docs-index.ts +71 -0
  960. package/scripts/generate-template.ts +33 -0
  961. package/src/async/index.ts +2 -0
  962. package/src/async/job-manager.ts +1489 -0
  963. package/src/async/support.ts +6 -0
  964. package/src/autoresearch/command-resume.md +14 -0
  965. package/src/autoresearch/dashboard.ts +446 -0
  966. package/src/autoresearch/git.ts +319 -0
  967. package/src/autoresearch/helpers.ts +218 -0
  968. package/src/autoresearch/index.ts +536 -0
  969. package/src/autoresearch/prompt-setup.md +43 -0
  970. package/src/autoresearch/prompt.md +103 -0
  971. package/src/autoresearch/resume-message.md +10 -0
  972. package/src/autoresearch/state.ts +273 -0
  973. package/src/autoresearch/storage.ts +699 -0
  974. package/src/autoresearch/tools/init-experiment.ts +272 -0
  975. package/src/autoresearch/tools/log-experiment.ts +524 -0
  976. package/src/autoresearch/tools/run-experiment.ts +475 -0
  977. package/src/autoresearch/tools/update-notes.ts +109 -0
  978. package/src/autoresearch/types.ts +168 -0
  979. package/src/bun-imports.d.ts +28 -0
  980. package/src/capability/context-file.ts +44 -0
  981. package/src/capability/extension-module.ts +34 -0
  982. package/src/capability/extension.ts +47 -0
  983. package/src/capability/fs.ts +107 -0
  984. package/src/capability/hook.ts +40 -0
  985. package/src/capability/index.ts +436 -0
  986. package/src/capability/instruction.ts +37 -0
  987. package/src/capability/mcp.ts +74 -0
  988. package/src/capability/prompt.ts +35 -0
  989. package/src/capability/rule.ts +244 -0
  990. package/src/capability/settings.ts +34 -0
  991. package/src/capability/skill.ts +56 -0
  992. package/src/capability/slash-command.ts +40 -0
  993. package/src/capability/ssh.ts +41 -0
  994. package/src/capability/system-prompt.ts +34 -0
  995. package/src/capability/tool.ts +38 -0
  996. package/src/capability/types.ts +168 -0
  997. package/src/cli/agents-cli.ts +141 -0
  998. package/src/cli/args.ts +306 -0
  999. package/src/cli/auth-broker-cli.ts +748 -0
  1000. package/src/cli/auth-gateway-cli.ts +411 -0
  1001. package/src/cli/classify-install-target.ts +50 -0
  1002. package/src/cli/commands/init-xdg.ts +27 -0
  1003. package/src/cli/config-cli.ts +426 -0
  1004. package/src/cli/fast-help.ts +82 -0
  1005. package/src/cli/file-processor.ts +123 -0
  1006. package/src/cli/grep-cli.ts +160 -0
  1007. package/src/cli/initial-message.ts +58 -0
  1008. package/src/cli/list-models.ts +206 -0
  1009. package/src/cli/plugin-cli.ts +942 -0
  1010. package/src/cli/read-cli.ts +57 -0
  1011. package/src/cli/session-picker.ts +52 -0
  1012. package/src/cli/setup-cli.ts +675 -0
  1013. package/src/cli/shell-cli.ts +176 -0
  1014. package/src/cli/skills-cli.ts +88 -0
  1015. package/src/cli/ssh-cli.ts +179 -0
  1016. package/src/cli/stats-cli.ts +238 -0
  1017. package/src/cli/update-cli.ts +459 -0
  1018. package/src/cli/web-search-cli.ts +248 -0
  1019. package/src/cli/worktree-cli.ts +291 -0
  1020. package/src/cli.ts +225 -0
  1021. package/src/commands/acp.ts +24 -0
  1022. package/src/commands/agents.ts +57 -0
  1023. package/src/commands/auth-broker.ts +96 -0
  1024. package/src/commands/auth-gateway.ts +63 -0
  1025. package/src/commands/codex-native-hook.ts +11 -0
  1026. package/src/commands/commit.ts +46 -0
  1027. package/src/commands/config.ts +51 -0
  1028. package/src/commands/contribution-prep.ts +41 -0
  1029. package/src/commands/coordinator.ts +113 -0
  1030. package/src/commands/deep-interview.ts +39 -0
  1031. package/src/commands/gc.ts +22 -0
  1032. package/src/commands/grep.ts +48 -0
  1033. package/src/commands/harness.ts +1207 -0
  1034. package/src/commands/launch.ts +178 -0
  1035. package/src/commands/mcp-serve.ts +63 -0
  1036. package/src/commands/plugin.ts +78 -0
  1037. package/src/commands/ralplan.ts +19 -0
  1038. package/src/commands/read.ts +35 -0
  1039. package/src/commands/rlm.ts +19 -0
  1040. package/src/commands/session.ts +152 -0
  1041. package/src/commands/setup.ts +91 -0
  1042. package/src/commands/shell.ts +29 -0
  1043. package/src/commands/skills.ts +48 -0
  1044. package/src/commands/ssh.ts +60 -0
  1045. package/src/commands/state.ts +24 -0
  1046. package/src/commands/stats.ts +29 -0
  1047. package/src/commands/team.ts +216 -0
  1048. package/src/commands/ultragoal.ts +41 -0
  1049. package/src/commands/update.ts +21 -0
  1050. package/src/commands/web-search.ts +108 -0
  1051. package/src/commands/worktree.ts +56 -0
  1052. package/src/commit/agentic/agent.ts +316 -0
  1053. package/src/commit/agentic/fallback.ts +96 -0
  1054. package/src/commit/agentic/index.ts +356 -0
  1055. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  1056. package/src/commit/agentic/prompts/session-user.md +25 -0
  1057. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  1058. package/src/commit/agentic/prompts/system.md +38 -0
  1059. package/src/commit/agentic/state.ts +60 -0
  1060. package/src/commit/agentic/tools/analyze-file.ts +127 -0
  1061. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  1062. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  1063. package/src/commit/agentic/tools/git-overview.ts +81 -0
  1064. package/src/commit/agentic/tools/index.ts +54 -0
  1065. package/src/commit/agentic/tools/propose-changelog.ts +144 -0
  1066. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  1067. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  1068. package/src/commit/agentic/tools/schemas.ts +23 -0
  1069. package/src/commit/agentic/tools/split-commit.ts +238 -0
  1070. package/src/commit/agentic/topo-sort.ts +44 -0
  1071. package/src/commit/agentic/trivial.ts +51 -0
  1072. package/src/commit/agentic/validation.ts +183 -0
  1073. package/src/commit/analysis/conventional.ts +64 -0
  1074. package/src/commit/analysis/index.ts +4 -0
  1075. package/src/commit/analysis/scope.ts +242 -0
  1076. package/src/commit/analysis/summary.ts +105 -0
  1077. package/src/commit/analysis/validation.ts +66 -0
  1078. package/src/commit/changelog/detect.ts +40 -0
  1079. package/src/commit/changelog/generate.ts +97 -0
  1080. package/src/commit/changelog/index.ts +234 -0
  1081. package/src/commit/changelog/parse.ts +44 -0
  1082. package/src/commit/cli.ts +85 -0
  1083. package/src/commit/git/diff.ts +148 -0
  1084. package/src/commit/index.ts +5 -0
  1085. package/src/commit/map-reduce/index.ts +69 -0
  1086. package/src/commit/map-reduce/map-phase.ts +193 -0
  1087. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  1088. package/src/commit/map-reduce/utils.ts +9 -0
  1089. package/src/commit/message.ts +11 -0
  1090. package/src/commit/model-selection.ts +51 -0
  1091. package/src/commit/pipeline.ts +244 -0
  1092. package/src/commit/prompts/analysis-system.md +148 -0
  1093. package/src/commit/prompts/analysis-user.md +38 -0
  1094. package/src/commit/prompts/changelog-system.md +50 -0
  1095. package/src/commit/prompts/changelog-user.md +18 -0
  1096. package/src/commit/prompts/file-observer-system.md +24 -0
  1097. package/src/commit/prompts/file-observer-user.md +8 -0
  1098. package/src/commit/prompts/reduce-system.md +50 -0
  1099. package/src/commit/prompts/reduce-user.md +17 -0
  1100. package/src/commit/prompts/summary-retry.md +3 -0
  1101. package/src/commit/prompts/summary-system.md +38 -0
  1102. package/src/commit/prompts/summary-user.md +13 -0
  1103. package/src/commit/prompts/types-description.md +2 -0
  1104. package/src/commit/shared-llm.ts +77 -0
  1105. package/src/commit/types.ts +118 -0
  1106. package/src/commit/utils/exclusions.ts +42 -0
  1107. package/src/commit/utils.ts +58 -0
  1108. package/src/config/config-file.ts +232 -0
  1109. package/src/config/file-lock-gc.ts +193 -0
  1110. package/src/config/file-lock.ts +185 -0
  1111. package/src/config/keybindings.ts +510 -0
  1112. package/src/config/mcp-schema.json +230 -0
  1113. package/src/config/model-equivalence.ts +811 -0
  1114. package/src/config/model-profile-activation.ts +249 -0
  1115. package/src/config/model-profiles.ts +396 -0
  1116. package/src/config/model-registry.ts +2816 -0
  1117. package/src/config/model-resolver.ts +1336 -0
  1118. package/src/config/models-config-schema.ts +258 -0
  1119. package/src/config/prompt-templates.ts +310 -0
  1120. package/src/config/resolve-config-value.ts +94 -0
  1121. package/src/config/settings-schema.ts +3183 -0
  1122. package/src/config/settings.ts +967 -0
  1123. package/src/config/skill-settings-defaults.ts +27 -0
  1124. package/src/config.ts +212 -0
  1125. package/src/coordinator/contract.ts +22 -0
  1126. package/src/coordinator-mcp/policy.ts +160 -0
  1127. package/src/coordinator-mcp/safety.ts +80 -0
  1128. package/src/coordinator-mcp/server.ts +2006 -0
  1129. package/src/cursor.ts +392 -0
  1130. package/src/dap/client.ts +730 -0
  1131. package/src/dap/config.ts +150 -0
  1132. package/src/dap/defaults.json +211 -0
  1133. package/src/dap/index.ts +4 -0
  1134. package/src/dap/session.ts +1343 -0
  1135. package/src/dap/types.ts +600 -0
  1136. package/src/debug/crash-diagnostics.ts +223 -0
  1137. package/src/debug/index.ts +459 -0
  1138. package/src/debug/log-formatting.ts +58 -0
  1139. package/src/debug/log-viewer.ts +908 -0
  1140. package/src/debug/profiler.ts +162 -0
  1141. package/src/debug/raw-sse-buffer.ts +270 -0
  1142. package/src/debug/raw-sse.ts +213 -0
  1143. package/src/debug/report-bundle.ts +365 -0
  1144. package/src/debug/runtime-gauges.ts +20 -0
  1145. package/src/debug/system-info.ts +111 -0
  1146. package/src/deep-interview/render-middleware.ts +372 -0
  1147. package/src/defaults/skc/agent.models.grok-cli.yml +36 -0
  1148. package/src/defaults/skc/extensions/grok-build/index.ts +1 -0
  1149. package/src/defaults/skc/extensions/grok-build/package.json +7 -0
  1150. package/src/defaults/skc/extensions/grok-cli-vendor/biome.json +39 -0
  1151. package/src/defaults/skc/extensions/grok-cli-vendor/package.json +8 -0
  1152. package/src/defaults/skc/extensions/grok-cli-vendor/src/index.ts +1 -0
  1153. package/src/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.ts +155 -0
  1154. package/src/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.ts +361 -0
  1155. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.ts +57 -0
  1156. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/register.ts +99 -0
  1157. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.ts +50 -0
  1158. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.ts +56 -0
  1159. package/src/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.ts +36 -0
  1160. package/src/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.ts +44 -0
  1161. package/src/defaults/skc/skills/deep-interview/SKILL.md +879 -0
  1162. package/src/defaults/skc/skills/deep-interview/auto-answer-uncertain.md +37 -0
  1163. package/src/defaults/skc/skills/deep-interview/auto-research-greenfield.md +42 -0
  1164. package/src/defaults/skc/skills/deep-interview/lateral-review-panel.md +49 -0
  1165. package/src/defaults/skc/skills/ralplan/SKILL.md +191 -0
  1166. package/src/defaults/skc/skills/team/SKILL.md +442 -0
  1167. package/src/defaults/skc/skills/ultragoal/SKILL.md +349 -0
  1168. package/src/defaults/skc/skills/ultragoal/ai-slop-cleaner.md +61 -0
  1169. package/src/defaults/skc-defaults.ts +217 -0
  1170. package/src/defaults/skc-grok-cli.ts +22 -0
  1171. package/src/discovery/agents-md.ts +67 -0
  1172. package/src/discovery/agents.ts +230 -0
  1173. package/src/discovery/builtin.ts +932 -0
  1174. package/src/discovery/claude-plugins.ts +407 -0
  1175. package/src/discovery/claude.ts +313 -0
  1176. package/src/discovery/cline.ts +83 -0
  1177. package/src/discovery/codex.ts +330 -0
  1178. package/src/discovery/cursor.ts +220 -0
  1179. package/src/discovery/gemini.ts +383 -0
  1180. package/src/discovery/github.ts +118 -0
  1181. package/src/discovery/helpers.ts +992 -0
  1182. package/src/discovery/index.ts +76 -0
  1183. package/src/discovery/mcp-json.ts +171 -0
  1184. package/src/discovery/opencode.ts +398 -0
  1185. package/src/discovery/plugin-dir-roots.ts +28 -0
  1186. package/src/discovery/ssh.ts +153 -0
  1187. package/src/discovery/substitute-plugin-root.ts +29 -0
  1188. package/src/discovery/vscode.ts +105 -0
  1189. package/src/discovery/windsurf.ts +147 -0
  1190. package/src/edit/apply-patch/index.ts +87 -0
  1191. package/src/edit/apply-patch/parser.ts +174 -0
  1192. package/src/edit/diff.ts +873 -0
  1193. package/src/edit/file-read-cache.ts +95 -0
  1194. package/src/edit/index.ts +528 -0
  1195. package/src/edit/modes/apply-patch.lark +19 -0
  1196. package/src/edit/modes/apply-patch.ts +53 -0
  1197. package/src/edit/modes/patch.ts +1835 -0
  1198. package/src/edit/modes/replace.ts +1161 -0
  1199. package/src/edit/normalize.ts +375 -0
  1200. package/src/edit/notebook.ts +226 -0
  1201. package/src/edit/read-file.ts +43 -0
  1202. package/src/edit/renderer.ts +683 -0
  1203. package/src/edit/streaming.ts +561 -0
  1204. package/src/eval/backend.ts +43 -0
  1205. package/src/eval/index.ts +4 -0
  1206. package/src/eval/js/context-manager.ts +577 -0
  1207. package/src/eval/js/executor.ts +136 -0
  1208. package/src/eval/js/index.ts +47 -0
  1209. package/src/eval/js/shared/helpers.ts +237 -0
  1210. package/src/eval/js/shared/indirect-eval.ts +30 -0
  1211. package/src/eval/js/shared/prelude.ts +2 -0
  1212. package/src/eval/js/shared/prelude.txt +70 -0
  1213. package/src/eval/js/shared/rewrite-imports.ts +415 -0
  1214. package/src/eval/js/shared/runtime.ts +301 -0
  1215. package/src/eval/js/shared/types.ts +18 -0
  1216. package/src/eval/js/tool-bridge.ts +144 -0
  1217. package/src/eval/js/worker-core.ts +150 -0
  1218. package/src/eval/js/worker-entry.ts +24 -0
  1219. package/src/eval/js/worker-protocol.ts +41 -0
  1220. package/src/eval/py/display.ts +71 -0
  1221. package/src/eval/py/executor.ts +678 -0
  1222. package/src/eval/py/index.ts +58 -0
  1223. package/src/eval/py/kernel.ts +712 -0
  1224. package/src/eval/py/prelude.py +462 -0
  1225. package/src/eval/py/prelude.ts +3 -0
  1226. package/src/eval/py/runner.py +964 -0
  1227. package/src/eval/py/runtime.ts +331 -0
  1228. package/src/eval/py/tool-bridge.ts +137 -0
  1229. package/src/eval/types.ts +48 -0
  1230. package/src/exa/factory.ts +60 -0
  1231. package/src/exa/index.ts +27 -0
  1232. package/src/exa/mcp-client.ts +364 -0
  1233. package/src/exa/render.ts +244 -0
  1234. package/src/exa/researcher.ts +36 -0
  1235. package/src/exa/search.ts +47 -0
  1236. package/src/exa/types.ts +166 -0
  1237. package/src/exa/websets.ts +248 -0
  1238. package/src/exec/bash-executor.ts +403 -0
  1239. package/src/exec/exec.ts +53 -0
  1240. package/src/exec/idle-timeout-watchdog.ts +126 -0
  1241. package/src/exec/non-interactive-env.ts +48 -0
  1242. package/src/export/custom-share.ts +65 -0
  1243. package/src/export/html/index.ts +168 -0
  1244. package/src/export/html/template.css +1060 -0
  1245. package/src/export/html/template.generated.ts +2 -0
  1246. package/src/export/html/template.html +47 -0
  1247. package/src/export/html/template.js +2268 -0
  1248. package/src/export/html/template.macro.ts +25 -0
  1249. package/src/export/html/vendor/highlight.min.js +1213 -0
  1250. package/src/export/html/vendor/marked.min.js +6 -0
  1251. package/src/export/ttsr.ts +434 -0
  1252. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +25 -0
  1253. package/src/extensibility/custom-commands/bundled/review/index.ts +456 -0
  1254. package/src/extensibility/custom-commands/index.ts +2 -0
  1255. package/src/extensibility/custom-commands/loader.ts +238 -0
  1256. package/src/extensibility/custom-commands/types.ts +113 -0
  1257. package/src/extensibility/custom-tools/index.ts +7 -0
  1258. package/src/extensibility/custom-tools/loader.ts +245 -0
  1259. package/src/extensibility/custom-tools/types.ts +257 -0
  1260. package/src/extensibility/custom-tools/wrapper.ts +49 -0
  1261. package/src/extensibility/extensions/compact-handler.ts +40 -0
  1262. package/src/extensibility/extensions/get-commands-handler.ts +80 -0
  1263. package/src/extensibility/extensions/index.ts +16 -0
  1264. package/src/extensibility/extensions/loader.ts +551 -0
  1265. package/src/extensibility/extensions/prefix-command-bridge.ts +128 -0
  1266. package/src/extensibility/extensions/runner.ts +900 -0
  1267. package/src/extensibility/extensions/types.ts +1286 -0
  1268. package/src/extensibility/extensions/wrapper.ts +190 -0
  1269. package/src/extensibility/hooks/index.ts +5 -0
  1270. package/src/extensibility/hooks/loader.ts +257 -0
  1271. package/src/extensibility/hooks/runner.ts +425 -0
  1272. package/src/extensibility/hooks/tool-wrapper.ts +107 -0
  1273. package/src/extensibility/hooks/types.ts +599 -0
  1274. package/src/extensibility/plugins/doctor.ts +66 -0
  1275. package/src/extensibility/plugins/git-url.ts +281 -0
  1276. package/src/extensibility/plugins/index.ts +9 -0
  1277. package/src/extensibility/plugins/installer.ts +192 -0
  1278. package/src/extensibility/plugins/legacy-pi-compat.ts +336 -0
  1279. package/src/extensibility/plugins/loader.ts +288 -0
  1280. package/src/extensibility/plugins/manager.ts +731 -0
  1281. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  1282. package/src/extensibility/plugins/marketplace/fetcher.ts +317 -0
  1283. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  1284. package/src/extensibility/plugins/marketplace/manager.ts +770 -0
  1285. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  1286. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  1287. package/src/extensibility/plugins/marketplace/types.ts +191 -0
  1288. package/src/extensibility/plugins/parser.ts +105 -0
  1289. package/src/extensibility/plugins/types.ts +194 -0
  1290. package/src/extensibility/shared-events.ts +344 -0
  1291. package/src/extensibility/skc-plugins/activation.ts +87 -0
  1292. package/src/extensibility/skc-plugins/index.ts +9 -0
  1293. package/src/extensibility/skc-plugins/injection.ts +114 -0
  1294. package/src/extensibility/skc-plugins/loader.ts +131 -0
  1295. package/src/extensibility/skc-plugins/paths.ts +66 -0
  1296. package/src/extensibility/skc-plugins/schema.ts +79 -0
  1297. package/src/extensibility/skc-plugins/state.ts +29 -0
  1298. package/src/extensibility/skc-plugins/tools.ts +47 -0
  1299. package/src/extensibility/skc-plugins/types.ts +97 -0
  1300. package/src/extensibility/skc-plugins/validation.ts +76 -0
  1301. package/src/extensibility/skills.ts +423 -0
  1302. package/src/extensibility/slash-commands.ts +236 -0
  1303. package/src/extensibility/tool-proxy.ts +25 -0
  1304. package/src/extensibility/typebox.ts +418 -0
  1305. package/src/extensibility/utils.ts +44 -0
  1306. package/src/goals/index.ts +3 -0
  1307. package/src/goals/runtime.ts +419 -0
  1308. package/src/goals/state.ts +66 -0
  1309. package/src/goals/tools/goal-tool.ts +237 -0
  1310. package/src/harness-control-plane/classifier.ts +128 -0
  1311. package/src/harness-control-plane/control-endpoint.ts +148 -0
  1312. package/src/harness-control-plane/finalize.ts +340 -0
  1313. package/src/harness-control-plane/gc-adapter.ts +184 -0
  1314. package/src/harness-control-plane/operate.ts +225 -0
  1315. package/src/harness-control-plane/owner.ts +684 -0
  1316. package/src/harness-control-plane/phase-rollup.ts +96 -0
  1317. package/src/harness-control-plane/preserve.ts +102 -0
  1318. package/src/harness-control-plane/receipt-ingest.ts +127 -0
  1319. package/src/harness-control-plane/receipt-spool.ts +128 -0
  1320. package/src/harness-control-plane/receipts.ts +482 -0
  1321. package/src/harness-control-plane/rpc-adapter.ts +290 -0
  1322. package/src/harness-control-plane/seams.ts +39 -0
  1323. package/src/harness-control-plane/session-lease.ts +388 -0
  1324. package/src/harness-control-plane/state-machine.ts +119 -0
  1325. package/src/harness-control-plane/storage.ts +492 -0
  1326. package/src/harness-control-plane/types.ts +267 -0
  1327. package/src/hashline/anchors.ts +113 -0
  1328. package/src/hashline/apply.ts +737 -0
  1329. package/src/hashline/bigrams.json +649 -0
  1330. package/src/hashline/constants.ts +25 -0
  1331. package/src/hashline/diff-preview.ts +43 -0
  1332. package/src/hashline/diff.ts +56 -0
  1333. package/src/hashline/execute.ts +267 -0
  1334. package/src/hashline/grammar.lark +21 -0
  1335. package/src/hashline/hash.ts +196 -0
  1336. package/src/hashline/index.ts +13 -0
  1337. package/src/hashline/input.ts +130 -0
  1338. package/src/hashline/parser.ts +246 -0
  1339. package/src/hashline/prefixes.ts +101 -0
  1340. package/src/hashline/recovery.ts +113 -0
  1341. package/src/hashline/stream.ts +123 -0
  1342. package/src/hashline/types.ts +68 -0
  1343. package/src/hindsight/backend.ts +205 -0
  1344. package/src/hindsight/bank.ts +131 -0
  1345. package/src/hindsight/client.ts +598 -0
  1346. package/src/hindsight/config.ts +175 -0
  1347. package/src/hindsight/content.ts +210 -0
  1348. package/src/hindsight/index.ts +8 -0
  1349. package/src/hindsight/mental-models.ts +383 -0
  1350. package/src/hindsight/seeds.json +32 -0
  1351. package/src/hindsight/state.ts +469 -0
  1352. package/src/hindsight/transcript.ts +71 -0
  1353. package/src/hooks/codex-native-hooks-config.ts +143 -0
  1354. package/src/hooks/native-skill-hook.ts +305 -0
  1355. package/src/hooks/skill-keywords.ts +88 -0
  1356. package/src/hooks/skill-state.ts +753 -0
  1357. package/src/i18n/index.ts +188 -0
  1358. package/src/i18n/messages/de.messages.ts +308 -0
  1359. package/src/i18n/messages/de.settings.ts +805 -0
  1360. package/src/i18n/messages/de.ts +65 -0
  1361. package/src/i18n/messages/en.ts +86 -0
  1362. package/src/i18n/messages/es.messages.ts +314 -0
  1363. package/src/i18n/messages/es.settings.ts +798 -0
  1364. package/src/i18n/messages/es.ts +65 -0
  1365. package/src/i18n/messages/fr.messages.ts +312 -0
  1366. package/src/i18n/messages/fr.settings.ts +771 -0
  1367. package/src/i18n/messages/fr.ts +65 -0
  1368. package/src/i18n/messages/ja.messages.ts +314 -0
  1369. package/src/i18n/messages/ja.settings.ts +809 -0
  1370. package/src/i18n/messages/ja.ts +69 -0
  1371. package/src/i18n/messages/ko.messages.ts +312 -0
  1372. package/src/i18n/messages/ko.settings.ts +798 -0
  1373. package/src/i18n/messages/ko.ts +69 -0
  1374. package/src/i18n/messages/zh.messages.ts +298 -0
  1375. package/src/i18n/messages/zh.settings.ts +779 -0
  1376. package/src/i18n/messages/zh.ts +69 -0
  1377. package/src/index.ts +56 -0
  1378. package/src/internal-urls/agent-protocol.ts +176 -0
  1379. package/src/internal-urls/artifact-protocol.ts +84 -0
  1380. package/src/internal-urls/docs-index.generated.ts +106 -0
  1381. package/src/internal-urls/index.ts +21 -0
  1382. package/src/internal-urls/issue-pr-protocol.ts +577 -0
  1383. package/src/internal-urls/json-query.ts +126 -0
  1384. package/src/internal-urls/local-protocol.ts +249 -0
  1385. package/src/internal-urls/mcp-protocol.ts +151 -0
  1386. package/src/internal-urls/memory-protocol.ts +165 -0
  1387. package/src/internal-urls/parse.ts +72 -0
  1388. package/src/internal-urls/registry-helpers.ts +28 -0
  1389. package/src/internal-urls/router.ts +78 -0
  1390. package/src/internal-urls/rule-protocol.ts +38 -0
  1391. package/src/internal-urls/skc-protocol.ts +83 -0
  1392. package/src/internal-urls/skill-protocol.ts +103 -0
  1393. package/src/internal-urls/types.ts +114 -0
  1394. package/src/lsp/client.ts +1012 -0
  1395. package/src/lsp/clients/biome-client.ts +202 -0
  1396. package/src/lsp/clients/index.ts +50 -0
  1397. package/src/lsp/clients/lsp-linter-client.ts +93 -0
  1398. package/src/lsp/clients/swiftlint-client.ts +120 -0
  1399. package/src/lsp/config.ts +492 -0
  1400. package/src/lsp/defaults.json +494 -0
  1401. package/src/lsp/edits.ts +166 -0
  1402. package/src/lsp/index.ts +2283 -0
  1403. package/src/lsp/lspmux.ts +257 -0
  1404. package/src/lsp/render.ts +692 -0
  1405. package/src/lsp/startup-events.ts +13 -0
  1406. package/src/lsp/types.ts +445 -0
  1407. package/src/lsp/utils.ts +678 -0
  1408. package/src/main.ts +1080 -0
  1409. package/src/memories/index.ts +1137 -0
  1410. package/src/memories/storage.ts +577 -0
  1411. package/src/memory-backend/index.ts +4 -0
  1412. package/src/memory-backend/local-backend.ts +38 -0
  1413. package/src/memory-backend/off-backend.ts +16 -0
  1414. package/src/memory-backend/resolve.ts +24 -0
  1415. package/src/memory-backend/types.ts +79 -0
  1416. package/src/modes/acp/acp-agent.ts +2203 -0
  1417. package/src/modes/acp/acp-client-bridge.ts +154 -0
  1418. package/src/modes/acp/acp-event-mapper.ts +911 -0
  1419. package/src/modes/acp/acp-mode.ts +23 -0
  1420. package/src/modes/acp/index.ts +2 -0
  1421. package/src/modes/acp/terminal-auth.ts +37 -0
  1422. package/src/modes/bridge/auth.ts +41 -0
  1423. package/src/modes/bridge/bridge-client-bridge.ts +47 -0
  1424. package/src/modes/bridge/bridge-mode.ts +664 -0
  1425. package/src/modes/bridge/bridge-ui-context.ts +200 -0
  1426. package/src/modes/bridge/event-stream.ts +70 -0
  1427. package/src/modes/components/agent-dashboard.ts +1120 -0
  1428. package/src/modes/components/assistant-message.ts +255 -0
  1429. package/src/modes/components/bash-execution.ts +232 -0
  1430. package/src/modes/components/bordered-loader.ts +41 -0
  1431. package/src/modes/components/branch-summary-message.ts +45 -0
  1432. package/src/modes/components/btw-panel.ts +104 -0
  1433. package/src/modes/components/compaction-summary-message.ts +51 -0
  1434. package/src/modes/components/countdown-timer.ts +75 -0
  1435. package/src/modes/components/custom-editor.ts +363 -0
  1436. package/src/modes/components/custom-message.ts +65 -0
  1437. package/src/modes/components/custom-model-preset-wizard.ts +293 -0
  1438. package/src/modes/components/custom-provider-wizard.ts +318 -0
  1439. package/src/modes/components/diff.ts +363 -0
  1440. package/src/modes/components/dynamic-border.ts +25 -0
  1441. package/src/modes/components/eval-execution.ts +168 -0
  1442. package/src/modes/components/execution-shared.ts +102 -0
  1443. package/src/modes/components/extensions/extension-dashboard.ts +350 -0
  1444. package/src/modes/components/extensions/extension-list.ts +492 -0
  1445. package/src/modes/components/extensions/index.ts +9 -0
  1446. package/src/modes/components/extensions/inspector-panel.ts +317 -0
  1447. package/src/modes/components/extensions/state-manager.ts +628 -0
  1448. package/src/modes/components/extensions/types.ts +191 -0
  1449. package/src/modes/components/footer.ts +270 -0
  1450. package/src/modes/components/history-search.ts +162 -0
  1451. package/src/modes/components/hook-editor.ts +151 -0
  1452. package/src/modes/components/hook-input.ts +79 -0
  1453. package/src/modes/components/hook-message.ts +68 -0
  1454. package/src/modes/components/hook-selector.ts +582 -0
  1455. package/src/modes/components/index.ts +36 -0
  1456. package/src/modes/components/jobs-overlay-model.ts +109 -0
  1457. package/src/modes/components/jobs-overlay.ts +172 -0
  1458. package/src/modes/components/keybinding-hints.ts +65 -0
  1459. package/src/modes/components/login-dialog.ts +164 -0
  1460. package/src/modes/components/message-frame.ts +88 -0
  1461. package/src/modes/components/model-selector.ts +1477 -0
  1462. package/src/modes/components/oauth-selector.ts +253 -0
  1463. package/src/modes/components/plugin-selector.ts +95 -0
  1464. package/src/modes/components/plugin-settings.ts +488 -0
  1465. package/src/modes/components/provider-onboarding-selector.ts +98 -0
  1466. package/src/modes/components/queue-mode-selector.ts +56 -0
  1467. package/src/modes/components/read-tool-group.ts +267 -0
  1468. package/src/modes/components/runtime-mcp-add-wizard.ts +1392 -0
  1469. package/src/modes/components/session-observer-overlay.ts +839 -0
  1470. package/src/modes/components/session-selector.ts +343 -0
  1471. package/src/modes/components/settings-defs.ts +175 -0
  1472. package/src/modes/components/settings-selector.ts +662 -0
  1473. package/src/modes/components/show-images-selector.ts +45 -0
  1474. package/src/modes/components/skill-hud/render.ts +83 -0
  1475. package/src/modes/components/skill-message.ts +152 -0
  1476. package/src/modes/components/status-line/context-thresholds.ts +68 -0
  1477. package/src/modes/components/status-line/git-utils.ts +42 -0
  1478. package/src/modes/components/status-line/index.ts +4 -0
  1479. package/src/modes/components/status-line/presets.ts +119 -0
  1480. package/src/modes/components/status-line/segments.ts +590 -0
  1481. package/src/modes/components/status-line/separators.ts +55 -0
  1482. package/src/modes/components/status-line/token-rate.ts +66 -0
  1483. package/src/modes/components/status-line/types.ts +92 -0
  1484. package/src/modes/components/status-line.ts +853 -0
  1485. package/src/modes/components/theme-selector.ts +63 -0
  1486. package/src/modes/components/thinking-selector.ts +52 -0
  1487. package/src/modes/components/todo-reminder.ts +40 -0
  1488. package/src/modes/components/tool-execution.ts +853 -0
  1489. package/src/modes/components/tree-selector.ts +930 -0
  1490. package/src/modes/components/ttsr-notification.ts +80 -0
  1491. package/src/modes/components/user-message-selector.ts +141 -0
  1492. package/src/modes/components/user-message.ts +51 -0
  1493. package/src/modes/components/visual-truncate.ts +63 -0
  1494. package/src/modes/components/welcome.ts +409 -0
  1495. package/src/modes/controllers/btw-controller.ts +105 -0
  1496. package/src/modes/controllers/command-controller-shared.ts +108 -0
  1497. package/src/modes/controllers/command-controller.ts +1672 -0
  1498. package/src/modes/controllers/event-controller.ts +852 -0
  1499. package/src/modes/controllers/extension-ui-controller.ts +1017 -0
  1500. package/src/modes/controllers/input-controller.ts +1047 -0
  1501. package/src/modes/controllers/runtime-mcp-command-controller.ts +1934 -0
  1502. package/src/modes/controllers/selector-controller.ts +1407 -0
  1503. package/src/modes/controllers/ssh-command-controller.ts +384 -0
  1504. package/src/modes/controllers/todo-command-controller.ts +485 -0
  1505. package/src/modes/data/emojis.json +1 -0
  1506. package/src/modes/emoji-autocomplete.ts +285 -0
  1507. package/src/modes/index.ts +35 -0
  1508. package/src/modes/interactive-mode.ts +2677 -0
  1509. package/src/modes/jobs-observer.ts +204 -0
  1510. package/src/modes/oauth-manual-input.ts +42 -0
  1511. package/src/modes/print-mode.ts +131 -0
  1512. package/src/modes/prompt-action-autocomplete.ts +409 -0
  1513. package/src/modes/rpc/host-tools.ts +1 -0
  1514. package/src/modes/rpc/host-uris.ts +1 -0
  1515. package/src/modes/rpc/rpc-client.ts +1085 -0
  1516. package/src/modes/rpc/rpc-mode.ts +808 -0
  1517. package/src/modes/rpc/rpc-socket-security.ts +103 -0
  1518. package/src/modes/rpc/rpc-types.ts +613 -0
  1519. package/src/modes/runtime-init.ts +116 -0
  1520. package/src/modes/session-observer-registry.ts +146 -0
  1521. package/src/modes/shared/agent-wire/approval-gate.ts +151 -0
  1522. package/src/modes/shared/agent-wire/command-contract.ts +18 -0
  1523. package/src/modes/shared/agent-wire/command-dispatch.ts +466 -0
  1524. package/src/modes/shared/agent-wire/command-validation.ts +167 -0
  1525. package/src/modes/shared/agent-wire/deep-interview-gate.ts +251 -0
  1526. package/src/modes/shared/agent-wire/event-contract.ts +147 -0
  1527. package/src/modes/shared/agent-wire/event-envelope.ts +140 -0
  1528. package/src/modes/shared/agent-wire/event-observation.ts +397 -0
  1529. package/src/modes/shared/agent-wire/handshake.ts +157 -0
  1530. package/src/modes/shared/agent-wire/host-tool-bridge.ts +197 -0
  1531. package/src/modes/shared/agent-wire/host-uri-bridge.ts +236 -0
  1532. package/src/modes/shared/agent-wire/protocol.ts +46 -0
  1533. package/src/modes/shared/agent-wire/responses.ts +17 -0
  1534. package/src/modes/shared/agent-wire/scopes.ts +92 -0
  1535. package/src/modes/shared/agent-wire/session-registry.ts +109 -0
  1536. package/src/modes/shared/agent-wire/ui-request-broker.ts +150 -0
  1537. package/src/modes/shared/agent-wire/ui-result.ts +48 -0
  1538. package/src/modes/shared/agent-wire/unattended-action-policy.ts +365 -0
  1539. package/src/modes/shared/agent-wire/unattended-audit.ts +175 -0
  1540. package/src/modes/shared/agent-wire/unattended-run-controller.ts +426 -0
  1541. package/src/modes/shared/agent-wire/unattended-session.ts +219 -0
  1542. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +324 -0
  1543. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +331 -0
  1544. package/src/modes/shared.ts +55 -0
  1545. package/src/modes/theme/defaults/blue-octopus.json +126 -0
  1546. package/src/modes/theme/defaults/claude-code.json +100 -0
  1547. package/src/modes/theme/defaults/codex.json +100 -0
  1548. package/src/modes/theme/defaults/index.ts +13 -0
  1549. package/src/modes/theme/defaults/opencode.json +102 -0
  1550. package/src/modes/theme/defaults/red-octopus.json +123 -0
  1551. package/src/modes/theme/mermaid-cache.ts +29 -0
  1552. package/src/modes/theme/shimmer.ts +219 -0
  1553. package/src/modes/theme/theme-schema.json +429 -0
  1554. package/src/modes/theme/theme.ts +2452 -0
  1555. package/src/modes/types.ts +313 -0
  1556. package/src/modes/utils/abort-message.ts +41 -0
  1557. package/src/modes/utils/context-usage.ts +391 -0
  1558. package/src/modes/utils/hotkeys-markdown.ts +61 -0
  1559. package/src/modes/utils/keybinding-matchers.ts +30 -0
  1560. package/src/modes/utils/tools-markdown.ts +27 -0
  1561. package/src/modes/utils/ui-helpers.ts +749 -0
  1562. package/src/plan-mode/approved-plan.ts +163 -0
  1563. package/src/plan-mode/state.ts +6 -0
  1564. package/src/prompts/agents/architect.md +92 -0
  1565. package/src/prompts/agents/critic.md +65 -0
  1566. package/src/prompts/agents/executor.md +63 -0
  1567. package/src/prompts/agents/explore.md +58 -0
  1568. package/src/prompts/agents/frontmatter.md +14 -0
  1569. package/src/prompts/agents/init.md +34 -0
  1570. package/src/prompts/agents/plan.md +49 -0
  1571. package/src/prompts/agents/planner.md +60 -0
  1572. package/src/prompts/agents/reviewer.md +141 -0
  1573. package/src/prompts/agents/task.md +16 -0
  1574. package/src/prompts/ci-green-request.md +36 -0
  1575. package/src/prompts/goals/goal-continuation.md +26 -0
  1576. package/src/prompts/goals/goal-mode-active.md +22 -0
  1577. package/src/prompts/memories/consolidation.md +30 -0
  1578. package/src/prompts/memories/read-path.md +10 -0
  1579. package/src/prompts/memories/stage_one_input.md +6 -0
  1580. package/src/prompts/memories/stage_one_system.md +21 -0
  1581. package/src/prompts/memories/unavailable.md +9 -0
  1582. package/src/prompts/review-request.md +70 -0
  1583. package/src/prompts/system/agent-creation-architect.md +75 -0
  1584. package/src/prompts/system/agent-creation-user.md +6 -0
  1585. package/src/prompts/system/auto-continue.md +1 -0
  1586. package/src/prompts/system/btw-user.md +8 -0
  1587. package/src/prompts/system/commit-message-system.md +2 -0
  1588. package/src/prompts/system/custom-system-prompt.md +64 -0
  1589. package/src/prompts/system/eager-todo.md +13 -0
  1590. package/src/prompts/system/irc-incoming.md +8 -0
  1591. package/src/prompts/system/plan-mode-active.md +116 -0
  1592. package/src/prompts/system/plan-mode-approved.md +28 -0
  1593. package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
  1594. package/src/prompts/system/plan-mode-reference.md +14 -0
  1595. package/src/prompts/system/plan-mode-subagent.md +34 -0
  1596. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1597. package/src/prompts/system/project-prompt.md +46 -0
  1598. package/src/prompts/system/rlm-report-command.md +1 -0
  1599. package/src/prompts/system/rlm-research.md +23 -0
  1600. package/src/prompts/system/subagent-system-prompt.md +60 -0
  1601. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1602. package/src/prompts/system/subagent-yield-reminder.md +12 -0
  1603. package/src/prompts/system/system-prompt.md +275 -0
  1604. package/src/prompts/system/title-system.md +2 -0
  1605. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1606. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1607. package/src/prompts/system/web-search.md +25 -0
  1608. package/src/prompts/tools/apply-patch.md +65 -0
  1609. package/src/prompts/tools/ask.md +29 -0
  1610. package/src/prompts/tools/ast-edit.md +39 -0
  1611. package/src/prompts/tools/ast-grep.md +42 -0
  1612. package/src/prompts/tools/async-result.md +8 -0
  1613. package/src/prompts/tools/bash.md +69 -0
  1614. package/src/prompts/tools/browser.md +75 -0
  1615. package/src/prompts/tools/calculator.md +10 -0
  1616. package/src/prompts/tools/checkpoint.md +16 -0
  1617. package/src/prompts/tools/computer.md +74 -0
  1618. package/src/prompts/tools/cron.md +25 -0
  1619. package/src/prompts/tools/debug.md +33 -0
  1620. package/src/prompts/tools/eval.md +75 -0
  1621. package/src/prompts/tools/find.md +34 -0
  1622. package/src/prompts/tools/github.md +20 -0
  1623. package/src/prompts/tools/goal.md +21 -0
  1624. package/src/prompts/tools/hashline.md +130 -0
  1625. package/src/prompts/tools/image-gen.md +7 -0
  1626. package/src/prompts/tools/inspect-image-system.md +20 -0
  1627. package/src/prompts/tools/inspect-image.md +32 -0
  1628. package/src/prompts/tools/irc.md +49 -0
  1629. package/src/prompts/tools/job.md +27 -0
  1630. package/src/prompts/tools/lsp.md +42 -0
  1631. package/src/prompts/tools/monitor.md +30 -0
  1632. package/src/prompts/tools/patch.md +70 -0
  1633. package/src/prompts/tools/read.md +82 -0
  1634. package/src/prompts/tools/recall.md +6 -0
  1635. package/src/prompts/tools/recipe.md +16 -0
  1636. package/src/prompts/tools/reflect.md +6 -0
  1637. package/src/prompts/tools/render-mermaid.md +9 -0
  1638. package/src/prompts/tools/replace.md +36 -0
  1639. package/src/prompts/tools/resolve.md +9 -0
  1640. package/src/prompts/tools/retain.md +7 -0
  1641. package/src/prompts/tools/rewind.md +13 -0
  1642. package/src/prompts/tools/search-tool-bm25.md +33 -0
  1643. package/src/prompts/tools/search.md +25 -0
  1644. package/src/prompts/tools/skill.md +28 -0
  1645. package/src/prompts/tools/ssh.md +35 -0
  1646. package/src/prompts/tools/subagent.md +56 -0
  1647. package/src/prompts/tools/task-summary.md +22 -0
  1648. package/src/prompts/tools/task.md +86 -0
  1649. package/src/prompts/tools/todo-write.md +50 -0
  1650. package/src/prompts/tools/vim.md +98 -0
  1651. package/src/prompts/tools/web-search.md +17 -0
  1652. package/src/prompts/tools/write.md +14 -0
  1653. package/src/registry/agent-registry.ts +140 -0
  1654. package/src/reminders/star-reminder.ts +420 -0
  1655. package/src/rlm/artifacts.ts +60 -0
  1656. package/src/rlm/complete-research-tool.ts +163 -0
  1657. package/src/rlm/data-context.ts +26 -0
  1658. package/src/rlm/index.ts +339 -0
  1659. package/src/rlm/notebook.ts +108 -0
  1660. package/src/rlm/preset.ts +76 -0
  1661. package/src/rlm/python-tool.ts +68 -0
  1662. package/src/rlm/report.ts +70 -0
  1663. package/src/rlm/types.ts +40 -0
  1664. package/src/runtime/process-lifecycle.ts +400 -0
  1665. package/src/runtime-mcp/client.ts +485 -0
  1666. package/src/runtime-mcp/config-writer.ts +225 -0
  1667. package/src/runtime-mcp/config.ts +365 -0
  1668. package/src/runtime-mcp/discoverable-tool-metadata.ts +25 -0
  1669. package/src/runtime-mcp/index.ts +29 -0
  1670. package/src/runtime-mcp/json-rpc.ts +84 -0
  1671. package/src/runtime-mcp/loader.ts +124 -0
  1672. package/src/runtime-mcp/manager.ts +1331 -0
  1673. package/src/runtime-mcp/oauth-discovery.ts +349 -0
  1674. package/src/runtime-mcp/oauth-flow.ts +409 -0
  1675. package/src/runtime-mcp/render.ts +123 -0
  1676. package/src/runtime-mcp/smithery-auth.ts +104 -0
  1677. package/src/runtime-mcp/smithery-connect.ts +145 -0
  1678. package/src/runtime-mcp/smithery-registry.ts +477 -0
  1679. package/src/runtime-mcp/tool-bridge.ts +416 -0
  1680. package/src/runtime-mcp/tool-cache.ts +117 -0
  1681. package/src/runtime-mcp/transports/http.ts +504 -0
  1682. package/src/runtime-mcp/transports/index.ts +6 -0
  1683. package/src/runtime-mcp/transports/stdio.ts +352 -0
  1684. package/src/runtime-mcp/types.ts +426 -0
  1685. package/src/sdk.ts +2290 -0
  1686. package/src/secrets/index.ts +116 -0
  1687. package/src/secrets/obfuscator.ts +352 -0
  1688. package/src/secrets/regex.ts +21 -0
  1689. package/src/session/agent-session.ts +10226 -0
  1690. package/src/session/agent-storage.ts +466 -0
  1691. package/src/session/artifacts.ts +150 -0
  1692. package/src/session/auth-broker-config.ts +102 -0
  1693. package/src/session/auth-storage.ts +23 -0
  1694. package/src/session/blob-store.ts +428 -0
  1695. package/src/session/client-bridge.ts +85 -0
  1696. package/src/session/contribution-prep.ts +320 -0
  1697. package/src/session/history-storage.ts +332 -0
  1698. package/src/session/messages.ts +406 -0
  1699. package/src/session/session-dump-format.ts +209 -0
  1700. package/src/session/session-manager.ts +4049 -0
  1701. package/src/session/session-storage.ts +415 -0
  1702. package/src/session/streaming-output.ts +1269 -0
  1703. package/src/session/tool-choice-queue.ts +236 -0
  1704. package/src/session/yield-queue.ts +155 -0
  1705. package/src/setup/credential-import.ts +429 -0
  1706. package/src/setup/hermes/templates/operator-instructions.v1.md +36 -0
  1707. package/src/setup/hermes-setup.ts +484 -0
  1708. package/src/setup/model-onboarding-guidance.ts +48 -0
  1709. package/src/setup/provider-onboarding.ts +358 -0
  1710. package/src/skc-runtime/cli-write-receipt.ts +31 -0
  1711. package/src/skc-runtime/deep-interview-recorder.ts +457 -0
  1712. package/src/skc-runtime/deep-interview-runtime.ts +639 -0
  1713. package/src/skc-runtime/deep-interview-state.ts +324 -0
  1714. package/src/skc-runtime/gc-render.ts +70 -0
  1715. package/src/skc-runtime/gc-runtime.ts +403 -0
  1716. package/src/skc-runtime/goal-mode-request.ts +223 -0
  1717. package/src/skc-runtime/launch-tmux.ts +423 -0
  1718. package/src/skc-runtime/launch-worktree.ts +302 -0
  1719. package/src/skc-runtime/ledger-event-renderer.ts +164 -0
  1720. package/src/skc-runtime/ralplan-runtime.ts +877 -0
  1721. package/src/skc-runtime/restricted-role-agent-bash.ts +5 -0
  1722. package/src/skc-runtime/session-state-sidecar.ts +177 -0
  1723. package/src/skc-runtime/state-graph.ts +86 -0
  1724. package/src/skc-runtime/state-migrations.ts +179 -0
  1725. package/src/skc-runtime/state-renderer.ts +354 -0
  1726. package/src/skc-runtime/state-runtime.ts +2023 -0
  1727. package/src/skc-runtime/state-schema.ts +192 -0
  1728. package/src/skc-runtime/state-validation.ts +49 -0
  1729. package/src/skc-runtime/state-writer.ts +1012 -0
  1730. package/src/skc-runtime/team-gc.ts +49 -0
  1731. package/src/skc-runtime/team-runtime.ts +4355 -0
  1732. package/src/skc-runtime/tmux-common.ts +172 -0
  1733. package/src/skc-runtime/tmux-gc.ts +239 -0
  1734. package/src/skc-runtime/tmux-sessions.ts +271 -0
  1735. package/src/skc-runtime/ultragoal-guard.ts +455 -0
  1736. package/src/skc-runtime/ultragoal-runtime.ts +3684 -0
  1737. package/src/skc-runtime/workflow-command-ref.ts +239 -0
  1738. package/src/skc-runtime/workflow-manifest.generated.json +1676 -0
  1739. package/src/skc-runtime/workflow-manifest.ts +454 -0
  1740. package/src/skill-state/active-state.ts +839 -0
  1741. package/src/skill-state/deep-interview-mutation-guard.ts +452 -0
  1742. package/src/skill-state/initial-phase.ts +19 -0
  1743. package/src/skill-state/workflow-hud.ts +274 -0
  1744. package/src/skill-state/workflow-state-contract.ts +150 -0
  1745. package/src/skill-state/workflow-state-version.ts +3 -0
  1746. package/src/slash-commands/acp-builtins.ts +55 -0
  1747. package/src/slash-commands/builtin-registry.ts +1206 -0
  1748. package/src/slash-commands/helpers/context-report.ts +149 -0
  1749. package/src/slash-commands/helpers/fast-status-report.ts +111 -0
  1750. package/src/slash-commands/helpers/format.ts +46 -0
  1751. package/src/slash-commands/helpers/mcp.ts +532 -0
  1752. package/src/slash-commands/helpers/parse.ts +85 -0
  1753. package/src/slash-commands/helpers/ssh.ts +195 -0
  1754. package/src/slash-commands/helpers/todo.ts +279 -0
  1755. package/src/slash-commands/helpers/usage-report.ts +91 -0
  1756. package/src/slash-commands/types.ts +125 -0
  1757. package/src/ssh/config-writer.ts +183 -0
  1758. package/src/ssh/connection-manager.ts +482 -0
  1759. package/src/ssh/ssh-executor.ts +133 -0
  1760. package/src/ssh/sshfs-mount.ts +140 -0
  1761. package/src/ssh/utils.ts +8 -0
  1762. package/src/stt/downloader.ts +71 -0
  1763. package/src/stt/index.ts +3 -0
  1764. package/src/stt/recorder.ts +351 -0
  1765. package/src/stt/setup.ts +52 -0
  1766. package/src/stt/stt-controller.ts +160 -0
  1767. package/src/stt/transcribe.py +70 -0
  1768. package/src/stt/transcriber.ts +91 -0
  1769. package/src/system-prompt.ts +581 -0
  1770. package/src/task/agents.ts +164 -0
  1771. package/src/task/commands.ts +131 -0
  1772. package/src/task/discovery.ts +136 -0
  1773. package/src/task/executor.ts +1733 -0
  1774. package/src/task/fork-context-advisory.ts +99 -0
  1775. package/src/task/id.ts +33 -0
  1776. package/src/task/index.ts +1788 -0
  1777. package/src/task/name-generator.ts +1577 -0
  1778. package/src/task/output-manager.ts +108 -0
  1779. package/src/task/parallel.ts +116 -0
  1780. package/src/task/receipt.ts +304 -0
  1781. package/src/task/render.ts +1101 -0
  1782. package/src/task/roi-reconciliation.ts +90 -0
  1783. package/src/task/simple-mode.ts +27 -0
  1784. package/src/task/skc-command.ts +26 -0
  1785. package/src/task/spawn-gate.ts +132 -0
  1786. package/src/task/subprocess-tool-registry.ts +88 -0
  1787. package/src/task/types.ts +431 -0
  1788. package/src/task/worktree.ts +506 -0
  1789. package/src/thinking-metadata.ts +51 -0
  1790. package/src/thinking.ts +73 -0
  1791. package/src/tool-discovery/tool-index.ts +400 -0
  1792. package/src/tools/archive-reader.ts +330 -0
  1793. package/src/tools/ask.ts +998 -0
  1794. package/src/tools/ast-edit.ts +550 -0
  1795. package/src/tools/ast-grep.ts +424 -0
  1796. package/src/tools/auto-generated-guard.ts +305 -0
  1797. package/src/tools/bash-allowed-prefixes.ts +252 -0
  1798. package/src/tools/bash-command-fixup.ts +37 -0
  1799. package/src/tools/bash-interactive.ts +388 -0
  1800. package/src/tools/bash-interceptor.ts +67 -0
  1801. package/src/tools/bash-pty-selection.ts +14 -0
  1802. package/src/tools/bash-skill-urls.ts +248 -0
  1803. package/src/tools/bash.ts +1302 -0
  1804. package/src/tools/browser/actions.ts +189 -0
  1805. package/src/tools/browser/attach.ts +275 -0
  1806. package/src/tools/browser/launch.ts +651 -0
  1807. package/src/tools/browser/readable.ts +95 -0
  1808. package/src/tools/browser/registry.ts +384 -0
  1809. package/src/tools/browser/render.ts +220 -0
  1810. package/src/tools/browser/tab-protocol.ts +105 -0
  1811. package/src/tools/browser/tab-supervisor.ts +599 -0
  1812. package/src/tools/browser/tab-worker-entry.ts +21 -0
  1813. package/src/tools/browser/tab-worker.ts +1054 -0
  1814. package/src/tools/browser.ts +458 -0
  1815. package/src/tools/calculator.ts +540 -0
  1816. package/src/tools/checkpoint.ts +134 -0
  1817. package/src/tools/computer/render.ts +78 -0
  1818. package/src/tools/computer.ts +640 -0
  1819. package/src/tools/conflict-detect.ts +672 -0
  1820. package/src/tools/context.ts +39 -0
  1821. package/src/tools/cron.ts +709 -0
  1822. package/src/tools/debug.ts +1014 -0
  1823. package/src/tools/eval.ts +1101 -0
  1824. package/src/tools/fetch.ts +1482 -0
  1825. package/src/tools/file-recorder.ts +35 -0
  1826. package/src/tools/find.ts +543 -0
  1827. package/src/tools/fs-cache-invalidation.ts +28 -0
  1828. package/src/tools/gh-format.ts +12 -0
  1829. package/src/tools/gh-renderer.ts +428 -0
  1830. package/src/tools/gh.ts +3737 -0
  1831. package/src/tools/github-cache.ts +548 -0
  1832. package/src/tools/grouped-file-output.ts +96 -0
  1833. package/src/tools/hindsight-recall.ts +66 -0
  1834. package/src/tools/hindsight-reflect.ts +55 -0
  1835. package/src/tools/hindsight-retain.ts +54 -0
  1836. package/src/tools/image-gen.ts +1284 -0
  1837. package/src/tools/index.ts +595 -0
  1838. package/src/tools/inspect-image-renderer.ts +103 -0
  1839. package/src/tools/inspect-image.ts +167 -0
  1840. package/src/tools/irc.ts +239 -0
  1841. package/src/tools/job.ts +614 -0
  1842. package/src/tools/json-tree.ts +256 -0
  1843. package/src/tools/jtd-to-json-schema.ts +219 -0
  1844. package/src/tools/jtd-to-typescript.ts +136 -0
  1845. package/src/tools/jtd-utils.ts +102 -0
  1846. package/src/tools/list-limit.ts +40 -0
  1847. package/src/tools/match-line-format.ts +22 -0
  1848. package/src/tools/monitor.ts +252 -0
  1849. package/src/tools/output-meta.ts +754 -0
  1850. package/src/tools/path-utils.ts +741 -0
  1851. package/src/tools/plan-mode-guard.ts +68 -0
  1852. package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
  1853. package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
  1854. package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
  1855. package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
  1856. package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
  1857. package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
  1858. package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
  1859. package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
  1860. package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
  1861. package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
  1862. package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
  1863. package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
  1864. package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
  1865. package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
  1866. package/src/tools/read.ts +2332 -0
  1867. package/src/tools/recipe/index.ts +80 -0
  1868. package/src/tools/recipe/render.ts +19 -0
  1869. package/src/tools/recipe/runner.ts +219 -0
  1870. package/src/tools/recipe/runners/cargo.ts +131 -0
  1871. package/src/tools/recipe/runners/index.ts +8 -0
  1872. package/src/tools/recipe/runners/just.ts +73 -0
  1873. package/src/tools/recipe/runners/make.ts +101 -0
  1874. package/src/tools/recipe/runners/pkg.ts +167 -0
  1875. package/src/tools/recipe/runners/task.ts +72 -0
  1876. package/src/tools/render-mermaid.ts +68 -0
  1877. package/src/tools/render-utils.ts +774 -0
  1878. package/src/tools/renderers.ts +79 -0
  1879. package/src/tools/resolve.ts +333 -0
  1880. package/src/tools/review.ts +252 -0
  1881. package/src/tools/search-tool-bm25.ts +360 -0
  1882. package/src/tools/search.ts +787 -0
  1883. package/src/tools/skill.ts +170 -0
  1884. package/src/tools/sqlite-reader.ts +750 -0
  1885. package/src/tools/ssh.ts +310 -0
  1886. package/src/tools/subagent-render.ts +268 -0
  1887. package/src/tools/subagent.ts +862 -0
  1888. package/src/tools/todo-write.ts +695 -0
  1889. package/src/tools/tool-errors.ts +62 -0
  1890. package/src/tools/tool-result.ts +86 -0
  1891. package/src/tools/tool-timeouts.ts +31 -0
  1892. package/src/tools/ultragoal-ask-guard.ts +39 -0
  1893. package/src/tools/vim.ts +949 -0
  1894. package/src/tools/write.ts +953 -0
  1895. package/src/tools/yield.ts +268 -0
  1896. package/src/tui/code-cell.ts +201 -0
  1897. package/src/tui/file-list.ts +55 -0
  1898. package/src/tui/hyperlink.ts +126 -0
  1899. package/src/tui/index.ts +12 -0
  1900. package/src/tui/output-block.ts +150 -0
  1901. package/src/tui/status-line.ts +39 -0
  1902. package/src/tui/tree-list.ts +84 -0
  1903. package/src/tui/types.ts +15 -0
  1904. package/src/tui/utils.ts +103 -0
  1905. package/src/utils/changelog.ts +121 -0
  1906. package/src/utils/clipboard.ts +156 -0
  1907. package/src/utils/command-args.ts +76 -0
  1908. package/src/utils/commit-message-generator.ts +135 -0
  1909. package/src/utils/edit-mode.ts +42 -0
  1910. package/src/utils/event-bus.ts +33 -0
  1911. package/src/utils/external-editor.ts +65 -0
  1912. package/src/utils/file-display-mode.ts +45 -0
  1913. package/src/utils/file-mentions.ts +376 -0
  1914. package/src/utils/git.ts +1536 -0
  1915. package/src/utils/image-loading.ts +102 -0
  1916. package/src/utils/image-resize.ts +309 -0
  1917. package/src/utils/lang-from-path.ts +239 -0
  1918. package/src/utils/markit.ts +89 -0
  1919. package/src/utils/open.ts +20 -0
  1920. package/src/utils/session-color.ts +43 -0
  1921. package/src/utils/shell-snapshot.ts +187 -0
  1922. package/src/utils/sixel.ts +69 -0
  1923. package/src/utils/title-generator.ts +237 -0
  1924. package/src/utils/tool-choice.ts +62 -0
  1925. package/src/utils/tools-manager.ts +363 -0
  1926. package/src/vim/buffer.ts +309 -0
  1927. package/src/vim/commands.ts +382 -0
  1928. package/src/vim/engine.ts +2409 -0
  1929. package/src/vim/parser.ts +134 -0
  1930. package/src/vim/render.ts +252 -0
  1931. package/src/vim/types.ts +197 -0
  1932. package/src/web/kagi.ts +183 -0
  1933. package/src/web/parallel.ts +349 -0
  1934. package/src/web/scrapers/artifacthub.ts +207 -0
  1935. package/src/web/scrapers/arxiv.ts +83 -0
  1936. package/src/web/scrapers/aur.ts +162 -0
  1937. package/src/web/scrapers/biorxiv.ts +133 -0
  1938. package/src/web/scrapers/bluesky.ts +262 -0
  1939. package/src/web/scrapers/brew.ts +172 -0
  1940. package/src/web/scrapers/cheatsh.ts +68 -0
  1941. package/src/web/scrapers/chocolatey.ts +196 -0
  1942. package/src/web/scrapers/choosealicense.ts +95 -0
  1943. package/src/web/scrapers/cisa-kev.ts +87 -0
  1944. package/src/web/scrapers/clojars.ts +154 -0
  1945. package/src/web/scrapers/coingecko.ts +177 -0
  1946. package/src/web/scrapers/crates-io.ts +97 -0
  1947. package/src/web/scrapers/crossref.ts +136 -0
  1948. package/src/web/scrapers/devto.ts +147 -0
  1949. package/src/web/scrapers/discogs.ts +306 -0
  1950. package/src/web/scrapers/discourse.ts +197 -0
  1951. package/src/web/scrapers/dockerhub.ts +138 -0
  1952. package/src/web/scrapers/docs-rs.ts +653 -0
  1953. package/src/web/scrapers/fdroid.ts +134 -0
  1954. package/src/web/scrapers/firefox-addons.ts +191 -0
  1955. package/src/web/scrapers/flathub.ts +223 -0
  1956. package/src/web/scrapers/github-gist.ts +58 -0
  1957. package/src/web/scrapers/github.ts +452 -0
  1958. package/src/web/scrapers/gitlab.ts +401 -0
  1959. package/src/web/scrapers/go-pkg.ts +266 -0
  1960. package/src/web/scrapers/hackage.ts +140 -0
  1961. package/src/web/scrapers/hackernews.ts +189 -0
  1962. package/src/web/scrapers/hex.ts +105 -0
  1963. package/src/web/scrapers/huggingface.ts +321 -0
  1964. package/src/web/scrapers/iacr.ts +89 -0
  1965. package/src/web/scrapers/index.ts +252 -0
  1966. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1967. package/src/web/scrapers/lemmy.ts +203 -0
  1968. package/src/web/scrapers/lobsters.ts +175 -0
  1969. package/src/web/scrapers/mastodon.ts +292 -0
  1970. package/src/web/scrapers/maven.ts +138 -0
  1971. package/src/web/scrapers/mdn.ts +173 -0
  1972. package/src/web/scrapers/metacpan.ts +222 -0
  1973. package/src/web/scrapers/musicbrainz.ts +250 -0
  1974. package/src/web/scrapers/npm.ts +98 -0
  1975. package/src/web/scrapers/nuget.ts +183 -0
  1976. package/src/web/scrapers/nvd.ts +222 -0
  1977. package/src/web/scrapers/ollama.ts +239 -0
  1978. package/src/web/scrapers/open-vsx.ts +106 -0
  1979. package/src/web/scrapers/opencorporates.ts +292 -0
  1980. package/src/web/scrapers/openlibrary.ts +336 -0
  1981. package/src/web/scrapers/orcid.ts +286 -0
  1982. package/src/web/scrapers/osv.ts +176 -0
  1983. package/src/web/scrapers/packagist.ts +160 -0
  1984. package/src/web/scrapers/pub-dev.ts +143 -0
  1985. package/src/web/scrapers/pubmed.ts +211 -0
  1986. package/src/web/scrapers/pypi.ts +112 -0
  1987. package/src/web/scrapers/rawg.ts +110 -0
  1988. package/src/web/scrapers/readthedocs.ts +120 -0
  1989. package/src/web/scrapers/reddit.ts +95 -0
  1990. package/src/web/scrapers/repology.ts +251 -0
  1991. package/src/web/scrapers/rfc.ts +201 -0
  1992. package/src/web/scrapers/rubygems.ts +103 -0
  1993. package/src/web/scrapers/searchcode.ts +189 -0
  1994. package/src/web/scrapers/sec-edgar.ts +261 -0
  1995. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1996. package/src/web/scrapers/snapcraft.ts +187 -0
  1997. package/src/web/scrapers/sourcegraph.ts +336 -0
  1998. package/src/web/scrapers/spdx.ts +108 -0
  1999. package/src/web/scrapers/spotify.ts +198 -0
  2000. package/src/web/scrapers/stackoverflow.ts +120 -0
  2001. package/src/web/scrapers/terraform.ts +277 -0
  2002. package/src/web/scrapers/tldr.ts +47 -0
  2003. package/src/web/scrapers/twitter.ts +93 -0
  2004. package/src/web/scrapers/types.ts +318 -0
  2005. package/src/web/scrapers/utils.ts +109 -0
  2006. package/src/web/scrapers/vimeo.ts +133 -0
  2007. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  2008. package/src/web/scrapers/w3c.ts +156 -0
  2009. package/src/web/scrapers/wikidata.ts +344 -0
  2010. package/src/web/scrapers/wikipedia.ts +84 -0
  2011. package/src/web/scrapers/youtube.ts +319 -0
  2012. package/src/web/search/index.ts +326 -0
  2013. package/src/web/search/provider.ts +324 -0
  2014. package/src/web/search/providers/anthropic.ts +302 -0
  2015. package/src/web/search/providers/base.ts +94 -0
  2016. package/src/web/search/providers/brave.ts +149 -0
  2017. package/src/web/search/providers/codex.ts +557 -0
  2018. package/src/web/search/providers/duckduckgo.ts +279 -0
  2019. package/src/web/search/providers/exa.ts +197 -0
  2020. package/src/web/search/providers/gemini.ts +455 -0
  2021. package/src/web/search/providers/jina.ts +101 -0
  2022. package/src/web/search/providers/kagi.ts +75 -0
  2023. package/src/web/search/providers/kimi.ts +171 -0
  2024. package/src/web/search/providers/openai-compatible.ts +151 -0
  2025. package/src/web/search/providers/parallel.ts +210 -0
  2026. package/src/web/search/providers/perplexity.ts +575 -0
  2027. package/src/web/search/providers/searxng.ts +309 -0
  2028. package/src/web/search/providers/synthetic.ts +108 -0
  2029. package/src/web/search/providers/tavily.ts +173 -0
  2030. package/src/web/search/providers/utils.ts +128 -0
  2031. package/src/web/search/providers/xai.ts +511 -0
  2032. package/src/web/search/providers/zai.ts +320 -0
  2033. package/src/web/search/render.ts +306 -0
  2034. package/src/web/search/types.ts +473 -0
  2035. package/src/web/search/utils.ts +17 -0
  2036. package/src/workspace-tree.ts +286 -0
@@ -0,0 +1,2023 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import type { WorkflowHudSummary } from "../skill-state/active-state";
4
+ import {
5
+ applyHandoffToActiveState,
6
+ CANONICAL_SKC_WORKFLOW_SKILLS,
7
+ type CanonicalSkcWorkflowSkill,
8
+ listActiveSkills,
9
+ readVisibleSkillActiveState,
10
+ syncSkillActiveState,
11
+ } from "../skill-state/active-state";
12
+ import { initialPhaseForSkill } from "../skill-state/initial-phase";
13
+ import {
14
+ buildRalplanHudSummary,
15
+ buildTeamHudSummary,
16
+ buildUltragoalHudSummary,
17
+ deriveDeepInterviewHud,
18
+ } from "../skill-state/workflow-hud";
19
+ import {
20
+ type AuditEntry,
21
+ buildWorkflowStateReceipt,
22
+ canonicalWorkflowSkill,
23
+ describeWorkflowStateContract,
24
+ WORKFLOW_STATE_VERSION,
25
+ type WorkflowStateMutationOwner,
26
+ type WorkflowStateReceipt,
27
+ } from "../skill-state/workflow-state-contract";
28
+ import { renderCliWriteReceipt } from "./cli-write-receipt";
29
+ import { mergeDeepInterviewEnvelope, normalizeDeepInterviewEnvelope } from "./deep-interview-state";
30
+ import { renderStateGraph, type StateGraphFormat } from "./state-graph";
31
+ import { migrateAndPersistLegacyState, migrateWorkflowState } from "./state-migrations";
32
+ import {
33
+ buildStateStatusSummary,
34
+ compactProjectStateJson,
35
+ projectStateFields,
36
+ renderContractMarkdown,
37
+ renderHistoryMarkdown,
38
+ renderStateMarkdown,
39
+ renderStateStatusLine,
40
+ STATE_FIELD_ALLOWLIST,
41
+ type StateProjectionField,
42
+ } from "./state-renderer";
43
+ import { validateWorkflowStateEnvelope } from "./state-validation";
44
+ import {
45
+ appendAuditEntry,
46
+ beginWorkflowTransactionJournal,
47
+ completeWorkflowTransactionJournal,
48
+ detectWorkflowEnvelopeIntegrityMismatch,
49
+ type GenericHardPruneTarget,
50
+ hardPrune,
51
+ readExistingStateForMutation,
52
+ type StateWriterAuditContext,
53
+ softDelete,
54
+ updateWorkflowTransactionJournal,
55
+ type WorkflowEnvelopeIntegrityMismatch,
56
+ writeWorkflowEnvelopeAtomic,
57
+ } from "./state-writer";
58
+ import { getSkillManifest, isKnownWorkflowState, isValidTransition, typedArgsFor } from "./workflow-manifest";
59
+
60
+ /**
61
+ * Native implementation of the `skc state read|write|clear` command surface.
62
+ *
63
+ * Simple file-receipt operations against `.skc/state/[sessions/<id>/]<mode>-state.json` and
64
+ * `.skc/state/[sessions/<id>/]skill-active-state.json`. This is the sanctioned CLI mediator for
65
+ * the mutation-guarded `.skc/state` ACL — agents call it instead of editing those files directly.
66
+ */
67
+
68
+ export interface StateCommandResult {
69
+ status: number;
70
+ stdout?: string;
71
+ stderr?: string;
72
+ }
73
+
74
+ const SKILL_ACTIVE_STATE_FILE = "skill-active-state.json";
75
+ const PATH_COMPONENT_RE = /^[A-Za-z0-9_-][A-Za-z0-9._-]{0,63}$/;
76
+ const KNOWN_MODES: readonly string[] = CANONICAL_SKC_WORKFLOW_SKILLS;
77
+
78
+ class StateCommandError extends Error {
79
+ constructor(
80
+ public readonly exitStatus: number,
81
+ message: string,
82
+ ) {
83
+ super(message);
84
+ this.name = "StateCommandError";
85
+ }
86
+ }
87
+
88
+ function flagValue(args: readonly string[], flag: string): string | undefined {
89
+ const index = args.indexOf(flag);
90
+ if (index < 0) return undefined;
91
+ return args[index + 1];
92
+ }
93
+
94
+ function hasFlag(args: readonly string[], flag: string): boolean {
95
+ return args.includes(flag);
96
+ }
97
+
98
+ const GRAPH_FORMATS = new Set(["ascii", "mermaid", "dot"]);
99
+ const FLAGS_WITH_VALUES = new Set([
100
+ "--input",
101
+ "--mode",
102
+ "--session-id",
103
+ "--thread-id",
104
+ "--turn-id",
105
+ "--to",
106
+ "--skill",
107
+ "--format",
108
+ "--older-than",
109
+ "--status",
110
+ "--fields",
111
+ "--since",
112
+ "--limit",
113
+ ]);
114
+ const ACTION_NAMES = new Set([
115
+ "read",
116
+ "write",
117
+ "clear",
118
+ "contract",
119
+ "handoff",
120
+ "graph",
121
+ "prune",
122
+ "gc",
123
+ "migrate",
124
+ "status",
125
+ "doctor",
126
+ ]);
127
+ const BOOLEAN_FLAGS = new Set([
128
+ "--json",
129
+ "--replace",
130
+ "--hard",
131
+ "--dry-run",
132
+ "--migrate",
133
+ "--compact",
134
+ "--history",
135
+ "--force",
136
+ ]);
137
+ const VERB_SPECIFIC_FLAGS = new Set([
138
+ "--skill",
139
+ "--format",
140
+ "--older-than",
141
+ "--status",
142
+ "--fields",
143
+ "--since",
144
+ "--limit",
145
+ "--history",
146
+ ]);
147
+
148
+ function flagName(arg: string): string | undefined {
149
+ if (!arg.startsWith("--")) return undefined;
150
+ const equalsIndex = arg.indexOf("=");
151
+ return equalsIndex >= 0 ? arg.slice(0, equalsIndex) : arg;
152
+ }
153
+
154
+ function manifestFlagNames(action: ParsedInvocation["action"], positionalSkill: string | undefined): Set<string> {
155
+ const names = new Set<string>();
156
+ const skills =
157
+ positionalSkill && KNOWN_MODES.includes(positionalSkill)
158
+ ? [positionalSkill as CanonicalSkcWorkflowSkill]
159
+ : CANONICAL_SKC_WORKFLOW_SKILLS;
160
+ for (const skill of skills) {
161
+ for (const arg of typedArgsFor(skill, action)) names.add(`--${arg.name}`);
162
+ }
163
+ return names;
164
+ }
165
+
166
+ function assertKnownFlags(args: readonly string[], parsed: ParsedInvocation): void {
167
+ const manifestFlags = manifestFlagNames(parsed.action, parsed.positionalSkill);
168
+ for (const arg of args) {
169
+ const flag = flagName(arg);
170
+ if (!flag) continue;
171
+ if (
172
+ FLAGS_WITH_VALUES.has(flag) ||
173
+ BOOLEAN_FLAGS.has(flag) ||
174
+ VERB_SPECIFIC_FLAGS.has(flag) ||
175
+ manifestFlags.has(flag)
176
+ ) {
177
+ continue;
178
+ }
179
+ throw new StateCommandError(2, `unknown skc state flag: ${flag}`);
180
+ }
181
+ }
182
+
183
+ interface ParsedInvocation {
184
+ action:
185
+ | "read"
186
+ | "write"
187
+ | "clear"
188
+ | "contract"
189
+ | "handoff"
190
+ | "graph"
191
+ | "prune"
192
+ | "gc"
193
+ | "migrate"
194
+ | "status"
195
+ | "doctor";
196
+ positionalSkill?: string;
197
+ }
198
+
199
+ function parsePositionalArgs(args: readonly string[]): ParsedInvocation {
200
+ let skipNext = false;
201
+ const positional: string[] = [];
202
+ for (const arg of args) {
203
+ if (skipNext) {
204
+ skipNext = false;
205
+ continue;
206
+ }
207
+ if (FLAGS_WITH_VALUES.has(arg)) {
208
+ skipNext = true;
209
+ continue;
210
+ }
211
+ if (!arg.startsWith("-")) positional.push(arg);
212
+ }
213
+ // Documented argv shapes:
214
+ // skc state read|write|clear|contract ...
215
+ // skc state <skill> read|write|contract ...
216
+ const first = positional[0];
217
+ const second = positional[1];
218
+ if (first && ACTION_NAMES.has(first)) {
219
+ return { action: first as ParsedInvocation["action"], positionalSkill: second };
220
+ }
221
+ if (first && second && ACTION_NAMES.has(second)) {
222
+ return { action: second as ParsedInvocation["action"], positionalSkill: first };
223
+ }
224
+ // `skc state <skill>` alone defaults to read for that skill.
225
+ if (first && !second) {
226
+ return { action: "read", positionalSkill: first };
227
+ }
228
+ return { action: "read" };
229
+ }
230
+
231
+ function assertSafePathComponent(value: string, label: string): void {
232
+ if (!PATH_COMPONENT_RE.test(value) || value.includes("..")) {
233
+ throw new StateCommandError(2, `invalid path component for --${label}: ${value}`);
234
+ }
235
+ }
236
+
237
+ function assertKnownMode(mode: string): asserts mode is CanonicalSkcWorkflowSkill {
238
+ if (!KNOWN_MODES.includes(mode)) {
239
+ throw new StateCommandError(2, `unknown --mode: ${mode}. Expected one of: ${KNOWN_MODES.join(", ")}.`);
240
+ }
241
+ }
242
+
243
+ async function readInputJson(value: string | undefined, cwd: string): Promise<Record<string, unknown> | undefined> {
244
+ if (value === undefined) return undefined;
245
+ const trimmed = value.trim();
246
+ if (!trimmed) return undefined;
247
+ let raw: string;
248
+ if (trimmed.startsWith("@")) {
249
+ const filePath = path.resolve(cwd, trimmed.slice(1));
250
+ try {
251
+ raw = await fs.readFile(filePath, "utf-8");
252
+ } catch (error) {
253
+ throw new StateCommandError(2, `failed to read --input file ${filePath}: ${(error as Error).message}`);
254
+ }
255
+ } else {
256
+ raw = trimmed;
257
+ }
258
+ let parsed: unknown;
259
+ try {
260
+ parsed = JSON.parse(raw);
261
+ } catch (error) {
262
+ throw new StateCommandError(2, `--input is not valid JSON: ${(error as Error).message}`);
263
+ }
264
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
265
+ throw new StateCommandError(2, "--input must be a JSON object");
266
+ }
267
+ return parsed as Record<string, unknown>;
268
+ }
269
+
270
+ interface ResolvedSelectors {
271
+ mode: CanonicalSkcWorkflowSkill | undefined;
272
+ sessionId: string | undefined;
273
+ threadId: string | undefined;
274
+ turnId: string | undefined;
275
+ payload: Record<string, unknown> | undefined;
276
+ }
277
+
278
+ async function resolveSelectors(
279
+ args: readonly string[],
280
+ cwd: string,
281
+ positionalSkill: string | undefined,
282
+ ): Promise<ResolvedSelectors> {
283
+ const payload = await readInputJson(flagValue(args, "--input"), cwd);
284
+
285
+ const candidates: Array<string | undefined> = [
286
+ flagValue(args, "--mode")?.trim() || undefined,
287
+ positionalSkill?.trim() || undefined,
288
+ typeof payload?.mode === "string" ? (payload.mode as string).trim() || undefined : undefined,
289
+ typeof payload?.skill === "string" ? (payload.skill as string).trim() || undefined : undefined,
290
+ ];
291
+ let mode: string | undefined;
292
+ for (const candidate of candidates) {
293
+ if (candidate) {
294
+ mode = candidate;
295
+ break;
296
+ }
297
+ }
298
+ if (mode) assertKnownMode(mode);
299
+
300
+ const explicitSessionId = flagValue(args, "--session-id");
301
+ // Session-id resolution order: explicit --session-id flag, then payload
302
+ // session_id, then SKC_SESSION_ID env var (set by AgentSession.sdk for
303
+ // agent-initiated CLI invocations). The env-var default keeps shell
304
+ // snippets in skill docs short while still routing writes/reads to the
305
+ // caller's session-scoped state files.
306
+ let sessionId = explicitSessionId !== undefined ? explicitSessionId.trim() || undefined : undefined;
307
+ if (!sessionId && payload && typeof payload.session_id === "string") {
308
+ sessionId = payload.session_id.trim() || undefined;
309
+ }
310
+ if (!sessionId && explicitSessionId === undefined) {
311
+ const envSessionId = process.env.SKC_SESSION_ID?.trim();
312
+ if (envSessionId) sessionId = envSessionId;
313
+ }
314
+ if (sessionId) assertSafePathComponent(sessionId, "session-id");
315
+
316
+ const threadId = flagValue(args, "--thread-id")?.trim() || undefined;
317
+ if (threadId) assertSafePathComponent(threadId, "thread-id");
318
+ const turnId = flagValue(args, "--turn-id")?.trim() || undefined;
319
+ if (turnId) assertSafePathComponent(turnId, "turn-id");
320
+
321
+ return { mode: mode as CanonicalSkcWorkflowSkill | undefined, sessionId, threadId, turnId, payload };
322
+ }
323
+
324
+ async function inferModeFromActiveState(
325
+ cwd: string,
326
+ sessionId: string | undefined,
327
+ ): Promise<CanonicalSkcWorkflowSkill | undefined> {
328
+ const state = await readVisibleSkillActiveState(cwd, sessionId);
329
+ const entries = listActiveSkills(state);
330
+ const candidate = entries[0]?.skill ?? state?.skill;
331
+ if (!candidate) return undefined;
332
+ const canonical = canonicalWorkflowSkill(candidate);
333
+ return canonical ?? undefined;
334
+ }
335
+
336
+ function encodeSessionSegment(value: string): string {
337
+ return encodeURIComponent(value).replaceAll(".", "%2E");
338
+ }
339
+
340
+ function stateDirFor(cwd: string, sessionId: string | undefined): string {
341
+ const base = path.join(cwd, ".skc", "state");
342
+ if (!sessionId) return base;
343
+ return path.join(base, "sessions", encodeSessionSegment(sessionId));
344
+ }
345
+
346
+ function modeStateFile(cwd: string, mode: string, sessionId: string | undefined): string {
347
+ return path.join(stateDirFor(cwd, sessionId), `${mode}-state.json`);
348
+ }
349
+
350
+ function activeStateFile(cwd: string, sessionId: string | undefined): string {
351
+ return path.join(stateDirFor(cwd, sessionId), SKILL_ACTIVE_STATE_FILE);
352
+ }
353
+
354
+ async function readJsonFile(filePath: string): Promise<Record<string, unknown> | null> {
355
+ try {
356
+ const raw = await fs.readFile(filePath, "utf-8");
357
+ const parsed = JSON.parse(raw);
358
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
359
+ return parsed as Record<string, unknown>;
360
+ }
361
+ return null;
362
+ } catch (error) {
363
+ const err = error as NodeJS.ErrnoException;
364
+ if (err.code === "ENOENT") return null;
365
+ process.stderr.write(`WARNING: failed to read ${filePath}; ignoring corrupt state: ${err.message}\n`);
366
+ return null;
367
+ }
368
+ }
369
+
370
+ async function readJsonValue(filePath: string): Promise<unknown | null> {
371
+ try {
372
+ return JSON.parse(await fs.readFile(filePath, "utf-8"));
373
+ } catch (error) {
374
+ const err = error as NodeJS.ErrnoException;
375
+ if (err.code === "ENOENT") return null;
376
+ process.stderr.write(`WARNING: failed to read ${filePath}; ignoring corrupt state: ${err.message}\n`);
377
+ return null;
378
+ }
379
+ }
380
+
381
+ type DoctorProblemType = "orphan_journal" | "checksum_mismatch" | "schema_violation" | "stale_active_state";
382
+
383
+ interface DoctorProblem {
384
+ type: DoctorProblemType;
385
+ skill?: CanonicalSkcWorkflowSkill;
386
+ path: string;
387
+ message: string;
388
+ fixCommand: string;
389
+ }
390
+
391
+ interface DoctorSummary {
392
+ ok: boolean;
393
+ root: string;
394
+ summary: {
395
+ skills_scanned: number;
396
+ files_scanned: number;
397
+ journals_scanned: number;
398
+ findings_total: number;
399
+ by_kind: Record<DoctorProblemType, number>;
400
+ };
401
+ problems: DoctorProblem[];
402
+ }
403
+
404
+ async function readRawJson(filePath: string): Promise<{ exists: boolean; value?: unknown; error?: string }> {
405
+ try {
406
+ return { exists: true, value: JSON.parse(await fs.readFile(filePath, "utf-8")) };
407
+ } catch (error) {
408
+ const err = error as NodeJS.ErrnoException;
409
+ if (err.code === "ENOENT") return { exists: false };
410
+ return { exists: true, error: err.message };
411
+ }
412
+ }
413
+
414
+ async function listJsonFiles(dir: string): Promise<string[]> {
415
+ let entries: string[];
416
+ try {
417
+ entries = await fs.readdir(dir);
418
+ } catch (error) {
419
+ const err = error as NodeJS.ErrnoException;
420
+ if (err.code === "ENOENT") return [];
421
+ throw error;
422
+ }
423
+ return entries
424
+ .filter(entry => entry.endsWith(".json"))
425
+ .sort()
426
+ .map(entry => path.join(dir, entry));
427
+ }
428
+
429
+ function doctorProblem(
430
+ type: DoctorProblemType,
431
+ pathValue: string,
432
+ message: string,
433
+ fixCommand: string,
434
+ skill?: CanonicalSkcWorkflowSkill,
435
+ ): DoctorProblem {
436
+ return skill
437
+ ? { type, skill, path: pathValue, message, fixCommand }
438
+ : { type, path: pathValue, message, fixCommand };
439
+ }
440
+
441
+ function activeEntryDir(cwd: string, sessionId: string | undefined): string {
442
+ return path.join(stateDirFor(cwd, sessionId), "active");
443
+ }
444
+
445
+ function skillFromActiveValue(value: unknown): string | undefined {
446
+ return isPlainObject(value) && typeof value.skill === "string" ? value.skill : undefined;
447
+ }
448
+
449
+ function activeFlag(value: unknown): boolean {
450
+ return isPlainObject(value) && value.active !== false;
451
+ }
452
+
453
+ function phaseFromActiveValue(value: unknown): string | undefined {
454
+ if (!isPlainObject(value) || typeof value.phase !== "string") return undefined;
455
+ const phase = value.phase.trim();
456
+ return phase || undefined;
457
+ }
458
+
459
+ const RALPLAN_CANONICAL_PHASE_OVERRIDES = new Set([
460
+ "final",
461
+ "handoff",
462
+ "complete",
463
+ "completed",
464
+ "failed",
465
+ "cancelled",
466
+ "canceled",
467
+ "inactive",
468
+ ]);
469
+
470
+ function modeStatePhase(value: unknown): string | undefined {
471
+ if (!isPlainObject(value) || typeof value.current_phase !== "string") return undefined;
472
+ const phase = value.current_phase.trim();
473
+ if (!phase) return undefined;
474
+ if (value.active === false && !RALPLAN_CANONICAL_PHASE_OVERRIDES.has(phase)) return undefined;
475
+ return phase;
476
+ }
477
+
478
+ function pushPhaseDriftProblem(options: {
479
+ problems: DoctorProblem[];
480
+ pathValue: string;
481
+ skill: CanonicalSkcWorkflowSkill;
482
+ entryKind: "active entry" | "active snapshot";
483
+ entrySkill: string;
484
+ entryPhase: string | undefined;
485
+ statePhase: string | undefined;
486
+ }): void {
487
+ if (!options.entryPhase || !options.statePhase || options.entryPhase === options.statePhase) return;
488
+ options.problems.push(
489
+ doctorProblem(
490
+ "stale_active_state",
491
+ options.pathValue,
492
+ `${options.entryKind} for ${options.entrySkill} phase ${options.entryPhase} differs from canonical mode-state phase ${options.statePhase}`,
493
+ `skc state ${options.skill} clear`,
494
+ options.skill,
495
+ ),
496
+ );
497
+ }
498
+
499
+ async function collectDoctorSummary(
500
+ cwd: string,
501
+ skill: CanonicalSkcWorkflowSkill | undefined,
502
+ sessionId: string | undefined,
503
+ ): Promise<DoctorSummary> {
504
+ const root = path.join(cwd, ".skc", "state");
505
+ const skills = skill ? [skill] : [...CANONICAL_SKC_WORKFLOW_SKILLS];
506
+ const problems: DoctorProblem[] = [];
507
+ let filesScanned = 0;
508
+ let journalsScanned = 0;
509
+ const invalidModeStates = new Set<string>();
510
+
511
+ for (const currentSkill of skills) {
512
+ const filePath = modeStateFile(cwd, currentSkill, sessionId);
513
+ const raw = await readRawJson(filePath);
514
+ if (!raw.exists) continue;
515
+ filesScanned += 1;
516
+ if (raw.error) {
517
+ problems.push(
518
+ doctorProblem(
519
+ "schema_violation",
520
+ filePath,
521
+ `mode-state JSON is unreadable: ${raw.error}`,
522
+ `skc state ${currentSkill} migrate`,
523
+ currentSkill,
524
+ ),
525
+ );
526
+ invalidModeStates.add(currentSkill);
527
+ continue;
528
+ }
529
+ const validation = validateWorkflowStateEnvelope(currentSkill, raw.value);
530
+ if (!validation.valid) {
531
+ problems.push(
532
+ doctorProblem(
533
+ "schema_violation",
534
+ filePath,
535
+ validation.error ?? `invalid ${currentSkill} state envelope`,
536
+ `skc state ${currentSkill} migrate`,
537
+ currentSkill,
538
+ ),
539
+ );
540
+ invalidModeStates.add(currentSkill);
541
+ }
542
+ const mismatch = await detectWorkflowEnvelopeIntegrityMismatch(filePath);
543
+ if (mismatch) {
544
+ problems.push(
545
+ doctorProblem(
546
+ "checksum_mismatch",
547
+ filePath,
548
+ `expected sha256 ${mismatch.expected} but found ${mismatch.actual}`,
549
+ `skc state ${currentSkill} migrate`,
550
+ currentSkill,
551
+ ),
552
+ );
553
+ invalidModeStates.add(currentSkill);
554
+ }
555
+ }
556
+
557
+ const journalFiles = await listJsonFiles(path.join(root, "transactions"));
558
+ for (const journalPath of journalFiles) {
559
+ journalsScanned += 1;
560
+ const raw = await readRawJson(journalPath);
561
+ const value = raw.value;
562
+ const status = isPlainObject(value) && typeof value.status === "string" ? value.status : undefined;
563
+ const paths =
564
+ isPlainObject(value) && Array.isArray(value.paths) ? value.paths.filter(p => typeof p === "string") : [];
565
+ const hasLiveMutation = status === "pending" && paths.some(filePath => path.resolve(filePath).startsWith(root));
566
+ if (!hasLiveMutation) {
567
+ problems.push(
568
+ doctorProblem(
569
+ "orphan_journal",
570
+ journalPath,
571
+ "transaction journal has no matching live mutation",
572
+ "skc state prune --hard",
573
+ ),
574
+ );
575
+ }
576
+ }
577
+
578
+ const inspectActiveScope = async (scopeSessionId: string | undefined): Promise<void> => {
579
+ const snapshotPath = activeStateFile(cwd, scopeSessionId);
580
+ const snapshot = await readRawJson(snapshotPath);
581
+ if (snapshot.exists) filesScanned += 1;
582
+ const entryFiles = await listJsonFiles(activeEntryDir(cwd, scopeSessionId));
583
+ const entrySkills = new Set<string>();
584
+ for (const entryPath of entryFiles) {
585
+ filesScanned += 1;
586
+ const entry = await readRawJson(entryPath);
587
+ const entrySkill = skillFromActiveValue(entry.value) ?? path.basename(entryPath, ".json");
588
+ entrySkills.add(entrySkill);
589
+ const canonical = canonicalWorkflowSkill(entrySkill);
590
+ if (canonical && !skills.includes(canonical)) continue;
591
+ const statePath = canonical
592
+ ? modeStateFile(cwd, canonical, scopeSessionId)
593
+ : path.join(root, `${entrySkill}-state.json`);
594
+ const state = await readRawJson(statePath);
595
+ if (activeFlag(entry.value) && (!state.exists || !activeFlag(state.value))) {
596
+ problems.push(
597
+ doctorProblem(
598
+ "stale_active_state",
599
+ entryPath,
600
+ `active entry for ${entrySkill} does not match a live active mode-state`,
601
+ canonical ? `skc state ${canonical} clear` : "skc state prune --hard",
602
+ canonical ?? undefined,
603
+ ),
604
+ );
605
+ }
606
+ if (canonical && activeFlag(entry.value) && !invalidModeStates.has(canonical)) {
607
+ pushPhaseDriftProblem({
608
+ problems,
609
+ pathValue: entryPath,
610
+ skill: canonical,
611
+ entryKind: "active entry",
612
+ entrySkill,
613
+ entryPhase: phaseFromActiveValue(entry.value),
614
+ statePhase: modeStatePhase(state.value),
615
+ });
616
+ }
617
+ }
618
+ if (isPlainObject(snapshot.value)) {
619
+ const activeSkills = Array.isArray(snapshot.value.active_skills) ? snapshot.value.active_skills : [];
620
+ for (const entry of activeSkills) {
621
+ const entrySkill = skillFromActiveValue(entry);
622
+ if (!entrySkill) continue;
623
+ const canonical = canonicalWorkflowSkill(entrySkill);
624
+ if (canonical && !skills.includes(canonical)) continue;
625
+ if (activeFlag(entry) && !entrySkills.has(entrySkill)) {
626
+ problems.push(
627
+ doctorProblem(
628
+ "stale_active_state",
629
+ snapshotPath,
630
+ `active snapshot lists ${entrySkill} but no raw per-skill active entry exists`,
631
+ canonical ? `skc state ${canonical} clear` : "skc state prune --hard",
632
+ canonical ?? undefined,
633
+ ),
634
+ );
635
+ }
636
+ if (canonical && activeFlag(entry) && !invalidModeStates.has(canonical)) {
637
+ const state = await readRawJson(modeStateFile(cwd, canonical, scopeSessionId));
638
+ pushPhaseDriftProblem({
639
+ problems,
640
+ pathValue: snapshotPath,
641
+ skill: canonical,
642
+ entryKind: "active snapshot",
643
+ entrySkill,
644
+ entryPhase: phaseFromActiveValue(entry),
645
+ statePhase: modeStatePhase(state.value),
646
+ });
647
+ }
648
+ }
649
+ }
650
+ };
651
+
652
+ await inspectActiveScope(sessionId);
653
+ if (!sessionId) {
654
+ const sessionsDir = path.join(root, "sessions");
655
+ let sessions: string[] = [];
656
+ try {
657
+ const entries = await fs.readdir(sessionsDir, { withFileTypes: true });
658
+ sessions = entries
659
+ .filter(entry => entry.isDirectory())
660
+ .map(entry => entry.name)
661
+ .sort();
662
+ } catch (error) {
663
+ const err = error as NodeJS.ErrnoException;
664
+ if (err.code !== "ENOENT") throw error;
665
+ }
666
+ for (const rawSession of sessions) await inspectActiveScope(decodeURIComponent(rawSession));
667
+ }
668
+
669
+ problems.sort(
670
+ (a, b) =>
671
+ a.type.localeCompare(b.type) || (a.skill ?? "").localeCompare(b.skill ?? "") || a.path.localeCompare(b.path),
672
+ );
673
+ const byKind: Record<DoctorProblemType, number> = {
674
+ orphan_journal: 0,
675
+ checksum_mismatch: 0,
676
+ schema_violation: 0,
677
+ stale_active_state: 0,
678
+ };
679
+ for (const problem of problems) byKind[problem.type] += 1;
680
+ return {
681
+ ok: problems.length === 0,
682
+ root,
683
+ summary: {
684
+ skills_scanned: skills.length,
685
+ files_scanned: filesScanned,
686
+ journals_scanned: journalsScanned,
687
+ findings_total: problems.length,
688
+ by_kind: byKind,
689
+ },
690
+ problems,
691
+ };
692
+ }
693
+
694
+ function renderDoctorText(summary: DoctorSummary): string {
695
+ const lines = [
696
+ `ok: ${summary.ok}`,
697
+ `root: ${summary.root}`,
698
+ `skills_scanned: ${summary.summary.skills_scanned}`,
699
+ `files_scanned: ${summary.summary.files_scanned}`,
700
+ `journals_scanned: ${summary.summary.journals_scanned}`,
701
+ `findings_total: ${summary.summary.findings_total}`,
702
+ `counts: ${Object.entries(summary.summary.by_kind)
703
+ .map(([kind, count]) => `${kind}=${count}`)
704
+ .join(", ")}`,
705
+ ];
706
+ for (const problem of summary.problems) {
707
+ lines.push(
708
+ `finding: kind=${problem.type} skill=${problem.skill ?? "-"} path=${problem.path} message=${problem.message} fix=${problem.fixCommand}`,
709
+ );
710
+ }
711
+ return `${lines.join("\n")}\n`;
712
+ }
713
+
714
+ async function handleDoctor(
715
+ args: readonly string[],
716
+ cwd: string,
717
+ positionalSkill: string | undefined,
718
+ ): Promise<StateCommandResult> {
719
+ const rawSkill = flagValue(args, "--skill")?.trim() || flagValue(args, "--mode")?.trim() || positionalSkill?.trim();
720
+ if (rawSkill) assertKnownMode(rawSkill);
721
+ const sessionId = flagValue(args, "--session-id")?.trim() || undefined;
722
+ if (sessionId) assertSafePathComponent(sessionId, "session-id");
723
+ const summary = await collectDoctorSummary(cwd, rawSkill as CanonicalSkcWorkflowSkill | undefined, sessionId);
724
+ return {
725
+ status: summary.ok ? 0 : 1,
726
+ stdout: hasFlag(args, "--json") ? `${JSON.stringify(summary, null, 2)}\n` : renderDoctorText(summary),
727
+ };
728
+ }
729
+
730
+ async function warnAndAuditOutOfBandIfNeeded(
731
+ cwd: string,
732
+ filePath: string,
733
+ skill: CanonicalSkcWorkflowSkill,
734
+ options?: { mutationId?: string; forced?: boolean },
735
+ ): Promise<string | undefined> {
736
+ let mismatch: WorkflowEnvelopeIntegrityMismatch | undefined;
737
+ try {
738
+ mismatch = await detectWorkflowEnvelopeIntegrityMismatch(filePath);
739
+ } catch {
740
+ // Unparseable/corrupt state has no recoverable checksum to compare; the strict
741
+ // mutation reader already gates unforced overwrites, so fail-open here.
742
+ return undefined;
743
+ }
744
+ if (!mismatch) return undefined;
745
+ const message = `WARNING: workflow mode-state out-of-band edit detected for ${skill}: ${filePath} expected sha256 ${mismatch.expected} but found ${mismatch.actual}`;
746
+ await appendAuditEntry(cwd, {
747
+ ts: new Date().toISOString(),
748
+ skill,
749
+ category: "state",
750
+ verb: "out_of_band_detected",
751
+ owner: "skc-state-cli",
752
+ mutation_id: options?.mutationId ?? `${skill}:out-of-band:${new Date().toISOString()}`,
753
+ forced: options?.forced ?? false,
754
+ paths: [filePath],
755
+ expected_sha256: mismatch.expected,
756
+ actual_sha256: mismatch.actual,
757
+ } as AuditEntry);
758
+ return message;
759
+ }
760
+
761
+ async function writeJsonAtomic(
762
+ cwd: string,
763
+ filePath: string,
764
+ value: unknown,
765
+ verb: "write" | "clear" | "handoff" | "reconcile" = "write",
766
+ options?: {
767
+ skill?: CanonicalSkcWorkflowSkill;
768
+ mutationId?: string;
769
+ force?: boolean;
770
+ fromPhase?: string;
771
+ toPhase?: string;
772
+ owner?: WorkflowStateMutationOwner;
773
+ },
774
+ ): Promise<{ warning?: string; stamped: Record<string, unknown> }> {
775
+ const warning = options?.skill
776
+ ? await warnAndAuditOutOfBandIfNeeded(cwd, filePath, options.skill, {
777
+ mutationId: options.mutationId,
778
+ forced: options.force ?? false,
779
+ })
780
+ : undefined;
781
+ if (warning && !options?.force) {
782
+ throw new StateCommandError(2, `${warning}; use --force to overwrite tampered mode-state`);
783
+ }
784
+ await writeWorkflowEnvelopeAtomic(filePath, value, {
785
+ cwd,
786
+ audit: {
787
+ category: "state",
788
+ verb,
789
+ owner: options?.owner ?? "skc-state-cli",
790
+ skill: options?.skill,
791
+ mutationId: options?.mutationId,
792
+ fromPhase: options?.fromPhase,
793
+ toPhase: options?.toPhase,
794
+ forced: options?.force ?? false,
795
+ },
796
+ });
797
+ return { warning, stamped: (await readJsonFile(filePath)) ?? {} };
798
+ }
799
+
800
+ function parseFieldsFlag(args: readonly string[]): StateProjectionField[] | undefined {
801
+ const raw = flagValue(args, "--fields");
802
+ if (raw === undefined) return undefined;
803
+ const allowed = new Set<string>(STATE_FIELD_ALLOWLIST);
804
+ const fields = raw
805
+ .split(",")
806
+ .map(field => field.trim())
807
+ .filter(Boolean);
808
+ const unknown = fields.filter(field => !allowed.has(field));
809
+ if (unknown.length) {
810
+ throw new StateCommandError(
811
+ 2,
812
+ `unknown --fields value(s): ${unknown.join(", ")}. Allowed fields: ${STATE_FIELD_ALLOWLIST.join(", ")}`,
813
+ );
814
+ }
815
+ return fields as StateProjectionField[];
816
+ }
817
+
818
+ function parseLimitFlag(args: readonly string[], defaultLimit = 50): number {
819
+ const raw = flagValue(args, "--limit");
820
+ if (raw === undefined) return defaultLimit;
821
+ const parsed = Number(raw);
822
+ if (!Number.isInteger(parsed) || parsed <= 0 || parsed > 500) {
823
+ throw new StateCommandError(2, "skc state --limit requires an integer from 1 to 500");
824
+ }
825
+ return parsed;
826
+ }
827
+
828
+ function parseSinceFlag(args: readonly string[]): string | undefined {
829
+ const raw = flagValue(args, "--since")?.trim();
830
+ if (!raw) return undefined;
831
+ const duration = raw.match(/^(\d+)(m|h|d)$/);
832
+ if (duration) {
833
+ const amount = Number(duration[1]);
834
+ const unit = duration[2];
835
+ const multiplier = unit === "m" ? 60_000 : unit === "h" ? 3_600_000 : 86_400_000;
836
+ return new Date(Date.now() - amount * multiplier).toISOString();
837
+ }
838
+ if (Number.isNaN(Date.parse(raw)))
839
+ throw new StateCommandError(2, "skc state --since requires an ISO timestamp or duration like 30m, 6h, 7d");
840
+ return new Date(raw).toISOString();
841
+ }
842
+
843
+ async function readAuditWindow(
844
+ cwd: string,
845
+ args: readonly string[],
846
+ ): Promise<{ entries: unknown[]; limit: number; since?: string; truncated: boolean }> {
847
+ const limit = parseLimitFlag(args);
848
+ const since = parseSinceFlag(args);
849
+ const auditPath = path.join(cwd, ".skc", "state", "audit.jsonl");
850
+ let raw = "";
851
+ try {
852
+ raw = await fs.readFile(auditPath, "utf-8");
853
+ } catch (error) {
854
+ const err = error as NodeJS.ErrnoException;
855
+ if (err.code !== "ENOENT") throw error;
856
+ }
857
+ const selected: unknown[] = [];
858
+ let matched = 0;
859
+ const lines = raw.split(/\r?\n/).filter(line => line.trim().length > 0);
860
+ for (let index = lines.length - 1; index >= 0; index -= 1) {
861
+ const line = lines[index];
862
+ let entry: unknown;
863
+ try {
864
+ entry = JSON.parse(line);
865
+ } catch {
866
+ continue;
867
+ }
868
+ if (since && isPlainObject(entry) && typeof entry.ts === "string" && Date.parse(entry.ts) < Date.parse(since))
869
+ break;
870
+ matched += 1;
871
+ if (selected.length < limit) selected.push(entry);
872
+ }
873
+ return { entries: selected.reverse(), limit, ...(since ? { since } : {}), truncated: matched > limit };
874
+ }
875
+
876
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
877
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
878
+ }
879
+
880
+ /**
881
+ * Shallow-merge `source` into `target`, with the convention that a `source` key whose value is
882
+ * `null` deletes that key from `target`. Nested objects are replaced wholesale (not deep-merged)
883
+ * so callers retain explicit control over substructure semantics; pre-existing skills that want
884
+ * to merge nested fields can supply the full sub-object themselves.
885
+ */
886
+ function mergeWithNullDelete(
887
+ target: Record<string, unknown>,
888
+ source: Record<string, unknown>,
889
+ ): Record<string, unknown> {
890
+ const result: Record<string, unknown> = { ...target };
891
+ for (const [key, value] of Object.entries(source)) {
892
+ if (value === null) {
893
+ delete result[key];
894
+ } else {
895
+ result[key] = value;
896
+ }
897
+ }
898
+ return result;
899
+ }
900
+
901
+ function nowIso(): string {
902
+ return new Date().toISOString();
903
+ }
904
+
905
+ function buildHudForMode(
906
+ mode: CanonicalSkcWorkflowSkill,
907
+ payload: Record<string, unknown>,
908
+ ): WorkflowHudSummary | undefined {
909
+ const updatedAt = new Date().toISOString();
910
+ const phase = typeof payload.current_phase === "string" ? payload.current_phase : undefined;
911
+ switch (mode) {
912
+ case "deep-interview":
913
+ return deriveDeepInterviewHud(payload, { updatedAt });
914
+ case "ralplan": {
915
+ const stage =
916
+ typeof payload.current_phase === "string"
917
+ ? (payload.current_phase as string)
918
+ : typeof payload.mode === "string"
919
+ ? (payload.mode as string)
920
+ : undefined;
921
+ const verdict = typeof payload.verdict === "string" ? (payload.verdict as string) : undefined;
922
+ const iteration = typeof payload.iteration === "number" ? (payload.iteration as number) : undefined;
923
+ const pendingApproval = payload.pending_approval === true || stage === "final";
924
+ return buildRalplanHudSummary({
925
+ stage,
926
+ verdict,
927
+ iteration,
928
+ pendingApproval,
929
+ updatedAt,
930
+ });
931
+ }
932
+ case "ultragoal": {
933
+ const goals = Array.isArray(payload.goals)
934
+ ? (payload.goals as Array<{ id?: string; title?: string; status?: string }>).filter(
935
+ g => g && typeof g.id === "string" && typeof g.title === "string" && typeof g.status === "string",
936
+ )
937
+ : [];
938
+ const counts: Record<string, number> = {};
939
+ for (const goal of goals) {
940
+ const status = goal.status as string;
941
+ counts[status] = (counts[status] ?? 0) + 1;
942
+ }
943
+ const currentGoalRaw = goals.find(g => g.status === "active") ?? goals.find(g => g.status === "pending");
944
+ const rawLedger = payload.latestLedgerEvent;
945
+ const latestLedgerEvent =
946
+ rawLedger && typeof rawLedger === "object" && !Array.isArray(rawLedger)
947
+ ? {
948
+ event:
949
+ typeof (rawLedger as Record<string, unknown>).event === "string"
950
+ ? ((rawLedger as Record<string, unknown>).event as string)
951
+ : undefined,
952
+ goalId:
953
+ typeof (rawLedger as Record<string, unknown>).goalId === "string"
954
+ ? ((rawLedger as Record<string, unknown>).goalId as string)
955
+ : undefined,
956
+ timestamp:
957
+ typeof (rawLedger as Record<string, unknown>).timestamp === "string"
958
+ ? ((rawLedger as Record<string, unknown>).timestamp as string)
959
+ : undefined,
960
+ }
961
+ : undefined;
962
+ const status = typeof payload.status === "string" ? (payload.status as string) : (phase ?? "pending");
963
+ return buildUltragoalHudSummary({
964
+ status,
965
+ currentGoal: currentGoalRaw
966
+ ? {
967
+ id: currentGoalRaw.id as string,
968
+ title: currentGoalRaw.title as string,
969
+ status: currentGoalRaw.status as string,
970
+ }
971
+ : undefined,
972
+ counts,
973
+ goals: goals.map(g => ({ id: g.id as string, title: g.title as string, status: g.status as string })),
974
+ latestLedgerEvent,
975
+ updatedAt,
976
+ });
977
+ }
978
+ case "team": {
979
+ const teamPhase = typeof payload.phase === "string" ? (payload.phase as string) : (phase ?? "running");
980
+ const taskCounts =
981
+ typeof payload.task_counts === "object" && payload.task_counts && !Array.isArray(payload.task_counts)
982
+ ? (payload.task_counts as Record<string, number>)
983
+ : {};
984
+ const taskTotal = typeof payload.task_total === "number" ? (payload.task_total as number) : 0;
985
+ const workers = Array.isArray(payload.workers)
986
+ ? (payload.workers as Array<{ id?: string; status?: string }>)
987
+ .filter(w => w && typeof w.id === "string")
988
+ .map(w => ({
989
+ id: w.id as string,
990
+ status: typeof w.status === "string" ? (w.status as string) : undefined,
991
+ }))
992
+ : [];
993
+ return buildTeamHudSummary({
994
+ phase: teamPhase,
995
+ task_total: taskTotal,
996
+ task_counts: taskCounts,
997
+ workers,
998
+ updated_at: updatedAt,
999
+ });
1000
+ }
1001
+ default:
1002
+ return undefined;
1003
+ }
1004
+ }
1005
+
1006
+ async function syncWorkflowSkillState(options: {
1007
+ cwd: string;
1008
+ mode: CanonicalSkcWorkflowSkill;
1009
+ sessionId: string | undefined;
1010
+ threadId?: string;
1011
+ turnId?: string;
1012
+ active: boolean;
1013
+ phase: string | undefined;
1014
+ payload: Record<string, unknown>;
1015
+ receipt?: WorkflowStateReceipt;
1016
+ }): Promise<void> {
1017
+ try {
1018
+ await syncSkillActiveState({
1019
+ cwd: options.cwd,
1020
+ skill: options.mode,
1021
+ active: options.active,
1022
+ phase: options.phase,
1023
+ sessionId: options.sessionId,
1024
+ threadId: options.threadId,
1025
+ turnId: options.turnId,
1026
+ source: "skc-state-cli",
1027
+ hud: buildHudForMode(options.mode, options.payload),
1028
+ ...(options.receipt ? { receipt: options.receipt } : {}),
1029
+ });
1030
+ } catch {
1031
+ // HUD sync is best-effort and must not change command semantics.
1032
+ }
1033
+ }
1034
+
1035
+ /**
1036
+ * Reconcile a workflow skill's mode-state + active-state/HUD from a caller-derived
1037
+ * payload. Unlike `skc state write`, this is a derived repair: callers reconcile from
1038
+ * an authoritative source (e.g. the ultragoal plan/ledger), where intermediate
1039
+ * aggregate phases like ultragoal `active -> pending` are legitimate, so it bypasses
1040
+ * ONLY verb transition-edge validation while preserving schema validation,
1041
+ * unknown-phase rejection, version/checksum stamping, and audit/out-of-band tamper
1042
+ * detection. Receipts carry `owner: "skc-runtime"` and `verb: "reconcile"` so the
1043
+ * provenance is distinguishable from a user-initiated write.
1044
+ */
1045
+ export async function reconcileWorkflowSkillState(options: {
1046
+ cwd: string;
1047
+ mode: CanonicalSkcWorkflowSkill;
1048
+ sessionId: string | undefined;
1049
+ threadId?: string;
1050
+ turnId?: string;
1051
+ active: boolean;
1052
+ phase: string;
1053
+ payload: Record<string, unknown>;
1054
+ }): Promise<{ stateFile: string }> {
1055
+ const { cwd, mode, sessionId, threadId, turnId, active, payload } = options;
1056
+ const filePath = modeStateFile(cwd, mode, sessionId);
1057
+ const existingRead = await readExistingStateForMutation(filePath);
1058
+ const existingPayload = existingRead.kind === "valid" ? existingRead.value : {};
1059
+ const nowIsoStr = nowIso();
1060
+ const mutationId = `${mode}:reconcile:${nowIsoStr}`;
1061
+
1062
+ const trimmedPhase = options.phase.trim();
1063
+ const manifestStates = new Set(getSkillManifest(mode).states.map(state => state.id));
1064
+ if (!manifestStates.has(trimmedPhase)) {
1065
+ throw new StateCommandError(2, `unknown ${mode} phase "${trimmedPhase}" for reconciliation`);
1066
+ }
1067
+
1068
+ const fromPhase =
1069
+ typeof existingPayload.current_phase === "string" ? existingPayload.current_phase.trim() : undefined;
1070
+ const receipt = buildWorkflowStateReceipt({
1071
+ cwd,
1072
+ skill: mode,
1073
+ owner: "skc-runtime",
1074
+ command: `skc ${mode} (reconcile)`,
1075
+ sessionId,
1076
+ nowIso: nowIsoStr,
1077
+ mutationId,
1078
+ });
1079
+ receipt.verb = "reconcile";
1080
+ receipt.forced = true;
1081
+ receipt.from_phase = fromPhase;
1082
+ receipt.to_phase = trimmedPhase;
1083
+
1084
+ const merged =
1085
+ mode === "deep-interview"
1086
+ ? (mergeDeepInterviewEnvelope(existingPayload, payload) as Record<string, unknown>)
1087
+ : mergeWithNullDelete(existingPayload, payload);
1088
+ merged.skill = mode;
1089
+ merged.current_phase = trimmedPhase;
1090
+ merged.active = active;
1091
+ merged.version = WORKFLOW_STATE_VERSION;
1092
+ merged.updated_at = nowIsoStr;
1093
+ merged.receipt = receipt;
1094
+ if (sessionId && typeof merged.session_id !== "string") merged.session_id = sessionId;
1095
+
1096
+ const validation = validateWorkflowStateEnvelope(mode, merged);
1097
+ if (!validation.valid) throw new StateCommandError(2, validation.error ?? `invalid ${mode} state envelope`);
1098
+
1099
+ await writeJsonAtomic(cwd, filePath, merged, "reconcile", {
1100
+ skill: mode,
1101
+ mutationId,
1102
+ force: true,
1103
+ fromPhase,
1104
+ toPhase: trimmedPhase,
1105
+ owner: "skc-runtime",
1106
+ });
1107
+
1108
+ // Reconciliation drives the active-state/HUD update directly (not via the
1109
+ // best-effort syncWorkflowSkillState wrapper) so a failed HUD/active-state write
1110
+ // is surfaced to the caller and recorded as a reconcile failure, rather than
1111
+ // silently leaving a stale chip behind a freshly reconciled mode-state.
1112
+ await syncSkillActiveState({
1113
+ cwd,
1114
+ skill: mode,
1115
+ active,
1116
+ phase: trimmedPhase,
1117
+ sessionId,
1118
+ threadId,
1119
+ turnId,
1120
+ source: "skc-runtime-reconcile",
1121
+ hud: buildHudForMode(mode, merged),
1122
+ receipt,
1123
+ });
1124
+ return { stateFile: filePath };
1125
+ }
1126
+ export async function readWorkflowStateJson(
1127
+ cwd: string,
1128
+ skill: CanonicalSkcWorkflowSkill,
1129
+ sessionId?: string,
1130
+ ): Promise<Record<string, unknown>> {
1131
+ return (await readJsonFile(modeStateFile(cwd, skill, sessionId))) ?? {};
1132
+ }
1133
+
1134
+ async function handleRead(
1135
+ args: readonly string[],
1136
+ cwd: string,
1137
+ positionalSkill: string | undefined,
1138
+ ): Promise<StateCommandResult> {
1139
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1140
+ const mode = selectors.mode ?? (await inferModeFromActiveState(cwd, selectors.sessionId));
1141
+ const fields = parseFieldsFlag(args);
1142
+ if (mode) {
1143
+ const filePath = modeStateFile(cwd, mode, selectors.sessionId);
1144
+ const existing = await readWorkflowStateJson(cwd, mode, selectors.sessionId);
1145
+ const envelope = { skill: mode, state: existing, storage_path: filePath };
1146
+ const manifest = getSkillManifest(mode);
1147
+ if (fields) {
1148
+ const projected = projectStateFields(mode, envelope, manifest, fields);
1149
+ return {
1150
+ status: 0,
1151
+ stdout: hasFlag(args, "--json")
1152
+ ? `${JSON.stringify(projected, null, 2)}\n`
1153
+ : renderStateMarkdown(mode, projected, manifest),
1154
+ };
1155
+ }
1156
+ if (hasFlag(args, "--compact")) {
1157
+ const compact = compactProjectStateJson(mode, envelope, manifest);
1158
+ return {
1159
+ status: 0,
1160
+ stdout: hasFlag(args, "--json")
1161
+ ? `${JSON.stringify(compact, null, 2)}\n`
1162
+ : renderStateMarkdown(mode, envelope, manifest),
1163
+ };
1164
+ }
1165
+ return {
1166
+ status: 0,
1167
+ stdout: hasFlag(args, "--json")
1168
+ ? `${JSON.stringify(envelope, null, 2)}\n`
1169
+ : renderStateMarkdown(mode, envelope, manifest),
1170
+ };
1171
+ }
1172
+ const filePath = activeStateFile(cwd, selectors.sessionId);
1173
+ const existingRaw = await readJsonValue(filePath);
1174
+ const existing = isPlainObject(existingRaw) ? existingRaw : null;
1175
+ return { status: 0, stdout: `${JSON.stringify(existing ?? {}, null, 2)}\n` };
1176
+ }
1177
+
1178
+ async function handleStatus(
1179
+ args: readonly string[],
1180
+ cwd: string,
1181
+ positionalSkill: string | undefined,
1182
+ ): Promise<StateCommandResult> {
1183
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1184
+ const mode = selectors.mode ?? (await inferModeFromActiveState(cwd, selectors.sessionId));
1185
+ if (!mode) {
1186
+ throw new StateCommandError(
1187
+ 2,
1188
+ "skc state status requires --mode <skill>, positional <skill>, input.skill, or an active workflow in .skc/state/skill-active-state.json",
1189
+ );
1190
+ }
1191
+ const filePath = modeStateFile(cwd, mode, selectors.sessionId);
1192
+ const existing = await readWorkflowStateJson(cwd, mode, selectors.sessionId);
1193
+ const summary = buildStateStatusSummary(
1194
+ mode,
1195
+ { skill: mode, state: existing, storage_path: filePath },
1196
+ getSkillManifest(mode),
1197
+ filePath,
1198
+ );
1199
+ return {
1200
+ status: 0,
1201
+ stdout: hasFlag(args, "--json") ? `${JSON.stringify(summary, null, 2)}\n` : renderStateStatusLine(summary),
1202
+ };
1203
+ }
1204
+
1205
+ async function handleWrite(
1206
+ args: readonly string[],
1207
+ cwd: string,
1208
+ positionalSkill: string | undefined,
1209
+ ): Promise<StateCommandResult> {
1210
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1211
+ const { sessionId, threadId, turnId, payload } = selectors;
1212
+ if (!payload) throw new StateCommandError(2, "skc state write requires --input '<json>'");
1213
+ const mode = selectors.mode ?? (await inferModeFromActiveState(cwd, sessionId));
1214
+ if (!mode)
1215
+ throw new StateCommandError(
1216
+ 2,
1217
+ "skc state write requires --mode <skill>, positional <skill>, input.skill, or an active workflow in .skc/state/skill-active-state.json",
1218
+ );
1219
+
1220
+ const filePath = modeStateFile(cwd, mode, sessionId);
1221
+ const forced = hasFlag(args, "--force");
1222
+ const existingRead = await readExistingStateForMutation(filePath);
1223
+ if (existingRead.kind === "corrupt" && !forced) {
1224
+ throw new StateCommandError(
1225
+ 2,
1226
+ `existing state for ${mode} is corrupt or tampered (${existingRead.error}); use --force to overwrite`,
1227
+ );
1228
+ }
1229
+ const existingPayload = existingRead.kind === "valid" ? existingRead.value : {};
1230
+ const nowIsoStr = nowIso();
1231
+ const mutationId = `${mode}:${nowIsoStr}`;
1232
+ const receipt = buildWorkflowStateReceipt({
1233
+ cwd,
1234
+ skill: mode,
1235
+ owner: "skc-state-cli",
1236
+ command: `skc state ${mode} write`,
1237
+ sessionId,
1238
+ nowIso: nowIsoStr,
1239
+ mutationId,
1240
+ });
1241
+ const innerState = (payload.state as Record<string, unknown> | undefined) ?? {};
1242
+ const incomingPhase =
1243
+ typeof payload.current_phase === "string" && payload.current_phase.trim()
1244
+ ? payload.current_phase.trim()
1245
+ : typeof payload.phase === "string" && payload.phase.trim()
1246
+ ? payload.phase.trim()
1247
+ : typeof innerState.current_phase === "string" && (innerState.current_phase as string).trim()
1248
+ ? (innerState.current_phase as string).trim()
1249
+ : undefined;
1250
+ let merged: Record<string, unknown>;
1251
+ if (mode === "deep-interview") {
1252
+ // Deep-interview keeps interview data nested under `state` and merges rounds
1253
+ // losslessly by durable key; never flatten or delete `state` (that drops recorder history).
1254
+ merged = mergeDeepInterviewEnvelope(existingPayload, payload, { replace: hasFlag(args, "--replace") });
1255
+ } else if (hasFlag(args, "--replace")) {
1256
+ merged = { ...payload };
1257
+ } else {
1258
+ merged = mergeWithNullDelete(existingPayload, payload);
1259
+ // Flatten payload.state.* into the top-level envelope so downstream consumers
1260
+ // see a single canonical structure with the receipt at top level.
1261
+ if (payload.state && typeof payload.state === "object" && !Array.isArray(payload.state)) {
1262
+ merged = mergeWithNullDelete(merged, payload.state as Record<string, unknown>);
1263
+ delete merged.state;
1264
+ }
1265
+ }
1266
+ const preDefaultValidation = validateWorkflowStateEnvelope(mode, merged);
1267
+ if (!preDefaultValidation.valid) {
1268
+ throw new StateCommandError(2, preDefaultValidation.error ?? `invalid ${mode} state envelope`);
1269
+ }
1270
+ merged.skill = mode;
1271
+ if (incomingPhase) {
1272
+ merged.current_phase = incomingPhase;
1273
+ } else if (typeof merged.current_phase !== "string" || !merged.current_phase.trim()) {
1274
+ const retainedPhase =
1275
+ typeof existingPayload.current_phase === "string" ? existingPayload.current_phase.trim() : "";
1276
+ merged.current_phase = retainedPhase || initialPhaseForSkill(mode);
1277
+ } else {
1278
+ merged.current_phase = merged.current_phase.trim();
1279
+ }
1280
+ merged.version = WORKFLOW_STATE_VERSION;
1281
+ if (typeof merged.active !== "boolean") merged.active = true;
1282
+ merged.updated_at = nowIsoStr;
1283
+ merged.receipt = receipt;
1284
+ if (sessionId && typeof merged.session_id !== "string") merged.session_id = sessionId;
1285
+
1286
+ const fromPhase =
1287
+ typeof existingPayload.current_phase === "string" ? existingPayload.current_phase.trim() : undefined;
1288
+ const toPhase = merged.current_phase as string;
1289
+ const manifestStates = new Set(getSkillManifest(mode).states.map(state => state.id));
1290
+ if (!manifestStates.has(toPhase) && !forced) {
1291
+ throw new StateCommandError(2, `unknown ${mode} phase "${toPhase}"; use --force to bypass`);
1292
+ }
1293
+ if (fromPhase && toPhase && isKnownWorkflowState(mode, fromPhase) && isKnownWorkflowState(mode, toPhase)) {
1294
+ if (!isValidTransition(mode, fromPhase, toPhase) && !forced) {
1295
+ throw new StateCommandError(
1296
+ 2,
1297
+ `invalid ${mode} phase transition from ${fromPhase} to ${toPhase}; use --force to bypass`,
1298
+ );
1299
+ }
1300
+ }
1301
+
1302
+ const validation = validateWorkflowStateEnvelope(mode, merged);
1303
+ if (!validation.valid) throw new StateCommandError(2, validation.error ?? `invalid ${mode} state envelope`);
1304
+
1305
+ const { warning: outOfBandWarning, stamped } = await writeJsonAtomic(cwd, filePath, merged, "write", {
1306
+ skill: mode,
1307
+ mutationId,
1308
+ force: forced,
1309
+ fromPhase,
1310
+ toPhase,
1311
+ });
1312
+ const stampedReceipt = isPlainObject(stamped.receipt) ? stamped.receipt : {};
1313
+
1314
+ const phase = typeof merged.current_phase === "string" ? merged.current_phase : undefined;
1315
+ const active = merged.active !== false;
1316
+ await syncWorkflowSkillState({ cwd, mode, sessionId, threadId, turnId, active, phase, payload: merged, receipt });
1317
+
1318
+ return {
1319
+ status: 0,
1320
+ stdout: renderCliWriteReceipt({
1321
+ ok: true,
1322
+ skill: mode,
1323
+ state_path: filePath,
1324
+ current_phase: phase,
1325
+ active,
1326
+ mutation_id: typeof stampedReceipt.mutation_id === "string" ? stampedReceipt.mutation_id : mutationId,
1327
+ status: typeof stampedReceipt.status === "string" ? stampedReceipt.status : undefined,
1328
+ content_sha256: stampedReceipt.content_sha256,
1329
+ }),
1330
+ ...(outOfBandWarning ? { stderr: `${outOfBandWarning}\n` } : {}),
1331
+ };
1332
+ }
1333
+
1334
+ async function handleClear(
1335
+ args: readonly string[],
1336
+ cwd: string,
1337
+ positionalSkill: string | undefined,
1338
+ ): Promise<StateCommandResult> {
1339
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1340
+ const { sessionId, threadId, turnId } = selectors;
1341
+ const mode = selectors.mode ?? (await inferModeFromActiveState(cwd, sessionId));
1342
+ if (!mode)
1343
+ throw new StateCommandError(
1344
+ 2,
1345
+ "skc state clear requires --mode <skill>, positional <skill>, input.skill, or an active workflow in .skc/state/skill-active-state.json",
1346
+ );
1347
+
1348
+ const filePath = modeStateFile(cwd, mode, sessionId);
1349
+ const forced = hasFlag(args, "--force");
1350
+ const existingRead = await readExistingStateForMutation(filePath);
1351
+ if (existingRead.kind === "corrupt" && !forced) {
1352
+ throw new StateCommandError(
1353
+ 2,
1354
+ `existing state for ${mode} is corrupt or tampered (${existingRead.error}); use --force to overwrite`,
1355
+ );
1356
+ }
1357
+ const existing = existingRead.kind === "valid" ? existingRead.value : {};
1358
+ const clearedAt = nowIso();
1359
+ const cleared: Record<string, unknown> = {
1360
+ skill: mode,
1361
+ ...existing,
1362
+ active: false,
1363
+ current_phase: "complete",
1364
+ updated_at: clearedAt,
1365
+ version: WORKFLOW_STATE_VERSION,
1366
+ };
1367
+ cleared.skill = mode;
1368
+ const mutationId = `${mode}:clear:${clearedAt}`;
1369
+ const receipt = buildWorkflowStateReceipt({
1370
+ cwd,
1371
+ skill: mode,
1372
+ owner: "skc-state-cli",
1373
+ command: `skc state ${mode} clear`,
1374
+ sessionId,
1375
+ nowIso: clearedAt,
1376
+ mutationId,
1377
+ });
1378
+ cleared.receipt = receipt;
1379
+ const { warning: outOfBandWarning, stamped } = await writeJsonAtomic(cwd, filePath, cleared, "clear", {
1380
+ skill: mode,
1381
+ mutationId,
1382
+ force: forced,
1383
+ fromPhase: typeof existing.current_phase === "string" ? existing.current_phase : undefined,
1384
+ toPhase: "complete",
1385
+ });
1386
+ const stampedReceipt = isPlainObject(stamped.receipt) ? stamped.receipt : {};
1387
+
1388
+ await syncWorkflowSkillState({
1389
+ cwd,
1390
+ mode,
1391
+ sessionId,
1392
+ threadId,
1393
+ turnId,
1394
+ active: false,
1395
+ phase: "complete",
1396
+ payload: cleared,
1397
+ });
1398
+ return {
1399
+ status: 0,
1400
+ stdout: renderCliWriteReceipt({
1401
+ ok: true,
1402
+ skill: mode,
1403
+ state_path: filePath,
1404
+ active: false,
1405
+ current_phase: typeof cleared.current_phase === "string" ? cleared.current_phase : undefined,
1406
+ mutation_id: typeof stampedReceipt.mutation_id === "string" ? stampedReceipt.mutation_id : mutationId,
1407
+ status: typeof stampedReceipt.status === "string" ? stampedReceipt.status : undefined,
1408
+ content_sha256: stampedReceipt.content_sha256,
1409
+ }),
1410
+ ...(outOfBandWarning ? { stderr: `${outOfBandWarning}\n` } : {}),
1411
+ };
1412
+ }
1413
+
1414
+ /**
1415
+ * `handoff` exists in two distinct roles:
1416
+ * - As a verb: this CLI action, which atomically transitions caller→callee.
1417
+ * Writes the callee mode-state first, the caller mode-state second, then
1418
+ * syncs both `skill-active-state.json` files. Every intermediate crashed
1419
+ * state remains HUD-coherent: the active-state file either reflects the
1420
+ * old skill entirely or the new skill entirely, never both as active.
1421
+ * - As a phase: `current_phase: "handoff"` is set by this verb when demoting
1422
+ * the caller. Agents writing `current_phase: "handoff"` manually via
1423
+ * `skc state <skill> write` are declaring "I am ready to be handed off";
1424
+ * the next agent-initiated `skill` tool call will then satisfy the phase
1425
+ * guard and may chain.
1426
+ *
1427
+ * `handoff` is in the terminal-phase set used by `isTerminalModeState` and by
1428
+ * the skill tool's chain guard. A manual `current_phase: "handoff"` write does
1429
+ * NOT mark `active: false` — only this verb does that — so a skill that wrote
1430
+ * the phase remains in `skill-active-state.json` until a chain call (or
1431
+ * explicit `clear`) demotes it.
1432
+ */
1433
+ async function handleHandoff(
1434
+ args: readonly string[],
1435
+ cwd: string,
1436
+ positionalSkill: string | undefined,
1437
+ ): Promise<StateCommandResult> {
1438
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1439
+ const { sessionId, threadId, turnId } = selectors;
1440
+ const caller = selectors.mode ?? (await inferModeFromActiveState(cwd, sessionId));
1441
+ if (!caller) {
1442
+ throw new StateCommandError(
1443
+ 2,
1444
+ "skc state handoff requires --mode <caller>, positional <caller>, input.skill, or an active workflow in .skc/state/skill-active-state.json",
1445
+ );
1446
+ }
1447
+ const calleeRaw = flagValue(args, "--to")?.trim();
1448
+ if (!calleeRaw) {
1449
+ throw new StateCommandError(2, "skc state handoff requires --to <callee>");
1450
+ }
1451
+ assertKnownMode(calleeRaw);
1452
+ const callee = calleeRaw as CanonicalSkcWorkflowSkill;
1453
+ if (callee === caller) {
1454
+ throw new StateCommandError(2, `skc state handoff: --to must differ from caller (both are "${caller}")`);
1455
+ }
1456
+
1457
+ const callerPath = modeStateFile(cwd, caller, sessionId);
1458
+ const calleePath = modeStateFile(cwd, callee, sessionId);
1459
+ const forced = hasFlag(args, "--force");
1460
+ const callerRead = await readExistingStateForMutation(callerPath);
1461
+ if (callerRead.kind === "corrupt" && !forced) {
1462
+ throw new StateCommandError(
1463
+ 2,
1464
+ `existing state for ${caller} is corrupt or tampered (${callerRead.error}); use --force to overwrite`,
1465
+ );
1466
+ }
1467
+ if (callerRead.kind === "absent") {
1468
+ throw new StateCommandError(
1469
+ 2,
1470
+ `skc state ${caller} handoff: caller is not active (no mode-state file at ${callerPath})`,
1471
+ );
1472
+ }
1473
+ const calleeRead = await readExistingStateForMutation(calleePath);
1474
+ if (calleeRead.kind === "corrupt" && !forced) {
1475
+ throw new StateCommandError(
1476
+ 2,
1477
+ `existing state for ${callee} is corrupt or tampered (${calleeRead.error}); use --force to overwrite`,
1478
+ );
1479
+ }
1480
+ const existingCaller = callerRead.kind === "valid" ? callerRead.value : {};
1481
+ const existingCallee = calleeRead.kind === "valid" ? calleeRead.value : {};
1482
+
1483
+ const handoffAt = nowIso();
1484
+ const mutationId = `${caller}:handoff:${callee}:${handoffAt}`;
1485
+ const callerReceipt = buildWorkflowStateReceipt({
1486
+ cwd,
1487
+ skill: caller,
1488
+ owner: "skc-state-cli",
1489
+ command: `skc state ${caller} handoff --to ${callee}`,
1490
+ sessionId,
1491
+ nowIso: handoffAt,
1492
+ mutationId,
1493
+ });
1494
+ const calleeReceipt = buildWorkflowStateReceipt({
1495
+ cwd,
1496
+ skill: callee,
1497
+ owner: "skc-state-cli",
1498
+ command: `skc state ${caller} handoff --to ${callee}`,
1499
+ sessionId,
1500
+ nowIso: handoffAt,
1501
+ mutationId,
1502
+ });
1503
+
1504
+ const calleeInitial = initialPhaseForSkill(callee);
1505
+ const normalizedCaller =
1506
+ caller === "deep-interview"
1507
+ ? (normalizeDeepInterviewEnvelope(migrateWorkflowState(existingCaller, caller).state) as Record<
1508
+ string,
1509
+ unknown
1510
+ >)
1511
+ : migrateWorkflowState(existingCaller, caller).state;
1512
+ const normalizedCallee =
1513
+ callee === "deep-interview"
1514
+ ? (normalizeDeepInterviewEnvelope(migrateWorkflowState(existingCallee, callee).state) as Record<
1515
+ string,
1516
+ unknown
1517
+ >)
1518
+ : migrateWorkflowState(existingCallee, callee).state;
1519
+ const mergedCalleeState: Record<string, unknown> = {
1520
+ ...normalizedCallee,
1521
+ skill: callee,
1522
+ version: WORKFLOW_STATE_VERSION,
1523
+ active: true,
1524
+ current_phase: calleeInitial,
1525
+ handoff_from: caller,
1526
+ handoff_at: handoffAt,
1527
+ updated_at: handoffAt,
1528
+ receipt: calleeReceipt,
1529
+ };
1530
+ if (sessionId && typeof mergedCalleeState.session_id !== "string") {
1531
+ mergedCalleeState.session_id = sessionId;
1532
+ }
1533
+ const mergedCallerState: Record<string, unknown> = {
1534
+ ...normalizedCaller,
1535
+ skill: caller,
1536
+ version: WORKFLOW_STATE_VERSION,
1537
+ active: false,
1538
+ current_phase: "handoff",
1539
+ handoff_to: callee,
1540
+ handoff_at: handoffAt,
1541
+ updated_at: handoffAt,
1542
+ receipt: callerReceipt,
1543
+ };
1544
+
1545
+ await beginWorkflowTransactionJournal({
1546
+ cwd,
1547
+ mutationId,
1548
+ caller,
1549
+ callee,
1550
+ paths: [calleePath, callerPath, activeStateFile(cwd, sessionId)],
1551
+ });
1552
+
1553
+ // Atomic write order (architecture blocker AR-3): mode-state files first,
1554
+ // then a single atomic active-state mutation per file (session before root)
1555
+ // via applyHandoffToActiveState. The single-write transaction prevents the
1556
+ // HUD from observing a window where neither caller nor callee is active,
1557
+ // and write order keeps the session-scoped source of truth ahead of the
1558
+ // root aggregate. strict:true on the active-state read tolerates ENOENT
1559
+ // only; corrupt JSON / IO failures propagate as non-zero CLI status.
1560
+ const force = hasFlag(args, "--force");
1561
+ const calleeWrite = await writeJsonAtomic(cwd, calleePath, mergedCalleeState, "handoff", {
1562
+ skill: callee,
1563
+ mutationId,
1564
+ force,
1565
+ fromPhase: typeof existingCallee.current_phase === "string" ? existingCallee.current_phase : undefined,
1566
+ toPhase: calleeInitial,
1567
+ });
1568
+ await updateWorkflowTransactionJournal(cwd, mutationId, { steps: ["callee-mode-state"] });
1569
+ const callerWrite = await writeJsonAtomic(cwd, callerPath, mergedCallerState, "handoff", {
1570
+ skill: caller,
1571
+ mutationId,
1572
+ force,
1573
+ fromPhase: typeof existingCaller.current_phase === "string" ? existingCaller.current_phase : undefined,
1574
+ toPhase: "handoff",
1575
+ });
1576
+ await updateWorkflowTransactionJournal(cwd, mutationId, {
1577
+ steps: ["callee-mode-state", "caller-mode-state"],
1578
+ });
1579
+ const warnings = [calleeWrite.warning, callerWrite.warning].filter(
1580
+ (warning): warning is string => typeof warning === "string",
1581
+ );
1582
+ const stampedCallerReceipt = isPlainObject(callerWrite.stamped.receipt) ? callerWrite.stamped.receipt : {};
1583
+ const stampedCalleeReceipt = isPlainObject(calleeWrite.stamped.receipt) ? calleeWrite.stamped.receipt : {};
1584
+ for (const warning of warnings) process.stderr.write(`${warning}\n`);
1585
+ if (process.env.SKC_STATE_HANDOFF_FAIL_AFTER_CALLER === mutationId) {
1586
+ throw new StateCommandError(1, `injected handoff failure after caller write for ${mutationId}`);
1587
+ }
1588
+ await applyHandoffToActiveState({
1589
+ cwd,
1590
+ nowIso: handoffAt,
1591
+ strict: true,
1592
+ caller: {
1593
+ cwd,
1594
+ skill: caller,
1595
+ active: false,
1596
+ phase: "handoff",
1597
+ sessionId,
1598
+ threadId,
1599
+ turnId,
1600
+ source: "skc-state-cli",
1601
+ hud: buildHudForMode(caller, mergedCallerState),
1602
+ handoff_to: callee,
1603
+ handoff_at: handoffAt,
1604
+ receipt: callerReceipt,
1605
+ },
1606
+ callee: {
1607
+ cwd,
1608
+ skill: callee,
1609
+ active: true,
1610
+ phase: calleeInitial,
1611
+ sessionId,
1612
+ threadId,
1613
+ turnId,
1614
+ source: "skc-state-cli",
1615
+ hud: buildHudForMode(callee, mergedCalleeState),
1616
+ handoff_from: caller,
1617
+ handoff_at: handoffAt,
1618
+ receipt: calleeReceipt,
1619
+ },
1620
+ });
1621
+ await updateWorkflowTransactionJournal(cwd, mutationId, {
1622
+ steps: ["callee-mode-state", "caller-mode-state", "active-state"],
1623
+ });
1624
+ await completeWorkflowTransactionJournal(cwd, mutationId);
1625
+
1626
+ return {
1627
+ status: 0,
1628
+ stdout: renderCliWriteReceipt({
1629
+ ok: true,
1630
+ from: caller,
1631
+ to: callee,
1632
+ handoff_at: handoffAt,
1633
+ phases: {
1634
+ from: mergedCallerState.current_phase,
1635
+ to: mergedCalleeState.current_phase,
1636
+ },
1637
+ receipts: {
1638
+ from: {
1639
+ mutation_id: stampedCallerReceipt.mutation_id,
1640
+ status: stampedCallerReceipt.status,
1641
+ content_sha256: stampedCallerReceipt.content_sha256,
1642
+ },
1643
+ to: {
1644
+ mutation_id: stampedCalleeReceipt.mutation_id,
1645
+ status: stampedCalleeReceipt.status,
1646
+ content_sha256: stampedCalleeReceipt.content_sha256,
1647
+ },
1648
+ },
1649
+ paths: {
1650
+ from: callerPath,
1651
+ to: calleePath,
1652
+ active_state: activeStateFile(cwd, sessionId),
1653
+ },
1654
+ }),
1655
+ };
1656
+ }
1657
+
1658
+ async function handleContract(
1659
+ args: readonly string[],
1660
+ cwd: string,
1661
+ positionalSkill: string | undefined,
1662
+ ): Promise<StateCommandResult> {
1663
+ const { mode } = await resolveSelectors(args, cwd, positionalSkill);
1664
+ if (!mode) {
1665
+ throw new StateCommandError(2, "skc state contract requires --mode <skill>, positional <skill>, or input.skill");
1666
+ }
1667
+ const payload = { skill: mode, contract: describeWorkflowStateContract(mode) };
1668
+ return {
1669
+ status: 0,
1670
+ stdout: hasFlag(args, "--json")
1671
+ ? `${JSON.stringify(payload, null, 2)}\n`
1672
+ : renderContractMarkdown(mode, payload.contract),
1673
+ };
1674
+ }
1675
+
1676
+ function parseNonNegativeIntegerFlag(args: readonly string[], flag: string): number | undefined {
1677
+ const value = flagValue(args, flag);
1678
+ if (value === undefined) return undefined;
1679
+ const parsed = Number(value);
1680
+ if (!Number.isInteger(parsed) || parsed < 0) {
1681
+ throw new StateCommandError(2, `skc state ${flag} requires a non-negative integer value`);
1682
+ }
1683
+ return parsed;
1684
+ }
1685
+
1686
+ function statusFromFile(value: unknown): string | undefined {
1687
+ if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
1688
+ const record = value as Record<string, unknown>;
1689
+ if (typeof record.status === "string") return record.status;
1690
+ if (record.receipt && typeof record.receipt === "object" && !Array.isArray(record.receipt)) {
1691
+ const receiptStatus = (record.receipt as Record<string, unknown>).status;
1692
+ if (typeof receiptStatus === "string") return receiptStatus;
1693
+ }
1694
+ return undefined;
1695
+ }
1696
+
1697
+ interface RetentionCandidate {
1698
+ path: string;
1699
+ relativePath: string;
1700
+ category: string;
1701
+ mtimeMs: number;
1702
+ policy: { keep?: number; maxAgeDays?: number };
1703
+ }
1704
+
1705
+ interface GcSummary {
1706
+ skill: CanonicalSkcWorkflowSkill | "all";
1707
+ dry_run: boolean;
1708
+ eligible: string[];
1709
+ pruned: string[];
1710
+ counts: Record<string, number>;
1711
+ }
1712
+
1713
+ function categoryForStateRelativePath(relativePath: string): string | undefined {
1714
+ const normalized = relativePath.split(path.sep).join("/");
1715
+ if (normalized === "audit.jsonl") return undefined;
1716
+ if (normalized === SKILL_ACTIVE_STATE_FILE || normalized.endsWith(`/${SKILL_ACTIVE_STATE_FILE}`)) return undefined;
1717
+ if (normalized.startsWith("active/") || normalized.includes("/active/")) return undefined;
1718
+ if (
1719
+ /^[^/]+-state\.json$/.test(normalized) ||
1720
+ (normalized.includes("/sessions/") && /\/[^/]+-state\.json$/.test(normalized))
1721
+ )
1722
+ return undefined;
1723
+ if (normalized.startsWith("artifacts/") || normalized.includes("/artifacts/")) return "artifact";
1724
+ if (
1725
+ normalized.startsWith("logs/") ||
1726
+ normalized.includes("/logs/") ||
1727
+ normalized.endsWith(".log") ||
1728
+ normalized.endsWith(".jsonl")
1729
+ )
1730
+ return "log";
1731
+ if (normalized.startsWith("reports/") || normalized.includes("/reports/")) return "report";
1732
+ if (normalized.startsWith("ledgers/") || normalized.includes("/ledgers/")) return "ledger";
1733
+ if (normalized.startsWith("agents/") || normalized.includes("/agents/")) return "agents";
1734
+ if (normalized.startsWith("force/") || normalized.includes("/force/")) return "force";
1735
+ if (
1736
+ normalized.startsWith("prune/") ||
1737
+ normalized.includes("/prune/") ||
1738
+ normalized.startsWith("delete/") ||
1739
+ normalized.includes("/delete/")
1740
+ )
1741
+ return "prune/delete";
1742
+ if (normalized.startsWith("transactions/") || normalized.includes("/transactions/")) return "prune/delete";
1743
+ return undefined;
1744
+ }
1745
+
1746
+ async function collectRetentionCandidates(
1747
+ cwd: string,
1748
+ skills: readonly CanonicalSkcWorkflowSkill[],
1749
+ ): Promise<RetentionCandidate[]> {
1750
+ const stateRoot = path.join(cwd, ".skc", "state");
1751
+ const policies = new Map<string, { keep?: number; maxAgeDays?: number }>();
1752
+ for (const skill of skills) {
1753
+ for (const policy of getSkillManifest(skill).retention) {
1754
+ const existing = policies.get(policy.category);
1755
+ policies.set(policy.category, {
1756
+ keep: Math.max(existing?.keep ?? 0, policy.keep ?? 0) || undefined,
1757
+ maxAgeDays:
1758
+ existing?.maxAgeDays === undefined
1759
+ ? policy.maxAgeDays
1760
+ : policy.maxAgeDays === undefined
1761
+ ? existing.maxAgeDays
1762
+ : Math.max(existing.maxAgeDays, policy.maxAgeDays),
1763
+ });
1764
+ }
1765
+ }
1766
+ const candidates: RetentionCandidate[] = [];
1767
+ async function visit(dir: string): Promise<void> {
1768
+ let entries: string[];
1769
+ try {
1770
+ entries = await fs.readdir(dir);
1771
+ } catch (error) {
1772
+ const err = error as NodeJS.ErrnoException;
1773
+ if (err.code === "ENOENT") return;
1774
+ throw error;
1775
+ }
1776
+ for (const entry of entries) {
1777
+ const filePath = path.join(dir, entry);
1778
+ const stat = await fs.stat(filePath);
1779
+ if (stat.isDirectory()) {
1780
+ await visit(filePath);
1781
+ continue;
1782
+ }
1783
+ if (!stat.isFile()) continue;
1784
+ const relativePath = path.relative(stateRoot, filePath);
1785
+ const category = categoryForStateRelativePath(relativePath);
1786
+ if (!category) continue;
1787
+ const policy = policies.get(category);
1788
+ if (!policy) continue;
1789
+ candidates.push({ path: filePath, relativePath, category, mtimeMs: stat.mtimeMs, policy });
1790
+ }
1791
+ }
1792
+ await visit(stateRoot);
1793
+ return candidates;
1794
+ }
1795
+
1796
+ function selectRetentionEligible(candidates: readonly RetentionCandidate[]): RetentionCandidate[] {
1797
+ const now = Date.now();
1798
+ const byCategory = new Map<string, RetentionCandidate[]>();
1799
+ for (const candidate of candidates) {
1800
+ const list = byCategory.get(candidate.category) ?? [];
1801
+ list.push(candidate);
1802
+ byCategory.set(candidate.category, list);
1803
+ }
1804
+ const eligible = new Set<RetentionCandidate>();
1805
+ for (const list of byCategory.values()) {
1806
+ list.sort((a, b) => b.mtimeMs - a.mtimeMs || a.relativePath.localeCompare(b.relativePath));
1807
+ for (let index = 0; index < list.length; index += 1) {
1808
+ const candidate = list[index];
1809
+ const keep = candidate.policy.keep ?? 0;
1810
+ if (keep > 0 && index < keep) continue;
1811
+ if (candidate.policy.maxAgeDays !== undefined) {
1812
+ const maxAgeMs = candidate.policy.maxAgeDays * 24 * 60 * 60 * 1000;
1813
+ if (now - candidate.mtimeMs < maxAgeMs) continue;
1814
+ }
1815
+ if (candidate.policy.keep !== undefined || candidate.policy.maxAgeDays !== undefined) eligible.add(candidate);
1816
+ }
1817
+ }
1818
+ return [...eligible].sort((a, b) => a.relativePath.localeCompare(b.relativePath));
1819
+ }
1820
+
1821
+ async function buildGcSummary(
1822
+ args: readonly string[],
1823
+ cwd: string,
1824
+ positionalSkill: string | undefined,
1825
+ dryRun: boolean,
1826
+ ): Promise<GcSummary> {
1827
+ const rawSkill =
1828
+ flagValue(args, "--skill")?.trim() || flagValue(args, "--mode")?.trim() || positionalSkill?.trim() || "all";
1829
+ if (rawSkill !== "all") assertKnownMode(rawSkill);
1830
+ const skills = rawSkill === "all" ? CANONICAL_SKC_WORKFLOW_SKILLS : [rawSkill as CanonicalSkcWorkflowSkill];
1831
+ const eligible = selectRetentionEligible(await collectRetentionCandidates(cwd, skills));
1832
+ const counts: Record<string, number> = {};
1833
+ for (const candidate of eligible) counts[candidate.category] = (counts[candidate.category] ?? 0) + 1;
1834
+ const targets: GenericHardPruneTarget[] = eligible.map(candidate => ({
1835
+ path: candidate.path,
1836
+ category: candidate.category,
1837
+ }));
1838
+ let pruned: string[] = [];
1839
+ if (!dryRun && targets.length > 0) {
1840
+ const eligiblePaths = new Set(eligible.map(candidate => path.resolve(candidate.path)));
1841
+ pruned = await hardPrune(targets, context => eligiblePaths.has(path.resolve(context.path)), {
1842
+ cwd,
1843
+ audit: {
1844
+ cwd,
1845
+ skill: rawSkill,
1846
+ category: "prune",
1847
+ verb: "gc",
1848
+ owner: "skc-state-cli",
1849
+ },
1850
+ });
1851
+ }
1852
+ return {
1853
+ skill: rawSkill as CanonicalSkcWorkflowSkill | "all",
1854
+ dry_run: dryRun,
1855
+ eligible: eligible.map(candidate => candidate.relativePath),
1856
+ pruned: pruned.map(filePath => path.relative(path.join(cwd, ".skc", "state"), filePath)),
1857
+ counts,
1858
+ };
1859
+ }
1860
+
1861
+ async function handleGraph(
1862
+ args: readonly string[],
1863
+ _cwd: string,
1864
+ positionalSkill: string | undefined,
1865
+ ): Promise<StateCommandResult> {
1866
+ if (hasFlag(args, "--history")) {
1867
+ const history = await readAuditWindow(_cwd, args);
1868
+ return {
1869
+ status: 0,
1870
+ stdout: hasFlag(args, "--json") ? `${JSON.stringify(history, null, 2)}\n` : renderHistoryMarkdown(history),
1871
+ };
1872
+ }
1873
+ const rawSkill = flagValue(args, "--skill")?.trim() || positionalSkill?.trim() || "all";
1874
+ if (rawSkill !== "all") assertKnownMode(rawSkill);
1875
+ const format = flagValue(args, "--format")?.trim() || "ascii";
1876
+ if (!GRAPH_FORMATS.has(format)) {
1877
+ throw new StateCommandError(2, `Invalid graph format: ${format}. Expected one of: ascii, mermaid, dot.`);
1878
+ }
1879
+ return {
1880
+ status: 0,
1881
+ stdout: renderStateGraph(rawSkill as CanonicalSkcWorkflowSkill | "all", format as StateGraphFormat),
1882
+ };
1883
+ }
1884
+
1885
+ async function handlePrune(
1886
+ args: readonly string[],
1887
+ cwd: string,
1888
+ positionalSkill: string | undefined,
1889
+ ): Promise<StateCommandResult> {
1890
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1891
+ const mode = selectors.mode ?? (await inferModeFromActiveState(cwd, selectors.sessionId));
1892
+ if (!mode) {
1893
+ throw new StateCommandError(
1894
+ 2,
1895
+ "skc state prune requires --mode <skill>, positional <skill>, input.skill, or an active workflow in .skc/state/skill-active-state.json",
1896
+ );
1897
+ }
1898
+ const filePath = modeStateFile(cwd, mode, selectors.sessionId);
1899
+ const olderThanDays = parseNonNegativeIntegerFlag(args, "--older-than");
1900
+ const status = flagValue(args, "--status")?.trim();
1901
+ const targets: GenericHardPruneTarget[] = [{ path: filePath, category: "prune" }];
1902
+ const audit: StateWriterAuditContext = {
1903
+ cwd,
1904
+ skill: mode,
1905
+ category: "prune",
1906
+ verb: hasFlag(args, "--hard") ? "hard-prune" : "soft-delete",
1907
+ owner: "skc-state-cli",
1908
+ };
1909
+ const olderThanMs = olderThanDays === undefined ? undefined : olderThanDays * 24 * 60 * 60 * 1000;
1910
+ const matchesSelector = async (
1911
+ stat: { mtimeMs: number | bigint },
1912
+ readJson: () => Promise<unknown>,
1913
+ ): Promise<boolean> => {
1914
+ const mtimeMs = typeof stat.mtimeMs === "bigint" ? Number(stat.mtimeMs) : stat.mtimeMs;
1915
+ if (olderThanMs !== undefined && Date.now() - mtimeMs < olderThanMs) return false;
1916
+ if (status) return statusFromFile(await readJson()) === status;
1917
+ return true;
1918
+ };
1919
+ if (hasFlag(args, "--hard")) {
1920
+ const pruned = await hardPrune(
1921
+ targets,
1922
+ context => (context.stat ? matchesSelector(context.stat, context.readJson) : false),
1923
+ { cwd, audit },
1924
+ );
1925
+ return { status: 0, stdout: `${JSON.stringify({ skill: mode, hard: true, pruned }, null, 2)}\n` };
1926
+ }
1927
+ let deleted: string[] = [];
1928
+ try {
1929
+ const stat = await fs.stat(filePath);
1930
+ if (await matchesSelector(stat, async () => JSON.parse(await fs.readFile(filePath, "utf-8")))) {
1931
+ const archivedPath = await softDelete(
1932
+ filePath,
1933
+ { skill: mode, reason: "skc state prune", status: status ?? null, older_than_days: olderThanDays ?? null },
1934
+ { cwd, audit },
1935
+ );
1936
+ deleted = [archivedPath];
1937
+ }
1938
+ } catch (error) {
1939
+ const err = error as NodeJS.ErrnoException;
1940
+ if (err.code !== "ENOENT") throw error;
1941
+ }
1942
+ return { status: 0, stdout: `${JSON.stringify({ skill: mode, hard: false, soft_deleted: deleted }, null, 2)}\n` };
1943
+ }
1944
+
1945
+ async function handleGc(
1946
+ args: readonly string[],
1947
+ cwd: string,
1948
+ positionalSkill: string | undefined,
1949
+ ): Promise<StateCommandResult> {
1950
+ const summary = await buildGcSummary(args, cwd, positionalSkill, hasFlag(args, "--dry-run"));
1951
+ return { status: 0, stdout: `${JSON.stringify(summary, null, 2)}\n` };
1952
+ }
1953
+
1954
+ async function handleMigrate(
1955
+ args: readonly string[],
1956
+ cwd: string,
1957
+ positionalSkill: string | undefined,
1958
+ ): Promise<StateCommandResult> {
1959
+ const selectors = await resolveSelectors(args, cwd, positionalSkill);
1960
+ const mode = selectors.mode ?? (await inferModeFromActiveState(cwd, selectors.sessionId));
1961
+ if (!mode) {
1962
+ throw new StateCommandError(
1963
+ 2,
1964
+ "skc state migrate requires --mode <skill>, positional <skill>, input.skill, or an active workflow in .skc/state/skill-active-state.json",
1965
+ );
1966
+ }
1967
+ const filePath = modeStateFile(cwd, mode, selectors.sessionId);
1968
+ const forced = hasFlag(args, "--force");
1969
+ const mismatchWarning = await warnAndAuditOutOfBandIfNeeded(cwd, filePath, mode, {
1970
+ forced,
1971
+ });
1972
+ if (mismatchWarning && !forced) {
1973
+ throw new StateCommandError(2, `${mismatchWarning}; use --force to migrate tampered mode-state`);
1974
+ }
1975
+ const result = await migrateAndPersistLegacyState({
1976
+ cwd,
1977
+ skill: mode,
1978
+ statePath: filePath,
1979
+ sessionId: selectors.sessionId,
1980
+ });
1981
+ return {
1982
+ status: 0,
1983
+ stdout: `${JSON.stringify({ skill: mode, ...result, integrity_mismatch: Boolean(mismatchWarning) }, null, 2)}\n`,
1984
+ ...(mismatchWarning ? { stderr: `${mismatchWarning}\n` } : {}),
1985
+ };
1986
+ }
1987
+
1988
+ export async function runNativeStateCommand(args: string[], cwd = process.cwd()): Promise<StateCommandResult> {
1989
+ try {
1990
+ const parsed = parsePositionalArgs(args);
1991
+ assertKnownFlags(args, parsed);
1992
+ switch (parsed.action) {
1993
+ case "read":
1994
+ if (hasFlag(args, "--migrate")) return await handleMigrate(args, cwd, parsed.positionalSkill);
1995
+ return await handleRead(args, cwd, parsed.positionalSkill);
1996
+ case "write":
1997
+ return await handleWrite(args, cwd, parsed.positionalSkill);
1998
+ case "clear":
1999
+ return await handleClear(args, cwd, parsed.positionalSkill);
2000
+ case "contract":
2001
+ return await handleContract(args, cwd, parsed.positionalSkill);
2002
+ case "status":
2003
+ return await handleStatus(args, cwd, parsed.positionalSkill);
2004
+ case "doctor":
2005
+ return await handleDoctor(args, cwd, parsed.positionalSkill);
2006
+ case "handoff":
2007
+ return await handleHandoff(args, cwd, parsed.positionalSkill);
2008
+ case "graph":
2009
+ return await handleGraph(args, cwd, parsed.positionalSkill);
2010
+ case "prune":
2011
+ return await handlePrune(args, cwd, parsed.positionalSkill);
2012
+ case "gc":
2013
+ return await handleGc(args, cwd, parsed.positionalSkill);
2014
+ case "migrate":
2015
+ return await handleMigrate(args, cwd, parsed.positionalSkill);
2016
+ default:
2017
+ return { status: 2, stderr: `Unknown skc state command: ${parsed.action}\n` };
2018
+ }
2019
+ } catch (error) {
2020
+ if (error instanceof StateCommandError) return { status: error.exitStatus, stderr: `${error.message}\n` };
2021
+ return { status: 1, stderr: `${error instanceof Error ? error.message : String(error)}\n` };
2022
+ }
2023
+ }