@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,1183 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { FileType, glob } from "@oh-my-pi/pi-natives";
5
+ import {
6
+ CONFIG_DIR_NAME,
7
+ getAgentDir,
8
+ getConfigDirName,
9
+ getPluginsDir,
10
+ getProjectDir,
11
+ parseFrontmatter,
12
+ tryParseJson,
13
+ } from "@oh-my-pi/pi-utils";
14
+ import type { ExtensionModule } from "../capability/extension-module";
15
+ import { invalidate as invalidateFsCache, readDirEntries, readFile } from "../capability/fs";
16
+ import { parseRuleConditionAndScope, type Rule, type RuleFrontmatter } from "../capability/rule";
17
+ import type { Skill, SkillFrontmatter } from "../capability/skill";
18
+ import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
19
+ import type { MCPRequestIdFormat } from "../mcp/types";
20
+ import { type ConfiguredThinkingLevel, parseConfiguredThinkingLevel } from "../thinking";
21
+ import { normalizeToolNames } from "../tools/builtin-names";
22
+
23
+ import { realpathIfExists, resolveContainedPath } from "./contained-path";
24
+ import { buildPluginDirRoot } from "./plugin-dir-roots";
25
+
26
+ /**
27
+ * Standard paths for each config source.
28
+ */
29
+ export const SOURCE_PATHS = {
30
+ native: {
31
+ get userBase() {
32
+ return getConfigDirName();
33
+ },
34
+ get userAgent() {
35
+ return `${getConfigDirName()}/agent`;
36
+ },
37
+ projectDir: CONFIG_DIR_NAME,
38
+ },
39
+ claude: {
40
+ userBase: ".claude",
41
+ userAgent: ".claude",
42
+ projectDir: ".claude",
43
+ },
44
+ codex: {
45
+ userBase: ".codex",
46
+ userAgent: ".codex",
47
+ projectDir: ".codex",
48
+ },
49
+ gemini: {
50
+ userBase: ".gemini",
51
+ userAgent: ".gemini",
52
+ projectDir: ".gemini",
53
+ },
54
+ opencode: {
55
+ userBase: ".config/opencode",
56
+ userAgent: ".config/opencode",
57
+ projectDir: ".opencode",
58
+ },
59
+ cursor: {
60
+ userBase: ".cursor",
61
+ userAgent: ".cursor",
62
+ projectDir: ".cursor",
63
+ },
64
+ windsurf: {
65
+ userBase: ".codeium/windsurf",
66
+ userAgent: ".codeium/windsurf",
67
+ projectDir: ".windsurf",
68
+ },
69
+ cline: {
70
+ userBase: ".cline",
71
+ userAgent: ".cline",
72
+ projectDir: null, // Cline uses root-level .clinerules
73
+ },
74
+ github: {
75
+ userBase: null,
76
+ userAgent: null,
77
+ projectDir: ".github",
78
+ },
79
+ vscode: {
80
+ userBase: ".vscode",
81
+ userAgent: ".vscode",
82
+ projectDir: ".vscode",
83
+ },
84
+ } as const;
85
+
86
+ export type SourceId = keyof typeof SOURCE_PATHS;
87
+
88
+ /**
89
+ * Get user-level path for a source.
90
+ */
91
+ export function getUserPath(ctx: LoadContext, source: SourceId, subpath: string): string | null {
92
+ // Native user config is profile-scoped via getAgentDir() (the active profile's
93
+ // agent dir), matching builtin.ts and getMCPConfigPath("user"). External tools
94
+ // (~/.claude, ~/.gemini, …) are intentionally not profile-scoped, so they keep
95
+ // resolving against ctx.home below.
96
+ if (source === "native") return path.join(getAgentDir(), subpath);
97
+ const paths = SOURCE_PATHS[source];
98
+ if (!paths.userAgent) return null;
99
+ return path.join(ctx.home, paths.userAgent, subpath);
100
+ }
101
+
102
+ /**
103
+ * Get project-level path for a source (cwd only).
104
+ */
105
+ export function getProjectPath(ctx: LoadContext, source: SourceId, subpath: string): string | null {
106
+ const paths = SOURCE_PATHS[source];
107
+ if (!paths.projectDir) return null;
108
+
109
+ return path.join(ctx.cwd, paths.projectDir, subpath);
110
+ }
111
+
112
+ /**
113
+ * Resolve GitHub Copilot CLI's user-global config root. Copilot stores per-user
114
+ * instructions/prompts/agents/MCP under `~/.copilot`, relocatable via the
115
+ * `COPILOT_HOME` env var (mirrors Copilot CLI's `--config-dir`). Falls back to
116
+ * `<home>/.copilot` when the override is unset.
117
+ */
118
+ export function resolveCopilotHome(home: string): string {
119
+ const override = process.env.COPILOT_HOME?.trim();
120
+ return override ? override : path.join(home, ".copilot");
121
+ }
122
+
123
+ /**
124
+ * Create source metadata for an item.
125
+ */
126
+ export function createSourceMeta(provider: string, filePath: string, level: "user" | "project"): SourceMeta {
127
+ return {
128
+ provider,
129
+ providerName: "", // Filled in by registry
130
+ path: path.resolve(filePath),
131
+ level,
132
+ };
133
+ }
134
+
135
+ export function parseBoolean(value: unknown): boolean | undefined {
136
+ if (typeof value === "boolean") return value;
137
+ if (typeof value === "string") {
138
+ const normalized = value.trim().toLowerCase();
139
+ if (normalized === "true") return true;
140
+ if (normalized === "false") return false;
141
+ }
142
+ return undefined;
143
+ }
144
+
145
+ /**
146
+ * Parse an MCP `requestIdFormat` value. Unrecognized values are dropped so a typo
147
+ * degrades to the default integer ids rather than reaching a transport.
148
+ */
149
+ export function parseRequestIdFormat(value: unknown): MCPRequestIdFormat | undefined {
150
+ if (value === "string" || value === "number") return value;
151
+ return undefined;
152
+ }
153
+
154
+ /**
155
+ * Parse a comma-separated string into an array of trimmed, non-empty strings.
156
+ */
157
+ export function parseCSV(value: string): string[] {
158
+ return value
159
+ .split(",")
160
+ .map(s => s.trim())
161
+ .filter(Boolean);
162
+ }
163
+
164
+ /**
165
+ * Parse a value that may be an array of strings or a comma-separated string.
166
+ * Returns undefined if the result would be empty.
167
+ */
168
+ export function parseArrayOrCSV(value: unknown): string[] | undefined {
169
+ if (Array.isArray(value)) {
170
+ const filtered = value.filter((item): item is string => typeof item === "string");
171
+ return filtered.length > 0 ? filtered : undefined;
172
+ }
173
+ if (typeof value === "string") {
174
+ const parsed = parseCSV(value);
175
+ return parsed.length > 0 ? parsed : undefined;
176
+ }
177
+ return undefined;
178
+ }
179
+
180
+ /**
181
+ * Build a canonical rule item from a markdown/markdown-frontmatter document.
182
+ */
183
+ export function buildRuleFromMarkdown(
184
+ name: string,
185
+ content: string,
186
+ filePath: string,
187
+ source: SourceMeta,
188
+ options?: {
189
+ ruleName?: string;
190
+ stripNamePattern?: RegExp;
191
+ },
192
+ ): Rule {
193
+ const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
194
+ const { condition, astCondition, scope } = parseRuleConditionAndScope(frontmatter as RuleFrontmatter);
195
+
196
+ let globs: string[] | undefined;
197
+ if (Array.isArray(frontmatter.globs)) {
198
+ globs = frontmatter.globs.filter((item): item is string => typeof item === "string");
199
+ } else if (typeof frontmatter.globs === "string") {
200
+ globs = [frontmatter.globs];
201
+ }
202
+
203
+ const resolvedName = options?.ruleName ?? name.replace(options?.stripNamePattern ?? /\.(md|mdc)$/, "");
204
+ const rawMode = frontmatter.interruptMode;
205
+ const interruptMode: Rule["interruptMode"] =
206
+ rawMode === "never" || rawMode === "prose-only" || rawMode === "tool-only" || rawMode === "always"
207
+ ? rawMode
208
+ : undefined;
209
+ return {
210
+ name: resolvedName,
211
+ path: filePath,
212
+ content: body,
213
+ globs,
214
+ alwaysApply: frontmatter.alwaysApply === true,
215
+ description: typeof frontmatter.description === "string" ? frontmatter.description : undefined,
216
+ condition,
217
+ astCondition,
218
+ scope,
219
+ interruptMode,
220
+ _source: source,
221
+ };
222
+ }
223
+
224
+ /**
225
+ * Parse model field into a prioritized list.
226
+ */
227
+ export function parseModelList(value: unknown): string[] | undefined {
228
+ const parsed = parseArrayOrCSV(value);
229
+ if (!parsed) return undefined;
230
+ const normalized = parsed.map(entry => entry.trim()).filter(Boolean);
231
+ return normalized.length > 0 ? normalized : undefined;
232
+ }
233
+
234
+ /** Parsed agent fields from frontmatter (excludes source/filePath/systemPrompt) */
235
+ export interface ParsedAgentFields {
236
+ name: string;
237
+ description: string;
238
+ tools?: string[];
239
+ spawns?: string[] | "*";
240
+ model?: string[];
241
+ output?: unknown;
242
+ thinkingLevel?: ConfiguredThinkingLevel;
243
+ autoloadSkills?: string[];
244
+ readSummarize?: boolean;
245
+ blocking?: boolean;
246
+ /** `true` = prewalk into the default target; string = prewalk into that model pattern. */
247
+ prewalk?: boolean | string;
248
+ }
249
+
250
+ /**
251
+ * Parse agent fields from frontmatter.
252
+ * Returns null if required fields (name, description) are missing.
253
+ */
254
+ export function parseAgentFields(frontmatter: Record<string, unknown>): ParsedAgentFields | null {
255
+ const name = typeof frontmatter.name === "string" ? frontmatter.name : undefined;
256
+ const description = typeof frontmatter.description === "string" ? frontmatter.description : undefined;
257
+
258
+ if (!name || !description) {
259
+ return null;
260
+ }
261
+
262
+ let tools = parseArrayOrCSV(frontmatter.tools);
263
+ if (tools) tools = normalizeToolNames(tools);
264
+
265
+ // Subagents with explicit tool lists always need yield
266
+ if (tools && !tools.includes("yield")) {
267
+ tools = [...tools, "yield"];
268
+ }
269
+
270
+ // Parse spawns field (array, "*", or CSV)
271
+ let spawns: string[] | "*" | undefined;
272
+ if (frontmatter.spawns === "*") {
273
+ spawns = "*";
274
+ } else if (typeof frontmatter.spawns === "string") {
275
+ const trimmed = frontmatter.spawns.trim();
276
+ if (trimmed === "*") {
277
+ spawns = "*";
278
+ } else {
279
+ spawns = parseArrayOrCSV(trimmed);
280
+ }
281
+ } else {
282
+ spawns = parseArrayOrCSV(frontmatter.spawns);
283
+ }
284
+
285
+ // Backward compat: infer spawns: "*" when tools includes "task"
286
+ if (spawns === undefined && tools?.includes("task")) {
287
+ spawns = "*";
288
+ }
289
+
290
+ const output = frontmatter.output !== undefined ? frontmatter.output : undefined;
291
+ const rawThinkingLevel =
292
+ typeof frontmatter.thinkingLevel === "string"
293
+ ? frontmatter.thinkingLevel
294
+ : typeof frontmatter.thinking === "string"
295
+ ? frontmatter.thinking
296
+ : undefined;
297
+
298
+ const thinkingLevel = parseConfiguredThinkingLevel(rawThinkingLevel);
299
+ const model = parseModelList(frontmatter.model);
300
+ const blocking = parseBoolean(frontmatter.blocking);
301
+ const readSummarize = parseBoolean(frontmatter.readSummarize);
302
+ // prewalk: true → hand off to the default prewalk target; "<pattern>" → custom target.
303
+ let prewalk: boolean | string | undefined = parseBoolean(frontmatter.prewalk);
304
+ if (prewalk === undefined && typeof frontmatter.prewalk === "string") {
305
+ const trimmed = frontmatter.prewalk.trim();
306
+ if (trimmed) prewalk = trimmed;
307
+ }
308
+ const autoloadSkills = parseArrayOrCSV(frontmatter.autoloadSkills)
309
+ ?.map(s => s.trim())
310
+ .filter(Boolean);
311
+ return {
312
+ name,
313
+ description,
314
+ tools,
315
+ spawns,
316
+ model,
317
+ output,
318
+ thinkingLevel,
319
+ blocking,
320
+ autoloadSkills,
321
+ readSummarize,
322
+ prewalk,
323
+ };
324
+ }
325
+
326
+ async function globIf(
327
+ dir: string,
328
+ pattern: string,
329
+ fileType: FileType,
330
+ recursive: boolean = true,
331
+ ): Promise<Array<{ path: string }>> {
332
+ try {
333
+ const result = await glob({ pattern, path: dir, gitignore: true, hidden: false, fileType, recursive });
334
+ return result.matches;
335
+ } catch {
336
+ return [];
337
+ }
338
+ }
339
+
340
+ export interface ScanSkillsFromDirOptions {
341
+ dir: string;
342
+ providerId: string;
343
+ level: "user" | "project";
344
+ requireDescription?: boolean;
345
+ /**
346
+ * When true, treat a `SKILL.md` sitting directly under `dir` as a single skill in addition to
347
+ * scanning `<dir>/<name>/SKILL.md` children. Matches the Claude plugin manifest convention
348
+ * that lets a skill path point at a directory containing `SKILL.md` directly (e.g.
349
+ * `"skills": ["./"]`), where the frontmatter `name` determines the invocation name and the
350
+ * directory basename is the fallback. Default `false` preserves the strict child-scan
351
+ * semantic every non-Claude provider relies on.
352
+ */
353
+ includeSelf?: boolean;
354
+ }
355
+
356
+ // Stable ordering used for skill lists in prompts: name (case-insensitive), then name, then path.
357
+ export function compareSkillOrder(aName: string, aPath: string, bName: string, bPath: string): number {
358
+ const cmp = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);
359
+ const lowerCompare = cmp(aName.toLowerCase(), bName.toLowerCase());
360
+ if (lowerCompare !== 0) return lowerCompare;
361
+ const nameCompare = cmp(aName, bName);
362
+ if (nameCompare !== 0) return nameCompare;
363
+ return cmp(aPath, bPath);
364
+ }
365
+
366
+ export async function scanSkillsFromDir(
367
+ _ctx: LoadContext,
368
+ options: ScanSkillsFromDirOptions,
369
+ ): Promise<LoadResult<Skill>> {
370
+ const items: Skill[] = [];
371
+ const warnings: string[] = [];
372
+ const { dir, level, providerId, requireDescription = false } = options;
373
+
374
+ let entries: fs.Dirent[];
375
+ try {
376
+ entries = await fs.promises.readdir(dir, { withFileTypes: true });
377
+ } catch (error) {
378
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
379
+ warnings.push(`Failed to read skills directory: ${dir} (${String(error)})`);
380
+ }
381
+ return { items, warnings };
382
+ }
383
+ const loadSkill = async (skillPath: string) => {
384
+ try {
385
+ const content = await readFile(skillPath);
386
+ if (!content) return;
387
+ const { frontmatter, body } = parseFrontmatter(content, { source: skillPath });
388
+ if (frontmatter.enabled === false) {
389
+ return;
390
+ }
391
+ if (requireDescription && !frontmatter.description) {
392
+ return;
393
+ }
394
+ const skillDirName = path.basename(path.dirname(skillPath));
395
+ const rawName = frontmatter.name;
396
+ const name = typeof rawName === "string" ? rawName.trim() || skillDirName : skillDirName;
397
+ items.push({
398
+ name,
399
+ path: skillPath,
400
+ content: body,
401
+ frontmatter: frontmatter as SkillFrontmatter,
402
+ level,
403
+ _source: createSourceMeta(providerId, skillPath, level),
404
+ });
405
+ } catch {
406
+ warnings.push(`Failed to read skill file: ${skillPath}`);
407
+ }
408
+ };
409
+
410
+ const work: Promise<void>[] = [];
411
+ if (options.includeSelf) {
412
+ const selfSkillPath = path.join(dir, "SKILL.md");
413
+ if (fs.existsSync(selfSkillPath)) {
414
+ work.push(loadSkill(selfSkillPath));
415
+ }
416
+ }
417
+ for (const entry of entries) {
418
+ if (entry.name.startsWith(".")) continue;
419
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
420
+ const skillPath = path.join(dir, entry.name, "SKILL.md");
421
+ if (fs.existsSync(skillPath)) {
422
+ work.push(loadSkill(skillPath));
423
+ }
424
+ }
425
+ await Promise.all(work);
426
+
427
+ // Deterministic ordering: async file reads complete nondeterministically, so sort after loading.
428
+ items.sort((a, b) => compareSkillOrder(a.name, a.path, b.name, b.path));
429
+
430
+ return { items, warnings };
431
+ }
432
+
433
+ /**
434
+ * Expand environment variables in a string.
435
+ * Supports ${VAR} and ${VAR:-default} syntax.
436
+ */
437
+ function expandEnvVars(value: string, extraEnv?: Record<string, string>): string {
438
+ return value.replace(/\$\{([^}:]+)(?::-([^}]*))?\}/g, (_, varName: string, defaultValue?: string) => {
439
+ const envValue = extraEnv?.[varName] ?? Bun.env[varName];
440
+ if (envValue !== undefined) return envValue;
441
+ if (defaultValue !== undefined) return defaultValue;
442
+ return `\${${varName}}`;
443
+ });
444
+ }
445
+
446
+ /**
447
+ * Recursively expand environment variables in an object.
448
+ */
449
+ export function expandEnvVarsDeep<T>(obj: T, extraEnv?: Record<string, string>): T {
450
+ if (typeof obj === "string") {
451
+ return expandEnvVars(obj, extraEnv) as T;
452
+ }
453
+ if (Array.isArray(obj)) {
454
+ return obj.map(item => expandEnvVarsDeep(item, extraEnv)) as T;
455
+ }
456
+ if (obj !== null && typeof obj === "object") {
457
+ const result: Record<string, unknown> = {};
458
+ for (const [key, value] of Object.entries(obj)) {
459
+ result[key] = expandEnvVarsDeep(value, extraEnv);
460
+ }
461
+ return result as T;
462
+ }
463
+ return obj;
464
+ }
465
+
466
+ /**
467
+ * Load files from a directory matching extensions.
468
+ * Uses native glob for fast filesystem scanning with gitignore support.
469
+ */
470
+ export async function loadFilesFromDir<T>(
471
+ _ctx: LoadContext,
472
+ dir: string,
473
+ provider: string,
474
+ level: "user" | "project",
475
+ options: {
476
+ /** File extensions to match (without dot) */
477
+ extensions?: string[];
478
+ /** Transform file to item (return null to skip) */
479
+ transform: (name: string, content: string, path: string, source: SourceMeta) => T | null;
480
+ /** Whether to recurse into subdirectories (default: false) */
481
+ recursive?: boolean;
482
+ },
483
+ ): Promise<LoadResult<T>> {
484
+ const items: T[] = [];
485
+ const warnings: string[] = [];
486
+ // Build glob pattern based on extensions and recursion
487
+ const { extensions, recursive = false } = options;
488
+
489
+ let pattern: string;
490
+ if (extensions && extensions.length > 0) {
491
+ const extPattern = extensions.length === 1 ? extensions[0] : `{${extensions.join(",")}}`;
492
+ pattern = recursive ? `**/*.${extPattern}` : `*.${extPattern}`;
493
+ } else {
494
+ pattern = recursive ? "**/*" : "*";
495
+ }
496
+
497
+ // Use native glob for fast scanning with gitignore support
498
+ let matches: Array<{ path: string }>;
499
+ try {
500
+ const result = await glob({
501
+ pattern,
502
+ path: dir,
503
+ gitignore: true,
504
+ hidden: false,
505
+ fileType: FileType.File,
506
+ });
507
+ matches = result.matches;
508
+ } catch {
509
+ // Directory doesn't exist or isn't readable
510
+ return { items, warnings };
511
+ }
512
+
513
+ // Read all matching files in parallel
514
+ const fileResults = await Promise.all(
515
+ matches.map(async match => {
516
+ const filePath = path.join(dir, match.path);
517
+ const content = await readFile(filePath);
518
+ return { filePath, content };
519
+ }),
520
+ );
521
+
522
+ for (const { filePath, content } of fileResults) {
523
+ if (content === null) {
524
+ warnings.push(`Failed to read file: ${filePath}`);
525
+ continue;
526
+ }
527
+
528
+ const name = path.basename(filePath);
529
+ const source = createSourceMeta(provider, filePath, level);
530
+
531
+ try {
532
+ const item = options.transform(name, content, filePath, source);
533
+ if (item !== null) {
534
+ items.push(item);
535
+ }
536
+ } catch (err) {
537
+ warnings.push(`Failed to parse ${filePath}: ${err}`);
538
+ }
539
+ }
540
+ return { items, warnings };
541
+ }
542
+
543
+ /**
544
+ * Calculate depth of target directory relative to current working directory.
545
+ * Depth is the number of directory levels from cwd to target.
546
+ * - Positive depth: target is above cwd (parent/ancestor)
547
+ * - Zero depth: target is cwd
548
+ * - This uses path splitting to count directory levels
549
+ */
550
+ export function calculateDepth(cwd: string, targetDir: string, separator: string): number {
551
+ return cwd.split(separator).length - targetDir.split(separator).length;
552
+ }
553
+
554
+ interface ExtensionModuleManifest {
555
+ extensions?: string[];
556
+ }
557
+
558
+ async function discoverLinkedExtensionModuleFiles(dir: string): Promise<{
559
+ indexFiles: Array<{ path: string }>;
560
+ packageJsonFiles: Array<{ path: string }>;
561
+ }> {
562
+ const entries = await readDirEntries(dir);
563
+ const indexFiles: Array<{ path: string }> = [];
564
+ const packageJsonFiles: Array<{ path: string }> = [];
565
+
566
+ await Promise.all(
567
+ entries.map(async entry => {
568
+ if (entry.name.startsWith(".") || entry.isDirectory()) return;
569
+
570
+ const entryPath = path.join(dir, entry.name);
571
+ const stat = await fs.promises.stat(entryPath).catch(() => null);
572
+ if (!stat?.isDirectory()) return;
573
+
574
+ const [packageJsonContent, indexTsContent, indexJsContent] = await Promise.all([
575
+ readFile(path.join(entryPath, "package.json")),
576
+ readFile(path.join(entryPath, "index.ts")),
577
+ readFile(path.join(entryPath, "index.js")),
578
+ ]);
579
+
580
+ if (packageJsonContent !== null) {
581
+ packageJsonFiles.push({ path: `${entry.name}/package.json` });
582
+ }
583
+ if (indexTsContent !== null) {
584
+ indexFiles.push({ path: `${entry.name}/index.ts` });
585
+ } else if (indexJsContent !== null) {
586
+ indexFiles.push({ path: `${entry.name}/index.js` });
587
+ }
588
+ }),
589
+ );
590
+
591
+ return { indexFiles, packageJsonFiles };
592
+ }
593
+
594
+ async function readExtensionModuleManifest(
595
+ _ctx: LoadContext,
596
+ packageJsonPath: string,
597
+ ): Promise<ExtensionModuleManifest | null> {
598
+ const content = await readFile(packageJsonPath);
599
+ if (!content) return null;
600
+
601
+ const pkg = tryParseJson<{ omp?: ExtensionModuleManifest; pi?: ExtensionModuleManifest }>(content);
602
+ const manifest = pkg?.omp ?? pkg?.pi;
603
+ if (manifest && typeof manifest === "object") {
604
+ return manifest;
605
+ }
606
+ return null;
607
+ }
608
+
609
+ /**
610
+ * Discover extension module entry points in a directory.
611
+ *
612
+ * Discovery rules:
613
+ * 1. Direct files: `extensions/*.ts` or `*.js` → load
614
+ * 2. Subdirectory with index: `extensions/<ext>/index.ts` or `index.js` → load
615
+ * 3. Subdirectory with package.json: `extensions/<ext>/package.json` with "omp"/"pi" field → load declared paths
616
+ *
617
+ * No recursion beyond one level. Complex packages must use package.json manifest.
618
+ * Uses native glob for fast filesystem scanning with gitignore support.
619
+ */
620
+ export async function discoverExtensionModulePaths(_ctx: LoadContext, dir: string): Promise<string[]> {
621
+ const discovered = new Set<string>();
622
+ // Find all candidate files in parallel using glob
623
+ const [directFiles, globIndexFiles, globPackageJsonFiles, linkedFiles] = await Promise.all([
624
+ // 1. Direct *.ts or *.js files
625
+ globIf(dir, "*.{ts,js}", FileType.File, false),
626
+ // 2. Subdirectory index files
627
+ globIf(dir, "*/index.{ts,js}", FileType.File, false),
628
+ // 3. Subdirectory package.json files
629
+ globIf(dir, "*/package.json", FileType.File, false),
630
+ // Native glob does not follow linked extension directories.
631
+ discoverLinkedExtensionModuleFiles(dir),
632
+ ]);
633
+ const indexFiles = [...globIndexFiles, ...linkedFiles.indexFiles];
634
+ const packageJsonFiles = [...globPackageJsonFiles, ...linkedFiles.packageJsonFiles];
635
+
636
+ // The native glob walker runs with follow_links=false, so a symlinked extension
637
+ // directory is yielded as a Symlink entry but never descended into: its inner
638
+ // index.{ts,js}/package.json are invisible to the `*/...` patterns above.
639
+ // Detect top-level symlinked directories and synthesize the equivalent subdir
640
+ // matches so the resolution below treats them like real directories. Symlinked
641
+ // *files* already match, because the native file-type filter resolves a
642
+ // symlink's target type for File filters.
643
+ const topLevelEntries = await readDirEntries(dir);
644
+ for (const entry of topLevelEntries) {
645
+ if (!entry.isSymbolicLink()) continue;
646
+ // readDirEntries follows the symlink: a link to a file/dangling link yields [].
647
+ const subEntries = await readDirEntries(path.join(dir, entry.name));
648
+ const hasEntry = (name: string): boolean =>
649
+ subEntries.some(e => e.name === name && (e.isFile() || e.isSymbolicLink()));
650
+ if (hasEntry("package.json")) packageJsonFiles.push({ path: `${entry.name}/package.json` });
651
+ if (hasEntry("index.ts")) indexFiles.push({ path: `${entry.name}/index.ts` });
652
+ else if (hasEntry("index.js")) indexFiles.push({ path: `${entry.name}/index.js` });
653
+ }
654
+
655
+ // Process direct files
656
+ for (const match of directFiles) {
657
+ if (match.path.includes("/")) continue;
658
+ discovered.add(path.join(dir, match.path));
659
+ }
660
+ // Track which subdirectories have package.json manifests with declared extensions
661
+ const subdirsWithDeclaredExtensions = new Set<string>();
662
+ for (const match of packageJsonFiles) {
663
+ const subdir = path.dirname(match.path); // e.g., "my-extension"
664
+ const packageJsonPath = path.join(dir, match.path);
665
+ const manifest = await readExtensionModuleManifest(_ctx, packageJsonPath);
666
+ const declaredExtensions =
667
+ manifest?.extensions?.filter((extPath): extPath is string => typeof extPath === "string") ?? [];
668
+ if (declaredExtensions.length === 0) continue;
669
+ subdirsWithDeclaredExtensions.add(subdir);
670
+ const subdirPath = path.join(dir, subdir);
671
+ for (const extPath of declaredExtensions) {
672
+ let resolvedExtPath = path.resolve(subdirPath, extPath);
673
+ const entries = await readDirEntries(resolvedExtPath);
674
+ if (entries.length !== 0) {
675
+ const pluginFilePath = entries.find(
676
+ e => e.isFile() && (e.name === "index.ts" || e.name === "index.js"),
677
+ )?.name;
678
+ resolvedExtPath = pluginFilePath ? path.join(resolvedExtPath, pluginFilePath) : resolvedExtPath;
679
+ }
680
+ const content = await readFile(resolvedExtPath);
681
+ if (content !== null) {
682
+ discovered.add(resolvedExtPath);
683
+ }
684
+ }
685
+ }
686
+ const preferredIndexBySubdir = new Map<string, string>();
687
+ for (const match of indexFiles) {
688
+ if (match.path.split("/").length !== 2) continue;
689
+ const subdir = path.dirname(match.path);
690
+ if (subdirsWithDeclaredExtensions.has(subdir)) continue;
691
+ const existing = preferredIndexBySubdir.get(subdir);
692
+ if (!existing || (existing.endsWith("index.js") && match.path.endsWith("index.ts"))) {
693
+ preferredIndexBySubdir.set(subdir, match.path);
694
+ }
695
+ }
696
+ for (const preferredPath of preferredIndexBySubdir.values()) {
697
+ discovered.add(path.join(dir, preferredPath));
698
+ }
699
+ return [...discovered];
700
+ }
701
+
702
+ /**
703
+ * Derive a stable extension name from a path.
704
+ */
705
+ export function getExtensionNameFromPath(extensionPath: string): string {
706
+ const base = extensionPath.replace(/\\/g, "/").split("/").pop() ?? extensionPath;
707
+
708
+ if (base === "index.ts" || base === "index.js") {
709
+ const parts = extensionPath.replace(/\\/g, "/").split("/");
710
+ const parent = parts[parts.length - 2];
711
+ return parent ?? base;
712
+ }
713
+
714
+ const dot = base.lastIndexOf(".");
715
+ if (dot > 0) {
716
+ return base.slice(0, dot);
717
+ }
718
+
719
+ return base;
720
+ }
721
+
722
+ /**
723
+ * Build ExtensionModule items from discovered user/project paths.
724
+ * Shared across providers that expose extension modules via user + project dirs.
725
+ */
726
+ export function buildExtensionModuleItems(
727
+ providerId: string,
728
+ userPaths: string[],
729
+ projectPaths: string[],
730
+ ): ExtensionModule[] {
731
+ return [
732
+ ...userPaths.map(extPath => ({
733
+ name: getExtensionNameFromPath(extPath),
734
+ path: extPath,
735
+ level: "user" as const,
736
+ _source: createSourceMeta(providerId, extPath, "user"),
737
+ })),
738
+ ...projectPaths.map(extPath => ({
739
+ name: getExtensionNameFromPath(extPath),
740
+ path: extPath,
741
+ level: "project" as const,
742
+ _source: createSourceMeta(providerId, extPath, "project"),
743
+ })),
744
+ ];
745
+ }
746
+
747
+ // =============================================================================
748
+ // Claude Code Plugin Cache Helpers
749
+ // =============================================================================
750
+
751
+ /**
752
+ * Entry for an installed Claude Code plugin.
753
+ */
754
+ export interface ClaudePluginEntry {
755
+ /** Claude registry scope; local entries are restricted to their project path. */
756
+ scope?: "user" | "project" | "local";
757
+ installPath: string;
758
+ version: string;
759
+ installedAt: string;
760
+ lastUpdated: string;
761
+ gitCommitSha?: string;
762
+ enabled?: boolean;
763
+ /** Project root recorded by Claude for a local installation. */
764
+ projectPath?: string;
765
+ }
766
+
767
+ /**
768
+ * Claude Code installed_plugins.json registry format.
769
+ */
770
+ export interface ClaudePluginsRegistry {
771
+ version: number;
772
+ plugins: Record<string, ClaudePluginEntry[]>;
773
+ }
774
+
775
+ /**
776
+ * Resolved plugin root for loading.
777
+ */
778
+ export interface ClaudePluginRoot {
779
+ /** Plugin ID (e.g., "simpleclaude-core@simpleclaude") */
780
+ id: string;
781
+ /** Marketplace name */
782
+ marketplace: string;
783
+ /** Plugin name */
784
+ plugin: string;
785
+ /** Version string */
786
+ version: string;
787
+ /** Absolute path to plugin root */
788
+ path: string;
789
+ /** Whether this is a user or project scope plugin */
790
+ scope: "user" | "project";
791
+ }
792
+
793
+ /**
794
+ * Parse Claude Code installed_plugins.json content.
795
+ */
796
+ export function parseClaudePluginsRegistry(content: string): ClaudePluginsRegistry | null {
797
+ const data = tryParseJson<ClaudePluginsRegistry>(content);
798
+ if (!data || typeof data !== "object") return null;
799
+ if (
800
+ typeof data.version !== "number" ||
801
+ !data.plugins ||
802
+ typeof data.plugins !== "object" ||
803
+ Array.isArray(data.plugins)
804
+ )
805
+ return null;
806
+ return data;
807
+ }
808
+
809
+ /**
810
+ * Resolve the active project registry path by walking up from `cwd`.
811
+ *
812
+ * Walk order:
813
+ * 1. Walk up from `cwd` looking for the nearest directory containing `.omp/`.
814
+ * The first match returns `<dir>/.omp/plugins/installed_plugins.json`.
815
+ * 2. If no `.omp/` is found, rescan from `cwd` upward looking for `.git`.
816
+ * The git root is used as an anchor: `<gitRoot>/.omp/plugins/installed_plugins.json`.
817
+ * 3. If neither is found, return `null` — no project context is active.
818
+ *
819
+ * This is the single source of truth for "active project root" used by install,
820
+ * uninstall, list, upgrade, discovery, and doctor. Deterministic for a given `cwd`.
821
+ */
822
+ export async function resolveActiveProjectRegistryPath(cwd: string): Promise<string | null> {
823
+ // Pass 1: walk up looking for an existing .omp/ directory (nearest wins).
824
+ // Stop before os.homedir() — ~/.omp/ is the user-level config dir, not a project root.
825
+ const homeDir = os.homedir();
826
+ let dir = path.resolve(cwd);
827
+ while (dir !== homeDir) {
828
+ try {
829
+ const stat = await fs.promises.stat(path.join(dir, getConfigDirName()));
830
+ if (stat.isDirectory()) {
831
+ return path.join(dir, getConfigDirName(), "plugins", "installed_plugins.json");
832
+ }
833
+ } catch {
834
+ // not found at this level — continue up
835
+ }
836
+ const parent = path.dirname(dir);
837
+ if (parent === dir) break; // filesystem root
838
+ dir = parent;
839
+ }
840
+
841
+ // Pass 2: walk up looking for .git as a fallback anchor.
842
+ dir = path.resolve(cwd);
843
+ while (dir !== homeDir) {
844
+ try {
845
+ await fs.promises.stat(path.join(dir, ".git"));
846
+ return path.join(dir, getConfigDirName(), "plugins", "installed_plugins.json");
847
+ } catch {
848
+ // not found at this level — continue up
849
+ }
850
+ const parent = path.dirname(dir);
851
+ if (parent === dir) break; // filesystem root
852
+ dir = parent;
853
+ }
854
+
855
+ return null; // not inside any project
856
+ }
857
+
858
+ /**
859
+ * Like resolveActiveProjectRegistryPath, but falls back to `<cwd>/.omp/plugins/installed_plugins.json`
860
+ * when no project anchor (.omp/ or .git/) is found.
861
+ *
862
+ * Use this when the caller accepts an explicit --scope project so that installing into a freshly
863
+ * bootstrapped directory (no .omp/ or .git/ yet) works: writeInstalledPluginsRegistry auto-creates
864
+ * the directory tree on first write.
865
+ *
866
+ * Returns undefined when cwd is os.homedir() — that path is already the user registry and must
867
+ * never alias as the project registry.
868
+ */
869
+ export async function resolveOrDefaultProjectRegistryPath(cwd: string): Promise<string | undefined> {
870
+ const resolved = await resolveActiveProjectRegistryPath(cwd);
871
+ if (resolved) return resolved;
872
+ // Home directory must not be treated as a project root: the fallback path would alias
873
+ // getInstalledPluginsRegistryPath(), causing MarketplaceManager to load the same file
874
+ // as both user and project registry and producing duplicates / disambiguation errors.
875
+ if (path.resolve(cwd) === os.homedir()) return undefined;
876
+ return path.join(cwd, getConfigDirName(), "plugins", "installed_plugins.json");
877
+ }
878
+
879
+ async function canonicalClaudeProjectPath(projectPath: string): Promise<string | null> {
880
+ try {
881
+ return await fs.promises.realpath(path.resolve(projectPath));
882
+ } catch {
883
+ return null;
884
+ }
885
+ }
886
+
887
+ const pluginRootsCache = new Map<string, { roots: ClaudePluginRoot[]; warnings: string[] }>();
888
+
889
+ const pluginCacheInvalidators = new Set<() => void>();
890
+
891
+ /** Register a process-global plugin cache invalidator called whenever plugin roots are cleared. */
892
+ export function registerPluginCacheInvalidator(invalidator: () => void): void {
893
+ pluginCacheInvalidators.add(invalidator);
894
+ }
895
+
896
+ /**
897
+ * List all installed Claude Code plugin roots from the plugin cache.
898
+ * Reads ~/.claude/plugins/installed_plugins.json and ~/.omp/plugins/installed_plugins.json,
899
+ * and optionally the nearest project-scoped registry resolved from `cwd`.
900
+ *
901
+ * Results are cached per home, project registry, and canonical active project.
902
+ */
903
+ export async function listClaudePluginRoots(
904
+ home: string,
905
+ cwd?: string,
906
+ ): Promise<{ roots: ClaudePluginRoot[]; warnings: string[] }> {
907
+ const resolvedProjectPath = cwd ? await resolveActiveProjectRegistryPath(cwd) : null;
908
+ const projectRoot = resolvedProjectPath ? path.dirname(path.dirname(path.dirname(resolvedProjectPath))) : cwd;
909
+ const activeClaudeProjectPath = projectRoot ? await canonicalClaudeProjectPath(projectRoot) : null;
910
+ const cacheKey = `${home}:${resolvedProjectPath ?? ""}:${activeClaudeProjectPath ?? ""}`;
911
+ const cached = pluginRootsCache.get(cacheKey);
912
+ if (cached) return cached;
913
+
914
+ const roots: ClaudePluginRoot[] = [];
915
+ const warnings: string[] = [];
916
+ const projectRoots: ClaudePluginRoot[] = [];
917
+ const canonicalClaudeProjectPaths = new Map<string, string | null>();
918
+
919
+ // ── Claude Code registry ──────────────────────────────────────────────────
920
+ const registryPath = path.join(home, ".claude", "plugins", "installed_plugins.json");
921
+ const content = await readFile(registryPath);
922
+
923
+ if (content) {
924
+ const registry = parseClaudePluginsRegistry(content);
925
+ if (!registry) {
926
+ warnings.push(`Failed to parse Claude Code plugin registry: ${registryPath}`);
927
+ } else {
928
+ for (const [pluginId, entries] of Object.entries(registry.plugins)) {
929
+ if (!Array.isArray(entries) || entries.length === 0) continue;
930
+
931
+ // Parse plugin ID format: "plugin-name@marketplace"
932
+ const atIndex = pluginId.lastIndexOf("@");
933
+ if (atIndex === -1) {
934
+ warnings.push(`Invalid plugin ID format (missing @marketplace): ${pluginId}`);
935
+ continue;
936
+ }
937
+
938
+ const pluginName = pluginId.slice(0, atIndex);
939
+ const marketplace = pluginId.slice(atIndex + 1);
940
+
941
+ // Process all valid entries, not just the first one.
942
+ // This handles plugins with multiple installs (different scopes/versions).
943
+ for (const entry of entries) {
944
+ if (!entry.installPath || typeof entry.installPath !== "string") {
945
+ warnings.push(`Plugin ${pluginId} entry has no installPath`);
946
+ continue;
947
+ }
948
+ if (entry.enabled === false) continue;
949
+ if (entry.scope === "local") {
950
+ if (!entry.projectPath || !activeClaudeProjectPath) continue;
951
+ let entryProjectPath = canonicalClaudeProjectPaths.get(entry.projectPath);
952
+ if (entryProjectPath === undefined) {
953
+ entryProjectPath = await canonicalClaudeProjectPath(entry.projectPath);
954
+ canonicalClaudeProjectPaths.set(entry.projectPath, entryProjectPath);
955
+ }
956
+ if (entryProjectPath !== activeClaudeProjectPath) continue;
957
+ }
958
+
959
+ roots.push({
960
+ id: pluginId,
961
+ marketplace,
962
+ plugin: pluginName,
963
+ version: entry.version || "unknown",
964
+ path: entry.installPath,
965
+ scope: entry.scope === "local" ? "project" : entry.scope || "user",
966
+ });
967
+ }
968
+ }
969
+ }
970
+ }
971
+
972
+ // ── OMP installed plugins registry ───────────────────────────────────────
973
+ // OMP registry is authoritative: its entries replace Claude's entries for the same plugin ID.
974
+ // In production `home` is `os.homedir()`, so `getPluginsDir(home)` resolves to the
975
+ // same XDG-aware path the marketplace writer uses (reads and writes always agree).
976
+ // Tests pass a temp dir, which short-circuits the resolver for deterministic isolation.
977
+ const ompRegistryPath = path.join(getPluginsDir(home), "installed_plugins.json");
978
+ const ompContent = await readFile(ompRegistryPath);
979
+ if (ompContent) {
980
+ const ompRegistry = parseClaudePluginsRegistry(ompContent);
981
+ if (ompRegistry) {
982
+ for (const [pluginId, entries] of Object.entries(ompRegistry.plugins)) {
983
+ if (!Array.isArray(entries) || entries.length === 0) continue;
984
+
985
+ const atIndex = pluginId.lastIndexOf("@");
986
+ if (atIndex === -1) {
987
+ warnings.push(`Invalid plugin ID format (missing @marketplace): ${pluginId}`);
988
+ continue;
989
+ }
990
+ const pluginName = pluginId.slice(0, atIndex);
991
+ const marketplace = pluginId.slice(atIndex + 1);
992
+
993
+ // OMP is authoritative: drop all Claude-sourced entries for this plugin ID
994
+ const filtered = roots.filter(r => r.id !== pluginId);
995
+ roots.length = 0;
996
+ roots.push(...filtered);
997
+
998
+ for (const entry of entries) {
999
+ if (!entry.installPath || typeof entry.installPath !== "string") {
1000
+ warnings.push(`Plugin ${pluginId} entry has no installPath`);
1001
+ continue;
1002
+ }
1003
+ if (entry.enabled === false) continue;
1004
+ // Deduplicate by installPath within same ID
1005
+ if (roots.some(r => r.id === pluginId && r.path === entry.installPath)) continue;
1006
+
1007
+ roots.push({
1008
+ id: pluginId,
1009
+ marketplace,
1010
+ plugin: pluginName,
1011
+ version: entry.version || "unknown",
1012
+ path: entry.installPath,
1013
+ scope: entry.scope === "local" ? "project" : entry.scope || "user",
1014
+ });
1015
+ }
1016
+ }
1017
+ } else {
1018
+ warnings.push(`Failed to parse OMP plugin registry: ${ompRegistryPath}`);
1019
+ }
1020
+ }
1021
+
1022
+ // ── Project-scoped OMP registry ────────────────────────────────────────
1023
+ // Loaded from the nearest .omp/plugins/installed_plugins.json relative to cwd.
1024
+ // Project entries take precedence over user entries for the same plugin ID.
1025
+ if (resolvedProjectPath) {
1026
+ const projectContent = await readFile(resolvedProjectPath);
1027
+ if (projectContent) {
1028
+ const projectRegistry = parseClaudePluginsRegistry(projectContent);
1029
+ if (projectRegistry) {
1030
+ for (const [pluginId, entries] of Object.entries(projectRegistry.plugins)) {
1031
+ if (!Array.isArray(entries) || entries.length === 0) continue;
1032
+ const atIndex = pluginId.lastIndexOf("@");
1033
+ if (atIndex === -1) {
1034
+ warnings.push(`Invalid plugin ID format (missing @marketplace): ${pluginId}`);
1035
+ continue;
1036
+ }
1037
+ const pluginName = pluginId.slice(0, atIndex);
1038
+ const marketplace = pluginId.slice(atIndex + 1);
1039
+ for (const entry of entries) {
1040
+ if (!entry.installPath || typeof entry.installPath !== "string") {
1041
+ warnings.push(`Plugin ${pluginId} entry has no installPath`);
1042
+ continue;
1043
+ }
1044
+ if (entry.enabled === false) continue;
1045
+ projectRoots.push({
1046
+ id: pluginId,
1047
+ marketplace,
1048
+ plugin: pluginName,
1049
+ version: entry.version || "unknown",
1050
+ path: entry.installPath,
1051
+ scope: "project",
1052
+ });
1053
+ }
1054
+ }
1055
+ } else {
1056
+ warnings.push(`Failed to parse project plugin registry: ${resolvedProjectPath}`);
1057
+ }
1058
+ }
1059
+ }
1060
+
1061
+ // Project entries shadow user entries for the same plugin ID.
1062
+ if (projectRoots.length > 0) {
1063
+ const projectIds = new Set(projectRoots.map(r => r.id));
1064
+ const deduped = roots.filter(r => !projectIds.has(r.id));
1065
+ roots.length = 0;
1066
+ roots.push(...projectRoots, ...deduped);
1067
+ }
1068
+
1069
+ // Merge --plugin-dir roots (highest precedence) on every fresh load
1070
+ if (injectedPluginDirRoots.length > 0) {
1071
+ const injectedIds = new Set(injectedPluginDirRoots.map(r => r.id));
1072
+ const filtered = roots.filter(r => !injectedIds.has(r.id));
1073
+ roots.length = 0;
1074
+ roots.push(...injectedPluginDirRoots, ...filtered);
1075
+ }
1076
+
1077
+ const result = { roots, warnings };
1078
+ pluginRootsCache.set(cacheKey, result);
1079
+ return result;
1080
+ }
1081
+
1082
+ /**
1083
+ * Clear the plugin roots cache (useful for testing or when plugins change).
1084
+ */
1085
+ export function clearClaudePluginRootsCache(): void {
1086
+ pluginRootsCache.clear();
1087
+ for (const invalidate of pluginCacheInvalidators) invalidate();
1088
+ preloadedPluginRoots = [...injectedPluginDirRoots];
1089
+ // Re-warm preloaded roots asynchronously so sync LSP config reads stay valid
1090
+ if (lastPreloadHome) {
1091
+ void preloadPluginRoots(lastPreloadHome, getProjectDir());
1092
+ }
1093
+ }
1094
+
1095
+ /**
1096
+ * Invalidate fs caches for installed-plugin registry files and reset the
1097
+ * in-memory plugin roots cache. Used by MarketplaceManager clients after
1098
+ * installing/uninstalling/enabling/disabling plugins.
1099
+ */
1100
+ export function clearPluginRootsAndCaches(extraPaths?: readonly string[]): void {
1101
+ invalidateFsCache(path.join(os.homedir(), ".claude", "plugins", "installed_plugins.json"));
1102
+ invalidateFsCache(path.join(getPluginsDir(), "installed_plugins.json"));
1103
+ for (const p of extraPaths ?? []) invalidateFsCache(p);
1104
+ clearClaudePluginRootsCache();
1105
+ }
1106
+
1107
+ // ── Preloaded plugin roots (for sync consumers like LSP config) ─────────────
1108
+ // Populated at startup by preloadPluginRoots(). Read synchronously by
1109
+ // getPreloadedPluginRoots(). Safe degradation: empty array if not warmed.
1110
+
1111
+ let preloadedPluginRoots: ClaudePluginRoot[] = [];
1112
+ let injectedPluginDirRoots: ClaudePluginRoot[] = [];
1113
+ let lastPreloadHome: string | undefined;
1114
+
1115
+ /**
1116
+ * Populate the module-level plugin roots cache for sync consumers.
1117
+ * Call during session initialization, after dir resolution completes
1118
+ * but before any LSP config is read.
1119
+ */
1120
+ export async function preloadPluginRoots(home: string, cwd?: string): Promise<void> {
1121
+ lastPreloadHome = home;
1122
+ const { roots } = await listClaudePluginRoots(home, cwd);
1123
+ preloadedPluginRoots = roots;
1124
+ }
1125
+
1126
+ /**
1127
+ * Get pre-loaded plugin roots synchronously.
1128
+ * Returns empty array if preloadPluginRoots() hasn't been called.
1129
+ */
1130
+ export function getPreloadedPluginRoots(): readonly ClaudePluginRoot[] {
1131
+ return preloadedPluginRoots;
1132
+ }
1133
+
1134
+ // ── --plugin-dir injection ──────────────────────────────────────────────────
1135
+
1136
+ /**
1137
+ * Inject synthetic plugin roots from --plugin-dir paths.
1138
+ * These are prepended to the cache with highest precedence (before OMP/Claude entries).
1139
+ * Must be called before any listClaudePluginRoots() access.
1140
+ */
1141
+ export async function injectPluginDirRoots(home: string, dirs: string[], cwd?: string): Promise<void> {
1142
+ const injected: ClaudePluginRoot[] = [];
1143
+ for (const dir of dirs) {
1144
+ const resolved = path.resolve(dir);
1145
+ // Read plugin name from manifest: Claude marketplace layout first, then
1146
+ // the Agent Plugins standard root manifest (agent-plugins.org). Each
1147
+ // manifest is resolved and proven inside the plugin directory BEFORE the
1148
+ // read (Agent Plugins §4.1) — an escaping symlink falls back to the
1149
+ // directory basename without consuming outside content.
1150
+ let pluginName = path.basename(resolved);
1151
+ const realRoot = await realpathIfExists(resolved);
1152
+ if (realRoot !== null) {
1153
+ for (const manifestPath of [
1154
+ path.join(realRoot, ".claude-plugin", "plugin.json"),
1155
+ path.join(realRoot, "plugin.json"),
1156
+ ]) {
1157
+ const contained = await resolveContainedPath(realRoot, manifestPath);
1158
+ if (contained.status !== "ok") continue;
1159
+ try {
1160
+ const manifest = await Bun.file(contained.realPath).json();
1161
+ if (typeof manifest?.name === "string" && manifest.name) {
1162
+ pluginName = manifest.name;
1163
+ break;
1164
+ }
1165
+ } catch {
1166
+ // Invalid manifest — try next, fall back to directory name
1167
+ }
1168
+ }
1169
+ }
1170
+
1171
+ injected.push(buildPluginDirRoot(resolved, pluginName));
1172
+ }
1173
+
1174
+ // Set injected roots BEFORE populating cache so listClaudePluginRoots merges them.
1175
+ injectedPluginDirRoots = injected;
1176
+ lastPreloadHome = home; // ensure cache-clear re-warm fires even when injectPluginDirRoots was the startup path
1177
+ // Clear any stale cache entries (populated before injected roots were set).
1178
+ pluginRootsCache.clear();
1179
+ // Rebuild — cache miss triggers fresh load that includes both user+project registries
1180
+ // and prepends injectedPluginDirRoots at highest precedence.
1181
+ const { roots } = await listClaudePluginRoots(home, cwd);
1182
+ preloadedPluginRoots = roots;
1183
+ }