one-code-extension 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/README.md +16 -5
  2. package/agents/general-purpose.md +2 -2
  3. package/docs/guide/README.md +2 -1
  4. package/docs/guide/bring-your-claude-code-setup.md +60 -9
  5. package/docs/guide/configuration.md +48 -14
  6. package/docs/guide/differences-from-claude-code.md +40 -28
  7. package/docs/guide/doctor.md +20 -13
  8. package/docs/guide/hooks.md +18 -3
  9. package/docs/guide/installation.md +26 -4
  10. package/docs/guide/permissions-modes-and-auto-mode.md +225 -49
  11. package/docs/guide/providers-and-models.md +137 -54
  12. package/docs/guide/reference.md +27 -15
  13. package/docs/guide/sessions-and-context.md +69 -16
  14. package/docs/guide/skills-plugins-and-mcp.md +57 -20
  15. package/docs/guide/subagents-and-workflows.md +95 -29
  16. package/docs/guide/tasks-and-background-work.md +101 -26
  17. package/docs/guide/terminal-interface.md +24 -12
  18. package/docs/guide/tools.md +46 -5
  19. package/docs/guide/troubleshooting.md +13 -9
  20. package/docs/guide/windows.md +58 -31
  21. package/extensions/artifacts/gallery.ts +227 -0
  22. package/extensions/artifacts/index.ts +288 -0
  23. package/extensions/artifacts/store.ts +570 -0
  24. package/extensions/artifacts/viewer.ts +199 -0
  25. package/extensions/ask-user/description.ts +67 -0
  26. package/extensions/ask-user/dialogs.ts +80 -0
  27. package/extensions/ask-user/index.ts +37 -33
  28. package/extensions/ask-user/questions.ts +32 -7
  29. package/extensions/ask-user/widget.ts +45 -25
  30. package/extensions/auto-mode/actions.ts +6 -0
  31. package/extensions/auto-mode/cache.ts +88 -0
  32. package/extensions/auto-mode/classifier-prompt.ts +5 -4
  33. package/extensions/auto-mode/classifier.ts +290 -65
  34. package/extensions/auto-mode/config.ts +72 -20
  35. package/extensions/auto-mode/decision-log.ts +2 -0
  36. package/extensions/auto-mode/defaults.ts +1 -1
  37. package/extensions/auto-mode/denials.ts +124 -0
  38. package/extensions/auto-mode/git-checkout-programs.ts +187 -0
  39. package/extensions/auto-mode/git-status-meta.ts +159 -0
  40. package/extensions/auto-mode/history.ts +189 -0
  41. package/extensions/auto-mode/instructions.ts +58 -52
  42. package/extensions/auto-mode/model-select.ts +159 -134
  43. package/extensions/auto-mode/paths.ts +57 -5
  44. package/extensions/auto-mode/pause.ts +57 -2
  45. package/extensions/auto-mode/prompt.ts +37 -21
  46. package/extensions/auto-mode/read-only-options.ts +724 -0
  47. package/extensions/auto-mode/resolved-paths-meta.ts +133 -0
  48. package/extensions/auto-mode/rules.ts +18 -1
  49. package/extensions/auto-mode/safety-floor.ts +361 -18
  50. package/extensions/auto-mode/setup-run.ts +20 -14
  51. package/extensions/auto-mode/shell-analysis.ts +764 -490
  52. package/extensions/auto-mode/shell-parse.ts +885 -0
  53. package/extensions/auto-mode/system-note.ts +33 -0
  54. package/extensions/auto-mode/transcript.ts +80 -51
  55. package/extensions/background/cron.ts +642 -0
  56. package/extensions/background/index.ts +614 -248
  57. package/extensions/background/loop-fire.ts +173 -0
  58. package/extensions/background/loop-preamble.ts +59 -0
  59. package/extensions/background/loop-skill.ts +163 -0
  60. package/extensions/background/monitor-batch.ts +53 -0
  61. package/extensions/background/noop-fold.ts +128 -0
  62. package/extensions/background/switch-guard.ts +56 -0
  63. package/extensions/background/wakeup.ts +178 -55
  64. package/extensions/bash/background.ts +53 -17
  65. package/extensions/bash/child.ts +7 -0
  66. package/extensions/bash/description.ts +188 -0
  67. package/extensions/bash/guards.ts +15 -67
  68. package/extensions/bash/index.ts +66 -35
  69. package/extensions/branding/compaction-keep.ts +63 -0
  70. package/extensions/branding/declined.ts +22 -0
  71. package/extensions/branding/index.ts +133 -9
  72. package/extensions/branding/prompt-editor.ts +53 -6
  73. package/extensions/branding/queued-edit.ts +31 -0
  74. package/extensions/branding/replaced-builtins.ts +68 -0
  75. package/extensions/branding/startup.ts +33 -71
  76. package/extensions/btw/index.ts +250 -78
  77. package/extensions/btw/panel.ts +228 -100
  78. package/extensions/btw/prompt.ts +41 -4
  79. package/extensions/cache-marks/index.ts +42 -0
  80. package/extensions/claude-compat/index.ts +7 -11
  81. package/extensions/claude-context/index.ts +436 -63
  82. package/extensions/compaction/cut.ts +157 -0
  83. package/extensions/compaction/index.ts +219 -75
  84. package/extensions/compaction/kept-thinking.ts +62 -0
  85. package/extensions/compaction/prompt.ts +15 -12
  86. package/extensions/context-budget/budget.ts +16 -2
  87. package/extensions/context-budget/index.ts +35 -15
  88. package/extensions/context-management/index.ts +36 -28
  89. package/extensions/doctor/build.ts +59 -8
  90. package/extensions/doctor/builtins.ts +84 -0
  91. package/extensions/doctor/cli.ts +7 -1
  92. package/extensions/doctor/compat.ts +88 -23
  93. package/extensions/doctor/dependencies.ts +41 -5
  94. package/extensions/doctor/fix-prompt.ts +9 -2
  95. package/extensions/doctor/index.ts +102 -58
  96. package/extensions/doctor/models.ts +102 -63
  97. package/extensions/doctor/presets.ts +42 -27
  98. package/extensions/doctor/report.ts +19 -2
  99. package/extensions/doctor/viewer.ts +49 -27
  100. package/extensions/effort/index.ts +141 -25
  101. package/extensions/effort/settings.ts +21 -0
  102. package/extensions/effort/slider.ts +24 -20
  103. package/extensions/exit/index.ts +32 -1
  104. package/extensions/file-tracker/index.ts +420 -42
  105. package/extensions/file-tracker/replay.ts +137 -24
  106. package/extensions/file-tracker/restore.ts +66 -0
  107. package/extensions/file-tracker/results.ts +66 -0
  108. package/extensions/file-tracker/shell-reads.ts +211 -0
  109. package/extensions/file-tracker/tracker.ts +45 -15
  110. package/extensions/footer/footer-line.ts +45 -24
  111. package/extensions/footer/index.ts +47 -2
  112. package/extensions/footer/pr.ts +34 -5
  113. package/extensions/hooks/compaction.ts +7 -0
  114. package/extensions/hooks/executor.ts +32 -30
  115. package/extensions/hooks/index.ts +209 -58
  116. package/extensions/hooks/matcher.ts +3 -0
  117. package/extensions/hooks/prompt-context.ts +59 -0
  118. package/extensions/hooks/protocol.ts +41 -3
  119. package/extensions/hooks/settings.ts +50 -19
  120. package/extensions/hooks/subagent-bridge.ts +2 -0
  121. package/extensions/hooks/trust.ts +26 -12
  122. package/extensions/idle-compact/index.ts +119 -0
  123. package/extensions/idle-compact/policy.ts +143 -0
  124. package/extensions/init/index.ts +11 -10
  125. package/extensions/init/prompt.ts +25 -32
  126. package/extensions/interrupted/index.ts +13 -1
  127. package/extensions/kept-thinking/index.ts +27 -0
  128. package/extensions/ledger/index.ts +46 -0
  129. package/extensions/ledger/wire.ts +154 -0
  130. package/extensions/lib/agent-cron.ts +146 -0
  131. package/extensions/lib/agent-loader.ts +18 -3
  132. package/extensions/lib/agent-view.ts +85 -0
  133. package/extensions/lib/anthropic-auth.ts +98 -0
  134. package/extensions/lib/anthropic-payload.ts +82 -1
  135. package/extensions/lib/anthropic-server-call.ts +230 -0
  136. package/extensions/lib/anthropic-server-tools.ts +485 -0
  137. package/extensions/lib/app-launch.mjs +94 -0
  138. package/extensions/lib/argument-hints.ts +190 -0
  139. package/extensions/lib/atomic-write.ts +6 -2
  140. package/extensions/lib/auto-memory.ts +75 -0
  141. package/extensions/lib/bash-parser.ts +84 -0
  142. package/extensions/lib/btw-fork.ts +93 -0
  143. package/extensions/lib/child-extensions.ts +52 -0
  144. package/extensions/lib/child-writes.ts +45 -0
  145. package/extensions/lib/claude-context.ts +515 -100
  146. package/extensions/lib/claude-external-includes.ts +68 -0
  147. package/extensions/lib/claude-id.ts +22 -0
  148. package/extensions/lib/claude-rules.ts +323 -0
  149. package/extensions/lib/claude-settings.ts +76 -4
  150. package/extensions/lib/compaction-boundary.ts +36 -0
  151. package/extensions/lib/compaction-keep.mjs +83 -0
  152. package/extensions/lib/config-mode.ts +112 -0
  153. package/extensions/lib/consent-dialogs.ts +63 -0
  154. package/extensions/lib/consent-preview.ts +5 -1
  155. package/extensions/lib/consent-stores.ts +48 -0
  156. package/extensions/lib/context-facts.ts +97 -0
  157. package/extensions/lib/covered-messages.ts +23 -0
  158. package/extensions/lib/deferred.ts +359 -25
  159. package/extensions/lib/dock-rows.ts +60 -0
  160. package/extensions/lib/empty-tool-result.ts +27 -0
  161. package/extensions/lib/environment-block.ts +76 -0
  162. package/extensions/lib/fetch-timeout.ts +24 -6
  163. package/extensions/{system-prompt → lib}/git-status.ts +51 -13
  164. package/extensions/lib/git.ts +75 -13
  165. package/extensions/lib/grammars/LICENSE-tree-sitter-bash +21 -0
  166. package/extensions/lib/grammars/README.md +2 -0
  167. package/extensions/lib/grammars/tree-sitter-bash.wasm +0 -0
  168. package/extensions/lib/guide-docs.ts +45 -0
  169. package/extensions/lib/headless-output.ts +46 -0
  170. package/extensions/lib/hook-gate.ts +7 -7
  171. package/extensions/lib/interrupt.ts +20 -4
  172. package/extensions/lib/key-input.ts +455 -0
  173. package/extensions/lib/keys.ts +14 -1
  174. package/extensions/lib/ledger/fold-memo.ts +49 -0
  175. package/extensions/lib/ledger/fold.ts +265 -0
  176. package/extensions/lib/ledger/layout.ts +72 -0
  177. package/extensions/lib/ledger/plan.ts +102 -0
  178. package/extensions/lib/ledger/records.ts +276 -0
  179. package/extensions/lib/ledger/state.ts +47 -0
  180. package/extensions/lib/ledger/validate.ts +141 -0
  181. package/extensions/lib/ledger/wire.ts +632 -0
  182. package/extensions/lib/local-command.ts +71 -19
  183. package/extensions/lib/mcp-overrides.ts +1 -1
  184. package/extensions/lib/mcp-share.ts +46 -0
  185. package/extensions/lib/memory-content.ts +146 -0
  186. package/extensions/lib/memory-index.ts +18 -0
  187. package/extensions/lib/memory.ts +134 -123
  188. package/extensions/lib/model-catalog/huggingface.json +178 -0
  189. package/extensions/lib/model-catalog/models-dev.json +18533 -0
  190. package/extensions/lib/model-catalog/openrouter.json +5050 -0
  191. package/extensions/lib/model-catalog-data.ts +513 -0
  192. package/extensions/lib/model-catalog.ts +462 -0
  193. package/extensions/lib/model-choice-warnings.ts +137 -0
  194. package/extensions/lib/model-pairings.ts +152 -0
  195. package/extensions/{auto-mode → lib}/model-picker.ts +26 -43
  196. package/extensions/lib/model-policy.ts +112 -15
  197. package/extensions/lib/model-tier.ts +283 -355
  198. package/extensions/lib/model-unusable.ts +1 -1
  199. package/extensions/lib/newer-model.ts +100 -0
  200. package/extensions/lib/notices.ts +87 -0
  201. package/extensions/lib/notifications.ts +357 -73
  202. package/extensions/lib/one-code-settings.ts +74 -8
  203. package/extensions/lib/open-browser.ts +63 -0
  204. package/extensions/lib/openrouter-generation.ts +94 -0
  205. package/extensions/lib/operation-deadline.ts +30 -0
  206. package/extensions/lib/original-command.ts +4 -4
  207. package/extensions/lib/package-version.ts +1 -1
  208. package/extensions/lib/panel-focus.ts +134 -0
  209. package/extensions/lib/paths.ts +17 -2
  210. package/extensions/lib/permission-gate.ts +72 -6
  211. package/extensions/lib/persisted-output.ts +60 -8
  212. package/extensions/lib/pi-ai-estimate.ts +19 -3
  213. package/extensions/lib/pi-version.ts +38 -2
  214. package/extensions/lib/plan-mode-channels.ts +42 -5
  215. package/extensions/lib/plugins.ts +26 -17
  216. package/extensions/lib/powershell-parse-script.ts +208 -0
  217. package/extensions/lib/powershell-parser.ts +344 -0
  218. package/extensions/lib/previous-mark.ts +101 -0
  219. package/extensions/lib/process-state.ts +48 -0
  220. package/extensions/lib/process-tree.ts +132 -8
  221. package/extensions/lib/prompt-options.ts +82 -0
  222. package/extensions/lib/queued-delivery.ts +44 -0
  223. package/extensions/lib/reminders.ts +370 -358
  224. package/extensions/lib/replaced-builtins.mjs +199 -0
  225. package/extensions/lib/replay-call.ts +70 -0
  226. package/extensions/lib/request-replay.ts +547 -0
  227. package/extensions/lib/scratchpad.ts +81 -14
  228. package/extensions/lib/send-now-channel.ts +7 -0
  229. package/extensions/lib/session-model-tier.ts +51 -0
  230. package/extensions/lib/session-work.ts +64 -0
  231. package/extensions/lib/settings-channels.ts +4 -4
  232. package/extensions/lib/shell-exit-semantics.ts +170 -0
  233. package/extensions/lib/shell-quote.ts +11 -0
  234. package/extensions/lib/shell-result.ts +70 -0
  235. package/extensions/lib/shell-spawn.ts +70 -6
  236. package/extensions/lib/shell-tool.ts +75 -25
  237. package/extensions/lib/side-call-cache.ts +124 -0
  238. package/extensions/lib/side-call-run.ts +96 -0
  239. package/extensions/lib/side-call-usage.ts +38 -0
  240. package/extensions/lib/side-call.ts +24 -1
  241. package/extensions/lib/single-flight.ts +18 -0
  242. package/extensions/lib/skill-body.ts +42 -0
  243. package/extensions/lib/skill-scan.ts +63 -24
  244. package/extensions/lib/spill-file.ts +140 -0
  245. package/extensions/lib/subagent-handback.ts +112 -0
  246. package/extensions/lib/system-role.ts +156 -0
  247. package/extensions/lib/terminal-text.ts +114 -0
  248. package/extensions/lib/text-width.ts +47 -16
  249. package/extensions/lib/timer-ops.ts +20 -0
  250. package/extensions/lib/tool-additions.ts +129 -0
  251. package/extensions/lib/tool-call-corruption.ts +134 -0
  252. package/extensions/lib/tool-path.ts +66 -0
  253. package/extensions/lib/tool-variants.ts +69 -0
  254. package/extensions/lib/tui-render.ts +255 -27
  255. package/extensions/lib/turn-budget-layout.ts +159 -0
  256. package/extensions/lib/update-check.mjs +15 -2
  257. package/extensions/lib/usage-bus.ts +1 -1
  258. package/extensions/lib/user-denial.ts +38 -0
  259. package/extensions/lib/workspace-channel.ts +16 -0
  260. package/extensions/lib/worktree-channel.ts +31 -3
  261. package/extensions/lib/worktree-isolation.ts +40 -10
  262. package/extensions/lsp/client.ts +8 -9
  263. package/extensions/lsp/index.ts +76 -12
  264. package/extensions/lsp/keep-alive.ts +1 -1
  265. package/extensions/lsp/trust.ts +119 -0
  266. package/extensions/lsp/watcher.ts +1 -1
  267. package/extensions/mcp/announce.ts +90 -43
  268. package/extensions/mcp/client.ts +161 -48
  269. package/extensions/mcp/config.ts +132 -8
  270. package/extensions/mcp/discovery.ts +19 -0
  271. package/extensions/mcp/index.ts +220 -121
  272. package/extensions/mcp/oauth/browser.ts +38 -17
  273. package/extensions/mcp/oauth/flow.ts +25 -17
  274. package/extensions/mcp/oauth/provider.ts +14 -8
  275. package/extensions/mcp/oauth/store.ts +34 -16
  276. package/extensions/mcp/panel/keys.ts +12 -11
  277. package/extensions/mcp/panel/render.ts +9 -6
  278. package/extensions/mcp/schema.ts +104 -5
  279. package/extensions/mcp/trust.ts +164 -73
  280. package/extensions/memory/entries.ts +23 -14
  281. package/extensions/memory/index.ts +134 -28
  282. package/extensions/memory/open-external.ts +33 -18
  283. package/extensions/memory/panel.ts +135 -26
  284. package/extensions/model-default/index.ts +86 -19
  285. package/extensions/newer-model/index.ts +31 -0
  286. package/extensions/notebook/description.ts +18 -0
  287. package/extensions/notebook/index.ts +6 -5
  288. package/extensions/notebook/notebook.ts +1 -1
  289. package/extensions/permissions/index.ts +1426 -398
  290. package/extensions/permissions/matcher.ts +425 -74
  291. package/extensions/permissions/modes.ts +11 -4
  292. package/extensions/permissions/panel/host.ts +130 -0
  293. package/extensions/permissions/panel/keys.ts +48 -0
  294. package/extensions/permissions/panel/render.ts +450 -0
  295. package/extensions/permissions/panel/state.ts +550 -0
  296. package/extensions/permissions/powershell-cmdlets.ts +198 -0
  297. package/extensions/permissions/powershell-paths.ts +197 -0
  298. package/extensions/permissions/powershell-rules.ts +207 -280
  299. package/extensions/permissions/powershell-tree.ts +557 -0
  300. package/extensions/permissions/project-trust.ts +27 -11
  301. package/extensions/permissions/protected-paths.ts +14 -2
  302. package/extensions/permissions/session-grant.ts +6 -0
  303. package/extensions/permissions/settings.ts +166 -31
  304. package/extensions/permissions/subagent-gate.ts +25 -0
  305. package/extensions/permissions/workspace.ts +78 -0
  306. package/extensions/plan-mode/index.ts +276 -92
  307. package/extensions/plan-mode/reminder.ts +89 -21
  308. package/extensions/plan-mode/run-state.ts +26 -0
  309. package/extensions/plan-mode/texts.ts +177 -0
  310. package/extensions/plan-mode/viewer.ts +92 -27
  311. package/extensions/plugins/counts.ts +3 -3
  312. package/extensions/plugins/index.ts +64 -46
  313. package/extensions/plugins/install/install.ts +16 -0
  314. package/extensions/plugins/marketplace/sync.ts +9 -3
  315. package/extensions/plugins/marketplace/types.ts +3 -1
  316. package/extensions/plugins/panel/keys.ts +21 -24
  317. package/extensions/plugins/panel/render.ts +12 -6
  318. package/extensions/plugins/shell-expand.ts +107 -0
  319. package/extensions/plugins/template.ts +32 -15
  320. package/extensions/powershell/child.ts +7 -0
  321. package/extensions/powershell/description.ts +38 -6
  322. package/extensions/powershell/guards.ts +1 -1
  323. package/extensions/powershell/index.ts +14 -7
  324. package/extensions/recap/index.ts +73 -71
  325. package/extensions/recap/prompt.ts +2 -2
  326. package/extensions/recap/scheduler.ts +3 -5
  327. package/extensions/search-tools/grep-merge.ts +39 -0
  328. package/extensions/search-tools/index.ts +0 -0
  329. package/extensions/send-now/chord.ts +62 -0
  330. package/extensions/send-now/index.ts +133 -0
  331. package/extensions/session-title/index.ts +3 -0
  332. package/extensions/session-title/title.ts +4 -1
  333. package/extensions/skill/announce.ts +30 -0
  334. package/extensions/skill/code-review.ts +97 -0
  335. package/extensions/skill/index.ts +469 -132
  336. package/extensions/skill/invoke.ts +118 -75
  337. package/extensions/skill/listing.ts +133 -9
  338. package/extensions/skill/panel/keys.ts +15 -16
  339. package/extensions/skill/panel/render.ts +5 -2
  340. package/extensions/skill/panel/state.ts +12 -1
  341. package/extensions/subagents/agent-args.ts +39 -0
  342. package/extensions/subagents/agent-description.ts +132 -0
  343. package/extensions/subagents/agents.ts +146 -31
  344. package/extensions/subagents/default-model.ts +2 -3
  345. package/extensions/subagents/delegation-steer.ts +4 -4
  346. package/extensions/subagents/fork-cache.ts +82 -0
  347. package/extensions/subagents/guide-agent.ts +189 -0
  348. package/extensions/subagents/hand-back-review.ts +3 -0
  349. package/extensions/subagents/index.ts +1594 -852
  350. package/extensions/subagents/live-runs.ts +26 -6
  351. package/extensions/subagents/model-select.ts +38 -25
  352. package/extensions/subagents/outcome.ts +5 -2
  353. package/extensions/subagents/panel-keys.ts +73 -31
  354. package/extensions/subagents/panel-render.ts +120 -96
  355. package/extensions/subagents/panel-widget.ts +60 -89
  356. package/extensions/subagents/parent-mode.ts +50 -0
  357. package/extensions/subagents/pending-claim.ts +18 -1
  358. package/extensions/subagents/runner.ts +135 -80
  359. package/extensions/subagents/runs.ts +44 -5
  360. package/extensions/subagents/send-to-main-tool.ts +1 -1
  361. package/extensions/subagents/session-turns.ts +32 -8
  362. package/extensions/subagents/shell-panel.ts +36 -178
  363. package/extensions/subagents/tasks-dialog.ts +170 -0
  364. package/extensions/subagents/viewport-mirror.ts +95 -0
  365. package/extensions/subagents/worktree.ts +57 -13
  366. package/extensions/system-prompt/environment.ts +19 -19
  367. package/extensions/system-prompt/idle-turn.ts +65 -0
  368. package/extensions/system-prompt/index.ts +165 -47
  369. package/extensions/system-prompt/template.ts +34 -51
  370. package/extensions/system-prompt/tiers/common.ts +23 -64
  371. package/extensions/system-prompt/tiers/frontier.ts +32 -11
  372. package/extensions/system-prompt/tiers/low.ts +67 -45
  373. package/extensions/system-prompt/tiers/mid.ts +96 -38
  374. package/extensions/system-reminder/index.ts +204 -70
  375. package/extensions/tasks/descriptions.ts +190 -0
  376. package/extensions/tasks/index.ts +120 -41
  377. package/extensions/tasks/store.ts +83 -16
  378. package/extensions/tool-call-corruption/child.ts +7 -0
  379. package/extensions/tool-call-corruption/index.ts +237 -0
  380. package/extensions/tool-search/index.ts +366 -144
  381. package/extensions/tool-style/index.ts +68 -10
  382. package/extensions/tool-style/write-description.ts +40 -0
  383. package/extensions/tool-style/write-render.ts +237 -0
  384. package/extensions/turn-duration/index.ts +7 -3
  385. package/extensions/turn-duration/line.ts +47 -4
  386. package/extensions/web/backends.ts +6 -9
  387. package/extensions/web/description.ts +50 -0
  388. package/extensions/web/index.ts +118 -53
  389. package/extensions/web/native-call.ts +15 -0
  390. package/extensions/web/native-results.ts +41 -0
  391. package/extensions/web-fetch/description.ts +42 -0
  392. package/extensions/web-fetch/extract.ts +53 -6
  393. package/extensions/web-fetch/index.ts +125 -76
  394. package/extensions/web-fetch/page-content.ts +19 -0
  395. package/extensions/web-fetch/response.ts +49 -0
  396. package/extensions/web-fetch/summarize.ts +9 -10
  397. package/extensions/workflow/agent-session.ts +108 -18
  398. package/extensions/workflow/args.ts +24 -0
  399. package/extensions/workflow/description.ts +67 -0
  400. package/extensions/workflow/globals.ts +17 -3
  401. package/extensions/workflow/index.ts +157 -162
  402. package/extensions/workflow/records.ts +1 -0
  403. package/extensions/workflow/run-manager.ts +33 -6
  404. package/extensions/workflow/saved-workflows.ts +3 -2
  405. package/extensions/workflow/types.ts +22 -1
  406. package/extensions/workflow/viewer.ts +54 -24
  407. package/extensions/workflow/widget.ts +20 -0
  408. package/extensions/worktree/descriptions.ts +91 -0
  409. package/extensions/worktree/guards.ts +316 -54
  410. package/extensions/worktree/index.ts +162 -44
  411. package/extensions/worktree/powershell-guards.ts +167 -0
  412. package/extensions/worktree/rewrite.ts +14 -16
  413. package/package.json +21 -7
  414. package/skills/artifact-design/SKILL.md +85 -0
  415. package/skills/code-review/SKILL.md +20 -20
  416. package/skills/code-review/cells/arguments-and-flags.md +19 -0
  417. package/skills/code-review/cells/high-3x5-recall-verify.md +137 -0
  418. package/skills/code-review/cells/high-8-inline.md +122 -0
  419. package/skills/code-review/cells/low-1-pass-max4.md +27 -0
  420. package/skills/code-review/cells/low-1-pass-min-files-4.md +28 -0
  421. package/skills/code-review/cells/max-5x5-verify-sweep.md +162 -0
  422. package/skills/code-review/cells/medium-3x5-verify.md +132 -0
  423. package/skills/code-review/cells/minimal-prompt.md +32 -0
  424. package/skills/code-review/cells/xhigh-10-inline-sweep.md +149 -0
  425. package/skills/code-review/cells/xhigh-5x5-verify-sweep.md +162 -0
  426. package/skills/fewer-permission-prompts/SKILL.md +1 -1
  427. package/skills/loop/SKILL.md +11 -0
  428. package/skills/security-review/SKILL.md +2 -5
  429. package/skills/simplify/SKILL.md +7 -5
  430. package/skills/workflow-authoring/SKILL.md +143 -0
  431. package/themes/onecode-light.json +1 -1
  432. package/themes/onecode.json +1 -1
  433. package/types/app.d.ts +58 -0
  434. package/types/community-packages.d.ts +26 -1
  435. package/extensions/auto-mode/recoverability.ts +0 -229
  436. package/extensions/lib/capability-index.ts +0 -466
  437. package/extensions/lib/model-facts.generated.json +0 -2675
  438. package/extensions/lib/model-facts.ts +0 -162
  439. package/extensions/tool-search/announce.ts +0 -42
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Where One Code reads its configuration and context: the two modes
3
+ * (working-docs/features/config-modes/).
4
+ *
5
+ * - `claude-compatible` (the default): Claude Code's `~/.claude`,
6
+ * `<repo>/.claude`, `CLAUDE.md` and `~/.claude.json`, plus the cross-tool
7
+ * `AGENTS.md` and `.agents/skills` and pi's own directories.
8
+ * - `independent`: no Claude Code path at all; `~/.onecode`, `ONECODE.md`,
9
+ * `<repo>/.onecode/`, pi's directories and the cross-tool files, with
10
+ * auto-memory under `~/.onecode/projects/<slug>/memory/`.
11
+ *
12
+ * The choice is `configMode` in One Code's user settings
13
+ * (`~/.onecode/settings.json`), never read from `~/.claude`;
14
+ * `ONECODE_CONFIG_MODE` overrides it. Readers run at factory time and on
15
+ * `resources_discover`, before any session event, so the mode is read from
16
+ * disk, not broadcast.
17
+ *
18
+ * The mode is fixed for the life of the process: the first read pins it in a
19
+ * `globalThis` slot that every extension's module instance shares (jiti gives
20
+ * each its own copy of this file). The system prompt names the memory folder
21
+ * and must stay byte-stable, so a `/memory` toggle saves the setting and
22
+ * applies from the next start.
23
+ */
24
+
25
+ import os from "node:os";
26
+ import { join } from "node:path";
27
+ import { readJsonFile } from "./atomic-write.ts";
28
+ import { claudeUserDir, oneCodeStateDir } from "./paths.ts";
29
+
30
+ export type ConfigMode = "claude-compatible" | "independent";
31
+
32
+ const DEFAULT_CONFIG_MODE: ConfigMode = "claude-compatible";
33
+
34
+ /** How each mode is named to the user (`/memory`, `/doctor`). */
35
+ export const MODE_LABELS: Record<ConfigMode, string> = {
36
+ "claude-compatible": "Claude-compatible",
37
+ independent: "Independent",
38
+ };
39
+
40
+ /** The key in `~/.onecode/settings.json`. */
41
+ export const CONFIG_MODE_KEY = "configMode";
42
+ const CONFIG_MODE_ENV = "ONECODE_CONFIG_MODE";
43
+
44
+ function isConfigMode(value: unknown): value is ConfigMode {
45
+ return value === "claude-compatible" || value === "independent";
46
+ }
47
+
48
+ /**
49
+ * The saved mode: `ONECODE_CONFIG_MODE`, else `configMode` in One Code's user
50
+ * settings, else the default. A missing, malformed or unknown value reads as
51
+ * the default (fail toward today's behaviour); an unknown env value is ignored.
52
+ */
53
+ export function readConfigMode(home: string = os.homedir(), env: Record<string, string | undefined> = process.env): ConfigMode {
54
+ return configModeFromEnv(env) ?? savedConfigMode(home, env);
55
+ }
56
+
57
+ /** The mode `ONECODE_CONFIG_MODE` sets, or undefined when it is unset or unknown. */
58
+ export function configModeFromEnv(env: Record<string, string | undefined> = process.env): ConfigMode | undefined {
59
+ const value = env[CONFIG_MODE_ENV];
60
+ return isConfigMode(value) ? value : undefined;
61
+ }
62
+
63
+ /**
64
+ * `configMode` in `~/.onecode/settings.json` alone, ignoring the env override.
65
+ * The path is spelled out: importing `oneCodeSettingsPath` would cycle through
66
+ * `one-code-settings.ts` and `memory.ts`.
67
+ */
68
+ export function savedConfigMode(home: string = os.homedir(), env: Record<string, string | undefined> = process.env): ConfigMode {
69
+ const value = readJsonFile<Record<string, unknown>>(join(oneCodeStateDir(env, home), "settings.json"))?.[CONFIG_MODE_KEY];
70
+ return isConfigMode(value) ? value : DEFAULT_CONFIG_MODE;
71
+ }
72
+
73
+ const MODE_SLOT = Symbol.for("one-code:config-mode");
74
+
75
+ /**
76
+ * The mode this process runs in: read once, then pinned for every extension.
77
+ * Tests that need a different mode call `resetConfigModeForTest` first.
78
+ */
79
+ export function configMode(): ConfigMode {
80
+ const slot = globalThis as { [MODE_SLOT]?: ConfigMode };
81
+ return (slot[MODE_SLOT] ??= readConfigMode());
82
+ }
83
+
84
+ export function resetConfigModeForTest(mode?: ConfigMode): void {
85
+ const slot = globalThis as { [MODE_SLOT]?: ConfigMode };
86
+ if (mode) slot[MODE_SLOT] = mode;
87
+ else delete slot[MODE_SLOT];
88
+ }
89
+
90
+ /** Whether Claude Code's own locations are read: `~/.claude`, `.claude/`, `CLAUDE.md`, `~/.claude.json`. */
91
+ export function claudeSourcesOn(): boolean {
92
+ return configMode() === "claude-compatible";
93
+ }
94
+
95
+ /**
96
+ * The user-level folder that holds agents, commands, workflows and the user
97
+ * settings file: `~/.claude` (`CLAUDE_CONFIG_DIR`) in Claude-compatible mode,
98
+ * `~/.onecode` (`ONECODE_STATE_DIR`) in independent mode.
99
+ */
100
+ export function userConfigDir(home: string, env: Record<string, string | undefined> = process.env): string {
101
+ return claudeSourcesOn() ? claudeUserDir(home, env) : oneCodeStateDir(env, home);
102
+ }
103
+
104
+ /** The project-level folder's name: `.claude`, or `.onecode` in independent mode. */
105
+ export function projectConfigDirName(): string {
106
+ return claudeSourcesOn() ? ".claude" : ".onecode";
107
+ }
108
+
109
+ /** The project-level counterpart of `userConfigDir`: `<cwd>/.claude` or `<cwd>/.onecode`. */
110
+ export function projectConfigDir(cwd: string): string {
111
+ return join(cwd, projectConfigDirName());
112
+ }
@@ -0,0 +1,63 @@
1
+ /** Serialize startup consent modals over the event bus (jiti modules cannot share a queue). */
2
+ const CHANNEL = "one-code:consent-dialog";
3
+ interface Events {
4
+ emit(channel: string, data: unknown): void;
5
+ on(channel: string, listener: (data: unknown) => void): unknown;
6
+ }
7
+ interface Request {
8
+ show: (signal?: AbortSignal) => Promise<unknown>;
9
+ /** External includes are the last startup consent, after hooks and MCP. */
10
+ afterStartup?: boolean;
11
+ result?: Promise<unknown>;
12
+ }
13
+
14
+ /** The early claude-context extension owns the queue and resets it with its session. */
15
+ export function installConsentDialogs(events: Events): () => void {
16
+ let controller = new AbortController();
17
+ let tail: Promise<unknown> = Promise.resolve();
18
+ let startupReady = false;
19
+ let waiting: Array<() => void> = [];
20
+ events.on(CHANNEL, (data) => {
21
+ if ((data as { ready?: boolean }).ready) {
22
+ startupReady = true;
23
+ const pending = waiting;
24
+ waiting = [];
25
+ for (const enqueue of pending) enqueue();
26
+ return;
27
+ }
28
+ const request = data as Request;
29
+ const signal = controller.signal;
30
+ let enqueue!: () => void;
31
+ request.result = new Promise((resolve, reject) => {
32
+ const abort = () => resolve(undefined);
33
+ signal.addEventListener("abort", abort, { once: true });
34
+ enqueue = () => {
35
+ const previous = tail;
36
+ tail = request.result!.catch(() => {});
37
+ previous.then(() => signal.aborted ? undefined : request.show(signal)).then(resolve, reject)
38
+ .finally(() => signal.removeEventListener("abort", abort));
39
+ };
40
+ });
41
+ if (request.afterStartup && !startupReady) waiting.push(enqueue);
42
+ else enqueue();
43
+ });
44
+ return () => {
45
+ controller.abort();
46
+ controller = new AbortController();
47
+ tail = Promise.resolve();
48
+ startupReady = false;
49
+ waiting = [];
50
+ };
51
+ }
52
+
53
+ /** MCP finishes registering startup prompts; the first turn is the fallback when MCP is not loaded. */
54
+ export function startupConsentReady(events: Pick<Events, "emit">): void {
55
+ events.emit(CHANNEL, { ready: true });
56
+ }
57
+
58
+ /** Without the owner (an extension loaded alone), retain the normal direct-dialog behavior. */
59
+ export function consentDialog<T>(events: Pick<Events, "emit">, show: (signal?: AbortSignal) => Promise<T>, afterStartup = false): Promise<T | undefined> {
60
+ const request: Request = { show, afterStartup };
61
+ events.emit(CHANNEL, request);
62
+ return (request.result ?? show()) as Promise<T | undefined>;
63
+ }
@@ -10,13 +10,17 @@
10
10
  * truth the user should read before approving anything this large).
11
11
  */
12
12
 
13
+ import { escapeControlText } from "./terminal-text.ts";
14
+
13
15
  const PER_ITEM_CAP = 2000;
14
16
  const TOTAL_CAP = 4000;
15
17
 
16
18
  export function boundConsentItems(items: string[], moreHint: string): string {
17
19
  const shown: string[] = [];
18
20
  let used = 0;
19
- for (const item of items) {
21
+ // Control characters are shown as visible escapes: an SGR conceal or a
22
+ // cursor move in a command could otherwise hide the part the user approves.
23
+ for (const item of items.map(escapeControlText)) {
20
24
  const capped = item.length > PER_ITEM_CAP ? `${item.slice(0, PER_ITEM_CAP)}… [truncated, ${item.length} chars]` : item;
21
25
  // Always show the first item (so an empty modal never happens); stop once
22
26
  // the budget is spent.
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Where One Code keeps the user's consent to a repository's own
3
+ * configuration (pure).
4
+ *
5
+ * Each store records that the user approved something a checkout ships, keyed
6
+ * by a hash the model can compute: its hooks, its `.mcp.json` servers, its
7
+ * allow rules and workspace directories, and the language servers that run
8
+ * its build. An entry is standing permission, so a write to a store is a
9
+ * gate-control write: the auto-mode safety floor stops it
10
+ * (`auto-mode/safety-floor.ts`), and a classifier that was talked around
11
+ * never gets to approve it. One home for the paths, so a new store cannot be
12
+ * left off the floor.
13
+ */
14
+
15
+ import { homedir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { oneCodeStateDir } from "./paths.ts";
18
+
19
+ /** Each consent store, relative to One Code's state dir. */
20
+ const CONSENT_STORES = {
21
+ hooks: ["hooks", "project-approvals.json"],
22
+ mcp: ["mcp", "project-approvals.json"],
23
+ projectAllow: ["permissions", "project-allow-approvals.json"],
24
+ lsp: ["lsp", "trusted-projects.json"],
25
+ } as const;
26
+
27
+ export type ConsentStore = keyof typeof CONSENT_STORES;
28
+
29
+ /** One consent store's file, under `ONECODE_STATE_DIR` when it is set. */
30
+ export function consentStorePath(store: ConsentStore, env: Record<string, string | undefined> = process.env, home: string = homedir()): string {
31
+ return join(oneCodeStateDir(env, home), ...CONSENT_STORES[store]);
32
+ }
33
+
34
+ /** Every consent store's file, for the safety floor. */
35
+ export function consentStorePaths(home: string, env: Record<string, string | undefined> = process.env): string[] {
36
+ return (Object.keys(CONSENT_STORES) as ConsentStore[]).map((store) => consentStorePath(store, env, home));
37
+ }
38
+
39
+ /**
40
+ * A consent store under any literal `.onecode` directory, as a forward-slashed
41
+ * path tail: the textual floor's counterpart of `consentStorePaths`, for a
42
+ * store in another home or spelled through a symlink the resolver missed.
43
+ */
44
+ export const CONSENT_STORE_TAIL = new RegExp(
45
+ `/\\.onecode/(${Object.values(CONSENT_STORES)
46
+ .map((parts) => parts.join("/").replace(/[.]/g, "\\."))
47
+ .join("|")})$`,
48
+ );
@@ -0,0 +1,97 @@
1
+ /**
2
+ * What claude-context's message-1 blocks tell, as ledger facts, and the notice
3
+ * for a resumed session whose workspace changed since (pure). The blocks are
4
+ * live state; an epoch records their fingerprints with its request, so the
5
+ * first request of a resumed process compares them with the live files and git
6
+ * status, and says what changed once. The historical blocks stay as sent.
7
+ */
8
+ import { buildClaudeMdBlock, type ContextFile } from "./claude-context.ts";
9
+ import type { ToldFact } from "./ledger/records.ts";
10
+ import { contentHash } from "./ledger/wire.ts";
11
+ import { toldBlockFact } from "./reminders.ts";
12
+
13
+ /** The told keys of the fingerprints (whole-text block facts) and of the compaction flag (a mode). */
14
+ export const FACT_KEYS = {
15
+ instructions: "context-facts:instructions",
16
+ memory: "context-facts:memory",
17
+ git: "context-facts:git",
18
+ date: "context-facts:date",
19
+ /** On when the epoch's blocks were taken at a compaction, not at the session's start. */
20
+ compaction: "context-facts:compaction",
21
+ } as const;
22
+
23
+ /** A told block's hash (`toldBlockFact`): for a string or null it is the sha256 of its JSON. */
24
+ const fingerprint = contentHash;
25
+
26
+ /** Fingerprints of only what the model was shown, not unshown file tails or filesystem mtimes. */
27
+ export interface ContextFingerprints {
28
+ instructions: string;
29
+ memory: string;
30
+ }
31
+
32
+ export function contextFingerprints(input: { contextFiles: ContextFile[]; memoryIndex: { path: string; content: string } | null }): ContextFingerprints {
33
+ return {
34
+ instructions: fingerprint(buildClaudeMdBlock({ contextFiles: input.contextFiles })),
35
+ memory: fingerprint(buildClaudeMdBlock({ contextFiles: [], memoryIndex: input.memoryIndex })),
36
+ };
37
+ }
38
+
39
+ export const gitFingerprint = (gitStatus: string | null): string => fingerprint(gitStatus);
40
+
41
+ /** The live workspace's fingerprints for the resumed-session check: the instructions, the memory index and, when a git snapshot is taken, the git status. */
42
+ export type LiveFingerprints = ContextFingerprints & { git?: string };
43
+
44
+ export function liveFingerprints(files: Parameters<typeof contextFingerprints>[0], gitStatus: string | null, withGit: boolean): LiveFingerprints {
45
+ return { ...contextFingerprints(files), ...(withGit ? { git: gitFingerprint(gitStatus) } : {}) };
46
+ }
47
+ export const dateFingerprint = (date: string): string => fingerprint(date);
48
+
49
+ /** The facts the instructions block tells. */
50
+ export function instructionFacts(prints: ContextFingerprints): ToldFact[] {
51
+ return [
52
+ { kind: "block", key: FACT_KEYS.instructions, hash: prints.instructions },
53
+ { kind: "block", key: FACT_KEYS.memory, hash: prints.memory },
54
+ ];
55
+ }
56
+
57
+ /** The facts the context block tells: its git snapshot, and whether a compaction took it. */
58
+ export function contextBlockFacts(gitStatus: string | null, atCompaction: boolean): ToldFact[] {
59
+ return [
60
+ toldBlockFact(FACT_KEYS.git, gitStatus),
61
+ { kind: "mode", key: FACT_KEYS.compaction, on: atCompaction },
62
+ ];
63
+ }
64
+
65
+ /** A refreshed git snapshot must not describe itself as the conversation's initial status. */
66
+ export function compactionGitStatus(text: string | null): string | null {
67
+ return text?.replace("This is the git status at the start of the conversation.", "This is the git status at the latest compaction.") ?? null;
68
+ }
69
+
70
+ /**
71
+ * One short factual notice when the live workspace differs from what the
72
+ * epoch's blocks told, and the facts that bring the told state up to date.
73
+ * Undefined when nothing the epoch told has changed, or the epoch told none
74
+ * of it (its blocks predate the facts).
75
+ */
76
+ export function resumeFactsNotice(
77
+ told: ReadonlyMap<string, string>,
78
+ atCompaction: boolean,
79
+ live: ContextFingerprints & { git?: string },
80
+ ): { text: string; facts: ToldFact[] } | undefined {
81
+ const changed: string[] = [];
82
+ const facts: ToldFact[] = [];
83
+ const compare = (key: string, hash: string | undefined, what: string) => {
84
+ const before = told.get(key);
85
+ if (hash === undefined || before === undefined || before === hash) return;
86
+ changed.push(what);
87
+ facts.push({ kind: "block", key, hash });
88
+ };
89
+ compare(FACT_KEYS.git, live.git, "git status changed");
90
+ compare(FACT_KEYS.memory, live.memory, "the memory index changed");
91
+ compare(FACT_KEYS.instructions, live.instructions, "CLAUDE.md-family instructions changed");
92
+ if (changed.length === 0) return undefined;
93
+ return {
94
+ text: `Since the saved context snapshot, ${changed.join("; ")}. The earlier context block reflects ${atCompaction ? "the latest compaction" : "the session's start"}, not the current workspace. Read the current files or run git status if needed.`,
95
+ facts,
96
+ };
97
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The whole conversation each request covers, as pi built it, for compaction's
3
+ * summarizer. (btw's and recap's standalone fallbacks read the current branch
4
+ * at call time instead: lib/side-call.ts `branchMessages`.) Inside an epoch
5
+ * the ledger (extensions/ledger) cuts a request to its tail before every later
6
+ * `context` hook, so the full list comes with the request's plan instead.
7
+ */
8
+
9
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
10
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
11
+ import { LEDGER_PLAN_CHANNEL, type RequestPlan } from "./ledger/plan.ts";
12
+
13
+ /** Call `onRequest` at each request's `context` pass with every message the request covers. */
14
+ export function followCoveredMessages(pi: ExtensionAPI, onRequest: (messages: AgentMessage[], ctx: ExtensionContext) => void): void {
15
+ let planned: readonly AgentMessage[] | undefined;
16
+ pi.events.on(LEDGER_PLAN_CHANNEL, (data) => {
17
+ planned = (data as RequestPlan).messages as readonly AgentMessage[];
18
+ });
19
+ pi.on("context", (event, ctx) => {
20
+ onRequest([...(planned ?? event.messages)], ctx);
21
+ planned = undefined;
22
+ });
23
+ }