@jawcode-dev/coding-agent 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2104) hide show
  1. package/CHANGELOG.md +376 -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 +294 -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 +30 -0
  46. package/dist/types/cli/notify-cli.d.ts +29 -0
  47. package/dist/types/cli/plugin-cli.d.ts +32 -0
  48. package/dist/types/cli/read-cli.d.ts +4 -0
  49. package/dist/types/cli/session-picker.d.ts +3 -0
  50. package/dist/types/cli/setup-cli.d.ts +45 -0
  51. package/dist/types/cli/shell-cli.d.ts +8 -0
  52. package/dist/types/cli/skills-cli.d.ts +9 -0
  53. package/dist/types/cli/ssh-cli.d.ts +21 -0
  54. package/dist/types/cli/stats-cli.d.ts +17 -0
  55. package/dist/types/cli/update-cli.d.ts +41 -0
  56. package/dist/types/cli/web-search-cli.d.ts +20 -0
  57. package/dist/types/cli/worktree-cli.d.ts +26 -0
  58. package/dist/types/cli.d.ts +4 -0
  59. package/dist/types/commands/acp.d.ts +12 -0
  60. package/dist/types/commands/agents.d.ts +34 -0
  61. package/dist/types/commands/auth-broker.d.ts +54 -0
  62. package/dist/types/commands/auth-gateway.d.ts +32 -0
  63. package/dist/types/commands/chat.d.ts +18 -0
  64. package/dist/types/commands/codex-native-hook.d.ts +6 -0
  65. package/dist/types/commands/commit.d.ts +27 -0
  66. package/dist/types/commands/config.d.ts +30 -0
  67. package/dist/types/commands/contribution-prep.d.ts +18 -0
  68. package/dist/types/commands/coordinator.d.ts +19 -0
  69. package/dist/types/commands/goal.d.ts +31 -0
  70. package/dist/types/commands/grep.d.ts +42 -0
  71. package/dist/types/commands/harness.d.ts +50 -0
  72. package/dist/types/commands/interview.d.ts +51 -0
  73. package/dist/types/commands/launch.d.ts +127 -0
  74. package/dist/types/commands/mcp-serve.d.ts +24 -0
  75. package/dist/types/commands/memory.d.ts +19 -0
  76. package/dist/types/commands/notify.d.ts +30 -0
  77. package/dist/types/commands/orchestrate.d.ts +48 -0
  78. package/dist/types/commands/planphase.d.ts +7 -0
  79. package/dist/types/commands/plugin.d.ts +52 -0
  80. package/dist/types/commands/ralplan.d.ts +7 -0
  81. package/dist/types/commands/read.d.ts +15 -0
  82. package/dist/types/commands/session.d.ts +24 -0
  83. package/dist/types/commands/setup.d.ts +95 -0
  84. package/dist/types/commands/shell.d.ts +21 -0
  85. package/dist/types/commands/skills.d.ts +26 -0
  86. package/dist/types/commands/ssh.d.ts +48 -0
  87. package/dist/types/commands/state.d.ts +7 -0
  88. package/dist/types/commands/stats.d.ts +25 -0
  89. package/dist/types/commands/team.d.ts +24 -0
  90. package/dist/types/commands/ultragoal.d.ts +8 -0
  91. package/dist/types/commands/update.d.ts +20 -0
  92. package/dist/types/commands/web-search.d.ts +33 -0
  93. package/dist/types/commands/worktree.d.ts +31 -0
  94. package/dist/types/commit/agentic/agent.d.ts +31 -0
  95. package/dist/types/commit/agentic/fallback.d.ts +5 -0
  96. package/dist/types/commit/agentic/index.d.ts +2 -0
  97. package/dist/types/commit/agentic/state.d.ts +58 -0
  98. package/dist/types/commit/agentic/tools/analyze-file.d.ts +19 -0
  99. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +10 -0
  100. package/dist/types/commit/agentic/tools/git-hunk.d.ts +9 -0
  101. package/dist/types/commit/agentic/tools/git-overview.d.ts +9 -0
  102. package/dist/types/commit/agentic/tools/index.d.ts +16 -0
  103. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +28 -0
  104. package/dist/types/commit/agentic/tools/propose-commit.d.ts +36 -0
  105. package/dist/types/commit/agentic/tools/recent-commits.d.ts +7 -0
  106. package/dist/types/commit/agentic/tools/schemas.d.ts +27 -0
  107. package/dist/types/commit/agentic/tools/split-commit.d.ts +53 -0
  108. package/dist/types/commit/agentic/topo-sort.d.ts +4 -0
  109. package/dist/types/commit/agentic/trivial.d.ts +7 -0
  110. package/dist/types/commit/agentic/validation.d.ts +20 -0
  111. package/dist/types/commit/analysis/conventional.d.ts +22 -0
  112. package/dist/types/commit/analysis/index.d.ts +4 -0
  113. package/dist/types/commit/analysis/scope.d.ts +6 -0
  114. package/dist/types/commit/analysis/summary.d.ts +19 -0
  115. package/dist/types/commit/analysis/validation.d.ts +8 -0
  116. package/dist/types/commit/changelog/detect.d.ts +2 -0
  117. package/dist/types/commit/changelog/generate.d.ts +30 -0
  118. package/dist/types/commit/changelog/index.d.ts +30 -0
  119. package/dist/types/commit/changelog/parse.d.ts +2 -0
  120. package/dist/types/commit/cli.d.ts +3 -0
  121. package/dist/types/commit/git/diff.d.ts +5 -0
  122. package/dist/types/commit/index.d.ts +4 -0
  123. package/dist/types/commit/map-reduce/index.d.ts +28 -0
  124. package/dist/types/commit/map-reduce/map-phase.d.ts +17 -0
  125. package/dist/types/commit/map-reduce/reduce-phase.d.ts +13 -0
  126. package/dist/types/commit/map-reduce/utils.d.ts +2 -0
  127. package/dist/types/commit/message.d.ts +2 -0
  128. package/dist/types/commit/model-selection.d.ts +15 -0
  129. package/dist/types/commit/pipeline.d.ts +5 -0
  130. package/dist/types/commit/shared-llm.d.ts +54 -0
  131. package/dist/types/commit/types.d.ts +78 -0
  132. package/dist/types/commit/utils/exclusions.d.ts +4 -0
  133. package/dist/types/commit/utils.d.ts +20 -0
  134. package/dist/types/config/config-file.d.ts +58 -0
  135. package/dist/types/config/file-lock.d.ts +6 -0
  136. package/dist/types/config/keybindings.d.ts +359 -0
  137. package/dist/types/config/model-equivalence.d.ts +24 -0
  138. package/dist/types/config/model-profile-activation.d.ts +36 -0
  139. package/dist/types/config/model-profiles.d.ts +19 -0
  140. package/dist/types/config/model-registry.d.ts +445 -0
  141. package/dist/types/config/model-resolver.d.ts +217 -0
  142. package/dist/types/config/models-config-schema.d.ts +652 -0
  143. package/dist/types/config/oauth-provider-aliases.d.ts +1 -0
  144. package/dist/types/config/prompt-templates.d.ts +32 -0
  145. package/dist/types/config/resolve-config-value.d.ts +17 -0
  146. package/dist/types/config/settings-schema.d.ts +3683 -0
  147. package/dist/types/config/settings.d.ts +134 -0
  148. package/dist/types/config/skill-settings-defaults.d.ts +21 -0
  149. package/dist/types/config.d.ts +66 -0
  150. package/dist/types/coordinator/contract.d.ts +4 -0
  151. package/dist/types/coordinator-mcp/policy.d.ts +24 -0
  152. package/dist/types/coordinator-mcp/safety.d.ts +26 -0
  153. package/dist/types/coordinator-mcp/server.d.ts +52 -0
  154. package/dist/types/cursor.d.ts +24 -0
  155. package/dist/types/dap/client.d.ts +38 -0
  156. package/dist/types/dap/config.d.ts +6 -0
  157. package/dist/types/dap/index.d.ts +4 -0
  158. package/dist/types/dap/session.d.ts +108 -0
  159. package/dist/types/dap/types.d.ts +524 -0
  160. package/dist/types/debug/crash-diagnostics.d.ts +45 -0
  161. package/dist/types/debug/index.d.ts +15 -0
  162. package/dist/types/debug/log-formatting.d.ts +4 -0
  163. package/dist/types/debug/log-viewer.d.ts +68 -0
  164. package/dist/types/debug/profiler.d.ts +24 -0
  165. package/dist/types/debug/raw-sse-buffer.d.ts +44 -0
  166. package/dist/types/debug/raw-sse.d.ts +16 -0
  167. package/dist/types/debug/report-bundle.d.ts +55 -0
  168. package/dist/types/debug/runtime-gauges.d.ts +6 -0
  169. package/dist/types/debug/system-info.d.ts +26 -0
  170. package/dist/types/defaults/jwc-defaults.d.ts +69 -0
  171. package/dist/types/discovery/agents-md.d.ts +1 -0
  172. package/dist/types/discovery/agents.d.ts +12 -0
  173. package/dist/types/discovery/builtin.d.ts +1 -0
  174. package/dist/types/discovery/claude-plugins.d.ts +1 -0
  175. package/dist/types/discovery/claude.d.ts +1 -0
  176. package/dist/types/discovery/cli-jaw.d.ts +1 -0
  177. package/dist/types/discovery/cline.d.ts +1 -0
  178. package/dist/types/discovery/codex.d.ts +1 -0
  179. package/dist/types/discovery/cursor.d.ts +16 -0
  180. package/dist/types/discovery/gemini.d.ts +1 -0
  181. package/dist/types/discovery/github.d.ts +1 -0
  182. package/dist/types/discovery/helpers.d.ts +278 -0
  183. package/dist/types/discovery/index.d.ts +49 -0
  184. package/dist/types/discovery/mcp-json.d.ts +1 -0
  185. package/dist/types/discovery/opencode.d.ts +1 -0
  186. package/dist/types/discovery/plugin-dir-roots.d.ts +15 -0
  187. package/dist/types/discovery/ssh.d.ts +1 -0
  188. package/dist/types/discovery/substitute-plugin-root.d.ts +5 -0
  189. package/dist/types/discovery/vscode.d.ts +1 -0
  190. package/dist/types/discovery/windsurf.d.ts +13 -0
  191. package/dist/types/edit/apply-patch/index.d.ts +35 -0
  192. package/dist/types/edit/apply-patch/parser.d.ts +34 -0
  193. package/dist/types/edit/diff.d.ts +75 -0
  194. package/dist/types/edit/file-read-cache.d.ts +25 -0
  195. package/dist/types/edit/index.d.ts +58 -0
  196. package/dist/types/edit/modes/apply-patch.d.ts +24 -0
  197. package/dist/types/edit/modes/patch.d.ts +99 -0
  198. package/dist/types/edit/modes/replace.d.ts +149 -0
  199. package/dist/types/edit/normalize.d.ts +43 -0
  200. package/dist/types/edit/notebook.d.ts +23 -0
  201. package/dist/types/edit/read-file.d.ts +2 -0
  202. package/dist/types/edit/renderer.d.ts +110 -0
  203. package/dist/types/edit/streaming.d.ts +66 -0
  204. package/dist/types/eval/backend.d.ts +40 -0
  205. package/dist/types/eval/index.d.ts +4 -0
  206. package/dist/types/eval/js/context-manager.d.ts +24 -0
  207. package/dist/types/eval/js/executor.d.ts +28 -0
  208. package/dist/types/eval/js/index.d.ts +10 -0
  209. package/dist/types/eval/js/shared/helpers.d.ts +38 -0
  210. package/dist/types/eval/js/shared/indirect-eval.d.ts +14 -0
  211. package/dist/types/eval/js/shared/prelude.d.ts +1 -0
  212. package/dist/types/eval/js/shared/rewrite-imports.d.ts +6 -0
  213. package/dist/types/eval/js/shared/runtime.d.ts +47 -0
  214. package/dist/types/eval/js/shared/types.d.ts +24 -0
  215. package/dist/types/eval/js/tool-bridge.d.ts +18 -0
  216. package/dist/types/eval/js/worker-core.d.ts +5 -0
  217. package/dist/types/eval/js/worker-entry.d.ts +1 -0
  218. package/dist/types/eval/js/worker-protocol.d.ts +77 -0
  219. package/dist/types/eval/py/display.d.ts +25 -0
  220. package/dist/types/eval/py/executor.d.ts +85 -0
  221. package/dist/types/eval/py/index.d.ts +10 -0
  222. package/dist/types/eval/py/kernel.d.ts +63 -0
  223. package/dist/types/eval/py/prelude.d.ts +1 -0
  224. package/dist/types/eval/py/runtime.d.ts +21 -0
  225. package/dist/types/eval/py/tool-bridge.d.ts +20 -0
  226. package/dist/types/eval/types.d.ts +52 -0
  227. package/dist/types/exa/factory.d.ts +13 -0
  228. package/dist/types/exa/index.d.ts +20 -0
  229. package/dist/types/exa/mcp-client.d.ts +45 -0
  230. package/dist/types/exa/render.d.ts +19 -0
  231. package/dist/types/exa/researcher.d.ts +9 -0
  232. package/dist/types/exa/search.d.ts +9 -0
  233. package/dist/types/exa/types.d.ts +155 -0
  234. package/dist/types/exa/websets.d.ts +9 -0
  235. package/dist/types/exec/bash-executor.d.ts +58 -0
  236. package/dist/types/exec/exec.d.ts +25 -0
  237. package/dist/types/exec/idle-timeout-watchdog.d.ts +18 -0
  238. package/dist/types/exec/non-interactive-env.d.ts +4 -0
  239. package/dist/types/export/custom-share.d.ts +20 -0
  240. package/dist/types/export/html/index.d.ts +10 -0
  241. package/dist/types/export/html/template.generated.d.ts +1 -0
  242. package/dist/types/export/html/template.macro.d.ts +5 -0
  243. package/dist/types/export/ttsr.d.ts +44 -0
  244. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +9 -0
  245. package/dist/types/extensibility/custom-commands/bundled/review/index.d.ts +10 -0
  246. package/dist/types/extensibility/custom-commands/index.d.ts +2 -0
  247. package/dist/types/extensibility/custom-commands/loader.d.ts +29 -0
  248. package/dist/types/extensibility/custom-commands/types.d.ts +106 -0
  249. package/dist/types/extensibility/custom-tools/index.d.ts +6 -0
  250. package/dist/types/extensibility/custom-tools/loader.d.ts +69 -0
  251. package/dist/types/extensibility/custom-tools/types.d.ts +227 -0
  252. package/dist/types/extensibility/custom-tools/wrapper.d.ts +23 -0
  253. package/dist/types/extensibility/extensions/compact-handler.d.ts +26 -0
  254. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +29 -0
  255. package/dist/types/extensibility/extensions/index.d.ts +8 -0
  256. package/dist/types/extensibility/extensions/loader.d.ts +43 -0
  257. package/dist/types/extensibility/extensions/runner.d.ts +134 -0
  258. package/dist/types/extensibility/extensions/types.d.ts +916 -0
  259. package/dist/types/extensibility/extensions/wrapper.d.ts +54 -0
  260. package/dist/types/extensibility/hooks/index.d.ts +5 -0
  261. package/dist/types/extensibility/hooks/loader.d.ts +89 -0
  262. package/dist/types/extensibility/hooks/runner.d.ts +126 -0
  263. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +25 -0
  264. package/dist/types/extensibility/hooks/types.d.ts +431 -0
  265. package/dist/types/extensibility/jwc-plugins/activation.d.ts +14 -0
  266. package/dist/types/extensibility/jwc-plugins/index.d.ts +9 -0
  267. package/dist/types/extensibility/jwc-plugins/injection.d.ts +31 -0
  268. package/dist/types/extensibility/jwc-plugins/loader.d.ts +3 -0
  269. package/dist/types/extensibility/jwc-plugins/paths.d.ts +8 -0
  270. package/dist/types/extensibility/jwc-plugins/schema.d.ts +3 -0
  271. package/dist/types/extensibility/jwc-plugins/state.d.ts +9 -0
  272. package/dist/types/extensibility/jwc-plugins/tools.d.ts +8 -0
  273. package/dist/types/extensibility/jwc-plugins/types.d.ts +64 -0
  274. package/dist/types/extensibility/jwc-plugins/validation.d.ts +4 -0
  275. package/dist/types/extensibility/plugins/doctor.d.ts +3 -0
  276. package/dist/types/extensibility/plugins/git-url.d.ts +34 -0
  277. package/dist/types/extensibility/plugins/index.d.ts +7 -0
  278. package/dist/types/extensibility/plugins/installer.d.ts +5 -0
  279. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +2 -0
  280. package/dist/types/extensibility/plugins/loader.d.ts +31 -0
  281. package/dist/types/extensibility/plugins/manager.d.ts +65 -0
  282. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +41 -0
  283. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +48 -0
  284. package/dist/types/extensibility/plugins/marketplace/index.d.ts +6 -0
  285. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +57 -0
  286. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +34 -0
  287. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +28 -0
  288. package/dist/types/extensibility/plugins/marketplace/types.d.ts +130 -0
  289. package/dist/types/extensibility/plugins/parser.d.ts +52 -0
  290. package/dist/types/extensibility/plugins/types.d.ts +149 -0
  291. package/dist/types/extensibility/shared-events.d.ts +280 -0
  292. package/dist/types/extensibility/skills.d.ts +82 -0
  293. package/dist/types/extensibility/slash-commands.d.ts +49 -0
  294. package/dist/types/extensibility/tool-proxy.d.ts +4 -0
  295. package/dist/types/extensibility/typebox.d.ts +155 -0
  296. package/dist/types/extensibility/utils.d.ts +12 -0
  297. package/dist/types/goals/goal-planning-start.d.ts +7 -0
  298. package/dist/types/goals/index.d.ts +3 -0
  299. package/dist/types/goals/runtime.d.ts +62 -0
  300. package/dist/types/goals/state.d.ts +40 -0
  301. package/dist/types/goals/tools/goal-tool.d.ts +62 -0
  302. package/dist/types/harness-control-plane/classifier.d.ts +13 -0
  303. package/dist/types/harness-control-plane/control-endpoint.d.ts +31 -0
  304. package/dist/types/harness-control-plane/finalize.d.ts +55 -0
  305. package/dist/types/harness-control-plane/operate.d.ts +35 -0
  306. package/dist/types/harness-control-plane/owner.d.ts +46 -0
  307. package/dist/types/harness-control-plane/phase-rollup.d.ts +23 -0
  308. package/dist/types/harness-control-plane/preserve.d.ts +19 -0
  309. package/dist/types/harness-control-plane/receipt-ingest.d.ts +19 -0
  310. package/dist/types/harness-control-plane/receipt-spool.d.ts +26 -0
  311. package/dist/types/harness-control-plane/receipts.d.ts +132 -0
  312. package/dist/types/harness-control-plane/rpc-adapter.d.ts +66 -0
  313. package/dist/types/harness-control-plane/seams.d.ts +21 -0
  314. package/dist/types/harness-control-plane/session-lease.d.ts +65 -0
  315. package/dist/types/harness-control-plane/state-machine.d.ts +24 -0
  316. package/dist/types/harness-control-plane/storage.d.ts +60 -0
  317. package/dist/types/harness-control-plane/types.d.ts +179 -0
  318. package/dist/types/hashline/anchors.d.ts +20 -0
  319. package/dist/types/hashline/apply.d.ts +14 -0
  320. package/dist/types/hashline/constants.d.ts +19 -0
  321. package/dist/types/hashline/diff-preview.d.ts +2 -0
  322. package/dist/types/hashline/diff.d.ts +17 -0
  323. package/dist/types/hashline/execute.d.ts +4 -0
  324. package/dist/types/hashline/hash.d.ts +123 -0
  325. package/dist/types/hashline/index.d.ts +13 -0
  326. package/dist/types/hashline/input.d.ts +11 -0
  327. package/dist/types/hashline/parser.d.ts +7 -0
  328. package/dist/types/hashline/prefixes.d.ts +7 -0
  329. package/dist/types/hashline/recovery.d.ts +27 -0
  330. package/dist/types/hashline/stream.d.ts +2 -0
  331. package/dist/types/hashline/types.d.ts +77 -0
  332. package/dist/types/hindsight/backend.d.ts +13 -0
  333. package/dist/types/hindsight/bank.d.ts +54 -0
  334. package/dist/types/hindsight/client.d.ts +224 -0
  335. package/dist/types/hindsight/config.d.ts +51 -0
  336. package/dist/types/hindsight/content.d.ts +71 -0
  337. package/dist/types/hindsight/index.d.ts +8 -0
  338. package/dist/types/hindsight/mental-models.d.ts +125 -0
  339. package/dist/types/hindsight/state.d.ts +99 -0
  340. package/dist/types/hindsight/transcript.d.ts +28 -0
  341. package/dist/types/hooks/codex-native-hooks-config.d.ts +29 -0
  342. package/dist/types/hooks/native-skill-hook.d.ts +16 -0
  343. package/dist/types/hooks/skill-keywords.d.ts +18 -0
  344. package/dist/types/hooks/skill-state.d.ts +88 -0
  345. package/dist/types/index.d.ts +33 -0
  346. package/dist/types/internal-urls/agent-protocol.d.ts +12 -0
  347. package/dist/types/internal-urls/artifact-protocol.d.ts +6 -0
  348. package/dist/types/internal-urls/docs-index.generated.d.ts +2 -0
  349. package/dist/types/internal-urls/index.d.ts +20 -0
  350. package/dist/types/internal-urls/issue-pr-protocol.d.ts +17 -0
  351. package/dist/types/internal-urls/json-query.d.ts +30 -0
  352. package/dist/types/internal-urls/jwc-protocol.d.ts +19 -0
  353. package/dist/types/internal-urls/local-protocol.d.ts +39 -0
  354. package/dist/types/internal-urls/mcp-protocol.d.ts +12 -0
  355. package/dist/types/internal-urls/memory-protocol.d.ts +23 -0
  356. package/dist/types/internal-urls/parse.d.ts +19 -0
  357. package/dist/types/internal-urls/registry-helpers.d.ts +11 -0
  358. package/dist/types/internal-urls/router.d.ts +14 -0
  359. package/dist/types/internal-urls/rule-protocol.d.ts +6 -0
  360. package/dist/types/internal-urls/skill-protocol.d.ts +13 -0
  361. package/dist/types/internal-urls/types.d.ts +109 -0
  362. package/dist/types/jaw-interview/structured-renderer.d.ts +20 -0
  363. package/dist/types/jwc-runtime/actor-registry.d.ts +76 -0
  364. package/dist/types/jwc-runtime/agent-identity.d.ts +6 -0
  365. package/dist/types/jwc-runtime/cli-jaw-home.d.ts +1 -0
  366. package/dist/types/jwc-runtime/cli-jaw-vocab.d.ts +15 -0
  367. package/dist/types/jwc-runtime/cli-write-receipt.d.ts +24 -0
  368. package/dist/types/jwc-runtime/goal-cli.d.ts +7 -0
  369. package/dist/types/jwc-runtime/goal-engine.d.ts +193 -0
  370. package/dist/types/jwc-runtime/goal-guard.d.ts +26 -0
  371. package/dist/types/jwc-runtime/goal-mode-request.d.ts +78 -0
  372. package/dist/types/jwc-runtime/jaw-interview-runtime.d.ts +41 -0
  373. package/dist/types/jwc-runtime/launch-tmux.d.ts +70 -0
  374. package/dist/types/jwc-runtime/launch-worktree.d.ts +46 -0
  375. package/dist/types/jwc-runtime/legacy-storage.d.ts +19 -0
  376. package/dist/types/jwc-runtime/memory-runtime.d.ts +16 -0
  377. package/dist/types/jwc-runtime/orchestrate-runtime.d.ts +12 -0
  378. package/dist/types/jwc-runtime/orchestrate-state.d.ts +246 -0
  379. package/dist/types/jwc-runtime/plan-writer.d.ts +26 -0
  380. package/dist/types/jwc-runtime/restricted-role-agent-bash.d.ts +2 -0
  381. package/dist/types/jwc-runtime/session-state-sidecar.d.ts +17 -0
  382. package/dist/types/jwc-runtime/stage-skill-map.d.ts +7 -0
  383. package/dist/types/jwc-runtime/state-graph.d.ts +4 -0
  384. package/dist/types/jwc-runtime/state-migrations.d.ts +34 -0
  385. package/dist/types/jwc-runtime/state-renderer.d.ts +65 -0
  386. package/dist/types/jwc-runtime/state-runtime.d.ts +37 -0
  387. package/dist/types/jwc-runtime/state-schema.d.ts +324 -0
  388. package/dist/types/jwc-runtime/state-validation.d.ts +6 -0
  389. package/dist/types/jwc-runtime/state-writer.d.ts +147 -0
  390. package/dist/types/jwc-runtime/team-runtime.d.ts +349 -0
  391. package/dist/types/jwc-runtime/tmux-common.d.ts +49 -0
  392. package/dist/types/jwc-runtime/tmux-sessions.d.ts +17 -0
  393. package/dist/types/jwc-runtime/workflow-command-ref.d.ts +43 -0
  394. package/dist/types/jwc-runtime/workflow-manifest.d.ts +54 -0
  395. package/dist/types/lsp/client.d.ts +66 -0
  396. package/dist/types/lsp/clients/biome-client.d.ts +16 -0
  397. package/dist/types/lsp/clients/index.d.ts +19 -0
  398. package/dist/types/lsp/clients/lsp-linter-client.d.ts +16 -0
  399. package/dist/types/lsp/clients/swiftlint-client.d.ts +20 -0
  400. package/dist/types/lsp/config.d.ts +65 -0
  401. package/dist/types/lsp/edits.d.ts +23 -0
  402. package/dist/types/lsp/index.d.ts +130 -0
  403. package/dist/types/lsp/lspmux.d.ts +58 -0
  404. package/dist/types/lsp/render.d.ts +32 -0
  405. package/dist/types/lsp/startup-events.d.ts +11 -0
  406. package/dist/types/lsp/types.d.ts +302 -0
  407. package/dist/types/lsp/utils.d.ts +108 -0
  408. package/dist/types/main.d.ts +72 -0
  409. package/dist/types/mem0/backend.d.ts +2 -0
  410. package/dist/types/mem0/client.d.ts +49 -0
  411. package/dist/types/mem0/config.d.ts +24 -0
  412. package/dist/types/mem0/index.d.ts +5 -0
  413. package/dist/types/mem0/scope.d.ts +12 -0
  414. package/dist/types/mem0/state.d.ts +36 -0
  415. package/dist/types/memories/index.d.ts +28 -0
  416. package/dist/types/memories/local-query.d.ts +112 -0
  417. package/dist/types/memories/memory-config.d.ts +46 -0
  418. package/dist/types/memories/memory-fts.d.ts +51 -0
  419. package/dist/types/memories/memory-model-resolution.d.ts +20 -0
  420. package/dist/types/memories/memory-quality.d.ts +27 -0
  421. package/dist/types/memories/storage.d.ts +110 -0
  422. package/dist/types/memory-backend/index.d.ts +4 -0
  423. package/dist/types/memory-backend/local-backend.d.ts +9 -0
  424. package/dist/types/memory-backend/off-backend.d.ts +7 -0
  425. package/dist/types/memory-backend/resolve.d.ts +16 -0
  426. package/dist/types/memory-backend/types.d.ts +64 -0
  427. package/dist/types/migrate-config-dir-startup.d.ts +1 -0
  428. package/dist/types/migrate-config-dir.d.ts +22 -0
  429. package/dist/types/modes/acp/acp-agent.d.ts +61 -0
  430. package/dist/types/modes/acp/acp-client-bridge.d.ts +9 -0
  431. package/dist/types/modes/acp/acp-event-mapper.d.ts +34 -0
  432. package/dist/types/modes/acp/acp-mode.d.ts +5 -0
  433. package/dist/types/modes/acp/index.d.ts +2 -0
  434. package/dist/types/modes/acp/terminal-auth.d.ts +6 -0
  435. package/dist/types/modes/background-row-model.d.ts +3 -0
  436. package/dist/types/modes/bridge/auth.d.ts +12 -0
  437. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +9 -0
  438. package/dist/types/modes/bridge/bridge-mode.d.ts +46 -0
  439. package/dist/types/modes/bridge/bridge-ui-context.d.ts +88 -0
  440. package/dist/types/modes/bridge/event-stream.d.ts +8 -0
  441. package/dist/types/modes/components/_cli-jaw-entry.d.ts +31 -0
  442. package/dist/types/modes/components/agent-dashboard.d.ts +21 -0
  443. package/dist/types/modes/components/assistant-message.d.ts +33 -0
  444. package/dist/types/modes/components/background-footer-detail.d.ts +6 -0
  445. package/dist/types/modes/components/background-footer-panel-model.d.ts +18 -0
  446. package/dist/types/modes/components/background-footer-panel.d.ts +19 -0
  447. package/dist/types/modes/components/bash-execution.d.ts +37 -0
  448. package/dist/types/modes/components/bordered-loader.d.ts +11 -0
  449. package/dist/types/modes/components/branch-summary-message.d.ts +15 -0
  450. package/dist/types/modes/components/btw-panel.d.ts +16 -0
  451. package/dist/types/modes/components/compaction-summary-message.d.ts +15 -0
  452. package/dist/types/modes/components/composer-chrome.d.ts +7 -0
  453. package/dist/types/modes/components/composer-footer.d.ts +43 -0
  454. package/dist/types/modes/components/countdown-timer.d.ts +14 -0
  455. package/dist/types/modes/components/custom-editor.d.ts +80 -0
  456. package/dist/types/modes/components/custom-message.d.ts +17 -0
  457. package/dist/types/modes/components/custom-provider-wizard.d.ts +10 -0
  458. package/dist/types/modes/components/diff.d.ts +11 -0
  459. package/dist/types/modes/components/dynamic-border.d.ts +14 -0
  460. package/dist/types/modes/components/eval-execution.d.ts +31 -0
  461. package/dist/types/modes/components/execution-shared.d.ts +46 -0
  462. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +26 -0
  463. package/dist/types/modes/components/extensions/extension-list.d.ts +39 -0
  464. package/dist/types/modes/components/extensions/index.d.ts +8 -0
  465. package/dist/types/modes/components/extensions/inspector-panel.d.ts +8 -0
  466. package/dist/types/modes/components/extensions/state-manager.d.ts +50 -0
  467. package/dist/types/modes/components/extensions/types.d.ts +151 -0
  468. package/dist/types/modes/components/footer.d.ts +30 -0
  469. package/dist/types/modes/components/full-transcript-overlay.d.ts +21 -0
  470. package/dist/types/modes/components/help-selector.d.ts +38 -0
  471. package/dist/types/modes/components/history-search.d.ts +7 -0
  472. package/dist/types/modes/components/hook-editor.d.ts +18 -0
  473. package/dist/types/modes/components/hook-input.d.ts +15 -0
  474. package/dist/types/modes/components/hook-message.d.ts +15 -0
  475. package/dist/types/modes/components/hook-selector.d.ts +64 -0
  476. package/dist/types/modes/components/index.d.ts +35 -0
  477. package/dist/types/modes/components/jobs-overlay-model.d.ts +31 -0
  478. package/dist/types/modes/components/jobs-overlay.d.ts +30 -0
  479. package/dist/types/modes/components/keybinding-hints.d.ts +40 -0
  480. package/dist/types/modes/components/login-dialog.d.ts +32 -0
  481. package/dist/types/modes/components/message-frame.d.ts +42 -0
  482. package/dist/types/modes/components/model-selector.d.ts +53 -0
  483. package/dist/types/modes/components/oauth-selector.d.ts +14 -0
  484. package/dist/types/modes/components/pabcd-border.d.ts +8 -0
  485. package/dist/types/modes/components/plugin-selector.d.ts +26 -0
  486. package/dist/types/modes/components/plugin-settings.d.ts +66 -0
  487. package/dist/types/modes/components/provider-onboarding-selector.d.ts +7 -0
  488. package/dist/types/modes/components/queue-mode-selector.d.ts +9 -0
  489. package/dist/types/modes/components/quota-panel.d.ts +21 -0
  490. package/dist/types/modes/components/read-tool-group.d.ts +34 -0
  491. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +25 -0
  492. package/dist/types/modes/components/session-observer-overlay.d.ts +11 -0
  493. package/dist/types/modes/components/session-selector.d.ts +30 -0
  494. package/dist/types/modes/components/settings-defs.d.ts +50 -0
  495. package/dist/types/modes/components/settings-selector.d.ts +56 -0
  496. package/dist/types/modes/components/show-images-selector.d.ts +9 -0
  497. package/dist/types/modes/components/skill-hud/render.d.ts +2 -0
  498. package/dist/types/modes/components/skill-message.d.ts +11 -0
  499. package/dist/types/modes/components/status-line/context-thresholds.d.ts +4 -0
  500. package/dist/types/modes/components/status-line/git-utils.d.ts +22 -0
  501. package/dist/types/modes/components/status-line/index.d.ts +4 -0
  502. package/dist/types/modes/components/status-line/presets.d.ts +3 -0
  503. package/dist/types/modes/components/status-line/segments.d.ts +5 -0
  504. package/dist/types/modes/components/status-line/separators.d.ts +3 -0
  505. package/dist/types/modes/components/status-line/token-rate.d.ts +10 -0
  506. package/dist/types/modes/components/status-line/types.d.ts +92 -0
  507. package/dist/types/modes/components/status-line/workflow-readers.d.ts +21 -0
  508. package/dist/types/modes/components/status-line.d.ts +82 -0
  509. package/dist/types/modes/components/theme-selector.d.ts +10 -0
  510. package/dist/types/modes/components/thinking-selector.d.ts +10 -0
  511. package/dist/types/modes/components/todo-reminder.d.ts +13 -0
  512. package/dist/types/modes/components/tool-execution.d.ts +69 -0
  513. package/dist/types/modes/components/tool-transcript-overlay.d.ts +18 -0
  514. package/dist/types/modes/components/tree-selector.d.ts +31 -0
  515. package/dist/types/modes/components/ttsr-notification.d.ts +15 -0
  516. package/dist/types/modes/components/user-message-selector.d.ts +28 -0
  517. package/dist/types/modes/components/user-message.d.ts +8 -0
  518. package/dist/types/modes/components/visual-truncate.d.ts +19 -0
  519. package/dist/types/modes/components/welcome.d.ts +42 -0
  520. package/dist/types/modes/controllers/btw-controller.d.ts +10 -0
  521. package/dist/types/modes/controllers/command-controller-shared.d.ts +47 -0
  522. package/dist/types/modes/controllers/command-controller.d.ts +39 -0
  523. package/dist/types/modes/controllers/event-controller.d.ts +12 -0
  524. package/dist/types/modes/controllers/extension-ui-controller.d.ts +80 -0
  525. package/dist/types/modes/controllers/input-controller.d.ts +49 -0
  526. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +10 -0
  527. package/dist/types/modes/controllers/selector-controller.d.ts +78 -0
  528. package/dist/types/modes/controllers/ssh-command-controller.d.ts +10 -0
  529. package/dist/types/modes/controllers/todo-command-controller.d.ts +7 -0
  530. package/dist/types/modes/emoji-autocomplete.d.ts +16 -0
  531. package/dist/types/modes/index.d.ts +10 -0
  532. package/dist/types/modes/interactive-mode.d.ts +295 -0
  533. package/dist/types/modes/jobs-observer.d.ts +67 -0
  534. package/dist/types/modes/oauth-manual-input.d.ts +8 -0
  535. package/dist/types/modes/print-mode.d.ts +27 -0
  536. package/dist/types/modes/prompt-action-autocomplete.d.ts +46 -0
  537. package/dist/types/modes/rpc/host-tools.d.ts +1 -0
  538. package/dist/types/modes/rpc/host-uris.d.ts +1 -0
  539. package/dist/types/modes/rpc/rpc-client.d.ts +267 -0
  540. package/dist/types/modes/rpc/rpc-mode.d.ts +67 -0
  541. package/dist/types/modes/rpc/rpc-types.d.ts +765 -0
  542. package/dist/types/modes/runtime-init.d.ts +21 -0
  543. package/dist/types/modes/session-observer-registry.d.ts +26 -0
  544. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +57 -0
  545. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +18 -0
  546. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +35 -0
  547. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +2 -0
  548. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +84 -0
  549. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +38 -0
  550. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +37 -0
  551. package/dist/types/modes/shared/agent-wire/handshake.d.ts +56 -0
  552. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +16 -0
  553. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +17 -0
  554. package/dist/types/modes/shared/agent-wire/jaw-interview-gate.d.ts +58 -0
  555. package/dist/types/modes/shared/agent-wire/protocol.d.ts +25 -0
  556. package/dist/types/modes/shared/agent-wire/responses.d.ts +4 -0
  557. package/dist/types/modes/shared/agent-wire/scopes.d.ts +18 -0
  558. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +25 -0
  559. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +42 -0
  560. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +27 -0
  561. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +27 -0
  562. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +68 -0
  563. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +161 -0
  564. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +61 -0
  565. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +114 -0
  566. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +39 -0
  567. package/dist/types/modes/shared.d.ts +15 -0
  568. package/dist/types/modes/theme/defaults/index.d.ts +499 -0
  569. package/dist/types/modes/theme/mermaid-cache.d.ts +9 -0
  570. package/dist/types/modes/theme/shimmer.d.ts +38 -0
  571. package/dist/types/modes/theme/theme.d.ts +274 -0
  572. package/dist/types/modes/types.d.ts +311 -0
  573. package/dist/types/modes/utils/abort-message.d.ts +4 -0
  574. package/dist/types/modes/utils/compaction-progress.d.ts +20 -0
  575. package/dist/types/modes/utils/context-usage.d.ts +53 -0
  576. package/dist/types/modes/utils/help-markdown.d.ts +17 -0
  577. package/dist/types/modes/utils/hotkeys-markdown.d.ts +5 -0
  578. package/dist/types/modes/utils/keybinding-matchers.d.ts +10 -0
  579. package/dist/types/modes/utils/session-transcript-replay.d.ts +24 -0
  580. package/dist/types/modes/utils/tools-markdown.d.ts +5 -0
  581. package/dist/types/modes/utils/ui-helpers.d.ts +77 -0
  582. package/dist/types/notifications/ask-bridge.d.ts +36 -0
  583. package/dist/types/notifications/config-command-parser.d.ts +27 -0
  584. package/dist/types/notifications/config.d.ts +37 -0
  585. package/dist/types/notifications/daemon-control.d.ts +29 -0
  586. package/dist/types/notifications/daemon-engine.d.ts +64 -0
  587. package/dist/types/notifications/daemon-inbound.d.ts +93 -0
  588. package/dist/types/notifications/daemon-loop.d.ts +28 -0
  589. package/dist/types/notifications/daemon-owner.d.ts +25 -0
  590. package/dist/types/notifications/daemon-runtime.d.ts +32 -0
  591. package/dist/types/notifications/discovery.d.ts +45 -0
  592. package/dist/types/notifications/index.d.ts +34 -0
  593. package/dist/types/notifications/lifecycle-audit.d.ts +60 -0
  594. package/dist/types/notifications/lifecycle-command-parser.d.ts +19 -0
  595. package/dist/types/notifications/lifecycle-control-runtime.d.ts +45 -0
  596. package/dist/types/notifications/notification-redaction.d.ts +36 -0
  597. package/dist/types/notifications/protocol.d.ts +43 -0
  598. package/dist/types/notifications/remote-answer.d.ts +78 -0
  599. package/dist/types/notifications/reply-bridge.d.ts +21 -0
  600. package/dist/types/notifications/server.d.ts +38 -0
  601. package/dist/types/notifications/session-lifecycle.d.ts +22 -0
  602. package/dist/types/notifications/session-registry.d.ts +31 -0
  603. package/dist/types/notifications/telegram-api.d.ts +93 -0
  604. package/dist/types/notifications/telegram-ask-keyboard.d.ts +57 -0
  605. package/dist/types/notifications/telegram-callback-ingest.d.ts +49 -0
  606. package/dist/types/notifications/telegram-inbound-router.d.ts +57 -0
  607. package/dist/types/notifications/telegram-media-policy.d.ts +27 -0
  608. package/dist/types/notifications/telegram-media-render.d.ts +29 -0
  609. package/dist/types/notifications/telegram-message-ingest.d.ts +54 -0
  610. package/dist/types/notifications/telegram-pairing.d.ts +21 -0
  611. package/dist/types/notifications/threaded-lifecycle.d.ts +23 -0
  612. package/dist/types/notifications/threaded-shutdown.d.ts +19 -0
  613. package/dist/types/notifications/threaded-surface.d.ts +71 -0
  614. package/dist/types/notifications/transport-shell.d.ts +47 -0
  615. package/dist/types/notifications/transport-state.d.ts +44 -0
  616. package/dist/types/notifications/workspace-path-confinement.d.ts +12 -0
  617. package/dist/types/plan-mode/approved-plan.d.ts +49 -0
  618. package/dist/types/plan-mode/state.d.ts +6 -0
  619. package/dist/types/registry/agent-registry.d.ts +62 -0
  620. package/dist/types/reminders/star-reminder.d.ts +115 -0
  621. package/dist/types/runtime-mcp/client.d.ts +74 -0
  622. package/dist/types/runtime-mcp/config-writer.d.ts +53 -0
  623. package/dist/types/runtime-mcp/config.d.ts +75 -0
  624. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +7 -0
  625. package/dist/types/runtime-mcp/index.d.ts +18 -0
  626. package/dist/types/runtime-mcp/json-rpc.d.ts +22 -0
  627. package/dist/types/runtime-mcp/loader.d.ts +43 -0
  628. package/dist/types/runtime-mcp/manager.d.ts +193 -0
  629. package/dist/types/runtime-mcp/oauth-discovery.d.ts +40 -0
  630. package/dist/types/runtime-mcp/oauth-flow.d.ts +59 -0
  631. package/dist/types/runtime-mcp/render.d.ts +25 -0
  632. package/dist/types/runtime-mcp/smithery-auth.d.ts +16 -0
  633. package/dist/types/runtime-mcp/smithery-connect.d.ts +38 -0
  634. package/dist/types/runtime-mcp/smithery-registry.d.ts +51 -0
  635. package/dist/types/runtime-mcp/tool-bridge.d.ts +86 -0
  636. package/dist/types/runtime-mcp/tool-cache.d.ts +8 -0
  637. package/dist/types/runtime-mcp/transports/http.d.ts +36 -0
  638. package/dist/types/runtime-mcp/transports/index.d.ts +5 -0
  639. package/dist/types/runtime-mcp/transports/stdio.d.ts +28 -0
  640. package/dist/types/runtime-mcp/types.d.ts +333 -0
  641. package/dist/types/sdk.d.ts +234 -0
  642. package/dist/types/secrets/index.d.ts +10 -0
  643. package/dist/types/secrets/obfuscator.d.ts +23 -0
  644. package/dist/types/secrets/regex.d.ts +2 -0
  645. package/dist/types/session/agent-session.d.ts +1052 -0
  646. package/dist/types/session/agent-storage.d.ts +100 -0
  647. package/dist/types/session/artifacts.d.ts +61 -0
  648. package/dist/types/session/auth-broker-config.d.ts +13 -0
  649. package/dist/types/session/auth-storage.d.ts +6 -0
  650. package/dist/types/session/blob-store.d.ts +112 -0
  651. package/dist/types/session/client-bridge.d.ts +88 -0
  652. package/dist/types/session/contribution-prep.d.ts +47 -0
  653. package/dist/types/session/history-storage.d.ts +16 -0
  654. package/dist/types/session/messages.d.ts +165 -0
  655. package/dist/types/session/pabcd-stage-header.d.ts +18 -0
  656. package/dist/types/session/session-dump-format.d.ts +22 -0
  657. package/dist/types/session/session-manager.d.ts +571 -0
  658. package/dist/types/session/session-storage.d.ts +88 -0
  659. package/dist/types/session/streaming-output.d.ts +196 -0
  660. package/dist/types/session/tool-choice-queue.d.ts +78 -0
  661. package/dist/types/session/yield-queue.d.ts +24 -0
  662. package/dist/types/setup/hermes-setup.d.ts +71 -0
  663. package/dist/types/setup/model-onboarding-guidance.d.ts +9 -0
  664. package/dist/types/setup/provider-onboarding.d.ts +52 -0
  665. package/dist/types/skill-state/active-state.d.ts +115 -0
  666. package/dist/types/skill-state/initial-phase.d.ts +12 -0
  667. package/dist/types/skill-state/jaw-interview-mutation-guard.d.ts +33 -0
  668. package/dist/types/skill-state/workflow-hud.d.ts +76 -0
  669. package/dist/types/skill-state/workflow-state-contract.d.ts +60 -0
  670. package/dist/types/skill-state/workflow-state-version.d.ts +3 -0
  671. package/dist/types/slash-commands/acp-builtins.d.ts +18 -0
  672. package/dist/types/slash-commands/builtin-registry.d.ts +24 -0
  673. package/dist/types/slash-commands/helpers/context-report.d.ts +7 -0
  674. package/dist/types/slash-commands/helpers/format.d.ts +10 -0
  675. package/dist/types/slash-commands/helpers/mcp.d.ts +3 -0
  676. package/dist/types/slash-commands/helpers/parse.d.ts +33 -0
  677. package/dist/types/slash-commands/helpers/ssh.d.ts +3 -0
  678. package/dist/types/slash-commands/helpers/todo.d.ts +3 -0
  679. package/dist/types/slash-commands/helpers/usage-report.d.ts +11 -0
  680. package/dist/types/slash-commands/types.d.ts +120 -0
  681. package/dist/types/ssh/config-writer.d.ts +49 -0
  682. package/dist/types/ssh/connection-manager.d.ts +33 -0
  683. package/dist/types/ssh/ssh-executor.d.ts +37 -0
  684. package/dist/types/ssh/sshfs-mount.d.ts +6 -0
  685. package/dist/types/ssh/utils.d.ts +2 -0
  686. package/dist/types/stt/downloader.d.ts +9 -0
  687. package/dist/types/stt/index.d.ts +3 -0
  688. package/dist/types/stt/recorder.d.ts +13 -0
  689. package/dist/types/stt/setup.d.ts +18 -0
  690. package/dist/types/stt/stt-controller.d.ts +16 -0
  691. package/dist/types/stt/transcriber.d.ts +16 -0
  692. package/dist/types/system-prompt.d.ts +100 -0
  693. package/dist/types/task/agents.d.ts +28 -0
  694. package/dist/types/task/commands.d.ts +35 -0
  695. package/dist/types/task/discovery.d.ts +19 -0
  696. package/dist/types/task/executor.d.ts +113 -0
  697. package/dist/types/task/fork-context-advisory.d.ts +13 -0
  698. package/dist/types/task/id.d.ts +7 -0
  699. package/dist/types/task/index.d.ts +43 -0
  700. package/dist/types/task/jwc-command.d.ts +7 -0
  701. package/dist/types/task/model-presets.d.ts +17 -0
  702. package/dist/types/task/name-generator.d.ts +16 -0
  703. package/dist/types/task/output-manager.d.ts +36 -0
  704. package/dist/types/task/parallel.d.ts +34 -0
  705. package/dist/types/task/receipt.d.ts +86 -0
  706. package/dist/types/task/render.d.ts +28 -0
  707. package/dist/types/task/roi-reconciliation.d.ts +27 -0
  708. package/dist/types/task/simple-mode.d.ts +8 -0
  709. package/dist/types/task/spawn-gate.d.ts +38 -0
  710. package/dist/types/task/subprocess-tool-registry.d.ts +72 -0
  711. package/dist/types/task/types.d.ts +506 -0
  712. package/dist/types/task/worktree.d.ts +94 -0
  713. package/dist/types/thinking.d.ts +31 -0
  714. package/dist/types/tool-discovery/tool-index.d.ts +113 -0
  715. package/dist/types/tools/archive-reader.d.ts +40 -0
  716. package/dist/types/tools/ask.d.ts +152 -0
  717. package/dist/types/tools/ast-edit.d.ts +77 -0
  718. package/dist/types/tools/ast-grep.d.ts +69 -0
  719. package/dist/types/tools/auto-generated-guard.d.ts +17 -0
  720. package/dist/types/tools/background.d.ts +124 -0
  721. package/dist/types/tools/bash-allowed-prefixes.d.ts +5 -0
  722. package/dist/types/tools/bash-command-fixup.d.ts +11 -0
  723. package/dist/types/tools/bash-interactive.d.ts +16 -0
  724. package/dist/types/tools/bash-interceptor.d.ts +24 -0
  725. package/dist/types/tools/bash-pty-selection.d.ts +7 -0
  726. package/dist/types/tools/bash-skill-urls.d.ts +31 -0
  727. package/dist/types/tools/bash.d.ts +156 -0
  728. package/dist/types/tools/browser/actions.d.ts +54 -0
  729. package/dist/types/tools/browser/attach.d.ts +34 -0
  730. package/dist/types/tools/browser/launch.d.ts +62 -0
  731. package/dist/types/tools/browser/readable.d.ts +17 -0
  732. package/dist/types/tools/browser/registry.d.ts +42 -0
  733. package/dist/types/tools/browser/render.d.ts +50 -0
  734. package/dist/types/tools/browser/tab-protocol.d.ts +144 -0
  735. package/dist/types/tools/browser/tab-supervisor.d.ts +63 -0
  736. package/dist/types/tools/browser/tab-worker-entry.d.ts +1 -0
  737. package/dist/types/tools/browser/tab-worker.d.ts +19 -0
  738. package/dist/types/tools/browser.d.ts +194 -0
  739. package/dist/types/tools/calculator.d.ts +76 -0
  740. package/dist/types/tools/checkpoint.d.ts +63 -0
  741. package/dist/types/tools/computer-use-backend.d.ts +6 -0
  742. package/dist/types/tools/computer-use.d.ts +100 -0
  743. package/dist/types/tools/conflict-detect.d.ts +205 -0
  744. package/dist/types/tools/context.d.ts +19 -0
  745. package/dist/types/tools/cron.d.ts +116 -0
  746. package/dist/types/tools/debug.d.ts +209 -0
  747. package/dist/types/tools/eval.d.ts +108 -0
  748. package/dist/types/tools/fetch.d.ts +61 -0
  749. package/dist/types/tools/file-recorder.d.ts +13 -0
  750. package/dist/types/tools/find.d.ts +95 -0
  751. package/dist/types/tools/fs-cache-invalidation.d.ts +15 -0
  752. package/dist/types/tools/gh-format.d.ts +6 -0
  753. package/dist/types/tools/gh-renderer.d.ts +25 -0
  754. package/dist/types/tools/gh.d.ts +356 -0
  755. package/dist/types/tools/github-cache.d.ts +103 -0
  756. package/dist/types/tools/grouped-file-output.d.ts +36 -0
  757. package/dist/types/tools/hindsight-recall.d.ts +21 -0
  758. package/dist/types/tools/hindsight-reflect.d.ts +23 -0
  759. package/dist/types/tools/hindsight-retain.d.ts +27 -0
  760. package/dist/types/tools/image-gen.d.ts +79 -0
  761. package/dist/types/tools/index.d.ts +281 -0
  762. package/dist/types/tools/inspect-image-renderer.d.ts +26 -0
  763. package/dist/types/tools/inspect-image.d.ts +31 -0
  764. package/dist/types/tools/irc.d.ts +79 -0
  765. package/dist/types/tools/job.d.ts +65 -0
  766. package/dist/types/tools/json-tree.d.ts +23 -0
  767. package/dist/types/tools/jtd-to-json-schema.d.ts +29 -0
  768. package/dist/types/tools/jtd-to-typescript.d.ts +26 -0
  769. package/dist/types/tools/jtd-utils.d.ts +42 -0
  770. package/dist/types/tools/list-limit.d.ts +12 -0
  771. package/dist/types/tools/match-line-format.d.ts +11 -0
  772. package/dist/types/tools/monitor.d.ts +65 -0
  773. package/dist/types/tools/output-meta.d.ts +204 -0
  774. package/dist/types/tools/path-utils.d.ts +147 -0
  775. package/dist/types/tools/plan-mode-guard.d.ts +18 -0
  776. package/dist/types/tools/read.d.ts +85 -0
  777. package/dist/types/tools/recipe/index.d.ts +45 -0
  778. package/dist/types/tools/recipe/render.d.ts +36 -0
  779. package/dist/types/tools/recipe/runner.d.ts +60 -0
  780. package/dist/types/tools/recipe/runners/cargo.d.ts +16 -0
  781. package/dist/types/tools/recipe/runners/index.d.ts +2 -0
  782. package/dist/types/tools/recipe/runners/just.d.ts +2 -0
  783. package/dist/types/tools/recipe/runners/make.d.ts +2 -0
  784. package/dist/types/tools/recipe/runners/pkg.d.ts +2 -0
  785. package/dist/types/tools/recipe/runners/task.d.ts +2 -0
  786. package/dist/types/tools/render-mermaid.d.ts +37 -0
  787. package/dist/types/tools/render-utils.d.ts +158 -0
  788. package/dist/types/tools/renderers.d.ts +26 -0
  789. package/dist/types/tools/resolve.d.ts +90 -0
  790. package/dist/types/tools/review.d.ts +63 -0
  791. package/dist/types/tools/search-tool-bm25.d.ts +65 -0
  792. package/dist/types/tools/search.d.ts +93 -0
  793. package/dist/types/tools/skill.d.ts +47 -0
  794. package/dist/types/tools/sqlite-reader.d.ts +93 -0
  795. package/dist/types/tools/ssh.d.ts +67 -0
  796. package/dist/types/tools/subagent-render.d.ts +25 -0
  797. package/dist/types/tools/subagent.d.ts +87 -0
  798. package/dist/types/tools/telegram-send.d.ts +53 -0
  799. package/dist/types/tools/todo-write.d.ts +120 -0
  800. package/dist/types/tools/tool-errors.d.ts +33 -0
  801. package/dist/types/tools/tool-result.d.ts +30 -0
  802. package/dist/types/tools/tool-timeouts.d.ts +51 -0
  803. package/dist/types/tools/vim.d.ts +58 -0
  804. package/dist/types/tools/write.d.ts +59 -0
  805. package/dist/types/tools/yield.d.ts +25 -0
  806. package/dist/types/tui/code-cell.d.ts +32 -0
  807. package/dist/types/tui/file-list.d.ts +22 -0
  808. package/dist/types/tui/hyperlink.d.ts +42 -0
  809. package/dist/types/tui/index.d.ts +11 -0
  810. package/dist/types/tui/output-block.d.ts +28 -0
  811. package/dist/types/tui/status-line.d.ts +18 -0
  812. package/dist/types/tui/tree-list.d.ts +19 -0
  813. package/dist/types/tui/types.d.ts +13 -0
  814. package/dist/types/tui/utils.d.ts +36 -0
  815. package/dist/types/utils/changelog.d.ts +36 -0
  816. package/dist/types/utils/clipboard.d.ts +22 -0
  817. package/dist/types/utils/command-args.d.ts +9 -0
  818. package/dist/types/utils/commit-message-generator.d.ts +7 -0
  819. package/dist/types/utils/edit-mode.d.ts +13 -0
  820. package/dist/types/utils/event-bus.d.ts +6 -0
  821. package/dist/types/utils/external-editor.d.ts +17 -0
  822. package/dist/types/utils/file-display-mode.d.ts +27 -0
  823. package/dist/types/utils/file-mentions.d.ts +11 -0
  824. package/dist/types/utils/git.d.ts +361 -0
  825. package/dist/types/utils/image-loading.d.ts +26 -0
  826. package/dist/types/utils/image-resize.d.ts +39 -0
  827. package/dist/types/utils/lang-from-path.d.ts +8 -0
  828. package/dist/types/utils/markit.d.ts +7 -0
  829. package/dist/types/utils/open.d.ts +2 -0
  830. package/dist/types/utils/session-color.d.ts +10 -0
  831. package/dist/types/utils/shell-snapshot.d.ts +5 -0
  832. package/dist/types/utils/sixel.d.ts +21 -0
  833. package/dist/types/utils/title-generator.d.ts +31 -0
  834. package/dist/types/utils/tokenizer-download.d.ts +4 -0
  835. package/dist/types/utils/tokenizer-encoding.d.ts +7 -0
  836. package/dist/types/utils/tool-choice.d.ts +20 -0
  837. package/dist/types/utils/tools-manager.d.ts +9 -0
  838. package/dist/types/vim/buffer.d.ts +41 -0
  839. package/dist/types/vim/commands.d.ts +6 -0
  840. package/dist/types/vim/engine.d.ts +47 -0
  841. package/dist/types/vim/parser.d.ts +3 -0
  842. package/dist/types/vim/render.d.ts +25 -0
  843. package/dist/types/vim/types.d.ts +182 -0
  844. package/dist/types/web/kagi.d.ts +23 -0
  845. package/dist/types/web/parallel.d.ts +58 -0
  846. package/dist/types/web/public-fetch-url.d.ts +1 -0
  847. package/dist/types/web/scrapers/artifacthub.d.ts +6 -0
  848. package/dist/types/web/scrapers/arxiv.d.ts +5 -0
  849. package/dist/types/web/scrapers/aur.d.ts +5 -0
  850. package/dist/types/web/scrapers/biorxiv.d.ts +5 -0
  851. package/dist/types/web/scrapers/bluesky.d.ts +5 -0
  852. package/dist/types/web/scrapers/brew.d.ts +5 -0
  853. package/dist/types/web/scrapers/cheatsh.d.ts +8 -0
  854. package/dist/types/web/scrapers/chocolatey.d.ts +5 -0
  855. package/dist/types/web/scrapers/choosealicense.d.ts +2 -0
  856. package/dist/types/web/scrapers/cisa-kev.d.ts +5 -0
  857. package/dist/types/web/scrapers/clojars.d.ts +5 -0
  858. package/dist/types/web/scrapers/coingecko.d.ts +5 -0
  859. package/dist/types/web/scrapers/crates-io.d.ts +5 -0
  860. package/dist/types/web/scrapers/crossref.d.ts +2 -0
  861. package/dist/types/web/scrapers/devto.d.ts +5 -0
  862. package/dist/types/web/scrapers/discogs.d.ts +8 -0
  863. package/dist/types/web/scrapers/discourse.d.ts +5 -0
  864. package/dist/types/web/scrapers/dockerhub.d.ts +5 -0
  865. package/dist/types/web/scrapers/docs-rs.d.ts +2 -0
  866. package/dist/types/web/scrapers/fdroid.d.ts +5 -0
  867. package/dist/types/web/scrapers/firefox-addons.d.ts +2 -0
  868. package/dist/types/web/scrapers/flathub.d.ts +2 -0
  869. package/dist/types/web/scrapers/github-gist.d.ts +5 -0
  870. package/dist/types/web/scrapers/github.d.ts +12 -0
  871. package/dist/types/web/scrapers/gitlab.d.ts +5 -0
  872. package/dist/types/web/scrapers/go-pkg.d.ts +5 -0
  873. package/dist/types/web/scrapers/hackage.d.ts +5 -0
  874. package/dist/types/web/scrapers/hackernews.d.ts +2 -0
  875. package/dist/types/web/scrapers/hex.d.ts +5 -0
  876. package/dist/types/web/scrapers/huggingface.d.ts +2 -0
  877. package/dist/types/web/scrapers/iacr.d.ts +5 -0
  878. package/dist/types/web/scrapers/index.d.ts +84 -0
  879. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +2 -0
  880. package/dist/types/web/scrapers/lemmy.d.ts +2 -0
  881. package/dist/types/web/scrapers/lobsters.d.ts +5 -0
  882. package/dist/types/web/scrapers/mastodon.d.ts +5 -0
  883. package/dist/types/web/scrapers/maven.d.ts +6 -0
  884. package/dist/types/web/scrapers/mdn.d.ts +2 -0
  885. package/dist/types/web/scrapers/metacpan.d.ts +5 -0
  886. package/dist/types/web/scrapers/musicbrainz.d.ts +5 -0
  887. package/dist/types/web/scrapers/npm.d.ts +5 -0
  888. package/dist/types/web/scrapers/nuget.d.ts +5 -0
  889. package/dist/types/web/scrapers/nvd.d.ts +5 -0
  890. package/dist/types/web/scrapers/ollama.d.ts +2 -0
  891. package/dist/types/web/scrapers/open-vsx.d.ts +5 -0
  892. package/dist/types/web/scrapers/opencorporates.d.ts +5 -0
  893. package/dist/types/web/scrapers/openlibrary.d.ts +5 -0
  894. package/dist/types/web/scrapers/orcid.d.ts +5 -0
  895. package/dist/types/web/scrapers/osv.d.ts +5 -0
  896. package/dist/types/web/scrapers/packagist.d.ts +5 -0
  897. package/dist/types/web/scrapers/pub-dev.d.ts +5 -0
  898. package/dist/types/web/scrapers/pubmed.d.ts +5 -0
  899. package/dist/types/web/scrapers/pypi.d.ts +5 -0
  900. package/dist/types/web/scrapers/rawg.d.ts +2 -0
  901. package/dist/types/web/scrapers/readthedocs.d.ts +2 -0
  902. package/dist/types/web/scrapers/reddit.d.ts +5 -0
  903. package/dist/types/web/scrapers/repology.d.ts +5 -0
  904. package/dist/types/web/scrapers/rfc.d.ts +5 -0
  905. package/dist/types/web/scrapers/rubygems.d.ts +5 -0
  906. package/dist/types/web/scrapers/searchcode.d.ts +2 -0
  907. package/dist/types/web/scrapers/sec-edgar.d.ts +5 -0
  908. package/dist/types/web/scrapers/semantic-scholar.d.ts +2 -0
  909. package/dist/types/web/scrapers/snapcraft.d.ts +2 -0
  910. package/dist/types/web/scrapers/sourcegraph.d.ts +2 -0
  911. package/dist/types/web/scrapers/spdx.d.ts +5 -0
  912. package/dist/types/web/scrapers/spotify.d.ts +8 -0
  913. package/dist/types/web/scrapers/stackoverflow.d.ts +6 -0
  914. package/dist/types/web/scrapers/terraform.d.ts +5 -0
  915. package/dist/types/web/scrapers/tldr.d.ts +7 -0
  916. package/dist/types/web/scrapers/twitter.d.ts +5 -0
  917. package/dist/types/web/scrapers/types.d.ts +78 -0
  918. package/dist/types/web/scrapers/utils.d.ts +26 -0
  919. package/dist/types/web/scrapers/vimeo.d.ts +5 -0
  920. package/dist/types/web/scrapers/vscode-marketplace.d.ts +5 -0
  921. package/dist/types/web/scrapers/w3c.d.ts +2 -0
  922. package/dist/types/web/scrapers/wikidata.d.ts +5 -0
  923. package/dist/types/web/scrapers/wikipedia.d.ts +5 -0
  924. package/dist/types/web/scrapers/youtube.d.ts +5 -0
  925. package/dist/types/web/search/index.d.ts +95 -0
  926. package/dist/types/web/search/provider.d.ts +35 -0
  927. package/dist/types/web/search/providers/anthropic.d.ts +32 -0
  928. package/dist/types/web/search/providers/base.d.ts +90 -0
  929. package/dist/types/web/search/providers/brave.d.ts +27 -0
  930. package/dist/types/web/search/providers/codex.d.ts +35 -0
  931. package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
  932. package/dist/types/web/search/providers/exa.d.ts +52 -0
  933. package/dist/types/web/search/providers/gemini.d.ts +59 -0
  934. package/dist/types/web/search/providers/jina.d.ts +26 -0
  935. package/dist/types/web/search/providers/kagi.d.ts +24 -0
  936. package/dist/types/web/search/providers/kimi.d.ts +27 -0
  937. package/dist/types/web/search/providers/parallel.d.ts +15 -0
  938. package/dist/types/web/search/providers/perplexity.d.ts +38 -0
  939. package/dist/types/web/search/providers/searxng.d.ts +44 -0
  940. package/dist/types/web/search/providers/synthetic.d.ts +21 -0
  941. package/dist/types/web/search/providers/tavily.d.ts +29 -0
  942. package/dist/types/web/search/providers/utils.d.ts +52 -0
  943. package/dist/types/web/search/providers/xai.d.ts +62 -0
  944. package/dist/types/web/search/providers/zai.d.ts +28 -0
  945. package/dist/types/web/search/render.d.ts +35 -0
  946. package/dist/types/web/search/types.d.ts +348 -0
  947. package/dist/types/web/search/utils.d.ts +4 -0
  948. package/dist/types/workspace-tree.d.ts +42 -0
  949. package/examples/README.md +21 -0
  950. package/examples/custom-tools/README.md +104 -0
  951. package/examples/custom-tools/hello/index.ts +20 -0
  952. package/examples/extensions/README.md +120 -0
  953. package/examples/extensions/api-demo.ts +79 -0
  954. package/examples/extensions/chalk-logger.ts +25 -0
  955. package/examples/extensions/hello.ts +31 -0
  956. package/examples/extensions/pirate.ts +43 -0
  957. package/examples/extensions/plan-mode.ts +549 -0
  958. package/examples/extensions/reload-runtime.ts +38 -0
  959. package/examples/extensions/tools.ts +144 -0
  960. package/examples/extensions/with-deps/index.ts +36 -0
  961. package/examples/extensions/with-deps/package-lock.json +31 -0
  962. package/examples/extensions/with-deps/package.json +16 -0
  963. package/examples/hooks/README.md +56 -0
  964. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  965. package/examples/hooks/confirm-destructive.ts +58 -0
  966. package/examples/hooks/custom-compaction.ts +115 -0
  967. package/examples/hooks/dirty-repo-guard.ts +51 -0
  968. package/examples/hooks/file-trigger.ts +40 -0
  969. package/examples/hooks/git-checkpoint.ts +52 -0
  970. package/examples/hooks/handoff.ts +149 -0
  971. package/examples/hooks/permission-gate.ts +33 -0
  972. package/examples/hooks/protected-paths.ts +29 -0
  973. package/examples/hooks/qna.ts +118 -0
  974. package/examples/hooks/status-line.ts +39 -0
  975. package/examples/sdk/01-minimal.ts +21 -0
  976. package/examples/sdk/02-custom-model.ts +49 -0
  977. package/examples/sdk/03-custom-prompt.ts +46 -0
  978. package/examples/sdk/04-skills.ts +43 -0
  979. package/examples/sdk/06-extensions.ts +82 -0
  980. package/examples/sdk/06-hooks.ts +61 -0
  981. package/examples/sdk/07-context-files.ts +35 -0
  982. package/examples/sdk/08-prompt-templates.ts +41 -0
  983. package/examples/sdk/08-slash-commands.ts +46 -0
  984. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  985. package/examples/sdk/11-sessions.ts +47 -0
  986. package/examples/sdk/README.md +172 -0
  987. package/package.json +539 -0
  988. package/scripts/build-binary.ts +84 -0
  989. package/scripts/format-prompts.ts +68 -0
  990. package/scripts/generate-docs-index.ts +71 -0
  991. package/scripts/generate-template.ts +33 -0
  992. package/src/async/index.ts +2 -0
  993. package/src/async/job-manager.ts +1299 -0
  994. package/src/async/support.ts +6 -0
  995. package/src/autoresearch/command-resume.md +14 -0
  996. package/src/autoresearch/dashboard.ts +446 -0
  997. package/src/autoresearch/git.ts +319 -0
  998. package/src/autoresearch/helpers.ts +218 -0
  999. package/src/autoresearch/index.ts +536 -0
  1000. package/src/autoresearch/prompt-setup.md +43 -0
  1001. package/src/autoresearch/prompt.md +103 -0
  1002. package/src/autoresearch/resume-message.md +10 -0
  1003. package/src/autoresearch/state.ts +273 -0
  1004. package/src/autoresearch/storage.ts +699 -0
  1005. package/src/autoresearch/tools/init-experiment.ts +272 -0
  1006. package/src/autoresearch/tools/log-experiment.ts +524 -0
  1007. package/src/autoresearch/tools/run-experiment.ts +475 -0
  1008. package/src/autoresearch/tools/update-notes.ts +109 -0
  1009. package/src/autoresearch/types.ts +168 -0
  1010. package/src/bun-imports.d.ts +28 -0
  1011. package/src/capability/context-file.ts +44 -0
  1012. package/src/capability/extension-module.ts +34 -0
  1013. package/src/capability/extension.ts +47 -0
  1014. package/src/capability/fs.ts +107 -0
  1015. package/src/capability/hook.ts +40 -0
  1016. package/src/capability/index.ts +436 -0
  1017. package/src/capability/instruction.ts +37 -0
  1018. package/src/capability/mcp.ts +74 -0
  1019. package/src/capability/prompt.ts +35 -0
  1020. package/src/capability/rule.ts +244 -0
  1021. package/src/capability/settings.ts +34 -0
  1022. package/src/capability/skill.ts +56 -0
  1023. package/src/capability/slash-command.ts +40 -0
  1024. package/src/capability/ssh.ts +41 -0
  1025. package/src/capability/system-prompt.ts +34 -0
  1026. package/src/capability/tool.ts +38 -0
  1027. package/src/capability/types.ts +168 -0
  1028. package/src/cli/agents-cli.ts +141 -0
  1029. package/src/cli/args.ts +309 -0
  1030. package/src/cli/auth-broker-cli.ts +747 -0
  1031. package/src/cli/auth-gateway-cli.ts +411 -0
  1032. package/src/cli/classify-install-target.ts +50 -0
  1033. package/src/cli/commands/init-xdg.ts +27 -0
  1034. package/src/cli/config-cli.ts +426 -0
  1035. package/src/cli/fast-help.ts +80 -0
  1036. package/src/cli/file-processor.ts +123 -0
  1037. package/src/cli/grep-cli.ts +160 -0
  1038. package/src/cli/initial-message.ts +58 -0
  1039. package/src/cli/list-models.ts +194 -0
  1040. package/src/cli/notify-cli.ts +135 -0
  1041. package/src/cli/plugin-cli.ts +942 -0
  1042. package/src/cli/read-cli.ts +57 -0
  1043. package/src/cli/session-picker.ts +52 -0
  1044. package/src/cli/setup-cli.ts +537 -0
  1045. package/src/cli/shell-cli.ts +176 -0
  1046. package/src/cli/skills-cli.ts +88 -0
  1047. package/src/cli/ssh-cli.ts +179 -0
  1048. package/src/cli/stats-cli.ts +238 -0
  1049. package/src/cli/update-cli.ts +468 -0
  1050. package/src/cli/web-search-cli.ts +133 -0
  1051. package/src/cli/worktree-cli.ts +291 -0
  1052. package/src/cli.ts +150 -0
  1053. package/src/commands/acp.ts +24 -0
  1054. package/src/commands/agents.ts +57 -0
  1055. package/src/commands/auth-broker.ts +96 -0
  1056. package/src/commands/auth-gateway.ts +63 -0
  1057. package/src/commands/chat.ts +25 -0
  1058. package/src/commands/codex-native-hook.ts +12 -0
  1059. package/src/commands/commit.ts +46 -0
  1060. package/src/commands/config.ts +51 -0
  1061. package/src/commands/contribution-prep.ts +41 -0
  1062. package/src/commands/coordinator.ts +71 -0
  1063. package/src/commands/goal.ts +37 -0
  1064. package/src/commands/grep.ts +48 -0
  1065. package/src/commands/harness.ts +1137 -0
  1066. package/src/commands/interview.ts +42 -0
  1067. package/src/commands/launch.ts +178 -0
  1068. package/src/commands/mcp-serve.ts +63 -0
  1069. package/src/commands/memory.ts +34 -0
  1070. package/src/commands/notify.ts +45 -0
  1071. package/src/commands/orchestrate.ts +55 -0
  1072. package/src/commands/planphase.ts +19 -0
  1073. package/src/commands/plugin.ts +78 -0
  1074. package/src/commands/ralplan.ts +25 -0
  1075. package/src/commands/read.ts +35 -0
  1076. package/src/commands/session.ts +151 -0
  1077. package/src/commands/setup.ts +85 -0
  1078. package/src/commands/shell.ts +29 -0
  1079. package/src/commands/skills.ts +49 -0
  1080. package/src/commands/ssh.ts +60 -0
  1081. package/src/commands/state.ts +25 -0
  1082. package/src/commands/stats.ts +29 -0
  1083. package/src/commands/team.ts +217 -0
  1084. package/src/commands/ultragoal.ts +40 -0
  1085. package/src/commands/update.ts +21 -0
  1086. package/src/commands/web-search.ts +42 -0
  1087. package/src/commands/worktree.ts +57 -0
  1088. package/src/commit/agentic/agent.ts +316 -0
  1089. package/src/commit/agentic/fallback.ts +96 -0
  1090. package/src/commit/agentic/index.ts +356 -0
  1091. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  1092. package/src/commit/agentic/prompts/session-user.md +25 -0
  1093. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  1094. package/src/commit/agentic/prompts/system.md +38 -0
  1095. package/src/commit/agentic/state.ts +60 -0
  1096. package/src/commit/agentic/tools/analyze-file.ts +127 -0
  1097. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  1098. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  1099. package/src/commit/agentic/tools/git-overview.ts +81 -0
  1100. package/src/commit/agentic/tools/index.ts +54 -0
  1101. package/src/commit/agentic/tools/propose-changelog.ts +144 -0
  1102. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  1103. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  1104. package/src/commit/agentic/tools/schemas.ts +23 -0
  1105. package/src/commit/agentic/tools/split-commit.ts +238 -0
  1106. package/src/commit/agentic/topo-sort.ts +44 -0
  1107. package/src/commit/agentic/trivial.ts +51 -0
  1108. package/src/commit/agentic/validation.ts +183 -0
  1109. package/src/commit/analysis/conventional.ts +64 -0
  1110. package/src/commit/analysis/index.ts +4 -0
  1111. package/src/commit/analysis/scope.ts +242 -0
  1112. package/src/commit/analysis/summary.ts +105 -0
  1113. package/src/commit/analysis/validation.ts +66 -0
  1114. package/src/commit/changelog/detect.ts +40 -0
  1115. package/src/commit/changelog/generate.ts +97 -0
  1116. package/src/commit/changelog/index.ts +234 -0
  1117. package/src/commit/changelog/parse.ts +44 -0
  1118. package/src/commit/cli.ts +85 -0
  1119. package/src/commit/git/diff.ts +148 -0
  1120. package/src/commit/index.ts +5 -0
  1121. package/src/commit/map-reduce/index.ts +69 -0
  1122. package/src/commit/map-reduce/map-phase.ts +193 -0
  1123. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  1124. package/src/commit/map-reduce/utils.ts +9 -0
  1125. package/src/commit/message.ts +11 -0
  1126. package/src/commit/model-selection.ts +51 -0
  1127. package/src/commit/pipeline.ts +244 -0
  1128. package/src/commit/prompts/analysis-system.md +148 -0
  1129. package/src/commit/prompts/analysis-user.md +38 -0
  1130. package/src/commit/prompts/changelog-system.md +50 -0
  1131. package/src/commit/prompts/changelog-user.md +18 -0
  1132. package/src/commit/prompts/file-observer-system.md +24 -0
  1133. package/src/commit/prompts/file-observer-user.md +8 -0
  1134. package/src/commit/prompts/reduce-system.md +50 -0
  1135. package/src/commit/prompts/reduce-user.md +17 -0
  1136. package/src/commit/prompts/summary-retry.md +3 -0
  1137. package/src/commit/prompts/summary-system.md +38 -0
  1138. package/src/commit/prompts/summary-user.md +13 -0
  1139. package/src/commit/prompts/types-description.md +2 -0
  1140. package/src/commit/shared-llm.ts +77 -0
  1141. package/src/commit/types.ts +118 -0
  1142. package/src/commit/utils/exclusions.ts +42 -0
  1143. package/src/commit/utils.ts +58 -0
  1144. package/src/config/config-file.ts +232 -0
  1145. package/src/config/file-lock.ts +121 -0
  1146. package/src/config/keybindings.ts +553 -0
  1147. package/src/config/mcp-schema.json +230 -0
  1148. package/src/config/model-equivalence.ts +816 -0
  1149. package/src/config/model-profile-activation.ts +165 -0
  1150. package/src/config/model-profiles.ts +188 -0
  1151. package/src/config/model-registry.ts +2751 -0
  1152. package/src/config/model-resolver.ts +1355 -0
  1153. package/src/config/models-config-schema.ts +254 -0
  1154. package/src/config/oauth-provider-aliases.ts +49 -0
  1155. package/src/config/prompt-templates.ts +310 -0
  1156. package/src/config/resolve-config-value.ts +94 -0
  1157. package/src/config/settings-schema.ts +3235 -0
  1158. package/src/config/settings.ts +979 -0
  1159. package/src/config/skill-settings-defaults.ts +35 -0
  1160. package/src/config.ts +212 -0
  1161. package/src/coordinator/contract.ts +20 -0
  1162. package/src/coordinator-mcp/policy.ts +174 -0
  1163. package/src/coordinator-mcp/safety.ts +80 -0
  1164. package/src/coordinator-mcp/server.ts +1319 -0
  1165. package/src/cursor.ts +372 -0
  1166. package/src/dap/client.ts +689 -0
  1167. package/src/dap/config.ts +150 -0
  1168. package/src/dap/defaults.json +211 -0
  1169. package/src/dap/index.ts +4 -0
  1170. package/src/dap/session.ts +1306 -0
  1171. package/src/dap/types.ts +600 -0
  1172. package/src/debug/crash-diagnostics.ts +223 -0
  1173. package/src/debug/index.ts +459 -0
  1174. package/src/debug/log-formatting.ts +58 -0
  1175. package/src/debug/log-viewer.ts +908 -0
  1176. package/src/debug/profiler.ts +162 -0
  1177. package/src/debug/raw-sse-buffer.ts +270 -0
  1178. package/src/debug/raw-sse.ts +213 -0
  1179. package/src/debug/report-bundle.ts +365 -0
  1180. package/src/debug/runtime-gauges.ts +20 -0
  1181. package/src/debug/system-info.ts +111 -0
  1182. package/src/defaults/jwc/mcp-defaults.json +8 -0
  1183. package/src/defaults/jwc/skill-fragments/browse/web-ai.md +130 -0
  1184. package/src/defaults/jwc/skills/browse/SKILL.md +113 -0
  1185. package/src/defaults/jwc/skills/goal/SKILL.md +323 -0
  1186. package/src/defaults/jwc/skills/goal/ai-slop-cleaner.md +61 -0
  1187. package/src/defaults/jwc/skills/jaw-interview/SKILL.md +891 -0
  1188. package/src/defaults/jwc/skills/jaw-interview/auto-answer-uncertain.md +37 -0
  1189. package/src/defaults/jwc/skills/jaw-interview/auto-research-greenfield.md +42 -0
  1190. package/src/defaults/jwc/skills/plan/SKILL.md +201 -0
  1191. package/src/defaults/jwc/skills/search/SKILL.md +120 -0
  1192. package/src/defaults/jwc/skills/team/SKILL.md +441 -0
  1193. package/src/defaults/jwc-defaults.ts +316 -0
  1194. package/src/discovery/agents-md.ts +67 -0
  1195. package/src/discovery/agents.ts +230 -0
  1196. package/src/discovery/builtin.ts +932 -0
  1197. package/src/discovery/claude-plugins.ts +407 -0
  1198. package/src/discovery/claude.ts +313 -0
  1199. package/src/discovery/cli-jaw.ts +36 -0
  1200. package/src/discovery/cline.ts +83 -0
  1201. package/src/discovery/codex.ts +330 -0
  1202. package/src/discovery/cursor.ts +220 -0
  1203. package/src/discovery/gemini.ts +383 -0
  1204. package/src/discovery/github.ts +118 -0
  1205. package/src/discovery/helpers.ts +1010 -0
  1206. package/src/discovery/index.ts +77 -0
  1207. package/src/discovery/mcp-json.ts +171 -0
  1208. package/src/discovery/opencode.ts +398 -0
  1209. package/src/discovery/plugin-dir-roots.ts +28 -0
  1210. package/src/discovery/ssh.ts +153 -0
  1211. package/src/discovery/substitute-plugin-root.ts +29 -0
  1212. package/src/discovery/vscode.ts +105 -0
  1213. package/src/discovery/windsurf.ts +147 -0
  1214. package/src/edit/apply-patch/index.ts +87 -0
  1215. package/src/edit/apply-patch/parser.ts +174 -0
  1216. package/src/edit/diff.ts +873 -0
  1217. package/src/edit/file-read-cache.ts +95 -0
  1218. package/src/edit/index.ts +528 -0
  1219. package/src/edit/modes/apply-patch.lark +19 -0
  1220. package/src/edit/modes/apply-patch.ts +53 -0
  1221. package/src/edit/modes/patch.ts +1835 -0
  1222. package/src/edit/modes/replace.ts +1161 -0
  1223. package/src/edit/normalize.ts +375 -0
  1224. package/src/edit/notebook.ts +222 -0
  1225. package/src/edit/read-file.ts +25 -0
  1226. package/src/edit/renderer.ts +683 -0
  1227. package/src/edit/streaming.ts +561 -0
  1228. package/src/eval/backend.ts +43 -0
  1229. package/src/eval/index.ts +4 -0
  1230. package/src/eval/js/context-manager.ts +414 -0
  1231. package/src/eval/js/executor.ts +134 -0
  1232. package/src/eval/js/index.ts +46 -0
  1233. package/src/eval/js/shared/helpers.ts +237 -0
  1234. package/src/eval/js/shared/indirect-eval.ts +30 -0
  1235. package/src/eval/js/shared/prelude.ts +2 -0
  1236. package/src/eval/js/shared/prelude.txt +70 -0
  1237. package/src/eval/js/shared/rewrite-imports.ts +415 -0
  1238. package/src/eval/js/shared/runtime.ts +301 -0
  1239. package/src/eval/js/shared/types.ts +18 -0
  1240. package/src/eval/js/tool-bridge.ts +144 -0
  1241. package/src/eval/js/worker-core.ts +146 -0
  1242. package/src/eval/js/worker-entry.ts +24 -0
  1243. package/src/eval/js/worker-protocol.ts +41 -0
  1244. package/src/eval/py/display.ts +71 -0
  1245. package/src/eval/py/executor.ts +622 -0
  1246. package/src/eval/py/index.ts +58 -0
  1247. package/src/eval/py/kernel.ts +683 -0
  1248. package/src/eval/py/prelude.py +462 -0
  1249. package/src/eval/py/prelude.ts +3 -0
  1250. package/src/eval/py/runner.py +910 -0
  1251. package/src/eval/py/runtime.ts +210 -0
  1252. package/src/eval/py/tool-bridge.ts +137 -0
  1253. package/src/eval/types.ts +48 -0
  1254. package/src/exa/factory.ts +60 -0
  1255. package/src/exa/index.ts +27 -0
  1256. package/src/exa/mcp-client.ts +364 -0
  1257. package/src/exa/render.ts +244 -0
  1258. package/src/exa/researcher.ts +36 -0
  1259. package/src/exa/search.ts +47 -0
  1260. package/src/exa/types.ts +166 -0
  1261. package/src/exa/websets.ts +248 -0
  1262. package/src/exec/bash-executor.ts +362 -0
  1263. package/src/exec/exec.ts +53 -0
  1264. package/src/exec/idle-timeout-watchdog.ts +126 -0
  1265. package/src/exec/non-interactive-env.ts +73 -0
  1266. package/src/export/custom-share.ts +65 -0
  1267. package/src/export/html/index.ts +168 -0
  1268. package/src/export/html/template.css +1060 -0
  1269. package/src/export/html/template.generated.ts +2 -0
  1270. package/src/export/html/template.html +47 -0
  1271. package/src/export/html/template.js +2268 -0
  1272. package/src/export/html/template.macro.ts +25 -0
  1273. package/src/export/html/vendor/highlight.min.js +1213 -0
  1274. package/src/export/html/vendor/marked.min.js +6 -0
  1275. package/src/export/ttsr.ts +444 -0
  1276. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +25 -0
  1277. package/src/extensibility/custom-commands/bundled/review/index.ts +456 -0
  1278. package/src/extensibility/custom-commands/index.ts +2 -0
  1279. package/src/extensibility/custom-commands/loader.ts +238 -0
  1280. package/src/extensibility/custom-commands/types.ts +113 -0
  1281. package/src/extensibility/custom-tools/index.ts +7 -0
  1282. package/src/extensibility/custom-tools/loader.ts +245 -0
  1283. package/src/extensibility/custom-tools/types.ts +255 -0
  1284. package/src/extensibility/custom-tools/wrapper.ts +47 -0
  1285. package/src/extensibility/extensions/compact-handler.ts +40 -0
  1286. package/src/extensibility/extensions/get-commands-handler.ts +80 -0
  1287. package/src/extensibility/extensions/index.ts +15 -0
  1288. package/src/extensibility/extensions/loader.ts +555 -0
  1289. package/src/extensibility/extensions/runner.ts +900 -0
  1290. package/src/extensibility/extensions/types.ts +1314 -0
  1291. package/src/extensibility/extensions/wrapper.ts +189 -0
  1292. package/src/extensibility/hooks/index.ts +5 -0
  1293. package/src/extensibility/hooks/loader.ts +257 -0
  1294. package/src/extensibility/hooks/runner.ts +425 -0
  1295. package/src/extensibility/hooks/tool-wrapper.ts +107 -0
  1296. package/src/extensibility/hooks/types.ts +599 -0
  1297. package/src/extensibility/jwc-plugins/activation.ts +87 -0
  1298. package/src/extensibility/jwc-plugins/index.ts +9 -0
  1299. package/src/extensibility/jwc-plugins/injection.ts +114 -0
  1300. package/src/extensibility/jwc-plugins/loader.ts +131 -0
  1301. package/src/extensibility/jwc-plugins/paths.ts +66 -0
  1302. package/src/extensibility/jwc-plugins/schema.ts +79 -0
  1303. package/src/extensibility/jwc-plugins/state.ts +29 -0
  1304. package/src/extensibility/jwc-plugins/tools.ts +47 -0
  1305. package/src/extensibility/jwc-plugins/types.ts +97 -0
  1306. package/src/extensibility/jwc-plugins/validation.ts +76 -0
  1307. package/src/extensibility/plugins/doctor.ts +66 -0
  1308. package/src/extensibility/plugins/git-url.ts +281 -0
  1309. package/src/extensibility/plugins/index.ts +9 -0
  1310. package/src/extensibility/plugins/installer.ts +192 -0
  1311. package/src/extensibility/plugins/legacy-pi-compat.ts +336 -0
  1312. package/src/extensibility/plugins/loader.ts +288 -0
  1313. package/src/extensibility/plugins/manager.ts +739 -0
  1314. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  1315. package/src/extensibility/plugins/marketplace/fetcher.ts +317 -0
  1316. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  1317. package/src/extensibility/plugins/marketplace/manager.ts +770 -0
  1318. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  1319. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  1320. package/src/extensibility/plugins/marketplace/types.ts +191 -0
  1321. package/src/extensibility/plugins/parser.ts +105 -0
  1322. package/src/extensibility/plugins/types.ts +194 -0
  1323. package/src/extensibility/shared-events.ts +344 -0
  1324. package/src/extensibility/skills.ts +449 -0
  1325. package/src/extensibility/slash-commands.ts +249 -0
  1326. package/src/extensibility/tool-proxy.ts +25 -0
  1327. package/src/extensibility/typebox.ts +418 -0
  1328. package/src/extensibility/utils.ts +44 -0
  1329. package/src/goals/goal-planning-start.ts +21 -0
  1330. package/src/goals/index.ts +3 -0
  1331. package/src/goals/runtime.ts +418 -0
  1332. package/src/goals/state.ts +70 -0
  1333. package/src/goals/tools/goal-tool.ts +230 -0
  1334. package/src/harness-control-plane/classifier.ts +128 -0
  1335. package/src/harness-control-plane/control-endpoint.ts +148 -0
  1336. package/src/harness-control-plane/finalize.ts +306 -0
  1337. package/src/harness-control-plane/operate.ts +225 -0
  1338. package/src/harness-control-plane/owner.ts +664 -0
  1339. package/src/harness-control-plane/phase-rollup.ts +96 -0
  1340. package/src/harness-control-plane/preserve.ts +102 -0
  1341. package/src/harness-control-plane/receipt-ingest.ts +127 -0
  1342. package/src/harness-control-plane/receipt-spool.ts +147 -0
  1343. package/src/harness-control-plane/receipts.ts +320 -0
  1344. package/src/harness-control-plane/rpc-adapter.ts +282 -0
  1345. package/src/harness-control-plane/seams.ts +39 -0
  1346. package/src/harness-control-plane/session-lease.ts +388 -0
  1347. package/src/harness-control-plane/state-machine.ts +119 -0
  1348. package/src/harness-control-plane/storage.ts +423 -0
  1349. package/src/harness-control-plane/types.ts +240 -0
  1350. package/src/hashline/anchors.ts +113 -0
  1351. package/src/hashline/apply.ts +737 -0
  1352. package/src/hashline/bigrams.json +649 -0
  1353. package/src/hashline/constants.ts +25 -0
  1354. package/src/hashline/diff-preview.ts +43 -0
  1355. package/src/hashline/diff.ts +56 -0
  1356. package/src/hashline/execute.ts +267 -0
  1357. package/src/hashline/grammar.lark +21 -0
  1358. package/src/hashline/hash.ts +196 -0
  1359. package/src/hashline/index.ts +13 -0
  1360. package/src/hashline/input.ts +130 -0
  1361. package/src/hashline/parser.ts +246 -0
  1362. package/src/hashline/prefixes.ts +101 -0
  1363. package/src/hashline/recovery.ts +113 -0
  1364. package/src/hashline/stream.ts +123 -0
  1365. package/src/hashline/types.ts +68 -0
  1366. package/src/hindsight/backend.ts +205 -0
  1367. package/src/hindsight/bank.ts +131 -0
  1368. package/src/hindsight/client.ts +598 -0
  1369. package/src/hindsight/config.ts +175 -0
  1370. package/src/hindsight/content.ts +211 -0
  1371. package/src/hindsight/index.ts +8 -0
  1372. package/src/hindsight/mental-models.ts +382 -0
  1373. package/src/hindsight/seeds.json +32 -0
  1374. package/src/hindsight/state.ts +469 -0
  1375. package/src/hindsight/transcript.ts +71 -0
  1376. package/src/hooks/codex-native-hooks-config.ts +143 -0
  1377. package/src/hooks/native-skill-hook.ts +305 -0
  1378. package/src/hooks/skill-keywords.ts +95 -0
  1379. package/src/hooks/skill-state.ts +654 -0
  1380. package/src/index.ts +56 -0
  1381. package/src/internal-urls/agent-protocol.ts +176 -0
  1382. package/src/internal-urls/artifact-protocol.ts +75 -0
  1383. package/src/internal-urls/docs-index.generated.ts +92 -0
  1384. package/src/internal-urls/index.ts +21 -0
  1385. package/src/internal-urls/issue-pr-protocol.ts +577 -0
  1386. package/src/internal-urls/json-query.ts +126 -0
  1387. package/src/internal-urls/jwc-protocol.ts +91 -0
  1388. package/src/internal-urls/local-protocol.ts +249 -0
  1389. package/src/internal-urls/mcp-protocol.ts +151 -0
  1390. package/src/internal-urls/memory-protocol.ts +165 -0
  1391. package/src/internal-urls/parse.ts +72 -0
  1392. package/src/internal-urls/registry-helpers.ts +28 -0
  1393. package/src/internal-urls/router.ts +79 -0
  1394. package/src/internal-urls/rule-protocol.ts +38 -0
  1395. package/src/internal-urls/skill-protocol.ts +103 -0
  1396. package/src/internal-urls/types.ts +114 -0
  1397. package/src/jaw-interview/structured-renderer.ts +83 -0
  1398. package/src/jwc-runtime/actor-registry.ts +365 -0
  1399. package/src/jwc-runtime/agent-identity.ts +16 -0
  1400. package/src/jwc-runtime/cli-jaw-home.ts +14 -0
  1401. package/src/jwc-runtime/cli-jaw-vocab.ts +69 -0
  1402. package/src/jwc-runtime/cli-write-receipt.ts +31 -0
  1403. package/src/jwc-runtime/goal-cli.ts +428 -0
  1404. package/src/jwc-runtime/goal-engine.ts +2214 -0
  1405. package/src/jwc-runtime/goal-guard.ts +300 -0
  1406. package/src/jwc-runtime/goal-mode-request.ts +331 -0
  1407. package/src/jwc-runtime/jaw-interview-runtime.ts +809 -0
  1408. package/src/jwc-runtime/launch-tmux.ts +296 -0
  1409. package/src/jwc-runtime/launch-worktree.ts +291 -0
  1410. package/src/jwc-runtime/legacy-storage.ts +132 -0
  1411. package/src/jwc-runtime/memory-runtime.ts +434 -0
  1412. package/src/jwc-runtime/orchestrate-runtime.ts +612 -0
  1413. package/src/jwc-runtime/orchestrate-state.ts +395 -0
  1414. package/src/jwc-runtime/plan-writer.ts +661 -0
  1415. package/src/jwc-runtime/restricted-role-agent-bash.ts +5 -0
  1416. package/src/jwc-runtime/session-state-sidecar.ts +89 -0
  1417. package/src/jwc-runtime/stage-skill-map.ts +48 -0
  1418. package/src/jwc-runtime/state-graph.ts +86 -0
  1419. package/src/jwc-runtime/state-migrations.ts +183 -0
  1420. package/src/jwc-runtime/state-renderer.ts +340 -0
  1421. package/src/jwc-runtime/state-runtime.ts +1978 -0
  1422. package/src/jwc-runtime/state-schema.ts +218 -0
  1423. package/src/jwc-runtime/state-validation.ts +50 -0
  1424. package/src/jwc-runtime/state-writer.ts +765 -0
  1425. package/src/jwc-runtime/team-runtime.ts +4181 -0
  1426. package/src/jwc-runtime/tmux-common.ts +130 -0
  1427. package/src/jwc-runtime/tmux-sessions.ts +169 -0
  1428. package/src/jwc-runtime/workflow-command-ref.ts +240 -0
  1429. package/src/jwc-runtime/workflow-manifest.generated.json +1606 -0
  1430. package/src/jwc-runtime/workflow-manifest.ts +427 -0
  1431. package/src/lsp/client.ts +974 -0
  1432. package/src/lsp/clients/biome-client.ts +202 -0
  1433. package/src/lsp/clients/index.ts +50 -0
  1434. package/src/lsp/clients/lsp-linter-client.ts +93 -0
  1435. package/src/lsp/clients/swiftlint-client.ts +120 -0
  1436. package/src/lsp/config.ts +492 -0
  1437. package/src/lsp/defaults.json +493 -0
  1438. package/src/lsp/edits.ts +166 -0
  1439. package/src/lsp/index.ts +2282 -0
  1440. package/src/lsp/lspmux.ts +233 -0
  1441. package/src/lsp/render.ts +692 -0
  1442. package/src/lsp/startup-events.ts +13 -0
  1443. package/src/lsp/types.ts +443 -0
  1444. package/src/lsp/utils.ts +678 -0
  1445. package/src/main.ts +1159 -0
  1446. package/src/mem0/backend.ts +75 -0
  1447. package/src/mem0/client.ts +122 -0
  1448. package/src/mem0/config.ts +82 -0
  1449. package/src/mem0/index.ts +5 -0
  1450. package/src/mem0/scope.ts +54 -0
  1451. package/src/mem0/state.ts +142 -0
  1452. package/src/memories/index.ts +1111 -0
  1453. package/src/memories/local-query.ts +699 -0
  1454. package/src/memories/memory-config.ts +175 -0
  1455. package/src/memories/memory-fts.ts +179 -0
  1456. package/src/memories/memory-model-resolution.ts +84 -0
  1457. package/src/memories/memory-quality.ts +163 -0
  1458. package/src/memories/storage.ts +588 -0
  1459. package/src/memory-backend/index.ts +4 -0
  1460. package/src/memory-backend/local-backend.ts +50 -0
  1461. package/src/memory-backend/off-backend.ts +16 -0
  1462. package/src/memory-backend/resolve.ts +27 -0
  1463. package/src/memory-backend/types.ts +82 -0
  1464. package/src/migrate-config-dir-startup.ts +15 -0
  1465. package/src/migrate-config-dir.ts +80 -0
  1466. package/src/modes/acp/acp-agent.ts +2218 -0
  1467. package/src/modes/acp/acp-client-bridge.ts +154 -0
  1468. package/src/modes/acp/acp-event-mapper.ts +912 -0
  1469. package/src/modes/acp/acp-mode.ts +23 -0
  1470. package/src/modes/acp/index.ts +2 -0
  1471. package/src/modes/acp/terminal-auth.ts +37 -0
  1472. package/src/modes/background-row-model.ts +17 -0
  1473. package/src/modes/bridge/auth.ts +41 -0
  1474. package/src/modes/bridge/bridge-client-bridge.ts +47 -0
  1475. package/src/modes/bridge/bridge-mode.ts +644 -0
  1476. package/src/modes/bridge/bridge-ui-context.ts +200 -0
  1477. package/src/modes/bridge/event-stream.ts +70 -0
  1478. package/src/modes/components/_cli-jaw-entry.ts +36 -0
  1479. package/src/modes/components/agent-dashboard.ts +1120 -0
  1480. package/src/modes/components/assistant-message.ts +361 -0
  1481. package/src/modes/components/background-footer-detail.ts +27 -0
  1482. package/src/modes/components/background-footer-panel-model.ts +96 -0
  1483. package/src/modes/components/background-footer-panel.ts +89 -0
  1484. package/src/modes/components/bash-execution.ts +261 -0
  1485. package/src/modes/components/bordered-loader.ts +41 -0
  1486. package/src/modes/components/branch-summary-message.ts +65 -0
  1487. package/src/modes/components/btw-panel.ts +104 -0
  1488. package/src/modes/components/compaction-summary-message.ts +71 -0
  1489. package/src/modes/components/composer-chrome.ts +42 -0
  1490. package/src/modes/components/composer-footer.ts +113 -0
  1491. package/src/modes/components/countdown-timer.ts +75 -0
  1492. package/src/modes/components/custom-editor.ts +515 -0
  1493. package/src/modes/components/custom-message.ts +85 -0
  1494. package/src/modes/components/custom-provider-wizard.ts +318 -0
  1495. package/src/modes/components/diff.ts +363 -0
  1496. package/src/modes/components/dynamic-border.ts +25 -0
  1497. package/src/modes/components/eval-execution.ts +196 -0
  1498. package/src/modes/components/execution-shared.ts +112 -0
  1499. package/src/modes/components/extensions/extension-dashboard.ts +350 -0
  1500. package/src/modes/components/extensions/extension-list.ts +492 -0
  1501. package/src/modes/components/extensions/index.ts +9 -0
  1502. package/src/modes/components/extensions/inspector-panel.ts +317 -0
  1503. package/src/modes/components/extensions/state-manager.ts +628 -0
  1504. package/src/modes/components/extensions/types.ts +191 -0
  1505. package/src/modes/components/footer.ts +270 -0
  1506. package/src/modes/components/full-transcript-overlay.ts +133 -0
  1507. package/src/modes/components/help-selector.ts +274 -0
  1508. package/src/modes/components/history-search.ts +158 -0
  1509. package/src/modes/components/hook-editor.ts +151 -0
  1510. package/src/modes/components/hook-input.ts +79 -0
  1511. package/src/modes/components/hook-message.ts +68 -0
  1512. package/src/modes/components/hook-selector.ts +873 -0
  1513. package/src/modes/components/index.ts +36 -0
  1514. package/src/modes/components/jobs-overlay-model.ts +109 -0
  1515. package/src/modes/components/jobs-overlay.ts +172 -0
  1516. package/src/modes/components/keybinding-hints.ts +65 -0
  1517. package/src/modes/components/login-dialog.ts +164 -0
  1518. package/src/modes/components/message-frame.ts +88 -0
  1519. package/src/modes/components/model-selector.ts +1653 -0
  1520. package/src/modes/components/oauth-selector.ts +248 -0
  1521. package/src/modes/components/pabcd-border.ts +98 -0
  1522. package/src/modes/components/plugin-selector.ts +95 -0
  1523. package/src/modes/components/plugin-settings.ts +489 -0
  1524. package/src/modes/components/provider-onboarding-selector.ts +94 -0
  1525. package/src/modes/components/queue-mode-selector.ts +56 -0
  1526. package/src/modes/components/quota-panel.ts +101 -0
  1527. package/src/modes/components/read-tool-group.ts +295 -0
  1528. package/src/modes/components/runtime-mcp-add-wizard.ts +1341 -0
  1529. package/src/modes/components/session-observer-overlay.ts +839 -0
  1530. package/src/modes/components/session-selector.ts +343 -0
  1531. package/src/modes/components/settings-defs.ts +175 -0
  1532. package/src/modes/components/settings-selector.ts +644 -0
  1533. package/src/modes/components/show-images-selector.ts +45 -0
  1534. package/src/modes/components/skill-hud/render.ts +93 -0
  1535. package/src/modes/components/skill-message.ts +110 -0
  1536. package/src/modes/components/status-line/context-thresholds.ts +68 -0
  1537. package/src/modes/components/status-line/git-utils.ts +42 -0
  1538. package/src/modes/components/status-line/index.ts +4 -0
  1539. package/src/modes/components/status-line/presets.ts +107 -0
  1540. package/src/modes/components/status-line/segments.ts +657 -0
  1541. package/src/modes/components/status-line/separators.ts +55 -0
  1542. package/src/modes/components/status-line/token-rate.ts +66 -0
  1543. package/src/modes/components/status-line/types.ts +102 -0
  1544. package/src/modes/components/status-line/workflow-readers.ts +97 -0
  1545. package/src/modes/components/status-line.ts +917 -0
  1546. package/src/modes/components/theme-selector.ts +63 -0
  1547. package/src/modes/components/thinking-selector.ts +52 -0
  1548. package/src/modes/components/todo-reminder.ts +40 -0
  1549. package/src/modes/components/tool-execution.ts +990 -0
  1550. package/src/modes/components/tool-transcript-overlay.ts +81 -0
  1551. package/src/modes/components/tree-selector.ts +930 -0
  1552. package/src/modes/components/ttsr-notification.ts +100 -0
  1553. package/src/modes/components/user-message-selector.ts +141 -0
  1554. package/src/modes/components/user-message.ts +53 -0
  1555. package/src/modes/components/visual-truncate.ts +63 -0
  1556. package/src/modes/components/welcome.ts +522 -0
  1557. package/src/modes/controllers/btw-controller.ts +105 -0
  1558. package/src/modes/controllers/command-controller-shared.ts +108 -0
  1559. package/src/modes/controllers/command-controller.ts +1703 -0
  1560. package/src/modes/controllers/event-controller.ts +1054 -0
  1561. package/src/modes/controllers/extension-ui-controller.ts +1010 -0
  1562. package/src/modes/controllers/input-controller.ts +1422 -0
  1563. package/src/modes/controllers/runtime-mcp-command-controller.ts +1934 -0
  1564. package/src/modes/controllers/selector-controller.ts +1605 -0
  1565. package/src/modes/controllers/ssh-command-controller.ts +384 -0
  1566. package/src/modes/controllers/todo-command-controller.ts +485 -0
  1567. package/src/modes/data/emojis.json +1 -0
  1568. package/src/modes/emoji-autocomplete.ts +285 -0
  1569. package/src/modes/index.ts +35 -0
  1570. package/src/modes/interactive-mode.ts +2938 -0
  1571. package/src/modes/jobs-observer.ts +352 -0
  1572. package/src/modes/oauth-manual-input.ts +42 -0
  1573. package/src/modes/print-mode.ts +121 -0
  1574. package/src/modes/prompt-action-autocomplete.ts +409 -0
  1575. package/src/modes/rpc/host-tools.ts +1 -0
  1576. package/src/modes/rpc/host-uris.ts +1 -0
  1577. package/src/modes/rpc/rpc-client.ts +914 -0
  1578. package/src/modes/rpc/rpc-mode.ts +784 -0
  1579. package/src/modes/rpc/rpc-types.ts +601 -0
  1580. package/src/modes/runtime-init.ts +116 -0
  1581. package/src/modes/session-observer-registry.ts +146 -0
  1582. package/src/modes/shared/agent-wire/approval-gate.ts +151 -0
  1583. package/src/modes/shared/agent-wire/command-contract.ts +18 -0
  1584. package/src/modes/shared/agent-wire/command-dispatch.ts +438 -0
  1585. package/src/modes/shared/agent-wire/command-validation.ts +164 -0
  1586. package/src/modes/shared/agent-wire/event-contract.ts +148 -0
  1587. package/src/modes/shared/agent-wire/event-envelope.ts +141 -0
  1588. package/src/modes/shared/agent-wire/event-observation.ts +424 -0
  1589. package/src/modes/shared/agent-wire/handshake.ts +157 -0
  1590. package/src/modes/shared/agent-wire/host-tool-bridge.ts +194 -0
  1591. package/src/modes/shared/agent-wire/host-uri-bridge.ts +236 -0
  1592. package/src/modes/shared/agent-wire/jaw-interview-gate.ts +253 -0
  1593. package/src/modes/shared/agent-wire/protocol.ts +46 -0
  1594. package/src/modes/shared/agent-wire/responses.ts +17 -0
  1595. package/src/modes/shared/agent-wire/scopes.ts +91 -0
  1596. package/src/modes/shared/agent-wire/session-registry.ts +109 -0
  1597. package/src/modes/shared/agent-wire/ui-request-broker.ts +150 -0
  1598. package/src/modes/shared/agent-wire/ui-result.ts +48 -0
  1599. package/src/modes/shared/agent-wire/unattended-action-policy.ts +341 -0
  1600. package/src/modes/shared/agent-wire/unattended-audit.ts +175 -0
  1601. package/src/modes/shared/agent-wire/unattended-run-controller.ts +406 -0
  1602. package/src/modes/shared/agent-wire/unattended-session.ts +180 -0
  1603. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +324 -0
  1604. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +331 -0
  1605. package/src/modes/shared.ts +55 -0
  1606. package/src/modes/theme/defaults/abyss-bite-light.json +124 -0
  1607. package/src/modes/theme/defaults/abyss-bite.json +124 -0
  1608. package/src/modes/theme/defaults/blue-crab.json +126 -0
  1609. package/src/modes/theme/defaults/index.ts +11 -0
  1610. package/src/modes/theme/defaults/red-claw.json +123 -0
  1611. package/src/modes/theme/mermaid-cache.ts +29 -0
  1612. package/src/modes/theme/shimmer.ts +219 -0
  1613. package/src/modes/theme/theme-schema.json +429 -0
  1614. package/src/modes/theme/theme.ts +2472 -0
  1615. package/src/modes/types.ts +343 -0
  1616. package/src/modes/utils/abort-message.ts +41 -0
  1617. package/src/modes/utils/compaction-progress.ts +174 -0
  1618. package/src/modes/utils/context-usage.ts +398 -0
  1619. package/src/modes/utils/help-markdown.ts +50 -0
  1620. package/src/modes/utils/hotkeys-markdown.ts +61 -0
  1621. package/src/modes/utils/keybinding-matchers.ts +30 -0
  1622. package/src/modes/utils/session-transcript-replay.ts +520 -0
  1623. package/src/modes/utils/tools-markdown.ts +27 -0
  1624. package/src/modes/utils/ui-helpers.ts +846 -0
  1625. package/src/notifications/ask-bridge.ts +74 -0
  1626. package/src/notifications/config-command-parser.ts +76 -0
  1627. package/src/notifications/config.ts +102 -0
  1628. package/src/notifications/daemon-control.ts +73 -0
  1629. package/src/notifications/daemon-engine.ts +165 -0
  1630. package/src/notifications/daemon-inbound.ts +220 -0
  1631. package/src/notifications/daemon-loop.ts +60 -0
  1632. package/src/notifications/daemon-owner.ts +53 -0
  1633. package/src/notifications/daemon-runtime.ts +84 -0
  1634. package/src/notifications/discovery.ts +119 -0
  1635. package/src/notifications/index.ts +34 -0
  1636. package/src/notifications/lifecycle-audit.ts +94 -0
  1637. package/src/notifications/lifecycle-command-parser.ts +51 -0
  1638. package/src/notifications/lifecycle-control-runtime.ts +127 -0
  1639. package/src/notifications/notification-redaction.ts +57 -0
  1640. package/src/notifications/protocol.ts +61 -0
  1641. package/src/notifications/remote-answer.ts +241 -0
  1642. package/src/notifications/reply-bridge.ts +85 -0
  1643. package/src/notifications/server.ts +280 -0
  1644. package/src/notifications/session-lifecycle.ts +46 -0
  1645. package/src/notifications/session-registry.ts +164 -0
  1646. package/src/notifications/telegram-api.ts +259 -0
  1647. package/src/notifications/telegram-ask-keyboard.ts +137 -0
  1648. package/src/notifications/telegram-callback-ingest.ts +126 -0
  1649. package/src/notifications/telegram-inbound-router.ts +166 -0
  1650. package/src/notifications/telegram-media-policy.ts +50 -0
  1651. package/src/notifications/telegram-media-render.ts +40 -0
  1652. package/src/notifications/telegram-message-ingest.ts +121 -0
  1653. package/src/notifications/telegram-pairing.ts +69 -0
  1654. package/src/notifications/threaded-lifecycle.ts +27 -0
  1655. package/src/notifications/threaded-shutdown.ts +37 -0
  1656. package/src/notifications/threaded-surface.ts +187 -0
  1657. package/src/notifications/transport-shell.ts +152 -0
  1658. package/src/notifications/transport-state.ts +161 -0
  1659. package/src/notifications/workspace-path-confinement.ts +65 -0
  1660. package/src/plan-mode/approved-plan.ts +163 -0
  1661. package/src/plan-mode/state.ts +6 -0
  1662. package/src/prompts/agents/architect.md +95 -0
  1663. package/src/prompts/agents/critic.md +68 -0
  1664. package/src/prompts/agents/executor.md +64 -0
  1665. package/src/prompts/agents/explore.md +58 -0
  1666. package/src/prompts/agents/frontmatter.md +14 -0
  1667. package/src/prompts/agents/init.md +34 -0
  1668. package/src/prompts/agents/plan.md +49 -0
  1669. package/src/prompts/agents/planner.md +63 -0
  1670. package/src/prompts/agents/reviewer.md +141 -0
  1671. package/src/prompts/agents/task.md +16 -0
  1672. package/src/prompts/ci-green-request.md +36 -0
  1673. package/src/prompts/goals/goal-continuation.md +33 -0
  1674. package/src/prompts/goals/goal-mode-active.md +23 -0
  1675. package/src/prompts/jaw/orchestrate-a.md +20 -0
  1676. package/src/prompts/jaw/orchestrate-audit-architect.md +17 -0
  1677. package/src/prompts/jaw/orchestrate-audit-planner.md +17 -0
  1678. package/src/prompts/jaw/orchestrate-b.md +17 -0
  1679. package/src/prompts/jaw/orchestrate-c.md +18 -0
  1680. package/src/prompts/jaw/orchestrate-d.md +32 -0
  1681. package/src/prompts/jaw/orchestrate-i.md +17 -0
  1682. package/src/prompts/jaw/orchestrate-p.md +23 -0
  1683. package/src/prompts/memories/consolidation.md +30 -0
  1684. package/src/prompts/memories/read-path.md +10 -0
  1685. package/src/prompts/memories/stage_one_input.md +6 -0
  1686. package/src/prompts/memories/stage_one_system.md +21 -0
  1687. package/src/prompts/memories/unavailable.md +9 -0
  1688. package/src/prompts/review-request.md +70 -0
  1689. package/src/prompts/system/agent-creation-architect.md +75 -0
  1690. package/src/prompts/system/agent-creation-user.md +6 -0
  1691. package/src/prompts/system/auto-continue.md +1 -0
  1692. package/src/prompts/system/btw-user.md +8 -0
  1693. package/src/prompts/system/commit-message-system.md +2 -0
  1694. package/src/prompts/system/custom-system-prompt.md +64 -0
  1695. package/src/prompts/system/eager-todo.md +13 -0
  1696. package/src/prompts/system/executor-self-fork.md +3 -0
  1697. package/src/prompts/system/irc-incoming.md +8 -0
  1698. package/src/prompts/system/plan-mode-active.md +116 -0
  1699. package/src/prompts/system/plan-mode-approved.md +28 -0
  1700. package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
  1701. package/src/prompts/system/plan-mode-reference.md +14 -0
  1702. package/src/prompts/system/plan-mode-subagent.md +34 -0
  1703. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1704. package/src/prompts/system/project-prompt.md +46 -0
  1705. package/src/prompts/system/subagent-system-prompt.md +89 -0
  1706. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1707. package/src/prompts/system/subagent-yield-reminder.md +12 -0
  1708. package/src/prompts/system/system-prompt.md +409 -0
  1709. package/src/prompts/system/title-system.md +2 -0
  1710. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1711. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1712. package/src/prompts/system/web-search.md +25 -0
  1713. package/src/prompts/tools/apply-patch.md +65 -0
  1714. package/src/prompts/tools/ask.md +29 -0
  1715. package/src/prompts/tools/ast-edit.md +39 -0
  1716. package/src/prompts/tools/ast-grep.md +42 -0
  1717. package/src/prompts/tools/async-result.md +8 -0
  1718. package/src/prompts/tools/background.md +19 -0
  1719. package/src/prompts/tools/bash.md +50 -0
  1720. package/src/prompts/tools/browser.md +14 -0
  1721. package/src/prompts/tools/calculator.md +10 -0
  1722. package/src/prompts/tools/checkpoint.md +16 -0
  1723. package/src/prompts/tools/computer-use.md +15 -0
  1724. package/src/prompts/tools/cron.md +25 -0
  1725. package/src/prompts/tools/debug.md +33 -0
  1726. package/src/prompts/tools/eval.md +75 -0
  1727. package/src/prompts/tools/find.md +34 -0
  1728. package/src/prompts/tools/github.md +20 -0
  1729. package/src/prompts/tools/goal.md +20 -0
  1730. package/src/prompts/tools/hashline.md +130 -0
  1731. package/src/prompts/tools/image-gen.md +7 -0
  1732. package/src/prompts/tools/inspect-image-system.md +20 -0
  1733. package/src/prompts/tools/inspect-image.md +32 -0
  1734. package/src/prompts/tools/irc.md +49 -0
  1735. package/src/prompts/tools/job.md +22 -0
  1736. package/src/prompts/tools/lsp.md +42 -0
  1737. package/src/prompts/tools/monitor.md +32 -0
  1738. package/src/prompts/tools/patch.md +70 -0
  1739. package/src/prompts/tools/read.md +82 -0
  1740. package/src/prompts/tools/recall.md +6 -0
  1741. package/src/prompts/tools/recipe.md +16 -0
  1742. package/src/prompts/tools/reflect.md +6 -0
  1743. package/src/prompts/tools/render-mermaid.md +9 -0
  1744. package/src/prompts/tools/replace.md +36 -0
  1745. package/src/prompts/tools/resolve.md +9 -0
  1746. package/src/prompts/tools/retain.md +7 -0
  1747. package/src/prompts/tools/rewind.md +13 -0
  1748. package/src/prompts/tools/search-tool-bm25.md +37 -0
  1749. package/src/prompts/tools/search.md +25 -0
  1750. package/src/prompts/tools/skill.md +28 -0
  1751. package/src/prompts/tools/ssh.md +35 -0
  1752. package/src/prompts/tools/subagent.md +56 -0
  1753. package/src/prompts/tools/task-summary.md +22 -0
  1754. package/src/prompts/tools/task.md +106 -0
  1755. package/src/prompts/tools/todo-write.md +50 -0
  1756. package/src/prompts/tools/vim.md +98 -0
  1757. package/src/prompts/tools/web-search.md +10 -0
  1758. package/src/prompts/tools/write.md +14 -0
  1759. package/src/registry/agent-registry.ts +140 -0
  1760. package/src/reminders/star-reminder.ts +422 -0
  1761. package/src/runtime-mcp/client.ts +485 -0
  1762. package/src/runtime-mcp/config-writer.ts +225 -0
  1763. package/src/runtime-mcp/config.ts +365 -0
  1764. package/src/runtime-mcp/discoverable-tool-metadata.ts +25 -0
  1765. package/src/runtime-mcp/index.ts +29 -0
  1766. package/src/runtime-mcp/json-rpc.ts +84 -0
  1767. package/src/runtime-mcp/loader.ts +124 -0
  1768. package/src/runtime-mcp/manager.ts +1211 -0
  1769. package/src/runtime-mcp/oauth-discovery.ts +349 -0
  1770. package/src/runtime-mcp/oauth-flow.ts +409 -0
  1771. package/src/runtime-mcp/render.ts +123 -0
  1772. package/src/runtime-mcp/smithery-auth.ts +104 -0
  1773. package/src/runtime-mcp/smithery-connect.ts +145 -0
  1774. package/src/runtime-mcp/smithery-registry.ts +477 -0
  1775. package/src/runtime-mcp/tool-bridge.ts +416 -0
  1776. package/src/runtime-mcp/tool-cache.ts +117 -0
  1777. package/src/runtime-mcp/transports/http.ts +503 -0
  1778. package/src/runtime-mcp/transports/index.ts +6 -0
  1779. package/src/runtime-mcp/transports/stdio.ts +326 -0
  1780. package/src/runtime-mcp/types.ts +423 -0
  1781. package/src/sdk.ts +2248 -0
  1782. package/src/secrets/index.ts +120 -0
  1783. package/src/secrets/obfuscator.ts +352 -0
  1784. package/src/secrets/regex.ts +21 -0
  1785. package/src/session/agent-session.ts +10343 -0
  1786. package/src/session/agent-storage.ts +466 -0
  1787. package/src/session/artifacts.ts +135 -0
  1788. package/src/session/auth-broker-config.ts +102 -0
  1789. package/src/session/auth-storage.ts +23 -0
  1790. package/src/session/blob-store.ts +372 -0
  1791. package/src/session/client-bridge.ts +85 -0
  1792. package/src/session/contribution-prep.ts +320 -0
  1793. package/src/session/history-storage.ts +311 -0
  1794. package/src/session/messages.ts +406 -0
  1795. package/src/session/pabcd-stage-header.ts +77 -0
  1796. package/src/session/session-dump-format.ts +209 -0
  1797. package/src/session/session-manager.ts +3914 -0
  1798. package/src/session/session-storage.ts +415 -0
  1799. package/src/session/streaming-output.ts +1114 -0
  1800. package/src/session/tool-choice-queue.ts +213 -0
  1801. package/src/session/yield-queue.ts +155 -0
  1802. package/src/setup/hermes/templates/operator-instructions.v1.md +29 -0
  1803. package/src/setup/hermes-setup.ts +429 -0
  1804. package/src/setup/model-onboarding-guidance.ts +41 -0
  1805. package/src/setup/provider-onboarding.ts +358 -0
  1806. package/src/skill-state/active-state.ts +788 -0
  1807. package/src/skill-state/initial-phase.ts +21 -0
  1808. package/src/skill-state/jaw-interview-mutation-guard.ts +490 -0
  1809. package/src/skill-state/workflow-hud.ts +208 -0
  1810. package/src/skill-state/workflow-state-contract.ts +167 -0
  1811. package/src/skill-state/workflow-state-version.ts +3 -0
  1812. package/src/slash-commands/acp-builtins.ts +55 -0
  1813. package/src/slash-commands/builtin-registry.ts +1879 -0
  1814. package/src/slash-commands/helpers/context-report.ts +149 -0
  1815. package/src/slash-commands/helpers/format.ts +46 -0
  1816. package/src/slash-commands/helpers/mcp.ts +532 -0
  1817. package/src/slash-commands/helpers/parse.ts +85 -0
  1818. package/src/slash-commands/helpers/ssh.ts +195 -0
  1819. package/src/slash-commands/helpers/todo.ts +279 -0
  1820. package/src/slash-commands/helpers/usage-report.ts +105 -0
  1821. package/src/slash-commands/types.ts +127 -0
  1822. package/src/ssh/config-writer.ts +183 -0
  1823. package/src/ssh/connection-manager.ts +482 -0
  1824. package/src/ssh/ssh-executor.ts +133 -0
  1825. package/src/ssh/sshfs-mount.ts +140 -0
  1826. package/src/ssh/utils.ts +8 -0
  1827. package/src/stt/downloader.ts +71 -0
  1828. package/src/stt/index.ts +3 -0
  1829. package/src/stt/recorder.ts +351 -0
  1830. package/src/stt/setup.ts +52 -0
  1831. package/src/stt/stt-controller.ts +160 -0
  1832. package/src/stt/transcribe.py +70 -0
  1833. package/src/stt/transcriber.ts +91 -0
  1834. package/src/system-prompt.ts +661 -0
  1835. package/src/task/agents.ts +189 -0
  1836. package/src/task/commands.ts +131 -0
  1837. package/src/task/discovery.ts +136 -0
  1838. package/src/task/executor.ts +1664 -0
  1839. package/src/task/fork-context-advisory.ts +99 -0
  1840. package/src/task/id.ts +33 -0
  1841. package/src/task/index.ts +2173 -0
  1842. package/src/task/jwc-command.ts +26 -0
  1843. package/src/task/model-presets.ts +53 -0
  1844. package/src/task/name-generator.ts +1577 -0
  1845. package/src/task/output-manager.ts +108 -0
  1846. package/src/task/parallel.ts +116 -0
  1847. package/src/task/receipt.ts +304 -0
  1848. package/src/task/render.ts +1075 -0
  1849. package/src/task/roi-reconciliation.ts +90 -0
  1850. package/src/task/simple-mode.ts +27 -0
  1851. package/src/task/spawn-gate.ts +132 -0
  1852. package/src/task/subprocess-tool-registry.ts +88 -0
  1853. package/src/task/types.ts +433 -0
  1854. package/src/task/worktree.ts +506 -0
  1855. package/src/thinking.ts +93 -0
  1856. package/src/tool-discovery/tool-index.ts +408 -0
  1857. package/src/tools/archive-reader.ts +321 -0
  1858. package/src/tools/ask.ts +1011 -0
  1859. package/src/tools/ast-edit.ts +555 -0
  1860. package/src/tools/ast-grep.ts +424 -0
  1861. package/src/tools/auto-generated-guard.ts +305 -0
  1862. package/src/tools/background.ts +500 -0
  1863. package/src/tools/bash-allowed-prefixes.ts +169 -0
  1864. package/src/tools/bash-command-fixup.ts +37 -0
  1865. package/src/tools/bash-interactive.ts +388 -0
  1866. package/src/tools/bash-interceptor.ts +67 -0
  1867. package/src/tools/bash-pty-selection.ts +15 -0
  1868. package/src/tools/bash-skill-urls.ts +248 -0
  1869. package/src/tools/bash.ts +1242 -0
  1870. package/src/tools/browser/actions.ts +189 -0
  1871. package/src/tools/browser/attach.ts +175 -0
  1872. package/src/tools/browser/launch.ts +651 -0
  1873. package/src/tools/browser/readable.ts +95 -0
  1874. package/src/tools/browser/registry.ts +194 -0
  1875. package/src/tools/browser/render.ts +212 -0
  1876. package/src/tools/browser/tab-protocol.ts +105 -0
  1877. package/src/tools/browser/tab-supervisor.ts +577 -0
  1878. package/src/tools/browser/tab-worker-entry.ts +21 -0
  1879. package/src/tools/browser/tab-worker.ts +1054 -0
  1880. package/src/tools/browser.ts +380 -0
  1881. package/src/tools/calculator.ts +540 -0
  1882. package/src/tools/checkpoint.ts +134 -0
  1883. package/src/tools/computer-use-backend.ts +75 -0
  1884. package/src/tools/computer-use.ts +228 -0
  1885. package/src/tools/conflict-detect.ts +672 -0
  1886. package/src/tools/context.ts +39 -0
  1887. package/src/tools/cron.ts +713 -0
  1888. package/src/tools/debug.ts +1014 -0
  1889. package/src/tools/eval.ts +1101 -0
  1890. package/src/tools/fetch.ts +1485 -0
  1891. package/src/tools/file-recorder.ts +35 -0
  1892. package/src/tools/find.ts +543 -0
  1893. package/src/tools/fs-cache-invalidation.ts +28 -0
  1894. package/src/tools/gh-format.ts +12 -0
  1895. package/src/tools/gh-renderer.ts +428 -0
  1896. package/src/tools/gh.ts +3737 -0
  1897. package/src/tools/github-cache.ts +548 -0
  1898. package/src/tools/grouped-file-output.ts +96 -0
  1899. package/src/tools/hindsight-recall.ts +66 -0
  1900. package/src/tools/hindsight-reflect.ts +55 -0
  1901. package/src/tools/hindsight-retain.ts +54 -0
  1902. package/src/tools/image-gen.ts +1284 -0
  1903. package/src/tools/index.ts +580 -0
  1904. package/src/tools/inspect-image-renderer.ts +103 -0
  1905. package/src/tools/inspect-image.ts +167 -0
  1906. package/src/tools/irc.ts +239 -0
  1907. package/src/tools/job.ts +530 -0
  1908. package/src/tools/json-tree.ts +243 -0
  1909. package/src/tools/jtd-to-json-schema.ts +219 -0
  1910. package/src/tools/jtd-to-typescript.ts +136 -0
  1911. package/src/tools/jtd-utils.ts +102 -0
  1912. package/src/tools/list-limit.ts +40 -0
  1913. package/src/tools/match-line-format.ts +22 -0
  1914. package/src/tools/monitor.ts +255 -0
  1915. package/src/tools/output-meta.ts +754 -0
  1916. package/src/tools/path-utils.ts +741 -0
  1917. package/src/tools/plan-mode-guard.ts +68 -0
  1918. package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
  1919. package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
  1920. package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
  1921. package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
  1922. package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
  1923. package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
  1924. package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
  1925. package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
  1926. package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
  1927. package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
  1928. package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
  1929. package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
  1930. package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
  1931. package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
  1932. package/src/tools/read.ts +2333 -0
  1933. package/src/tools/recipe/index.ts +80 -0
  1934. package/src/tools/recipe/render.ts +19 -0
  1935. package/src/tools/recipe/runner.ts +219 -0
  1936. package/src/tools/recipe/runners/cargo.ts +131 -0
  1937. package/src/tools/recipe/runners/index.ts +8 -0
  1938. package/src/tools/recipe/runners/just.ts +73 -0
  1939. package/src/tools/recipe/runners/make.ts +101 -0
  1940. package/src/tools/recipe/runners/pkg.ts +167 -0
  1941. package/src/tools/recipe/runners/task.ts +72 -0
  1942. package/src/tools/render-mermaid.ts +68 -0
  1943. package/src/tools/render-utils.ts +774 -0
  1944. package/src/tools/renderers.ts +79 -0
  1945. package/src/tools/resolve.ts +258 -0
  1946. package/src/tools/review.ts +252 -0
  1947. package/src/tools/search-tool-bm25.ts +364 -0
  1948. package/src/tools/search.ts +787 -0
  1949. package/src/tools/skill.ts +170 -0
  1950. package/src/tools/sqlite-reader.ts +736 -0
  1951. package/src/tools/ssh.ts +310 -0
  1952. package/src/tools/subagent-render.ts +160 -0
  1953. package/src/tools/subagent.ts +698 -0
  1954. package/src/tools/telegram-send.ts +178 -0
  1955. package/src/tools/todo-write.ts +695 -0
  1956. package/src/tools/tool-errors.ts +62 -0
  1957. package/src/tools/tool-result.ts +86 -0
  1958. package/src/tools/tool-timeouts.ts +30 -0
  1959. package/src/tools/vim.ts +949 -0
  1960. package/src/tools/write.ts +953 -0
  1961. package/src/tools/yield.ts +268 -0
  1962. package/src/tui/code-cell.ts +201 -0
  1963. package/src/tui/file-list.ts +55 -0
  1964. package/src/tui/hyperlink.ts +126 -0
  1965. package/src/tui/index.ts +12 -0
  1966. package/src/tui/output-block.ts +150 -0
  1967. package/src/tui/status-line.ts +39 -0
  1968. package/src/tui/tree-list.ts +84 -0
  1969. package/src/tui/types.ts +15 -0
  1970. package/src/tui/utils.ts +103 -0
  1971. package/src/utils/changelog.ts +121 -0
  1972. package/src/utils/clipboard.ts +156 -0
  1973. package/src/utils/command-args.ts +76 -0
  1974. package/src/utils/commit-message-generator.ts +135 -0
  1975. package/src/utils/edit-mode.ts +42 -0
  1976. package/src/utils/event-bus.ts +33 -0
  1977. package/src/utils/external-editor.ts +65 -0
  1978. package/src/utils/file-display-mode.ts +45 -0
  1979. package/src/utils/file-mentions.ts +376 -0
  1980. package/src/utils/git.ts +1536 -0
  1981. package/src/utils/image-loading.ts +102 -0
  1982. package/src/utils/image-resize.ts +309 -0
  1983. package/src/utils/lang-from-path.ts +239 -0
  1984. package/src/utils/markit.ts +89 -0
  1985. package/src/utils/open.ts +20 -0
  1986. package/src/utils/session-color.ts +43 -0
  1987. package/src/utils/shell-snapshot.ts +187 -0
  1988. package/src/utils/sixel.ts +69 -0
  1989. package/src/utils/title-generator.ts +237 -0
  1990. package/src/utils/tokenizer-download.ts +106 -0
  1991. package/src/utils/tokenizer-encoding.ts +29 -0
  1992. package/src/utils/tool-choice.ts +62 -0
  1993. package/src/utils/tools-manager.ts +363 -0
  1994. package/src/vim/buffer.ts +309 -0
  1995. package/src/vim/commands.ts +382 -0
  1996. package/src/vim/engine.ts +2409 -0
  1997. package/src/vim/parser.ts +134 -0
  1998. package/src/vim/render.ts +252 -0
  1999. package/src/vim/types.ts +197 -0
  2000. package/src/web/kagi.ts +183 -0
  2001. package/src/web/parallel.ts +349 -0
  2002. package/src/web/public-fetch-url.ts +74 -0
  2003. package/src/web/scrapers/artifacthub.ts +207 -0
  2004. package/src/web/scrapers/arxiv.ts +83 -0
  2005. package/src/web/scrapers/aur.ts +162 -0
  2006. package/src/web/scrapers/biorxiv.ts +133 -0
  2007. package/src/web/scrapers/bluesky.ts +262 -0
  2008. package/src/web/scrapers/brew.ts +172 -0
  2009. package/src/web/scrapers/cheatsh.ts +68 -0
  2010. package/src/web/scrapers/chocolatey.ts +196 -0
  2011. package/src/web/scrapers/choosealicense.ts +95 -0
  2012. package/src/web/scrapers/cisa-kev.ts +87 -0
  2013. package/src/web/scrapers/clojars.ts +154 -0
  2014. package/src/web/scrapers/coingecko.ts +177 -0
  2015. package/src/web/scrapers/crates-io.ts +97 -0
  2016. package/src/web/scrapers/crossref.ts +136 -0
  2017. package/src/web/scrapers/devto.ts +147 -0
  2018. package/src/web/scrapers/discogs.ts +306 -0
  2019. package/src/web/scrapers/discourse.ts +197 -0
  2020. package/src/web/scrapers/dockerhub.ts +138 -0
  2021. package/src/web/scrapers/docs-rs.ts +653 -0
  2022. package/src/web/scrapers/fdroid.ts +134 -0
  2023. package/src/web/scrapers/firefox-addons.ts +191 -0
  2024. package/src/web/scrapers/flathub.ts +223 -0
  2025. package/src/web/scrapers/github-gist.ts +58 -0
  2026. package/src/web/scrapers/github.ts +452 -0
  2027. package/src/web/scrapers/gitlab.ts +401 -0
  2028. package/src/web/scrapers/go-pkg.ts +266 -0
  2029. package/src/web/scrapers/hackage.ts +140 -0
  2030. package/src/web/scrapers/hackernews.ts +189 -0
  2031. package/src/web/scrapers/hex.ts +105 -0
  2032. package/src/web/scrapers/huggingface.ts +321 -0
  2033. package/src/web/scrapers/iacr.ts +89 -0
  2034. package/src/web/scrapers/index.ts +252 -0
  2035. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  2036. package/src/web/scrapers/lemmy.ts +203 -0
  2037. package/src/web/scrapers/lobsters.ts +175 -0
  2038. package/src/web/scrapers/mastodon.ts +292 -0
  2039. package/src/web/scrapers/maven.ts +138 -0
  2040. package/src/web/scrapers/mdn.ts +173 -0
  2041. package/src/web/scrapers/metacpan.ts +222 -0
  2042. package/src/web/scrapers/musicbrainz.ts +250 -0
  2043. package/src/web/scrapers/npm.ts +98 -0
  2044. package/src/web/scrapers/nuget.ts +183 -0
  2045. package/src/web/scrapers/nvd.ts +222 -0
  2046. package/src/web/scrapers/ollama.ts +239 -0
  2047. package/src/web/scrapers/open-vsx.ts +106 -0
  2048. package/src/web/scrapers/opencorporates.ts +292 -0
  2049. package/src/web/scrapers/openlibrary.ts +336 -0
  2050. package/src/web/scrapers/orcid.ts +286 -0
  2051. package/src/web/scrapers/osv.ts +176 -0
  2052. package/src/web/scrapers/packagist.ts +160 -0
  2053. package/src/web/scrapers/pub-dev.ts +143 -0
  2054. package/src/web/scrapers/pubmed.ts +211 -0
  2055. package/src/web/scrapers/pypi.ts +112 -0
  2056. package/src/web/scrapers/rawg.ts +110 -0
  2057. package/src/web/scrapers/readthedocs.ts +120 -0
  2058. package/src/web/scrapers/reddit.ts +95 -0
  2059. package/src/web/scrapers/repology.ts +251 -0
  2060. package/src/web/scrapers/rfc.ts +201 -0
  2061. package/src/web/scrapers/rubygems.ts +103 -0
  2062. package/src/web/scrapers/searchcode.ts +189 -0
  2063. package/src/web/scrapers/sec-edgar.ts +261 -0
  2064. package/src/web/scrapers/semantic-scholar.ts +171 -0
  2065. package/src/web/scrapers/snapcraft.ts +187 -0
  2066. package/src/web/scrapers/sourcegraph.ts +336 -0
  2067. package/src/web/scrapers/spdx.ts +108 -0
  2068. package/src/web/scrapers/spotify.ts +198 -0
  2069. package/src/web/scrapers/stackoverflow.ts +120 -0
  2070. package/src/web/scrapers/terraform.ts +277 -0
  2071. package/src/web/scrapers/tldr.ts +47 -0
  2072. package/src/web/scrapers/twitter.ts +93 -0
  2073. package/src/web/scrapers/types.ts +358 -0
  2074. package/src/web/scrapers/utils.ts +133 -0
  2075. package/src/web/scrapers/vimeo.ts +133 -0
  2076. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  2077. package/src/web/scrapers/w3c.ts +156 -0
  2078. package/src/web/scrapers/wikidata.ts +344 -0
  2079. package/src/web/scrapers/wikipedia.ts +84 -0
  2080. package/src/web/scrapers/youtube.ts +319 -0
  2081. package/src/web/search/index.ts +416 -0
  2082. package/src/web/search/provider.ts +236 -0
  2083. package/src/web/search/providers/anthropic.ts +319 -0
  2084. package/src/web/search/providers/base.ts +102 -0
  2085. package/src/web/search/providers/brave.ts +149 -0
  2086. package/src/web/search/providers/codex.ts +598 -0
  2087. package/src/web/search/providers/duckduckgo.ts +279 -0
  2088. package/src/web/search/providers/exa.ts +193 -0
  2089. package/src/web/search/providers/gemini.ts +462 -0
  2090. package/src/web/search/providers/jina.ts +101 -0
  2091. package/src/web/search/providers/kagi.ts +75 -0
  2092. package/src/web/search/providers/kimi.ts +171 -0
  2093. package/src/web/search/providers/parallel.ts +210 -0
  2094. package/src/web/search/providers/perplexity.ts +575 -0
  2095. package/src/web/search/providers/searxng.ts +309 -0
  2096. package/src/web/search/providers/synthetic.ts +108 -0
  2097. package/src/web/search/providers/tavily.ts +173 -0
  2098. package/src/web/search/providers/utils.ts +128 -0
  2099. package/src/web/search/providers/xai.ts +174 -0
  2100. package/src/web/search/providers/zai.ts +320 -0
  2101. package/src/web/search/render.ts +299 -0
  2102. package/src/web/search/types.ts +445 -0
  2103. package/src/web/search/utils.ts +17 -0
  2104. package/src/workspace-tree.ts +286 -0
package/src/sdk.ts ADDED
@@ -0,0 +1,2248 @@
1
+ import {
2
+ Agent,
3
+ type AgentEvent,
4
+ type AgentMessage,
5
+ type AgentTelemetryConfig,
6
+ type AgentTool,
7
+ AppendOnlyContextManager,
8
+ INTENT_FIELD,
9
+ type ThinkingLevel,
10
+ } from "@jawcode-dev/agent-core";
11
+ import {
12
+ type CredentialDisabledEvent,
13
+ type Message,
14
+ type Model,
15
+ type ProviderSessionState,
16
+ type SimpleStreamOptions,
17
+ streamSimple,
18
+ } from "@jawcode-dev/ai";
19
+ import {
20
+ getOpenAICodexTransportDetails,
21
+ prewarmOpenAICodexResponses,
22
+ } from "@jawcode-dev/ai/providers/openai-codex-responses";
23
+ import type { Component } from "@jawcode-dev/tui";
24
+ import {
25
+ $flag,
26
+ getAgentDbPath,
27
+ getAgentDir,
28
+ getProjectDir,
29
+ logger,
30
+ postmortem,
31
+ prompt,
32
+ Snowflake,
33
+ } from "@jawcode-dev/utils";
34
+
35
+ import { type AsyncJob, AsyncJobManager, isBackgroundJobSupportEnabled } from "./async";
36
+ import { loadCapability } from "./capability";
37
+ import { type Rule, ruleCapability, setActiveRules } from "./capability/rule";
38
+ import { ModelRegistry } from "./config/model-registry";
39
+ import {
40
+ formatModelString,
41
+ parseModelPattern,
42
+ parseModelString,
43
+ resolveAllowedModels,
44
+ resolveModelRoleValue,
45
+ type ScopedModelSelection,
46
+ } from "./config/model-resolver";
47
+ import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates";
48
+ import { Settings, type SkillsSettings } from "./config/settings";
49
+ import { CursorExecHandlers } from "./cursor";
50
+ import "./discovery";
51
+ import { resolveConfigValue } from "./config/resolve-config-value";
52
+ import { getEmbeddedDefaultJwcSkills } from "./defaults/jwc-defaults";
53
+ import { initializeWithSettings } from "./discovery";
54
+ import { disposeAllKernelSessions, disposeKernelSessionsByOwner } from "./eval/py/executor";
55
+ import { TtsrManager } from "./export/ttsr";
56
+ import type { CustomCommandsLoadResult, LoadedCustomCommand } from "./extensibility/custom-commands";
57
+ import type { CustomTool, CustomToolContext, CustomToolSessionEvent } from "./extensibility/custom-tools/types";
58
+ import { CustomToolAdapter } from "./extensibility/custom-tools/wrapper";
59
+ import {
60
+ type ExtensionContext,
61
+ type ExtensionFactory,
62
+ ExtensionRunner,
63
+ ExtensionToolWrapper,
64
+ type ExtensionUIContext,
65
+ type LoadExtensionsResult,
66
+ loadExtensionFromFactory,
67
+ type ToolDefinition,
68
+ wrapRegisteredTools,
69
+ } from "./extensibility/extensions";
70
+ import { ExtensionRuntime } from "./extensibility/extensions/loader";
71
+ import { resolveCurrentPhaseForParent } from "./extensibility/jwc-plugins/injection";
72
+ import { loadActiveSubskillTools } from "./extensibility/jwc-plugins/tools";
73
+ import { loadSkills, type Skill, type SkillWarning, setActiveSkills } from "./extensibility/skills";
74
+ import type { FileSlashCommand } from "./extensibility/slash-commands";
75
+ import type { HindsightSessionState } from "./hindsight/state";
76
+ import { LocalProtocolHandler, type LocalProtocolOptions } from "./internal-urls";
77
+ import { LSP_STARTUP_EVENT_CHANNEL, type LspStartupEvent } from "./lsp/startup-events";
78
+ import { resolveMemoryBackend } from "./memory-backend";
79
+ import type { NotificationLoopbackServer } from "./notifications/server";
80
+ import { maybeStartNotificationServer } from "./notifications/session-lifecycle";
81
+ import asyncResultTemplate from "./prompts/tools/async-result.md" with { type: "text" };
82
+ import { AgentRegistry, MAIN_AGENT_ID } from "./registry/agent-registry";
83
+ import { MCPManager } from "./runtime-mcp";
84
+ import { isMCPBridgeTool } from "./runtime-mcp/discoverable-tool-metadata";
85
+ import {
86
+ collectEnvSecrets,
87
+ deobfuscateSessionContext,
88
+ loadSecrets,
89
+ obfuscateMessages,
90
+ SecretObfuscator,
91
+ } from "./secrets";
92
+ import { AgentSession, type ForkContextSeed } from "./session/agent-session";
93
+ import { resolveAuthBrokerConfig } from "./session/auth-broker-config";
94
+ import { AuthBrokerClient, AuthStorage, RemoteAuthCredentialStore } from "./session/auth-storage";
95
+ import { type CustomMessage, convertToLlm } from "./session/messages";
96
+ import { SessionManager } from "./session/session-manager";
97
+ import { formatNoModelsAvailableFallback } from "./setup/model-onboarding-guidance";
98
+ import { closeAllConnections } from "./ssh/connection-manager";
99
+ import { unmountAll } from "./ssh/sshfs-mount";
100
+ import {
101
+ type BuildSystemPromptResult,
102
+ buildSystemPrompt as buildSystemPromptInternal,
103
+ buildSystemPromptToolMetadata,
104
+ loadProjectContextFiles as loadContextFilesInternal,
105
+ } from "./system-prompt";
106
+ import { AgentOutputManager } from "./task/output-manager";
107
+ import { parseThinkingLevel, resolveThinkingLevelForModel, toReasoningEffort } from "./thinking";
108
+ import { collectDiscoverableTools, type DiscoverableTool } from "./tool-discovery/tool-index";
109
+ import {
110
+ BashTool,
111
+ BUILTIN_TOOLS,
112
+ computeEssentialBuiltinNames,
113
+ createTools,
114
+ discoverStartupLspServers,
115
+ EditTool,
116
+ EvalTool,
117
+ FindTool,
118
+ getSearchTools,
119
+ HIDDEN_TOOLS,
120
+ isSearchProviderPreference,
121
+ type LspStartupServerInfo,
122
+ loadSshTool,
123
+ ReadTool,
124
+ ResolveTool,
125
+ renderSearchToolBm25Description,
126
+ SearchTool,
127
+ setPreferredImageProvider,
128
+ setPreferredSearchProvider,
129
+ type Tool,
130
+ type ToolSession,
131
+ WebSearchTool,
132
+ WriteTool,
133
+ warmupLspServers,
134
+ } from "./tools";
135
+ import { ToolContextStore } from "./tools/context";
136
+ import { getImageGenTools } from "./tools/image-gen";
137
+ import { wrapToolWithMetaNotice } from "./tools/output-meta";
138
+ import { EventBus } from "./utils/event-bus";
139
+ import { buildNamedToolChoice } from "./utils/tool-choice";
140
+ import { buildWorkspaceTree, type WorkspaceTree } from "./workspace-tree";
141
+
142
+ type AsyncResultEntry = {
143
+ jobId: string;
144
+ result: string;
145
+ job: AsyncJob | undefined;
146
+ durationMs: number | undefined;
147
+ };
148
+
149
+ type AsyncResultJobDetails = {
150
+ jobId: string;
151
+ type?: "bash" | "task";
152
+ label?: string;
153
+ durationMs?: number;
154
+ };
155
+
156
+ type AsyncResultDetails = {
157
+ jobs: AsyncResultJobDetails[];
158
+ };
159
+
160
+ type McpNotificationEntry = {
161
+ serverName: string;
162
+ uri: string;
163
+ };
164
+
165
+ function buildAsyncResultBatchMessage(entries: AsyncResultEntry[]): CustomMessage<AsyncResultDetails> | null {
166
+ if (entries.length === 0) return null;
167
+ const jobs = entries.map(entry => ({
168
+ jobId: entry.jobId,
169
+ result: entry.result,
170
+ type: entry.job?.type,
171
+ label: entry.job?.label,
172
+ durationMs: entry.durationMs,
173
+ }));
174
+ const details: AsyncResultDetails = {
175
+ jobs: jobs.map(job => ({
176
+ jobId: job.jobId,
177
+ type: job.type,
178
+ label: job.label,
179
+ durationMs: job.durationMs,
180
+ })),
181
+ };
182
+ return {
183
+ role: "custom",
184
+ customType: "async-result",
185
+ content: prompt.render(asyncResultTemplate, {
186
+ multiple: jobs.length > 1,
187
+ jobs,
188
+ }),
189
+ display: true,
190
+ attribution: "agent",
191
+ details,
192
+ timestamp: Date.now(),
193
+ };
194
+ }
195
+
196
+ function buildMcpNotificationBatchMessage(entries: McpNotificationEntry[]): AgentMessage | null {
197
+ const resources: McpNotificationEntry[] = [];
198
+ const seen = new Set<string>();
199
+ for (const entry of entries) {
200
+ const key = `${entry.serverName}\0${entry.uri}`;
201
+ if (seen.has(key)) continue;
202
+ seen.add(key);
203
+ resources.push(entry);
204
+ }
205
+ if (resources.length === 0) return null;
206
+ const lines = [`[MCP notification] ${resources.length} resource(s) updated:`];
207
+ for (const resource of resources) {
208
+ lines.push(`- server="${resource.serverName}" uri=${resource.uri}`);
209
+ }
210
+ lines.push('Use read(path="mcp://<uri>") to inspect if relevant.');
211
+ return {
212
+ role: "user",
213
+ content: [{ type: "text", text: lines.join("\n") }],
214
+ attribution: "agent",
215
+ timestamp: Date.now(),
216
+ };
217
+ }
218
+
219
+ // Types
220
+ export interface CreateAgentSessionOptions {
221
+ /** Working directory for project-local discovery. Default: getProjectDir() */
222
+ cwd?: string;
223
+ /** Global config directory. Default: ~/.jwc/agent */
224
+ agentDir?: string;
225
+ /** Spawns to allow. Default: "*" */
226
+ spawns?: string;
227
+
228
+ /** Auth storage for credentials. Default: discoverAuthStorage(agentDir) */
229
+ authStorage?: AuthStorage;
230
+ /** Model registry. Default: discoverModels(authStorage, agentDir) */
231
+ modelRegistry?: ModelRegistry;
232
+
233
+ /** Model to use. Default: from settings, else first available */
234
+ model?: Model;
235
+ /** Raw model pattern string (e.g. from --model CLI flag) to resolve after extensions load.
236
+ * Used when model lookup is deferred because extension-provided models aren't registered yet. */
237
+ modelPattern?: string;
238
+ /** Thinking selector. Default: from settings, else unset */
239
+ thinkingLevel?: ThinkingLevel;
240
+ /** Models available for cycling (Ctrl+P in interactive mode) */
241
+ scopedModels?: ScopedModelSelection[];
242
+
243
+ /** System prompt blocks. Array replaces default, function receives default blocks and returns final blocks. */
244
+ systemPrompt?: string[] | ((defaultPrompt: string[]) => string[]);
245
+ /** Optional provider-facing session identifier for prompt caches and sticky auth selection.
246
+ * Keeps persisted session files isolated while reusing provider-side caches. */
247
+ providerSessionId?: string;
248
+
249
+ /** Custom tools to register (in addition to built-in tools). Accepts both CustomTool and ToolDefinition. */
250
+ customTools?: (CustomTool | ToolDefinition)[];
251
+ /** Explicit parent/phase used to load active GJC sub-skill tools for this session. */
252
+ gjcSubskillToolContext?: { parent: string; phase: string; sessionId?: string; cwd?: string };
253
+ /** Inline extensions (merged with discovery). */
254
+ extensions?: ExtensionFactory[];
255
+ /** Additional extension paths to load (merged with discovery). */
256
+ additionalExtensionPaths?: string[];
257
+ /** Disable extension discovery (explicit paths still load). */
258
+ disableExtensionDiscovery?: boolean;
259
+ /**
260
+ * Pre-loaded extensions (skips file discovery).
261
+ * @internal Used by CLI when extensions are loaded early to parse custom flags.
262
+ */
263
+ preloadedExtensions?: LoadExtensionsResult;
264
+
265
+ /** Shared event bus for tool/extension communication. Default: creates new bus. */
266
+ eventBus?: EventBus;
267
+
268
+ /** Skills. Default: bundled GJC defaults, plus filesystem skills when enabled */
269
+ skills?: Skill[];
270
+ /** Rules. Default: discovered from multiple locations */
271
+ rules?: Rule[];
272
+ /** Context files (AGENTS.md content). Default: discovered walking up from cwd */
273
+ contextFiles?: Array<{ path: string; content: string }>;
274
+ /** Pre-built workspace tree (skips re-scanning; passed by parents to subagents). */
275
+ workspaceTree?: WorkspaceTree;
276
+ /** Prompt templates. Default: discovered from cwd/.jwc/prompts/ + agentDir/prompts/ */
277
+ promptTemplates?: PromptTemplate[];
278
+ /** File-based slash commands. Default: discovered from commands/ directories */
279
+ slashCommands?: FileSlashCommand[];
280
+
281
+ /** @deprecated MCP runtime discovery is quarantined and ignored. */
282
+ enableMCP?: boolean;
283
+ /** Existing MCP manager to reuse (skips discovery, propagates to toolSession). */
284
+ mcpManager?: MCPManager;
285
+
286
+ /** Enable LSP integration (tool, formatting, diagnostics, warmup). Default: true */
287
+ enableLsp?: boolean;
288
+ /** Skip Python kernel availability check and prelude warmup */
289
+ skipPythonPreflight?: boolean;
290
+ /** Tool names explicitly requested (enables disabled-by-default tools) */
291
+ toolNames?: string[];
292
+
293
+ /** Output schema for structured completion (subagents) */
294
+ outputSchema?: unknown;
295
+ /** Whether to include the yield tool by default */
296
+ requireYieldTool?: boolean;
297
+ /** Task recursion depth (for subagent sessions). Default: 0 */
298
+ taskDepth?: number;
299
+ /** Current role-agent type/name for nested task sessions. */
300
+ currentAgentType?: string;
301
+ /** Parent Hindsight state to alias for subagent private memory backend compatibility. */
302
+ parentHindsightSessionState?: HindsightSessionState;
303
+ /** Pre-allocated agent identity for IRC routing. Default: "0-Main" for top-level, parentTaskPrefix-derived for sub. */
304
+ agentId?: string;
305
+ /** Display name for the agent in IRC. Default: "main" or "sub". */
306
+ agentDisplayName?: string;
307
+ /** Optional restricted bash command prefixes for read-only role agents. */
308
+ bashAllowedPrefixes?: string[];
309
+ /** Optional shared agent registry for IRC routing. Default: AgentRegistry.global(). */
310
+ agentRegistry?: AgentRegistry;
311
+ /** Parent task ID prefix for nested artifact naming (e.g., "6-Extensions") */
312
+ parentTaskPrefix?: string;
313
+
314
+ /** Session manager. Default: session stored under the configured agentDir sessions root */
315
+ sessionManager?: SessionManager;
316
+
317
+ /** Override local:// protocol options for subagent local:// sharing. Default: uses the session's own artifacts dir and session ID. */
318
+ localProtocolOptions?: LocalProtocolOptions;
319
+
320
+ /** Settings instance. Default: Settings.init({ cwd, agentDir }) */
321
+ settings?: Settings;
322
+
323
+ /** Whether UI is available (enables interactive tools like ask). Default: false */
324
+ hasUI?: boolean;
325
+
326
+ /**
327
+ * Opt-in OpenTelemetry instrumentation forwarded to the underlying Agent.
328
+ * Passing `{}` enables the loop's GenAI-semantic-convention spans. See
329
+ * {@link AgentTelemetryConfig} for the full surface (hooks, content capture,
330
+ * cost estimator, agent identity).
331
+ *
332
+ * Safe to enable without an OTEL SDK registered in the host: the
333
+ * `@opentelemetry/api` package returns a no-op tracer in that case.
334
+ */
335
+ telemetry?: AgentTelemetryConfig;
336
+ /** Optional fork-context seed used to initialize a child session before its first prompt. */
337
+ forkContextSeed?: ForkContextSeed;
338
+ /** Optional provider state override. Fork-context children should omit this by default. */
339
+ providerSessionState?: Map<string, ProviderSessionState>;
340
+ /** Cooperative pause checkpoint passed through to Agent. */
341
+ shouldPause?: () => boolean;
342
+ }
343
+
344
+ /** Result from createAgentSession */
345
+ export interface CreateAgentSessionResult {
346
+ /** The created session */
347
+ session: AgentSession;
348
+ /** Extensions result (loaded extensions + runtime) */
349
+ extensionsResult: LoadExtensionsResult;
350
+ /** Update tool UI context (interactive mode) */
351
+ setToolUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void;
352
+ /** MCP manager for server lifecycle management (undefined if MCP disabled) */
353
+ mcpManager?: MCPManager;
354
+ /** Warning if session was restored with a different model than saved */
355
+ modelFallbackMessage?: string;
356
+ /** LSP servers detected for startup; warmup may continue in the background */
357
+ lspServers?: LspStartupServerInfo[];
358
+ /** Shared event bus for tool/extension communication */
359
+ eventBus: EventBus;
360
+ }
361
+
362
+ // Re-exports
363
+
364
+ export type { PromptTemplate } from "./config/prompt-templates";
365
+ export { Settings, type SkillsSettings } from "./config/settings";
366
+ export type { CustomCommand, CustomCommandFactory } from "./extensibility/custom-commands/types";
367
+ export type { CustomTool, CustomToolFactory } from "./extensibility/custom-tools/types";
368
+ export type * from "./extensibility/extensions";
369
+ export type { Skill } from "./extensibility/skills";
370
+ export type { FileSlashCommand } from "./extensibility/slash-commands";
371
+ export {
372
+ type PabcdEnvelope,
373
+ readPabcdStateWithFallback,
374
+ writeNativeWorkflowEnvelopeAtomic,
375
+ } from "./jwc-runtime/orchestrate-state";
376
+ export type { AgentSession, AgentSessionEvent } from "./session/agent-session";
377
+ // Host-driven session lifecycle (120.1 안 A): embedders pick create/continueRecent/open
378
+ // and inject via CreateAgentSessionOptions.sessionManager.
379
+ export { SessionManager } from "./session/session-manager";
380
+ export type { Tool } from "./tools";
381
+ export { buildDirectoryTree, buildWorkspaceTree, type DirectoryTree, type WorkspaceTree } from "./workspace-tree";
382
+
383
+ export {
384
+ // Individual tool classes (for custom usage)
385
+ BashTool,
386
+ // Tool classes and factories
387
+ BUILTIN_TOOLS,
388
+ createTools,
389
+ EditTool,
390
+ EvalTool,
391
+ FindTool,
392
+ HIDDEN_TOOLS,
393
+ loadSshTool,
394
+ ReadTool,
395
+ ResolveTool,
396
+ SearchTool,
397
+ type ToolSession,
398
+ WebSearchTool,
399
+ WriteTool,
400
+ };
401
+
402
+ // Helper Functions
403
+
404
+ function getDefaultAgentDir(): string {
405
+ return getAgentDir();
406
+ }
407
+
408
+ // Discovery Functions
409
+
410
+ /**
411
+ * Create an AuthStorage instance.
412
+ *
413
+ * Default: local SQLite store at `<agentDir>/agent.db`.
414
+ *
415
+ * Broker mode: when `GJC_AUTH_BROKER_URL` is set, credentials are pulled from
416
+ * a remote auth-broker over the wire. Refresh tokens never leave the broker;
417
+ * the client receives access tokens with `refresh = "__remote__"` and calls
418
+ * back into the broker through the {@link AuthStorageOptions.refreshOAuthCredential}
419
+ * override to re-mint access tokens when needed.
420
+ */
421
+ export async function discoverAuthStorage(agentDir: string = getDefaultAgentDir()): Promise<AuthStorage> {
422
+ const brokerConfig = await resolveAuthBrokerConfig();
423
+ if (brokerConfig) {
424
+ const client = new AuthBrokerClient({ url: brokerConfig.url, token: brokerConfig.token });
425
+ const initialResult = await client.fetchSnapshot();
426
+ if (initialResult.status !== 200) throw new Error("Auth broker returned no initial snapshot");
427
+ const store = new RemoteAuthCredentialStore({ client, initialSnapshot: initialResult.snapshot });
428
+ // Refresh + usage hooks live on RemoteAuthCredentialStore; AuthStorage
429
+ // discovers them automatically when no explicit option overrides them.
430
+ const storage = new AuthStorage(store, {
431
+ configValueResolver: resolveConfigValue,
432
+ sourceLabel: `broker ${brokerConfig.url}`,
433
+ });
434
+ await storage.reload();
435
+ return storage;
436
+ }
437
+ const dbPath = getAgentDbPath(agentDir);
438
+ const storage = await AuthStorage.create(dbPath, {
439
+ configValueResolver: resolveConfigValue,
440
+ sourceLabel: `local ${dbPath}`,
441
+ });
442
+ await storage.reload();
443
+ return storage;
444
+ }
445
+
446
+ /**
447
+ * Discover extensions from cwd.
448
+ */
449
+ export async function discoverExtensions(_cwd?: string): Promise<LoadExtensionsResult> {
450
+ return { extensions: [], errors: [], runtime: new ExtensionRuntime() };
451
+ }
452
+
453
+ /**
454
+ * Discover skills from cwd and agentDir.
455
+ */
456
+ export async function discoverSkills(
457
+ _cwd?: string,
458
+ _agentDir?: string,
459
+ _settings?: SkillsSettings,
460
+ ): Promise<{ skills: Skill[]; warnings: SkillWarning[] }> {
461
+ return { skills: [], warnings: [] };
462
+ }
463
+
464
+ /**
465
+ * Discover context files (AGENTS.md) walking up from cwd.
466
+ * Returns files sorted by depth (farther from cwd first, so closer files appear last/more prominent).
467
+ */
468
+ export async function discoverContextFiles(
469
+ cwd?: string,
470
+ _agentDir?: string,
471
+ ): Promise<Array<{ path: string; content: string; depth?: number }>> {
472
+ return await loadContextFilesInternal({
473
+ cwd: cwd ?? getProjectDir(),
474
+ });
475
+ }
476
+
477
+ /**
478
+ * Discover prompt templates from cwd and agentDir.
479
+ */
480
+ export async function discoverPromptTemplates(cwd?: string, agentDir?: string): Promise<PromptTemplate[]> {
481
+ return await loadPromptTemplatesInternal({
482
+ cwd: cwd ?? getProjectDir(),
483
+ agentDir: agentDir ?? getDefaultAgentDir(),
484
+ });
485
+ }
486
+
487
+ /**
488
+ * Discover file-based slash commands from commands/ directories.
489
+ */
490
+ export async function discoverSlashCommands(_cwd?: string): Promise<FileSlashCommand[]> {
491
+ return [];
492
+ }
493
+
494
+ /**
495
+ * Discover custom commands (TypeScript slash commands) from cwd and agentDir.
496
+ */
497
+ export async function discoverCustomTSCommands(_cwd?: string, _agentDir?: string): Promise<CustomCommandsLoadResult> {
498
+ return { commands: [], errors: [] };
499
+ }
500
+
501
+ // API Key Helpers
502
+
503
+ // System Prompt
504
+
505
+ export interface BuildSystemPromptOptions {
506
+ tools?: Tool[];
507
+ skills?: Skill[];
508
+ contextFiles?: Array<{ path: string; content: string }>;
509
+ cwd?: string;
510
+ appendPrompt?: string;
511
+ repeatToolDescriptions?: boolean;
512
+ }
513
+
514
+ /**
515
+ * Build the default provider-facing system prompt blocks.
516
+ *
517
+ * The returned `systemPrompt` preserves the stable harness prompt and dynamic project context
518
+ * as separate entries so providers can cache prompt prefixes without concatenating blocks.
519
+ */
520
+ export async function buildSystemPrompt(options: BuildSystemPromptOptions = {}): Promise<BuildSystemPromptResult> {
521
+ return await buildSystemPromptInternal({
522
+ cwd: options.cwd,
523
+ skills: options.skills,
524
+ contextFiles: options.contextFiles,
525
+ appendSystemPrompt: options.appendPrompt,
526
+ repeatToolDescriptions: options.repeatToolDescriptions,
527
+ });
528
+ }
529
+
530
+ // Internal Helpers
531
+
532
+ function createCustomToolContext(ctx: ExtensionContext): CustomToolContext {
533
+ return {
534
+ sessionManager: ctx.sessionManager,
535
+ modelRegistry: ctx.modelRegistry,
536
+ model: ctx.model,
537
+ isIdle: ctx.isIdle,
538
+ hasQueuedMessages: ctx.hasPendingMessages,
539
+ abort: ctx.abort,
540
+ };
541
+ }
542
+
543
+ function isCustomTool(tool: CustomTool | ToolDefinition): tool is CustomTool {
544
+ // To distinguish, we mark converted tools with a hidden symbol property.
545
+ // If the tool doesn't have this marker, it's a CustomTool that needs conversion.
546
+ return !(tool as any).__isToolDefinition;
547
+ }
548
+
549
+ const TOOL_DEFINITION_MARKER = Symbol("__isToolDefinition");
550
+
551
+ /** Matches the truncation applied to per-server instructions inside `rebuildSystemPrompt`. */
552
+ const MAX_MCP_INSTRUCTIONS_LENGTH = 4000;
553
+
554
+ let sshCleanupRegistered = false;
555
+
556
+ async function cleanupSshResources(): Promise<void> {
557
+ const results = await Promise.allSettled([closeAllConnections(), unmountAll()]);
558
+ for (const result of results) {
559
+ if (result.status === "rejected") {
560
+ logger.warn("SSH cleanup failed", { error: String(result.reason) });
561
+ }
562
+ }
563
+ }
564
+
565
+ function registerSshCleanup(): void {
566
+ if (sshCleanupRegistered) return;
567
+ sshCleanupRegistered = true;
568
+ postmortem.register("ssh-cleanup", cleanupSshResources);
569
+ }
570
+
571
+ let pythonCleanupRegistered = false;
572
+
573
+ function registerPythonCleanup(): void {
574
+ if (pythonCleanupRegistered) return;
575
+ pythonCleanupRegistered = true;
576
+ postmortem.register("python-cleanup", disposeAllKernelSessions);
577
+ }
578
+
579
+ /**
580
+ * Resolve whether to enable append-only context mode based on the setting and provider.
581
+ *
582
+ * - `"on"` → always enable
583
+ * - `"off"` → never enable
584
+ * - `"auto"` → enable for DeepSeek (prefix-caching provider)
585
+ */
586
+ function resolveAppendOnlyMode(setting: "auto" | "on" | "off" | undefined, provider: string): boolean {
587
+ switch (setting ?? "auto") {
588
+ case "on":
589
+ return true;
590
+ case "off":
591
+ return false;
592
+ default:
593
+ return provider === "deepseek";
594
+ }
595
+ }
596
+
597
+ function customToolToDefinition(tool: CustomTool): ToolDefinition {
598
+ const definition: ToolDefinition & { [TOOL_DEFINITION_MARKER]: true } = {
599
+ name: tool.name,
600
+ label: tool.label,
601
+ description: tool.description,
602
+ parameters: tool.parameters,
603
+ hidden: tool.hidden,
604
+ deferrable: tool.deferrable,
605
+ mcpServerName: tool.mcpServerName,
606
+ mcpToolName: tool.mcpToolName,
607
+ execute: (toolCallId, params, signal, onUpdate, ctx) =>
608
+ tool.execute(toolCallId, params, onUpdate, createCustomToolContext(ctx), signal),
609
+ onSession: tool.onSession ? (event, ctx) => tool.onSession?.(event, createCustomToolContext(ctx)) : undefined,
610
+ renderCall: tool.renderCall,
611
+ renderResult: tool.renderResult
612
+ ? (result, options, theme): Component => {
613
+ const component = tool.renderResult?.(
614
+ result,
615
+ { expanded: options.expanded, isPartial: options.isPartial, spinnerFrame: options.spinnerFrame },
616
+ theme,
617
+ );
618
+ // Return empty component if undefined to match Component type requirement
619
+ return component ?? ({ render: () => [] } as unknown as Component);
620
+ }
621
+ : undefined,
622
+ [TOOL_DEFINITION_MARKER]: true,
623
+ };
624
+ return definition;
625
+ }
626
+
627
+ function createCustomToolsExtension(tools: CustomTool[]): ExtensionFactory {
628
+ return api => {
629
+ for (const tool of tools) {
630
+ api.registerTool(customToolToDefinition(tool));
631
+ }
632
+
633
+ const runOnSession = async (event: CustomToolSessionEvent, ctx: ExtensionContext) => {
634
+ for (const tool of tools) {
635
+ if (!tool.onSession) continue;
636
+ try {
637
+ await tool.onSession(event, createCustomToolContext(ctx));
638
+ } catch (err) {
639
+ logger.warn("Custom tool onSession error", { tool: tool.name, error: String(err) });
640
+ }
641
+ }
642
+ };
643
+
644
+ api.on("session_start", async (_event, ctx) =>
645
+ runOnSession({ reason: "start", previousSessionFile: undefined }, ctx),
646
+ );
647
+ api.on("session_switch", async (event, ctx) =>
648
+ runOnSession({ reason: "switch", previousSessionFile: event.previousSessionFile }, ctx),
649
+ );
650
+ api.on("session_branch", async (event, ctx) =>
651
+ runOnSession({ reason: "branch", previousSessionFile: event.previousSessionFile }, ctx),
652
+ );
653
+ api.on("session_tree", async (_event, ctx) =>
654
+ runOnSession({ reason: "tree", previousSessionFile: undefined }, ctx),
655
+ );
656
+ api.on("session_shutdown", async (_event, ctx) =>
657
+ runOnSession({ reason: "shutdown", previousSessionFile: undefined }, ctx),
658
+ );
659
+ api.on("auto_compaction_start", async (event, ctx) =>
660
+ runOnSession({ reason: "auto_compaction_start", trigger: event.reason, action: event.action }, ctx),
661
+ );
662
+ api.on("auto_compaction_end", async (event, ctx) =>
663
+ runOnSession(
664
+ {
665
+ reason: "auto_compaction_end",
666
+ action: event.action,
667
+ result: event.result,
668
+ aborted: event.aborted,
669
+ willRetry: event.willRetry,
670
+ errorMessage: event.errorMessage,
671
+ },
672
+ ctx,
673
+ ),
674
+ );
675
+ api.on("auto_retry_start", async (event, ctx) =>
676
+ runOnSession(
677
+ {
678
+ reason: "auto_retry_start",
679
+ attempt: event.attempt,
680
+ maxAttempts: event.maxAttempts,
681
+ unbounded: event.unbounded,
682
+ delayMs: event.delayMs,
683
+ errorMessage: event.errorMessage,
684
+ },
685
+ ctx,
686
+ ),
687
+ );
688
+ api.on("auto_retry_end", async (event, ctx) =>
689
+ runOnSession(
690
+ {
691
+ reason: "auto_retry_end",
692
+ success: event.success,
693
+ attempt: event.attempt,
694
+ finalError: event.finalError,
695
+ },
696
+ ctx,
697
+ ),
698
+ );
699
+ api.on("ttsr_triggered", async (event, ctx) =>
700
+ runOnSession({ reason: "ttsr_triggered", rules: event.rules }, ctx),
701
+ );
702
+ api.on("todo_reminder", async (event, ctx) =>
703
+ runOnSession(
704
+ {
705
+ reason: "todo_reminder",
706
+ todos: event.todos,
707
+ attempt: event.attempt,
708
+ maxAttempts: event.maxAttempts,
709
+ },
710
+ ctx,
711
+ ),
712
+ );
713
+ };
714
+ }
715
+
716
+ // Factory
717
+
718
+ /**
719
+ * Build LoadedCustomCommand entries for all MCP prompts across connected servers.
720
+ * These are re-created whenever prompts change (setOnPromptsChanged callback).
721
+ */
722
+ function buildMCPPromptCommands(manager: MCPManager): LoadedCustomCommand[] {
723
+ const commands: LoadedCustomCommand[] = [];
724
+ for (const serverName of manager.getConnectedServers()) {
725
+ const prompts = manager.getServerPrompts(serverName);
726
+ if (!prompts?.length) continue;
727
+ for (const prompt of prompts) {
728
+ const commandName = `${serverName}:${prompt.name}`;
729
+ commands.push({
730
+ path: `mcp:${commandName}`,
731
+ resolvedPath: `mcp:${commandName}`,
732
+ source: "bundled",
733
+ command: {
734
+ name: commandName,
735
+ description: prompt.description ?? `MCP prompt from ${serverName}`,
736
+ async execute(args: string[]) {
737
+ const promptArgs: Record<string, string> = {};
738
+ for (const arg of args) {
739
+ const eqIdx = arg.indexOf("=");
740
+ if (eqIdx > 0) {
741
+ promptArgs[arg.slice(0, eqIdx)] = arg.slice(eqIdx + 1);
742
+ }
743
+ }
744
+ const result = await manager.executePrompt(serverName, prompt.name, promptArgs);
745
+ if (!result) return "";
746
+ const parts: string[] = [];
747
+ for (const msg of result.messages) {
748
+ const contentItems = Array.isArray(msg.content) ? msg.content : [msg.content];
749
+ for (const item of contentItems) {
750
+ if (item.type === "text") {
751
+ parts.push(item.text);
752
+ } else if (item.type === "resource") {
753
+ const resource = item.resource;
754
+ if (resource.text) parts.push(resource.text);
755
+ }
756
+ }
757
+ }
758
+ return parts.join("\n\n");
759
+ },
760
+ },
761
+ });
762
+ }
763
+ }
764
+ return commands;
765
+ }
766
+ /**
767
+ * Create an AgentSession with the specified options.
768
+ *
769
+ * @example
770
+ * ```typescript
771
+ * // Minimal - uses defaults
772
+ * const { session } = await createAgentSession();
773
+ *
774
+ * // With explicit model
775
+ * import { getModel } from '@jawcode-dev/ai';
776
+ * const { session } = await createAgentSession({
777
+ * model: getModel('anthropic', 'Anthropic model-opus-4-5'),
778
+ * thinkingLevel: 'high',
779
+ * });
780
+ *
781
+ * // Continue previous session
782
+ * const { session, modelFallbackMessage } = await createAgentSession({
783
+ * continueSession: true,
784
+ * });
785
+ *
786
+ * // Full control
787
+ * const { session } = await createAgentSession({
788
+ * model: myModel,
789
+ * getApiKey: async () => Bun.env.MY_KEY,
790
+ * systemPrompt: ['You are helpful.'],
791
+ * tools: codingTools({ cwd: getProjectDir() }),
792
+ * skills: [],
793
+ * sessionManager: SessionManager.inMemory(),
794
+ * });
795
+ * ```
796
+ */
797
+
798
+ function withEmbeddedDefaultJwcSkills(skills: Skill[]): Skill[] {
799
+ const byName = new Map(skills.map(skill => [skill.name, skill]));
800
+ for (const defaultSkill of getEmbeddedDefaultJwcSkills()) {
801
+ if (!byName.has(defaultSkill.name)) {
802
+ byName.set(defaultSkill.name, defaultSkill);
803
+ }
804
+ }
805
+ return [...byName.values()];
806
+ }
807
+
808
+ function mergeMissingSkills(primary: Skill[], secondary: Skill[]): Skill[] {
809
+ const byName = new Map(primary.map(skill => [skill.name, skill]));
810
+ for (const skill of secondary) {
811
+ if (!byName.has(skill.name)) {
812
+ byName.set(skill.name, skill);
813
+ }
814
+ }
815
+ return [...byName.values()];
816
+ }
817
+
818
+ export async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {
819
+ const cwd = options.cwd ?? getProjectDir();
820
+ const agentDir = options.agentDir ?? getDefaultAgentDir();
821
+ const eventBus = options.eventBus ?? new EventBus();
822
+
823
+ registerSshCleanup();
824
+ registerPythonCleanup();
825
+
826
+ // Pin authStorage to modelRegistry.authStorage: ModelRegistry.getApiKey() routes refresh
827
+ // failures through that instance, so any divergent storage handed to the bridge / mcpManager
828
+ // / session would silently miss credential_disabled events.
829
+ const modelRegistry =
830
+ options.modelRegistry ??
831
+ new ModelRegistry(options.authStorage ?? (await logger.time("discoverModels", discoverAuthStorage, agentDir)));
832
+ const authStorage = modelRegistry.authStorage;
833
+ if (options.authStorage && options.authStorage !== authStorage) {
834
+ throw new Error(
835
+ "options.authStorage and options.modelRegistry.authStorage must be the same instance when both are provided",
836
+ );
837
+ }
838
+ // Subscribe before any getApiKey() call so startup model probes can't fire a
839
+ // credential_disabled event past us. An embedder's constructor handler makes the
840
+ // listener set non-empty from construction, which defeats AuthStorage's no-listener
841
+ // buffer — so we can't rely on it to catch startup events for the extension runner.
842
+ const startupCredentialDisabledEvents: CredentialDisabledEvent[] = [];
843
+ let credentialDisabledTarget: ExtensionRunner | undefined;
844
+ let unsubscribeCredentialDisabled: (() => void) | undefined = authStorage.onCredentialDisabled(event => {
845
+ if (credentialDisabledTarget) {
846
+ // Discard return: any handler error is routed through runner.onError listeners.
847
+ void credentialDisabledTarget.emitCredentialDisabled(event);
848
+ } else {
849
+ startupCredentialDisabledEvents.push(event);
850
+ }
851
+ });
852
+ const settings = options.settings ?? (await logger.time("settings", Settings.init, { cwd, agentDir }));
853
+ modelRegistry.applyConfiguredModelBindings(settings);
854
+ logger.time("initializeWithSettings", initializeWithSettings, settings);
855
+ if (!options.modelRegistry) {
856
+ modelRegistry.refreshInBackground();
857
+ }
858
+ // Kick off workspace tree discovery early. The native workspace scan returns
859
+ // both the rendered-tree input and the AGENTS.md directory-context index, so
860
+ // startup does not perform a second recursive filesystem search. Subagents
861
+ // inherit the parent's resolved values via options.
862
+ const STARTUP_SCAN_DEADLINE_MS = 5000;
863
+ const workspaceTreePromise: Promise<WorkspaceTree> = options.workspaceTree
864
+ ? Promise.resolve(options.workspaceTree)
865
+ : logger.time("buildWorkspaceTree", () => buildWorkspaceTree(cwd, { timeoutMs: STARTUP_SCAN_DEADLINE_MS }));
866
+ workspaceTreePromise.catch(() => {});
867
+
868
+ // Independent discoveries that depend only on cwd/agentDir — kicked off in parallel and awaited
869
+ // at their respective consumer sites. Their work can overlap with model resolution, secret loading,
870
+ // session-context build, tool creation, MCP discovery, and extension discovery.
871
+ const contextFilesPromise = options.contextFiles
872
+ ? Promise.resolve(options.contextFiles)
873
+ : logger.time("discoverContextFiles", discoverContextFiles, cwd, agentDir);
874
+ contextFilesPromise.catch(() => {});
875
+ const promptTemplatesPromise = options.promptTemplates
876
+ ? Promise.resolve(options.promptTemplates)
877
+ : logger.time("discoverPromptTemplates", discoverPromptTemplates, cwd, agentDir);
878
+ promptTemplatesPromise.catch(() => {});
879
+ const slashCommandsPromise = options.slashCommands ? Promise.resolve(options.slashCommands) : Promise.resolve([]);
880
+ slashCommandsPromise.catch(() => {});
881
+
882
+ // Initialize provider preferences from settings
883
+ const webSearchProvider = settings.get("providers.webSearch");
884
+ if (typeof webSearchProvider === "string" && isSearchProviderPreference(webSearchProvider)) {
885
+ setPreferredSearchProvider(webSearchProvider);
886
+ }
887
+
888
+ const imageProvider = settings.get("providers.image");
889
+ if (
890
+ imageProvider === "auto" ||
891
+ imageProvider === "openai" ||
892
+ imageProvider === "gemini" ||
893
+ imageProvider === "openrouter" ||
894
+ imageProvider === "antigravity"
895
+ ) {
896
+ setPreferredImageProvider(imageProvider);
897
+ }
898
+
899
+ const sessionManager =
900
+ options.sessionManager ??
901
+ logger.time("sessionManager", () =>
902
+ SessionManager.create(cwd, SessionManager.getDefaultSessionDir(cwd, agentDir)),
903
+ );
904
+ const logicalSessionId = sessionManager.getSessionId();
905
+ const providerSessionId = options.providerSessionId ?? options.forkContextSeed?.cacheIdentity ?? logicalSessionId;
906
+ const modelApiKeyAvailability = new Map<string, boolean>();
907
+ const getModelAvailabilityKey = (candidate: Model): string =>
908
+ `${candidate.provider}\u0000${candidate.baseUrl ?? ""}`;
909
+ const hasModelApiKey = async (candidate: Model): Promise<boolean> => {
910
+ const availabilityKey = getModelAvailabilityKey(candidate);
911
+ const cached = modelApiKeyAvailability.get(availabilityKey);
912
+ if (cached !== undefined) {
913
+ return cached;
914
+ }
915
+
916
+ const hasKey = !!(await modelRegistry.getApiKey(candidate, providerSessionId));
917
+ modelApiKeyAvailability.set(availabilityKey, hasKey);
918
+ return hasKey;
919
+ };
920
+
921
+ // Load and create secret obfuscator early so resumed session state and prompt warnings
922
+ // reflect actual loaded secrets, not just the setting toggle.
923
+ let obfuscator: SecretObfuscator | undefined;
924
+ if (settings.get("secrets.enabled")) {
925
+ const fileEntries = await logger.time("loadSecrets", loadSecrets, cwd, agentDir);
926
+ const envEntries = collectEnvSecrets();
927
+ const allEntries = [...envEntries, ...fileEntries];
928
+ if (allEntries.length > 0) {
929
+ obfuscator = new SecretObfuscator(allEntries);
930
+ }
931
+ }
932
+ const secretsEnabled = obfuscator?.hasSecrets() === true;
933
+
934
+ // Check if session has existing data to restore
935
+ const existingSession = logger.time("loadSessionContext", () =>
936
+ deobfuscateSessionContext(sessionManager.buildSessionContext(), obfuscator),
937
+ );
938
+ const existingBranch = logger.time("getSessionBranch", () => sessionManager.getBranch());
939
+ const hasExistingSession = existingBranch.length > 0;
940
+ const hasThinkingEntry = existingBranch.some(entry => entry.type === "thinking_level_change");
941
+ const hasServiceTierEntry = existingBranch.some(entry => entry.type === "service_tier_change");
942
+
943
+ const hasExplicitModel = options.model !== undefined || options.modelPattern !== undefined;
944
+ const modelMatchPreferences = {
945
+ usageOrder: settings.getStorage()?.getModelUsageOrder(),
946
+ };
947
+ const allowedModels = await logger.time("resolveAllowedModels", () =>
948
+ resolveAllowedModels(modelRegistry, settings, modelMatchPreferences),
949
+ );
950
+ const defaultRoleSpec = logger.time("resolveDefaultModelRole", () =>
951
+ resolveModelRoleValue(settings.getModelRole("default"), allowedModels, {
952
+ settings,
953
+ matchPreferences: modelMatchPreferences,
954
+ modelRegistry,
955
+ }),
956
+ );
957
+ let model = options.model;
958
+ let modelFallbackMessage: string | undefined;
959
+ // If session has data, try to restore model from it.
960
+ // Skip restore when an explicit model was requested.
961
+ const defaultModelStr = existingSession.models.default;
962
+ if (!hasExplicitModel && !model && hasExistingSession && defaultModelStr) {
963
+ await logger.time("restoreSessionModel", async () => {
964
+ const parsedModel = parseModelString(defaultModelStr);
965
+ if (parsedModel) {
966
+ const restoredModel = modelRegistry.find(parsedModel.provider, parsedModel.id);
967
+ if (restoredModel && (await hasModelApiKey(restoredModel))) {
968
+ model = restoredModel;
969
+ }
970
+ }
971
+ if (!model) {
972
+ modelFallbackMessage = `Could not restore model ${defaultModelStr}`;
973
+ }
974
+ });
975
+ }
976
+
977
+ // If still no model, try settings default.
978
+ // Skip settings fallback when an explicit model was requested.
979
+ if (!hasExplicitModel && !model && defaultRoleSpec.model) {
980
+ const settingsDefaultModel = defaultRoleSpec.model;
981
+ logger.time("resolveSettingsDefaultModel", () => {
982
+ // defaultRoleSpec.model already comes from modelRegistry.getAvailable(),
983
+ // so re-validating auth here just repeats the expensive lookup path.
984
+ model = settingsDefaultModel;
985
+ });
986
+ }
987
+
988
+ const taskDepth = options.taskDepth ?? 0;
989
+
990
+ let thinkingLevel = options.thinkingLevel;
991
+
992
+ // If session has data and includes a thinking entry, restore it
993
+ if (thinkingLevel === undefined && hasExistingSession && hasThinkingEntry) {
994
+ thinkingLevel = parseThinkingLevel(existingSession.thinkingLevel);
995
+ }
996
+
997
+ if (thinkingLevel === undefined && !hasExplicitModel && !hasThinkingEntry && defaultRoleSpec.explicitThinkingLevel) {
998
+ thinkingLevel = defaultRoleSpec.thinkingLevel;
999
+ }
1000
+
1001
+ // Prefer the selected model's configured defaultLevel, otherwise fall back
1002
+ // to the global settings default.
1003
+ if (thinkingLevel === undefined && model?.thinking?.defaultLevel !== undefined) {
1004
+ thinkingLevel = model.thinking.defaultLevel;
1005
+ }
1006
+ if (thinkingLevel === undefined) {
1007
+ thinkingLevel = settings.get("defaultThinkingLevel");
1008
+ }
1009
+ if (model) {
1010
+ const resolvedModel = model;
1011
+ thinkingLevel = logger.time("resolveThinkingLevelForModel", () =>
1012
+ resolveThinkingLevelForModel(resolvedModel, thinkingLevel),
1013
+ );
1014
+ // Fire-and-forget TLS+H2 handshake to the model's host so it overlaps
1015
+ // with the rest of session setup (extension/skill load, tool registry,
1016
+ // system prompt build). Without this, the first `fetch(...)` pays the
1017
+ // full handshake serially — 100–300 ms transcontinental for
1018
+ // api.anthropic.com from a residential IP. Every mode benefits
1019
+ // (interactive, print, rpc, acp).
1020
+ preconnectModelHost(model.baseUrl);
1021
+ }
1022
+
1023
+ let skills: Skill[];
1024
+ let skillWarnings: SkillWarning[];
1025
+ if (options.skills !== undefined) {
1026
+ // Explicit SDK skill lists are a caller override for ordinary discovery,
1027
+ // but the jwc runtime still owns bundled workflow/tool-help skills and
1028
+ // the cli-jaw dev-skill surface. Keep those visible for API sessions
1029
+ // that pass a prefiltered skill list.
1030
+ let explicitSkills = options.skills;
1031
+ if (settings.get("skills.enabled")) {
1032
+ const cliJawSkillsResult = await logger.time("loadCliJawSkillsForExplicitList", loadSkills, {
1033
+ ...settings.getGroup("skills"),
1034
+ cwd,
1035
+ enablePiProject: false,
1036
+ customDirectories: [],
1037
+ disabledExtensions: settings.get("disabledExtensions"),
1038
+ });
1039
+ explicitSkills = mergeMissingSkills(
1040
+ explicitSkills,
1041
+ cliJawSkillsResult.skills.filter(skill => skill.source === "cli-jaw:user"),
1042
+ );
1043
+ }
1044
+ skills = withEmbeddedDefaultJwcSkills(explicitSkills);
1045
+ skillWarnings = [];
1046
+ } else if (settings.get("skills.enabled")) {
1047
+ const skillsResult = await logger.time("loadSkills", loadSkills, {
1048
+ ...settings.getGroup("skills"),
1049
+ cwd,
1050
+ disabledExtensions: settings.get("disabledExtensions"),
1051
+ });
1052
+ skills = withEmbeddedDefaultJwcSkills(skillsResult.skills);
1053
+ skillWarnings = skillsResult.warnings;
1054
+ } else {
1055
+ // Bundled JWC workflow and tool-help skills are built into the binary so
1056
+ // the default workflow surface survives accidental .jwc deletion. Arbitrary
1057
+ // filesystem skill discovery remains gated by skills.enabled above.
1058
+ skills = getEmbeddedDefaultJwcSkills();
1059
+ skillWarnings = [];
1060
+ }
1061
+
1062
+ // Discover rules and bucket them in one pass to avoid repeated scans over large rule sets.
1063
+ const { ttsrManager, rulebookRules, alwaysApplyRules } = await logger.time("discoverTtsrRules", async () => {
1064
+ const ttsrSettings = settings.getGroup("ttsr");
1065
+ const ttsrManager = new TtsrManager(ttsrSettings);
1066
+ const rulesResult =
1067
+ options.rules !== undefined
1068
+ ? { items: options.rules, warnings: undefined }
1069
+ : await loadCapability<Rule>(ruleCapability.id, { cwd });
1070
+ const rulebookRules: Rule[] = [];
1071
+ const alwaysApplyRules: Rule[] = [];
1072
+ for (const rule of rulesResult.items) {
1073
+ const isTtsrRule = rule.condition && rule.condition.length > 0 ? ttsrManager.addRule(rule) : false;
1074
+ if (isTtsrRule) {
1075
+ continue;
1076
+ }
1077
+ if (rule.alwaysApply === true) {
1078
+ alwaysApplyRules.push(rule);
1079
+ continue;
1080
+ }
1081
+ if (rule.description) {
1082
+ rulebookRules.push(rule);
1083
+ }
1084
+ }
1085
+ if (existingSession.injectedTtsrRules.length > 0) {
1086
+ ttsrManager.restoreInjected(existingSession.injectedTtsrRules);
1087
+ }
1088
+ return { ttsrManager, rulebookRules, alwaysApplyRules };
1089
+ });
1090
+
1091
+ // Resolve contextFiles up-front (it's needed before tool creation). The
1092
+ // workspace tree scan is slow on large repos and we MUST NOT block startup on
1093
+ // it. On timeout we forward `undefined` to ToolSession; buildSystemPromptInternal
1094
+ // will re-race the same promise through its own withDeadline path. Background
1095
+ // work continues so caches still warm.
1096
+ const raceWithDeadline = async <T>(name: string, work: Promise<T>): Promise<T | undefined> => {
1097
+ let timedOut = false;
1098
+ const result = await Promise.race([
1099
+ work,
1100
+ Bun.sleep(STARTUP_SCAN_DEADLINE_MS).then(() => {
1101
+ timedOut = true;
1102
+ return undefined;
1103
+ }),
1104
+ ]);
1105
+ if (timedOut) {
1106
+ logger.warn("Startup scan exceeded deadline; deferring to system prompt fallback", {
1107
+ name,
1108
+ timeoutMs: STARTUP_SCAN_DEADLINE_MS,
1109
+ cwd,
1110
+ });
1111
+ }
1112
+ return result;
1113
+ };
1114
+ const [contextFiles, resolvedWorkspaceTree] = await Promise.all([
1115
+ contextFilesPromise,
1116
+ raceWithDeadline("buildWorkspaceTree", workspaceTreePromise),
1117
+ ]);
1118
+
1119
+ let agent: Agent;
1120
+ let session!: AgentSession;
1121
+ let notificationServer: NotificationLoopbackServer | null = null;
1122
+ let hasSession = false;
1123
+ let hasRegistered = false;
1124
+ const enableLsp = options.enableLsp ?? settings.get("lsp.enabled");
1125
+ const backgroundJobsEnabled = isBackgroundJobSupportEnabled(settings);
1126
+ const asyncMaxJobs = Math.min(100, Math.max(1, settings.get("async.maxJobs") ?? 100));
1127
+ const ASYNC_INLINE_RESULT_MAX_CHARS = 12_000;
1128
+ const ASYNC_PREVIEW_MAX_CHARS = 4_000;
1129
+ const formatAsyncResultForFollowUp = async (result: string): Promise<string> => {
1130
+ if (result.length <= ASYNC_INLINE_RESULT_MAX_CHARS) {
1131
+ return result;
1132
+ }
1133
+
1134
+ const preview = `${result.slice(0, ASYNC_PREVIEW_MAX_CHARS)}\n\n[Output truncated. Showing first ${ASYNC_PREVIEW_MAX_CHARS.toLocaleString()} characters.]`;
1135
+ try {
1136
+ const { path: artifactPath, id: artifactId } = await sessionManager.allocateArtifactPath("async");
1137
+ if (artifactPath && artifactId) {
1138
+ await Bun.write(artifactPath, result);
1139
+ return `${preview}\nFull output: artifact://${artifactId}`;
1140
+ }
1141
+ } catch (error) {
1142
+ logger.warn("Failed to persist async follow-up artifact", {
1143
+ error: error instanceof Error ? error.message : String(error),
1144
+ });
1145
+ }
1146
+
1147
+ return preview;
1148
+ };
1149
+ // Only top-level sessions own an AsyncJobManager. Subagents reach the
1150
+ // parent's manager via `AsyncJobManager.instance()` (set below), so creating
1151
+ // a second instance here just to leave it orphaned wastes a constructor and
1152
+ // risks accidental disposal of the parent's manager on subagent teardown.
1153
+ const asyncJobManager =
1154
+ backgroundJobsEnabled && !options.parentTaskPrefix
1155
+ ? new AsyncJobManager({
1156
+ maxRunningJobs: asyncMaxJobs,
1157
+ onJobComplete: async (jobId, result, job) => {
1158
+ if (!session || asyncJobManager!.isDeliverySuppressed(jobId)) return;
1159
+ const formattedResult = await formatAsyncResultForFollowUp(result);
1160
+ if (asyncJobManager!.isDeliverySuppressed(jobId)) return;
1161
+
1162
+ const durationMs = job ? Math.max(0, Date.now() - job.startTime) : undefined;
1163
+ session.yieldQueue.enqueue<AsyncResultEntry>("async-result", {
1164
+ jobId,
1165
+ result: formattedResult,
1166
+ job,
1167
+ durationMs,
1168
+ });
1169
+ },
1170
+ })
1171
+ : undefined;
1172
+
1173
+ const agentRegistry = options.agentRegistry ?? AgentRegistry.global();
1174
+ const resolvedAgentId = options.agentId ?? options.parentTaskPrefix ?? MAIN_AGENT_ID;
1175
+ const resolvedAgentDisplayName =
1176
+ options.agentDisplayName ?? ((options.taskDepth ?? 0) > 0 || options.parentTaskPrefix ? "sub" : "main");
1177
+ const evalKernelOwnerId = `agent-session:${Snowflake.next()}`;
1178
+
1179
+ try {
1180
+ const getActiveModelString = (): string | undefined => {
1181
+ const activeModel = agent?.state.model;
1182
+ if (activeModel) return formatModelString(activeModel);
1183
+ if (model) return formatModelString(model);
1184
+ return undefined;
1185
+ };
1186
+ const toolCleanups = new Map<string, () => Promise<void> | void>();
1187
+ const toolSession: ToolSession = {
1188
+ get cwd() {
1189
+ return sessionManager.getCwd();
1190
+ },
1191
+ hasUI: options.hasUI ?? false,
1192
+ enableLsp,
1193
+ get hasEditTool() {
1194
+ const requestedToolNames = options.toolNames
1195
+ ? [...new Set(options.toolNames.map(name => name.toLowerCase()))]
1196
+ : undefined;
1197
+ return !requestedToolNames || requestedToolNames.includes("edit");
1198
+ },
1199
+ skipPythonPreflight: options.skipPythonPreflight,
1200
+ contextFiles,
1201
+ workspaceTree: resolvedWorkspaceTree,
1202
+ skills,
1203
+ eventBus,
1204
+ outputSchema: options.outputSchema,
1205
+ requireYieldTool: options.requireYieldTool,
1206
+ taskDepth: options.taskDepth ?? 0,
1207
+ currentAgentType: options.currentAgentType,
1208
+ getSessionFile: () => sessionManager.getSessionFile() ?? null,
1209
+ getEvalKernelOwnerId: () => evalKernelOwnerId,
1210
+ assertEvalExecutionAllowed: () => session?.assertEvalExecutionAllowed(),
1211
+ trackEvalExecution: (execution, abortController) =>
1212
+ session ? session.trackEvalExecution(execution, abortController) : execution,
1213
+ registerSessionCleanup: (name, cleanup) => {
1214
+ toolCleanups.set(name, cleanup);
1215
+ },
1216
+ getSessionId: () => sessionManager.getSessionId?.() ?? null,
1217
+ getActiveSkillState: () => session?.getActiveSkillState(),
1218
+ getActiveSkillPhase: () => session?.getActiveSkillPhase(),
1219
+ getHindsightSessionState: () => session?.getHindsightSessionState(),
1220
+ get model() {
1221
+ return agent?.state.model ?? model;
1222
+ },
1223
+ getAgentId: () => resolvedAgentId,
1224
+ bashAllowedPrefixes: options.bashAllowedPrefixes,
1225
+ getToolByName: name => session?.getToolByName(name),
1226
+ agentRegistry,
1227
+ getSessionSpawns: () => options.spawns ?? "*",
1228
+ getModelString: () => (hasExplicitModel && model ? formatModelString(model) : undefined),
1229
+ getActiveModelString,
1230
+ getPlanModeState: () => session?.getPlanModeState(),
1231
+ getGoalModeState: () => session?.getGoalModeState(),
1232
+ getWorkflowGateEmitter: () => session?.getWorkflowGateEmitter(),
1233
+ getNotificationServer: () => notificationServer ?? undefined,
1234
+ getGoalRuntime: () => session?.goalRuntime,
1235
+ getClientBridge: () => session?.clientBridge,
1236
+ getCompactContext: () => session.formatCompactContext(),
1237
+ getTodoPhases: () => session.getTodoPhases(),
1238
+ setTodoPhases: phases => session.setTodoPhases(phases),
1239
+ isMCPDiscoveryEnabled: () => session.isMCPDiscoveryEnabled(),
1240
+ getDiscoverableMCPTools: () => session.getDiscoverableMCPTools(),
1241
+ getDiscoverableMCPSearchIndex: () => session.getDiscoverableMCPSearchIndex(),
1242
+ getSelectedMCPToolNames: () => session.getSelectedMCPToolNames(),
1243
+ activateDiscoveredMCPTools: toolNames => session.activateDiscoveredMCPTools(toolNames),
1244
+ // Generic tool discovery (unified — covers built-in + MCP + extension)
1245
+ isToolDiscoveryEnabled: () => session.isToolDiscoveryEnabled(),
1246
+ getDiscoverableTools: filter => session.getDiscoverableTools(filter),
1247
+ getDiscoverableToolSearchIndex: () => session.getDiscoverableToolSearchIndex(),
1248
+ getSelectedDiscoveredToolNames: () => session.getSelectedDiscoveredToolNames(),
1249
+ activateDiscoveredTools: toolNames => session.activateDiscoveredTools(toolNames),
1250
+ getCheckpointState: () => session.getCheckpointState(),
1251
+ setCheckpointState: state => session.setCheckpointState(state ?? undefined),
1252
+ getToolChoiceQueue: () => session.toolChoiceQueue,
1253
+ buildToolChoice: name => {
1254
+ const m = session.model;
1255
+ return m ? buildNamedToolChoice(name, m) : undefined;
1256
+ },
1257
+ steer: msg =>
1258
+ session.agent.steer({
1259
+ role: "custom",
1260
+ customType: msg.customType,
1261
+ content: msg.content,
1262
+ display: false,
1263
+ details: msg.details,
1264
+ attribution: "agent",
1265
+ timestamp: Date.now(),
1266
+ }),
1267
+ sendCustomMessage: (msg, opts) => session.sendCustomMessage(msg, opts),
1268
+ purgeQueuedCustomMessages: predicate => session.purgeQueuedCustomMessages(predicate),
1269
+ peekQueueInvoker: () => session.peekQueueInvoker(),
1270
+ peekStandingResolveHandler: () => session.peekStandingResolveHandler(),
1271
+ setStandingResolveHandler: handler => session.setStandingResolveHandler(handler),
1272
+ allocateOutputArtifact: async toolType => {
1273
+ try {
1274
+ return await sessionManager.allocateArtifactPath(toolType);
1275
+ } catch {
1276
+ return {};
1277
+ }
1278
+ },
1279
+ getArtifactManager: () => sessionManager.getArtifactManager(),
1280
+ settings,
1281
+ authStorage,
1282
+ modelRegistry,
1283
+ getTelemetry: () => agent?.telemetry,
1284
+ buildForkContextSeed: forkOptions => session.buildForkContextSeed(forkOptions),
1285
+ };
1286
+
1287
+ // Wire process-wide internal URL singletons owned by their real classes.
1288
+ // Top-level sessions install the active snapshots; subagents inherit them.
1289
+ // Artifact and agent-output URLs resolve via `AgentRegistry.global()` —
1290
+ // the protocol handlers walk each ref's `sessionManager.getArtifactsDir()`,
1291
+ // which collapses to the parent's dir for subagents (they adopt the
1292
+ // parent's ArtifactManager) so one lookup hits everything.
1293
+ const getArtifactsDir = () => sessionManager.getArtifactsDir();
1294
+ if (!options.parentTaskPrefix) {
1295
+ setActiveSkills(skills);
1296
+ setActiveRules([...rulebookRules, ...alwaysApplyRules]);
1297
+ if (asyncJobManager) AsyncJobManager.setInstance(asyncJobManager);
1298
+ }
1299
+ if (options.localProtocolOptions) {
1300
+ LocalProtocolHandler.setOverride(options.localProtocolOptions);
1301
+ }
1302
+ toolSession.getArtifactsDir = getArtifactsDir;
1303
+ toolSession.agentOutputManager = new AgentOutputManager(
1304
+ getArtifactsDir,
1305
+ options.parentTaskPrefix ? { parentPrefix: options.parentTaskPrefix } : undefined,
1306
+ );
1307
+
1308
+ // Create built-in tools (already wrapped with meta notice formatting)
1309
+ const builtinTools = await logger.time("createAllTools", createTools, toolSession, options.toolNames);
1310
+
1311
+ // MCP runtime discovery is quarantined for the GJC surface. Keep an
1312
+ // explicitly supplied manager only for legacy in-process callers that own
1313
+ // lifecycle themselves; never discover project/user MCP configs here.
1314
+ const mcpManager: MCPManager | undefined = options.mcpManager;
1315
+ const customTools: CustomTool[] = [];
1316
+ // Only top-level sessions own the global MCPManager. Subagents already
1317
+ // receive the parent's manager via `options.mcpManager`, and reassigning
1318
+ // the singleton to the same value is a no-op \u2014 keep the gate explicit
1319
+ // to mirror the AsyncJobManager ownership rule.
1320
+ if (mcpManager && !options.parentTaskPrefix) MCPManager.setInstance(mcpManager);
1321
+
1322
+ // Add image tools when the active model or configured image providers can generate images.
1323
+ const imageGenTools = await logger.time("getImageGenTools", () => getImageGenTools(modelRegistry, model));
1324
+ if (imageGenTools.length > 0) {
1325
+ customTools.push(...(imageGenTools as unknown as CustomTool[]));
1326
+ }
1327
+
1328
+ // Add web search tools
1329
+ if (options.toolNames?.includes("web_search")) {
1330
+ customTools.push(...getSearchTools());
1331
+ }
1332
+
1333
+ const getReservedSubskillToolNames = () => [
1334
+ ...new Set([
1335
+ ...builtinTools.map(tool => tool.name),
1336
+ ...(options.toolNames?.map(name => name.toLowerCase()) ?? []),
1337
+ ...(options.customTools?.map(tool => (isCustomTool(tool) ? tool.name : tool.name)) ?? []),
1338
+ ...customTools.map(tool => tool.name),
1339
+ ]),
1340
+ ];
1341
+
1342
+ const gjcSubskillToolContext = options.gjcSubskillToolContext;
1343
+ if (gjcSubskillToolContext?.parent.trim() && gjcSubskillToolContext.phase.trim()) {
1344
+ const pluginTools = await loadActiveSubskillTools({
1345
+ cwd: gjcSubskillToolContext.cwd ?? cwd,
1346
+ sessionId: gjcSubskillToolContext.sessionId ?? logicalSessionId,
1347
+ parent: gjcSubskillToolContext.parent,
1348
+ phase: gjcSubskillToolContext.phase,
1349
+ reservedToolNames: getReservedSubskillToolNames(),
1350
+ });
1351
+ if (pluginTools.length > 0) {
1352
+ customTools.push(...pluginTools);
1353
+ }
1354
+ } else {
1355
+ for (const skill of skills) {
1356
+ const phase = await resolveCurrentPhaseForParent({
1357
+ cwd,
1358
+ sessionId: logicalSessionId,
1359
+ parent: skill.name,
1360
+ });
1361
+ const pluginTools = await loadActiveSubskillTools({
1362
+ cwd,
1363
+ sessionId: logicalSessionId,
1364
+ parent: skill.name,
1365
+ phase,
1366
+ reservedToolNames: getReservedSubskillToolNames(),
1367
+ });
1368
+ if (pluginTools.length > 0) {
1369
+ customTools.push(...pluginTools);
1370
+ }
1371
+ }
1372
+ }
1373
+
1374
+ // Custom tool and extension discovery is quarantined from the public GJC utility surface.
1375
+ // Explicit SDK extension factories are still honored; callers use them to
1376
+ // register in-process tools/providers without enabling filesystem discovery.
1377
+ const inlineExtensions: ExtensionFactory[] = [...(options.extensions ?? [])];
1378
+ if (customTools.length > 0) {
1379
+ inlineExtensions.push(createCustomToolsExtension(customTools));
1380
+ }
1381
+
1382
+ // Extension/module discovery is quarantined; retain only the private
1383
+ // runtime needed for explicitly supplied SDK extensions and custom tools.
1384
+ const extensionsResult: LoadExtensionsResult = options.preloadedExtensions ?? {
1385
+ extensions: [],
1386
+ errors: [],
1387
+ runtime: new ExtensionRuntime(),
1388
+ };
1389
+
1390
+ // Load inline extensions from factories
1391
+ if (inlineExtensions.length > 0) {
1392
+ for (let i = 0; i < inlineExtensions.length; i++) {
1393
+ const factory = inlineExtensions[i];
1394
+ const loaded = await loadExtensionFromFactory(
1395
+ factory,
1396
+ cwd,
1397
+ eventBus,
1398
+ extensionsResult.runtime,
1399
+ `<inline-${i}>`,
1400
+ );
1401
+ extensionsResult.extensions.push(loaded);
1402
+ }
1403
+ }
1404
+
1405
+ // Process provider registrations queued during extension loading.
1406
+ // This must happen before the runner is created so that models registered by
1407
+ // extensions are available for model selection on session resume / fallback.
1408
+ const activeExtensionSources = extensionsResult.extensions.map(extension => extension.path);
1409
+ modelRegistry.syncExtensionSources(activeExtensionSources);
1410
+ for (const sourceId of new Set(activeExtensionSources)) {
1411
+ modelRegistry.clearSourceRegistrations(sourceId);
1412
+ }
1413
+ if (extensionsResult.runtime.pendingProviderRegistrations.length > 0) {
1414
+ for (const { name, config, sourceId } of extensionsResult.runtime.pendingProviderRegistrations) {
1415
+ modelRegistry.registerProvider(name, config, sourceId);
1416
+ }
1417
+ extensionsResult.runtime.pendingProviderRegistrations = [];
1418
+ }
1419
+
1420
+ // Resolve deferred --model pattern now that extension models are registered.
1421
+ if (!model && options.modelPattern) {
1422
+ const availableModels = modelRegistry.getAll();
1423
+ const matchPreferences = {
1424
+ usageOrder: settings.getStorage()?.getModelUsageOrder(),
1425
+ };
1426
+ const { model: resolved } = parseModelPattern(options.modelPattern, availableModels, matchPreferences, {
1427
+ modelRegistry,
1428
+ });
1429
+ if (resolved) {
1430
+ model = resolved;
1431
+ modelFallbackMessage = undefined;
1432
+ } else {
1433
+ modelFallbackMessage = `Model "${options.modelPattern}" not found`;
1434
+ }
1435
+ }
1436
+
1437
+ // Fall back to first available model with a valid API key, honoring the
1438
+ // path-scoped `enabledModels` allow-list when configured. Skip when the
1439
+ // user explicitly requested a model via --model that wasn't found.
1440
+ if (!model && !options.modelPattern) {
1441
+ // Re-resolve the allowed set: extension factories above may have
1442
+ // registered providers/models that weren't visible at startup.
1443
+ const fallbackCandidates = await resolveAllowedModels(modelRegistry, settings, modelMatchPreferences);
1444
+ for (const candidate of fallbackCandidates) {
1445
+ if (await hasModelApiKey(candidate)) {
1446
+ model = candidate;
1447
+ break;
1448
+ }
1449
+ }
1450
+ if (model) {
1451
+ if (modelFallbackMessage) {
1452
+ modelFallbackMessage += `. Using ${model.provider}/${model.id}`;
1453
+ }
1454
+ } else {
1455
+ const patterns = settings.get("enabledModels");
1456
+ modelFallbackMessage =
1457
+ patterns && patterns.length > 0
1458
+ ? `No model available matching enabledModels (${patterns.join(", ")}) with usable credentials. ${formatNoModelsAvailableFallback()}`
1459
+ : formatNoModelsAvailableFallback();
1460
+ }
1461
+ }
1462
+
1463
+ const customCommandsResult: CustomCommandsLoadResult = { commands: [], errors: [] };
1464
+
1465
+ let extensionRunner: ExtensionRunner | undefined;
1466
+ if (extensionsResult.extensions.length > 0) {
1467
+ extensionRunner = new ExtensionRunner(
1468
+ extensionsResult.extensions,
1469
+ extensionsResult.runtime,
1470
+ cwd,
1471
+ sessionManager,
1472
+ modelRegistry,
1473
+ );
1474
+ }
1475
+
1476
+ if (extensionRunner) {
1477
+ credentialDisabledTarget = extensionRunner;
1478
+ for (const event of startupCredentialDisabledEvents.splice(0)) {
1479
+ // Discard return: any handler error is routed through runner.onError listeners.
1480
+ void extensionRunner.emitCredentialDisabled(event);
1481
+ }
1482
+ } else {
1483
+ // No runner to forward to; release our subscription. The embedder's own
1484
+ // onCredentialDisabled (if any) keeps firing through its own subscription.
1485
+ startupCredentialDisabledEvents.length = 0;
1486
+ unsubscribeCredentialDisabled?.();
1487
+ unsubscribeCredentialDisabled = undefined;
1488
+ }
1489
+
1490
+ const getSessionContext = () => ({
1491
+ sessionManager,
1492
+ modelRegistry,
1493
+ model: agent.state.model,
1494
+ isIdle: () => !session.isStreaming,
1495
+ hasQueuedMessages: () => session.queuedMessageCount > 0,
1496
+ abort: () => {
1497
+ session.abort();
1498
+ },
1499
+ settings,
1500
+ });
1501
+ const toolContextStore = new ToolContextStore(getSessionContext);
1502
+
1503
+ const registeredTools = extensionRunner?.getAllRegisteredTools() ?? [];
1504
+ let wrappedExtensionTools: Tool[];
1505
+
1506
+ if (extensionRunner) {
1507
+ // With extension runner: convert CustomTools to ToolDefinitions and wrap all together
1508
+ const allCustomTools = [
1509
+ ...registeredTools,
1510
+ ...(options.customTools?.map(tool => {
1511
+ const definition = isCustomTool(tool) ? customToolToDefinition(tool) : tool;
1512
+ return { definition, extensionPath: "<sdk>" };
1513
+ }) ?? []),
1514
+ ];
1515
+ wrappedExtensionTools = wrapRegisteredTools(allCustomTools, extensionRunner);
1516
+ } else {
1517
+ // Without extension runner: wrap CustomTools directly with CustomToolAdapter
1518
+ // ToolDefinition items require ExtensionContext and cannot be used without a runner
1519
+ const customToolContext = (): CustomToolContext => ({
1520
+ sessionManager,
1521
+ modelRegistry,
1522
+ model: agent?.state.model,
1523
+ isIdle: () => !session?.isStreaming,
1524
+ hasQueuedMessages: () => (session?.queuedMessageCount ?? 0) > 0,
1525
+ abort: () => session?.abort(),
1526
+ settings,
1527
+ });
1528
+ wrappedExtensionTools = (options.customTools ?? [])
1529
+ .filter(isCustomTool)
1530
+ .map(tool => CustomToolAdapter.wrap(tool, customToolContext));
1531
+ }
1532
+
1533
+ // All built-in tools are active (conditional tools like git/ask return null from factory if disabled)
1534
+ const toolRegistry = new Map<string, Tool>();
1535
+ for (const tool of builtinTools) {
1536
+ toolRegistry.set(tool.name, tool);
1537
+ }
1538
+ const goalStateToolNames = ["goal"] as const;
1539
+ if (settings.get("goal.enabled")) {
1540
+ for (const name of goalStateToolNames) {
1541
+ if (toolRegistry.has(name)) continue;
1542
+ const goalStateTool = await logger.time(`createTools:${name}:session`, BUILTIN_TOOLS[name], toolSession);
1543
+ if (goalStateTool) {
1544
+ toolRegistry.set(goalStateTool.name, wrapToolWithMetaNotice(goalStateTool));
1545
+ }
1546
+ }
1547
+ }
1548
+ for (const tool of wrappedExtensionTools) {
1549
+ toolRegistry.set(tool.name, tool);
1550
+ }
1551
+ if (extensionRunner) {
1552
+ for (const tool of toolRegistry.values()) {
1553
+ toolRegistry.set(tool.name, new ExtensionToolWrapper(tool, extensionRunner));
1554
+ }
1555
+ }
1556
+ if (model?.provider === "cursor") {
1557
+ toolRegistry.delete("edit");
1558
+ }
1559
+
1560
+ const hasDeferrableTools = Array.from(toolRegistry.values()).some(tool => tool.deferrable === true);
1561
+ if (!hasDeferrableTools) {
1562
+ toolRegistry.delete("resolve");
1563
+ } else if (!toolRegistry.has("resolve")) {
1564
+ const resolveTool = await logger.time("createTools:resolve:session", HIDDEN_TOOLS.resolve, toolSession);
1565
+ if (resolveTool) {
1566
+ toolRegistry.set(resolveTool.name, wrapToolWithMetaNotice(resolveTool));
1567
+ }
1568
+ }
1569
+
1570
+ const reloadSshTool = async (): Promise<AgentTool | null> => {
1571
+ if (!requestedToolNameSet.has("ssh")) return null;
1572
+ const sshTool = (await loadSshTool({
1573
+ ...toolSession,
1574
+ cwd: sessionManager.getCwd(),
1575
+ })) as unknown as AgentTool | null;
1576
+ if (!sshTool) return null;
1577
+ const wrapped = wrapToolWithMetaNotice(sshTool);
1578
+ return (extensionRunner ? new ExtensionToolWrapper(wrapped, extensionRunner) : wrapped) as AgentTool;
1579
+ };
1580
+
1581
+ let cursorEventEmitter: ((event: AgentEvent) => void) | undefined;
1582
+ const cursorExecHandlers = new CursorExecHandlers({
1583
+ cwd,
1584
+ tools: toolRegistry,
1585
+ getToolContext: () => toolContextStore.getContext(),
1586
+ emitEvent: event => cursorEventEmitter?.(event),
1587
+ createEventEmitter: () => agent.createExternalEventEmitterForCurrentRun(),
1588
+ });
1589
+
1590
+ const repeatToolDescriptions = settings.get("repeatToolDescriptions");
1591
+ const eagerTasks = settings.get("task.eager");
1592
+ const intentField = settings.get("tools.intentTracing") || $flag("PI_INTENT_TRACING") ? INTENT_FIELD : undefined;
1593
+ const rebuildSystemPrompt = async (
1594
+ toolNames: string[],
1595
+ tools: Map<string, AgentTool>,
1596
+ ): Promise<BuildSystemPromptResult> => {
1597
+ toolContextStore.setToolNames(toolNames);
1598
+ const activeToolNames = new Set(toolNames);
1599
+ const discoverableBuiltinTools: DiscoverableTool[] =
1600
+ effectiveDiscoveryMode === "all"
1601
+ ? collectDiscoverableTools(
1602
+ Array.from(tools.values()).filter(
1603
+ tool => tool.loadMode === "discoverable" && !activeToolNames.has(tool.name),
1604
+ ),
1605
+ { source: "builtin" },
1606
+ )
1607
+ : [];
1608
+ const discoverableToolsForDesc: DiscoverableTool[] = [...discoverableBuiltinTools];
1609
+ const promptTools = buildSystemPromptToolMetadata(tools, {
1610
+ search_tool_bm25: { description: renderSearchToolBm25Description(discoverableToolsForDesc) },
1611
+ });
1612
+ const memoryInstructions = await resolveMemoryBackend(settings).buildDeveloperInstructions(
1613
+ agentDir,
1614
+ settings,
1615
+ session,
1616
+ );
1617
+
1618
+ // Build combined append prompt: memory instructions + MCP server instructions
1619
+ const serverInstructions = mcpManager?.getServerInstructions();
1620
+ let appendPrompt: string | undefined = memoryInstructions ?? undefined;
1621
+ if (serverInstructions && serverInstructions.size > 0) {
1622
+ const parts: string[] = [];
1623
+ if (appendPrompt) parts.push(appendPrompt);
1624
+ parts.push(
1625
+ "## MCP Server Instructions\n\nThe following instructions are provided by connected MCP servers. They are server-controlled and may not be verified.",
1626
+ );
1627
+ for (const [srvName, srvInstructions] of serverInstructions) {
1628
+ const truncated =
1629
+ srvInstructions.length > MAX_MCP_INSTRUCTIONS_LENGTH
1630
+ ? `${srvInstructions.slice(0, MAX_MCP_INSTRUCTIONS_LENGTH)}\n[truncated]`
1631
+ : srvInstructions;
1632
+ parts.push(`### ${srvName}\n${truncated}`);
1633
+ }
1634
+ appendPrompt = parts.join("\n\n");
1635
+ }
1636
+ const defaultPrompt = await buildSystemPromptInternal({
1637
+ cwd,
1638
+ skills,
1639
+ contextFiles,
1640
+ tools: promptTools,
1641
+ toolNames,
1642
+ rules: rulebookRules,
1643
+ alwaysApplyRules,
1644
+ skillsSettings: settings.getGroup("skills"),
1645
+ appendSystemPrompt: appendPrompt,
1646
+ repeatToolDescriptions,
1647
+ intentField,
1648
+ mcpDiscoveryMode: false,
1649
+ mcpDiscoveryServerSummaries: [],
1650
+ eagerTasks,
1651
+ secretsEnabled,
1652
+ workspaceTree: workspaceTreePromise,
1653
+ });
1654
+
1655
+ if (options.systemPrompt === undefined) {
1656
+ return defaultPrompt;
1657
+ }
1658
+ if (Array.isArray(options.systemPrompt)) {
1659
+ return { systemPrompt: options.systemPrompt };
1660
+ }
1661
+ return {
1662
+ systemPrompt: options.systemPrompt(defaultPrompt.systemPrompt),
1663
+ };
1664
+ };
1665
+
1666
+ const toolNamesFromRegistry = Array.from(toolRegistry.keys());
1667
+ const requestedToolNames =
1668
+ (options.toolNames ? [...new Set(options.toolNames.map(name => name.toLowerCase()))] : undefined) ??
1669
+ toolNamesFromRegistry;
1670
+ const normalizedRequested = requestedToolNames.filter(name => toolRegistry.has(name));
1671
+ const requestedToolNameSet = new Set(normalizedRequested);
1672
+ const toolsDiscoveryModeSetting = settings.get("tools.discoveryMode");
1673
+ const effectiveDiscoveryMode: "off" | "mcp-only" | "all" =
1674
+ toolsDiscoveryModeSetting === "all" ? "all" : settings.get("mcp.discoveryMode") ? "mcp-only" : "off";
1675
+ const mcpDiscoveryEnabled = effectiveDiscoveryMode !== "off";
1676
+ const defaultInactiveToolNames = new Set(
1677
+ registeredTools.filter(tool => tool.definition.defaultInactive).map(tool => tool.definition.name),
1678
+ );
1679
+ const requestedActiveToolNames = normalizedRequested.filter(name => name !== "goal");
1680
+ const initialRequestedActiveToolNames = options.toolNames
1681
+ ? requestedActiveToolNames
1682
+ : requestedActiveToolNames.filter(name => !defaultInactiveToolNames.has(name));
1683
+ const discoverableMCPToolNames = new Set<string>();
1684
+ const explicitlyRequestedMCPToolNames: string[] = [];
1685
+ const discoveryDefaultServerToolNames: string[] = [];
1686
+ for (const tool of toolRegistry.values()) {
1687
+ if (!isMCPBridgeTool(tool)) continue;
1688
+ const serverName = (tool as unknown as { mcpServerName?: string }).mcpServerName;
1689
+ discoverableMCPToolNames.add(tool.name);
1690
+ if (requestedToolNameSet.has(tool.name)) {
1691
+ explicitlyRequestedMCPToolNames.push(tool.name);
1692
+ }
1693
+ if (typeof serverName === "string" && settings.get("mcp.discoveryDefaultServers").includes(serverName)) {
1694
+ discoveryDefaultServerToolNames.push(tool.name);
1695
+ }
1696
+ }
1697
+ let initialSelectedMCPToolNames: string[] = [];
1698
+ let defaultSelectedMCPToolNames: string[] = [];
1699
+ let initialToolNames = [...initialRequestedActiveToolNames];
1700
+ if (mcpDiscoveryEnabled) {
1701
+ const restoredSelectedMCPToolNames = existingSession.selectedMCPToolNames.filter(name =>
1702
+ toolRegistry.has(name),
1703
+ );
1704
+ defaultSelectedMCPToolNames =
1705
+ effectiveDiscoveryMode === "mcp-only"
1706
+ ? [...discoverableMCPToolNames]
1707
+ : [...new Set([...discoveryDefaultServerToolNames, ...explicitlyRequestedMCPToolNames])];
1708
+ const shouldUsePersistedMCPSelection =
1709
+ existingSession.hasPersistedMCPToolSelection && explicitlyRequestedMCPToolNames.length === 0;
1710
+ initialSelectedMCPToolNames = shouldUsePersistedMCPSelection
1711
+ ? restoredSelectedMCPToolNames
1712
+ : [...new Set([...restoredSelectedMCPToolNames, ...defaultSelectedMCPToolNames])];
1713
+ initialToolNames = [
1714
+ ...new Set([
1715
+ ...initialRequestedActiveToolNames.filter(name => !discoverableMCPToolNames.has(name)),
1716
+ ...initialSelectedMCPToolNames,
1717
+ ]),
1718
+ ];
1719
+ }
1720
+
1721
+ // Custom tools and extension-registered tools are always included regardless of toolNames filter
1722
+ const alwaysInclude: string[] = [
1723
+ ...(options.customTools?.map(t => (isCustomTool(t) ? t.name : t.name)) ?? []),
1724
+ ...registeredTools.filter(t => !t.definition.defaultInactive).map(t => t.definition.name),
1725
+ ];
1726
+ for (const name of alwaysInclude) {
1727
+ if (mcpDiscoveryEnabled && discoverableMCPToolNames.has(name)) {
1728
+ continue;
1729
+ }
1730
+ if (toolRegistry.has(name) && !initialToolNames.includes(name)) {
1731
+ initialToolNames.push(name);
1732
+ }
1733
+ }
1734
+
1735
+ // When tools.discoveryMode === "all", hide non-essential built-in discoverable tools
1736
+ // from the initial set unless they were explicitly requested or restored from persistence.
1737
+ // The model finds them via search_tool_bm25 and activates them on demand.
1738
+ if (effectiveDiscoveryMode === "all") {
1739
+ const essentialBuiltinNames = new Set(computeEssentialBuiltinNames(settings));
1740
+ const explicitlyRequestedToolNames = new Set(options.toolNames?.map(name => name.toLowerCase()) ?? []);
1741
+ // Back-compat: persisted activations live under selectedMCPToolNames today (built-in
1742
+ // activation persistence is a follow-up). MCP names won't collide with built-in names.
1743
+ const restoredDiscoveredNames = new Set(existingSession.selectedMCPToolNames);
1744
+ initialToolNames = initialToolNames.filter(name => {
1745
+ const tool = toolRegistry.get(name);
1746
+ if (!tool?.loadMode) return true; // not a built-in — leave MCP/custom/extension to existing logic
1747
+ if (tool.loadMode === "essential") return true;
1748
+ if (essentialBuiltinNames.has(name)) return true;
1749
+ if (explicitlyRequestedToolNames.has(name)) return true;
1750
+ if (restoredDiscoveredNames.has(name)) return true;
1751
+ return false;
1752
+ });
1753
+ }
1754
+
1755
+ // Pre-register in the global agent registry BEFORE building the system prompt,
1756
+ // so that subagents launched in the same parallel batch can see each other in
1757
+ // their initial `# IRC Peers` block (rendered inside `rebuildSystemPrompt`).
1758
+ // The session reference is attached after construction below.
1759
+ agentRegistry.register({
1760
+ id: resolvedAgentId,
1761
+ displayName: resolvedAgentDisplayName,
1762
+ kind: (options.taskDepth ?? 0) > 0 || options.parentTaskPrefix ? "sub" : "main",
1763
+ parentId: options.parentTaskPrefix,
1764
+ session: null,
1765
+ sessionFile: sessionManager.getSessionFile() ?? null,
1766
+ status: "running",
1767
+ });
1768
+ hasRegistered = true;
1769
+
1770
+ const { systemPrompt } = await logger.time(
1771
+ "buildSystemPrompt",
1772
+ rebuildSystemPrompt,
1773
+ initialToolNames,
1774
+ toolRegistry,
1775
+ );
1776
+
1777
+ const promptTemplates = await promptTemplatesPromise;
1778
+ toolSession.promptTemplates = promptTemplates;
1779
+
1780
+ const slashCommands = await slashCommandsPromise;
1781
+
1782
+ // Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)
1783
+ const convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {
1784
+ const converted = convertToLlm(messages);
1785
+ // Check setting dynamically so mid-session changes take effect
1786
+ if (!settings.get("images.blockImages")) {
1787
+ return converted;
1788
+ }
1789
+ // Filter out ImageContent from all messages, replacing with text placeholder
1790
+ return converted.map(msg => {
1791
+ if (msg.role === "user" || msg.role === "toolResult") {
1792
+ const content = msg.content;
1793
+ if (Array.isArray(content)) {
1794
+ const hasImages = content.some(c => c.type === "image");
1795
+ if (hasImages) {
1796
+ const filteredContent = content
1797
+ .map(c =>
1798
+ c.type === "image" ? { type: "text" as const, text: "Image reading is disabled." } : c,
1799
+ )
1800
+ .filter((c, i, arr) => {
1801
+ // Dedupe consecutive "Image reading is disabled." texts
1802
+ if (!(c.type === "text" && c.text === "Image reading is disabled." && i > 0)) return true;
1803
+ const prev = arr[i - 1];
1804
+ return !(prev.type === "text" && prev.text === "Image reading is disabled.");
1805
+ });
1806
+ return { ...msg, content: filteredContent };
1807
+ }
1808
+ }
1809
+ }
1810
+ return msg;
1811
+ });
1812
+ };
1813
+
1814
+ // Final convertToLlm: chain block-images filter with secret obfuscation
1815
+ const convertToLlmFinal = (messages: AgentMessage[]): Message[] => {
1816
+ const converted = convertToLlmWithBlockImages(messages);
1817
+ if (!obfuscator?.hasSecrets()) return converted;
1818
+ return obfuscateMessages(obfuscator, converted);
1819
+ };
1820
+ const transformContext = extensionRunner
1821
+ ? async (messages: AgentMessage[], _signal?: AbortSignal) => {
1822
+ return await extensionRunner.emitContext(messages);
1823
+ }
1824
+ : undefined;
1825
+ const onPayload = extensionRunner
1826
+ ? async (payload: unknown, _model?: Model) => {
1827
+ return await extensionRunner.emitBeforeProviderRequest(payload);
1828
+ }
1829
+ : undefined;
1830
+ const onResponse: SimpleStreamOptions["onResponse"] | undefined = extensionRunner
1831
+ ? async (response, model) => {
1832
+ await extensionRunner.emitAfterProviderResponse(response, model);
1833
+ }
1834
+ : undefined;
1835
+
1836
+ const setToolUIContext = (uiContext: ExtensionUIContext, hasUI: boolean) => {
1837
+ toolContextStore.setUIContext(uiContext, hasUI);
1838
+ };
1839
+
1840
+ const initialTools = initialToolNames
1841
+ .map(name => toolRegistry.get(name))
1842
+ .filter((tool): tool is AgentTool => tool !== undefined);
1843
+
1844
+ const openaiWebsocketSetting = settings.get("providers.openaiWebsockets") ?? "off";
1845
+ const preferOpenAICodexWebsockets =
1846
+ openaiWebsocketSetting === "on" ? true : openaiWebsocketSetting === "off" ? false : undefined;
1847
+ const serviceTierSetting = settings.get("serviceTier");
1848
+ const retrySettings = settings.getGroup("retry");
1849
+
1850
+ const initialServiceTier = hasServiceTierEntry
1851
+ ? existingSession.serviceTier
1852
+ : serviceTierSetting === "none"
1853
+ ? undefined
1854
+ : serviceTierSetting;
1855
+
1856
+ const appendOnlyContext =
1857
+ model && resolveAppendOnlyMode(settings.get("provider.appendOnlyContext"), model.provider)
1858
+ ? new AppendOnlyContextManager()
1859
+ : undefined;
1860
+ if (appendOnlyContext && options.forkContextSeed && !hasExistingSession) {
1861
+ if (options.forkContextSeed.appendOnlyPrefixSnapshot) {
1862
+ (
1863
+ appendOnlyContext.prefix as typeof appendOnlyContext.prefix & {
1864
+ importSnapshot(
1865
+ snapshot: NonNullable<ForkContextSeed["appendOnlyPrefixSnapshot"]>,
1866
+ options: { intentTracing: boolean },
1867
+ ): void;
1868
+ }
1869
+ ).importSnapshot(options.forkContextSeed.appendOnlyPrefixSnapshot, { intentTracing: !!intentField });
1870
+ }
1871
+ (
1872
+ appendOnlyContext as AppendOnlyContextManager & {
1873
+ seedNormalizedMessages(messages: readonly Message[]): void;
1874
+ }
1875
+ ).seedNormalizedMessages(options.forkContextSeed.messages);
1876
+ }
1877
+
1878
+ agent = new Agent({
1879
+ initialState: {
1880
+ systemPrompt,
1881
+ model,
1882
+ thinkingLevel: toReasoningEffort(thinkingLevel),
1883
+ tools: initialTools,
1884
+ ...(options.forkContextSeed && !hasExistingSession
1885
+ ? { messages: options.forkContextSeed.agentMessages }
1886
+ : {}),
1887
+ },
1888
+ convertToLlm: convertToLlmFinal,
1889
+ onPayload,
1890
+ onResponse,
1891
+ sessionId: logicalSessionId,
1892
+ providerSessionId,
1893
+ transformContext,
1894
+ steeringMode: settings.get("steeringMode") ?? "one-at-a-time",
1895
+ followUpMode: settings.get("followUpMode") ?? "one-at-a-time",
1896
+ interruptMode: settings.get("interruptMode") ?? "immediate",
1897
+ thinkingBudgets: settings.getGroup("thinkingBudgets"),
1898
+ temperature: settings.get("temperature") >= 0 ? settings.get("temperature") : undefined,
1899
+ topP: settings.get("topP") >= 0 ? settings.get("topP") : undefined,
1900
+ topK: settings.get("topK") >= 0 ? settings.get("topK") : undefined,
1901
+ minP: settings.get("minP") >= 0 ? settings.get("minP") : undefined,
1902
+ presencePenalty: settings.get("presencePenalty") >= 0 ? settings.get("presencePenalty") : undefined,
1903
+ repetitionPenalty: settings.get("repetitionPenalty") >= 0 ? settings.get("repetitionPenalty") : undefined,
1904
+ serviceTier: initialServiceTier,
1905
+ hideThinkingSummary: settings.get("hideThinkingBlock"),
1906
+ maxRetryDelayMs: retrySettings.maxDelayMs,
1907
+ requestMaxRetries: retrySettings.requestMaxRetries,
1908
+ streamMaxRetries: retrySettings.streamMaxRetries,
1909
+ kimiApiFormat: settings.get("providers.kimiApiFormat") ?? "anthropic",
1910
+ shouldPause: options.shouldPause,
1911
+ preferWebsockets: preferOpenAICodexWebsockets,
1912
+ getToolContext: tc => toolContextStore.getContext(tc),
1913
+ getApiKey: async provider => {
1914
+ // Read agent.sessionId at call time so credential selection stays aligned
1915
+ // with metadataResolver after /new, fork, resume, or branch switches.
1916
+ const key = await modelRegistry.getApiKeyForProvider(provider, agent.providerSessionId ?? agent.sessionId);
1917
+ if (!key) {
1918
+ throw new Error(`No API key found for provider "${provider}"`);
1919
+ }
1920
+ return key;
1921
+ },
1922
+ getAuthCredentialType: provider =>
1923
+ modelRegistry.getSessionCredentialType(provider, agent.providerSessionId ?? agent.sessionId),
1924
+ streamFn: (streamModel, context, streamOptions) =>
1925
+ streamSimple(streamModel, context, {
1926
+ ...streamOptions,
1927
+ onAuthError: async (provider, oldKey, error) => {
1928
+ await modelRegistry.authStorage.invalidateCredentialMatching(provider, oldKey, {
1929
+ signal: streamOptions?.signal,
1930
+ sessionId: agent.sessionId,
1931
+ });
1932
+ logger.debug("Retrying provider request after credential invalidation", {
1933
+ provider,
1934
+ error: error instanceof Error ? error.message : String(error),
1935
+ });
1936
+ return modelRegistry.getApiKeyForProvider(provider, agent.sessionId);
1937
+ },
1938
+ }),
1939
+ cursorExecHandlers,
1940
+ transformToolCallArguments: (args, _toolName) => {
1941
+ let result = args;
1942
+ const maxTimeout = settings.get("tools.maxTimeout");
1943
+ if (maxTimeout > 0 && typeof result.timeout === "number") {
1944
+ result = { ...result, timeout: Math.min(result.timeout, maxTimeout) };
1945
+ }
1946
+ if (obfuscator?.hasSecrets()) {
1947
+ result = obfuscator.deobfuscateObject(result);
1948
+ }
1949
+ return result;
1950
+ },
1951
+ intentTracing: !!intentField,
1952
+ getToolChoice: () => session?.nextToolChoice(),
1953
+ telemetry: options.telemetry,
1954
+ appendOnlyContext,
1955
+ });
1956
+
1957
+ cursorEventEmitter = event => agent.emitExternalEvent(event);
1958
+
1959
+ // Restore messages if session has existing data
1960
+ if (hasExistingSession) {
1961
+ agent.replaceMessages(existingSession.messages);
1962
+ } else {
1963
+ // Save initial model, thinking level, and service tier for new sessions so they can be restored on resume.
1964
+ if (model) {
1965
+ sessionManager.appendModelChange(`${model.provider}/${model.id}`);
1966
+ }
1967
+ sessionManager.appendThinkingLevelChange(thinkingLevel);
1968
+ if (initialServiceTier) {
1969
+ sessionManager.appendServiceTierChange(initialServiceTier);
1970
+ }
1971
+ }
1972
+
1973
+ // Start the loopback notification server for top-level sessions when enabled.
1974
+ // Failure is isolated inside the helper and never blocks session creation.
1975
+ notificationServer = await maybeStartNotificationServer({
1976
+ settings,
1977
+ sessionId: logicalSessionId,
1978
+ cwd,
1979
+ taskDepth: options.taskDepth,
1980
+ registerCleanup: (name, cleanup) => toolCleanups.set(name, cleanup),
1981
+ });
1982
+
1983
+ session = new AgentSession({
1984
+ agent,
1985
+ thinkingLevel,
1986
+ sessionManager,
1987
+ settings,
1988
+ evalKernelOwnerId,
1989
+ // Defined only for top-level sessions (creation is gated above).
1990
+ // AgentSession uses this to decide whether it may dispose the global
1991
+ // AsyncJobManager on teardown; subagents inherit the parent's and
1992
+ // **MUST NOT** tear it down.
1993
+ ownedAsyncJobManager: asyncJobManager,
1994
+ toolCleanups,
1995
+ scopedModels: options.scopedModels,
1996
+ promptTemplates,
1997
+ slashCommands,
1998
+ extensionRunner,
1999
+ customCommands: customCommandsResult.commands,
2000
+ skills,
2001
+ skillWarnings,
2002
+ skillsSettings: settings.getGroup("skills"),
2003
+ modelRegistry,
2004
+ taskDepth,
2005
+ toolRegistry,
2006
+ workflowGateToolSession: toolSession,
2007
+ transformContext,
2008
+ onPayload,
2009
+ onResponse,
2010
+ convertToLlm: convertToLlmFinal,
2011
+ rebuildSystemPrompt,
2012
+ reloadSshTool,
2013
+ requestedToolNames: requestedToolNameSet,
2014
+ getMcpServerInstructions: mcpManager
2015
+ ? () => {
2016
+ const raw = mcpManager.getServerInstructions();
2017
+ if (!raw || raw.size === 0) return raw;
2018
+ const out = new Map<string, string>();
2019
+ for (const [name, text] of raw) {
2020
+ out.set(
2021
+ name,
2022
+ text.length > MAX_MCP_INSTRUCTIONS_LENGTH ? text.slice(0, MAX_MCP_INSTRUCTIONS_LENGTH) : text,
2023
+ );
2024
+ }
2025
+ return out;
2026
+ }
2027
+ : undefined,
2028
+ mcpDiscoveryEnabled,
2029
+ initialSelectedMCPToolNames,
2030
+ defaultSelectedMCPToolNames,
2031
+ persistInitialMCPToolSelection: !hasExistingSession,
2032
+ defaultSelectedMCPServerNames: [],
2033
+ ttsrManager,
2034
+ obfuscator,
2035
+ agentId: resolvedAgentId,
2036
+ agentRegistry,
2037
+ providerSessionId: options.providerSessionId,
2038
+ providerCacheSessionId: providerSessionId,
2039
+ forkContextSeed: options.forkContextSeed,
2040
+ providerSessionState: options.providerSessionState,
2041
+ });
2042
+ hasSession = true;
2043
+ if (asyncJobManager) {
2044
+ session.yieldQueue.register<AsyncResultEntry>("async-result", {
2045
+ isStale: entry => asyncJobManager.isDeliverySuppressed(entry.jobId),
2046
+ build: buildAsyncResultBatchMessage,
2047
+ });
2048
+ }
2049
+ session.yieldQueue.register<McpNotificationEntry>("mcp-notification", {
2050
+ build: buildMcpNotificationBatchMessage,
2051
+ });
2052
+
2053
+ // Attach the live session to the pre-registered ref so peers can route IRC
2054
+ // messages here. Refresh sessionFile in case it was unavailable at pre-register
2055
+ // time. The dispose wrapper below unregisters on teardown.
2056
+ agentRegistry.attachSession(resolvedAgentId, session, sessionManager.getSessionFile() ?? null);
2057
+ {
2058
+ const originalDispose = session.dispose.bind(session);
2059
+ session.dispose = async () => {
2060
+ try {
2061
+ await originalDispose();
2062
+ } finally {
2063
+ agentRegistry.unregister(resolvedAgentId);
2064
+ unsubscribeCredentialDisabled?.();
2065
+ }
2066
+ };
2067
+ }
2068
+
2069
+ if (model?.api === "openai-codex-responses") {
2070
+ const codexModel = model;
2071
+ const codexTransport = getOpenAICodexTransportDetails(codexModel, {
2072
+ sessionId: providerSessionId,
2073
+ baseUrl: codexModel.baseUrl,
2074
+ preferWebsockets: preferOpenAICodexWebsockets,
2075
+ providerSessionState: session.providerSessionState,
2076
+ });
2077
+ if (codexTransport.websocketPreferred) {
2078
+ void (async () => {
2079
+ try {
2080
+ const codexPrewarmApiKey = await modelRegistry.getApiKey(codexModel, providerSessionId);
2081
+ if (!codexPrewarmApiKey) return;
2082
+ await logger.time("prewarmOpenAICodexResponses", prewarmOpenAICodexResponses, codexModel, {
2083
+ apiKey: codexPrewarmApiKey,
2084
+ sessionId: providerSessionId,
2085
+ preferWebsockets: preferOpenAICodexWebsockets,
2086
+ providerSessionState: session.providerSessionState,
2087
+ });
2088
+ // Content prewarm: prefill the system prompt + restored history
2089
+ // server-side (generate:false) so the first user message rides
2090
+ // the delta path / a warm prompt cache instead of paying a cold
2091
+ // full-context prefill — the dominant TTFT cost on --resume.
2092
+ const prewarmMode = await logger.time("prewarmCodexContent", () =>
2093
+ session.agent.prewarmCodexContent(),
2094
+ );
2095
+ logger.debug("Codex content prewarm finished", {
2096
+ mode: prewarmMode,
2097
+ model: codexModel.id,
2098
+ });
2099
+ } catch (error) {
2100
+ const errorMessage = error instanceof Error ? error.message : String(error);
2101
+ logger.debug("Codex websocket prewarm failed", {
2102
+ error: errorMessage,
2103
+ provider: codexModel.provider,
2104
+ model: codexModel.id,
2105
+ });
2106
+ }
2107
+ })();
2108
+ }
2109
+ }
2110
+
2111
+ // Start LSP warmup in the background so startup does not block on language server initialization.
2112
+ // Print/script invocations (`hasUI=false`) don't render the warmup status indicator AND typically
2113
+ // finish before LSP servers would have stabilized — warming them just spends CPU parsing big
2114
+ // `initialize` responses concurrently with the LLM stream consumer, jittering perceived latency.
2115
+ // Tools that need an LSP server still spin one up on demand through `getOrCreateClient`.
2116
+ let lspServers: CreateAgentSessionResult["lspServers"];
2117
+ if (enableLsp && options.hasUI && settings.get("lsp.diagnosticsOnWrite")) {
2118
+ lspServers = discoverStartupLspServers(cwd);
2119
+ if (lspServers.length > 0) {
2120
+ void (async () => {
2121
+ try {
2122
+ const result = await logger.time("warmupLspServers", warmupLspServers, cwd);
2123
+ const serversByName = new Map(result.servers.map(server => [server.name, server] as const));
2124
+ for (const server of lspServers ?? []) {
2125
+ const next = serversByName.get(server.name);
2126
+ if (!next) continue;
2127
+ server.status = next.status;
2128
+ server.fileTypes = next.fileTypes;
2129
+ server.error = next.error;
2130
+ }
2131
+ const event: LspStartupEvent = {
2132
+ type: "completed",
2133
+ servers: result.servers,
2134
+ };
2135
+ eventBus.emit(LSP_STARTUP_EVENT_CHANNEL, event);
2136
+ } catch (error) {
2137
+ const errorMessage = error instanceof Error ? error.message : String(error);
2138
+ logger.warn("LSP server warmup failed", { cwd, error: errorMessage });
2139
+ for (const server of lspServers ?? []) {
2140
+ server.status = "error";
2141
+ server.error = errorMessage;
2142
+ }
2143
+ const event: LspStartupEvent = {
2144
+ type: "failed",
2145
+ error: errorMessage,
2146
+ };
2147
+ eventBus.emit(LSP_STARTUP_EVENT_CHANNEL, event);
2148
+ }
2149
+ })();
2150
+ }
2151
+ }
2152
+
2153
+ logger.time("startMemoryStartupTask", () =>
2154
+ Promise.resolve(
2155
+ resolveMemoryBackend(settings).start({
2156
+ session,
2157
+ settings,
2158
+ modelRegistry,
2159
+ agentDir,
2160
+ taskDepth,
2161
+ parentHindsightSessionState: options.parentHindsightSessionState,
2162
+ }),
2163
+ ),
2164
+ );
2165
+
2166
+ // Wire MCP manager callbacks to session for reactive tool updates.
2167
+ // Skip when reusing a parent's manager — the parent owns the callbacks.
2168
+ if (mcpManager && !options.mcpManager) {
2169
+ mcpManager.setOnToolsChanged(tools => {
2170
+ void session.refreshMCPTools(tools);
2171
+ });
2172
+ // Wire prompt refresh → rebuild MCP prompt slash commands
2173
+ mcpManager.setOnPromptsChanged(serverName => {
2174
+ const promptCommands = buildMCPPromptCommands(mcpManager);
2175
+ session.setMCPPromptCommands(promptCommands);
2176
+ logger.debug("MCP prompt commands refreshed", { path: `mcp:${serverName}` });
2177
+ });
2178
+ const notificationDebounceTimers = new Map<string, Timer>();
2179
+ const clearDebounceTimers = () => {
2180
+ for (const timer of notificationDebounceTimers.values()) clearTimeout(timer);
2181
+ notificationDebounceTimers.clear();
2182
+ };
2183
+ postmortem.register("mcp-notification-cleanup", clearDebounceTimers);
2184
+ mcpManager.setOnResourcesChanged((serverName, uri) => {
2185
+ logger.debug("MCP resources changed", { path: `mcp:${serverName}`, uri });
2186
+ if (!settings.get("mcp.notifications")) return;
2187
+ const debounceMs = settings.get("mcp.notificationDebounceMs");
2188
+ const key = `${serverName}:${uri}`;
2189
+ const existing = notificationDebounceTimers.get(key);
2190
+ if (existing) clearTimeout(existing);
2191
+ notificationDebounceTimers.set(
2192
+ key,
2193
+ setTimeout(() => {
2194
+ notificationDebounceTimers.delete(key);
2195
+ // Re-check: user may have disabled notifications during the debounce window
2196
+ if (!settings.get("mcp.notifications")) return;
2197
+ session.yieldQueue.enqueue<McpNotificationEntry>("mcp-notification", { serverName, uri });
2198
+ }, debounceMs),
2199
+ );
2200
+ });
2201
+ }
2202
+
2203
+ return {
2204
+ session,
2205
+ extensionsResult,
2206
+ setToolUIContext,
2207
+ mcpManager,
2208
+ modelFallbackMessage,
2209
+ lspServers,
2210
+ eventBus,
2211
+ };
2212
+ } catch (error) {
2213
+ // Release the subscription if the throw happened after install but before the
2214
+ // dispose-wrap took ownership. Idempotent with dispose() — Set.delete is a no-op
2215
+ // for already-removed listeners.
2216
+ unsubscribeCredentialDisabled?.();
2217
+ try {
2218
+ if (hasSession) {
2219
+ await session.dispose();
2220
+ } else {
2221
+ if (hasRegistered) agentRegistry.unregister(resolvedAgentId);
2222
+ await disposeKernelSessionsByOwner(evalKernelOwnerId);
2223
+ }
2224
+ } catch (cleanupError) {
2225
+ logger.warn("Failed to clean up createAgentSession resources after startup error", {
2226
+ error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
2227
+ });
2228
+ }
2229
+ throw error;
2230
+ }
2231
+ }
2232
+
2233
+ /**
2234
+ * Best-effort preconnect to the model's API host. Bun's `fetch.preconnect`
2235
+ * primes DNS + TCP + TLS + H2 so the first real request reuses the warm
2236
+ * connection. Errors are swallowed: preconnect is an optimization, never a
2237
+ * hard dependency.
2238
+ */
2239
+ function preconnectModelHost(baseUrl: string | undefined): void {
2240
+ if (!baseUrl) return;
2241
+ const preconnect = (globalThis.fetch as typeof fetch & { preconnect?: (url: string) => void }).preconnect;
2242
+ if (typeof preconnect !== "function") return;
2243
+ try {
2244
+ preconnect(baseUrl);
2245
+ } catch {
2246
+ // Best effort.
2247
+ }
2248
+ }