pi-agent-zh 17.1.8

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 (1519) hide show
  1. package/CHANGELOG.md +14459 -0
  2. package/README.md +35 -0
  3. package/dist/CHANGELOG-vt8ene9g.md +14459 -0
  4. package/dist/cli.js +22079 -0
  5. package/dist/template-dys3vk5b.js +1671 -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 +79 -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 +606 -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 +133 -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 +195 -0
  62. package/scripts/measure-prompt-tokens.ts +63 -0
  63. package/scripts/omp +42 -0
  64. package/scripts/omp.ts +19 -0
  65. package/src/advisor/advise-tool.ts +216 -0
  66. package/src/advisor/config.ts +341 -0
  67. package/src/advisor/emission-guard.ts +172 -0
  68. package/src/advisor/index.ts +6 -0
  69. package/src/advisor/runtime.ts +1232 -0
  70. package/src/advisor/transcript-recorder.ts +159 -0
  71. package/src/advisor/watchdog.ts +135 -0
  72. package/src/async/index.ts +1 -0
  73. package/src/async/job-manager.ts +821 -0
  74. package/src/auto-thinking/classifier.ts +182 -0
  75. package/src/autolearn/controller.ts +152 -0
  76. package/src/autolearn/managed-skills.ts +255 -0
  77. package/src/autoresearch/command-resume.md +14 -0
  78. package/src/autoresearch/dashboard.ts +436 -0
  79. package/src/autoresearch/git.ts +331 -0
  80. package/src/autoresearch/helpers.ts +218 -0
  81. package/src/autoresearch/index.ts +541 -0
  82. package/src/autoresearch/prompt-setup.md +43 -0
  83. package/src/autoresearch/prompt.md +103 -0
  84. package/src/autoresearch/resume-message.md +10 -0
  85. package/src/autoresearch/state.ts +273 -0
  86. package/src/autoresearch/storage.ts +700 -0
  87. package/src/autoresearch/tools/init-experiment.ts +269 -0
  88. package/src/autoresearch/tools/log-experiment.ts +521 -0
  89. package/src/autoresearch/tools/run-experiment.ts +407 -0
  90. package/src/autoresearch/tools/update-notes.ts +109 -0
  91. package/src/autoresearch/types.ts +168 -0
  92. package/src/capability/context-file.ts +44 -0
  93. package/src/capability/extension-module.ts +34 -0
  94. package/src/capability/extension.ts +47 -0
  95. package/src/capability/fs.ts +117 -0
  96. package/src/capability/hook.ts +40 -0
  97. package/src/capability/index.ts +467 -0
  98. package/src/capability/instruction.ts +37 -0
  99. package/src/capability/mcp.ts +97 -0
  100. package/src/capability/prompt.ts +35 -0
  101. package/src/capability/rule-buckets.ts +66 -0
  102. package/src/capability/rule.ts +298 -0
  103. package/src/capability/settings.ts +34 -0
  104. package/src/capability/skill.ts +63 -0
  105. package/src/capability/slash-command.ts +40 -0
  106. package/src/capability/ssh.ts +41 -0
  107. package/src/capability/system-prompt.ts +34 -0
  108. package/src/capability/tool.ts +38 -0
  109. package/src/capability/types.ts +187 -0
  110. package/src/cleanse/agent.ts +226 -0
  111. package/src/cleanse/balance.ts +79 -0
  112. package/src/cleanse/checkers.ts +996 -0
  113. package/src/cleanse/index.ts +190 -0
  114. package/src/cleanse/loop.ts +51 -0
  115. package/src/cleanse/parsers.ts +726 -0
  116. package/src/cleanse/progress.ts +50 -0
  117. package/src/cleanse/prompts/assignment.md +47 -0
  118. package/src/cleanse/types.ts +72 -0
  119. package/src/cli/agents-cli.ts +138 -0
  120. package/src/cli/args.ts +420 -0
  121. package/src/cli/auth-broker-cli.ts +940 -0
  122. package/src/cli/auth-gateway-cli.ts +674 -0
  123. package/src/cli/bench-cli.ts +990 -0
  124. package/src/cli/classify-install-target.ts +76 -0
  125. package/src/cli/claude-trace-cli.ts +795 -0
  126. package/src/cli/commands/init-xdg.ts +27 -0
  127. package/src/cli/completion-gen.ts +550 -0
  128. package/src/cli/config-cli.ts +459 -0
  129. package/src/cli/dry-balance-cli.ts +864 -0
  130. package/src/cli/extension-flags.ts +48 -0
  131. package/src/cli/file-processor.ts +132 -0
  132. package/src/cli/flag-tables.ts +352 -0
  133. package/src/cli/gallery-cli.ts +272 -0
  134. package/src/cli/gallery-fixtures/agentic.ts +420 -0
  135. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  136. package/src/cli/gallery-fixtures/edit.ts +254 -0
  137. package/src/cli/gallery-fixtures/fs.ts +220 -0
  138. package/src/cli/gallery-fixtures/index.ts +40 -0
  139. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  140. package/src/cli/gallery-fixtures/memory.ts +81 -0
  141. package/src/cli/gallery-fixtures/misc.ts +177 -0
  142. package/src/cli/gallery-fixtures/search.ts +135 -0
  143. package/src/cli/gallery-fixtures/shell.ts +241 -0
  144. package/src/cli/gallery-fixtures/types.ts +57 -0
  145. package/src/cli/gallery-fixtures/web.ts +158 -0
  146. package/src/cli/gallery-screenshot.ts +279 -0
  147. package/src/cli/gc-cli.ts +946 -0
  148. package/src/cli/grep-cli.ts +161 -0
  149. package/src/cli/grievances-cli.ts +256 -0
  150. package/src/cli/initial-message.ts +58 -0
  151. package/src/cli/models-cli.ts +388 -0
  152. package/src/cli/plugin-cli.ts +996 -0
  153. package/src/cli/profile-alias.ts +369 -0
  154. package/src/cli/profile-bootstrap.ts +233 -0
  155. package/src/cli/read-cli.ts +99 -0
  156. package/src/cli/session-picker.ts +93 -0
  157. package/src/cli/setup-cli.ts +320 -0
  158. package/src/cli/setup-model-picker.ts +43 -0
  159. package/src/cli/shell-cli.ts +176 -0
  160. package/src/cli/ssh-cli.ts +179 -0
  161. package/src/cli/startup-cwd.ts +58 -0
  162. package/src/cli/stats-cli.ts +229 -0
  163. package/src/cli/tiny-models-cli.ts +153 -0
  164. package/src/cli/ttsr-cli.ts +995 -0
  165. package/src/cli/update-cli.ts +1219 -0
  166. package/src/cli/usage-cli.ts +1084 -0
  167. package/src/cli/usage-error.ts +7 -0
  168. package/src/cli/web-search-cli.ts +144 -0
  169. package/src/cli/worktree-cli.ts +311 -0
  170. package/src/cli-commands.ts +166 -0
  171. package/src/cli.ts +407 -0
  172. package/src/collab/crypto.ts +63 -0
  173. package/src/collab/display-name.ts +13 -0
  174. package/src/collab/guest.ts +731 -0
  175. package/src/collab/host.ts +691 -0
  176. package/src/collab/protocol.ts +296 -0
  177. package/src/collab/relay-client.ts +282 -0
  178. package/src/collab/replication-shrink.ts +111 -0
  179. package/src/commands/acp.ts +33 -0
  180. package/src/commands/agents.ts +57 -0
  181. package/src/commands/auth-broker.ts +99 -0
  182. package/src/commands/auth-gateway.ts +69 -0
  183. package/src/commands/bench.ts +65 -0
  184. package/src/commands/cleanse.ts +45 -0
  185. package/src/commands/commit.ts +46 -0
  186. package/src/commands/complete.ts +66 -0
  187. package/src/commands/completions.ts +60 -0
  188. package/src/commands/config.ts +51 -0
  189. package/src/commands/dry-balance.ts +43 -0
  190. package/src/commands/gallery.ts +60 -0
  191. package/src/commands/gc.ts +46 -0
  192. package/src/commands/grep.ts +48 -0
  193. package/src/commands/grievances.ts +51 -0
  194. package/src/commands/install.ts +107 -0
  195. package/src/commands/join.ts +39 -0
  196. package/src/commands/launch.ts +212 -0
  197. package/src/commands/models.ts +60 -0
  198. package/src/commands/plugin.ts +78 -0
  199. package/src/commands/read.ts +38 -0
  200. package/src/commands/say.ts +145 -0
  201. package/src/commands/setup.ts +67 -0
  202. package/src/commands/shell.ts +29 -0
  203. package/src/commands/ssh.ts +60 -0
  204. package/src/commands/stats.ts +29 -0
  205. package/src/commands/tiny-models.ts +36 -0
  206. package/src/commands/token.ts +164 -0
  207. package/src/commands/ttsr.ts +125 -0
  208. package/src/commands/update.ts +33 -0
  209. package/src/commands/usage.ts +54 -0
  210. package/src/commands/web-search.ts +42 -0
  211. package/src/commands/worktree.ts +62 -0
  212. package/src/commit/agentic/agent.ts +322 -0
  213. package/src/commit/agentic/fallback.ts +96 -0
  214. package/src/commit/agentic/index.ts +382 -0
  215. package/src/commit/agentic/lock-files.ts +107 -0
  216. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  217. package/src/commit/agentic/prompts/session-user.md +25 -0
  218. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  219. package/src/commit/agentic/prompts/system.md +38 -0
  220. package/src/commit/agentic/state.ts +60 -0
  221. package/src/commit/agentic/tools/analyze-file.ts +148 -0
  222. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  223. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  224. package/src/commit/agentic/tools/git-overview.ts +62 -0
  225. package/src/commit/agentic/tools/index.ts +54 -0
  226. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  227. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  228. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  229. package/src/commit/agentic/tools/schemas.ts +11 -0
  230. package/src/commit/agentic/tools/split-commit.ts +241 -0
  231. package/src/commit/agentic/topo-sort.ts +44 -0
  232. package/src/commit/agentic/trivial.ts +51 -0
  233. package/src/commit/agentic/validation.ts +183 -0
  234. package/src/commit/analysis/conventional.ts +64 -0
  235. package/src/commit/analysis/index.ts +4 -0
  236. package/src/commit/analysis/scope.ts +242 -0
  237. package/src/commit/analysis/summary.ts +107 -0
  238. package/src/commit/analysis/validation.ts +66 -0
  239. package/src/commit/changelog/detect.ts +40 -0
  240. package/src/commit/changelog/generate.ts +101 -0
  241. package/src/commit/changelog/index.ts +234 -0
  242. package/src/commit/changelog/parse.ts +44 -0
  243. package/src/commit/cli.ts +85 -0
  244. package/src/commit/git/diff.ts +148 -0
  245. package/src/commit/index.ts +5 -0
  246. package/src/commit/map-reduce/index.ts +69 -0
  247. package/src/commit/map-reduce/map-phase.ts +193 -0
  248. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  249. package/src/commit/map-reduce/utils.ts +9 -0
  250. package/src/commit/message.ts +11 -0
  251. package/src/commit/model-selection.ts +95 -0
  252. package/src/commit/pipeline.ts +243 -0
  253. package/src/commit/prompts/analysis-system.md +148 -0
  254. package/src/commit/prompts/analysis-user.md +38 -0
  255. package/src/commit/prompts/changelog-system.md +50 -0
  256. package/src/commit/prompts/changelog-user.md +18 -0
  257. package/src/commit/prompts/file-observer-system.md +24 -0
  258. package/src/commit/prompts/file-observer-user.md +8 -0
  259. package/src/commit/prompts/reduce-system.md +50 -0
  260. package/src/commit/prompts/reduce-user.md +17 -0
  261. package/src/commit/prompts/summary-retry.md +3 -0
  262. package/src/commit/prompts/summary-system.md +38 -0
  263. package/src/commit/prompts/summary-user.md +13 -0
  264. package/src/commit/prompts/types-description.md +2 -0
  265. package/src/commit/shared-llm.ts +70 -0
  266. package/src/commit/types.ts +118 -0
  267. package/src/commit/utils/exclusions.ts +42 -0
  268. package/src/commit/utils.ts +58 -0
  269. package/src/config/api-key-resolver.ts +81 -0
  270. package/src/config/append-only-context-mode.ts +76 -0
  271. package/src/config/config-file.ts +347 -0
  272. package/src/config/file-lock.ts +164 -0
  273. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  274. package/src/config/keybindings.ts +688 -0
  275. package/src/config/mcp-schema.json +247 -0
  276. package/src/config/model-discovery.ts +999 -0
  277. package/src/config/model-registry.ts +2725 -0
  278. package/src/config/model-resolver.ts +2068 -0
  279. package/src/config/model-roles.ts +113 -0
  280. package/src/config/models-config-schema-bundle.ts +313 -0
  281. package/src/config/models-config-schema.ts +14 -0
  282. package/src/config/models-config.ts +130 -0
  283. package/src/config/prompt-templates.ts +205 -0
  284. package/src/config/provider-globals.ts +25 -0
  285. package/src/config/resolve-config-value.ts +94 -0
  286. package/src/config/service-tier.ts +141 -0
  287. package/src/config/settings-schema.ts +5751 -0
  288. package/src/config/settings.ts +2369 -0
  289. package/src/config.ts +242 -0
  290. package/src/cursor.ts +513 -0
  291. package/src/dap/client.ts +1043 -0
  292. package/src/dap/config.ts +480 -0
  293. package/src/dap/defaults.json +212 -0
  294. package/src/dap/index.ts +4 -0
  295. package/src/dap/session.ts +1841 -0
  296. package/src/dap/types.ts +611 -0
  297. package/src/debug/index.ts +584 -0
  298. package/src/debug/log-formatting.ts +58 -0
  299. package/src/debug/log-viewer.ts +966 -0
  300. package/src/debug/profiler.ts +168 -0
  301. package/src/debug/protocol-probe.ts +267 -0
  302. package/src/debug/raw-sse-buffer.ts +421 -0
  303. package/src/debug/raw-sse.ts +312 -0
  304. package/src/debug/remote-debugger.ts +151 -0
  305. package/src/debug/report-bundle.ts +411 -0
  306. package/src/debug/system-info.ts +111 -0
  307. package/src/debug/terminal-info.ts +124 -0
  308. package/src/discovery/agents-md.ts +67 -0
  309. package/src/discovery/agents.ts +230 -0
  310. package/src/discovery/at-imports.ts +273 -0
  311. package/src/discovery/builtin-defaults.ts +39 -0
  312. package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
  313. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  314. package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
  315. package/src/discovery/builtin-rules/go-ioutil.md +37 -0
  316. package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
  317. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  318. package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
  319. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  320. package/src/discovery/builtin-rules/index.ts +74 -0
  321. package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
  322. package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
  323. package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
  324. package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
  325. package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
  326. package/src/discovery/builtin-rules/rs-result-type.md +20 -0
  327. package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
  328. package/src/discovery/builtin-rules/ts-import-type.md +43 -0
  329. package/src/discovery/builtin-rules/ts-no-any.md +66 -0
  330. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
  331. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
  332. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
  333. package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
  334. package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
  335. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  336. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  337. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
  338. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  339. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  340. package/src/discovery/builtin.ts +935 -0
  341. package/src/discovery/claude-plugins.ts +624 -0
  342. package/src/discovery/claude.ts +588 -0
  343. package/src/discovery/cline.ts +83 -0
  344. package/src/discovery/codex.ts +540 -0
  345. package/src/discovery/cursor.ts +220 -0
  346. package/src/discovery/gemini.ts +383 -0
  347. package/src/discovery/github.ts +337 -0
  348. package/src/discovery/helpers.ts +1159 -0
  349. package/src/discovery/index.ts +81 -0
  350. package/src/discovery/mcp-json.ts +172 -0
  351. package/src/discovery/omp-extension-roots.ts +213 -0
  352. package/src/discovery/omp-plugins.ts +387 -0
  353. package/src/discovery/opencode.ts +441 -0
  354. package/src/discovery/plugin-dir-roots.ts +28 -0
  355. package/src/discovery/ssh.ts +153 -0
  356. package/src/discovery/substitute-plugin-root.ts +77 -0
  357. package/src/discovery/vscode.ts +105 -0
  358. package/src/discovery/windsurf.ts +147 -0
  359. package/src/edit/apply-patch/index.ts +87 -0
  360. package/src/edit/apply-patch/parser.ts +174 -0
  361. package/src/edit/diff.ts +999 -0
  362. package/src/edit/file-snapshot-store.ts +148 -0
  363. package/src/edit/hashline/block-resolver.ts +33 -0
  364. package/src/edit/hashline/diff.ts +356 -0
  365. package/src/edit/hashline/execute.ts +280 -0
  366. package/src/edit/hashline/filesystem.ts +223 -0
  367. package/src/edit/hashline/index.ts +5 -0
  368. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  369. package/src/edit/hashline/params.ts +12 -0
  370. package/src/edit/index.ts +676 -0
  371. package/src/edit/modes/apply-patch.lark +19 -0
  372. package/src/edit/modes/apply-patch.ts +53 -0
  373. package/src/edit/modes/patch.ts +1958 -0
  374. package/src/edit/modes/replace.ts +1137 -0
  375. package/src/edit/normalize.ts +345 -0
  376. package/src/edit/notebook.ts +242 -0
  377. package/src/edit/read-file.ts +25 -0
  378. package/src/edit/renderer.ts +998 -0
  379. package/src/edit/snapshot-details.ts +77 -0
  380. package/src/edit/streaming.ts +698 -0
  381. package/src/eval/agent-bridge.ts +224 -0
  382. package/src/eval/backend-helpers.ts +48 -0
  383. package/src/eval/backend.ts +71 -0
  384. package/src/eval/bridge-timeout.ts +62 -0
  385. package/src/eval/budget-bridge.ts +48 -0
  386. package/src/eval/completion-bridge.ts +211 -0
  387. package/src/eval/concurrency-bridge.ts +34 -0
  388. package/src/eval/executor-base.ts +504 -0
  389. package/src/eval/idle-timeout.ts +91 -0
  390. package/src/eval/index.ts +6 -0
  391. package/src/eval/jl/executor.ts +540 -0
  392. package/src/eval/jl/index.ts +54 -0
  393. package/src/eval/jl/kernel.ts +236 -0
  394. package/src/eval/jl/prelude.jl +736 -0
  395. package/src/eval/jl/prelude.ts +3 -0
  396. package/src/eval/jl/runner.jl +666 -0
  397. package/src/eval/jl/runtime.ts +118 -0
  398. package/src/eval/js/context-manager.ts +701 -0
  399. package/src/eval/js/executor.ts +175 -0
  400. package/src/eval/js/index.ts +40 -0
  401. package/src/eval/js/process-entry.ts +31 -0
  402. package/src/eval/js/shared/helpers.ts +170 -0
  403. package/src/eval/js/shared/indirect-eval.ts +30 -0
  404. package/src/eval/js/shared/local-module-loader.ts +364 -0
  405. package/src/eval/js/shared/prelude.ts +2 -0
  406. package/src/eval/js/shared/prelude.txt +294 -0
  407. package/src/eval/js/shared/rewrite-imports.ts +550 -0
  408. package/src/eval/js/shared/runtime.ts +590 -0
  409. package/src/eval/js/shared/types.ts +18 -0
  410. package/src/eval/js/tool-bridge.ts +163 -0
  411. package/src/eval/js/worker-core.ts +380 -0
  412. package/src/eval/js/worker-entry.ts +37 -0
  413. package/src/eval/js/worker-protocol.ts +47 -0
  414. package/src/eval/kernel-base.ts +569 -0
  415. package/src/eval/py/display.ts +71 -0
  416. package/src/eval/py/executor.ts +603 -0
  417. package/src/eval/py/index.ts +57 -0
  418. package/src/eval/py/kernel.ts +234 -0
  419. package/src/eval/py/prelude.py +672 -0
  420. package/src/eval/py/prelude.ts +3 -0
  421. package/src/eval/py/runner.py +1388 -0
  422. package/src/eval/py/runtime.ts +276 -0
  423. package/src/eval/py/spawn-options.ts +139 -0
  424. package/src/eval/py/tool-bridge.ts +181 -0
  425. package/src/eval/rb/executor.ts +504 -0
  426. package/src/eval/rb/index.ts +54 -0
  427. package/src/eval/rb/kernel.ts +231 -0
  428. package/src/eval/rb/prelude.rb +552 -0
  429. package/src/eval/rb/prelude.ts +3 -0
  430. package/src/eval/rb/runner.rb +581 -0
  431. package/src/eval/rb/runtime.ts +132 -0
  432. package/src/eval/runtime-env.ts +104 -0
  433. package/src/eval/session-id.ts +8 -0
  434. package/src/eval/types.ts +48 -0
  435. package/src/exa/index.ts +2 -0
  436. package/src/exa/mcp-client.ts +370 -0
  437. package/src/exa/types.ts +69 -0
  438. package/src/exec/bash-executor.ts +627 -0
  439. package/src/exec/direnv.ts +145 -0
  440. package/src/exec/exec.ts +53 -0
  441. package/src/exec/non-interactive-env.ts +118 -0
  442. package/src/export/custom-share.ts +65 -0
  443. package/src/export/html/args.ts +20 -0
  444. package/src/export/html/index.ts +313 -0
  445. package/src/export/html/share-loader.js +102 -0
  446. package/src/export/html/template.css +1355 -0
  447. package/src/export/html/template.html +55 -0
  448. package/src/export/html/template.js +1671 -0
  449. package/src/export/html/tool-views.generated.js +35 -0
  450. package/src/export/html/vendor/highlight.min.js +1213 -0
  451. package/src/export/html/vendor/marked.min.js +6 -0
  452. package/src/export/html/web-palette.ts +126 -0
  453. package/src/export/share.ts +682 -0
  454. package/src/export/ttsr.ts +590 -0
  455. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  456. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  457. package/src/extensibility/custom-commands/index.ts +2 -0
  458. package/src/extensibility/custom-commands/loader.ts +242 -0
  459. package/src/extensibility/custom-commands/types.ts +119 -0
  460. package/src/extensibility/custom-tools/index.ts +7 -0
  461. package/src/extensibility/custom-tools/loader.ts +301 -0
  462. package/src/extensibility/custom-tools/types.ts +286 -0
  463. package/src/extensibility/custom-tools/wrapper.ts +50 -0
  464. package/src/extensibility/extensions/compact-handler.ts +40 -0
  465. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  466. package/src/extensibility/extensions/index.ts +16 -0
  467. package/src/extensibility/extensions/load-errors.ts +13 -0
  468. package/src/extensibility/extensions/loader.ts +624 -0
  469. package/src/extensibility/extensions/managed-timers.ts +83 -0
  470. package/src/extensibility/extensions/model-api.ts +39 -0
  471. package/src/extensibility/extensions/runner.ts +1209 -0
  472. package/src/extensibility/extensions/types.ts +1526 -0
  473. package/src/extensibility/extensions/wrapper.ts +377 -0
  474. package/src/extensibility/hooks/index.ts +6 -0
  475. package/src/extensibility/hooks/loader.ts +244 -0
  476. package/src/extensibility/hooks/runner.ts +425 -0
  477. package/src/extensibility/hooks/tool-wrapper.ts +124 -0
  478. package/src/extensibility/hooks/types.ts +612 -0
  479. package/src/extensibility/legacy-pi-ai-shim.ts +140 -0
  480. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1384 -0
  481. package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
  482. package/src/extensibility/plugins/bun-git-cache.ts +91 -0
  483. package/src/extensibility/plugins/doctor.ts +65 -0
  484. package/src/extensibility/plugins/git-url.ts +367 -0
  485. package/src/extensibility/plugins/index.ts +9 -0
  486. package/src/extensibility/plugins/installer.ts +201 -0
  487. package/src/extensibility/plugins/legacy-pi-compat.ts +2532 -0
  488. package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
  489. package/src/extensibility/plugins/loader.ts +535 -0
  490. package/src/extensibility/plugins/manager.ts +1142 -0
  491. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  492. package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
  493. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  494. package/src/extensibility/plugins/marketplace/manager.ts +926 -0
  495. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  496. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  497. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  498. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  499. package/src/extensibility/plugins/parser.ts +107 -0
  500. package/src/extensibility/plugins/runtime-config.ts +9 -0
  501. package/src/extensibility/plugins/types.ts +194 -0
  502. package/src/extensibility/session-handler-types.ts +21 -0
  503. package/src/extensibility/shared-events.ts +401 -0
  504. package/src/extensibility/skills.ts +511 -0
  505. package/src/extensibility/slash-commands.ts +131 -0
  506. package/src/extensibility/tool-event-input.ts +80 -0
  507. package/src/extensibility/tool-proxy.ts +28 -0
  508. package/src/extensibility/typebox.ts +958 -0
  509. package/src/extensibility/utils.ts +184 -0
  510. package/src/goals/index.ts +3 -0
  511. package/src/goals/runtime.ts +521 -0
  512. package/src/goals/state.ts +37 -0
  513. package/src/goals/tools/goal-tool.ts +251 -0
  514. package/src/hindsight/backend.ts +354 -0
  515. package/src/hindsight/bank.ts +156 -0
  516. package/src/hindsight/client.ts +680 -0
  517. package/src/hindsight/config.ts +193 -0
  518. package/src/hindsight/content.ts +266 -0
  519. package/src/hindsight/index.ts +8 -0
  520. package/src/hindsight/mental-models.ts +429 -0
  521. package/src/hindsight/seeds.json +32 -0
  522. package/src/hindsight/state.ts +550 -0
  523. package/src/hindsight/transcript.ts +71 -0
  524. package/src/index.ts +66 -0
  525. package/src/internal-urls/agent-protocol.ts +180 -0
  526. package/src/internal-urls/artifact-protocol.ts +151 -0
  527. package/src/internal-urls/docs-index.ts +102 -0
  528. package/src/internal-urls/filesystem-resource.ts +34 -0
  529. package/src/internal-urls/history-protocol.ts +198 -0
  530. package/src/internal-urls/index.ts +27 -0
  531. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  532. package/src/internal-urls/json-query.ts +126 -0
  533. package/src/internal-urls/local-protocol.ts +470 -0
  534. package/src/internal-urls/mcp-protocol.ts +165 -0
  535. package/src/internal-urls/memory-protocol.ts +347 -0
  536. package/src/internal-urls/omp-protocol.ts +94 -0
  537. package/src/internal-urls/parse.ts +103 -0
  538. package/src/internal-urls/registry-helpers.ts +132 -0
  539. package/src/internal-urls/router.ts +150 -0
  540. package/src/internal-urls/rule-protocol.ts +45 -0
  541. package/src/internal-urls/skill-protocol.ts +117 -0
  542. package/src/internal-urls/ssh-protocol.ts +368 -0
  543. package/src/internal-urls/types.ts +196 -0
  544. package/src/internal-urls/vault-protocol.ts +940 -0
  545. package/src/internal-urls/xd-protocol.ts +46 -0
  546. package/src/irc/bus.ts +380 -0
  547. package/src/jsonrpc/message-framing.ts +142 -0
  548. package/src/launch/broker.ts +1134 -0
  549. package/src/launch/client.ts +350 -0
  550. package/src/launch/paths.ts +17 -0
  551. package/src/launch/presence.ts +82 -0
  552. package/src/launch/protocol.ts +396 -0
  553. package/src/launch/spawn-options.ts +17 -0
  554. package/src/launch/terminal-output.ts +46 -0
  555. package/src/lib/xai-http.ts +150 -0
  556. package/src/live/attestation.ts +91 -0
  557. package/src/live/controller.ts +517 -0
  558. package/src/live/prompts/agent-final-message.md +3 -0
  559. package/src/live/prompts/live-instructions.md +23 -0
  560. package/src/live/protocol.ts +233 -0
  561. package/src/live/transport.ts +422 -0
  562. package/src/live/visualizer.ts +214 -0
  563. package/src/live/voices.ts +18 -0
  564. package/src/lsp/client.ts +1429 -0
  565. package/src/lsp/clients/biome-client.ts +263 -0
  566. package/src/lsp/clients/index.ts +50 -0
  567. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  568. package/src/lsp/clients/swiftlint-client.ts +120 -0
  569. package/src/lsp/config.ts +549 -0
  570. package/src/lsp/defaults.json +499 -0
  571. package/src/lsp/deferred-diagnostics.ts +66 -0
  572. package/src/lsp/diagnostics-ledger.ts +51 -0
  573. package/src/lsp/edits.ts +288 -0
  574. package/src/lsp/format-options.ts +119 -0
  575. package/src/lsp/index.ts +2766 -0
  576. package/src/lsp/lspmux.ts +233 -0
  577. package/src/lsp/render.ts +668 -0
  578. package/src/lsp/startup-events.ts +13 -0
  579. package/src/lsp/types.ts +453 -0
  580. package/src/lsp/utils.ts +718 -0
  581. package/src/main.ts +1647 -0
  582. package/src/markit/NOTICE +32 -0
  583. package/src/markit/converters/docx.ts +56 -0
  584. package/src/markit/converters/epub.ts +136 -0
  585. package/src/markit/converters/mammoth.d.ts +24 -0
  586. package/src/markit/converters/pdf/columns.ts +103 -0
  587. package/src/markit/converters/pdf/extract.ts +598 -0
  588. package/src/markit/converters/pdf/grid.ts +780 -0
  589. package/src/markit/converters/pdf/headers.ts +106 -0
  590. package/src/markit/converters/pdf/index.ts +146 -0
  591. package/src/markit/converters/pdf/render.ts +501 -0
  592. package/src/markit/converters/pdf/types.ts +84 -0
  593. package/src/markit/converters/pptx.ts +325 -0
  594. package/src/markit/converters/xlsx.ts +173 -0
  595. package/src/markit/index.ts +2 -0
  596. package/src/markit/registry.ts +59 -0
  597. package/src/markit/types.ts +35 -0
  598. package/src/mcp/client.ts +511 -0
  599. package/src/mcp/config-writer.ts +377 -0
  600. package/src/mcp/config.ts +381 -0
  601. package/src/mcp/index.ts +29 -0
  602. package/src/mcp/json-rpc.ts +122 -0
  603. package/src/mcp/loader.ts +125 -0
  604. package/src/mcp/manager.ts +1419 -0
  605. package/src/mcp/oauth-credentials.ts +104 -0
  606. package/src/mcp/oauth-discovery.ts +587 -0
  607. package/src/mcp/oauth-flow.ts +820 -0
  608. package/src/mcp/render.ts +214 -0
  609. package/src/mcp/smithery-auth.ts +108 -0
  610. package/src/mcp/smithery-connect.ts +154 -0
  611. package/src/mcp/smithery-registry.ts +500 -0
  612. package/src/mcp/startup-events.ts +116 -0
  613. package/src/mcp/timeout.ts +59 -0
  614. package/src/mcp/tool-bridge.ts +691 -0
  615. package/src/mcp/tool-cache.ts +117 -0
  616. package/src/mcp/transports/http.ts +523 -0
  617. package/src/mcp/transports/index.ts +7 -0
  618. package/src/mcp/transports/sse.ts +377 -0
  619. package/src/mcp/transports/stdio.ts +903 -0
  620. package/src/mcp/types.ts +437 -0
  621. package/src/memories/index.ts +1434 -0
  622. package/src/memories/storage.ts +578 -0
  623. package/src/memory-backend/index.ts +18 -0
  624. package/src/memory-backend/local-backend.ts +47 -0
  625. package/src/memory-backend/off-backend.ts +25 -0
  626. package/src/memory-backend/resolve.ts +25 -0
  627. package/src/memory-backend/runtime.ts +66 -0
  628. package/src/memory-backend/tool-names.ts +2 -0
  629. package/src/memory-backend/types.ts +166 -0
  630. package/src/mnemopi/backend.ts +629 -0
  631. package/src/mnemopi/config.ts +267 -0
  632. package/src/mnemopi/embed-client.ts +246 -0
  633. package/src/mnemopi/embed-protocol.ts +35 -0
  634. package/src/mnemopi/embed-worker.ts +114 -0
  635. package/src/mnemopi/index.ts +3 -0
  636. package/src/mnemopi/state.ts +906 -0
  637. package/src/modes/acp/acp-agent.ts +2577 -0
  638. package/src/modes/acp/acp-client-bridge.ts +154 -0
  639. package/src/modes/acp/acp-event-mapper.ts +1084 -0
  640. package/src/modes/acp/acp-mode.ts +48 -0
  641. package/src/modes/acp/index.ts +2 -0
  642. package/src/modes/acp/terminal-auth.ts +37 -0
  643. package/src/modes/components/advisor-config.ts +635 -0
  644. package/src/modes/components/advisor-message.ts +109 -0
  645. package/src/modes/components/agent-dashboard.ts +1252 -0
  646. package/src/modes/components/agent-hub.ts +648 -0
  647. package/src/modes/components/agent-transcript-viewer.ts +649 -0
  648. package/src/modes/components/ask-dialog.ts +975 -0
  649. package/src/modes/components/assistant-message.ts +972 -0
  650. package/src/modes/components/background-tan-message.ts +36 -0
  651. package/src/modes/components/bash-execution.ts +233 -0
  652. package/src/modes/components/bordered-loader.ts +41 -0
  653. package/src/modes/components/btw-panel.ts +124 -0
  654. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  655. package/src/modes/components/chat-block.ts +111 -0
  656. package/src/modes/components/chat-transcript-builder.ts +495 -0
  657. package/src/modes/components/collab-prompt-message.ts +32 -0
  658. package/src/modes/components/compaction-summary-message.ts +221 -0
  659. package/src/modes/components/copy-selector.ts +218 -0
  660. package/src/modes/components/countdown-timer.ts +75 -0
  661. package/src/modes/components/custom-editor.ts +1027 -0
  662. package/src/modes/components/custom-message.ts +70 -0
  663. package/src/modes/components/diff.ts +254 -0
  664. package/src/modes/components/dynamic-border.ts +37 -0
  665. package/src/modes/components/error-banner.ts +33 -0
  666. package/src/modes/components/eval-execution.ts +169 -0
  667. package/src/modes/components/execution-shared.ts +101 -0
  668. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  669. package/src/modes/components/extensions/extension-list.ts +507 -0
  670. package/src/modes/components/extensions/index.ts +9 -0
  671. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  672. package/src/modes/components/extensions/state-manager.ts +648 -0
  673. package/src/modes/components/extensions/types.ts +186 -0
  674. package/src/modes/components/footer.ts +276 -0
  675. package/src/modes/components/history-search.ts +268 -0
  676. package/src/modes/components/hook-editor.ts +213 -0
  677. package/src/modes/components/hook-input.ts +87 -0
  678. package/src/modes/components/hook-message.ts +67 -0
  679. package/src/modes/components/hook-selector.ts +691 -0
  680. package/src/modes/components/index.ts +42 -0
  681. package/src/modes/components/keybinding-hints.ts +65 -0
  682. package/src/modes/components/late-diagnostics-message.ts +60 -0
  683. package/src/modes/components/login-dialog.ts +197 -0
  684. package/src/modes/components/logout-account-selector.ts +130 -0
  685. package/src/modes/components/mcp-add-wizard.ts +1413 -0
  686. package/src/modes/components/message-frame.ts +98 -0
  687. package/src/modes/components/model-browser.ts +872 -0
  688. package/src/modes/components/model-hub.ts +2011 -0
  689. package/src/modes/components/model-picker.ts +233 -0
  690. package/src/modes/components/move-overlay.ts +293 -0
  691. package/src/modes/components/oauth-selector.ts +474 -0
  692. package/src/modes/components/omfg-panel.ts +141 -0
  693. package/src/modes/components/overlay-box.ts +109 -0
  694. package/src/modes/components/pause-screen.ts +208 -0
  695. package/src/modes/components/plan-review-overlay.ts +1226 -0
  696. package/src/modes/components/plan-toc.ts +138 -0
  697. package/src/modes/components/plugin-selector.ts +100 -0
  698. package/src/modes/components/plugin-settings.ts +745 -0
  699. package/src/modes/components/queue-mode-selector.ts +61 -0
  700. package/src/modes/components/read-tool-group.ts +678 -0
  701. package/src/modes/components/reset-usage-selector.ts +161 -0
  702. package/src/modes/components/segment-track.ts +89 -0
  703. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  704. package/src/modes/components/selector-helpers.ts +129 -0
  705. package/src/modes/components/session-account-selector.ts +62 -0
  706. package/src/modes/components/session-selector.ts +1019 -0
  707. package/src/modes/components/settings-defs.ts +267 -0
  708. package/src/modes/components/settings-selector.ts +1445 -0
  709. package/src/modes/components/show-images-selector.ts +50 -0
  710. package/src/modes/components/skill-message.ts +110 -0
  711. package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
  712. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  713. package/src/modes/components/status-line/component.ts +1516 -0
  714. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  715. package/src/modes/components/status-line/git-utils.ts +42 -0
  716. package/src/modes/components/status-line/index.ts +5 -0
  717. package/src/modes/components/status-line/presets.ts +106 -0
  718. package/src/modes/components/status-line/segments.ts +710 -0
  719. package/src/modes/components/status-line/separators.ts +55 -0
  720. package/src/modes/components/status-line/types.ts +159 -0
  721. package/src/modes/components/theme-selector.ts +68 -0
  722. package/src/modes/components/thinking-selector.ts +57 -0
  723. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  724. package/src/modes/components/tips.txt +26 -0
  725. package/src/modes/components/todo-reminder.ts +43 -0
  726. package/src/modes/components/tool-execution.ts +1356 -0
  727. package/src/modes/components/transcript-container.ts +527 -0
  728. package/src/modes/components/tree-selector.ts +1008 -0
  729. package/src/modes/components/ttsr-notification.ts +123 -0
  730. package/src/modes/components/usage-row.ts +47 -0
  731. package/src/modes/components/user-message-selector.ts +227 -0
  732. package/src/modes/components/user-message.ts +167 -0
  733. package/src/modes/components/visual-truncate.ts +63 -0
  734. package/src/modes/components/welcome.ts +578 -0
  735. package/src/modes/controllers/btw-controller.ts +198 -0
  736. package/src/modes/controllers/command-controller-shared.ts +109 -0
  737. package/src/modes/controllers/command-controller.ts +1993 -0
  738. package/src/modes/controllers/event-controller.ts +1781 -0
  739. package/src/modes/controllers/extension-ui-controller.ts +1242 -0
  740. package/src/modes/controllers/input-controller.ts +2004 -0
  741. package/src/modes/controllers/live-command-controller.ts +260 -0
  742. package/src/modes/controllers/mcp-command-controller.ts +2403 -0
  743. package/src/modes/controllers/omfg-controller.ts +287 -0
  744. package/src/modes/controllers/omfg-rule.ts +647 -0
  745. package/src/modes/controllers/selector-controller.ts +1968 -0
  746. package/src/modes/controllers/session-focus-controller.ts +117 -0
  747. package/src/modes/controllers/ssh-command-controller.ts +385 -0
  748. package/src/modes/controllers/streaming-reveal.ts +399 -0
  749. package/src/modes/controllers/tan-command-controller.ts +229 -0
  750. package/src/modes/controllers/todo-command-controller.ts +487 -0
  751. package/src/modes/controllers/tool-args-reveal.ts +591 -0
  752. package/src/modes/data/emojis.json +1 -0
  753. package/src/modes/emoji-autocomplete.ts +285 -0
  754. package/src/modes/github-ref-autocomplete.ts +75 -0
  755. package/src/modes/gradient-highlight.ts +99 -0
  756. package/src/modes/image-references.ts +137 -0
  757. package/src/modes/index.ts +10 -0
  758. package/src/modes/interactive-mode.ts +4957 -0
  759. package/src/modes/internal-url-autocomplete.ts +158 -0
  760. package/src/modes/loop-limit.ts +192 -0
  761. package/src/modes/magic-keyword-boundary.ts +23 -0
  762. package/src/modes/magic-keywords.ts +42 -0
  763. package/src/modes/markdown-prose.ts +247 -0
  764. package/src/modes/oauth-manual-input.ts +69 -0
  765. package/src/modes/orchestrate.ts +43 -0
  766. package/src/modes/print-mode.ts +265 -0
  767. package/src/modes/prompt-action-autocomplete.ts +322 -0
  768. package/src/modes/queue-input.ts +132 -0
  769. package/src/modes/rpc/host-tools.ts +204 -0
  770. package/src/modes/rpc/host-uris.ts +235 -0
  771. package/src/modes/rpc/rpc-client.ts +1195 -0
  772. package/src/modes/rpc/rpc-frame.ts +316 -0
  773. package/src/modes/rpc/rpc-input.ts +38 -0
  774. package/src/modes/rpc/rpc-messages.ts +127 -0
  775. package/src/modes/rpc/rpc-mode.ts +1504 -0
  776. package/src/modes/rpc/rpc-subagents.ts +265 -0
  777. package/src/modes/rpc/rpc-types.ts +533 -0
  778. package/src/modes/running-subagent-badge.ts +13 -0
  779. package/src/modes/runtime-init.ts +144 -0
  780. package/src/modes/session-observer-registry.ts +218 -0
  781. package/src/modes/session-teardown.ts +82 -0
  782. package/src/modes/setup-version.ts +11 -0
  783. package/src/modes/setup-wizard/index.ts +103 -0
  784. package/src/modes/setup-wizard/lazy.ts +16 -0
  785. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  786. package/src/modes/setup-wizard/scenes/model.ts +132 -0
  787. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  788. package/src/modes/setup-wizard/scenes/providers.ts +105 -0
  789. package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
  790. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  791. package/src/modes/setup-wizard/scenes/theme.ts +330 -0
  792. package/src/modes/setup-wizard/scenes/types.ts +65 -0
  793. package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
  794. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  795. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  796. package/src/modes/shared.ts +49 -0
  797. package/src/modes/skill-command.ts +91 -0
  798. package/src/modes/theme/dark.json +95 -0
  799. package/src/modes/theme/defaults/alabaster.json +93 -0
  800. package/src/modes/theme/defaults/amethyst.json +96 -0
  801. package/src/modes/theme/defaults/anthracite.json +93 -0
  802. package/src/modes/theme/defaults/basalt.json +91 -0
  803. package/src/modes/theme/defaults/birch.json +95 -0
  804. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  805. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  806. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  807. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  808. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  809. package/src/modes/theme/defaults/dark-copper.json +95 -0
  810. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  811. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  812. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  813. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  814. package/src/modes/theme/defaults/dark-ember.json +95 -0
  815. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  816. package/src/modes/theme/defaults/dark-forest.json +96 -0
  817. package/src/modes/theme/defaults/dark-github.json +105 -0
  818. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  819. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  820. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  821. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  822. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  823. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  824. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  825. package/src/modes/theme/defaults/dark-nord.json +97 -0
  826. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  827. package/src/modes/theme/defaults/dark-one.json +100 -0
  828. package/src/modes/theme/defaults/dark-poimandres.json +143 -0
  829. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  830. package/src/modes/theme/defaults/dark-reef.json +91 -0
  831. package/src/modes/theme/defaults/dark-retro.json +92 -0
  832. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  833. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  834. package/src/modes/theme/defaults/dark-slate.json +95 -0
  835. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  836. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  837. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  838. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  839. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  840. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  841. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  842. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  843. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  844. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  845. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  846. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  847. package/src/modes/theme/defaults/graphite.json +92 -0
  848. package/src/modes/theme/defaults/index.ts +199 -0
  849. package/src/modes/theme/defaults/light-arctic.json +107 -0
  850. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  851. package/src/modes/theme/defaults/light-canyon.json +91 -0
  852. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  853. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  854. package/src/modes/theme/defaults/light-coral.json +95 -0
  855. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  856. package/src/modes/theme/defaults/light-dawn.json +90 -0
  857. package/src/modes/theme/defaults/light-dunes.json +91 -0
  858. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  859. package/src/modes/theme/defaults/light-forest.json +100 -0
  860. package/src/modes/theme/defaults/light-frost.json +95 -0
  861. package/src/modes/theme/defaults/light-github.json +115 -0
  862. package/src/modes/theme/defaults/light-glacier.json +91 -0
  863. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  864. package/src/modes/theme/defaults/light-haze.json +90 -0
  865. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  866. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  867. package/src/modes/theme/defaults/light-lavender.json +95 -0
  868. package/src/modes/theme/defaults/light-meadow.json +91 -0
  869. package/src/modes/theme/defaults/light-mint.json +95 -0
  870. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  871. package/src/modes/theme/defaults/light-ocean.json +99 -0
  872. package/src/modes/theme/defaults/light-one.json +99 -0
  873. package/src/modes/theme/defaults/light-opal.json +91 -0
  874. package/src/modes/theme/defaults/light-orchard.json +91 -0
  875. package/src/modes/theme/defaults/light-paper.json +95 -0
  876. package/src/modes/theme/defaults/light-poimandres.json +143 -0
  877. package/src/modes/theme/defaults/light-prism.json +90 -0
  878. package/src/modes/theme/defaults/light-retro.json +98 -0
  879. package/src/modes/theme/defaults/light-sand.json +95 -0
  880. package/src/modes/theme/defaults/light-savanna.json +91 -0
  881. package/src/modes/theme/defaults/light-solarized.json +102 -0
  882. package/src/modes/theme/defaults/light-soleil.json +90 -0
  883. package/src/modes/theme/defaults/light-sunset.json +99 -0
  884. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  885. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  886. package/src/modes/theme/defaults/light-wetland.json +91 -0
  887. package/src/modes/theme/defaults/light-zenith.json +89 -0
  888. package/src/modes/theme/defaults/limestone.json +94 -0
  889. package/src/modes/theme/defaults/mahogany.json +97 -0
  890. package/src/modes/theme/defaults/marble.json +93 -0
  891. package/src/modes/theme/defaults/obsidian.json +91 -0
  892. package/src/modes/theme/defaults/onyx.json +91 -0
  893. package/src/modes/theme/defaults/pearl.json +93 -0
  894. package/src/modes/theme/defaults/porcelain.json +91 -0
  895. package/src/modes/theme/defaults/quartz.json +96 -0
  896. package/src/modes/theme/defaults/sandstone.json +95 -0
  897. package/src/modes/theme/defaults/titanium.json +90 -0
  898. package/src/modes/theme/light.json +93 -0
  899. package/src/modes/theme/mermaid-cache.ts +92 -0
  900. package/src/modes/theme/shimmer.ts +305 -0
  901. package/src/modes/theme/theme-schema.json +463 -0
  902. package/src/modes/theme/theme.ts +3019 -0
  903. package/src/modes/turn-budget.ts +31 -0
  904. package/src/modes/types.ts +479 -0
  905. package/src/modes/ultrathink.ts +42 -0
  906. package/src/modes/utils/context-usage.ts +518 -0
  907. package/src/modes/utils/copy-targets.ts +378 -0
  908. package/src/modes/utils/hotkeys-markdown.ts +63 -0
  909. package/src/modes/utils/interactive-context-helpers.ts +30 -0
  910. package/src/modes/utils/keybinding-matchers.ts +86 -0
  911. package/src/modes/utils/tools-markdown.ts +31 -0
  912. package/src/modes/utils/transcript-render-helpers.ts +253 -0
  913. package/src/modes/utils/ui-helpers.ts +963 -0
  914. package/src/modes/warp-events.ts +232 -0
  915. package/src/modes/workflow.ts +49 -0
  916. package/src/plan-mode/approved-plan.ts +194 -0
  917. package/src/plan-mode/model-transition.ts +51 -0
  918. package/src/plan-mode/plan-files.ts +40 -0
  919. package/src/plan-mode/plan-handoff.ts +37 -0
  920. package/src/plan-mode/plan-protection.ts +31 -0
  921. package/src/plan-mode/state.ts +6 -0
  922. package/src/priority.json +60 -0
  923. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  924. package/src/prompts/advisor/advise-tool.md +3 -0
  925. package/src/prompts/advisor/context-files.md +8 -0
  926. package/src/prompts/advisor/system.md +98 -0
  927. package/src/prompts/agents/designer.md +74 -0
  928. package/src/prompts/agents/frontmatter.md +12 -0
  929. package/src/prompts/agents/init.md +33 -0
  930. package/src/prompts/agents/librarian.md +119 -0
  931. package/src/prompts/agents/reviewer.md +139 -0
  932. package/src/prompts/agents/scout.md +58 -0
  933. package/src/prompts/agents/task.md +17 -0
  934. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  935. package/src/prompts/bench/cache-prefix.md +3 -0
  936. package/src/prompts/bench/cache-suffix.md +1 -0
  937. package/src/prompts/bench.md +6 -0
  938. package/src/prompts/ci-green-request.md +36 -0
  939. package/src/prompts/dry-balance-bench.md +8 -0
  940. package/src/prompts/goals/goal-budget-limit.md +16 -0
  941. package/src/prompts/goals/goal-continuation.md +28 -0
  942. package/src/prompts/goals/goal-mode-active.md +23 -0
  943. package/src/prompts/goals/goal-mode-context.md +4 -0
  944. package/src/prompts/goals/goal-todo-context.md +12 -0
  945. package/src/prompts/goals/guided-goal-interview.md +43 -0
  946. package/src/prompts/memories/consolidation.md +30 -0
  947. package/src/prompts/memories/consolidation_system.md +4 -0
  948. package/src/prompts/memories/read-path.md +17 -0
  949. package/src/prompts/memories/stage_one_input.md +6 -0
  950. package/src/prompts/memories/stage_one_system.md +21 -0
  951. package/src/prompts/review-custom-request.md +21 -0
  952. package/src/prompts/review-headless-request.md +16 -0
  953. package/src/prompts/review-request.md +68 -0
  954. package/src/prompts/skills/autoload.md +8 -0
  955. package/src/prompts/skills/user-invocation.md +11 -0
  956. package/src/prompts/steering/parent-irc.md +5 -0
  957. package/src/prompts/steering/user-interjection.md +6 -0
  958. package/src/prompts/system/active-repo-context.md +4 -0
  959. package/src/prompts/system/agent-creation-architect.md +50 -0
  960. package/src/prompts/system/agent-creation-user.md +6 -0
  961. package/src/prompts/system/auto-continue.md +1 -0
  962. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  963. package/src/prompts/system/auto-thinking-difficulty.md +12 -0
  964. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  965. package/src/prompts/system/autolearn-guidance.md +7 -0
  966. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  967. package/src/prompts/system/background-tan-dispatch.md +8 -0
  968. package/src/prompts/system/btw-user.md +8 -0
  969. package/src/prompts/system/commit-message-system.md +14 -0
  970. package/src/prompts/system/computer-safety.md +14 -0
  971. package/src/prompts/system/custom-system-prompt.md +64 -0
  972. package/src/prompts/system/eager-task.md +7 -0
  973. package/src/prompts/system/eager-todo.md +18 -0
  974. package/src/prompts/system/empty-stop-retry.md +4 -0
  975. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  976. package/src/prompts/system/interrupted-thinking.md +7 -0
  977. package/src/prompts/system/irc-autoreply.md +6 -0
  978. package/src/prompts/system/irc-incoming.md +9 -0
  979. package/src/prompts/system/manual-continue.md +7 -0
  980. package/src/prompts/system/mcp-xdev-guidance.md +11 -0
  981. package/src/prompts/system/memory-consolidation-system.md +8 -0
  982. package/src/prompts/system/memory-extraction-system.md +26 -0
  983. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  984. package/src/prompts/system/omfg-user.md +50 -0
  985. package/src/prompts/system/orchestrate-notice.md +40 -0
  986. package/src/prompts/system/personalities/default.md +18 -0
  987. package/src/prompts/system/personalities/friendly.md +17 -0
  988. package/src/prompts/system/personalities/pragmatic.md +15 -0
  989. package/src/prompts/system/plan-mode-active.md +125 -0
  990. package/src/prompts/system/plan-mode-approved.md +22 -0
  991. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  992. package/src/prompts/system/plan-mode-reference.md +10 -0
  993. package/src/prompts/system/plan-mode-subagent.md +33 -0
  994. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  995. package/src/prompts/system/plan-yolo-handoff.md +5 -0
  996. package/src/prompts/system/prewalk-checklist.md +7 -0
  997. package/src/prompts/system/prewalk-continue.md +1 -0
  998. package/src/prompts/system/prewalk-plan.md +13 -0
  999. package/src/prompts/system/project-prompt.md +61 -0
  1000. package/src/prompts/system/recap-user.md +9 -0
  1001. package/src/prompts/system/resolve-device-reminder.md +3 -0
  1002. package/src/prompts/system/rewind-report.md +6 -0
  1003. package/src/prompts/system/side-channel-no-tools.md +3 -0
  1004. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  1005. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  1006. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  1007. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  1008. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  1009. package/src/prompts/system/speech-rewrite.md +15 -0
  1010. package/src/prompts/system/subagent-async-pending.md +6 -0
  1011. package/src/prompts/system/subagent-system-prompt.md +73 -0
  1012. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1013. package/src/prompts/system/subagent-yield-reminder.md +23 -0
  1014. package/src/prompts/system/system-prompt.md +283 -0
  1015. package/src/prompts/system/tan-context-switch.md +17 -0
  1016. package/src/prompts/system/task-label.md +23 -0
  1017. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  1018. package/src/prompts/system/title-marker-instruction.md +1 -0
  1019. package/src/prompts/system/title-system.md +16 -0
  1020. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  1021. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1022. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1023. package/src/prompts/system/ultrathink-notice.md +3 -0
  1024. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  1025. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  1026. package/src/prompts/system/vibe-mode-active.md +26 -0
  1027. package/src/prompts/system/web-search.md +25 -0
  1028. package/src/prompts/system/workflow-notice.md +112 -0
  1029. package/src/prompts/system/xdev-mount-notice.md +20 -0
  1030. package/src/prompts/tools/apply-patch.md +65 -0
  1031. package/src/prompts/tools/ask.md +22 -0
  1032. package/src/prompts/tools/ast-edit.md +11 -0
  1033. package/src/prompts/tools/ast-grep.md +19 -0
  1034. package/src/prompts/tools/async-result.md +8 -0
  1035. package/src/prompts/tools/bash.md +25 -0
  1036. package/src/prompts/tools/browser.md +28 -0
  1037. package/src/prompts/tools/checkpoint.md +15 -0
  1038. package/src/prompts/tools/computer.md +26 -0
  1039. package/src/prompts/tools/debug.md +3 -0
  1040. package/src/prompts/tools/eval.md +45 -0
  1041. package/src/prompts/tools/github.md +22 -0
  1042. package/src/prompts/tools/glob.md +15 -0
  1043. package/src/prompts/tools/goal.md +11 -0
  1044. package/src/prompts/tools/grep.md +12 -0
  1045. package/src/prompts/tools/hub.md +34 -0
  1046. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  1047. package/src/prompts/tools/image-attachment-describe.md +10 -0
  1048. package/src/prompts/tools/image-gen.md +7 -0
  1049. package/src/prompts/tools/inspect-image-system.md +20 -0
  1050. package/src/prompts/tools/inspect-image.md +22 -0
  1051. package/src/prompts/tools/learn.md +7 -0
  1052. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  1053. package/src/prompts/tools/lsp.md +19 -0
  1054. package/src/prompts/tools/manage-skill.md +9 -0
  1055. package/src/prompts/tools/memory-edit.md +12 -0
  1056. package/src/prompts/tools/patch.md +57 -0
  1057. package/src/prompts/tools/read.md +27 -0
  1058. package/src/prompts/tools/recall.md +7 -0
  1059. package/src/prompts/tools/reflect.md +5 -0
  1060. package/src/prompts/tools/replace.md +29 -0
  1061. package/src/prompts/tools/retain.md +6 -0
  1062. package/src/prompts/tools/rewind.md +14 -0
  1063. package/src/prompts/tools/task-async-contract.md +1 -0
  1064. package/src/prompts/tools/task-summary.md +20 -0
  1065. package/src/prompts/tools/task.md +83 -0
  1066. package/src/prompts/tools/todo.md +42 -0
  1067. package/src/prompts/tools/vibe-kill.md +3 -0
  1068. package/src/prompts/tools/vibe-list.md +3 -0
  1069. package/src/prompts/tools/vibe-send.md +9 -0
  1070. package/src/prompts/tools/vibe-spawn.md +10 -0
  1071. package/src/prompts/tools/vibe-turn-result.md +19 -0
  1072. package/src/prompts/tools/vibe-wait.md +8 -0
  1073. package/src/prompts/tools/web-search.md +8 -0
  1074. package/src/prompts/tools/write.md +14 -0
  1075. package/src/registry/agent-lifecycle.ts +455 -0
  1076. package/src/registry/agent-registry.ts +217 -0
  1077. package/src/registry/persisted-agents.ts +98 -0
  1078. package/src/sdk.ts +3553 -0
  1079. package/src/secrets/index.ts +246 -0
  1080. package/src/secrets/obfuscator.ts +2574 -0
  1081. package/src/secrets/regex.ts +21 -0
  1082. package/src/session/acp-permission-gate.ts +165 -0
  1083. package/src/session/agent-session-events.ts +66 -0
  1084. package/src/session/agent-session-types.ts +346 -0
  1085. package/src/session/agent-session.ts +8406 -0
  1086. package/src/session/agent-storage.ts +805 -0
  1087. package/src/session/artifacts.ts +154 -0
  1088. package/src/session/async-job-delivery.ts +82 -0
  1089. package/src/session/auth-broker-config.ts +92 -0
  1090. package/src/session/auth-storage.ts +25 -0
  1091. package/src/session/bash-runner.ts +326 -0
  1092. package/src/session/blob-store.ts +295 -0
  1093. package/src/session/checkpoint-entries.ts +81 -0
  1094. package/src/session/client-bridge.ts +85 -0
  1095. package/src/session/codex-auto-reset.ts +202 -0
  1096. package/src/session/compact-modes.ts +105 -0
  1097. package/src/session/eval-runner.ts +217 -0
  1098. package/src/session/exit-diagnostics.ts +310 -0
  1099. package/src/session/history-storage.ts +327 -0
  1100. package/src/session/indexed-session-storage.ts +544 -0
  1101. package/src/session/irc-bridge.ts +203 -0
  1102. package/src/session/messages.ts +1280 -0
  1103. package/src/session/model-controls.ts +750 -0
  1104. package/src/session/prewalk.ts +257 -0
  1105. package/src/session/provider-image-budget.ts +86 -0
  1106. package/src/session/queued-messages.ts +99 -0
  1107. package/src/session/redis-session-storage.ts +257 -0
  1108. package/src/session/retry-fallback-chains.ts +455 -0
  1109. package/src/session/role-models.ts +85 -0
  1110. package/src/session/session-advisors.ts +1754 -0
  1111. package/src/session/session-context.ts +554 -0
  1112. package/src/session/session-dump-format.ts +216 -0
  1113. package/src/session/session-entries.ts +260 -0
  1114. package/src/session/session-handoff.ts +308 -0
  1115. package/src/session/session-history-format.ts +459 -0
  1116. package/src/session/session-listing.ts +715 -0
  1117. package/src/session/session-loader.ts +280 -0
  1118. package/src/session/session-maintenance.ts +2983 -0
  1119. package/src/session/session-manager.ts +2557 -0
  1120. package/src/session/session-memory.ts +222 -0
  1121. package/src/session/session-metadata.ts +53 -0
  1122. package/src/session/session-migrations.ts +78 -0
  1123. package/src/session/session-paths.ts +222 -0
  1124. package/src/session/session-persistence.ts +293 -0
  1125. package/src/session/session-provider-boundary.ts +306 -0
  1126. package/src/session/session-stats.ts +293 -0
  1127. package/src/session/session-storage.ts +734 -0
  1128. package/src/session/session-title-slot.ts +141 -0
  1129. package/src/session/session-tools.ts +1226 -0
  1130. package/src/session/session-workspace.ts +53 -0
  1131. package/src/session/settings-stream-fn.ts +74 -0
  1132. package/src/session/shake-types.ts +43 -0
  1133. package/src/session/snapcompact-inline.ts +545 -0
  1134. package/src/session/snapcompact-savings-journal.ts +113 -0
  1135. package/src/session/sql-session-storage.ts +374 -0
  1136. package/src/session/stream-guards.ts +417 -0
  1137. package/src/session/streaming-output.ts +1459 -0
  1138. package/src/session/todo-tracker.ts +380 -0
  1139. package/src/session/tool-choice-queue.ts +305 -0
  1140. package/src/session/ttsr-coordinator.ts +496 -0
  1141. package/src/session/turn-persistence.ts +142 -0
  1142. package/src/session/turn-recovery.ts +1728 -0
  1143. package/src/session/unexpected-stop-classifier.ts +132 -0
  1144. package/src/session/yield-queue.ts +183 -0
  1145. package/src/slash-commands/acp-builtins.ts +70 -0
  1146. package/src/slash-commands/available-commands.ts +105 -0
  1147. package/src/slash-commands/builtin-registry.ts +2982 -0
  1148. package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
  1149. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  1150. package/src/slash-commands/helpers/context-report.ts +66 -0
  1151. package/src/slash-commands/helpers/format.ts +46 -0
  1152. package/src/slash-commands/helpers/logout.ts +108 -0
  1153. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  1154. package/src/slash-commands/helpers/mcp.ts +533 -0
  1155. package/src/slash-commands/helpers/parse.ts +85 -0
  1156. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  1157. package/src/slash-commands/helpers/session-pin.ts +44 -0
  1158. package/src/slash-commands/helpers/ssh.ts +196 -0
  1159. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  1160. package/src/slash-commands/helpers/todo.ts +285 -0
  1161. package/src/slash-commands/helpers/usage-report.ts +198 -0
  1162. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1163. package/src/slash-commands/types.ts +139 -0
  1164. package/src/ssh/config-writer.ts +183 -0
  1165. package/src/ssh/connection-manager.ts +667 -0
  1166. package/src/ssh/file-transfer.ts +214 -0
  1167. package/src/ssh/sshfs-mount.ts +163 -0
  1168. package/src/ssh/utils.ts +51 -0
  1169. package/src/startup-splash.ts +19 -0
  1170. package/src/stt/asr-client.ts +401 -0
  1171. package/src/stt/asr-protocol.ts +65 -0
  1172. package/src/stt/asr-worker.ts +603 -0
  1173. package/src/stt/downloader.ts +142 -0
  1174. package/src/stt/endpointer.ts +259 -0
  1175. package/src/stt/index.ts +6 -0
  1176. package/src/stt/models.ts +150 -0
  1177. package/src/stt/sherpa-runtime.ts +71 -0
  1178. package/src/stt/stt-controller.ts +320 -0
  1179. package/src/stt/submit-trigger.ts +74 -0
  1180. package/src/subprocess/worker-client.ts +463 -0
  1181. package/src/subprocess/worker-runtime.ts +494 -0
  1182. package/src/system-prompt.ts +894 -0
  1183. package/src/task/agents.ts +168 -0
  1184. package/src/task/commands.ts +132 -0
  1185. package/src/task/discovery.ts +145 -0
  1186. package/src/task/executor.ts +3129 -0
  1187. package/src/task/index.ts +1519 -0
  1188. package/src/task/isolation-ownership.ts +106 -0
  1189. package/src/task/isolation-runner.ts +413 -0
  1190. package/src/task/label.ts +40 -0
  1191. package/src/task/name-generator.ts +1577 -0
  1192. package/src/task/omp-command.ts +26 -0
  1193. package/src/task/output-manager.ts +115 -0
  1194. package/src/task/parallel.ts +221 -0
  1195. package/src/task/persisted-revive.ts +141 -0
  1196. package/src/task/prewalk.ts +6 -0
  1197. package/src/task/prompt-policy.ts +8 -0
  1198. package/src/task/provider-concurrency.ts +100 -0
  1199. package/src/task/render.ts +1814 -0
  1200. package/src/task/renderer.ts +14 -0
  1201. package/src/task/repair-args.ts +118 -0
  1202. package/src/task/spawn-policy.ts +58 -0
  1203. package/src/task/structured-subagent.ts +649 -0
  1204. package/src/task/subprocess-tool-registry.ts +88 -0
  1205. package/src/task/types.ts +551 -0
  1206. package/src/task/worktree.ts +967 -0
  1207. package/src/task/yield-assembly.ts +198 -0
  1208. package/src/telemetry-export.ts +500 -0
  1209. package/src/thinking.ts +364 -0
  1210. package/src/tiny/device.ts +111 -0
  1211. package/src/tiny/dtype.ts +101 -0
  1212. package/src/tiny/message-preproc.ts +155 -0
  1213. package/src/tiny/models.ts +268 -0
  1214. package/src/tiny/text.ts +278 -0
  1215. package/src/tiny/title-client.ts +460 -0
  1216. package/src/tiny/title-protocol.ts +56 -0
  1217. package/src/tiny/worker.ts +354 -0
  1218. package/src/tools/acp-bridge.ts +81 -0
  1219. package/src/tools/approval.ts +245 -0
  1220. package/src/tools/ask.ts +1459 -0
  1221. package/src/tools/ast-edit.ts +718 -0
  1222. package/src/tools/ast-grep.ts +520 -0
  1223. package/src/tools/auto-generated-guard.ts +335 -0
  1224. package/src/tools/bash-interactive.ts +435 -0
  1225. package/src/tools/bash-interceptor.ts +67 -0
  1226. package/src/tools/bash-pty-selection.ts +14 -0
  1227. package/src/tools/bash-skill-urls.ts +335 -0
  1228. package/src/tools/bash.ts +1762 -0
  1229. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  1230. package/src/tools/browser/aria/aria-snapshot.ts +131 -0
  1231. package/src/tools/browser/attach.ts +194 -0
  1232. package/src/tools/browser/cmux/cmux-tab.ts +1400 -0
  1233. package/src/tools/browser/cmux/rpc.ts +206 -0
  1234. package/src/tools/browser/cmux/socket-client.ts +445 -0
  1235. package/src/tools/browser/launch.ts +788 -0
  1236. package/src/tools/browser/readable.ts +112 -0
  1237. package/src/tools/browser/registry.ts +287 -0
  1238. package/src/tools/browser/render.ts +226 -0
  1239. package/src/tools/browser/run-cancellation.ts +131 -0
  1240. package/src/tools/browser/run-output.ts +76 -0
  1241. package/src/tools/browser/tab-protocol.ts +115 -0
  1242. package/src/tools/browser/tab-supervisor.ts +1040 -0
  1243. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1244. package/src/tools/browser/tab-worker.ts +1842 -0
  1245. package/src/tools/browser.ts +457 -0
  1246. package/src/tools/builtin-names.ts +66 -0
  1247. package/src/tools/checkpoint.ts +150 -0
  1248. package/src/tools/computer/exposure.ts +38 -0
  1249. package/src/tools/computer/protocol.ts +28 -0
  1250. package/src/tools/computer/supervisor.ts +306 -0
  1251. package/src/tools/computer/worker-entry.ts +34 -0
  1252. package/src/tools/computer/worker.ts +131 -0
  1253. package/src/tools/computer-renderer.ts +108 -0
  1254. package/src/tools/computer.ts +516 -0
  1255. package/src/tools/conflict-detect.ts +815 -0
  1256. package/src/tools/context.ts +46 -0
  1257. package/src/tools/debug.ts +1121 -0
  1258. package/src/tools/default-renderer.ts +139 -0
  1259. package/src/tools/essential-tools.ts +46 -0
  1260. package/src/tools/eval-backends.ts +34 -0
  1261. package/src/tools/eval-format/index.ts +24 -0
  1262. package/src/tools/eval-format/javascript.ts +952 -0
  1263. package/src/tools/eval-format/julia.ts +446 -0
  1264. package/src/tools/eval-format/python.ts +544 -0
  1265. package/src/tools/eval-format/ruby.ts +380 -0
  1266. package/src/tools/eval-render.ts +784 -0
  1267. package/src/tools/eval.ts +774 -0
  1268. package/src/tools/fetch.ts +1889 -0
  1269. package/src/tools/file-recorder.ts +35 -0
  1270. package/src/tools/fs-cache-invalidation.ts +28 -0
  1271. package/src/tools/gh-cache-invalidation.ts +175 -0
  1272. package/src/tools/gh-format.ts +12 -0
  1273. package/src/tools/gh-renderer.ts +484 -0
  1274. package/src/tools/gh.ts +3959 -0
  1275. package/src/tools/github-cache.ts +663 -0
  1276. package/src/tools/glob.ts +682 -0
  1277. package/src/tools/grep.ts +1858 -0
  1278. package/src/tools/grouped-file-output.ts +210 -0
  1279. package/src/tools/hub/index.ts +579 -0
  1280. package/src/tools/hub/jobs.ts +714 -0
  1281. package/src/tools/hub/launch.ts +579 -0
  1282. package/src/tools/hub/messaging.ts +735 -0
  1283. package/src/tools/hub/types.ts +117 -0
  1284. package/src/tools/image-gen.ts +1689 -0
  1285. package/src/tools/image-providers.ts +50 -0
  1286. package/src/tools/index.ts +691 -0
  1287. package/src/tools/inspect-image-renderer.ts +133 -0
  1288. package/src/tools/inspect-image.ts +290 -0
  1289. package/src/tools/json-tree.ts +260 -0
  1290. package/src/tools/jtd-to-json-schema.ts +219 -0
  1291. package/src/tools/jtd-to-typescript.ts +136 -0
  1292. package/src/tools/jtd-utils.ts +102 -0
  1293. package/src/tools/learn.ts +141 -0
  1294. package/src/tools/list-limit.ts +40 -0
  1295. package/src/tools/manage-skill.ts +102 -0
  1296. package/src/tools/match-line-format.ts +20 -0
  1297. package/src/tools/memory-edit.ts +61 -0
  1298. package/src/tools/memory-recall.ts +102 -0
  1299. package/src/tools/memory-reflect.ts +88 -0
  1300. package/src/tools/memory-render.ts +211 -0
  1301. package/src/tools/memory-retain.ts +89 -0
  1302. package/src/tools/output-meta.ts +845 -0
  1303. package/src/tools/output-schema-validator.ts +307 -0
  1304. package/src/tools/path-utils.ts +1381 -0
  1305. package/src/tools/plan-mode-guard.ts +155 -0
  1306. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  1307. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  1308. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  1309. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  1310. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  1311. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  1312. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  1313. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  1314. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  1315. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  1316. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  1317. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  1318. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  1319. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  1320. package/src/tools/read.ts +3742 -0
  1321. package/src/tools/render-utils.ts +924 -0
  1322. package/src/tools/renderers.ts +133 -0
  1323. package/src/tools/report-tool-issue.ts +568 -0
  1324. package/src/tools/resolve.ts +423 -0
  1325. package/src/tools/review.ts +103 -0
  1326. package/src/tools/shell-tokenize.ts +83 -0
  1327. package/src/tools/sqlite-reader.ts +884 -0
  1328. package/src/tools/terminal-output.ts +141 -0
  1329. package/src/tools/todo.ts +1226 -0
  1330. package/src/tools/tool-errors.ts +62 -0
  1331. package/src/tools/tool-result.ts +102 -0
  1332. package/src/tools/tool-timeouts.ts +37 -0
  1333. package/src/tools/tts.ts +266 -0
  1334. package/src/tools/vibe.ts +607 -0
  1335. package/src/tools/write.ts +1640 -0
  1336. package/src/tools/xdev.ts +508 -0
  1337. package/src/tools/yield.ts +486 -0
  1338. package/src/tts/downloader.ts +64 -0
  1339. package/src/tts/index.ts +10 -0
  1340. package/src/tts/models.ts +137 -0
  1341. package/src/tts/runtime.ts +21 -0
  1342. package/src/tts/speakable.ts +392 -0
  1343. package/src/tts/speech-enhancer.ts +206 -0
  1344. package/src/tts/streaming-player.ts +120 -0
  1345. package/src/tts/tts-client.ts +475 -0
  1346. package/src/tts/tts-protocol.ts +69 -0
  1347. package/src/tts/tts-worker.ts +434 -0
  1348. package/src/tts/vocalizer.ts +419 -0
  1349. package/src/tts/wav.ts +58 -0
  1350. package/src/tui/code-cell.ts +268 -0
  1351. package/src/tui/file-list.ts +55 -0
  1352. package/src/tui/hyperlink.ts +178 -0
  1353. package/src/tui/index.ts +13 -0
  1354. package/src/tui/output-block.ts +268 -0
  1355. package/src/tui/status-line.ts +54 -0
  1356. package/src/tui/tree-list.ts +172 -0
  1357. package/src/tui/types.ts +15 -0
  1358. package/src/tui/utils.ts +103 -0
  1359. package/src/tui/width-aware-text.ts +58 -0
  1360. package/src/utils/active-repo-context.ts +143 -0
  1361. package/src/utils/block-context.ts +312 -0
  1362. package/src/utils/changelog.ts +232 -0
  1363. package/src/utils/clipboard.ts +327 -0
  1364. package/src/utils/command-args.ts +76 -0
  1365. package/src/utils/commit-message-generator.ts +148 -0
  1366. package/src/utils/cpuprofile.ts +235 -0
  1367. package/src/utils/edit-mode.ts +61 -0
  1368. package/src/utils/enhanced-paste.ts +230 -0
  1369. package/src/utils/event-bus.ts +33 -0
  1370. package/src/utils/external-editor.ts +78 -0
  1371. package/src/utils/fetch-timeout.ts +10 -0
  1372. package/src/utils/file-display-mode.ts +44 -0
  1373. package/src/utils/file-mentions.ts +293 -0
  1374. package/src/utils/git.ts +2425 -0
  1375. package/src/utils/image-loading.ts +231 -0
  1376. package/src/utils/image-resize.ts +420 -0
  1377. package/src/utils/image-vision-fallback.ts +196 -0
  1378. package/src/utils/inspect-image-mode.ts +39 -0
  1379. package/src/utils/ipc.ts +38 -0
  1380. package/src/utils/jj.ts +416 -0
  1381. package/src/utils/lang-from-path.ts +251 -0
  1382. package/src/utils/local-date.ts +7 -0
  1383. package/src/utils/mac-file-urls.applescript +37 -0
  1384. package/src/utils/markit-cache.ts +166 -0
  1385. package/src/utils/markit.ts +223 -0
  1386. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1387. package/src/utils/open.ts +126 -0
  1388. package/src/utils/profile-tree.ts +111 -0
  1389. package/src/utils/prompt-path.ts +3 -0
  1390. package/src/utils/qrcode.ts +535 -0
  1391. package/src/utils/sample-profile.ts +437 -0
  1392. package/src/utils/session-color.ts +142 -0
  1393. package/src/utils/shell-snapshot-fn-env.sh +63 -0
  1394. package/src/utils/shell-snapshot.ts +316 -0
  1395. package/src/utils/sixel.ts +69 -0
  1396. package/src/utils/thinking-display.ts +163 -0
  1397. package/src/utils/title-generator.ts +597 -0
  1398. package/src/utils/token-rate.ts +72 -0
  1399. package/src/utils/tool-choice.ts +63 -0
  1400. package/src/utils/tools-manager.ts +411 -0
  1401. package/src/utils/turndown.ts +83 -0
  1402. package/src/utils/zip.ts +1106 -0
  1403. package/src/vibe/runtime.ts +1540 -0
  1404. package/src/vibe/state.ts +4 -0
  1405. package/src/web/kagi.ts +304 -0
  1406. package/src/web/parallel.ts +354 -0
  1407. package/src/web/scrapers/artifacthub.ts +207 -0
  1408. package/src/web/scrapers/arxiv.ts +83 -0
  1409. package/src/web/scrapers/aur.ts +162 -0
  1410. package/src/web/scrapers/biorxiv.ts +133 -0
  1411. package/src/web/scrapers/bluesky.ts +262 -0
  1412. package/src/web/scrapers/brew.ts +172 -0
  1413. package/src/web/scrapers/cheatsh.ts +68 -0
  1414. package/src/web/scrapers/chocolatey.ts +196 -0
  1415. package/src/web/scrapers/choosealicense.ts +95 -0
  1416. package/src/web/scrapers/cisa-kev.ts +87 -0
  1417. package/src/web/scrapers/clojars.ts +154 -0
  1418. package/src/web/scrapers/coingecko.ts +177 -0
  1419. package/src/web/scrapers/crates-io.ts +97 -0
  1420. package/src/web/scrapers/crossref.ts +136 -0
  1421. package/src/web/scrapers/devto.ts +147 -0
  1422. package/src/web/scrapers/discogs.ts +306 -0
  1423. package/src/web/scrapers/discourse.ts +197 -0
  1424. package/src/web/scrapers/dockerhub.ts +138 -0
  1425. package/src/web/scrapers/docs-rs.ts +663 -0
  1426. package/src/web/scrapers/fdroid.ts +134 -0
  1427. package/src/web/scrapers/firefox-addons.ts +191 -0
  1428. package/src/web/scrapers/flathub.ts +223 -0
  1429. package/src/web/scrapers/github-gist.ts +58 -0
  1430. package/src/web/scrapers/github.ts +800 -0
  1431. package/src/web/scrapers/gitlab.ts +401 -0
  1432. package/src/web/scrapers/go-pkg.ts +266 -0
  1433. package/src/web/scrapers/hackage.ts +140 -0
  1434. package/src/web/scrapers/hackernews.ts +189 -0
  1435. package/src/web/scrapers/hex.ts +105 -0
  1436. package/src/web/scrapers/huggingface.ts +321 -0
  1437. package/src/web/scrapers/iacr.ts +89 -0
  1438. package/src/web/scrapers/index.ts +252 -0
  1439. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1440. package/src/web/scrapers/lemmy.ts +203 -0
  1441. package/src/web/scrapers/lobsters.ts +175 -0
  1442. package/src/web/scrapers/mastodon.ts +292 -0
  1443. package/src/web/scrapers/maven.ts +138 -0
  1444. package/src/web/scrapers/mdn.ts +173 -0
  1445. package/src/web/scrapers/metacpan.ts +222 -0
  1446. package/src/web/scrapers/musicbrainz.ts +250 -0
  1447. package/src/web/scrapers/npm.ts +98 -0
  1448. package/src/web/scrapers/nuget.ts +183 -0
  1449. package/src/web/scrapers/nvd.ts +222 -0
  1450. package/src/web/scrapers/ollama.ts +239 -0
  1451. package/src/web/scrapers/open-vsx.ts +106 -0
  1452. package/src/web/scrapers/opencorporates.ts +292 -0
  1453. package/src/web/scrapers/openlibrary.ts +336 -0
  1454. package/src/web/scrapers/orcid.ts +286 -0
  1455. package/src/web/scrapers/osv.ts +176 -0
  1456. package/src/web/scrapers/packagist.ts +160 -0
  1457. package/src/web/scrapers/pub-dev.ts +143 -0
  1458. package/src/web/scrapers/pubmed.ts +211 -0
  1459. package/src/web/scrapers/pypi.ts +112 -0
  1460. package/src/web/scrapers/rawg.ts +110 -0
  1461. package/src/web/scrapers/readthedocs.ts +120 -0
  1462. package/src/web/scrapers/reddit.ts +95 -0
  1463. package/src/web/scrapers/repology.ts +251 -0
  1464. package/src/web/scrapers/rfc.ts +201 -0
  1465. package/src/web/scrapers/rubygems.ts +103 -0
  1466. package/src/web/scrapers/searchcode.ts +189 -0
  1467. package/src/web/scrapers/sec-edgar.ts +261 -0
  1468. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1469. package/src/web/scrapers/snapcraft.ts +187 -0
  1470. package/src/web/scrapers/sourcegraph.ts +336 -0
  1471. package/src/web/scrapers/spdx.ts +108 -0
  1472. package/src/web/scrapers/spotify.ts +198 -0
  1473. package/src/web/scrapers/stackoverflow.ts +120 -0
  1474. package/src/web/scrapers/terraform.ts +277 -0
  1475. package/src/web/scrapers/tldr.ts +47 -0
  1476. package/src/web/scrapers/twitter.ts +94 -0
  1477. package/src/web/scrapers/types.ts +354 -0
  1478. package/src/web/scrapers/utils.ts +109 -0
  1479. package/src/web/scrapers/vimeo.ts +133 -0
  1480. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1481. package/src/web/scrapers/w3c.ts +156 -0
  1482. package/src/web/scrapers/wikidata.ts +344 -0
  1483. package/src/web/scrapers/wikipedia.ts +84 -0
  1484. package/src/web/scrapers/youtube.ts +325 -0
  1485. package/src/web/search/index.ts +376 -0
  1486. package/src/web/search/provider.ts +272 -0
  1487. package/src/web/search/providers/anthropic.ts +401 -0
  1488. package/src/web/search/providers/base.ts +110 -0
  1489. package/src/web/search/providers/brave.ts +179 -0
  1490. package/src/web/search/providers/browser-headers.ts +109 -0
  1491. package/src/web/search/providers/browser-page.ts +123 -0
  1492. package/src/web/search/providers/codex.ts +749 -0
  1493. package/src/web/search/providers/duckduckgo.ts +213 -0
  1494. package/src/web/search/providers/ecosia.ts +182 -0
  1495. package/src/web/search/providers/exa.ts +511 -0
  1496. package/src/web/search/providers/firecrawl.ts +211 -0
  1497. package/src/web/search/providers/gemini.ts +628 -0
  1498. package/src/web/search/providers/google.ts +194 -0
  1499. package/src/web/search/providers/jina.ts +134 -0
  1500. package/src/web/search/providers/kagi.ts +95 -0
  1501. package/src/web/search/providers/kimi.ts +217 -0
  1502. package/src/web/search/providers/mojeek.ts +219 -0
  1503. package/src/web/search/providers/parallel.ts +182 -0
  1504. package/src/web/search/providers/perplexity-auth.ts +142 -0
  1505. package/src/web/search/providers/perplexity.ts +994 -0
  1506. package/src/web/search/providers/public.ts +199 -0
  1507. package/src/web/search/providers/searxng.ts +461 -0
  1508. package/src/web/search/providers/startpage.ts +219 -0
  1509. package/src/web/search/providers/synthetic.ts +120 -0
  1510. package/src/web/search/providers/tavily.ts +242 -0
  1511. package/src/web/search/providers/tinyfish.ts +164 -0
  1512. package/src/web/search/providers/utils.ts +128 -0
  1513. package/src/web/search/providers/xai.ts +372 -0
  1514. package/src/web/search/providers/zai.ts +437 -0
  1515. package/src/web/search/query.ts +850 -0
  1516. package/src/web/search/render.ts +262 -0
  1517. package/src/web/search/types.ts +507 -0
  1518. package/src/web/search/utils.ts +17 -0
  1519. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,1027 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import type { ImageContent } from "@oh-my-pi/pi-ai";
3
+ import {
4
+ addKeyAliases,
5
+ canonicalKeyId,
6
+ Editor,
7
+ type EditorTheme,
8
+ type KeyId,
9
+ parseKey,
10
+ parseKittySequence,
11
+ TUI,
12
+ } from "@oh-my-pi/pi-tui";
13
+ import { BracketedPasteHandler } from "@oh-my-pi/pi-tui/bracketed-paste";
14
+ import type { AppKeybinding } from "../../config/keybindings";
15
+ import { isSettingsInitialized, settings } from "../../config/settings";
16
+ import { imageReferenceHyperlink, PLACEHOLDER_REGEX, renderPlaceholders } from "../image-references";
17
+ import { hasMagicKeyword, highlightMagicKeywords } from "../magic-keywords";
18
+ import { isQueuedMessageList, parseQueueShorthand, QUEUE_LIST_MARKER_RE } from "../queue-input";
19
+ import { fgOrPlain, theme } from "../theme/theme";
20
+
21
+ type ConfigurableEditorAction = Extract<
22
+ AppKeybinding,
23
+ | "app.interrupt"
24
+ | "app.clear"
25
+ | "app.exit"
26
+ | "app.suspend"
27
+ | "app.display.reset"
28
+ | "app.thinking.cycle"
29
+ | "app.model.cycleForward"
30
+ | "app.model.cycleBackward"
31
+ | "app.model.select"
32
+ | "app.model.selectTemporary"
33
+ | "app.tools.expand"
34
+ | "app.thinking.toggle"
35
+ | "app.editor.external"
36
+ | "app.history.search"
37
+ | "app.message.dequeue"
38
+ | "app.retry"
39
+ | "app.clipboard.pasteImage"
40
+ | "app.clipboard.pasteTextRaw"
41
+ | "app.clipboard.copyPrompt"
42
+ >;
43
+
44
+ const DEFAULT_ACTION_KEYS: Record<ConfigurableEditorAction, KeyId[]> = {
45
+ "app.interrupt": ["escape"],
46
+ "app.clear": ["ctrl+c"],
47
+ "app.exit": ["ctrl+d"],
48
+ "app.suspend": ["ctrl+z"],
49
+ "app.display.reset": ["ctrl+l"],
50
+ "app.thinking.cycle": ["shift+tab"],
51
+ "app.model.cycleForward": ["ctrl+p"],
52
+ "app.model.cycleBackward": ["shift+ctrl+p"],
53
+ "app.model.select": ["alt+m"],
54
+ "app.model.selectTemporary": ["alt+p"],
55
+ "app.tools.expand": ["ctrl+o"],
56
+ "app.thinking.toggle": ["ctrl+t"],
57
+ "app.editor.external": ["ctrl+g"],
58
+ "app.history.search": ["ctrl+r"],
59
+ "app.message.dequeue": ["alt+up"],
60
+ "app.retry": ["alt+r"],
61
+ "app.clipboard.pasteImage": ["ctrl+v"],
62
+ "app.clipboard.pasteTextRaw": ["ctrl+shift+v", "alt+shift+v"],
63
+ "app.clipboard.copyPrompt": ["alt+shift+c"],
64
+ };
65
+
66
+ function buildMatchKeys(keys: readonly KeyId[]): Set<string> {
67
+ const matchKeys = new Set<string>();
68
+ for (const key of keys) {
69
+ addKeyAliases(matchKeys, key);
70
+ }
71
+ return matchKeys;
72
+ }
73
+
74
+ function unionOfMatchKeys(matchKeys: ReadonlyMap<ConfigurableEditorAction, ReadonlySet<string>>): Set<string> {
75
+ const union = new Set<string>();
76
+ for (const keys of matchKeys.values()) {
77
+ for (const key of keys) union.add(key);
78
+ }
79
+ return union;
80
+ }
81
+
82
+ const BRACKETED_PASTE_START = "\x1b[200~";
83
+ const BRACKETED_PASTE_END = "\x1b[201~";
84
+ const BRACKETED_IMAGE_PATH_REGEX = /\.(?:png|jpe?g|gif|webp)$/i;
85
+ const SHELL_ESCAPED_PATH_CHAR_REGEX = /\\([\\\s'"()[\]{}&;<>|?*!$`])/g;
86
+ const URI_SCHEME_REGEX = /^[a-z][a-z0-9+.-]*:/i;
87
+ const FILE_URI_REGEX = /^file:\/\//i;
88
+ const WINDOWS_DRIVE_PATH_REGEX = /^[a-z]:[\\/]/i;
89
+ /**
90
+ * Alternation of the filesystem prefixes that make a path unambiguously
91
+ * absolute (POSIX root, home, `file://`, UNC, Windows drive). Shared by
92
+ * {@link ABSOLUTE_PATH_PREFIX_REGEX} and {@link INTERIOR_PATH_ANCHOR_REGEX} so
93
+ * the leading-anchor test and the second-anchor test can never disagree about
94
+ * what counts as the start of a path.
95
+ */
96
+ const ABSOLUTE_PATH_PREFIX_SOURCE = String.raw`(?:\/|~\/|file:\/\/|\\\\|[A-Za-z]:[\\/])`;
97
+ /**
98
+ * Whole-string anchor for paths that are unambiguously absolute. Restricts the
99
+ * "treat the entire text as one path" pass of {@link extractWholeTextImagePath}
100
+ * to inputs that start with a clearly-anchored filesystem prefix, so prose
101
+ * containing a path-shaped fragment (e.g. "see /tmp/x.png") never hijacks the
102
+ * smart fallback.
103
+ */
104
+ const ABSOLUTE_PATH_PREFIX_REGEX = new RegExp(`^${ABSOLUTE_PATH_PREFIX_SOURCE}`);
105
+ /**
106
+ * A second path anchor after *unescaped* whitespace — the signature of a
107
+ * multi-path payload (`/tmp/a.png /tmp/b shot.png`, `/tmp/a.png ./b shot.png`)
108
+ * rather than of one path whose name merely contains spaces. Anchors are the
109
+ * absolute prefixes plus dot-relative starts (`./`, `../`, `.\`), which never
110
+ * begin a component of a single sane path. Bare relatives (`dir/b shot.png`)
111
+ * are deliberately NOT anchors: an interior `token/` after a space is exactly
112
+ * the shape of a single path with a spaced directory name
113
+ * (`/Users/me/My Photos/shot 1.png`), which this fallback exists to recover.
114
+ * Escaped whitespace (`/tmp/My\ Photos/x.png`) is exempt: the escape is the
115
+ * terminal asserting the space belongs to the path.
116
+ */
117
+ const INTERIOR_PATH_ANCHOR_REGEX = new RegExp(String.raw`(?<!\\)\s(?:${ABSOLUTE_PATH_PREFIX_SOURCE}|\.\.?[\\/])`);
118
+
119
+ /** Max gap (ms) between two spaces for the later one to count as OS key auto-repeat rather than a
120
+ * deliberate press. OS auto-repeat is fast; a deliberate tap (even a fast one) is slower. */
121
+ export const SPACE_REPEAT_MAX_GAP_MS = 120;
122
+ /** Two consecutive inter-space gaps are "mechanical" (machine-driven auto-repeat) when both are
123
+ * within {@link SPACE_REPEAT_MAX_GAP_MS} and differ by no more than this — an absolute jitter floor
124
+ * or, for slower repeat rates, {@link SPACE_REPEAT_JITTER_RATIO} of the smaller gap. OS key-repeat
125
+ * is metronomic; a human smashing the bar is fast but irregular, so its deltas never stay this
126
+ * steady. */
127
+ export const SPACE_REPEAT_JITTER_MS = 18;
128
+ export const SPACE_REPEAT_JITTER_RATIO = 0.35;
129
+ /** Consecutive mechanical (fast + steady) deltas that confirm the space bar is held and start
130
+ * recording. Needs a sustained metronomic cadence, so jittery smashing and deliberate taps never
131
+ * reach it. */
132
+ export const SPACE_HOLD_MECHANICAL_RUN = 2;
133
+ /** Idle gap (ms) after the last repeated space that counts as the space bar being released, ending
134
+ * the push-to-talk recording. Must comfortably exceed the OS key-repeat interval. */
135
+ export const SPACE_HOLD_RELEASE_MS = 250;
136
+
137
+ /** Whether two consecutive inter-space gaps look machine-driven: both within the auto-repeat band
138
+ * and steady enough (small absolute or proportional difference). OS key-repeat is metronomic, so
139
+ * its successive deltas match closely; human smashing is fast but irregular and deliberate taps are
140
+ * too slow, so neither passes. */
141
+ function gapsAreMechanical(gap: number, prevGap: number): boolean {
142
+ if (gap > SPACE_REPEAT_MAX_GAP_MS || prevGap > SPACE_REPEAT_MAX_GAP_MS) return false;
143
+ const tolerance = Math.max(SPACE_REPEAT_JITTER_MS, Math.min(gap, prevGap) * SPACE_REPEAT_JITTER_RATIO);
144
+ return Math.abs(gap - prevGap) <= tolerance;
145
+ }
146
+
147
+ function isPastedPathSeparator(char: string | undefined): boolean {
148
+ return char === undefined || char === " " || char === "\t" || char === "\r" || char === "\n";
149
+ }
150
+
151
+ function normalizePastedPath(path: string): string {
152
+ const trimmed = path.trim();
153
+ const first = trimmed[0];
154
+ const last = trimmed[trimmed.length - 1];
155
+ const unquoted =
156
+ trimmed.length > 1 && (first === '"' || first === "'") && last === first ? trimmed.slice(1, -1) : trimmed;
157
+ // `file://` URL → local filesystem path. Mirrors Codex's
158
+ // `normalize_pasted_path` (codex-rs/tui/src/clipboard_paste.rs) so a
159
+ // pasteboard whose text representation is a `file:///Users/…/img.png`
160
+ // URL — common when terminals forward the macOS pasteboard's
161
+ // `public.file-url` representation — loads as the file itself rather
162
+ // than failing in `loadImageInput` with a literal-`file://` path.
163
+ if (FILE_URI_REGEX.test(unquoted)) {
164
+ try {
165
+ return fileURLToPath(unquoted);
166
+ } catch {
167
+ // Malformed file URL: drop through to the shell-unescape branch
168
+ // so the caller can still reject it as a non-explicit path.
169
+ }
170
+ }
171
+ return unquoted.replace(SHELL_ESCAPED_PATH_CHAR_REGEX, "$1");
172
+ }
173
+
174
+ function isExplicitPastedPath(path: string): boolean {
175
+ if (WINDOWS_DRIVE_PATH_REGEX.test(path) || FILE_URI_REGEX.test(path)) return true;
176
+ if (URI_SCHEME_REGEX.test(path)) return false;
177
+ return path.includes("/") || path.includes("\\");
178
+ }
179
+
180
+ function isImagePath(path: string): boolean {
181
+ return BRACKETED_IMAGE_PATH_REGEX.test(path);
182
+ }
183
+
184
+ function splitPastedPathSegments(payload: string): string[] | undefined {
185
+ const segments: string[] = [];
186
+ let segment = "";
187
+ let quote: string | undefined;
188
+ let escaped = false;
189
+
190
+ for (let i = 0; i < payload.length; i++) {
191
+ const char = payload[i];
192
+ if (escaped) {
193
+ segment += char;
194
+ escaped = false;
195
+ continue;
196
+ }
197
+ if (char === "\\") {
198
+ segment += char;
199
+ escaped = true;
200
+ continue;
201
+ }
202
+ if (quote) {
203
+ segment += char;
204
+ if (char === quote) quote = undefined;
205
+ continue;
206
+ }
207
+ if (char === '"' || char === "'") {
208
+ segment += char;
209
+ quote = char;
210
+ continue;
211
+ }
212
+ if (isPastedPathSeparator(char)) {
213
+ if (segment) {
214
+ segments.push(segment);
215
+ segment = "";
216
+ }
217
+ continue;
218
+ }
219
+ segment += char;
220
+ }
221
+
222
+ if (escaped || quote) return undefined;
223
+ if (segment) segments.push(segment);
224
+ return segments.length > 0 ? segments : undefined;
225
+ }
226
+
227
+ /**
228
+ * Extract whitespace/quoted-separated path-like segments from `payload`.
229
+ * Shared backend of {@link extractBracketedPastePaths} and {@link extractPastePathsFromText}.
230
+ * Returns the segments only when EVERY segment looks like an explicit path
231
+ * (`/`, `\`, drive letter, or `file://`); otherwise undefined so the caller
232
+ * falls back to a plain text paste.
233
+ */
234
+ function extractExplicitPathSegments(payload: string): string[] | undefined {
235
+ const pasted = payload.trim();
236
+ if (!pasted) return undefined;
237
+
238
+ const segments = splitPastedPathSegments(pasted);
239
+ if (!segments) return undefined;
240
+
241
+ const paths: string[] = [];
242
+ for (const segment of segments) {
243
+ const path = normalizePastedPath(segment);
244
+ if (!path || !isExplicitPastedPath(path)) return undefined;
245
+ paths.push(path);
246
+ }
247
+ return paths;
248
+ }
249
+
250
+ /**
251
+ * Extract image-or-other file paths from plain (un-bracketed) clipboard text.
252
+ * Mirrors {@link extractBracketedPastePaths} for terminals/handlers that
253
+ * already stripped the `\x1b[200~`…`\x1b[201~` markers (e.g. clipboard text
254
+ * read directly via `pbpaste`/PowerShell).
255
+ */
256
+ export function extractPastePathsFromText(text: string): string[] | undefined {
257
+ return extractExplicitPathSegments(text);
258
+ }
259
+
260
+ /**
261
+ * Whole-text-as-path pass shared by {@link extractImagePastePathsFromText}
262
+ * and {@link extractImagePathFromText}: treat the entire text as one path
263
+ * when it is anchored by {@link ABSOLUTE_PATH_PREFIX_REGEX}, contains no
264
+ * newlines, and points at a supported image extension. Recovers single paths
265
+ * whose unescaped spaces defeat the segment splitter (macOS screenshot names).
266
+ *
267
+ * Refuses payloads carrying a second {@link INTERIOR_PATH_ANCHOR_REGEX} anchor.
268
+ * Dragging two files at once emits `/tmp/a.png /tmp/b shot.png`, which the
269
+ * splitter also refuses (`shot.png` is not explicit); swallowing it as one path
270
+ * attaches nothing, and `handleImagePathPaste`'s ENOENT branch only surfaces a
271
+ * status — unlike its other failure branches it never re-pastes the text — so
272
+ * both paths would vanish. Genuinely ambiguous input lands here too (a
273
+ * directory whose name ends in a space, as in `/tmp/odd dir /sub/x.png`); a
274
+ * plain text paste is the losing-nothing outcome, so ambiguity resolves that way.
275
+ */
276
+ function extractWholeTextImagePath(text: string): string | undefined {
277
+ const trimmed = text.trim();
278
+ if (!trimmed || /[\r\n]/.test(trimmed) || !ABSOLUTE_PATH_PREFIX_REGEX.test(trimmed)) return undefined;
279
+ if (INTERIOR_PATH_ANCHOR_REGEX.test(trimmed)) return undefined;
280
+ const wholePath = normalizePastedPath(trimmed);
281
+ return wholePath && isExplicitPastedPath(wholePath) && isImagePath(wholePath) ? wholePath : undefined;
282
+ }
283
+
284
+ /**
285
+ * Same shape as {@link extractBracketedImagePastePaths} but operates on a
286
+ * payload that has already been stripped of the `\x1b[200~` / `\x1b[201~`
287
+ * markers — used by the assembled-paste router in {@link CustomEditor.handleInput}
288
+ * so split bracketed pastes get the same image-path detection as single-chunk ones.
289
+ *
290
+ * When the segment splitter fails (an unescaped space in a real path breaks
291
+ * its every-segment-is-a-path invariant), falls back to
292
+ * {@link extractWholeTextImagePath}, so a dropped macOS screenshot
293
+ * (`Screenshot 2026-06-25 at 1.23.45 PM.png`) attaches as an image instead of
294
+ * degrading to literal text (#6578).
295
+ */
296
+ export function extractImagePastePathsFromText(text: string): string[] | undefined {
297
+ const paths = extractPastePathsFromText(text);
298
+ if (paths !== undefined) return paths.every(isImagePath) ? paths : undefined;
299
+ const wholePath = extractWholeTextImagePath(text);
300
+ return wholePath ? [wholePath] : undefined;
301
+ }
302
+
303
+ function bracketedPastePayload(data: string): string | undefined {
304
+ if (!data.startsWith(BRACKETED_PASTE_START)) return undefined;
305
+ const endIndex = data.indexOf(BRACKETED_PASTE_END, BRACKETED_PASTE_START.length);
306
+ if (endIndex === -1 || endIndex + BRACKETED_PASTE_END.length !== data.length) return undefined;
307
+ return data.slice(BRACKETED_PASTE_START.length, endIndex);
308
+ }
309
+
310
+ export function extractBracketedPastePaths(data: string): string[] | undefined {
311
+ const payload = bracketedPastePayload(data);
312
+ return payload === undefined ? undefined : extractExplicitPathSegments(payload);
313
+ }
314
+
315
+ export function extractBracketedImagePastePaths(data: string): string[] | undefined {
316
+ const payload = bracketedPastePayload(data);
317
+ return payload === undefined ? undefined : extractImagePastePathsFromText(payload);
318
+ }
319
+
320
+ export function extractBracketedImagePastePath(data: string): string | undefined {
321
+ const paths = extractBracketedImagePastePaths(data);
322
+ return paths?.length === 1 ? paths[0] : undefined;
323
+ }
324
+
325
+ /**
326
+ * Return a single image file path when `text` is exactly one explicit path
327
+ * pointing at a supported image extension (`.png`, `.jpg`/`.jpeg`, `.gif`,
328
+ * `.webp`). Used by the keybind-driven clipboard image paste path so a
329
+ * clipboard whose only payload is an image file (e.g. Finder `Cmd+C` on
330
+ * macOS) attaches the image instead of pasting the path as literal text.
331
+ *
332
+ * Two-stage detection:
333
+ *
334
+ * 1. Splitter pass (shared with the bracketed-paste handler) — handles
335
+ * quoted paths, shell-escaped spaces, and unambiguous single tokens.
336
+ * Returns the single image path when it parses cleanly; explicitly
337
+ * returns `undefined` when the splitter found multiple segments (so
338
+ * ambiguous multi-path clipboard text like `/tmp/a.png /tmp/b.png`
339
+ * still falls through to the text fallback instead of being mis-loaded
340
+ * as one giant path).
341
+ * 2. {@link extractWholeTextImagePath} — only reached when the splitter
342
+ * failed (every segment must look like an explicit path; an unescaped
343
+ * space in a real path breaks that). This is what recovers macOS
344
+ * screenshot filenames like
345
+ * `/Users/me/Desktop/Screenshot 2026-06-25 at 1.23.45 PM.png`.
346
+ */
347
+ export function extractImagePathFromText(text: string): string | undefined {
348
+ const paths = extractPastePathsFromText(text);
349
+ if (paths?.length === 1 && isImagePath(paths[0])) return paths[0];
350
+ if (paths !== undefined) return undefined;
351
+ return extractWholeTextImagePath(text);
352
+ }
353
+
354
+ /**
355
+ * Resolve the {@link EditorTheme} from a `CustomEditor`/`Editor` constructor
356
+ * argument list, tolerating both the omp `(theme)` and upstream-pi
357
+ * `(tui, theme, keybindings)` conventions (see {@link CustomEditor}'s
358
+ * constructor). A real `EditorTheme` is identified structurally — it exposes a
359
+ * `borderColor` function and a `symbols` object — so a `TUI` passed in the first
360
+ * slot is skipped rather than mistaken for the theme.
361
+ */
362
+ function pickEditorTheme(args: readonly unknown[]): EditorTheme {
363
+ for (const arg of args) {
364
+ if (isEditorTheme(arg)) return arg;
365
+ }
366
+ // Fall back to the first argument so a caller passing a bare theme that
367
+ // somehow fails the shape probe still reaches the base constructor.
368
+ return args[0] as EditorTheme;
369
+ }
370
+
371
+ function isEditorTheme(value: unknown): value is EditorTheme {
372
+ if (typeof value !== "object" || value === null) return false;
373
+ const candidate = value as Partial<EditorTheme>;
374
+ return (
375
+ typeof candidate.borderColor === "function" && typeof candidate.symbols === "object" && candidate.symbols !== null
376
+ );
377
+ }
378
+
379
+ /**
380
+ * Custom editor that handles configurable app-level shortcuts for coding-agent.
381
+ */
382
+ export class CustomEditor extends Editor {
383
+ imageLinks?: readonly (string | undefined)[];
384
+
385
+ /** Draft images pasted into the composer, consumed on submit. Co-located with
386
+ * {@link imageLinks} so every piece of draft-image state lives on the editor. */
387
+ pendingImages: ImageContent[] = [];
388
+ /** Per-image source links (file:// targets) parallel to {@link pendingImages};
389
+ * `undefined` entries are images without a backing reference yet. */
390
+ pendingImageLinks: (string | undefined)[] = [];
391
+
392
+ /**
393
+ * The host {@link TUI}, captured when a plugin constructs this editor through
394
+ * the upstream-pi `(tui, theme, keybindings)` convention. Undefined for omp's
395
+ * own `new CustomEditor(theme)` callers (they drive repaints through the
396
+ * interactive-mode wiring instead). Plugins that call `this.tui.requestRender()`
397
+ * in their overrides read it here (issue #4766).
398
+ */
399
+ tui?: TUI;
400
+
401
+ /**
402
+ * Accept both the omp constructor convention — `new CustomEditor(theme)` —
403
+ * and the upstream-pi `Editor` convention — `new Editor(tui, theme, keybindings)`
404
+ * — that {@link ExtensionUIContext.setEditorComponent}'s factory contract
405
+ * advertises `(tui, theme, keybindings)`. Plugins written against upstream pi
406
+ * subclass `CustomEditor`/`Editor` and forward `super(tui, theme, keybindings)`;
407
+ * without this shim the `TUI` lands in the `theme` slot and every render throws
408
+ * `undefined is not an object (evaluating 'this.#theme.symbols.boxRound')`
409
+ * (issue #4766). We locate the real {@link EditorTheme} among the args by shape
410
+ * (it carries `symbols`/`borderColor`) rather than by position, and capture a
411
+ * leading {@link TUI} so plugin overrides calling `this.tui.requestRender()`
412
+ * keep working.
413
+ */
414
+ constructor(...args: readonly unknown[]) {
415
+ super(pickEditorTheme(args));
416
+ if (args[0] instanceof TUI) this.tui = args[0];
417
+ }
418
+
419
+ /** Clear the composer draft: optionally commit `historyText` to history, then
420
+ * reset the editor text and all pending draft-image state. The shared tail of
421
+ * every "message submitted" path; pass no argument for a plain discard. */
422
+ clearDraft(historyText?: string): void {
423
+ if (historyText !== undefined) this.addToHistory(historyText);
424
+ this.setText("");
425
+ this.imageLinks = undefined;
426
+ this.pendingImages = [];
427
+ this.pendingImageLinks = [];
428
+ }
429
+
430
+ /** Replace the composer draft with a restored historical prompt: sets the text and
431
+ * re-attaches the message's images so positional `[Image #N]` markers resolve on
432
+ * resubmit instead of degrading to literal text (esc-esc branch, `/tree`). Source
433
+ * links are unknown for restored drafts, so every link slot is `undefined`. */
434
+ setDraft(text: string, images?: readonly ImageContent[]): void {
435
+ this.setText(text);
436
+ this.imageLinks = undefined;
437
+ this.pendingImages = images ? [...images] : [];
438
+ this.pendingImageLinks = images ? images.map(() => undefined) : [];
439
+ }
440
+
441
+ /** Treat image/paste markers as indivisible: a stray backspace deletes the whole token
442
+ * instead of corrupting `[Paste #1, +30 lines]` into plain text. */
443
+ override atomicTokenPattern = PLACEHOLDER_REGEX;
444
+
445
+ /** Magic-keyword shimmer cadence — drives one editor repaint every 70 ms while
446
+ * a keyword is on screen and the prompt is focused. ~14 frames/s is smooth
447
+ * without flooding the renderer. */
448
+ static readonly SHIMMER_FRAME_MS = 70;
449
+ /** Time for the gradient to sweep one full cycle across each keyword. */
450
+ static readonly SHIMMER_PERIOD_MS = 1800;
451
+
452
+ /** Per-render scratch flag: did any layout line in this render contain a magic
453
+ * keyword that should shimmer? Reset by {@link #scheduleShimmerIfNeeded} each
454
+ * time a frame is queued. */
455
+ #shimmerTimer: Timer | undefined;
456
+ /** Repaint hook the host wires once at construction. Called from the shimmer
457
+ * timer to request the next animation frame. Undefined when nobody is
458
+ * listening (tests, headless callers); the timer chain still self-cleans. */
459
+ #requestShimmerRepaint: (() => void) | undefined;
460
+ #queueDecorationText: string | undefined;
461
+ #queueShorthandActive = false;
462
+ #queueListActive = false;
463
+
464
+ /** Decorate magic keywords, attachments, and the queue-composer header/list markers.
465
+ * Queue shorthand reserves its first logical line as a dim `Queueing` label; sequential
466
+ * item markers use the accent color so separate follow-ups remain visible while composing. */
467
+ decorateText = (text: string): string => {
468
+ const editorText = this.getText();
469
+ const animated = this.focused && this.#shimmerEnabled() && hasMagicKeyword(editorText);
470
+ const phase = animated ? (Date.now() % CustomEditor.SHIMMER_PERIOD_MS) / CustomEditor.SHIMMER_PERIOD_MS : 0;
471
+ if (animated) this.#scheduleShimmerFrame();
472
+ if (this.#queueDecorationText !== editorText) {
473
+ this.#queueDecorationText = editorText;
474
+ const queueBody = parseQueueShorthand(editorText);
475
+ this.#queueShorthandActive = queueBody !== undefined;
476
+ this.#queueListActive = queueBody !== undefined && isQueuedMessageList(queueBody);
477
+ }
478
+ return renderPlaceholders(text, {
479
+ renderText: value => {
480
+ const highlighted = highlightMagicKeywords(value, undefined, phase);
481
+ if (this.#queueShorthandActive && (value.startsWith("->") || value.startsWith("=>"))) {
482
+ const icon = typeof theme === "undefined" ? "➤" : theme.nav.selected;
483
+ return `${fgOrPlain("dim", `Queueing ${icon}`)}${highlighted.slice(2)}`;
484
+ }
485
+ if (this.#queueListActive) {
486
+ const markerMatch = QUEUE_LIST_MARKER_RE.exec(value);
487
+ if (markerMatch) {
488
+ const indent = markerMatch[1] ?? "";
489
+ const markerEnd = markerMatch[0].length;
490
+ return `${indent}${fgOrPlain("accent", value.slice(indent.length, markerEnd))}${highlighted.slice(markerEnd)}`;
491
+ }
492
+ }
493
+ return highlighted;
494
+ },
495
+ renderReference: (value, kind, index) =>
496
+ kind === "image"
497
+ ? imageReferenceHyperlink(value, index, this.imageLinks, label =>
498
+ fgOrPlain("accent", label, `\x1b[1m\x1b[4m${label}\x1b[24m\x1b[22m`),
499
+ )
500
+ : fgOrPlain("accent", value, `\x1b[1m${value}\x1b[22m`),
501
+ });
502
+ };
503
+
504
+ /** Optional test/host override for the magic-keyword shimmer gate. When
505
+ * defined, takes precedence over the global `magicKeywords.enabled` setting,
506
+ * letting tests assert the gating behaviour without mutating the
507
+ * process-wide Settings singleton (which races with parallel test files —
508
+ * see issue #2582). Production wires this through the host's Settings
509
+ * reader and updates it on the relevant setting change. */
510
+ magicKeywordsEnabledOverride: boolean | undefined;
511
+
512
+ /** Whether the shimmer should advance this frame. Defaults to "on" before
513
+ * settings have initialised (tests, early boot) so the animation does not
514
+ * silently disappear during a race; settings disabling the feature wins
515
+ * once they are loaded. An explicit `magicKeywordsEnabledOverride` overrides
516
+ * both paths. */
517
+ #shimmerEnabled(): boolean {
518
+ if (this.magicKeywordsEnabledOverride !== undefined) return this.magicKeywordsEnabledOverride;
519
+ return isSettingsInitialized() ? settings.get("magicKeywords.enabled") : true;
520
+ }
521
+
522
+ /** Bind the host's render request callback. Idempotent — the host wires this
523
+ * once after construction (and again after `setEditorComponent` swaps the
524
+ * editor). Passing `undefined` clears any pending frame. */
525
+ setShimmerRepaintHandler(handler: (() => void) | undefined): void {
526
+ this.#requestShimmerRepaint = handler;
527
+ if (!handler && this.#shimmerTimer) {
528
+ clearTimeout(this.#shimmerTimer);
529
+ this.#shimmerTimer = undefined;
530
+ }
531
+ }
532
+
533
+ /** Schedule one shimmer frame if none is already pending. The next render
534
+ * decides whether to schedule another, so the chain stops by itself when
535
+ * `focused` flips off or the keyword leaves the buffer. */
536
+ #scheduleShimmerFrame(): void {
537
+ if (this.#shimmerTimer || !this.#requestShimmerRepaint) return;
538
+ this.#shimmerTimer = setTimeout(() => {
539
+ this.#shimmerTimer = undefined;
540
+ this.#requestShimmerRepaint?.();
541
+ }, CustomEditor.SHIMMER_FRAME_MS);
542
+ this.#shimmerTimer.unref?.();
543
+ }
544
+ onEscape?: () => void;
545
+ onClear?: () => void;
546
+ onExit?: () => void;
547
+ onDisplayReset?: () => void;
548
+ onCycleThinkingLevel?: () => void;
549
+ onCycleModelForward?: () => void;
550
+ onCycleModelBackward?: () => void;
551
+ onSelectModel?: () => void;
552
+ onExpandTools?: () => void;
553
+ onToggleThinking?: () => void;
554
+ onExternalEditor?: () => void;
555
+ onHistorySearch?: () => void;
556
+ onSuspend?: () => void;
557
+ onSelectModelTemporary?: () => void;
558
+ /** Called when the configured copy-prompt shortcut is pressed. */
559
+ onCopyPrompt?: () => void;
560
+ /** Called when the configured image-paste shortcut is pressed. */
561
+ onPasteImage?: () => Promise<boolean>;
562
+ /** Called when a bracketed paste contains one or more image-file paths. */
563
+ onPasteImagePath?: (path: string) => void | Promise<void>;
564
+ /** Called when the configured raw text-paste shortcut is pressed. */
565
+ onPasteTextRaw?: () => void;
566
+ /** Called when the configured dequeue shortcut is pressed. */
567
+ onDequeue?: () => void;
568
+ /** Called when the configured retry shortcut is pressed. */
569
+ onRetry?: () => void;
570
+ /** Called when Caps Lock is pressed. */
571
+ onCapsLock?: () => void;
572
+ /** Called when left-arrow is pressed while the editor is empty (cursor necessarily at start). */
573
+ onLeftAtStart?: () => void;
574
+
575
+ /** Fired when a sustained space-bar hold is recognized — the push-to-talk STT start. The
576
+ * optimistically-typed spaces have already been deleted by the time this runs. */
577
+ onSpaceHoldStart?: () => void;
578
+ /** Fired when the held space bar is released (detected as an idle gap with no further repeated
579
+ * spaces) — the push-to-talk STT stop. */
580
+ onSpaceHoldEnd?: () => void;
581
+ /** Gate for the space-hold gesture. Returns false to keep the space bar inserting spaces
582
+ * normally; wired to `stt.enabled` so disabling STT restores plain space behavior. */
583
+ sttHoldEnabled?: () => boolean;
584
+
585
+ /** Custom key handlers from extensions and non-built-in app actions. */
586
+ #customKeyHandlers = new Map<KeyId, () => void>();
587
+ #customMatchKeys = new Map<string, () => void>();
588
+ /** Bracketed-paste assembler that runs ahead of the inherited handler so terminals which
589
+ * deliver `\x1b[200~` and `\x1b[201~` in separate stdin chunks still resolve to a single
590
+ * assembled payload here; the empty-paste / image-path branches must see the full content,
591
+ * not the raw single-chunk byte sequence. */
592
+ #pasteHandler = new BracketedPasteHandler();
593
+ /** Number of async pastes (clipboard-image reads / image-path attachments) currently in flight.
594
+ * While > 0, `handleInput` queues subsequent keystrokes into {@link #pendingInput} instead of
595
+ * dispatching them so a trailing `Enter` after `Cmd+V` can't submit before the image lands on
596
+ * `pendingImages` (Codex PR #3602 review). */
597
+ #pasteInFlight = 0;
598
+ /** Input chunks deferred behind an in-flight paste, drained in FIFO order once the paste
599
+ * count returns to zero. */
600
+ #pendingInput: string[] = [];
601
+ /** Spaces actually inserted in the current run; tracked back out when a hold is recognized. */
602
+ #spaceRunInserted = 0;
603
+ /** Consecutive "mechanical" deltas (fast + steady); a sustained run of these confirms a held bar. */
604
+ #mechanicalRun = 0;
605
+ /** Inter-space gap (ms) of the previous space pair, compared against the next to judge steadiness. */
606
+ #prevSpaceGap: number | undefined;
607
+ /** Monotonic timestamp (ms) of the last space, to measure the gap to the next one. */
608
+ #lastSpaceAt = Number.NEGATIVE_INFINITY;
609
+ /** True while a recognized space-hold push-to-talk recording is in progress. */
610
+ #spaceHoldActive = false;
611
+ /** Idle timer that fires `onSpaceHoldEnd` once repeated spaces stop arriving. */
612
+ #spaceHoldTimer: NodeJS.Timeout | undefined;
613
+ #actionKeys = new Map<ConfigurableEditorAction, KeyId[]>(
614
+ Object.entries(DEFAULT_ACTION_KEYS).map(([action, keys]) => [action as ConfigurableEditorAction, [...keys]]),
615
+ );
616
+ #actionMatchKeys = new Map<ConfigurableEditorAction, Set<string>>(
617
+ Object.entries(DEFAULT_ACTION_KEYS).map(([action, keys]) => [
618
+ action as ConfigurableEditorAction,
619
+ buildMatchKeys(keys),
620
+ ]),
621
+ );
622
+ /** Union of every action's match keys: one probe in `handleInput` decides
623
+ * whether the per-action interception chain can match at all. */
624
+ #actionMatchKeyUnion = unionOfMatchKeys(this.#actionMatchKeys);
625
+
626
+ setActionKeys(action: ConfigurableEditorAction, keys: KeyId[]): void {
627
+ this.#actionKeys.set(action, [...keys]);
628
+ this.#actionMatchKeys.set(action, buildMatchKeys(keys));
629
+ this.#actionMatchKeyUnion = unionOfMatchKeys(this.#actionMatchKeys);
630
+ }
631
+
632
+ #rebuildCustomMatchKeys(): void {
633
+ this.#customMatchKeys.clear();
634
+ for (const [keyId, handler] of this.#customKeyHandlers) {
635
+ for (const alias of buildMatchKeys([keyId])) {
636
+ // Preserve current iteration behavior: the first registered handler for colliding aliases wins.
637
+ if (!this.#customMatchKeys.has(alias)) this.#customMatchKeys.set(alias, handler);
638
+ }
639
+ }
640
+ }
641
+
642
+ #matchesAction(canonical: string | undefined, action: ConfigurableEditorAction): boolean {
643
+ return canonical !== undefined && (this.#actionMatchKeys.get(action)?.has(canonical) ?? false);
644
+ }
645
+
646
+ /**
647
+ * Register a custom key handler. Extensions use this for shortcuts.
648
+ */
649
+ setCustomKeyHandler(key: KeyId, handler: () => void): void {
650
+ this.#customKeyHandlers.set(key, handler);
651
+ this.#rebuildCustomMatchKeys();
652
+ }
653
+
654
+ /**
655
+ * Remove a custom key handler.
656
+ */
657
+ removeCustomKeyHandler(key: KeyId): void {
658
+ this.#customKeyHandlers.delete(key);
659
+ this.#rebuildCustomMatchKeys();
660
+ }
661
+
662
+ /**
663
+ * Clear all custom key handlers.
664
+ */
665
+ clearCustomKeyHandlers(): void {
666
+ this.#customKeyHandlers.clear();
667
+ this.#rebuildCustomMatchKeys();
668
+ }
669
+
670
+ #spaceHoldGestureEnabled(): boolean {
671
+ return this.onSpaceHoldStart !== undefined && (this.sttHoldEnabled?.() ?? false) && !this.isShowingAutocomplete();
672
+ }
673
+
674
+ /** Drive the space-hold push-to-talk state machine. Returns true when the gesture consumed the
675
+ * input so it must not reach normal editing. A held space bar emits OS auto-repeat: a *steady*
676
+ * stream of spaces at a fixed fast interval. We watch the inter-space deltas and only recognize a
677
+ * hold once {@link SPACE_HOLD_MECHANICAL_RUN} consecutive deltas are "mechanical" — both
678
+ * auto-repeat-fast and near-identical (see {@link gapsAreMechanical}). Smashing the bar is fast
679
+ * but jittery and deliberate taps are too slow, so neither escalates and both keep typing real
680
+ * spaces; the few spaces typed before a real hold is recognized are tracked back out. */
681
+ #handleSpaceHold(data: string, canonical: string | undefined): boolean {
682
+ const isSpace = canonical === "space";
683
+ if (this.#spaceHoldActive) {
684
+ if (isSpace) {
685
+ // Auto-repeat while held: swallow it and keep the release timer alive.
686
+ this.#armSpaceHoldReleaseTimer();
687
+ return true;
688
+ }
689
+ // Any non-space means the bar was released — stop recording, then let the key through.
690
+ this.#endSpaceHold();
691
+ return false;
692
+ }
693
+ if (!isSpace) {
694
+ this.#resetSpaceRun();
695
+ return false;
696
+ }
697
+ if (!this.#spaceHoldGestureEnabled()) return false;
698
+ const now = performance.now();
699
+ const gap = now - this.#lastSpaceAt;
700
+ const prevGap = this.#prevSpaceGap;
701
+ this.#lastSpaceAt = now;
702
+ this.#prevSpaceGap = gap;
703
+ if (prevGap === undefined || !gapsAreMechanical(gap, prevGap)) {
704
+ // First space, a deliberate tap, or jittery smashing: not a steady machine cadence yet, so
705
+ // type a real space and reset the mechanical run.
706
+ this.#mechanicalRun = 0;
707
+ super.handleInput(data);
708
+ this.#spaceRunInserted++;
709
+ return true;
710
+ }
711
+ // Steady fast repeat: swallow it. Once the cadence has held for SPACE_HOLD_MECHANICAL_RUN
712
+ // deltas it's a held bar — track back the few pre-burst spaces already typed and start.
713
+ if (++this.#mechanicalRun >= SPACE_HOLD_MECHANICAL_RUN) {
714
+ this.deleteBeforeCursor(this.#spaceRunInserted);
715
+ this.#resetSpaceRun();
716
+ this.#beginSpaceHold();
717
+ }
718
+ return true;
719
+ }
720
+
721
+ #resetSpaceRun(): void {
722
+ this.#spaceRunInserted = 0;
723
+ this.#mechanicalRun = 0;
724
+ this.#prevSpaceGap = undefined;
725
+ this.#lastSpaceAt = Number.NEGATIVE_INFINITY;
726
+ }
727
+
728
+ #beginSpaceHold(): void {
729
+ this.#spaceHoldActive = true;
730
+ this.#armSpaceHoldReleaseTimer();
731
+ this.onSpaceHoldStart?.();
732
+ }
733
+
734
+ #armSpaceHoldReleaseTimer(): void {
735
+ if (this.#spaceHoldTimer) clearTimeout(this.#spaceHoldTimer);
736
+ this.#spaceHoldTimer = setTimeout(() => {
737
+ this.#spaceHoldTimer = undefined;
738
+ this.#endSpaceHold();
739
+ }, SPACE_HOLD_RELEASE_MS);
740
+ this.#spaceHoldTimer.unref?.();
741
+ }
742
+
743
+ #endSpaceHold(): void {
744
+ if (!this.#spaceHoldActive) return;
745
+ this.#spaceHoldActive = false;
746
+ this.#resetSpaceRun();
747
+ if (this.#spaceHoldTimer) {
748
+ clearTimeout(this.#spaceHoldTimer);
749
+ this.#spaceHoldTimer = undefined;
750
+ }
751
+ this.onSpaceHoldEnd?.();
752
+ }
753
+
754
+ /** Decrement {@link #pasteInFlight} once an async paste settles and, when the count returns
755
+ * to zero, drain {@link #pendingInput} through `handleInput` so requeueing still works if a
756
+ * drained chunk triggers another async paste. Bound member so it can be passed straight to
757
+ * `Promise.then(callback, callback)`. */
758
+ #onPasteSettled = (): void => {
759
+ this.#pasteInFlight--;
760
+ if (this.#pasteInFlight > 0) return;
761
+ const drained = this.#pendingInput.splice(0);
762
+ for (const chunk of drained) this.handleInput(chunk);
763
+ };
764
+
765
+ /** Track `promise` as an in-flight paste so subsequent `handleInput` calls queue behind it,
766
+ * then drain the queue once it settles. Codex PR #3602 review: without this, a trailing
767
+ * keystroke (Enter most painfully) in the same stdin read processes synchronously while the
768
+ * clipboard read is still pending — submit fires with the text but `pendingImages` is still
769
+ * empty and the image lands on the *next* draft instead. */
770
+ #trackAsyncPaste(promise: Promise<unknown>): void {
771
+ this.#pasteInFlight++;
772
+ void promise.then(this.#onPasteSettled, this.#onPasteSettled);
773
+ }
774
+
775
+ handleInput(data: string): void {
776
+ // Serialize behind any in-flight async paste so a trailing Enter / follow-up key can't
777
+ // submit before the clipboard image reaches `pendingImages` (Codex PR #3602 review).
778
+ if (this.#pasteInFlight > 0) {
779
+ this.#pendingInput.push(data);
780
+ return;
781
+ }
782
+ // textEquals avoids getText()'s O(buffer) join on every keystroke; kitty
783
+ // sequences always start with ESC, so plain bytes skip the native parse.
784
+ const hadBareQueuePrefix = this.textEquals("->") || this.textEquals("=>");
785
+ const kittyParsed = data.charCodeAt(0) === 0x1b ? parseKittySequence(data) : null;
786
+ if (kittyParsed && (kittyParsed.modifier & 64) !== 0 && this.onCapsLock) {
787
+ // Caps Lock is modifier bit 64
788
+ this.onCapsLock();
789
+ return;
790
+ }
791
+
792
+ // Bracketed-paste assembly. Some terminals fragment the start marker,
793
+ // the payload, and the end marker across separate stdin chunks
794
+ // (Windows Terminal under heavy load, certain SSH muxes, …); the
795
+ // inherited handler then sees a zero-length payload and silently
796
+ // drops it through the normal text-insert path. Running our own
797
+ // `BracketedPasteHandler` ahead of `super.handleInput` lets us route
798
+ // the assembled content regardless of chunk boundaries:
799
+ // - empty payload → `onPasteImage` (#3601: `Cmd+V`/`Ctrl+V` on an
800
+ // image-only macOS pasteboard the terminal stripped to `""` first);
801
+ // - explicit image-file paths → `onPasteImagePath` (#3506);
802
+ // - anything else → the base editor's `pasteText` so `[Paste #N]`
803
+ // markers, autocomplete, and undo state stay intact.
804
+ const paste = this.#pasteHandler.process(data);
805
+ if (paste.handled) {
806
+ if (paste.pasteContent === undefined) return; // still buffering — wait for end marker
807
+ const content = paste.pasteContent;
808
+ const remaining = paste.remaining;
809
+ // Queue any trailing bytes from the same read (typically a follow-up keystroke such as
810
+ // Enter that the user pressed right after Cmd+V) so they only fire *after* the paste
811
+ // completes — fixes the race where submit runs against an empty `pendingImages`.
812
+ if (remaining.length > 0) this.#pendingInput.push(remaining);
813
+ if (content.length === 0 && this.onPasteImage) {
814
+ this.#trackAsyncPaste(Promise.resolve(this.onPasteImage()));
815
+ return;
816
+ }
817
+ const imagePaths = extractImagePastePathsFromText(content);
818
+ if (imagePaths && this.onPasteImagePath) {
819
+ this.#trackAsyncPaste(
820
+ (async () => {
821
+ for (const p of imagePaths) await this.onPasteImagePath?.(p);
822
+ })(),
823
+ );
824
+ return;
825
+ }
826
+ this.pasteText(content);
827
+ // No async paste was started; drain the queued trailing bytes ourselves.
828
+ const drained = this.#pendingInput.splice(0);
829
+ for (const chunk of drained) this.handleInput(chunk);
830
+ return;
831
+ }
832
+
833
+ const parsedKey = parseKey(data);
834
+ const canonical = parsedKey !== undefined ? canonicalKeyId(parsedKey) : undefined;
835
+
836
+ // Left-arrow on an empty editor: surface for the agent-hub double-tap
837
+ // gesture. Plain "left" only — modified arrows and any in-text cursor
838
+ // movement fall through to normal handling.
839
+ if (canonical === "left" && this.onLeftAtStart && this.getText().trim() === "") {
840
+ this.onLeftAtStart();
841
+ return;
842
+ }
843
+
844
+ // Space-hold push-to-talk: a sustained space bar starts/stops STT instead of typing spaces.
845
+ if (this.#handleSpaceHold(data, canonical)) return;
846
+
847
+ // One union probe decides whether any per-action interception below can
848
+ // match — plain typing then skips the ~20 per-action set lookups per key.
849
+ if (
850
+ canonical !== undefined &&
851
+ (this.#actionMatchKeyUnion.has(canonical) || this.#customMatchKeys.has(canonical))
852
+ ) {
853
+ // Intercept configured image paste (async - fires and handles result)
854
+ if (this.#matchesAction(canonical, "app.clipboard.pasteImage") && this.onPasteImage) {
855
+ void this.onPasteImage();
856
+ return;
857
+ }
858
+
859
+ // Intercept configured raw text paste (fires and handles result)
860
+ if (this.#matchesAction(canonical, "app.clipboard.pasteTextRaw") && this.onPasteTextRaw) {
861
+ this.onPasteTextRaw();
862
+ return;
863
+ }
864
+
865
+ // Intercept configured external editor shortcut
866
+ if (this.#matchesAction(canonical, "app.editor.external") && this.onExternalEditor) {
867
+ this.onExternalEditor();
868
+ return;
869
+ }
870
+
871
+ // Intercept configured temporary model selector shortcut
872
+ if (this.#matchesAction(canonical, "app.model.selectTemporary") && this.onSelectModelTemporary) {
873
+ this.onSelectModelTemporary();
874
+ return;
875
+ }
876
+
877
+ // Intercept configured display reset shortcut
878
+ if (this.#matchesAction(canonical, "app.display.reset") && this.onDisplayReset) {
879
+ this.onDisplayReset();
880
+ return;
881
+ }
882
+
883
+ // Intercept configured suspend shortcut
884
+ if (this.#matchesAction(canonical, "app.suspend") && this.onSuspend) {
885
+ this.onSuspend();
886
+ return;
887
+ }
888
+
889
+ // Intercept configured thinking block visibility toggle
890
+ if (this.#matchesAction(canonical, "app.thinking.toggle") && this.onToggleThinking) {
891
+ this.onToggleThinking();
892
+ return;
893
+ }
894
+
895
+ // Intercept configured model selector shortcut
896
+ if (this.#matchesAction(canonical, "app.model.select") && this.onSelectModel) {
897
+ this.onSelectModel();
898
+ return;
899
+ }
900
+
901
+ // Intercept configured history search shortcut
902
+ if (this.#matchesAction(canonical, "app.history.search") && this.onHistorySearch) {
903
+ this.onHistorySearch();
904
+ return;
905
+ }
906
+
907
+ // Intercept configured tool output expansion shortcut
908
+ if (this.#matchesAction(canonical, "app.tools.expand") && this.onExpandTools) {
909
+ this.onExpandTools();
910
+ return;
911
+ }
912
+
913
+ // Intercept configured backward model cycling (check before forward cycling)
914
+ if (this.#matchesAction(canonical, "app.model.cycleBackward") && this.onCycleModelBackward) {
915
+ this.onCycleModelBackward();
916
+ return;
917
+ }
918
+
919
+ // Intercept configured forward model cycling
920
+ if (this.#matchesAction(canonical, "app.model.cycleForward") && this.onCycleModelForward) {
921
+ this.onCycleModelForward();
922
+ return;
923
+ }
924
+
925
+ // Intercept configured thinking level cycling
926
+ if (this.#matchesAction(canonical, "app.thinking.cycle") && this.onCycleThinkingLevel) {
927
+ this.onCycleThinkingLevel();
928
+ return;
929
+ }
930
+
931
+ // Intercept configured interrupt shortcut.
932
+ // When the autocomplete popup is visible, ESC's first job is to dismiss
933
+ // the popup — let super.handleInput() route it to #cancelAutocomplete().
934
+ // The user can press ESC again afterward to fire the global interrupt
935
+ // handler. This matches the standard TUI/IDE pattern and prevents a
936
+ // single ESC from both closing an @ completion and aborting an active
937
+ // agent run (#1655).
938
+ if (this.#matchesAction(canonical, "app.interrupt") && this.onEscape && !this.isShowingAutocomplete()) {
939
+ this.onEscape();
940
+ return;
941
+ }
942
+
943
+ // Intercept configured clear shortcut
944
+ if (this.#matchesAction(canonical, "app.clear") && this.onClear) {
945
+ this.onClear();
946
+ return;
947
+ }
948
+
949
+ // Intercept configured exit shortcut. Always consume the shortcut so it
950
+ // never reaches the parent handler; firing onExit is the controller's
951
+ // chance to snapshot the current text as a draft before shutting down.
952
+ if (this.#matchesAction(canonical, "app.exit")) {
953
+ this.onExit?.();
954
+ return;
955
+ }
956
+
957
+ // Intercept configured dequeue shortcut (restore queued message to editor)
958
+ if (this.#matchesAction(canonical, "app.message.dequeue") && this.onDequeue) {
959
+ this.onDequeue();
960
+ return;
961
+ }
962
+
963
+ // Intercept configured copy-prompt shortcut
964
+ if (this.#matchesAction(canonical, "app.clipboard.copyPrompt") && this.onCopyPrompt) {
965
+ this.onCopyPrompt();
966
+ return;
967
+ }
968
+
969
+ // Intercept configured retry shortcut. Later user/custom handlers keep
970
+ // precedence so adding the default Alt+R binding does not steal existing
971
+ // shortcuts such as app.plan.toggle or extension commands; copy-prompt is
972
+ // checked above for the same reason.
973
+ if (this.#matchesAction(canonical, "app.retry") && this.onRetry) {
974
+ const customHandler = this.#customMatchKeys.get(canonical);
975
+ if (customHandler) {
976
+ customHandler();
977
+ return;
978
+ }
979
+ this.onRetry();
980
+ return;
981
+ }
982
+
983
+ // Check custom key handlers (extensions)
984
+ const handler = this.#customMatchKeys.get(canonical);
985
+ if (handler) {
986
+ handler();
987
+ return;
988
+ }
989
+ }
990
+
991
+ // Pass to parent for normal handling
992
+ super.handleInput(data);
993
+ if (!hadBareQueuePrefix && (this.textEquals("->") || this.textEquals("=>"))) {
994
+ const cursor = this.getCursor();
995
+ if (cursor.line === 0 && cursor.col === 2) {
996
+ this.insertText("\n");
997
+ }
998
+ }
999
+ }
1000
+
1001
+ /**
1002
+ * Route a keystroke through the base text-editor pipeline only, skipping the
1003
+ * app-level shortcut interception in {@link handleInput} (Agent Hub, model
1004
+ * selector, history search, external editor, …). Used when the editor is
1005
+ * mounted for draft editing beneath another focused surface — e.g. an Ask
1006
+ * dialog opened over a non-empty prompt — so finishing or submitting the
1007
+ * draft can never fire an editor-slot shortcut that clears `editorContainer`
1008
+ * and orphans the overlay. Only text editing, cursor movement, submission,
1009
+ * and the clear action reach the buffer.
1010
+ */
1011
+ handleDraftEdit(data: string): void {
1012
+ // The base editor reserves Ctrl+C for parent handling and returns without
1013
+ // touching the buffer, so the configured clear action must be dispatched
1014
+ // explicitly here — otherwise the guard's "finish or clear the prompt"
1015
+ // instruction has no working clear key. onClear (Ctrl+C → handleCtrlC)
1016
+ // clears the draft on first press without swapping the editor slot; a
1017
+ // standalone editor with no callback clears its own text.
1018
+ const parsed = parseKey(data);
1019
+ const canonical = parsed !== undefined ? canonicalKeyId(parsed) : undefined;
1020
+ if (canonical !== undefined && this.#matchesAction(canonical, "app.clear")) {
1021
+ if (this.onClear) this.onClear();
1022
+ else this.setText("");
1023
+ return;
1024
+ }
1025
+ super.handleInput(data);
1026
+ }
1027
+ }