@kr78/pi-coding-agent 17.2.10

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 (1593) hide show
  1. package/CHANGELOG.md +14861 -0
  2. package/README.md +35 -0
  3. package/dist/CHANGELOG-chtdxh1z.md +14861 -0
  4. package/dist/cli.js +20483 -0
  5. package/dist/template-c2hyaytt.js +1653 -0
  6. package/dist/template-f8wx9vfn.css +1355 -0
  7. package/dist/template-qat058wr.html +55 -0
  8. package/dist/tool-views.generated-jdfmzwmn.js +35 -0
  9. package/examples/README.md +21 -0
  10. package/examples/custom-tools/README.md +104 -0
  11. package/examples/custom-tools/hello/index.ts +20 -0
  12. package/examples/extensions/README.md +142 -0
  13. package/examples/extensions/api-demo.ts +78 -0
  14. package/examples/extensions/chalk-logger.ts +25 -0
  15. package/examples/extensions/hello.ts +31 -0
  16. package/examples/extensions/pirate.ts +43 -0
  17. package/examples/extensions/plan-mode.ts +549 -0
  18. package/examples/extensions/reload-runtime.ts +38 -0
  19. package/examples/extensions/thinking-note.ts +13 -0
  20. package/examples/extensions/tools.ts +145 -0
  21. package/examples/extensions/with-deps/index.ts +36 -0
  22. package/examples/extensions/with-deps/package-lock.json +31 -0
  23. package/examples/extensions/with-deps/package.json +17 -0
  24. package/examples/hooks/README.md +56 -0
  25. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  26. package/examples/hooks/confirm-destructive.ts +58 -0
  27. package/examples/hooks/custom-compaction.ts +115 -0
  28. package/examples/hooks/dirty-repo-guard.ts +51 -0
  29. package/examples/hooks/file-trigger.ts +40 -0
  30. package/examples/hooks/git-checkpoint.ts +52 -0
  31. package/examples/hooks/handoff.ts +149 -0
  32. package/examples/hooks/permission-gate.ts +33 -0
  33. package/examples/hooks/protected-paths.ts +29 -0
  34. package/examples/hooks/qna.ts +118 -0
  35. package/examples/hooks/status-line.ts +39 -0
  36. package/examples/sdk/01-minimal.ts +21 -0
  37. package/examples/sdk/02-custom-model.ts +49 -0
  38. package/examples/sdk/03-custom-prompt.ts +46 -0
  39. package/examples/sdk/04-skills.ts +43 -0
  40. package/examples/sdk/06-extensions.ts +82 -0
  41. package/examples/sdk/06-hooks.ts +61 -0
  42. package/examples/sdk/07-context-files.ts +35 -0
  43. package/examples/sdk/08-prompt-templates.ts +41 -0
  44. package/examples/sdk/08-slash-commands.ts +46 -0
  45. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  46. package/examples/sdk/11-sessions.ts +47 -0
  47. package/examples/sdk/12-redis-sessions.ts +54 -0
  48. package/examples/sdk/13-sql-sessions.ts +61 -0
  49. package/examples/sdk/README.md +169 -0
  50. package/package.json +587 -0
  51. package/scripts/bench-guard.ts +71 -0
  52. package/scripts/bench-title-models.ts +332 -0
  53. package/scripts/build-binary.ts +117 -0
  54. package/scripts/bundle-dist.ts +123 -0
  55. package/scripts/compile-binary.ts +69 -0
  56. package/scripts/embed-mupdf-wasm.ts +67 -0
  57. package/scripts/format-prompts.ts +68 -0
  58. package/scripts/generate-aria-snapshot.ts +134 -0
  59. package/scripts/generate-docs-index.ts +58 -0
  60. package/scripts/generate-share-viewer.ts +34 -0
  61. package/scripts/legacy-pi-virtual-module.ts +205 -0
  62. package/scripts/measure-prompt-tokens.ts +63 -0
  63. package/scripts/omp +51 -0
  64. package/scripts/omp.ts +19 -0
  65. package/scripts/security-compare.ts +40 -0
  66. package/src/advisor/advise-tool.ts +234 -0
  67. package/src/advisor/config.ts +341 -0
  68. package/src/advisor/emission-guard.ts +172 -0
  69. package/src/advisor/index.ts +6 -0
  70. package/src/advisor/runtime.ts +1412 -0
  71. package/src/advisor/transcript-recorder.ts +215 -0
  72. package/src/advisor/watchdog.ts +135 -0
  73. package/src/async/index.ts +1 -0
  74. package/src/async/job-manager.ts +847 -0
  75. package/src/auto-thinking/classifier.ts +220 -0
  76. package/src/autolearn/controller.ts +152 -0
  77. package/src/autolearn/managed-skills.ts +255 -0
  78. package/src/autoresearch/command-resume.md +14 -0
  79. package/src/autoresearch/dashboard.ts +436 -0
  80. package/src/autoresearch/git.ts +331 -0
  81. package/src/autoresearch/helpers.ts +218 -0
  82. package/src/autoresearch/index.ts +541 -0
  83. package/src/autoresearch/prompt-setup.md +43 -0
  84. package/src/autoresearch/prompt.md +103 -0
  85. package/src/autoresearch/resume-message.md +10 -0
  86. package/src/autoresearch/state.ts +273 -0
  87. package/src/autoresearch/storage.ts +700 -0
  88. package/src/autoresearch/tools/init-experiment.ts +268 -0
  89. package/src/autoresearch/tools/log-experiment.ts +520 -0
  90. package/src/autoresearch/tools/run-experiment.ts +407 -0
  91. package/src/autoresearch/tools/update-notes.ts +109 -0
  92. package/src/autoresearch/types.ts +168 -0
  93. package/src/capability/context-file.ts +44 -0
  94. package/src/capability/extension-module.ts +34 -0
  95. package/src/capability/extension.ts +47 -0
  96. package/src/capability/fs.ts +117 -0
  97. package/src/capability/hook.ts +40 -0
  98. package/src/capability/index.ts +467 -0
  99. package/src/capability/instruction.ts +37 -0
  100. package/src/capability/mcp.ts +115 -0
  101. package/src/capability/prompt.ts +35 -0
  102. package/src/capability/rule-buckets.ts +66 -0
  103. package/src/capability/rule.ts +298 -0
  104. package/src/capability/settings.ts +34 -0
  105. package/src/capability/skill.ts +69 -0
  106. package/src/capability/slash-command.ts +40 -0
  107. package/src/capability/ssh.ts +41 -0
  108. package/src/capability/system-prompt.ts +34 -0
  109. package/src/capability/tool.ts +38 -0
  110. package/src/capability/types.ts +187 -0
  111. package/src/cleanse/agent.ts +226 -0
  112. package/src/cleanse/balance.ts +79 -0
  113. package/src/cleanse/checkers.ts +996 -0
  114. package/src/cleanse/index.ts +190 -0
  115. package/src/cleanse/loop.ts +51 -0
  116. package/src/cleanse/parsers.ts +726 -0
  117. package/src/cleanse/progress.ts +50 -0
  118. package/src/cleanse/prompts/assignment.md +47 -0
  119. package/src/cleanse/types.ts +72 -0
  120. package/src/cli/agents-cli.ts +138 -0
  121. package/src/cli/args.ts +368 -0
  122. package/src/cli/auth-broker-cli.ts +940 -0
  123. package/src/cli/auth-gateway-cli.ts +674 -0
  124. package/src/cli/bench-cli.ts +990 -0
  125. package/src/cli/browser-relay-cli.ts +119 -0
  126. package/src/cli/classify-install-target.ts +76 -0
  127. package/src/cli/claude-trace-cli.ts +795 -0
  128. package/src/cli/command-help.ts +107 -0
  129. package/src/cli/commands/init-xdg.ts +27 -0
  130. package/src/cli/completion-gen.ts +550 -0
  131. package/src/cli/config-cli.ts +459 -0
  132. package/src/cli/dry-balance-cli.ts +864 -0
  133. package/src/cli/extension-flags.ts +48 -0
  134. package/src/cli/file-processor.ts +132 -0
  135. package/src/cli/flag-tables.ts +367 -0
  136. package/src/cli/gallery-cli.ts +272 -0
  137. package/src/cli/gallery-fixtures/agentic.ts +420 -0
  138. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  139. package/src/cli/gallery-fixtures/edit.ts +254 -0
  140. package/src/cli/gallery-fixtures/fs.ts +245 -0
  141. package/src/cli/gallery-fixtures/index.ts +40 -0
  142. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  143. package/src/cli/gallery-fixtures/memory.ts +81 -0
  144. package/src/cli/gallery-fixtures/misc.ts +177 -0
  145. package/src/cli/gallery-fixtures/search.ts +135 -0
  146. package/src/cli/gallery-fixtures/shell.ts +241 -0
  147. package/src/cli/gallery-fixtures/types.ts +57 -0
  148. package/src/cli/gallery-fixtures/web.ts +158 -0
  149. package/src/cli/gallery-screenshot.ts +279 -0
  150. package/src/cli/gc-cli.ts +1566 -0
  151. package/src/cli/grep-cli.ts +161 -0
  152. package/src/cli/grievances-cli.ts +256 -0
  153. package/src/cli/help-extra.ts +89 -0
  154. package/src/cli/initial-message.ts +58 -0
  155. package/src/cli/models-cli.ts +385 -0
  156. package/src/cli/plugin-cli.ts +996 -0
  157. package/src/cli/profile-alias.ts +369 -0
  158. package/src/cli/profile-bootstrap.ts +233 -0
  159. package/src/cli/read-cli.ts +99 -0
  160. package/src/cli/session-picker.ts +110 -0
  161. package/src/cli/setup-cli.ts +312 -0
  162. package/src/cli/setup-model-picker.ts +43 -0
  163. package/src/cli/shell-cli.ts +176 -0
  164. package/src/cli/ssh-cli.ts +179 -0
  165. package/src/cli/startup-cwd.ts +58 -0
  166. package/src/cli/stats-cli.ts +229 -0
  167. package/src/cli/thinking-levels.ts +7 -0
  168. package/src/cli/tiny-models-cli.ts +153 -0
  169. package/src/cli/ttsr-cli.ts +1013 -0
  170. package/src/cli/update-cli.ts +1184 -0
  171. package/src/cli/usage-cli.ts +1084 -0
  172. package/src/cli/usage-error.ts +7 -0
  173. package/src/cli/web-search-cli.ts +144 -0
  174. package/src/cli/worktree-cli.ts +311 -0
  175. package/src/cli-commands.ts +308 -0
  176. package/src/cli.ts +428 -0
  177. package/src/collab/crypto.ts +63 -0
  178. package/src/collab/display-name.ts +13 -0
  179. package/src/collab/guest.ts +764 -0
  180. package/src/collab/host.ts +692 -0
  181. package/src/collab/protocol.ts +296 -0
  182. package/src/collab/relay-client.ts +282 -0
  183. package/src/collab/replication-shrink.ts +111 -0
  184. package/src/commands/acp.ts +35 -0
  185. package/src/commands/agents.ts +58 -0
  186. package/src/commands/auth-broker.ts +100 -0
  187. package/src/commands/auth-gateway.ts +70 -0
  188. package/src/commands/bench.ts +64 -0
  189. package/src/commands/browser-relay.ts +53 -0
  190. package/src/commands/cleanse.ts +45 -0
  191. package/src/commands/commit.ts +47 -0
  192. package/src/commands/complete.ts +67 -0
  193. package/src/commands/completions.ts +61 -0
  194. package/src/commands/config.ts +52 -0
  195. package/src/commands/dry-balance.ts +43 -0
  196. package/src/commands/gallery.ts +61 -0
  197. package/src/commands/gc.ts +47 -0
  198. package/src/commands/grep.ts +49 -0
  199. package/src/commands/grievances.ts +52 -0
  200. package/src/commands/install.ts +107 -0
  201. package/src/commands/join.ts +40 -0
  202. package/src/commands/launch-help.ts +116 -0
  203. package/src/commands/launch.ts +34 -0
  204. package/src/commands/models.ts +61 -0
  205. package/src/commands/plugin.ts +79 -0
  206. package/src/commands/read.ts +39 -0
  207. package/src/commands/say.ts +146 -0
  208. package/src/commands/setup.ts +68 -0
  209. package/src/commands/share.ts +71 -0
  210. package/src/commands/shell.ts +30 -0
  211. package/src/commands/ssh.ts +61 -0
  212. package/src/commands/stats.ts +30 -0
  213. package/src/commands/tiny-models.ts +36 -0
  214. package/src/commands/token.ts +164 -0
  215. package/src/commands/ttsr.ts +125 -0
  216. package/src/commands/update.ts +34 -0
  217. package/src/commands/usage.ts +55 -0
  218. package/src/commands/web-search.ts +43 -0
  219. package/src/commands/worktree.ts +63 -0
  220. package/src/commit/agentic/agent.ts +322 -0
  221. package/src/commit/agentic/fallback.ts +96 -0
  222. package/src/commit/agentic/index.ts +383 -0
  223. package/src/commit/agentic/lock-files.ts +107 -0
  224. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  225. package/src/commit/agentic/prompts/session-user.md +25 -0
  226. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  227. package/src/commit/agentic/prompts/system.md +38 -0
  228. package/src/commit/agentic/state.ts +60 -0
  229. package/src/commit/agentic/tools/analyze-file.ts +148 -0
  230. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  231. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  232. package/src/commit/agentic/tools/git-overview.ts +62 -0
  233. package/src/commit/agentic/tools/index.ts +54 -0
  234. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  235. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  236. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  237. package/src/commit/agentic/tools/schemas.ts +11 -0
  238. package/src/commit/agentic/tools/split-commit.ts +241 -0
  239. package/src/commit/agentic/topo-sort.ts +44 -0
  240. package/src/commit/agentic/trivial.ts +51 -0
  241. package/src/commit/agentic/validation.ts +183 -0
  242. package/src/commit/analysis/conventional.ts +64 -0
  243. package/src/commit/analysis/index.ts +4 -0
  244. package/src/commit/analysis/scope.ts +242 -0
  245. package/src/commit/analysis/summary.ts +107 -0
  246. package/src/commit/analysis/validation.ts +66 -0
  247. package/src/commit/changelog/detect.ts +40 -0
  248. package/src/commit/changelog/generate.ts +101 -0
  249. package/src/commit/changelog/index.ts +234 -0
  250. package/src/commit/changelog/parse.ts +44 -0
  251. package/src/commit/cli.ts +85 -0
  252. package/src/commit/git/diff.ts +148 -0
  253. package/src/commit/index.ts +5 -0
  254. package/src/commit/map-reduce/index.ts +69 -0
  255. package/src/commit/map-reduce/map-phase.ts +193 -0
  256. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  257. package/src/commit/map-reduce/utils.ts +9 -0
  258. package/src/commit/message.ts +11 -0
  259. package/src/commit/model-selection.ts +95 -0
  260. package/src/commit/pipeline.ts +244 -0
  261. package/src/commit/prompts/analysis-system.md +148 -0
  262. package/src/commit/prompts/analysis-user.md +38 -0
  263. package/src/commit/prompts/changelog-system.md +50 -0
  264. package/src/commit/prompts/changelog-user.md +18 -0
  265. package/src/commit/prompts/file-observer-system.md +24 -0
  266. package/src/commit/prompts/file-observer-user.md +8 -0
  267. package/src/commit/prompts/reduce-system.md +50 -0
  268. package/src/commit/prompts/reduce-user.md +17 -0
  269. package/src/commit/prompts/summary-retry.md +3 -0
  270. package/src/commit/prompts/summary-system.md +38 -0
  271. package/src/commit/prompts/summary-user.md +13 -0
  272. package/src/commit/prompts/types-description.md +2 -0
  273. package/src/commit/shared-llm.ts +70 -0
  274. package/src/commit/types.ts +118 -0
  275. package/src/commit/utils/exclusions.ts +42 -0
  276. package/src/commit/utils.ts +58 -0
  277. package/src/config/api-key-resolver.ts +81 -0
  278. package/src/config/append-only-context-mode.ts +76 -0
  279. package/src/config/config-file.ts +347 -0
  280. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  281. package/src/config/keybindings.ts +703 -0
  282. package/src/config/mcp-schema.json +252 -0
  283. package/src/config/model-discovery.ts +1077 -0
  284. package/src/config/model-registry.ts +2822 -0
  285. package/src/config/model-resolver.ts +2115 -0
  286. package/src/config/model-roles.ts +113 -0
  287. package/src/config/models-config-schema-bundle.ts +315 -0
  288. package/src/config/models-config-schema.ts +14 -0
  289. package/src/config/models-config.ts +130 -0
  290. package/src/config/prompt-templates.ts +205 -0
  291. package/src/config/provider-globals.ts +25 -0
  292. package/src/config/resolve-config-value.ts +95 -0
  293. package/src/config/service-tier.ts +146 -0
  294. package/src/config/settings-schema.ts +5887 -0
  295. package/src/config/settings.ts +2394 -0
  296. package/src/config.ts +242 -0
  297. package/src/cursor-bridge-tools.ts +81 -0
  298. package/src/cursor.ts +960 -0
  299. package/src/dap/client.ts +1043 -0
  300. package/src/dap/config.ts +480 -0
  301. package/src/dap/defaults.json +212 -0
  302. package/src/dap/index.ts +4 -0
  303. package/src/dap/session.ts +1841 -0
  304. package/src/dap/types.ts +611 -0
  305. package/src/debug/index.ts +584 -0
  306. package/src/debug/log-formatting.ts +58 -0
  307. package/src/debug/log-viewer.ts +966 -0
  308. package/src/debug/profiler.ts +168 -0
  309. package/src/debug/protocol-probe.ts +267 -0
  310. package/src/debug/raw-sse-buffer.ts +421 -0
  311. package/src/debug/raw-sse.ts +312 -0
  312. package/src/debug/remote-debugger.ts +151 -0
  313. package/src/debug/report-bundle.ts +411 -0
  314. package/src/debug/system-info.ts +111 -0
  315. package/src/debug/terminal-info.ts +124 -0
  316. package/src/discovery/agent-plugin-format.ts +551 -0
  317. package/src/discovery/agent-plugins.ts +341 -0
  318. package/src/discovery/agents-md.ts +67 -0
  319. package/src/discovery/agents.ts +300 -0
  320. package/src/discovery/at-imports.ts +273 -0
  321. package/src/discovery/builtin-defaults.ts +39 -0
  322. package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
  323. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  324. package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
  325. package/src/discovery/builtin-rules/go-ioutil.md +37 -0
  326. package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
  327. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  328. package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
  329. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  330. package/src/discovery/builtin-rules/index.ts +74 -0
  331. package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
  332. package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
  333. package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
  334. package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
  335. package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
  336. package/src/discovery/builtin-rules/rs-result-type.md +20 -0
  337. package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
  338. package/src/discovery/builtin-rules/ts-import-type.md +43 -0
  339. package/src/discovery/builtin-rules/ts-no-any.md +66 -0
  340. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
  341. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
  342. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
  343. package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
  344. package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
  345. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  346. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  347. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
  348. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  349. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  350. package/src/discovery/builtin.ts +945 -0
  351. package/src/discovery/claude-plugins.ts +640 -0
  352. package/src/discovery/claude.ts +591 -0
  353. package/src/discovery/cline.ts +83 -0
  354. package/src/discovery/codex.ts +553 -0
  355. package/src/discovery/contained-path.ts +78 -0
  356. package/src/discovery/cursor.ts +223 -0
  357. package/src/discovery/gemini.ts +386 -0
  358. package/src/discovery/github.ts +337 -0
  359. package/src/discovery/helpers.ts +1183 -0
  360. package/src/discovery/index.ts +82 -0
  361. package/src/discovery/mcp-json.ts +182 -0
  362. package/src/discovery/omp-extension-roots.ts +272 -0
  363. package/src/discovery/omp-plugins.ts +409 -0
  364. package/src/discovery/opencode.ts +441 -0
  365. package/src/discovery/plugin-dir-roots.ts +28 -0
  366. package/src/discovery/ssh.ts +153 -0
  367. package/src/discovery/substitute-plugin-root.ts +77 -0
  368. package/src/discovery/vscode.ts +106 -0
  369. package/src/discovery/windsurf.ts +149 -0
  370. package/src/edit/apply-patch/index.ts +87 -0
  371. package/src/edit/apply-patch/parser.ts +174 -0
  372. package/src/edit/diff.ts +1008 -0
  373. package/src/edit/edit-clipboard.ts +23 -0
  374. package/src/edit/file-snapshot-store.ts +148 -0
  375. package/src/edit/hashline/block-resolver.ts +33 -0
  376. package/src/edit/hashline/diff.ts +402 -0
  377. package/src/edit/hashline/execute.ts +313 -0
  378. package/src/edit/hashline/filesystem.ts +247 -0
  379. package/src/edit/hashline/index.ts +5 -0
  380. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  381. package/src/edit/hashline/params.ts +12 -0
  382. package/src/edit/index.ts +699 -0
  383. package/src/edit/modes/apply-patch.lark +19 -0
  384. package/src/edit/modes/apply-patch.ts +53 -0
  385. package/src/edit/modes/patch.ts +1958 -0
  386. package/src/edit/modes/replace.ts +1191 -0
  387. package/src/edit/normalize.ts +345 -0
  388. package/src/edit/notebook.ts +242 -0
  389. package/src/edit/read-file.ts +25 -0
  390. package/src/edit/renderer.ts +998 -0
  391. package/src/edit/snapshot-details.ts +77 -0
  392. package/src/edit/streaming.ts +710 -0
  393. package/src/eval/agent-bridge.ts +224 -0
  394. package/src/eval/backend-helpers.ts +48 -0
  395. package/src/eval/backend.ts +71 -0
  396. package/src/eval/bridge-timeout.ts +65 -0
  397. package/src/eval/budget-bridge.ts +48 -0
  398. package/src/eval/completion-bridge.ts +212 -0
  399. package/src/eval/concurrency-bridge.ts +34 -0
  400. package/src/eval/executor-base.ts +562 -0
  401. package/src/eval/idle-timeout.ts +91 -0
  402. package/src/eval/index.ts +6 -0
  403. package/src/eval/jl/executor.ts +551 -0
  404. package/src/eval/jl/index.ts +54 -0
  405. package/src/eval/jl/kernel.ts +236 -0
  406. package/src/eval/jl/prelude.jl +736 -0
  407. package/src/eval/jl/prelude.ts +3 -0
  408. package/src/eval/jl/runner.jl +666 -0
  409. package/src/eval/jl/runtime.ts +118 -0
  410. package/src/eval/js/context-manager.ts +872 -0
  411. package/src/eval/js/executor.ts +178 -0
  412. package/src/eval/js/index.ts +41 -0
  413. package/src/eval/js/process-entry.ts +31 -0
  414. package/src/eval/js/shared/helpers.ts +170 -0
  415. package/src/eval/js/shared/indirect-eval.ts +30 -0
  416. package/src/eval/js/shared/local-module-loader.ts +364 -0
  417. package/src/eval/js/shared/prelude.ts +2 -0
  418. package/src/eval/js/shared/prelude.txt +294 -0
  419. package/src/eval/js/shared/rewrite-imports.ts +550 -0
  420. package/src/eval/js/shared/runtime.ts +590 -0
  421. package/src/eval/js/shared/types.ts +18 -0
  422. package/src/eval/js/tool-bridge.ts +163 -0
  423. package/src/eval/js/worker-core.ts +380 -0
  424. package/src/eval/js/worker-entry.ts +37 -0
  425. package/src/eval/js/worker-protocol.ts +47 -0
  426. package/src/eval/kernel-base.ts +569 -0
  427. package/src/eval/py/display.ts +71 -0
  428. package/src/eval/py/executor.ts +643 -0
  429. package/src/eval/py/index.ts +57 -0
  430. package/src/eval/py/kernel.ts +235 -0
  431. package/src/eval/py/prelude.py +673 -0
  432. package/src/eval/py/prelude.ts +3 -0
  433. package/src/eval/py/runner.py +1425 -0
  434. package/src/eval/py/runtime.ts +276 -0
  435. package/src/eval/py/spawn-options.ts +134 -0
  436. package/src/eval/py/tool-bridge.ts +201 -0
  437. package/src/eval/rb/executor.ts +511 -0
  438. package/src/eval/rb/index.ts +54 -0
  439. package/src/eval/rb/kernel.ts +231 -0
  440. package/src/eval/rb/prelude.rb +551 -0
  441. package/src/eval/rb/prelude.ts +3 -0
  442. package/src/eval/rb/runner.rb +581 -0
  443. package/src/eval/rb/runtime.ts +132 -0
  444. package/src/eval/runtime-env.ts +104 -0
  445. package/src/eval/session-id.ts +8 -0
  446. package/src/eval/types.ts +48 -0
  447. package/src/exa/index.ts +2 -0
  448. package/src/exa/mcp-client.ts +370 -0
  449. package/src/exa/types.ts +69 -0
  450. package/src/exec/bash-executor.ts +627 -0
  451. package/src/exec/direnv.ts +145 -0
  452. package/src/exec/exec.ts +53 -0
  453. package/src/exec/non-interactive-env.ts +118 -0
  454. package/src/export/custom-share.ts +65 -0
  455. package/src/export/html/args.ts +20 -0
  456. package/src/export/html/index.ts +320 -0
  457. package/src/export/html/share-loader.js +102 -0
  458. package/src/export/html/template.css +1355 -0
  459. package/src/export/html/template.html +55 -0
  460. package/src/export/html/template.js +1653 -0
  461. package/src/export/html/tool-views.generated.js +35 -0
  462. package/src/export/html/vendor/highlight.min.js +1213 -0
  463. package/src/export/html/vendor/marked.min.js +6 -0
  464. package/src/export/html/web-palette.ts +126 -0
  465. package/src/export/share.ts +686 -0
  466. package/src/export/ttsr.ts +590 -0
  467. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  468. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  469. package/src/extensibility/custom-commands/index.ts +2 -0
  470. package/src/extensibility/custom-commands/loader.ts +242 -0
  471. package/src/extensibility/custom-commands/types.ts +119 -0
  472. package/src/extensibility/custom-tools/index.ts +7 -0
  473. package/src/extensibility/custom-tools/loader.ts +301 -0
  474. package/src/extensibility/custom-tools/types.ts +287 -0
  475. package/src/extensibility/custom-tools/wrapper.ts +50 -0
  476. package/src/extensibility/extensions/compact-handler.ts +40 -0
  477. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  478. package/src/extensibility/extensions/index.ts +16 -0
  479. package/src/extensibility/extensions/load-errors.ts +13 -0
  480. package/src/extensibility/extensions/loader.ts +663 -0
  481. package/src/extensibility/extensions/managed-timers.ts +83 -0
  482. package/src/extensibility/extensions/model-api.ts +39 -0
  483. package/src/extensibility/extensions/runner.ts +1396 -0
  484. package/src/extensibility/extensions/types.ts +1603 -0
  485. package/src/extensibility/extensions/wrapper.ts +395 -0
  486. package/src/extensibility/hooks/index.ts +6 -0
  487. package/src/extensibility/hooks/loader.ts +243 -0
  488. package/src/extensibility/hooks/runner.ts +425 -0
  489. package/src/extensibility/hooks/tool-wrapper.ts +124 -0
  490. package/src/extensibility/hooks/types.ts +612 -0
  491. package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
  492. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
  493. package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
  494. package/src/extensibility/legacy-typebox.ts +101 -0
  495. package/src/extensibility/plugins/bun-git-cache.ts +91 -0
  496. package/src/extensibility/plugins/doctor.ts +65 -0
  497. package/src/extensibility/plugins/git-url.ts +367 -0
  498. package/src/extensibility/plugins/index.ts +9 -0
  499. package/src/extensibility/plugins/installer.ts +201 -0
  500. package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
  501. package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
  502. package/src/extensibility/plugins/loader.ts +535 -0
  503. package/src/extensibility/plugins/manager.ts +1142 -0
  504. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  505. package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
  506. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  507. package/src/extensibility/plugins/marketplace/manager.ts +927 -0
  508. package/src/extensibility/plugins/marketplace/registry.ts +192 -0
  509. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  510. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  511. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  512. package/src/extensibility/plugins/parser.ts +107 -0
  513. package/src/extensibility/plugins/runtime-config.ts +9 -0
  514. package/src/extensibility/plugins/types.ts +194 -0
  515. package/src/extensibility/session-handler-types.ts +21 -0
  516. package/src/extensibility/shared-events.ts +401 -0
  517. package/src/extensibility/skills.ts +531 -0
  518. package/src/extensibility/slash-commands.ts +131 -0
  519. package/src/extensibility/tool-event-input.ts +80 -0
  520. package/src/extensibility/tool-proxy.ts +28 -0
  521. package/src/extensibility/utils.ts +192 -0
  522. package/src/goals/index.ts +3 -0
  523. package/src/goals/runtime.ts +521 -0
  524. package/src/goals/state.ts +37 -0
  525. package/src/goals/tools/goal-tool.ts +251 -0
  526. package/src/hindsight/backend.ts +354 -0
  527. package/src/hindsight/bank.ts +156 -0
  528. package/src/hindsight/client.ts +680 -0
  529. package/src/hindsight/config.ts +193 -0
  530. package/src/hindsight/content.ts +266 -0
  531. package/src/hindsight/index.ts +8 -0
  532. package/src/hindsight/mental-models.ts +429 -0
  533. package/src/hindsight/seeds.json +32 -0
  534. package/src/hindsight/state.ts +530 -0
  535. package/src/hindsight/transcript.ts +71 -0
  536. package/src/index.ts +66 -0
  537. package/src/internal-urls/agent-protocol.ts +180 -0
  538. package/src/internal-urls/artifact-protocol.ts +151 -0
  539. package/src/internal-urls/docs-index.ts +102 -0
  540. package/src/internal-urls/filesystem-resource.ts +34 -0
  541. package/src/internal-urls/history-protocol.ts +198 -0
  542. package/src/internal-urls/index.ts +28 -0
  543. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  544. package/src/internal-urls/json-query.ts +126 -0
  545. package/src/internal-urls/local-protocol.ts +471 -0
  546. package/src/internal-urls/mcp-protocol.ts +168 -0
  547. package/src/internal-urls/memory-protocol.ts +380 -0
  548. package/src/internal-urls/omp-protocol.ts +94 -0
  549. package/src/internal-urls/parse.ts +103 -0
  550. package/src/internal-urls/registry-helpers.ts +132 -0
  551. package/src/internal-urls/router.ts +153 -0
  552. package/src/internal-urls/rule-protocol.ts +45 -0
  553. package/src/internal-urls/security-protocol.ts +261 -0
  554. package/src/internal-urls/skill-protocol.ts +131 -0
  555. package/src/internal-urls/ssh-protocol.ts +368 -0
  556. package/src/internal-urls/types.ts +196 -0
  557. package/src/internal-urls/vault-protocol.ts +940 -0
  558. package/src/internal-urls/xd-protocol.ts +46 -0
  559. package/src/irc/bus.ts +380 -0
  560. package/src/jsonrpc/message-framing.ts +142 -0
  561. package/src/launch/broker.ts +1368 -0
  562. package/src/launch/client.ts +521 -0
  563. package/src/launch/ensure.ts +73 -0
  564. package/src/launch/paths.ts +14 -0
  565. package/src/launch/presence.ts +82 -0
  566. package/src/launch/protocol.ts +448 -0
  567. package/src/launch/spawn-options.ts +17 -0
  568. package/src/launch/terminal-output-worker-client.ts +53 -0
  569. package/src/launch/terminal-output-worker-protocol.ts +11 -0
  570. package/src/launch/terminal-output-worker.ts +23 -0
  571. package/src/launch/terminal-output.ts +46 -0
  572. package/src/lib/xai-http.ts +150 -0
  573. package/src/live/attestation.ts +91 -0
  574. package/src/live/controller.ts +517 -0
  575. package/src/live/prompts/agent-final-message.md +3 -0
  576. package/src/live/prompts/live-instructions.md +23 -0
  577. package/src/live/protocol.ts +233 -0
  578. package/src/live/transport.ts +422 -0
  579. package/src/live/visualizer.ts +221 -0
  580. package/src/live/voices.ts +18 -0
  581. package/src/lsp/client.ts +1465 -0
  582. package/src/lsp/clients/biome-client.ts +263 -0
  583. package/src/lsp/clients/index.ts +50 -0
  584. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  585. package/src/lsp/clients/swiftlint-client.ts +120 -0
  586. package/src/lsp/config.ts +549 -0
  587. package/src/lsp/defaults.json +499 -0
  588. package/src/lsp/deferred-diagnostics.ts +66 -0
  589. package/src/lsp/diagnostics-ledger.ts +51 -0
  590. package/src/lsp/edits.ts +288 -0
  591. package/src/lsp/format-options.ts +119 -0
  592. package/src/lsp/index.ts +2821 -0
  593. package/src/lsp/lspmux.ts +233 -0
  594. package/src/lsp/mux/daemon.ts +348 -0
  595. package/src/lsp/mux/protocol.ts +96 -0
  596. package/src/lsp/mux/server.ts +797 -0
  597. package/src/lsp/render.ts +668 -0
  598. package/src/lsp/startup-events.ts +13 -0
  599. package/src/lsp/types.ts +479 -0
  600. package/src/lsp/utils.ts +747 -0
  601. package/src/main.ts +1799 -0
  602. package/src/markit/NOTICE +32 -0
  603. package/src/markit/converters/docx.ts +56 -0
  604. package/src/markit/converters/epub.ts +136 -0
  605. package/src/markit/converters/pdf/columns.ts +103 -0
  606. package/src/markit/converters/pdf/extract.ts +598 -0
  607. package/src/markit/converters/pdf/grid.ts +780 -0
  608. package/src/markit/converters/pdf/headers.ts +106 -0
  609. package/src/markit/converters/pdf/index.ts +146 -0
  610. package/src/markit/converters/pdf/render.ts +501 -0
  611. package/src/markit/converters/pdf/types.ts +84 -0
  612. package/src/markit/converters/pptx.ts +325 -0
  613. package/src/markit/converters/xlsx.ts +173 -0
  614. package/src/markit/index.ts +2 -0
  615. package/src/markit/registry.ts +59 -0
  616. package/src/markit/types.ts +35 -0
  617. package/src/mcp/client.ts +511 -0
  618. package/src/mcp/config-writer.ts +377 -0
  619. package/src/mcp/config.ts +385 -0
  620. package/src/mcp/index.ts +29 -0
  621. package/src/mcp/json-rpc.ts +122 -0
  622. package/src/mcp/loader.ts +125 -0
  623. package/src/mcp/manager.ts +1524 -0
  624. package/src/mcp/oauth-credentials.ts +104 -0
  625. package/src/mcp/oauth-discovery.ts +587 -0
  626. package/src/mcp/oauth-flow.ts +830 -0
  627. package/src/mcp/render.ts +214 -0
  628. package/src/mcp/request-id.ts +24 -0
  629. package/src/mcp/smithery-auth.ts +108 -0
  630. package/src/mcp/smithery-connect.ts +154 -0
  631. package/src/mcp/smithery-registry.ts +500 -0
  632. package/src/mcp/startup-events.ts +116 -0
  633. package/src/mcp/timeout.ts +59 -0
  634. package/src/mcp/tool-bridge.ts +691 -0
  635. package/src/mcp/tool-cache.ts +117 -0
  636. package/src/mcp/transports/header-policy.ts +95 -0
  637. package/src/mcp/transports/http.ts +508 -0
  638. package/src/mcp/transports/index.ts +7 -0
  639. package/src/mcp/transports/sse.ts +372 -0
  640. package/src/mcp/transports/stdio.ts +905 -0
  641. package/src/mcp/types.ts +467 -0
  642. package/src/memories/index.ts +1434 -0
  643. package/src/memories/storage.ts +578 -0
  644. package/src/memory-backend/index.ts +19 -0
  645. package/src/memory-backend/local-backend.ts +47 -0
  646. package/src/memory-backend/messages.ts +19 -0
  647. package/src/memory-backend/off-backend.ts +25 -0
  648. package/src/memory-backend/resolve.ts +25 -0
  649. package/src/memory-backend/runtime.ts +66 -0
  650. package/src/memory-backend/tool-names.ts +2 -0
  651. package/src/memory-backend/types.ts +166 -0
  652. package/src/mnemopi/backend.ts +629 -0
  653. package/src/mnemopi/config.ts +267 -0
  654. package/src/mnemopi/embed-client.ts +293 -0
  655. package/src/mnemopi/embed-protocol.ts +35 -0
  656. package/src/mnemopi/embed-worker.ts +114 -0
  657. package/src/mnemopi/index.ts +3 -0
  658. package/src/mnemopi/state.ts +940 -0
  659. package/src/modes/acp/acp-agent.ts +2595 -0
  660. package/src/modes/acp/acp-client-bridge.ts +154 -0
  661. package/src/modes/acp/acp-event-mapper.ts +1084 -0
  662. package/src/modes/acp/acp-mode.ts +48 -0
  663. package/src/modes/acp/index.ts +2 -0
  664. package/src/modes/acp/terminal-auth.ts +37 -0
  665. package/src/modes/components/advisor-config.ts +635 -0
  666. package/src/modes/components/advisor-message.ts +109 -0
  667. package/src/modes/components/agent-dashboard.ts +1252 -0
  668. package/src/modes/components/agent-hub-projection.ts +248 -0
  669. package/src/modes/components/agent-hub-renderer.ts +194 -0
  670. package/src/modes/components/agent-hub.ts +1126 -0
  671. package/src/modes/components/agent-transcript-viewer.ts +647 -0
  672. package/src/modes/components/ask-dialog.ts +1017 -0
  673. package/src/modes/components/assistant-message.ts +978 -0
  674. package/src/modes/components/background-tan-message.ts +36 -0
  675. package/src/modes/components/bash-execution.ts +233 -0
  676. package/src/modes/components/bordered-loader.ts +41 -0
  677. package/src/modes/components/btw-panel.ts +161 -0
  678. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  679. package/src/modes/components/chat-block.ts +111 -0
  680. package/src/modes/components/chat-transcript-builder.ts +518 -0
  681. package/src/modes/components/codex-reset-fireworks.ts +369 -0
  682. package/src/modes/components/collab-prompt-message.ts +32 -0
  683. package/src/modes/components/compaction-summary-message.ts +221 -0
  684. package/src/modes/components/copy-selector.ts +218 -0
  685. package/src/modes/components/countdown-timer.ts +75 -0
  686. package/src/modes/components/custom-editor.ts +1036 -0
  687. package/src/modes/components/custom-message.ts +70 -0
  688. package/src/modes/components/diff.ts +254 -0
  689. package/src/modes/components/dynamic-border.ts +37 -0
  690. package/src/modes/components/error-banner.ts +33 -0
  691. package/src/modes/components/eval-execution.ts +169 -0
  692. package/src/modes/components/execution-shared.ts +101 -0
  693. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  694. package/src/modes/components/extensions/extension-list.ts +507 -0
  695. package/src/modes/components/extensions/index.ts +9 -0
  696. package/src/modes/components/extensions/inspector-panel.ts +326 -0
  697. package/src/modes/components/extensions/state-manager.ts +648 -0
  698. package/src/modes/components/extensions/types.ts +186 -0
  699. package/src/modes/components/footer.ts +274 -0
  700. package/src/modes/components/history-search.ts +268 -0
  701. package/src/modes/components/hook-editor.ts +213 -0
  702. package/src/modes/components/hook-input.ts +87 -0
  703. package/src/modes/components/hook-message.ts +67 -0
  704. package/src/modes/components/hook-selector.ts +691 -0
  705. package/src/modes/components/index.ts +42 -0
  706. package/src/modes/components/keybinding-hints.ts +56 -0
  707. package/src/modes/components/late-diagnostics-message.ts +60 -0
  708. package/src/modes/components/login-dialog.ts +197 -0
  709. package/src/modes/components/logout-account-selector.ts +130 -0
  710. package/src/modes/components/mcp-add-wizard.ts +1413 -0
  711. package/src/modes/components/message-frame.ts +98 -0
  712. package/src/modes/components/model-browser.ts +888 -0
  713. package/src/modes/components/model-hub.ts +2014 -0
  714. package/src/modes/components/model-picker.ts +237 -0
  715. package/src/modes/components/move-overlay.ts +293 -0
  716. package/src/modes/components/oauth-selector.ts +474 -0
  717. package/src/modes/components/omfg-panel.ts +141 -0
  718. package/src/modes/components/overlay-box.ts +109 -0
  719. package/src/modes/components/pause-screen.ts +208 -0
  720. package/src/modes/components/plan-review-overlay.ts +1226 -0
  721. package/src/modes/components/plan-toc.ts +138 -0
  722. package/src/modes/components/plugin-selector.ts +100 -0
  723. package/src/modes/components/plugin-settings.ts +745 -0
  724. package/src/modes/components/queue-mode-selector.ts +61 -0
  725. package/src/modes/components/read-tool-group.ts +856 -0
  726. package/src/modes/components/reset-usage-selector.ts +161 -0
  727. package/src/modes/components/segment-track.ts +89 -0
  728. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  729. package/src/modes/components/selector-helpers.ts +129 -0
  730. package/src/modes/components/session-account-selector.ts +62 -0
  731. package/src/modes/components/session-selector.ts +1035 -0
  732. package/src/modes/components/settings-defs.ts +267 -0
  733. package/src/modes/components/settings-selector.ts +1445 -0
  734. package/src/modes/components/show-images-selector.ts +50 -0
  735. package/src/modes/components/skill-message.ts +110 -0
  736. package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
  737. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  738. package/src/modes/components/status-line/component.ts +1843 -0
  739. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  740. package/src/modes/components/status-line/git-utils.ts +42 -0
  741. package/src/modes/components/status-line/index.ts +5 -0
  742. package/src/modes/components/status-line/presets.ts +106 -0
  743. package/src/modes/components/status-line/segments.ts +710 -0
  744. package/src/modes/components/status-line/separators.ts +55 -0
  745. package/src/modes/components/status-line/types.ts +159 -0
  746. package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
  747. package/src/modes/components/theme-selector.ts +68 -0
  748. package/src/modes/components/thinking-selector.ts +57 -0
  749. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  750. package/src/modes/components/tips.txt +26 -0
  751. package/src/modes/components/todo-reminder.ts +43 -0
  752. package/src/modes/components/tool-execution.ts +1467 -0
  753. package/src/modes/components/transcript-container.ts +527 -0
  754. package/src/modes/components/tree-selector.ts +1006 -0
  755. package/src/modes/components/ttsr-notification.ts +123 -0
  756. package/src/modes/components/usage-row.ts +52 -0
  757. package/src/modes/components/user-message-selector.ts +227 -0
  758. package/src/modes/components/user-message.ts +167 -0
  759. package/src/modes/components/visual-truncate.ts +63 -0
  760. package/src/modes/components/welcome.ts +578 -0
  761. package/src/modes/controllers/btw-controller.ts +246 -0
  762. package/src/modes/controllers/command-controller-shared.ts +109 -0
  763. package/src/modes/controllers/command-controller.ts +2024 -0
  764. package/src/modes/controllers/event-controller.ts +2173 -0
  765. package/src/modes/controllers/extension-ui-controller.ts +1243 -0
  766. package/src/modes/controllers/input-controller.ts +2037 -0
  767. package/src/modes/controllers/live-command-controller.ts +261 -0
  768. package/src/modes/controllers/mcp-command-controller.ts +2552 -0
  769. package/src/modes/controllers/omfg-controller.ts +287 -0
  770. package/src/modes/controllers/omfg-rule.ts +647 -0
  771. package/src/modes/controllers/selector-controller.ts +2058 -0
  772. package/src/modes/controllers/session-focus-controller.ts +117 -0
  773. package/src/modes/controllers/ssh-command-controller.ts +385 -0
  774. package/src/modes/controllers/streaming-reveal.ts +399 -0
  775. package/src/modes/controllers/tan-command-controller.ts +243 -0
  776. package/src/modes/controllers/todo-command-controller.ts +487 -0
  777. package/src/modes/controllers/tool-args-reveal.ts +591 -0
  778. package/src/modes/data/emojis.json +1 -0
  779. package/src/modes/emoji-autocomplete.ts +285 -0
  780. package/src/modes/github-ref-autocomplete.ts +75 -0
  781. package/src/modes/gradient-highlight.ts +99 -0
  782. package/src/modes/image-references.ts +137 -0
  783. package/src/modes/index.ts +10 -0
  784. package/src/modes/interactive-mode.ts +5055 -0
  785. package/src/modes/internal-url-autocomplete.ts +158 -0
  786. package/src/modes/loop-limit.ts +192 -0
  787. package/src/modes/magic-keyword-boundary.ts +23 -0
  788. package/src/modes/magic-keywords.ts +42 -0
  789. package/src/modes/markdown-prose.ts +247 -0
  790. package/src/modes/oauth-manual-input.ts +69 -0
  791. package/src/modes/orchestrate.ts +43 -0
  792. package/src/modes/print-mode.ts +282 -0
  793. package/src/modes/prompt-action-autocomplete.ts +322 -0
  794. package/src/modes/queue-input.ts +132 -0
  795. package/src/modes/rpc/host-tools.ts +204 -0
  796. package/src/modes/rpc/host-uris.ts +241 -0
  797. package/src/modes/rpc/rpc-client.ts +1213 -0
  798. package/src/modes/rpc/rpc-frame.ts +316 -0
  799. package/src/modes/rpc/rpc-input.ts +38 -0
  800. package/src/modes/rpc/rpc-messages.ts +127 -0
  801. package/src/modes/rpc/rpc-mode.ts +1519 -0
  802. package/src/modes/rpc/rpc-subagents.ts +265 -0
  803. package/src/modes/rpc/rpc-types.ts +544 -0
  804. package/src/modes/running-subagent-badge.ts +13 -0
  805. package/src/modes/runtime-init.ts +144 -0
  806. package/src/modes/session-observer-registry.ts +223 -0
  807. package/src/modes/session-teardown.ts +82 -0
  808. package/src/modes/setup-version.ts +11 -0
  809. package/src/modes/setup-wizard/index.ts +103 -0
  810. package/src/modes/setup-wizard/lazy.ts +16 -0
  811. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  812. package/src/modes/setup-wizard/scenes/model.ts +132 -0
  813. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  814. package/src/modes/setup-wizard/scenes/providers.ts +105 -0
  815. package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
  816. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  817. package/src/modes/setup-wizard/scenes/theme.ts +330 -0
  818. package/src/modes/setup-wizard/scenes/types.ts +65 -0
  819. package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
  820. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  821. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  822. package/src/modes/shared.ts +49 -0
  823. package/src/modes/skill-command.ts +91 -0
  824. package/src/modes/theme/dark.json +95 -0
  825. package/src/modes/theme/defaults/alabaster.json +93 -0
  826. package/src/modes/theme/defaults/amethyst.json +96 -0
  827. package/src/modes/theme/defaults/anthracite.json +93 -0
  828. package/src/modes/theme/defaults/basalt.json +91 -0
  829. package/src/modes/theme/defaults/birch.json +95 -0
  830. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  831. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  832. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  833. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  834. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  835. package/src/modes/theme/defaults/dark-copper.json +95 -0
  836. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  837. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  838. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  839. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  840. package/src/modes/theme/defaults/dark-ember.json +95 -0
  841. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  842. package/src/modes/theme/defaults/dark-forest.json +96 -0
  843. package/src/modes/theme/defaults/dark-github.json +105 -0
  844. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  845. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  846. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  847. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  848. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  849. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  850. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  851. package/src/modes/theme/defaults/dark-nord.json +97 -0
  852. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  853. package/src/modes/theme/defaults/dark-one.json +100 -0
  854. package/src/modes/theme/defaults/dark-poimandres.json +143 -0
  855. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  856. package/src/modes/theme/defaults/dark-reef.json +91 -0
  857. package/src/modes/theme/defaults/dark-retro.json +92 -0
  858. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  859. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  860. package/src/modes/theme/defaults/dark-slate.json +95 -0
  861. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  862. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  863. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  864. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  865. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  866. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  867. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  868. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  869. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  870. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  871. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  872. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  873. package/src/modes/theme/defaults/graphite.json +92 -0
  874. package/src/modes/theme/defaults/index.ts +199 -0
  875. package/src/modes/theme/defaults/light-arctic.json +107 -0
  876. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  877. package/src/modes/theme/defaults/light-canyon.json +91 -0
  878. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  879. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  880. package/src/modes/theme/defaults/light-coral.json +95 -0
  881. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  882. package/src/modes/theme/defaults/light-dawn.json +90 -0
  883. package/src/modes/theme/defaults/light-dunes.json +91 -0
  884. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  885. package/src/modes/theme/defaults/light-forest.json +100 -0
  886. package/src/modes/theme/defaults/light-frost.json +95 -0
  887. package/src/modes/theme/defaults/light-github.json +115 -0
  888. package/src/modes/theme/defaults/light-glacier.json +91 -0
  889. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  890. package/src/modes/theme/defaults/light-haze.json +90 -0
  891. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  892. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  893. package/src/modes/theme/defaults/light-lavender.json +95 -0
  894. package/src/modes/theme/defaults/light-meadow.json +91 -0
  895. package/src/modes/theme/defaults/light-mint.json +95 -0
  896. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  897. package/src/modes/theme/defaults/light-ocean.json +99 -0
  898. package/src/modes/theme/defaults/light-one.json +99 -0
  899. package/src/modes/theme/defaults/light-opal.json +91 -0
  900. package/src/modes/theme/defaults/light-orchard.json +91 -0
  901. package/src/modes/theme/defaults/light-paper.json +95 -0
  902. package/src/modes/theme/defaults/light-poimandres.json +143 -0
  903. package/src/modes/theme/defaults/light-prism.json +90 -0
  904. package/src/modes/theme/defaults/light-retro.json +98 -0
  905. package/src/modes/theme/defaults/light-sand.json +95 -0
  906. package/src/modes/theme/defaults/light-savanna.json +91 -0
  907. package/src/modes/theme/defaults/light-solarized.json +102 -0
  908. package/src/modes/theme/defaults/light-soleil.json +90 -0
  909. package/src/modes/theme/defaults/light-sunset.json +99 -0
  910. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  911. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  912. package/src/modes/theme/defaults/light-wetland.json +91 -0
  913. package/src/modes/theme/defaults/light-zenith.json +89 -0
  914. package/src/modes/theme/defaults/limestone.json +94 -0
  915. package/src/modes/theme/defaults/mahogany.json +97 -0
  916. package/src/modes/theme/defaults/marble.json +93 -0
  917. package/src/modes/theme/defaults/obsidian.json +91 -0
  918. package/src/modes/theme/defaults/onyx.json +91 -0
  919. package/src/modes/theme/defaults/pearl.json +93 -0
  920. package/src/modes/theme/defaults/porcelain.json +91 -0
  921. package/src/modes/theme/defaults/quartz.json +96 -0
  922. package/src/modes/theme/defaults/sandstone.json +95 -0
  923. package/src/modes/theme/defaults/titanium.json +90 -0
  924. package/src/modes/theme/light.json +93 -0
  925. package/src/modes/theme/mermaid-cache.ts +92 -0
  926. package/src/modes/theme/shimmer.ts +305 -0
  927. package/src/modes/theme/theme-schema.json +463 -0
  928. package/src/modes/theme/theme.ts +3171 -0
  929. package/src/modes/turn-budget.ts +31 -0
  930. package/src/modes/types.ts +494 -0
  931. package/src/modes/ultrathink.ts +42 -0
  932. package/src/modes/utils/context-usage.ts +518 -0
  933. package/src/modes/utils/copy-targets.ts +378 -0
  934. package/src/modes/utils/hotkeys-markdown.ts +65 -0
  935. package/src/modes/utils/interactive-context-helpers.ts +31 -0
  936. package/src/modes/utils/keybinding-matchers.ts +86 -0
  937. package/src/modes/utils/tools-markdown.ts +31 -0
  938. package/src/modes/utils/transcript-render-helpers.ts +253 -0
  939. package/src/modes/utils/ui-helpers.ts +976 -0
  940. package/src/modes/warp-events.ts +232 -0
  941. package/src/modes/workflow.ts +55 -0
  942. package/src/plan-mode/approved-plan.ts +194 -0
  943. package/src/plan-mode/model-transition.ts +51 -0
  944. package/src/plan-mode/plan-files.ts +40 -0
  945. package/src/plan-mode/plan-handoff.ts +37 -0
  946. package/src/plan-mode/plan-protection.ts +31 -0
  947. package/src/plan-mode/state.ts +6 -0
  948. package/src/priority.json +60 -0
  949. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  950. package/src/prompts/advisor/advise-tool.md +3 -0
  951. package/src/prompts/advisor/context-files.md +8 -0
  952. package/src/prompts/advisor/system.md +98 -0
  953. package/src/prompts/agents/designer.md +74 -0
  954. package/src/prompts/agents/frontmatter.md +12 -0
  955. package/src/prompts/agents/init.md +33 -0
  956. package/src/prompts/agents/librarian.md +119 -0
  957. package/src/prompts/agents/reviewer.md +139 -0
  958. package/src/prompts/agents/scout.md +58 -0
  959. package/src/prompts/agents/security-reviewer.md +75 -0
  960. package/src/prompts/agents/task.md +17 -0
  961. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  962. package/src/prompts/bench/cache-prefix.md +3 -0
  963. package/src/prompts/bench/cache-suffix.md +1 -0
  964. package/src/prompts/bench.md +6 -0
  965. package/src/prompts/ci-green-request.md +36 -0
  966. package/src/prompts/dry-balance-bench.md +8 -0
  967. package/src/prompts/goals/goal-budget-limit.md +16 -0
  968. package/src/prompts/goals/goal-continuation.md +28 -0
  969. package/src/prompts/goals/goal-mode-active.md +23 -0
  970. package/src/prompts/goals/goal-mode-context.md +4 -0
  971. package/src/prompts/goals/goal-todo-context.md +12 -0
  972. package/src/prompts/goals/guided-goal-interview.md +43 -0
  973. package/src/prompts/memories/consolidation.md +30 -0
  974. package/src/prompts/memories/consolidation_system.md +4 -0
  975. package/src/prompts/memories/read-path.md +17 -0
  976. package/src/prompts/memories/stage_one_input.md +6 -0
  977. package/src/prompts/memories/stage_one_system.md +21 -0
  978. package/src/prompts/review-custom-request.md +21 -0
  979. package/src/prompts/review-headless-request.md +16 -0
  980. package/src/prompts/review-request.md +68 -0
  981. package/src/prompts/security/scan-coordinator.md +7 -0
  982. package/src/prompts/security/scan-request.md +21 -0
  983. package/src/prompts/security/validate-request.md +8 -0
  984. package/src/prompts/session/launch-completion.md +1 -0
  985. package/src/prompts/skills/autoload.md +8 -0
  986. package/src/prompts/skills/user-invocation.md +11 -0
  987. package/src/prompts/steering/parent-irc.md +5 -0
  988. package/src/prompts/steering/user-interjection.md +6 -0
  989. package/src/prompts/system/active-repo-context.md +4 -0
  990. package/src/prompts/system/agent-creation-architect.md +50 -0
  991. package/src/prompts/system/agent-creation-user.md +6 -0
  992. package/src/prompts/system/auto-continue.md +1 -0
  993. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  994. package/src/prompts/system/auto-thinking-difficulty.md +14 -0
  995. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  996. package/src/prompts/system/autolearn-guidance.md +7 -0
  997. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  998. package/src/prompts/system/background-tan-dispatch.md +8 -0
  999. package/src/prompts/system/btw-user.md +8 -0
  1000. package/src/prompts/system/commit-message-system.md +14 -0
  1001. package/src/prompts/system/computer-safety.md +14 -0
  1002. package/src/prompts/system/custom-system-prompt.md +64 -0
  1003. package/src/prompts/system/eager-task.md +7 -0
  1004. package/src/prompts/system/eager-todo.md +18 -0
  1005. package/src/prompts/system/empty-stop-retry.md +4 -0
  1006. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  1007. package/src/prompts/system/interrupted-thinking.md +7 -0
  1008. package/src/prompts/system/irc-autoreply.md +6 -0
  1009. package/src/prompts/system/irc-incoming.md +9 -0
  1010. package/src/prompts/system/manual-continue.md +7 -0
  1011. package/src/prompts/system/mcp-xdev-guidance.md +11 -0
  1012. package/src/prompts/system/memory-consolidation-system.md +8 -0
  1013. package/src/prompts/system/memory-extraction-system.md +26 -0
  1014. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  1015. package/src/prompts/system/omfg-user.md +50 -0
  1016. package/src/prompts/system/orchestrate-notice.md +40 -0
  1017. package/src/prompts/system/personalities/default.md +18 -0
  1018. package/src/prompts/system/personalities/friendly.md +17 -0
  1019. package/src/prompts/system/personalities/pragmatic.md +15 -0
  1020. package/src/prompts/system/plan-mode-active.md +125 -0
  1021. package/src/prompts/system/plan-mode-approved.md +22 -0
  1022. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  1023. package/src/prompts/system/plan-mode-reference.md +10 -0
  1024. package/src/prompts/system/plan-mode-subagent.md +33 -0
  1025. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1026. package/src/prompts/system/plan-yolo-handoff.md +5 -0
  1027. package/src/prompts/system/prewalk-checklist.md +7 -0
  1028. package/src/prompts/system/prewalk-continue.md +1 -0
  1029. package/src/prompts/system/prewalk-plan.md +13 -0
  1030. package/src/prompts/system/project-prompt.md +61 -0
  1031. package/src/prompts/system/recap-user.md +9 -0
  1032. package/src/prompts/system/resolve-device-reminder.md +3 -0
  1033. package/src/prompts/system/rewind-report.md +6 -0
  1034. package/src/prompts/system/side-channel-no-tools.md +3 -0
  1035. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  1036. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  1037. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  1038. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  1039. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  1040. package/src/prompts/system/speech-rewrite.md +15 -0
  1041. package/src/prompts/system/subagent-async-pending.md +6 -0
  1042. package/src/prompts/system/subagent-system-prompt.md +73 -0
  1043. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1044. package/src/prompts/system/subagent-yield-reminder.md +23 -0
  1045. package/src/prompts/system/system-prompt.md +263 -0
  1046. package/src/prompts/system/tan-context-switch.md +17 -0
  1047. package/src/prompts/system/task-label.md +23 -0
  1048. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  1049. package/src/prompts/system/title-marker-instruction.md +1 -0
  1050. package/src/prompts/system/title-system.md +16 -0
  1051. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  1052. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1053. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1054. package/src/prompts/system/ultrathink-notice.md +3 -0
  1055. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  1056. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  1057. package/src/prompts/system/vibe-mode-active.md +26 -0
  1058. package/src/prompts/system/web-search.md +25 -0
  1059. package/src/prompts/system/workflow-notice.md +112 -0
  1060. package/src/prompts/system/xdev-mount-notice.md +20 -0
  1061. package/src/prompts/tools/apply-patch.md +65 -0
  1062. package/src/prompts/tools/ask.md +22 -0
  1063. package/src/prompts/tools/ast-edit.md +11 -0
  1064. package/src/prompts/tools/ast-grep.md +19 -0
  1065. package/src/prompts/tools/async-result.md +8 -0
  1066. package/src/prompts/tools/bash.md +23 -0
  1067. package/src/prompts/tools/browser.md +29 -0
  1068. package/src/prompts/tools/checkpoint.md +15 -0
  1069. package/src/prompts/tools/computer.md +26 -0
  1070. package/src/prompts/tools/debug.md +3 -0
  1071. package/src/prompts/tools/eval.md +45 -0
  1072. package/src/prompts/tools/github.md +22 -0
  1073. package/src/prompts/tools/glob.md +16 -0
  1074. package/src/prompts/tools/goal.md +11 -0
  1075. package/src/prompts/tools/grep.md +13 -0
  1076. package/src/prompts/tools/hub.md +34 -0
  1077. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  1078. package/src/prompts/tools/image-attachment-describe.md +10 -0
  1079. package/src/prompts/tools/image-gen.md +7 -0
  1080. package/src/prompts/tools/inspect-image-system.md +20 -0
  1081. package/src/prompts/tools/inspect-image.md +22 -0
  1082. package/src/prompts/tools/learn.md +7 -0
  1083. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  1084. package/src/prompts/tools/lsp.md +19 -0
  1085. package/src/prompts/tools/manage-skill.md +9 -0
  1086. package/src/prompts/tools/memory-edit.md +12 -0
  1087. package/src/prompts/tools/patch.md +57 -0
  1088. package/src/prompts/tools/read.md +27 -0
  1089. package/src/prompts/tools/recall.md +7 -0
  1090. package/src/prompts/tools/reflect.md +5 -0
  1091. package/src/prompts/tools/replace.md +30 -0
  1092. package/src/prompts/tools/retain.md +6 -0
  1093. package/src/prompts/tools/rewind.md +14 -0
  1094. package/src/prompts/tools/security-publish.md +1 -0
  1095. package/src/prompts/tools/security-scan.md +1 -0
  1096. package/src/prompts/tools/task-async-contract.md +1 -0
  1097. package/src/prompts/tools/task-summary.md +20 -0
  1098. package/src/prompts/tools/task.md +83 -0
  1099. package/src/prompts/tools/todo.md +42 -0
  1100. package/src/prompts/tools/vibe-kill.md +3 -0
  1101. package/src/prompts/tools/vibe-list.md +3 -0
  1102. package/src/prompts/tools/vibe-send.md +9 -0
  1103. package/src/prompts/tools/vibe-spawn.md +10 -0
  1104. package/src/prompts/tools/vibe-turn-result.md +19 -0
  1105. package/src/prompts/tools/vibe-wait.md +8 -0
  1106. package/src/prompts/tools/web-search.md +8 -0
  1107. package/src/prompts/tools/write.md +14 -0
  1108. package/src/registry/agent-lifecycle.ts +505 -0
  1109. package/src/registry/agent-registry.ts +287 -0
  1110. package/src/registry/persisted-agents.ts +423 -0
  1111. package/src/sdk.ts +3820 -0
  1112. package/src/secrets/index.ts +375 -0
  1113. package/src/secrets/obfuscator.ts +2629 -0
  1114. package/src/secrets/regex.ts +21 -0
  1115. package/src/security/auth.ts +98 -0
  1116. package/src/security/cloud.ts +686 -0
  1117. package/src/security/comparison.ts +255 -0
  1118. package/src/security/contracts/ids.ts +111 -0
  1119. package/src/security/contracts/index.ts +4 -0
  1120. package/src/security/contracts/schemas.ts +219 -0
  1121. package/src/security/contracts/types.ts +254 -0
  1122. package/src/security/contracts/validation.ts +69 -0
  1123. package/src/security/coordinator.ts +708 -0
  1124. package/src/security/importers/codex-security.ts +387 -0
  1125. package/src/security/importers/index.ts +2 -0
  1126. package/src/security/importers/sarif.ts +357 -0
  1127. package/src/security/index.ts +13 -0
  1128. package/src/security/preflight.ts +405 -0
  1129. package/src/security/provenance.ts +106 -0
  1130. package/src/security/publication.ts +326 -0
  1131. package/src/security/remediation.ts +93 -0
  1132. package/src/security/resource-output.ts +50 -0
  1133. package/src/security/sarif.ts +78 -0
  1134. package/src/security/store.ts +430 -0
  1135. package/src/session/acp-permission-gate.ts +165 -0
  1136. package/src/session/agent-session-events.ts +67 -0
  1137. package/src/session/agent-session-types.ts +407 -0
  1138. package/src/session/agent-session.ts +9000 -0
  1139. package/src/session/agent-storage.ts +807 -0
  1140. package/src/session/artifacts.ts +154 -0
  1141. package/src/session/async-job-delivery.ts +82 -0
  1142. package/src/session/auth-broker-config.ts +92 -0
  1143. package/src/session/auth-storage.ts +25 -0
  1144. package/src/session/bash-runner.ts +326 -0
  1145. package/src/session/blob-store.ts +295 -0
  1146. package/src/session/checkpoint-entries.ts +81 -0
  1147. package/src/session/claude-session-store.ts +426 -0
  1148. package/src/session/client-bridge.ts +85 -0
  1149. package/src/session/codex-auto-reset.ts +673 -0
  1150. package/src/session/codex-session-store.ts +673 -0
  1151. package/src/session/compact-modes.ts +105 -0
  1152. package/src/session/credential-pin.ts +93 -0
  1153. package/src/session/eval-runner.ts +219 -0
  1154. package/src/session/exit-diagnostics.ts +310 -0
  1155. package/src/session/foreign-session-import.ts +52 -0
  1156. package/src/session/foreign-session-jsonl.ts +29 -0
  1157. package/src/session/foreign-session-store.ts +26 -0
  1158. package/src/session/history-storage.ts +329 -0
  1159. package/src/session/indexed-session-storage.ts +553 -0
  1160. package/src/session/irc-bridge.ts +203 -0
  1161. package/src/session/launch-completion.ts +37 -0
  1162. package/src/session/messages.ts +1304 -0
  1163. package/src/session/model-controls.ts +757 -0
  1164. package/src/session/prewalk.ts +279 -0
  1165. package/src/session/provider-image-budget.ts +86 -0
  1166. package/src/session/queued-messages.ts +99 -0
  1167. package/src/session/redis-session-storage.ts +257 -0
  1168. package/src/session/retry-fallback-chains.ts +455 -0
  1169. package/src/session/role-models.ts +85 -0
  1170. package/src/session/session-advisors.ts +1896 -0
  1171. package/src/session/session-context.ts +584 -0
  1172. package/src/session/session-dump-format.ts +216 -0
  1173. package/src/session/session-entries.ts +306 -0
  1174. package/src/session/session-handoff.ts +325 -0
  1175. package/src/session/session-history-format.ts +459 -0
  1176. package/src/session/session-listing.ts +715 -0
  1177. package/src/session/session-loader.ts +362 -0
  1178. package/src/session/session-maintenance.ts +3115 -0
  1179. package/src/session/session-manager.ts +2747 -0
  1180. package/src/session/session-memory.ts +222 -0
  1181. package/src/session/session-metadata.ts +53 -0
  1182. package/src/session/session-migrations.ts +78 -0
  1183. package/src/session/session-paths.ts +280 -0
  1184. package/src/session/session-persistence.ts +293 -0
  1185. package/src/session/session-provider-boundary.ts +306 -0
  1186. package/src/session/session-stats.ts +349 -0
  1187. package/src/session/session-storage.ts +774 -0
  1188. package/src/session/session-title-slot.ts +141 -0
  1189. package/src/session/session-tools.ts +1385 -0
  1190. package/src/session/session-workspace.ts +53 -0
  1191. package/src/session/settings-stream-fn.ts +79 -0
  1192. package/src/session/shake-types.ts +43 -0
  1193. package/src/session/snapcompact-inline.ts +545 -0
  1194. package/src/session/snapcompact-savings-journal.ts +113 -0
  1195. package/src/session/sql-session-storage.ts +374 -0
  1196. package/src/session/stream-guards.ts +417 -0
  1197. package/src/session/streaming-output.ts +1459 -0
  1198. package/src/session/todo-tracker.ts +380 -0
  1199. package/src/session/tool-choice-queue.ts +305 -0
  1200. package/src/session/ttsr-coordinator.ts +496 -0
  1201. package/src/session/turn-persistence.ts +142 -0
  1202. package/src/session/turn-recovery.ts +2005 -0
  1203. package/src/session/unexpected-stop-classifier.ts +141 -0
  1204. package/src/session/yield-queue.ts +288 -0
  1205. package/src/slash-commands/acp-builtins.ts +70 -0
  1206. package/src/slash-commands/available-commands.ts +105 -0
  1207. package/src/slash-commands/builtin-registry.ts +3149 -0
  1208. package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
  1209. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  1210. package/src/slash-commands/helpers/context-report.ts +66 -0
  1211. package/src/slash-commands/helpers/format.ts +46 -0
  1212. package/src/slash-commands/helpers/logout.ts +108 -0
  1213. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  1214. package/src/slash-commands/helpers/mcp.ts +533 -0
  1215. package/src/slash-commands/helpers/parse.ts +85 -0
  1216. package/src/slash-commands/helpers/reset-usage.ts +68 -0
  1217. package/src/slash-commands/helpers/security.ts +451 -0
  1218. package/src/slash-commands/helpers/session-pin.ts +44 -0
  1219. package/src/slash-commands/helpers/ssh.ts +196 -0
  1220. package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
  1221. package/src/slash-commands/helpers/todo.ts +285 -0
  1222. package/src/slash-commands/helpers/usage-report.ts +198 -0
  1223. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1224. package/src/slash-commands/types.ts +139 -0
  1225. package/src/ssh/config-writer.ts +183 -0
  1226. package/src/ssh/connection-manager.ts +667 -0
  1227. package/src/ssh/file-transfer.ts +214 -0
  1228. package/src/ssh/sshfs-mount.ts +163 -0
  1229. package/src/ssh/utils.ts +51 -0
  1230. package/src/startup-splash.ts +19 -0
  1231. package/src/stt/asr-client.ts +401 -0
  1232. package/src/stt/asr-protocol.ts +65 -0
  1233. package/src/stt/asr-worker.ts +603 -0
  1234. package/src/stt/downloader.ts +142 -0
  1235. package/src/stt/endpointer.ts +259 -0
  1236. package/src/stt/index.ts +6 -0
  1237. package/src/stt/models.ts +150 -0
  1238. package/src/stt/sherpa-runtime.ts +71 -0
  1239. package/src/stt/stt-controller.ts +320 -0
  1240. package/src/stt/submit-trigger.ts +74 -0
  1241. package/src/subprocess/worker-client.ts +463 -0
  1242. package/src/subprocess/worker-runtime.ts +494 -0
  1243. package/src/system-prompt.ts +921 -0
  1244. package/src/task/agents.ts +170 -0
  1245. package/src/task/commands.ts +132 -0
  1246. package/src/task/discovery.ts +145 -0
  1247. package/src/task/executor.ts +3431 -0
  1248. package/src/task/index.ts +1515 -0
  1249. package/src/task/isolation-ownership.ts +106 -0
  1250. package/src/task/isolation-runner.ts +444 -0
  1251. package/src/task/label.ts +40 -0
  1252. package/src/task/name-generator.ts +1577 -0
  1253. package/src/task/omp-command.ts +26 -0
  1254. package/src/task/output-manager.ts +115 -0
  1255. package/src/task/parallel.ts +221 -0
  1256. package/src/task/persisted-revive.ts +173 -0
  1257. package/src/task/prewalk.ts +6 -0
  1258. package/src/task/prompt-policy.ts +8 -0
  1259. package/src/task/provider-concurrency.ts +100 -0
  1260. package/src/task/read-only-policy.ts +27 -0
  1261. package/src/task/render.ts +1830 -0
  1262. package/src/task/renderer.ts +14 -0
  1263. package/src/task/repair-args.ts +118 -0
  1264. package/src/task/spawn-policy.ts +72 -0
  1265. package/src/task/structured-subagent.ts +676 -0
  1266. package/src/task/subprocess-tool-registry.ts +88 -0
  1267. package/src/task/types.ts +555 -0
  1268. package/src/task/worktree.ts +967 -0
  1269. package/src/task/yield-assembly.ts +198 -0
  1270. package/src/telemetry-export.ts +504 -0
  1271. package/src/thinking.ts +377 -0
  1272. package/src/tiny/device.ts +111 -0
  1273. package/src/tiny/dtype.ts +101 -0
  1274. package/src/tiny/message-preproc.ts +155 -0
  1275. package/src/tiny/models.ts +268 -0
  1276. package/src/tiny/text.ts +290 -0
  1277. package/src/tiny/title-client.ts +460 -0
  1278. package/src/tiny/title-protocol.ts +56 -0
  1279. package/src/tiny/worker.ts +354 -0
  1280. package/src/tools/acp-bridge.ts +125 -0
  1281. package/src/tools/approval.ts +245 -0
  1282. package/src/tools/ask.ts +1459 -0
  1283. package/src/tools/ast-edit.ts +718 -0
  1284. package/src/tools/ast-grep.ts +526 -0
  1285. package/src/tools/auto-generated-guard.ts +335 -0
  1286. package/src/tools/bash-interactive.ts +435 -0
  1287. package/src/tools/bash-interceptor.ts +148 -0
  1288. package/src/tools/bash-pty-selection.ts +14 -0
  1289. package/src/tools/bash-skill-urls.ts +350 -0
  1290. package/src/tools/bash.ts +1826 -0
  1291. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  1292. package/src/tools/browser/aria/aria-snapshot.ts +131 -0
  1293. package/src/tools/browser/attach.ts +219 -0
  1294. package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
  1295. package/src/tools/browser/cmux/rpc.ts +200 -0
  1296. package/src/tools/browser/cmux/socket-client.ts +445 -0
  1297. package/src/tools/browser/launch.ts +939 -0
  1298. package/src/tools/browser/readable.ts +112 -0
  1299. package/src/tools/browser/registry.ts +447 -0
  1300. package/src/tools/browser/relay/bridge.ts +945 -0
  1301. package/src/tools/browser/relay/daemon.ts +117 -0
  1302. package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
  1303. package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
  1304. package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
  1305. package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
  1306. package/src/tools/browser/relay/kind.ts +41 -0
  1307. package/src/tools/browser/relay/protocol.ts +54 -0
  1308. package/src/tools/browser/relay/server.ts +141 -0
  1309. package/src/tools/browser/render.ts +229 -0
  1310. package/src/tools/browser/run-output.ts +76 -0
  1311. package/src/tools/browser/shared-daemon.ts +139 -0
  1312. package/src/tools/browser/tab-protocol.ts +123 -0
  1313. package/src/tools/browser/tab-supervisor.ts +1077 -0
  1314. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1315. package/src/tools/browser/tab-worker.ts +1982 -0
  1316. package/src/tools/browser.ts +487 -0
  1317. package/src/tools/builtin-names.ts +67 -0
  1318. package/src/tools/checkpoint.ts +137 -0
  1319. package/src/tools/computer/exposure.ts +14 -0
  1320. package/src/tools/computer/protocol.ts +69 -0
  1321. package/src/tools/computer/supervisor.ts +409 -0
  1322. package/src/tools/computer/worker-entry.ts +39 -0
  1323. package/src/tools/computer/worker.ts +745 -0
  1324. package/src/tools/computer-renderer.ts +147 -0
  1325. package/src/tools/computer.ts +222 -0
  1326. package/src/tools/conflict-detect.ts +815 -0
  1327. package/src/tools/context.ts +49 -0
  1328. package/src/tools/debug.ts +1121 -0
  1329. package/src/tools/default-renderer.ts +154 -0
  1330. package/src/tools/essential-tools.ts +46 -0
  1331. package/src/tools/eval-backends.ts +34 -0
  1332. package/src/tools/eval-format/index.ts +24 -0
  1333. package/src/tools/eval-format/javascript.ts +952 -0
  1334. package/src/tools/eval-format/julia.ts +446 -0
  1335. package/src/tools/eval-format/python.ts +544 -0
  1336. package/src/tools/eval-format/ruby.ts +380 -0
  1337. package/src/tools/eval-render.ts +784 -0
  1338. package/src/tools/eval.ts +774 -0
  1339. package/src/tools/fetch.ts +1889 -0
  1340. package/src/tools/file-recorder.ts +35 -0
  1341. package/src/tools/fs-cache-invalidation.ts +28 -0
  1342. package/src/tools/gh-cache-invalidation.ts +175 -0
  1343. package/src/tools/gh-format.ts +12 -0
  1344. package/src/tools/gh-renderer.ts +484 -0
  1345. package/src/tools/gh.ts +3958 -0
  1346. package/src/tools/github-cache.ts +663 -0
  1347. package/src/tools/glob.ts +691 -0
  1348. package/src/tools/grep.ts +1920 -0
  1349. package/src/tools/grouped-file-output.ts +210 -0
  1350. package/src/tools/hub/index.ts +579 -0
  1351. package/src/tools/hub/jobs.ts +714 -0
  1352. package/src/tools/hub/launch.ts +690 -0
  1353. package/src/tools/hub/messaging.ts +735 -0
  1354. package/src/tools/hub/types.ts +117 -0
  1355. package/src/tools/image-gen.ts +1689 -0
  1356. package/src/tools/image-providers.ts +50 -0
  1357. package/src/tools/index.ts +736 -0
  1358. package/src/tools/inspect-image-renderer.ts +133 -0
  1359. package/src/tools/inspect-image.ts +316 -0
  1360. package/src/tools/json-tree.ts +260 -0
  1361. package/src/tools/jtd-to-json-schema.ts +219 -0
  1362. package/src/tools/jtd-to-typescript.ts +136 -0
  1363. package/src/tools/jtd-utils.ts +102 -0
  1364. package/src/tools/learn.ts +141 -0
  1365. package/src/tools/list-limit.ts +40 -0
  1366. package/src/tools/manage-skill.ts +102 -0
  1367. package/src/tools/match-line-format.ts +20 -0
  1368. package/src/tools/memory-edit.ts +61 -0
  1369. package/src/tools/memory-recall.ts +102 -0
  1370. package/src/tools/memory-reflect.ts +88 -0
  1371. package/src/tools/memory-render.ts +211 -0
  1372. package/src/tools/memory-retain.ts +89 -0
  1373. package/src/tools/output-meta.ts +860 -0
  1374. package/src/tools/output-schema-validator.ts +307 -0
  1375. package/src/tools/path-utils.ts +1489 -0
  1376. package/src/tools/plan-mode-guard.ts +155 -0
  1377. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  1378. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  1379. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  1380. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  1381. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  1382. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  1383. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  1384. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  1385. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  1386. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  1387. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  1388. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  1389. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  1390. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  1391. package/src/tools/read.ts +3762 -0
  1392. package/src/tools/render-utils.ts +926 -0
  1393. package/src/tools/renderers.ts +133 -0
  1394. package/src/tools/report-tool-issue.ts +568 -0
  1395. package/src/tools/resolve.ts +423 -0
  1396. package/src/tools/review.ts +103 -0
  1397. package/src/tools/run-scope.ts +417 -0
  1398. package/src/tools/security-scan.ts +287 -0
  1399. package/src/tools/shell-tokenize.ts +213 -0
  1400. package/src/tools/sqlite-reader.ts +884 -0
  1401. package/src/tools/terminal-output.ts +141 -0
  1402. package/src/tools/todo.ts +1226 -0
  1403. package/src/tools/tool-errors.ts +62 -0
  1404. package/src/tools/tool-result.ts +102 -0
  1405. package/src/tools/tool-timeouts.ts +38 -0
  1406. package/src/tools/tts.ts +266 -0
  1407. package/src/tools/vibe.ts +608 -0
  1408. package/src/tools/write.ts +1646 -0
  1409. package/src/tools/xdev.ts +560 -0
  1410. package/src/tools/yield.ts +486 -0
  1411. package/src/tts/downloader.ts +64 -0
  1412. package/src/tts/index.ts +10 -0
  1413. package/src/tts/models.ts +137 -0
  1414. package/src/tts/runtime.ts +21 -0
  1415. package/src/tts/speakable.ts +392 -0
  1416. package/src/tts/speech-enhancer.ts +206 -0
  1417. package/src/tts/streaming-player.ts +120 -0
  1418. package/src/tts/tts-client.ts +475 -0
  1419. package/src/tts/tts-protocol.ts +69 -0
  1420. package/src/tts/tts-worker.ts +434 -0
  1421. package/src/tts/vocalizer.ts +419 -0
  1422. package/src/tts/wav.ts +58 -0
  1423. package/src/tui/code-cell.ts +268 -0
  1424. package/src/tui/file-list.ts +55 -0
  1425. package/src/tui/hyperlink.ts +178 -0
  1426. package/src/tui/index.ts +13 -0
  1427. package/src/tui/output-block.ts +268 -0
  1428. package/src/tui/status-line.ts +54 -0
  1429. package/src/tui/tree-list.ts +172 -0
  1430. package/src/tui/types.ts +15 -0
  1431. package/src/tui/utils.ts +103 -0
  1432. package/src/tui/width-aware-text.ts +58 -0
  1433. package/src/utils/active-repo-context.ts +143 -0
  1434. package/src/utils/block-context.ts +312 -0
  1435. package/src/utils/changelog.ts +373 -0
  1436. package/src/utils/clipboard.ts +361 -0
  1437. package/src/utils/command-args.ts +74 -0
  1438. package/src/utils/commit-message-generator.ts +148 -0
  1439. package/src/utils/cpuprofile.ts +235 -0
  1440. package/src/utils/edit-mode.ts +61 -0
  1441. package/src/utils/enhanced-paste.ts +230 -0
  1442. package/src/utils/event-bus.ts +33 -0
  1443. package/src/utils/external-editor.ts +80 -0
  1444. package/src/utils/fetch-timeout.ts +10 -0
  1445. package/src/utils/file-display-mode.ts +44 -0
  1446. package/src/utils/file-mentions.ts +293 -0
  1447. package/src/utils/git.ts +2472 -0
  1448. package/src/utils/image-loading.ts +236 -0
  1449. package/src/utils/image-resize.ts +420 -0
  1450. package/src/utils/image-vision-fallback.ts +196 -0
  1451. package/src/utils/inspect-image-mode.ts +39 -0
  1452. package/src/utils/ipc.ts +38 -0
  1453. package/src/utils/jj.ts +422 -0
  1454. package/src/utils/lang-from-path.ts +251 -0
  1455. package/src/utils/late-cleanup.ts +17 -0
  1456. package/src/utils/local-date.ts +7 -0
  1457. package/src/utils/mac-file-urls.applescript +37 -0
  1458. package/src/utils/markit-cache.ts +166 -0
  1459. package/src/utils/markit.ts +223 -0
  1460. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1461. package/src/utils/open.ts +126 -0
  1462. package/src/utils/profile-tree.ts +111 -0
  1463. package/src/utils/prompt-path.ts +3 -0
  1464. package/src/utils/qrcode.ts +535 -0
  1465. package/src/utils/sample-profile.ts +437 -0
  1466. package/src/utils/session-color.ts +142 -0
  1467. package/src/utils/shell-snapshot-fn-env.sh +63 -0
  1468. package/src/utils/shell-snapshot.ts +326 -0
  1469. package/src/utils/sixel.ts +69 -0
  1470. package/src/utils/thinking-display.ts +163 -0
  1471. package/src/utils/title-generator.ts +597 -0
  1472. package/src/utils/token-rate.ts +72 -0
  1473. package/src/utils/tool-choice.ts +50 -0
  1474. package/src/utils/tools-manager.ts +411 -0
  1475. package/src/utils/turndown.ts +82 -0
  1476. package/src/utils/zip.ts +1106 -0
  1477. package/src/vibe/runtime.ts +1684 -0
  1478. package/src/vibe/state.ts +4 -0
  1479. package/src/web/kagi.ts +305 -0
  1480. package/src/web/parallel.ts +354 -0
  1481. package/src/web/scrapers/artifacthub.ts +207 -0
  1482. package/src/web/scrapers/arxiv.ts +83 -0
  1483. package/src/web/scrapers/aur.ts +162 -0
  1484. package/src/web/scrapers/biorxiv.ts +133 -0
  1485. package/src/web/scrapers/bluesky.ts +262 -0
  1486. package/src/web/scrapers/brew.ts +172 -0
  1487. package/src/web/scrapers/cheatsh.ts +68 -0
  1488. package/src/web/scrapers/chocolatey.ts +196 -0
  1489. package/src/web/scrapers/choosealicense.ts +95 -0
  1490. package/src/web/scrapers/cisa-kev.ts +87 -0
  1491. package/src/web/scrapers/clojars.ts +154 -0
  1492. package/src/web/scrapers/coingecko.ts +177 -0
  1493. package/src/web/scrapers/crates-io.ts +97 -0
  1494. package/src/web/scrapers/crossref.ts +136 -0
  1495. package/src/web/scrapers/devto.ts +147 -0
  1496. package/src/web/scrapers/discogs.ts +306 -0
  1497. package/src/web/scrapers/discourse.ts +197 -0
  1498. package/src/web/scrapers/dockerhub.ts +138 -0
  1499. package/src/web/scrapers/docs-rs.ts +663 -0
  1500. package/src/web/scrapers/fdroid.ts +134 -0
  1501. package/src/web/scrapers/firefox-addons.ts +191 -0
  1502. package/src/web/scrapers/flathub.ts +223 -0
  1503. package/src/web/scrapers/github-gist.ts +58 -0
  1504. package/src/web/scrapers/github.ts +800 -0
  1505. package/src/web/scrapers/gitlab.ts +401 -0
  1506. package/src/web/scrapers/go-pkg.ts +266 -0
  1507. package/src/web/scrapers/hackage.ts +129 -0
  1508. package/src/web/scrapers/hackernews.ts +189 -0
  1509. package/src/web/scrapers/hex.ts +105 -0
  1510. package/src/web/scrapers/huggingface.ts +321 -0
  1511. package/src/web/scrapers/iacr.ts +89 -0
  1512. package/src/web/scrapers/index.ts +252 -0
  1513. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1514. package/src/web/scrapers/lemmy.ts +203 -0
  1515. package/src/web/scrapers/lobsters.ts +175 -0
  1516. package/src/web/scrapers/mastodon.ts +292 -0
  1517. package/src/web/scrapers/maven.ts +138 -0
  1518. package/src/web/scrapers/mdn.ts +173 -0
  1519. package/src/web/scrapers/metacpan.ts +222 -0
  1520. package/src/web/scrapers/musicbrainz.ts +250 -0
  1521. package/src/web/scrapers/npm.ts +98 -0
  1522. package/src/web/scrapers/nuget.ts +183 -0
  1523. package/src/web/scrapers/nvd.ts +222 -0
  1524. package/src/web/scrapers/ollama.ts +239 -0
  1525. package/src/web/scrapers/open-vsx.ts +106 -0
  1526. package/src/web/scrapers/opencorporates.ts +292 -0
  1527. package/src/web/scrapers/openlibrary.ts +336 -0
  1528. package/src/web/scrapers/orcid.ts +286 -0
  1529. package/src/web/scrapers/osv.ts +176 -0
  1530. package/src/web/scrapers/packagist.ts +160 -0
  1531. package/src/web/scrapers/pub-dev.ts +143 -0
  1532. package/src/web/scrapers/pubmed.ts +211 -0
  1533. package/src/web/scrapers/pypi.ts +112 -0
  1534. package/src/web/scrapers/rawg.ts +110 -0
  1535. package/src/web/scrapers/readthedocs.ts +121 -0
  1536. package/src/web/scrapers/reddit.ts +95 -0
  1537. package/src/web/scrapers/repology.ts +251 -0
  1538. package/src/web/scrapers/rfc.ts +201 -0
  1539. package/src/web/scrapers/rubygems.ts +103 -0
  1540. package/src/web/scrapers/searchcode.ts +189 -0
  1541. package/src/web/scrapers/sec-edgar.ts +261 -0
  1542. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1543. package/src/web/scrapers/snapcraft.ts +187 -0
  1544. package/src/web/scrapers/sourcegraph.ts +336 -0
  1545. package/src/web/scrapers/spdx.ts +108 -0
  1546. package/src/web/scrapers/spotify.ts +198 -0
  1547. package/src/web/scrapers/stackoverflow.ts +120 -0
  1548. package/src/web/scrapers/terraform.ts +277 -0
  1549. package/src/web/scrapers/tldr.ts +47 -0
  1550. package/src/web/scrapers/twitter.ts +94 -0
  1551. package/src/web/scrapers/types.ts +354 -0
  1552. package/src/web/scrapers/utils.ts +109 -0
  1553. package/src/web/scrapers/vimeo.ts +133 -0
  1554. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1555. package/src/web/scrapers/w3c.ts +156 -0
  1556. package/src/web/scrapers/wikidata.ts +344 -0
  1557. package/src/web/scrapers/wikipedia.ts +84 -0
  1558. package/src/web/scrapers/youtube.ts +325 -0
  1559. package/src/web/search/index.ts +393 -0
  1560. package/src/web/search/provider.ts +272 -0
  1561. package/src/web/search/providers/anthropic.ts +406 -0
  1562. package/src/web/search/providers/base.ts +112 -0
  1563. package/src/web/search/providers/brave.ts +181 -0
  1564. package/src/web/search/providers/browser-headers.ts +82 -0
  1565. package/src/web/search/providers/browser-page.ts +125 -0
  1566. package/src/web/search/providers/codex.ts +788 -0
  1567. package/src/web/search/providers/duckduckgo.ts +382 -0
  1568. package/src/web/search/providers/ecosia.ts +183 -0
  1569. package/src/web/search/providers/exa.ts +513 -0
  1570. package/src/web/search/providers/firecrawl.ts +213 -0
  1571. package/src/web/search/providers/gemini.ts +634 -0
  1572. package/src/web/search/providers/google.ts +195 -0
  1573. package/src/web/search/providers/jina.ts +144 -0
  1574. package/src/web/search/providers/kagi.ts +98 -0
  1575. package/src/web/search/providers/kimi.ts +221 -0
  1576. package/src/web/search/providers/mojeek.ts +220 -0
  1577. package/src/web/search/providers/parallel.ts +186 -0
  1578. package/src/web/search/providers/perplexity-auth.ts +142 -0
  1579. package/src/web/search/providers/perplexity.ts +997 -0
  1580. package/src/web/search/providers/public.ts +199 -0
  1581. package/src/web/search/providers/searxng.ts +467 -0
  1582. package/src/web/search/providers/startpage.ts +225 -0
  1583. package/src/web/search/providers/synthetic.ts +126 -0
  1584. package/src/web/search/providers/tavily.ts +244 -0
  1585. package/src/web/search/providers/tinyfish.ts +166 -0
  1586. package/src/web/search/providers/utils.ts +130 -0
  1587. package/src/web/search/providers/xai.ts +372 -0
  1588. package/src/web/search/providers/zai.ts +452 -0
  1589. package/src/web/search/query.ts +850 -0
  1590. package/src/web/search/render.ts +262 -0
  1591. package/src/web/search/types.ts +518 -0
  1592. package/src/web/search/utils.ts +17 -0
  1593. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,1465 @@
1
+ import * as path from "node:path";
2
+ import { isEnoent, logger, postmortem, ptree, untilAborted } from "@oh-my-pi/pi-utils";
3
+ import { MessageFramer } from "../jsonrpc/message-framing";
4
+ import { ToolAbortError, throwIfAborted } from "../tools/tool-errors";
5
+ import { applyWorkspaceEdit } from "./edits";
6
+ import { getLspmuxCommand, isLspmuxSupported } from "./lspmux";
7
+ import { connectSharedLspTransport } from "./mux/daemon";
8
+ import type {
9
+ LspClient,
10
+ LspJsonRpcId,
11
+ LspJsonRpcNotification,
12
+ LspJsonRpcRequest,
13
+ LspJsonRpcResponse,
14
+ LspTransport,
15
+ LspWriteSink,
16
+ PublishDiagnosticsParams,
17
+ ServerConfig,
18
+ WorkspaceEdit,
19
+ } from "./types";
20
+ import { detectLanguageId, EquivalentUriMap, fileToUri } from "./utils";
21
+
22
+ // =============================================================================
23
+ // Client State
24
+ // =============================================================================
25
+
26
+ const clients = new Map<string, LspClient>();
27
+ const clientLocks = new Map<string, Promise<LspClient>>();
28
+ const fileOperationLocks = new Map<string, Promise<void>>();
29
+
30
+ /** Negative cache of recent init failures so a broken server fails fast instead of re-spawning per call. */
31
+ const INIT_FAILURE_BACKOFF_MS = 3 * 60 * 1000;
32
+ const initFailures = new Map<string, { at: number; message: string }>();
33
+ const READER_EXIT_GRACE_MS = 100;
34
+
35
+ // Idle timeout configuration (disabled by default)
36
+ let idleTimeoutMs: number | null = null;
37
+ let idleCheckInterval: NodeJS.Timeout | null = null;
38
+ const IDLE_CHECK_INTERVAL_MS = 60 * 1000;
39
+
40
+ // Broker-shared server mode (one language server per project shared by every
41
+ // omp instance through the LSP mux daemon). Off by default so embedders and
42
+ // tests that drive getOrCreateClient directly never touch the daemon broker;
43
+ // the SDK turns it on from the `lsp.shared` setting at session creation.
44
+ let sharedLspEnabled = false;
45
+
46
+ /** Enable or disable attaching to broker-shared language servers. */
47
+ export function setSharedLspEnabled(enabled: boolean): void {
48
+ sharedLspEnabled = enabled;
49
+ }
50
+
51
+ /**
52
+ * Configure the idle timeout for LSP clients.
53
+ * @param ms - Timeout in milliseconds, or null/undefined to disable
54
+ */
55
+ export function setIdleTimeout(ms: number | null | undefined): void {
56
+ idleTimeoutMs = ms ?? null;
57
+
58
+ if (idleTimeoutMs && idleTimeoutMs > 0) {
59
+ startIdleChecker();
60
+ } else {
61
+ stopIdleChecker();
62
+ }
63
+ }
64
+
65
+ function startIdleChecker(): void {
66
+ if (idleCheckInterval) return;
67
+ idleCheckInterval = setInterval(() => {
68
+ if (!idleTimeoutMs) return;
69
+ const now = Date.now();
70
+ for (const [key, client] of Array.from(clients.entries())) {
71
+ if (now - client.lastActivity > idleTimeoutMs) {
72
+ void shutdownClient(key);
73
+ }
74
+ }
75
+ }, IDLE_CHECK_INTERVAL_MS);
76
+ }
77
+
78
+ function stopIdleChecker(): void {
79
+ if (idleCheckInterval) {
80
+ clearInterval(idleCheckInterval);
81
+ idleCheckInterval = null;
82
+ }
83
+ }
84
+
85
+ // =============================================================================
86
+ // Client Capabilities
87
+ // =============================================================================
88
+
89
+ const CLIENT_CAPABILITIES = {
90
+ textDocument: {
91
+ synchronization: {
92
+ didSave: true,
93
+ dynamicRegistration: false,
94
+ willSave: false,
95
+ willSaveWaitUntil: false,
96
+ },
97
+ hover: {
98
+ contentFormat: ["markdown", "plaintext"],
99
+ dynamicRegistration: false,
100
+ },
101
+ definition: {
102
+ dynamicRegistration: false,
103
+ linkSupport: true,
104
+ },
105
+ typeDefinition: {
106
+ dynamicRegistration: false,
107
+ linkSupport: true,
108
+ },
109
+ implementation: {
110
+ dynamicRegistration: false,
111
+ linkSupport: true,
112
+ },
113
+ references: {
114
+ dynamicRegistration: false,
115
+ },
116
+ documentSymbol: {
117
+ dynamicRegistration: false,
118
+ hierarchicalDocumentSymbolSupport: true,
119
+ symbolKind: {
120
+ valueSet: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
121
+ },
122
+ },
123
+ rename: {
124
+ dynamicRegistration: false,
125
+ prepareSupport: true,
126
+ },
127
+ codeAction: {
128
+ dynamicRegistration: false,
129
+ codeActionLiteralSupport: {
130
+ codeActionKind: {
131
+ valueSet: [
132
+ "quickfix",
133
+ "refactor",
134
+ "refactor.extract",
135
+ "refactor.inline",
136
+ "refactor.rewrite",
137
+ "source",
138
+ "source.organizeImports",
139
+ "source.fixAll",
140
+ ],
141
+ },
142
+ },
143
+ resolveSupport: {
144
+ properties: ["edit"],
145
+ },
146
+ },
147
+ formatting: {
148
+ dynamicRegistration: false,
149
+ },
150
+ rangeFormatting: {
151
+ dynamicRegistration: false,
152
+ },
153
+ publishDiagnostics: {
154
+ relatedInformation: true,
155
+ versionSupport: true,
156
+ tagSupport: { valueSet: [1, 2] },
157
+ codeDescriptionSupport: true,
158
+ dataSupport: true,
159
+ },
160
+ diagnostic: {
161
+ dynamicRegistration: true,
162
+ },
163
+ },
164
+ window: {
165
+ workDoneProgress: true,
166
+ },
167
+ workspace: {
168
+ applyEdit: true,
169
+ workspaceEdit: {
170
+ documentChanges: true,
171
+ resourceOperations: ["create", "rename", "delete"],
172
+ failureHandling: "textOnlyTransactional",
173
+ },
174
+ configuration: true,
175
+ workspaceFolders: true,
176
+ symbol: {
177
+ dynamicRegistration: false,
178
+ symbolKind: {
179
+ valueSet: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
180
+ },
181
+ },
182
+ fileOperations: {
183
+ dynamicRegistration: false,
184
+ willCreate: false,
185
+ didCreate: false,
186
+ willRename: true,
187
+ didRename: true,
188
+ willDelete: false,
189
+ didDelete: false,
190
+ },
191
+ },
192
+ experimental: {
193
+ snippetTextEdit: true,
194
+ },
195
+ };
196
+
197
+ /** LSP `FileChangeType` values for workspace/didChangeWatchedFiles notifications. */
198
+ export enum FileChangeType {
199
+ Created = 1,
200
+ Changed = 2,
201
+ Deleted = 3,
202
+ }
203
+
204
+ /** Filesystem change authored by the harness and announced to active LSP clients. */
205
+ export interface WatchedFileChange {
206
+ filePath: string;
207
+ type: FileChangeType;
208
+ }
209
+
210
+ // =============================================================================
211
+ // LSP Message Protocol
212
+ // =============================================================================
213
+
214
+ function abortReason(signal: AbortSignal): Error {
215
+ return signal.reason instanceof Error ? signal.reason : new ToolAbortError();
216
+ }
217
+
218
+ class LspDrainAbortError extends Error {
219
+ constructor(readonly reason: Error) {
220
+ super(reason.message);
221
+ this.name = "LspDrainAbortError";
222
+ }
223
+ }
224
+
225
+ async function writeMessage(
226
+ sink: LspWriteSink,
227
+ message: LspJsonRpcRequest | LspJsonRpcNotification | LspJsonRpcResponse,
228
+ signal?: AbortSignal,
229
+ ): Promise<void> {
230
+ if (signal?.aborted) {
231
+ throw abortReason(signal);
232
+ }
233
+ const content = JSON.stringify(message);
234
+ const write = Promise.resolve(
235
+ sink.write(`Content-Length: ${Buffer.byteLength(content, "utf-8")}\r\n\r\n${content}`),
236
+ );
237
+ // Attach before flush(): it may throw synchronously after write() returned a
238
+ // rejected Promise, and leaving that rejection unobserved kills the host.
239
+ void write.catch(() => {});
240
+ const drain = Promise.all([write, Promise.resolve(sink.flush())]).then(() => {});
241
+ if (!signal) {
242
+ await drain;
243
+ return;
244
+ }
245
+ // Either sink operation can block on the OS-level pipe drain when a live
246
+ // server stops reading stdin. Race the combined drain against the caller's
247
+ // signal so a wedged server surfaces as the tool's normal timeout/cancel.
248
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
249
+ const onAbort = () => {
250
+ signal.removeEventListener("abort", onAbort);
251
+ // The underlying drain stays pending in the background; suppress its
252
+ // eventual settlement so we do not surface an unhandled rejection.
253
+ drain.catch(() => {});
254
+ reject(new LspDrainAbortError(abortReason(signal)));
255
+ };
256
+ signal.addEventListener("abort", onAbort, { once: true });
257
+ drain.then(
258
+ () => {
259
+ signal.removeEventListener("abort", onAbort);
260
+ resolve();
261
+ },
262
+ (err: unknown) => {
263
+ signal.removeEventListener("abort", onAbort);
264
+ reject(err);
265
+ },
266
+ );
267
+ await promise;
268
+ }
269
+
270
+ /**
271
+ * Kill a client whose write queue is stuck (an aborted drain left a sink
272
+ * operation pending, so subsequent writes queue behind the wedge forever).
273
+ * Remove it from `clients` immediately so concurrent `getOrCreateClient`
274
+ * callers do not grab the corpse before `proc.exited` cleans up.
275
+ */
276
+ function teardownWedgedClient(client: LspClient): void {
277
+ if (clients.get(client.name) === client) clients.delete(client.name);
278
+ try {
279
+ client.proc.kill();
280
+ } catch {
281
+ // process already gone or unkillable — the exit handler will finish cleanup.
282
+ }
283
+ }
284
+
285
+ function queueWriteMessage(
286
+ client: LspClient,
287
+ message: LspJsonRpcRequest | LspJsonRpcNotification | LspJsonRpcResponse,
288
+ signal?: AbortSignal,
289
+ ): Promise<void> {
290
+ const write = client.writeQueue.catch(() => {}).then(() => writeMessage(client.proc.stdin, message, signal));
291
+ const result = write.catch((err: unknown) => {
292
+ if (err instanceof LspDrainAbortError) {
293
+ // Only an abort that raced this write's in-flight drain leaves
294
+ // the sink pending. Pre-write aborts and queued caller timeouts
295
+ // must not kill a healthy shared client.
296
+ teardownWedgedClient(client);
297
+ throw err.reason;
298
+ }
299
+ throw err;
300
+ });
301
+ client.writeQueue = result.catch(() => {});
302
+ return result;
303
+ }
304
+
305
+ // =============================================================================
306
+ // Message Reader
307
+ // =============================================================================
308
+
309
+ /**
310
+ * Start background message reader for a client.
311
+ * Routes responses to pending requests and handles notifications.
312
+ */
313
+ async function startMessageReader(client: LspClient): Promise<void> {
314
+ if (client.isReading) return;
315
+ client.isReading = true;
316
+
317
+ const reader = (client.proc.stdout as ReadableStream<Uint8Array>).getReader();
318
+
319
+ const framer = new MessageFramer(Buffer.from(client.messageBuffer));
320
+
321
+ let readerFailed = false;
322
+ try {
323
+ while (true) {
324
+ const { done, value } = await reader.read();
325
+ if (done) break;
326
+
327
+ framer.push(Buffer.from(value));
328
+
329
+ // Drain every complete message currently buffered.
330
+ for (const messageText of framer.drain(headerText => {
331
+ // Non-protocol bytes on stdout (e.g. a wrapper script printing).
332
+ // Drop past the bogus terminator and resync instead of stalling
333
+ // on the same junk header forever.
334
+ logger.warn("LSP framing resync: header block without Content-Length", {
335
+ server: client.name,
336
+ header: headerText.slice(0, 200),
337
+ });
338
+ })) {
339
+ // A malformed message or a throwing server-request handler must not
340
+ // kill the reader — later messages are still well-framed.
341
+ try {
342
+ const message: LspJsonRpcResponse | LspJsonRpcNotification = JSON.parse(messageText);
343
+
344
+ // Route message. A JSON-RPC message carrying a `method` is always
345
+ // server-originated: a request when it also has an `id`, a
346
+ // notification otherwise. A message with only an `id` is a response
347
+ // to one of our requests. Disambiguate on `method` FIRST: a
348
+ // server's request ids live in its own id space and routinely
349
+ // collide with our in-flight client request ids (e.g. a
350
+ // basedpyright `workspace/configuration` pull arriving while a
351
+ // `documentSymbol` request with the same id is pending). Matching
352
+ // pending requests first would swallow that pull as a bogus
353
+ // response -- dropping the config answer the server blocks on and
354
+ // resolving our request with `undefined`, wedging the lazy
355
+ // cold-start handshake (#3001).
356
+ if ("method" in message) {
357
+ if ("id" in message && message.id !== undefined) {
358
+ // Server-initiated request: must be answered.
359
+ await handleServerRequest(client, message as LspJsonRpcRequest);
360
+ } else {
361
+ // Server notification
362
+ if (message.method === "textDocument/publishDiagnostics" && message.params) {
363
+ const params = message.params as PublishDiagnosticsParams;
364
+ client.diagnostics.set(params.uri, {
365
+ diagnostics: params.diagnostics,
366
+ version: params.version ?? null,
367
+ });
368
+ client.diagnosticsVersion += 1;
369
+ } else if (message.method === "$/progress" && message.params) {
370
+ const params = message.params as { token: string | number; value?: { kind?: string } };
371
+ if (params.value?.kind === "begin") {
372
+ client.activeProgressTokens.add(params.token);
373
+ } else if (params.value?.kind === "end") {
374
+ client.activeProgressTokens.delete(params.token);
375
+ if (client.activeProgressTokens.size === 0) {
376
+ client.resolveProjectLoaded();
377
+ }
378
+ }
379
+ }
380
+ }
381
+ } else if ("id" in message && message.id !== undefined) {
382
+ // Response to one of our requests.
383
+ const pending = client.pendingRequests.get(message.id);
384
+ if (pending) {
385
+ client.pendingRequests.delete(message.id);
386
+ if ("error" in message && message.error) {
387
+ // Include the JSON-RPC error code: `isMethodNotFoundError` matches
388
+ // `-32601` by substring, so method-not-found is recognized even when
389
+ // the server's message text is nonstandard (e.g. "Unknown request").
390
+ const code = message.error.code;
391
+ pending.reject(
392
+ new Error(
393
+ `LSP error${typeof code === "number" ? ` ${code}` : ""}: ${message.error.message}`,
394
+ ),
395
+ );
396
+ } else {
397
+ pending.resolve(message.result);
398
+ }
399
+ }
400
+ }
401
+ } catch (err) {
402
+ logger.warn("LSP message handling failed", {
403
+ server: client.name,
404
+ error: err instanceof Error ? err.message : String(err),
405
+ });
406
+ }
407
+ }
408
+ }
409
+ } catch (err) {
410
+ readerFailed = true;
411
+ // Connection closed or error - reject all pending requests
412
+ for (const pending of Array.from(client.pendingRequests.values())) {
413
+ pending.reject(new Error(`LSP connection closed: ${err}`));
414
+ }
415
+ client.pendingRequests.clear();
416
+ } finally {
417
+ // Persist any unparsed remainder so a restarted reader resumes mid-message.
418
+ client.messageBuffer = framer.remainder();
419
+ reader.releaseLock();
420
+ client.isReading = false;
421
+ if (!readerFailed && client.proc.exitCode === null) {
422
+ await waitForExit(client, READER_EXIT_GRACE_MS);
423
+ }
424
+ // Reader exited while the server process is still alive (unrecoverable
425
+ // read error or bad stream state): nothing will route responses anymore,
426
+ // so tear the client down — the next call respawns instead of timing out.
427
+ if (client.proc.exitCode === null) {
428
+ client.status = "error";
429
+ if (clients.get(client.name) === client) {
430
+ clients.delete(client.name);
431
+ }
432
+ const teardownErr = new Error("LSP reader stopped; client torn down");
433
+ for (const pending of client.pendingRequests.values()) {
434
+ pending.reject(teardownErr);
435
+ }
436
+ client.pendingRequests.clear();
437
+ client.resolveProjectLoaded();
438
+ client.proc.kill();
439
+ }
440
+ }
441
+ }
442
+
443
+ /**
444
+ * Build the workspace folder list advertised to the server. Identical shape
445
+ * for `initialize` params and `workspace/workspaceFolders` server requests.
446
+ */
447
+ function currentWorkspaceFolders(client: LspClient): Array<{ uri: string; name: string }> {
448
+ return [{ uri: fileToUri(client.cwd), name: path.basename(client.cwd) || "workspace" }];
449
+ }
450
+
451
+ /**
452
+ * Handle workspace/workspaceFolders requests from the server.
453
+ */
454
+ async function handleWorkspaceFoldersRequest(client: LspClient, message: LspJsonRpcRequest): Promise<void> {
455
+ await sendResponse(client, message.id, currentWorkspaceFolders(client), "workspace/workspaceFolders");
456
+ }
457
+
458
+ /**
459
+ * Handle workspace/configuration requests from the server.
460
+ */
461
+ async function handleConfigurationRequest(client: LspClient, message: LspJsonRpcRequest): Promise<void> {
462
+ const params = message.params as { items?: Array<{ section?: string }> };
463
+ const items = params?.items ?? [];
464
+ const result = items.map(item => {
465
+ const section = item.section ?? "";
466
+ return client.config.settings?.[section] ?? null;
467
+ });
468
+ await sendResponse(client, message.id, result, "workspace/configuration");
469
+ }
470
+
471
+ /**
472
+ * Handle workspace/applyEdit requests from the server.
473
+ */
474
+ async function handleApplyEditRequest(client: LspClient, message: LspJsonRpcRequest): Promise<void> {
475
+ const params = message.params as { edit?: WorkspaceEdit };
476
+ if (!params?.edit) {
477
+ await sendResponse(
478
+ client,
479
+ message.id,
480
+ { applied: false, failureReason: "No edit provided" },
481
+ "workspace/applyEdit",
482
+ );
483
+ return;
484
+ }
485
+
486
+ try {
487
+ await applyWorkspaceEdit(params.edit, client.cwd);
488
+ await sendResponse(client, message.id, { applied: true }, "workspace/applyEdit");
489
+ } catch (err) {
490
+ await sendResponse(client, message.id, { applied: false, failureReason: String(err) }, "workspace/applyEdit");
491
+ }
492
+ }
493
+
494
+ interface DynamicCapabilityRegistration {
495
+ id?: unknown;
496
+ method?: unknown;
497
+ }
498
+
499
+ interface DynamicCapabilityParams {
500
+ registrations?: DynamicCapabilityRegistration[];
501
+ unregisterations?: DynamicCapabilityRegistration[];
502
+ unregistrations?: DynamicCapabilityRegistration[];
503
+ }
504
+
505
+ function updateDynamicCapabilities(client: LspClient, message: LspJsonRpcRequest): void {
506
+ const params = message.params as DynamicCapabilityParams;
507
+ if (message.method === "client/registerCapability") {
508
+ if (!Array.isArray(params.registrations)) return;
509
+ let registrations = client.dynamicCapabilityRegistrations;
510
+ if (!registrations) {
511
+ registrations = new Map();
512
+ client.dynamicCapabilityRegistrations = registrations;
513
+ }
514
+ for (const registration of params.registrations) {
515
+ if (typeof registration.id === "string" && typeof registration.method === "string") {
516
+ registrations.set(registration.id, registration.method);
517
+ }
518
+ }
519
+ return;
520
+ }
521
+
522
+ const registrations = client.dynamicCapabilityRegistrations;
523
+ if (!registrations) return;
524
+ const unregistrations = params.unregisterations ?? params.unregistrations;
525
+ if (!Array.isArray(unregistrations)) return;
526
+ for (const registration of unregistrations) {
527
+ if (typeof registration.id === "string") {
528
+ registrations.delete(registration.id);
529
+ }
530
+ }
531
+ }
532
+
533
+ /** Whether the server advertised LSP 3.17 document diagnostic pulls statically or through registration. */
534
+ export function supportsDocumentDiagnostics(client: LspClient): boolean {
535
+ const staticProvider = client.serverCapabilities?.diagnosticProvider;
536
+ if (staticProvider) return true;
537
+
538
+ const registrations = client.dynamicCapabilityRegistrations;
539
+ if (!registrations) return false;
540
+ for (const method of registrations.values()) {
541
+ if (method === "textDocument/diagnostic") return true;
542
+ }
543
+ return false;
544
+ }
545
+
546
+ /**
547
+ * Respond to a server-initiated request.
548
+ */
549
+ async function handleServerRequest(client: LspClient, message: LspJsonRpcRequest): Promise<void> {
550
+ if (message.method === "workspace/configuration") {
551
+ await handleConfigurationRequest(client, message);
552
+ return;
553
+ }
554
+ if (message.method === "workspace/workspaceFolders") {
555
+ await handleWorkspaceFoldersRequest(client, message);
556
+ return;
557
+ }
558
+ if (message.method === "workspace/applyEdit") {
559
+ await handleApplyEditRequest(client, message);
560
+ return;
561
+ }
562
+ if (message.method === "window/workDoneProgress/create") {
563
+ // Accept progress token registration from the server.
564
+ await sendResponse(client, message.id, null, message.method);
565
+ return;
566
+ }
567
+ if (message.method === "client/registerCapability" || message.method === "client/unregisterCapability") {
568
+ updateDynamicCapabilities(client, message);
569
+ // Some servers block semantic requests until dynamic registration succeeds.
570
+ await sendResponse(client, message.id, null, message.method);
571
+ return;
572
+ }
573
+ if (message.method === "window/showMessageRequest") {
574
+ // Headless: no UI to surface the prompt. Spec says null = "no action selected".
575
+ await sendResponse(client, message.id, null, message.method);
576
+ return;
577
+ }
578
+ if (message.method === "window/showDocument") {
579
+ // Headless: nothing to display. Spec result is `{ success: boolean }`.
580
+ await sendResponse(client, message.id, { success: false }, message.method);
581
+ return;
582
+ }
583
+ if (
584
+ message.method === "workspace/semanticTokens/refresh" ||
585
+ message.method === "workspace/inlayHint/refresh" ||
586
+ message.method === "workspace/codeLens/refresh" ||
587
+ message.method === "workspace/codeAction/refresh" ||
588
+ message.method === "workspace/inlineValue/refresh" ||
589
+ message.method === "workspace/foldingRange/refresh" ||
590
+ message.method === "workspace/diagnostic/refresh"
591
+ ) {
592
+ // Void acknowledgement per spec; servers that stall waiting for a reply
593
+ // (same failure mode as the dynamic-registration hang in #3029) move on.
594
+ await sendResponse(client, message.id, null, message.method);
595
+ return;
596
+ }
597
+ await sendResponse(client, message.id, null, message.method, {
598
+ code: -32601,
599
+ message: `Method not found: ${message.method}`,
600
+ });
601
+ }
602
+
603
+ /**
604
+ * Send an LSP response to the server.
605
+ */
606
+ async function sendResponse(
607
+ client: LspClient,
608
+ id: LspJsonRpcId,
609
+ result: unknown,
610
+ method: string,
611
+ error?: { code: number; message: string; data?: unknown },
612
+ ): Promise<void> {
613
+ const response: LspJsonRpcResponse = {
614
+ jsonrpc: "2.0",
615
+ id,
616
+ ...(error ? { error } : { result }),
617
+ };
618
+
619
+ try {
620
+ await queueWriteMessage(client, response);
621
+ } catch (err) {
622
+ logger.error("LSP failed to respond.", { method, error: String(err) });
623
+ }
624
+ }
625
+
626
+ // =============================================================================
627
+ // Client Management
628
+ // =============================================================================
629
+
630
+ /** Timeout for warmup initialize requests (5 seconds) */
631
+ export const WARMUP_TIMEOUT_MS = 5000;
632
+
633
+ /** Max time to poll rust-analyzer after progress ends but before Cargo workspaces are ready. */
634
+ const RUST_ANALYZER_WORKSPACE_READY_TIMEOUT_MS = 5_000;
635
+ const RUST_ANALYZER_WORKSPACE_READY_POLL_MS = 100;
636
+ const RUST_ANALYZER_WORKSPACE_READY_SETTLE_MS = 2_000;
637
+ const RUST_ANALYZER_STATUS_REQUEST_TIMEOUT_MS = 1_000;
638
+ const rustAnalyzerReadyClients = new WeakSet<LspClient>();
639
+
640
+ function commandBasename(command: string): string {
641
+ const slash = command.lastIndexOf("/");
642
+ const backslash = command.lastIndexOf("\\");
643
+ const separator = Math.max(slash, backslash);
644
+ return separator === -1 ? command : command.slice(separator + 1);
645
+ }
646
+
647
+ function isRustAnalyzerClient(client: LspClient): boolean {
648
+ return (
649
+ commandBasename(client.config.command) === "rust-analyzer" ||
650
+ (client.config.resolvedCommand ? commandBasename(client.config.resolvedCommand) === "rust-analyzer" : false)
651
+ );
652
+ }
653
+
654
+ function isRustAnalyzerStatusTimeout(err: unknown): boolean {
655
+ return err instanceof Error && err.message.startsWith("LSP request rust-analyzer/analyzerStatus timed out after ");
656
+ }
657
+
658
+ async function waitForRustAnalyzerWorkspace(client: LspClient, signal?: AbortSignal): Promise<void> {
659
+ if (rustAnalyzerReadyClients.has(client)) {
660
+ return;
661
+ }
662
+ const timings = client.config.workspaceReadyTimings;
663
+ const timeoutMs = timings?.timeoutMs ?? RUST_ANALYZER_WORKSPACE_READY_TIMEOUT_MS;
664
+ const pollMs = timings?.pollMs ?? RUST_ANALYZER_WORKSPACE_READY_POLL_MS;
665
+ const settleMs = timings?.settleMs ?? RUST_ANALYZER_WORKSPACE_READY_SETTLE_MS;
666
+ const statusRequestTimeoutMs = timings?.statusRequestTimeoutMs ?? RUST_ANALYZER_STATUS_REQUEST_TIMEOUT_MS;
667
+ const started = Date.now();
668
+ const deadline = started + timeoutMs;
669
+ while (true) {
670
+ throwIfAborted(signal);
671
+ let status: unknown;
672
+ try {
673
+ status = await sendRequest(client, "rust-analyzer/analyzerStatus", {}, signal, statusRequestTimeoutMs);
674
+ } catch (err) {
675
+ if (!isRustAnalyzerStatusTimeout(err) || Date.now() >= deadline) {
676
+ return;
677
+ }
678
+ await Bun.sleep(pollMs);
679
+ continue;
680
+ }
681
+ const ready = typeof status === "string" && !status.startsWith("No workspaces");
682
+ if (ready && Date.now() - started >= settleMs) {
683
+ rustAnalyzerReadyClients.add(client);
684
+ return;
685
+ }
686
+ if (Date.now() >= deadline) {
687
+ return;
688
+ }
689
+ await Bun.sleep(pollMs);
690
+ }
691
+ }
692
+
693
+ const PROJECT_LOAD_TIMEOUT_MS = 15_000;
694
+
695
+ /** Max time to wait for graceful LSP shutdown and process exit. */
696
+ const SHUTDOWN_TIMEOUT_MS = 5_000;
697
+ const EXIT_TIMEOUT_MS = 1_000;
698
+
699
+ function clientKey(config: ServerConfig, cwd: string): string {
700
+ return `${config.command}:${cwd}`;
701
+ }
702
+
703
+ /** Allow an explicit user reload to retry a matching initialization failure immediately. */
704
+ export function clearInitializationFailure(config: ServerConfig, cwd: string): void {
705
+ initFailures.delete(clientKey(config, cwd));
706
+ }
707
+
708
+ /**
709
+ * Get or create an LSP client for the given server configuration and working directory.
710
+ * @param config - Server configuration
711
+ * @param cwd - Working directory
712
+ * @param initTimeoutMs - Optional hard deadline for the initialize handshake (warmup / other
713
+ * short-lived callers). When set it takes precedence over `signal` inside `sendRequest`.
714
+ * @param signal - Optional caller abort signal. Threaded into the initialize `sendRequest`
715
+ * and the `initialized` notification so a wedged server surfaces the caller's
716
+ * timeout/cancel instead of falling back to the internal 30s default.
717
+ */
718
+ export async function getOrCreateClient(
719
+ config: ServerConfig,
720
+ cwd: string,
721
+ initTimeoutMs?: number,
722
+ signal?: AbortSignal,
723
+ ): Promise<LspClient> {
724
+ const key = clientKey(config, cwd);
725
+
726
+ // Check if client already exists
727
+ const existingClient = clients.get(key);
728
+ if (existingClient) {
729
+ existingClient.lastActivity = Date.now();
730
+ return existingClient;
731
+ }
732
+
733
+ // Check if another coroutine is already creating this client
734
+ const existingLock = clientLocks.get(key);
735
+ if (existingLock) {
736
+ return existingLock;
737
+ }
738
+
739
+ // Fail fast on a recent deterministic init failure instead of re-spawning
740
+ // a broken server (and paying its full init wait) on every call.
741
+ const recentFailure = initFailures.get(key);
742
+ if (recentFailure) {
743
+ if (Date.now() - recentFailure.at < INIT_FAILURE_BACKOFF_MS) {
744
+ throw new Error(`LSP server ${config.command} failed to initialize recently: ${recentFailure.message}`);
745
+ }
746
+ initFailures.delete(key);
747
+ }
748
+
749
+ // Create new client with lock
750
+ const clientPromise = (async () => {
751
+ const baseCommand = config.resolvedCommand ?? config.command;
752
+ const baseArgs = config.args ?? [];
753
+
754
+ // Wrap with lspmux if available and supported
755
+ const { command, args, env } = isLspmuxSupported(baseCommand)
756
+ ? await getLspmuxCommand(baseCommand, baseArgs)
757
+ : { command: baseCommand, args: baseArgs };
758
+
759
+ // Prefer the broker-shared server unless an external lspmux wrapper is
760
+ // already multiplexing this command. Any shared-path failure falls back
761
+ // to a private spawn so LSP never regresses on broker trouble.
762
+ let proc: LspTransport | null = null;
763
+ if (sharedLspEnabled && command === baseCommand) {
764
+ proc = await connectSharedLspTransport({ command, args, cwd, env, signal });
765
+ }
766
+ proc ??= ptree.spawn([command, ...args], {
767
+ cwd,
768
+ stdin: "pipe",
769
+ env: env ? { ...Bun.env, ...env } : undefined,
770
+ });
771
+
772
+ let resolveProjectLoaded!: () => void;
773
+ const projectLoaded = new Promise<void>(resolve => {
774
+ resolveProjectLoaded = resolve;
775
+ });
776
+ // Auto-resolve after timeout in case server doesn't use progress tokens
777
+ const projectLoadTimeout = setTimeout(resolveProjectLoaded, PROJECT_LOAD_TIMEOUT_MS);
778
+ const originalResolve = resolveProjectLoaded;
779
+ resolveProjectLoaded = () => {
780
+ clearTimeout(projectLoadTimeout);
781
+ originalResolve();
782
+ };
783
+
784
+ const client: LspClient = {
785
+ name: key,
786
+ cwd,
787
+ proc,
788
+ config,
789
+ requestId: 0,
790
+ diagnostics: new EquivalentUriMap(),
791
+ diagnosticsVersion: 0,
792
+ dynamicCapabilityRegistrations: new Map(),
793
+ openFiles: new Map(),
794
+ pendingRequests: new Map(),
795
+ messageBuffer: new Uint8Array(0),
796
+ isReading: false,
797
+ status: "connecting",
798
+ lastActivity: Date.now(),
799
+ writeQueue: Promise.resolve(),
800
+ activeProgressTokens: new Set(),
801
+ projectLoaded,
802
+ resolveProjectLoaded,
803
+ };
804
+
805
+ // Register crash recovery - remove client on process exit
806
+ proc.exited.then(() => {
807
+ if (clients.get(key) === client) clients.delete(key);
808
+ if (clientLocks.get(key) === clientPromise) clientLocks.delete(key);
809
+ client.resolveProjectLoaded();
810
+
811
+ // Reject any pending requests — the server is gone, they will never complete.
812
+ if (client.pendingRequests.size > 0) {
813
+ // Strip informational log lines (e.g. marksman's [INF]/[DBG] prefix)
814
+ // — they are startup noise, not actionable errors.
815
+ const rawStderr = proc.peekStderr().trim();
816
+ const stderr = rawStderr
817
+ .split("\n")
818
+ .filter(line => !/^\[\d{2}:\d{2}:\d{2} (?:INF|DBG|VRB)\]/.test(line))
819
+ .join("\n")
820
+ .trim();
821
+ const code = proc.exitCode;
822
+ const err = new Error(
823
+ stderr ? `LSP server exited (code ${code}): ${stderr}` : `LSP server exited unexpectedly (code ${code})`,
824
+ );
825
+ for (const pending of client.pendingRequests.values()) {
826
+ pending.reject(err);
827
+ }
828
+ client.pendingRequests.clear();
829
+ }
830
+ });
831
+
832
+ // Start background message reader
833
+ startMessageReader(client);
834
+
835
+ try {
836
+ // Send initialize request
837
+ const initResult = (await sendRequest(
838
+ client,
839
+ "initialize",
840
+ {
841
+ processId: process.pid,
842
+ rootUri: fileToUri(cwd),
843
+ rootPath: cwd,
844
+ capabilities: CLIENT_CAPABILITIES,
845
+ initializationOptions: config.initOptions ?? {},
846
+ workspaceFolders: currentWorkspaceFolders(client),
847
+ },
848
+ signal,
849
+ initTimeoutMs,
850
+ )) as { capabilities?: unknown };
851
+
852
+ if (!initResult) {
853
+ throw new Error("Failed to initialize LSP: no response");
854
+ }
855
+
856
+ client.serverCapabilities = initResult.capabilities as LspClient["serverCapabilities"];
857
+
858
+ // Finish the initialize handshake before publishing the client as ready.
859
+ await sendNotification(client, "initialized", {}, signal);
860
+ await sendNotification(
861
+ client,
862
+ "workspace/didChangeConfiguration",
863
+ { settings: config.settings ?? {} },
864
+ signal,
865
+ );
866
+
867
+ client.status = "ready";
868
+ // Publish only after init succeeds: pre-init clients are reachable
869
+ // solely through clientLocks, so concurrent callers (warmup vs first
870
+ // tool call) wait for init instead of using an unacknowledged client.
871
+ clients.set(key, client);
872
+ initFailures.delete(key);
873
+ return client;
874
+ } catch (err) {
875
+ // Clean up on initialization failure
876
+ client.status = "error";
877
+ if (clients.get(key) === client) clients.delete(key);
878
+ proc.kill();
879
+ const message = err instanceof Error ? err.message : String(err);
880
+ // Negative-cache deterministic failures. Timeouts under a
881
+ // caller-shortened deadline (warmup/writethrough) and caller-signal
882
+ // aborts are transient — the server may simply be slow or the user may
883
+ // have cancelled, so a later call with a fresh deadline should retry.
884
+ if (!signal?.aborted && !(initTimeoutMs !== undefined && message.includes("timed out"))) {
885
+ initFailures.set(key, { at: Date.now(), message });
886
+ }
887
+ throw err;
888
+ } finally {
889
+ clientLocks.delete(key);
890
+ }
891
+ })();
892
+
893
+ clientLocks.set(key, clientPromise);
894
+ return clientPromise;
895
+ }
896
+
897
+ /** Return an active or already-starting client without starting a language server. */
898
+ export async function getActiveOrPendingClient(
899
+ config: ServerConfig,
900
+ cwd: string,
901
+ signal?: AbortSignal,
902
+ ): Promise<LspClient | undefined> {
903
+ throwIfAborted(signal);
904
+ const client = clients.get(clientKey(config, cwd));
905
+ if (client) {
906
+ client.lastActivity = Date.now();
907
+ return client;
908
+ }
909
+
910
+ const pending = clientLocks.get(clientKey(config, cwd));
911
+ if (!pending) return undefined;
912
+ try {
913
+ return await untilAborted(signal, pending);
914
+ } catch {
915
+ throwIfAborted(signal);
916
+ return undefined;
917
+ }
918
+ }
919
+
920
+ /**
921
+ * Ensure a file is opened in the LSP client.
922
+ * Sends didOpen notification if the file is not already tracked.
923
+ */
924
+ export async function ensureFileOpen(client: LspClient, filePath: string, signal?: AbortSignal): Promise<void> {
925
+ throwIfAborted(signal);
926
+ const uri = fileToUri(filePath);
927
+ const lockKey = `${client.name}:${uri}`;
928
+
929
+ // Check if file is already open
930
+ if (client.openFiles.has(uri)) {
931
+ return;
932
+ }
933
+
934
+ // Check if another operation is already opening this file
935
+ const existingLock = fileOperationLocks.get(lockKey);
936
+ if (existingLock) {
937
+ await untilAborted(signal, () => existingLock);
938
+ return;
939
+ }
940
+
941
+ // Lock and open file
942
+ const openPromise = (async () => {
943
+ throwIfAborted(signal);
944
+ // Double-check after acquiring lock
945
+ if (client.openFiles.has(uri)) {
946
+ return;
947
+ }
948
+
949
+ let content: string;
950
+ try {
951
+ content = await Bun.file(filePath).text();
952
+ throwIfAborted(signal);
953
+ } catch (err) {
954
+ if (isEnoent(err)) return;
955
+ throw err;
956
+ }
957
+ const languageId = client.config.languageId ?? detectLanguageId(filePath);
958
+ throwIfAborted(signal);
959
+
960
+ await sendNotification(
961
+ client,
962
+ "textDocument/didOpen",
963
+ {
964
+ textDocument: {
965
+ uri,
966
+ languageId,
967
+ version: 1,
968
+ text: content,
969
+ },
970
+ },
971
+ signal,
972
+ );
973
+
974
+ client.openFiles.set(uri, { version: 1, languageId });
975
+ client.lastActivity = Date.now();
976
+ })();
977
+
978
+ fileOperationLocks.set(lockKey, openPromise);
979
+ try {
980
+ await openPromise;
981
+ } finally {
982
+ fileOperationLocks.delete(lockKey);
983
+ }
984
+ }
985
+
986
+ /**
987
+ * Wait for the server's initial project loading to complete.
988
+ * Races the server's $/progress tracking against the abort signal.
989
+ * Returns immediately if loading already completed or timed out.
990
+ */
991
+ export async function waitForProjectLoaded(client: LspClient, signal?: AbortSignal): Promise<void> {
992
+ if (signal?.aborted) return;
993
+ await Promise.race([
994
+ client.projectLoaded,
995
+ ...(signal
996
+ ? [new Promise<void>(resolve => signal.addEventListener("abort", () => resolve(), { once: true }))]
997
+ : []),
998
+ ]);
999
+ if (isRustAnalyzerClient(client)) {
1000
+ await waitForRustAnalyzerWorkspace(client, signal);
1001
+ }
1002
+ }
1003
+
1004
+ /**
1005
+ * Sync in-memory content to the LSP client without reading from disk.
1006
+ * Use this to provide instant feedback during edits before the file is saved.
1007
+ */
1008
+ export async function syncContent(
1009
+ client: LspClient,
1010
+ filePath: string,
1011
+ content: string,
1012
+ signal?: AbortSignal,
1013
+ ): Promise<void> {
1014
+ const uri = fileToUri(filePath);
1015
+ const lockKey = `${client.name}:${uri}`;
1016
+ throwIfAborted(signal);
1017
+
1018
+ const existingLock = fileOperationLocks.get(lockKey);
1019
+ if (existingLock) {
1020
+ await untilAborted(signal, () => existingLock);
1021
+ }
1022
+
1023
+ const syncPromise = (async () => {
1024
+ // Clear stale diagnostics before syncing new content
1025
+ client.diagnostics.delete(uri);
1026
+
1027
+ const info = client.openFiles.get(uri);
1028
+
1029
+ if (!info) {
1030
+ // Open file with provided content instead of reading from disk
1031
+ const languageId = client.config.languageId ?? detectLanguageId(filePath);
1032
+ throwIfAborted(signal);
1033
+ await sendNotification(
1034
+ client,
1035
+ "textDocument/didOpen",
1036
+ {
1037
+ textDocument: {
1038
+ uri,
1039
+ languageId,
1040
+ version: 1,
1041
+ text: content,
1042
+ },
1043
+ },
1044
+ signal,
1045
+ );
1046
+ client.openFiles.set(uri, { version: 1, languageId });
1047
+ client.lastActivity = Date.now();
1048
+ return;
1049
+ }
1050
+
1051
+ const version = ++info.version;
1052
+ throwIfAborted(signal);
1053
+ await sendNotification(
1054
+ client,
1055
+ "textDocument/didChange",
1056
+ {
1057
+ textDocument: { uri, version },
1058
+ contentChanges: [{ text: content }],
1059
+ },
1060
+ signal,
1061
+ );
1062
+ client.lastActivity = Date.now();
1063
+ })();
1064
+
1065
+ fileOperationLocks.set(lockKey, syncPromise);
1066
+ try {
1067
+ await syncPromise;
1068
+ } finally {
1069
+ fileOperationLocks.delete(lockKey);
1070
+ }
1071
+ }
1072
+
1073
+ /**
1074
+ * Notify LSP that a file was saved.
1075
+ * Assumes content was already synced via syncContent - just sends didSave.
1076
+ */
1077
+ export async function notifySaved(client: LspClient, filePath: string, signal?: AbortSignal): Promise<void> {
1078
+ const uri = fileToUri(filePath);
1079
+ const info = client.openFiles.get(uri);
1080
+ if (!info) return; // File not open, nothing to notify
1081
+
1082
+ throwIfAborted(signal);
1083
+ await sendNotification(
1084
+ client,
1085
+ "textDocument/didSave",
1086
+ {
1087
+ textDocument: { uri },
1088
+ },
1089
+ signal,
1090
+ );
1091
+ client.lastActivity = Date.now();
1092
+ }
1093
+
1094
+ function isPathInsideWorkspace(filePath: string, workspace: string): boolean {
1095
+ const relative = path.relative(workspace, path.resolve(filePath));
1096
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
1097
+ }
1098
+
1099
+ /** Budget for the one-way watched-files notification: a wedged server that
1100
+ * stops draining stdin must never hang the filesystem mutation that
1101
+ * triggered it. Failures degrade to a debug log below. */
1102
+ const WATCHED_FILES_NOTIFY_TIMEOUT_MS = 2_000;
1103
+
1104
+ /**
1105
+ * Announce harness-authored filesystem changes to active LSP clients for `cwd`.
1106
+ *
1107
+ * This covers sibling files that are not open text documents, such as generated
1108
+ * CSS modules or type files that another edited document imports immediately.
1109
+ *
1110
+ * The underlying stdin write drain is self-bounded by
1111
+ * {@link WATCHED_FILES_NOTIFY_TIMEOUT_MS}; only an abort of the caller's
1112
+ * `signal` rejects.
1113
+ */
1114
+ export async function notifyWorkspaceWatchedFiles(
1115
+ cwd: string,
1116
+ changes: readonly WatchedFileChange[],
1117
+ signal?: AbortSignal,
1118
+ ): Promise<void> {
1119
+ throwIfAborted(signal);
1120
+ if (changes.length === 0) return;
1121
+
1122
+ const workspace = path.resolve(cwd);
1123
+ const activeClients = Array.from(clients.values()).filter(
1124
+ client => client.status === "ready" && path.resolve(client.cwd) === workspace,
1125
+ );
1126
+ if (activeClients.length === 0) return;
1127
+
1128
+ const timeoutSignal = AbortSignal.timeout(WATCHED_FILES_NOTIFY_TIMEOUT_MS);
1129
+ const sendSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
1130
+ const results = await Promise.allSettled(
1131
+ activeClients.map(async client => {
1132
+ const clientChanges = changes
1133
+ .filter(change => isPathInsideWorkspace(change.filePath, workspace))
1134
+ .map(change => {
1135
+ const uri = fileToUri(change.filePath);
1136
+ client.diagnostics.delete(uri);
1137
+ return { uri, type: change.type };
1138
+ });
1139
+ if (clientChanges.length === 0) return;
1140
+ await sendNotification(client, "workspace/didChangeWatchedFiles", { changes: clientChanges }, sendSignal);
1141
+ }),
1142
+ );
1143
+ throwIfAborted(signal);
1144
+ for (const result of results) {
1145
+ if (result.status === "rejected") {
1146
+ logger.debug("LSP watched-files notification failed", { cwd, error: String(result.reason) });
1147
+ }
1148
+ }
1149
+ }
1150
+
1151
+ /**
1152
+ * Refresh a file in the LSP client.
1153
+ * Increments version, sends didChange and didSave notifications.
1154
+ */
1155
+ export async function refreshFile(client: LspClient, filePath: string, signal?: AbortSignal): Promise<void> {
1156
+ throwIfAborted(signal);
1157
+ const uri = fileToUri(filePath);
1158
+ const lockKey = `${client.name}:${uri}`;
1159
+
1160
+ const existingLock = fileOperationLocks.get(lockKey);
1161
+ if (existingLock) {
1162
+ await untilAborted(signal, () => existingLock);
1163
+ }
1164
+
1165
+ const refreshPromise = (async () => {
1166
+ throwIfAborted(signal);
1167
+ // Drop cached diagnostics for this URI before asking the server to recompute.
1168
+ // Otherwise an unrelated publishDiagnostics notification can advance the global
1169
+ // diagnostics version and cause waiters to accept stale unversioned diagnostics.
1170
+ client.diagnostics.delete(uri);
1171
+ const info = client.openFiles.get(uri);
1172
+
1173
+ if (!info) {
1174
+ await ensureFileOpen(client, filePath, signal);
1175
+ return;
1176
+ }
1177
+
1178
+ let content: string;
1179
+ try {
1180
+ content = await Bun.file(filePath).text();
1181
+ throwIfAborted(signal);
1182
+ } catch (err) {
1183
+ if (isEnoent(err)) return;
1184
+ throw err;
1185
+ }
1186
+ const version = ++info.version;
1187
+ throwIfAborted(signal);
1188
+
1189
+ await sendNotification(
1190
+ client,
1191
+ "textDocument/didChange",
1192
+ {
1193
+ textDocument: { uri, version },
1194
+ contentChanges: [{ text: content }],
1195
+ },
1196
+ signal,
1197
+ );
1198
+ throwIfAborted(signal);
1199
+
1200
+ await sendNotification(
1201
+ client,
1202
+ "textDocument/didSave",
1203
+ {
1204
+ textDocument: { uri },
1205
+ text: content,
1206
+ },
1207
+ signal,
1208
+ );
1209
+
1210
+ client.lastActivity = Date.now();
1211
+ })();
1212
+
1213
+ fileOperationLocks.set(lockKey, refreshPromise);
1214
+ try {
1215
+ await refreshPromise;
1216
+ } finally {
1217
+ fileOperationLocks.delete(lockKey);
1218
+ }
1219
+ }
1220
+
1221
+ async function waitForExit(client: LspClient, timeoutMs: number): Promise<boolean> {
1222
+ return await Promise.race([
1223
+ client.proc.exited.then(
1224
+ () => true,
1225
+ () => true,
1226
+ ),
1227
+ Bun.sleep(timeoutMs).then(() => false),
1228
+ ]);
1229
+ }
1230
+
1231
+ /**
1232
+ * Tear down a specific client instance using the LSP shutdown/exit handshake.
1233
+ *
1234
+ * Removes the client from the registry by identity first (never evicting a
1235
+ * newer client already republished under the same key), then performs a bounded
1236
+ * graceful shutdown, force-killing and awaiting confirmed process exit.
1237
+ *
1238
+ * @returns `true` once the process is confirmed exited, `false` if it outlived
1239
+ * the shutdown budget — callers reporting a restart must treat `false` as a
1240
+ * failed teardown, not a completed restart.
1241
+ */
1242
+ export async function shutdownClientInstance(client: LspClient): Promise<boolean> {
1243
+ if (clients.get(client.name) === client) clients.delete(client.name);
1244
+
1245
+ const err = new Error("LSP client shutdown");
1246
+ for (const pending of Array.from(client.pendingRequests.values())) {
1247
+ pending.reject(err);
1248
+ }
1249
+ client.pendingRequests.clear();
1250
+
1251
+ const shutdownCompleted = await sendRequest(client, "shutdown", null, undefined, SHUTDOWN_TIMEOUT_MS).then(
1252
+ () => true,
1253
+ () => false,
1254
+ );
1255
+ if (shutdownCompleted) {
1256
+ await sendNotification(client, "exit", undefined).catch(() => {});
1257
+ if (await waitForExit(client, EXIT_TIMEOUT_MS)) return true;
1258
+ }
1259
+
1260
+ client.proc.kill();
1261
+ return await waitForExit(client, EXIT_TIMEOUT_MS);
1262
+ }
1263
+
1264
+ /**
1265
+ * Shutdown a specific client by key.
1266
+ *
1267
+ * @returns `true` when the client is gone (already absent or confirmed exited),
1268
+ * `false` if a live process outlived the shutdown budget.
1269
+ */
1270
+ export async function shutdownClient(key: string): Promise<boolean> {
1271
+ const client = clients.get(key);
1272
+ if (!client) return true;
1273
+ return await shutdownClientInstance(client);
1274
+ }
1275
+
1276
+ // =============================================================================
1277
+ // LSP Protocol Methods
1278
+ // =============================================================================
1279
+
1280
+ /** Default timeout for LSP requests when no abort signal is provided (30 seconds) */
1281
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
1282
+
1283
+ /**
1284
+ * Send an LSP request and wait for response.
1285
+ *
1286
+ * Timeout policy:
1287
+ * - If `timeoutMs` is explicitly provided, that value is used.
1288
+ * - Else, if `signal` is provided, no internal timer is installed (the caller
1289
+ * owns the deadline via the signal — typically a wall-clock `AbortSignal.timeout`
1290
+ * from the LSP tool). Installing a second hard-coded 30s timer here used to
1291
+ * cause "timed out after 30000ms" errors even when the caller had requested
1292
+ * `timeout: 60`.
1293
+ * - Else (no signal, no explicit timeout), fall back to `DEFAULT_REQUEST_TIMEOUT_MS`
1294
+ * to avoid leaking pending requests forever.
1295
+ */
1296
+ export async function sendRequest(
1297
+ client: LspClient,
1298
+ method: string,
1299
+ params: unknown,
1300
+ signal?: AbortSignal,
1301
+ timeoutMs?: number,
1302
+ ): Promise<unknown> {
1303
+ // Atomically increment and capture request ID
1304
+ const id = ++client.requestId;
1305
+ if (signal?.aborted) {
1306
+ const reason = signal.reason instanceof Error ? signal.reason : new ToolAbortError();
1307
+ return Promise.reject(reason);
1308
+ }
1309
+
1310
+ const request: LspJsonRpcRequest = {
1311
+ jsonrpc: "2.0",
1312
+ id,
1313
+ method,
1314
+ params,
1315
+ };
1316
+
1317
+ client.lastActivity = Date.now();
1318
+
1319
+ const { promise, resolve, reject } = Promise.withResolvers<unknown>();
1320
+ let timeout: NodeJS.Timeout | undefined;
1321
+ const cleanup = () => {
1322
+ if (signal) {
1323
+ signal.removeEventListener("abort", abortHandler);
1324
+ }
1325
+ };
1326
+ const abortHandler = () => {
1327
+ if (client.pendingRequests.has(id)) {
1328
+ client.pendingRequests.delete(id);
1329
+ }
1330
+ void sendNotification(client, "$/cancelRequest", { id }).catch(() => {});
1331
+ if (timeout) clearTimeout(timeout);
1332
+ cleanup();
1333
+ const reason = signal?.reason instanceof Error ? signal.reason : new ToolAbortError();
1334
+ reject(reason);
1335
+ };
1336
+
1337
+ const effectiveTimeoutMs = timeoutMs ?? (signal ? undefined : DEFAULT_REQUEST_TIMEOUT_MS);
1338
+ if (effectiveTimeoutMs !== undefined) {
1339
+ timeout = setTimeout(() => {
1340
+ if (client.pendingRequests.has(id)) {
1341
+ client.pendingRequests.delete(id);
1342
+ const err = new Error(`LSP request ${method} timed out after ${effectiveTimeoutMs}ms`);
1343
+ cleanup();
1344
+ reject(err);
1345
+ }
1346
+ }, effectiveTimeoutMs);
1347
+ }
1348
+ if (signal) {
1349
+ signal.addEventListener("abort", abortHandler, { once: true });
1350
+ if (signal.aborted) {
1351
+ abortHandler();
1352
+ return promise;
1353
+ }
1354
+ }
1355
+
1356
+ // Register pending request with timeout wrapper
1357
+ client.pendingRequests.set(id, {
1358
+ resolve: result => {
1359
+ if (timeout) clearTimeout(timeout);
1360
+ cleanup();
1361
+ resolve(result);
1362
+ },
1363
+ reject: err => {
1364
+ if (timeout) clearTimeout(timeout);
1365
+ cleanup();
1366
+ reject(err);
1367
+ },
1368
+ method,
1369
+ });
1370
+
1371
+ // Write request. `queueWriteMessage(..., signal)` bounds the sink flush
1372
+ // so a wedged server does not stall the write queue past the signal's
1373
+ // deadline; the write-queue teardown kills the client on abort.
1374
+ queueWriteMessage(client, request, signal).catch(err => {
1375
+ if (timeout) clearTimeout(timeout);
1376
+ client.pendingRequests.delete(id);
1377
+ cleanup();
1378
+ reject(err);
1379
+ });
1380
+ return promise;
1381
+ }
1382
+
1383
+ /**
1384
+ * Send an LSP notification (no response expected).
1385
+ * `signal` bounds the underlying `sink.flush()` — without it a server that
1386
+ * stops draining stdin blocks every future write on the client's write queue.
1387
+ */
1388
+ export async function sendNotification(
1389
+ client: LspClient,
1390
+ method: string,
1391
+ params: unknown,
1392
+ signal?: AbortSignal,
1393
+ ): Promise<void> {
1394
+ const notification: LspJsonRpcNotification = {
1395
+ jsonrpc: "2.0",
1396
+ method,
1397
+ params,
1398
+ };
1399
+
1400
+ client.lastActivity = Date.now();
1401
+ await queueWriteMessage(client, notification, signal);
1402
+ }
1403
+
1404
+ /**
1405
+ * Shutdown all LSP clients.
1406
+ */
1407
+ export async function shutdownAll(): Promise<void> {
1408
+ const clientsToShutdown = Array.from(clients.values());
1409
+ clients.clear();
1410
+ // Mid-initialize clients live only in clientLocks (publication is deferred
1411
+ // until init succeeds) — without this, their server processes outlive
1412
+ // shutdown. Failed init promises already cleaned up after themselves.
1413
+ const pendingClients = Array.from(clientLocks.values());
1414
+ clientLocks.clear();
1415
+ const seen = new Set<LspClient>(clientsToShutdown);
1416
+ await Promise.allSettled([
1417
+ ...clientsToShutdown.map(client => shutdownClientInstance(client)),
1418
+ ...pendingClients.map(pending =>
1419
+ pending.then(client => {
1420
+ if (seen.has(client)) return;
1421
+ seen.add(client);
1422
+ return shutdownClientInstance(client);
1423
+ }),
1424
+ ),
1425
+ ]);
1426
+ }
1427
+
1428
+ /** Status of an LSP server */
1429
+ export interface LspServerStatus {
1430
+ name: string;
1431
+ status: "connecting" | "ready" | "error";
1432
+ fileTypes: string[];
1433
+ error?: string;
1434
+ }
1435
+
1436
+ /**
1437
+ * Get status of all active LSP clients.
1438
+ */
1439
+ export function getActiveClients(): LspServerStatus[] {
1440
+ return Array.from(clients.values()).map(client => ({
1441
+ name: client.config.command,
1442
+ status: client.status,
1443
+ fileTypes: client.config.fileTypes,
1444
+ }));
1445
+ }
1446
+
1447
+ // =============================================================================
1448
+ // Process Cleanup
1449
+ // =============================================================================
1450
+
1451
+ // Route signal-triggered LSP cleanup through the shared `postmortem` cleanup
1452
+ // list so it runs alongside every other session teardown (draft save,
1453
+ // `session.dispose()`, kernels, MCP) instead of racing them via a
1454
+ // module-owned `SIGINT`/`SIGTERM` handler + `process.exit(0)`. Historically
1455
+ // this file registered its own signal handlers that called `shutdownAll()`
1456
+ // then `process.exit(0)` — winning the race would drop `session_shutdown`
1457
+ // extensions, orphan background bash/task jobs, and skip the editor draft
1458
+ // save (issue #4080). `beforeExit` stays as-is: it fires only when the event
1459
+ // loop drains with no more work, distinct from signal delivery.
1460
+ if (typeof process !== "undefined") {
1461
+ process.on("beforeExit", () => {
1462
+ void shutdownAll();
1463
+ });
1464
+ postmortem.register("lsp-shutdown", () => shutdownAll());
1465
+ }