one-code-extension 0.4.1 → 0.5.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 (419) 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 +32 -23
  7. package/docs/guide/doctor.md +20 -13
  8. package/docs/guide/hooks.md +18 -3
  9. package/docs/guide/installation.md +27 -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 +123 -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 +515 -0
  56. package/extensions/background/index.ts +514 -236
  57. package/extensions/background/loop-fire.ts +136 -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 +52 -0
  63. package/extensions/background/wakeup.ts +159 -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 +88 -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 +229 -71
  77. package/extensions/btw/panel.ts +228 -100
  78. package/extensions/btw/prompt.ts +41 -4
  79. package/extensions/claude-compat/index.ts +7 -11
  80. package/extensions/claude-context/index.ts +446 -58
  81. package/extensions/compaction/cut.ts +157 -0
  82. package/extensions/compaction/index.ts +216 -75
  83. package/extensions/compaction/kept-thinking.ts +62 -0
  84. package/extensions/compaction/prompt.ts +15 -12
  85. package/extensions/context-budget/index.ts +24 -5
  86. package/extensions/context-management/index.ts +25 -0
  87. package/extensions/doctor/build.ts +59 -8
  88. package/extensions/doctor/builtins.ts +84 -0
  89. package/extensions/doctor/cli.ts +7 -1
  90. package/extensions/doctor/compat.ts +88 -23
  91. package/extensions/doctor/dependencies.ts +41 -5
  92. package/extensions/doctor/fix-prompt.ts +9 -2
  93. package/extensions/doctor/index.ts +102 -58
  94. package/extensions/doctor/models.ts +102 -63
  95. package/extensions/doctor/presets.ts +42 -27
  96. package/extensions/doctor/report.ts +19 -2
  97. package/extensions/doctor/viewer.ts +49 -27
  98. package/extensions/effort/index.ts +72 -19
  99. package/extensions/effort/settings.ts +21 -0
  100. package/extensions/effort/slider.ts +24 -20
  101. package/extensions/exit/index.ts +32 -1
  102. package/extensions/file-tracker/index.ts +337 -26
  103. package/extensions/file-tracker/replay.ts +96 -10
  104. package/extensions/file-tracker/restore.ts +63 -0
  105. package/extensions/file-tracker/results.ts +66 -0
  106. package/extensions/file-tracker/shell-reads.ts +211 -0
  107. package/extensions/file-tracker/tracker.ts +32 -15
  108. package/extensions/footer/footer-line.ts +45 -24
  109. package/extensions/footer/index.ts +47 -2
  110. package/extensions/footer/pr.ts +34 -5
  111. package/extensions/hooks/compaction.ts +7 -0
  112. package/extensions/hooks/executor.ts +32 -30
  113. package/extensions/hooks/index.ts +198 -31
  114. package/extensions/hooks/matcher.ts +3 -0
  115. package/extensions/hooks/protocol.ts +41 -3
  116. package/extensions/hooks/settings.ts +50 -19
  117. package/extensions/hooks/subagent-bridge.ts +2 -0
  118. package/extensions/hooks/trust.ts +13 -5
  119. package/extensions/idle-compact/index.ts +119 -0
  120. package/extensions/idle-compact/policy.ts +143 -0
  121. package/extensions/init/index.ts +11 -10
  122. package/extensions/init/prompt.ts +25 -32
  123. package/extensions/interrupted/index.ts +13 -1
  124. package/extensions/kept-thinking/index.ts +27 -0
  125. package/extensions/lib/agent-cron.ts +130 -0
  126. package/extensions/lib/agent-loader.ts +15 -1
  127. package/extensions/lib/agent-view.ts +85 -0
  128. package/extensions/lib/anthropic-payload.ts +82 -1
  129. package/extensions/lib/anthropic-server-call.ts +230 -0
  130. package/extensions/lib/anthropic-server-tools.ts +485 -0
  131. package/extensions/lib/app-launch.mjs +94 -0
  132. package/extensions/lib/argument-hints.ts +190 -0
  133. package/extensions/lib/atomic-write.ts +6 -2
  134. package/extensions/lib/auto-memory.ts +75 -0
  135. package/extensions/lib/bash-parser.ts +84 -0
  136. package/extensions/lib/btw-fork.ts +93 -0
  137. package/extensions/lib/child-extensions.ts +42 -0
  138. package/extensions/lib/child-writes.ts +45 -0
  139. package/extensions/lib/claude-context.ts +515 -100
  140. package/extensions/lib/claude-external-includes.ts +68 -0
  141. package/extensions/lib/claude-id.ts +22 -0
  142. package/extensions/lib/claude-rules.ts +323 -0
  143. package/extensions/lib/claude-settings.ts +76 -4
  144. package/extensions/lib/compaction-boundary.ts +36 -0
  145. package/extensions/lib/compaction-keep.mjs +83 -0
  146. package/extensions/lib/config-mode.ts +112 -0
  147. package/extensions/lib/consent-dialogs.ts +63 -0
  148. package/extensions/lib/consent-preview.ts +5 -1
  149. package/extensions/lib/consent-stores.ts +48 -0
  150. package/extensions/lib/context-facts.ts +78 -0
  151. package/extensions/lib/context-stack.ts +81 -0
  152. package/extensions/lib/deferred.ts +219 -25
  153. package/extensions/lib/dock-rows.ts +60 -0
  154. package/extensions/lib/empty-tool-result.ts +27 -0
  155. package/extensions/lib/environment-block.ts +76 -0
  156. package/extensions/lib/fetch-timeout.ts +24 -6
  157. package/extensions/{system-prompt → lib}/git-status.ts +51 -13
  158. package/extensions/lib/git.ts +75 -13
  159. package/extensions/lib/grammars/LICENSE-tree-sitter-bash +21 -0
  160. package/extensions/lib/grammars/README.md +2 -0
  161. package/extensions/lib/grammars/tree-sitter-bash.wasm +0 -0
  162. package/extensions/lib/guide-docs.ts +45 -0
  163. package/extensions/lib/headless-output.ts +46 -0
  164. package/extensions/lib/hook-gate.ts +7 -7
  165. package/extensions/lib/interrupt.ts +20 -4
  166. package/extensions/lib/key-input.ts +455 -0
  167. package/extensions/lib/keys.ts +14 -1
  168. package/extensions/lib/local-command.ts +47 -13
  169. package/extensions/lib/mcp-overrides.ts +1 -1
  170. package/extensions/lib/mcp-share.ts +46 -0
  171. package/extensions/lib/memory-content.ts +146 -0
  172. package/extensions/lib/memory-index.ts +18 -0
  173. package/extensions/lib/memory.ts +134 -123
  174. package/extensions/lib/model-catalog/huggingface.json +174 -0
  175. package/extensions/lib/model-catalog/models-dev.json +18297 -0
  176. package/extensions/lib/model-catalog/openrouter.json +5252 -0
  177. package/extensions/lib/model-catalog-data.ts +513 -0
  178. package/extensions/lib/model-catalog.ts +462 -0
  179. package/extensions/lib/model-choice-warnings.ts +137 -0
  180. package/extensions/lib/model-pairings.ts +152 -0
  181. package/extensions/{auto-mode → lib}/model-picker.ts +26 -43
  182. package/extensions/lib/model-policy.ts +112 -15
  183. package/extensions/lib/model-tier.ts +283 -355
  184. package/extensions/lib/model-unusable.ts +1 -1
  185. package/extensions/lib/newer-model.ts +100 -0
  186. package/extensions/lib/notices.ts +87 -0
  187. package/extensions/lib/notifications.ts +308 -64
  188. package/extensions/lib/one-code-settings.ts +74 -8
  189. package/extensions/lib/open-browser.ts +63 -0
  190. package/extensions/lib/openrouter-generation.ts +94 -0
  191. package/extensions/lib/operation-deadline.ts +30 -0
  192. package/extensions/lib/original-command.ts +4 -4
  193. package/extensions/lib/package-version.ts +1 -1
  194. package/extensions/lib/panel-focus.ts +134 -0
  195. package/extensions/lib/paths.ts +17 -2
  196. package/extensions/lib/permission-gate.ts +72 -6
  197. package/extensions/lib/persisted-output.ts +60 -8
  198. package/extensions/lib/pi-ai-estimate.ts +19 -3
  199. package/extensions/lib/pi-version.ts +21 -2
  200. package/extensions/lib/plan-mode-channels.ts +20 -5
  201. package/extensions/lib/plugins.ts +26 -17
  202. package/extensions/lib/powershell-parse-script.ts +208 -0
  203. package/extensions/lib/powershell-parser.ts +344 -0
  204. package/extensions/lib/process-tree.ts +131 -8
  205. package/extensions/lib/prompt-options.ts +82 -0
  206. package/extensions/lib/queued-delivery.ts +44 -0
  207. package/extensions/lib/reminders.ts +364 -58
  208. package/extensions/lib/replaced-builtins.mjs +199 -0
  209. package/extensions/lib/replay-call.ts +70 -0
  210. package/extensions/lib/request-replay.ts +439 -0
  211. package/extensions/lib/scratchpad.ts +81 -14
  212. package/extensions/lib/send-now-channel.ts +7 -0
  213. package/extensions/lib/session-model-tier.ts +51 -0
  214. package/extensions/lib/session-work.ts +64 -0
  215. package/extensions/lib/settings-channels.ts +4 -4
  216. package/extensions/lib/shell-exit-semantics.ts +170 -0
  217. package/extensions/lib/shell-quote.ts +11 -0
  218. package/extensions/lib/shell-result.ts +70 -0
  219. package/extensions/lib/shell-spawn.ts +70 -6
  220. package/extensions/lib/shell-tool.ts +75 -25
  221. package/extensions/lib/side-call-cache.ts +124 -0
  222. package/extensions/lib/side-call-run.ts +96 -0
  223. package/extensions/lib/side-call-usage.ts +38 -0
  224. package/extensions/lib/side-call.ts +13 -1
  225. package/extensions/lib/single-flight.ts +18 -0
  226. package/extensions/lib/skill-body.ts +42 -0
  227. package/extensions/lib/skill-scan.ts +63 -24
  228. package/extensions/lib/spill-file.ts +140 -0
  229. package/extensions/lib/subagent-handback.ts +113 -0
  230. package/extensions/lib/system-role.ts +156 -0
  231. package/extensions/lib/terminal-text.ts +114 -0
  232. package/extensions/lib/text-width.ts +47 -16
  233. package/extensions/lib/timer-ops.ts +20 -0
  234. package/extensions/lib/tool-additions.ts +149 -0
  235. package/extensions/lib/tool-call-corruption.ts +134 -0
  236. package/extensions/lib/tool-path.ts +66 -0
  237. package/extensions/lib/tool-variants.ts +69 -0
  238. package/extensions/lib/tui-render.ts +255 -27
  239. package/extensions/lib/turn-budget-layout.ts +143 -0
  240. package/extensions/lib/update-check.mjs +15 -2
  241. package/extensions/lib/usage-bus.ts +1 -1
  242. package/extensions/lib/user-denial.ts +38 -0
  243. package/extensions/lib/workspace-channel.ts +16 -0
  244. package/extensions/lib/worktree-channel.ts +31 -3
  245. package/extensions/lib/worktree-isolation.ts +40 -10
  246. package/extensions/lsp/client.ts +8 -9
  247. package/extensions/lsp/index.ts +70 -4
  248. package/extensions/lsp/keep-alive.ts +1 -1
  249. package/extensions/lsp/trust.ts +119 -0
  250. package/extensions/lsp/watcher.ts +1 -1
  251. package/extensions/mcp/announce.ts +87 -5
  252. package/extensions/mcp/client.ts +161 -48
  253. package/extensions/mcp/config.ts +132 -8
  254. package/extensions/mcp/discovery.ts +19 -0
  255. package/extensions/mcp/index.ts +209 -71
  256. package/extensions/mcp/oauth/browser.ts +38 -17
  257. package/extensions/mcp/oauth/flow.ts +25 -17
  258. package/extensions/mcp/oauth/provider.ts +14 -8
  259. package/extensions/mcp/oauth/store.ts +34 -16
  260. package/extensions/mcp/panel/keys.ts +12 -11
  261. package/extensions/mcp/panel/render.ts +9 -6
  262. package/extensions/mcp/schema.ts +104 -5
  263. package/extensions/mcp/trust.ts +151 -67
  264. package/extensions/memory/entries.ts +23 -14
  265. package/extensions/memory/index.ts +134 -28
  266. package/extensions/memory/open-external.ts +33 -18
  267. package/extensions/memory/panel.ts +135 -26
  268. package/extensions/newer-model/index.ts +31 -0
  269. package/extensions/notebook/description.ts +18 -0
  270. package/extensions/notebook/index.ts +6 -5
  271. package/extensions/notebook/notebook.ts +1 -1
  272. package/extensions/permissions/index.ts +1300 -381
  273. package/extensions/permissions/matcher.ts +425 -74
  274. package/extensions/permissions/modes.ts +6 -4
  275. package/extensions/permissions/panel/host.ts +130 -0
  276. package/extensions/permissions/panel/keys.ts +48 -0
  277. package/extensions/permissions/panel/render.ts +450 -0
  278. package/extensions/permissions/panel/state.ts +550 -0
  279. package/extensions/permissions/powershell-cmdlets.ts +198 -0
  280. package/extensions/permissions/powershell-paths.ts +197 -0
  281. package/extensions/permissions/powershell-rules.ts +207 -280
  282. package/extensions/permissions/powershell-tree.ts +557 -0
  283. package/extensions/permissions/project-trust.ts +27 -11
  284. package/extensions/permissions/protected-paths.ts +14 -2
  285. package/extensions/permissions/session-grant.ts +6 -0
  286. package/extensions/permissions/settings.ts +166 -31
  287. package/extensions/permissions/subagent-gate.ts +25 -0
  288. package/extensions/permissions/workspace.ts +78 -0
  289. package/extensions/plan-mode/index.ts +156 -69
  290. package/extensions/plan-mode/reminder.ts +89 -21
  291. package/extensions/plan-mode/texts.ts +177 -0
  292. package/extensions/plan-mode/viewer.ts +92 -27
  293. package/extensions/plugins/counts.ts +3 -3
  294. package/extensions/plugins/index.ts +61 -46
  295. package/extensions/plugins/install/install.ts +16 -0
  296. package/extensions/plugins/marketplace/sync.ts +9 -3
  297. package/extensions/plugins/marketplace/types.ts +3 -1
  298. package/extensions/plugins/panel/keys.ts +21 -24
  299. package/extensions/plugins/panel/render.ts +12 -6
  300. package/extensions/plugins/shell-expand.ts +107 -0
  301. package/extensions/plugins/template.ts +32 -15
  302. package/extensions/powershell/child.ts +7 -0
  303. package/extensions/powershell/description.ts +38 -6
  304. package/extensions/powershell/guards.ts +1 -1
  305. package/extensions/powershell/index.ts +12 -7
  306. package/extensions/recap/index.ts +65 -60
  307. package/extensions/recap/prompt.ts +2 -2
  308. package/extensions/recap/scheduler.ts +3 -5
  309. package/extensions/search-tools/grep-merge.ts +39 -0
  310. package/extensions/search-tools/index.ts +0 -0
  311. package/extensions/send-now/chord.ts +62 -0
  312. package/extensions/send-now/index.ts +133 -0
  313. package/extensions/session-title/index.ts +3 -0
  314. package/extensions/session-title/title.ts +4 -1
  315. package/extensions/skill/code-review.ts +97 -0
  316. package/extensions/skill/index.ts +421 -101
  317. package/extensions/skill/invoke.ts +128 -18
  318. package/extensions/skill/listing.ts +133 -9
  319. package/extensions/skill/panel/keys.ts +15 -16
  320. package/extensions/skill/panel/render.ts +5 -2
  321. package/extensions/skill/panel/state.ts +12 -1
  322. package/extensions/subagents/agent-args.ts +39 -0
  323. package/extensions/subagents/agent-description.ts +132 -0
  324. package/extensions/subagents/agents.ts +116 -23
  325. package/extensions/subagents/announce.ts +69 -0
  326. package/extensions/subagents/default-model.ts +2 -3
  327. package/extensions/subagents/delegation-steer.ts +4 -4
  328. package/extensions/subagents/fork-cache.ts +76 -0
  329. package/extensions/subagents/guide-agent.ts +189 -0
  330. package/extensions/subagents/hand-back-review.ts +3 -0
  331. package/extensions/subagents/index.ts +1493 -824
  332. package/extensions/subagents/live-runs.ts +26 -6
  333. package/extensions/subagents/model-select.ts +38 -25
  334. package/extensions/subagents/outcome.ts +2 -2
  335. package/extensions/subagents/panel-keys.ts +73 -31
  336. package/extensions/subagents/panel-render.ts +120 -96
  337. package/extensions/subagents/panel-widget.ts +60 -89
  338. package/extensions/subagents/runner.ts +108 -80
  339. package/extensions/subagents/runs.ts +39 -5
  340. package/extensions/subagents/send-to-main-tool.ts +1 -1
  341. package/extensions/subagents/session-turns.ts +32 -8
  342. package/extensions/subagents/shell-panel.ts +36 -178
  343. package/extensions/subagents/tasks-dialog.ts +170 -0
  344. package/extensions/subagents/viewport-mirror.ts +95 -0
  345. package/extensions/subagents/worktree.ts +57 -13
  346. package/extensions/system-prompt/environment.ts +19 -19
  347. package/extensions/system-prompt/idle-turn.ts +65 -0
  348. package/extensions/system-prompt/index.ts +131 -47
  349. package/extensions/system-prompt/template.ts +24 -50
  350. package/extensions/system-prompt/tiers/common.ts +23 -64
  351. package/extensions/system-prompt/tiers/frontier.ts +32 -11
  352. package/extensions/system-prompt/tiers/low.ts +67 -45
  353. package/extensions/system-prompt/tiers/mid.ts +96 -38
  354. package/extensions/system-reminder/index.ts +175 -13
  355. package/extensions/tasks/descriptions.ts +190 -0
  356. package/extensions/tasks/index.ts +120 -41
  357. package/extensions/tasks/store.ts +83 -16
  358. package/extensions/tool-call-corruption/child.ts +7 -0
  359. package/extensions/tool-call-corruption/index.ts +237 -0
  360. package/extensions/tool-search/announce.ts +16 -0
  361. package/extensions/tool-search/index.ts +189 -41
  362. package/extensions/tool-style/index.ts +68 -10
  363. package/extensions/tool-style/write-description.ts +40 -0
  364. package/extensions/tool-style/write-render.ts +237 -0
  365. package/extensions/turn-duration/index.ts +7 -3
  366. package/extensions/turn-duration/line.ts +47 -4
  367. package/extensions/web/backends.ts +6 -9
  368. package/extensions/web/description.ts +50 -0
  369. package/extensions/web/index.ts +118 -53
  370. package/extensions/web/native-call.ts +15 -0
  371. package/extensions/web/native-results.ts +41 -0
  372. package/extensions/web-fetch/description.ts +42 -0
  373. package/extensions/web-fetch/extract.ts +53 -6
  374. package/extensions/web-fetch/index.ts +125 -76
  375. package/extensions/web-fetch/page-content.ts +19 -0
  376. package/extensions/web-fetch/response.ts +49 -0
  377. package/extensions/web-fetch/summarize.ts +9 -10
  378. package/extensions/workflow/agent-session.ts +105 -18
  379. package/extensions/workflow/args.ts +24 -0
  380. package/extensions/workflow/description.ts +67 -0
  381. package/extensions/workflow/globals.ts +17 -3
  382. package/extensions/workflow/index.ts +145 -162
  383. package/extensions/workflow/records.ts +1 -0
  384. package/extensions/workflow/run-manager.ts +29 -6
  385. package/extensions/workflow/saved-workflows.ts +3 -2
  386. package/extensions/workflow/types.ts +22 -1
  387. package/extensions/workflow/viewer.ts +54 -24
  388. package/extensions/workflow/widget.ts +20 -0
  389. package/extensions/worktree/descriptions.ts +91 -0
  390. package/extensions/worktree/guards.ts +316 -54
  391. package/extensions/worktree/index.ts +121 -39
  392. package/extensions/worktree/powershell-guards.ts +167 -0
  393. package/extensions/worktree/rewrite.ts +14 -16
  394. package/package.json +18 -7
  395. package/skills/artifact-design/SKILL.md +85 -0
  396. package/skills/code-review/SKILL.md +20 -20
  397. package/skills/code-review/cells/arguments-and-flags.md +19 -0
  398. package/skills/code-review/cells/high-3x5-recall-verify.md +137 -0
  399. package/skills/code-review/cells/high-8-inline.md +122 -0
  400. package/skills/code-review/cells/low-1-pass-max4.md +27 -0
  401. package/skills/code-review/cells/low-1-pass-min-files-4.md +28 -0
  402. package/skills/code-review/cells/max-5x5-verify-sweep.md +162 -0
  403. package/skills/code-review/cells/medium-3x5-verify.md +132 -0
  404. package/skills/code-review/cells/minimal-prompt.md +32 -0
  405. package/skills/code-review/cells/xhigh-10-inline-sweep.md +149 -0
  406. package/skills/code-review/cells/xhigh-5x5-verify-sweep.md +162 -0
  407. package/skills/fewer-permission-prompts/SKILL.md +1 -1
  408. package/skills/loop/SKILL.md +11 -0
  409. package/skills/security-review/SKILL.md +2 -5
  410. package/skills/simplify/SKILL.md +7 -5
  411. package/skills/workflow-authoring/SKILL.md +143 -0
  412. package/themes/onecode-light.json +1 -1
  413. package/themes/onecode.json +1 -1
  414. package/types/app.d.ts +58 -0
  415. package/types/community-packages.d.ts +26 -1
  416. package/extensions/auto-mode/recoverability.ts +0 -229
  417. package/extensions/lib/capability-index.ts +0 -466
  418. package/extensions/lib/model-facts.generated.json +0 -2675
  419. package/extensions/lib/model-facts.ts +0 -162
@@ -11,7 +11,9 @@
11
11
  */
12
12
 
13
13
  import { basename } from "node:path";
14
+ import { unwrapUserMessage } from "../lib/agent-view.ts";
14
15
  import { cutPlainText, firstNonEmptyLine } from "../lib/tui-render.ts";
16
+ import { sanitizeDisplayText } from "../lib/terminal-text.ts";
15
17
  import { normalizeToolName } from "../permissions/matcher.ts";
16
18
  import { emptyUsage, sumUsage, type UsageTotals } from "./usage.ts";
17
19
 
@@ -22,7 +24,7 @@ export type FinishOutcome = boolean | "stopped";
22
24
 
23
25
  /** One rendered block of a child's transcript, mirroring the main-session marks. */
24
26
  export interface TranscriptBlock {
25
- kind: "task" | "text" | "call" | "result";
27
+ kind: "task" | "text" | "call" | "result" | "user";
26
28
  /** For a call: the tool name; for a result: the tool it belongs to. */
27
29
  tool?: string;
28
30
  /** Rendered short content (args summary, result summary, or assistant text). */
@@ -79,6 +81,8 @@ export interface LiveRun {
79
81
  parentTaskId?: string;
80
82
  /** Nesting level: 0 = spawned by main, 1 = spawned by a child (CC's `└` rows). */
81
83
  depth: number;
84
+ /** The user opened this run's view: `/tasks` then lists it under Completed (findings §40). */
85
+ viewed?: boolean;
82
86
  }
83
87
 
84
88
  /** Keep memory bounded for long/chatty children; the viewer scrolls the tail. */
@@ -129,6 +133,8 @@ export function deriveActivity(toolName: string | undefined, args: unknown, last
129
133
  export interface RegisterInput {
130
134
  taskId: string;
131
135
  name: string;
136
+ /** Claude Code's `description` (AgentRunRecord.description): the row and chip label when set. */
137
+ description?: string;
132
138
  agentType: string;
133
139
  model?: string;
134
140
  thinking?: string;
@@ -163,20 +169,22 @@ export class LiveRunRegistry {
163
169
  }
164
170
 
165
171
  register(input: RegisterInput): void {
172
+ // Display state only: the prompt reaches the terminal, so its control characters go.
173
+ const task = sanitizeDisplayText(input.task);
166
174
  const run: LiveRun = {
167
175
  taskId: input.taskId,
168
176
  name: input.name,
169
177
  agentType: input.agentType,
170
178
  model: input.model,
171
179
  thinking: input.thinking,
172
- label: deriveLabel(input.task, input.name),
180
+ label: input.description ? cutPlainText(sanitizeDisplayText(input.description), 60) : deriveLabel(task, input.name),
173
181
  status: "running",
174
182
  startedAt: input.startedAt,
175
183
  toolCalls: 0,
176
184
  tokens: emptyUsage(),
177
185
  activity: "Starting…",
178
186
  // The child's prompt opens the transcript, like Claude Code's viewer.
179
- blocks: input.task.trim() ? [{ kind: "task", text: input.task }] : [],
187
+ blocks: task.trim() ? [{ kind: "task", text: task }] : [],
180
188
  baseToolCalls: 0,
181
189
  baseTokens: emptyUsage(),
182
190
  parentTaskId: input.parentTaskId,
@@ -203,7 +211,10 @@ export class LiveRunRegistry {
203
211
  // stats() keeps them instead of regressing the displayed cost.
204
212
  run.baseToolCalls = run.toolCalls;
205
213
  run.baseTokens = { ...run.tokens };
206
- if (task.trim()) this.block(taskId, { kind: "task", text: task });
214
+ // A message the user typed in the agent's view is its `❯` row, not a task.
215
+ const typed = unwrapUserMessage(task);
216
+ if (typed !== undefined) this.block(taskId, { kind: "user", text: typed });
217
+ else if (task.trim()) this.block(taskId, { kind: "task", text: task });
207
218
  this.changed(taskId);
208
219
  return true;
209
220
  }
@@ -229,7 +240,7 @@ export class LiveRunRegistry {
229
240
  setActivity(taskId: string, activity: string): void {
230
241
  const run = this.byId.get(taskId);
231
242
  if (!run) return;
232
- run.activity = activity;
243
+ run.activity = sanitizeDisplayText(activity);
233
244
  this.wake(run);
234
245
  this.changed(taskId);
235
246
  }
@@ -238,11 +249,20 @@ export class LiveRunRegistry {
238
249
  block(taskId: string, block: TranscriptBlock): void {
239
250
  const run = this.byId.get(taskId);
240
251
  if (!run) return;
241
- run.blocks.push(block);
252
+ // Display state only: the text reaches the terminal, so its control characters go.
253
+ run.blocks.push({ ...block, text: sanitizeDisplayText(block.text) });
242
254
  if (run.blocks.length > MAX_BLOCKS) run.blocks.splice(0, run.blocks.length - MAX_BLOCKS);
243
255
  this.changed(taskId);
244
256
  }
245
257
 
258
+ /** The user opened this run's view (it joins `/tasks`' Completed list once settled). */
259
+ markViewed(taskId: string): void {
260
+ const run = this.byId.get(taskId);
261
+ if (!run || run.viewed) return;
262
+ run.viewed = true;
263
+ this.changed(taskId);
264
+ }
265
+
246
266
  /** The in-flight assistant message (or undefined at message_end). O(1) per delta. */
247
267
  setStreaming(taskId: string, message: StreamingMessage | undefined): void {
248
268
  const run = this.byId.get(taskId);
@@ -33,8 +33,8 @@
33
33
  * same-provider profile serves instead.
34
34
  * - A configured default or agent-file model that cannot resolve degrades, with
35
35
  * a notice naming the knob, to the automatic same-provider pick — the
36
- * cheapest contained model at the session's capability floor, the SAME floor
37
- * the auto-mode classifier applies (`capableContainedCandidates`) — and only
36
+ * cheapest contained model in the session's tier or above, the SAME rule
37
+ * the auto-mode classifier applies (`sameTierContainedCandidates`) — and only
38
38
  * then to the session model. Only an explicit `inherit` names the session
39
39
  * model outright. A bad *per-call* request first falls through to the agent's
40
40
  * own model and the configured default (running the subagent on its intended
@@ -61,7 +61,8 @@ import {
61
61
  pricedInput,
62
62
  supportsImageInput,
63
63
  } from "../lib/model-policy.ts";
64
- import { atLeastTier, capableContainedCandidates, economicalContainedCandidates, intrinsicTier, type PromptTier } from "../lib/model-tier.ts";
64
+ import { pairedModel } from "../lib/model-pairings.ts";
65
+ import { atLeastTier, economicalContainedCandidates, intrinsicTier, type PromptTier, sameTierContainedCandidates } from "../lib/model-tier.ts";
65
66
 
66
67
  /**
67
68
  * Cross-extension channel carrying the resolved default subagent model, so the
@@ -135,7 +136,7 @@ export interface ResolveInput {
135
136
  * upgraded with a notice (a standing setting or agent-file model). The
136
137
  * `/subagent` set command leaves this false — a saved default may be meant for
137
138
  * another (text) session, and is gated at spawn instead. See
138
- * `docs/decisions/model-policy.md`.
139
+ * `working-docs/decisions/model-policy.md`.
139
140
  */
140
141
  requireImageInput?: boolean;
141
142
  }
@@ -206,7 +207,7 @@ interface AliasResolution {
206
207
  * Resolve a Claude Code alias within the session's provider family: by name
207
208
  * first (preferring undated alias ids, then the newest id), else as the tier
208
209
  * the alias names — the cheapest contained model at or above it
209
- * (`economicalContainedCandidates` order: never tiny, prior-generation or
210
+ * (`economicalContainedCandidates` order: never tiny, superseded or
210
211
  * tool-less; cheap → workhorse → frontier, then price), `frontier` meaning the
211
212
  * session model itself, the strongest model the user chose on this provider.
212
213
  * Never off-family: "sonnet" on a Codex session is the cheapest workhorse-class
@@ -236,9 +237,6 @@ function resolveAlias(
236
237
  const tier = ALIAS_TIER[alias];
237
238
  // The session model carries the caller's own modality, so frontier is always safe.
238
239
  if (tier === "frontier") return { model: sessionModel, how: "tier" };
239
- // Name-class only, deliberately: an explicit alias asks for a *class* of model,
240
- // so a measured pass (which lets a strong flash serve the automatic default)
241
- // does not lift a lean-named model into "sonnet" here.
242
240
  const byTier = economicalContainedCandidates(available, sessionModel, contained, requireImageInput).find((model) => atLeastTier(intrinsicTier(model), tier));
243
241
  return byTier ? { model: byTier, how: "tier" } : undefined;
244
242
  }
@@ -398,23 +396,26 @@ export function resolveSubagentModel(input: ResolveInput): SubagentModelResoluti
398
396
  // Automatic selection is a cost optimisation, so it needs price evidence:
399
397
  // with the session price unknown there is no demonstrable saving, and picking
400
398
  // a cheap-tier model could silently *upgrade* an (unpriced) cheap session. The
401
- // floor-gated selector — the cheapest same-provider model at the session's
402
- // capability floor (workhorse-or-better for a workhorse-or-better session,
403
- // Claude Code's min(main, sonnet); never `tiny`) — is the SAME one the
404
- // auto-mode classifier uses, so a session screens and delegates on one
405
- // model. A delegated worker writes code and calls tools for many turns; a
406
- // weaker one spends the saving on retries (2026-09-11 — before, subagents
407
- // took the cheapest capable model with no floor). It excludes unpriced/opaque
408
- // providers by construction, which subsumes the old dynamic-selection gate;
409
- // those degrade to the session model below.
399
+ // selector — the cheapest same-provider model in the session's tier or above
400
+ // (never `tiny`) — is the SAME rule the auto-mode classifier uses. A
401
+ // delegated worker writes code and calls tools for many turns; a weaker one
402
+ // spends the saving on retries. It excludes unpriced and uncatalogued
403
+ // models by construction; those sessions degrade to the session model below.
410
404
  if (sessionModel && !suppressAutomatic) {
411
- // `strict` requires a genuinely cheaper model and yields nothing when the
412
- // session price is unknown, so a cheap-tier pick never silently upgrades an
413
- // unpriced session. Reuse the `contained` set computed above for the hot path.
414
- // With an Artificial Analysis snapshot (lib/capability-index.ts) the floor
415
- // is measured — coding index ≥ min(session, Sonnet 5), no tolerance —
416
- // and passers rank by price; unscored candidates are judged by name-class tier.
417
- const cheaper = capableContainedCandidates(available, sessionModel, "subagent", { strict: true, contained, requireImageInput })[0];
405
+ // The pairing table speaks first for the models it names
406
+ // (lib/model-pairings.ts): a measured smaller model of the session's
407
+ // vendor, never dearer than the session where both are priced. Reuse the
408
+ // `contained` set computed above for the hot path.
409
+ const paired = pairedModel("subagent", available, sessionModel, { contained, requireImageInput });
410
+ if (paired?.kind === "session") return { model: sessionModel, source: "session", notices };
411
+ if (paired) return { model: paired.model, source: "automatic", notices };
412
+ // Otherwise the candidates are always strictly cheaper than the session
413
+ // model, and there are none when the session price is unknown, so a
414
+ // cheap-tier pick never silently upgrades an unpriced session.
415
+ // Experimental builds are never auto-selectable (model-tier.ts
416
+ // isAutoSelectable); a moving alias stays allowed here (Mistral serves
417
+ // most models only as `-latest`).
418
+ const cheaper = sameTierContainedCandidates(available, sessionModel, { contained, requireImageInput })[0];
418
419
  if (cheaper) return { model: cheaper, source: "automatic", notices };
419
420
  }
420
421
 
@@ -427,7 +428,7 @@ export function resolveSubagentModel(input: ResolveInput): SubagentModelResoluti
427
428
  * gated: the per-call `model` field is the one input the main model chooses for
428
429
  * itself. User knobs (setting, env var, agent files the user installed,
429
430
  * "inherit") are never gated — naming a model is choosing it — and the
430
- * automatic default can only ever pick cheaper. With either price unknown the
431
+ * automatic default never picks a dearer model. With either price unknown the
431
432
  * gate stays open: a gate that fails closed on an unpriced catalog blocks the
432
433
  * feature outright.
433
434
  *
@@ -567,6 +568,18 @@ export function settingOverrideNotice({ sessionModel, defaultModel, defaultSourc
567
568
  );
568
569
  }
569
570
 
571
+ /**
572
+ * The one-shot that corrects the menu once message 1 is frozen: a model this
573
+ * account refused, and the subagent default it leaves (undefined: the
574
+ * session's own model).
575
+ */
576
+ export function refusedModelNote(refused: string, defaultModel: Model<Api> | undefined): string {
577
+ return (
578
+ `Model ${refused} is not usable on this account, so automatic selection skips it and the subagent/workflow \`model\` field should not name it. ` +
579
+ `The subagent default is now ${defaultModel ? spec(defaultModel) : "this session's model"}.`
580
+ );
581
+ }
582
+
570
583
  /** The every-turn reminder body. Kept short: its tokens are paid on every call. */
571
584
  export function subagentModelsReminder(options: MenuOptions): string {
572
585
  const menu = subagentModelMenu(options);
@@ -20,7 +20,7 @@ export interface ForkIsolation {
20
20
  * entire transcript; without this, a weaker model tends to abandon its assigned
21
21
  * task and continue (or confabulate about) the inherited topic — then its output
22
22
  * returns to the parent looking like independent confirmation. See
23
- * docs/features/tools/records/tool-ambiguity-hardening.md (fork confabulation).
23
+ * working-docs/features/tools/records/tool-ambiguity-hardening.md (fork confabulation).
24
24
  *
25
25
  * With `isolation`, the fork is told that its working directory moved: the
26
26
  * inherited system prompt and transcript name the parent's checkout in every
@@ -30,7 +30,7 @@ export interface ForkIsolation {
30
30
  */
31
31
  export function forkTaskMessage(task: string, isolation?: ForkIsolation): string {
32
32
  const lines = [
33
- "You are a forked subagent. The conversation above is inherited context, for reference only — do NOT continue its open threads, verify its claims, or act on its plans. Do ONLY the task below; your final message is returned to the parent conversation verbatim, as data. You cannot see the parent's background tasks: its task ids are not addressable from here.",
33
+ "You are a forked subagent. The conversation above is inherited context, for reference only — do NOT continue its open threads, verify its claims, or act on its plans. Do ONLY the task below; the report you hand back through SubagentHandback is returned to the parent conversation verbatim, as data. You cannot see the parent's background tasks: its task ids are not addressable from here.",
34
34
  ];
35
35
  if (isolation) {
36
36
  lines.push(
@@ -1,41 +1,83 @@
1
1
  /**
2
2
  * Pure key decoding for the below-editor panel — Claude Code's agent-tree
3
- * keys. Their meaning depends on whether a transcript view is open (index.ts
4
- * owns that split): with no view open, arrows select and Enter opens the
5
- * selected agent's transcript; while a view IS open the panel is in "read"
6
- * mode, where arrows scroll it a line at a time, PageUp/PageDown scroll a page,
7
- * `switch` (Tab) retargets to the next agent, `left` (←) closes the transcript
8
- * back to agent selection, and Enter closes it. `x` stops, the `ctrl+x ctrl+k`
9
- * chord stops all, esc leaves. `left` also serves the shell-panel stages (back)
10
- * and `space` (close); the agents branch uses `left` in read mode (above) and
11
- * treats `space` like typing. Raw terminal bytes in, intents out — no side
12
- * effects, fully unit-testable.
3
+ * keys: arrows select, Enter views the selected agent (or `main`), PageUp and
4
+ * PageDown scroll an open view, `x` stops, the `ctrl+x ctrl+k` chord stops
5
+ * all, esc hands focus back to the editor (index.ts owns what each does; an
6
+ * open view stays open while the editor addresses its agent). Raw terminal
7
+ * bytes in, intents out — no side effects, fully unit-testable. Keys are named
8
+ * through `lib/key-input.ts`, so the legacy, kitty and modifyOtherKeys
9
+ * encodings decode alike, and a kitty key release (sent after every press) is
10
+ * never mistaken for typing.
13
11
  */
14
12
 
15
- const UP = new Set(["\x1b[A", "\x1bOA"]);
16
- const DOWN = new Set(["\x1b[B", "\x1bOB"]);
17
- const LEFT = new Set(["\x1b[D", "\x1bOD"]);
13
+ import { isKeyRelease, keyId, keyText } from "../lib/key-input.ts";
18
14
 
19
- export type StripKey = "up" | "down" | "left" | "space" | "switch" | "open" | "leave" | "stop" | "stopAll" | "pageUp" | "pageDown";
15
+ export type StripKey = "up" | "down" | "open" | "leave" | "stop" | "stopAll" | "pageUp" | "pageDown";
16
+
17
+ const STRIP_KEYS: Record<string, StripKey> = {
18
+ up: "up",
19
+ down: "down",
20
+ enter: "open",
21
+ escape: "leave",
22
+ pageUp: "pageUp",
23
+ pageDown: "pageDown",
24
+ };
20
25
 
21
26
  /**
22
- * Decoder with chord state: `ctrl+x` (\x18) arms the chord (consumed, no key);
23
- * a following `ctrl+k` (\x0b) completes it into `stopAll`; any other key
24
- * cancels the chord and is decoded normally. A byte that decodes to nothing
25
- * (typing) is the caller's signal to drop focus and let the byte through.
27
+ * Decoder with chord state: `ctrl+x` arms the chord (consumed, no key); a
28
+ * following `ctrl+k` completes it into `stopAll`; any other key cancels the
29
+ * chord and is decoded normally. A key release decodes to `release`, which
30
+ * changes nothing (the caller lets it through). Any other chunk that decodes
31
+ * to nothing (typing) is the caller's signal to drop focus and let the byte
32
+ * through.
26
33
  */
27
- export function decodeStripKey(data: string, chordArmed: boolean): { key?: StripKey; chordArmed: boolean } {
28
- if (chordArmed && data === "\x0b") return { key: "stopAll", chordArmed: false };
29
- if (data === "\x18") return { chordArmed: true };
30
- if (UP.has(data)) return { key: "up", chordArmed: false };
31
- if (DOWN.has(data)) return { key: "down", chordArmed: false };
32
- if (LEFT.has(data)) return { key: "left", chordArmed: false };
33
- if (data === "\t") return { key: "switch", chordArmed: false };
34
- if (data === " ") return { key: "space", chordArmed: false };
35
- if (data === "\r" || data === "\n") return { key: "open", chordArmed: false };
36
- if (data === "\x1b") return { key: "leave", chordArmed: false };
37
- if (data === "x" || data === "X") return { key: "stop", chordArmed: false };
38
- if (data === "\x1b[5~") return { key: "pageUp", chordArmed: false };
39
- if (data === "\x1b[6~") return { key: "pageDown", chordArmed: false };
34
+ export function decodeStripKey(data: string, chordArmed: boolean): { key?: StripKey; chordArmed: boolean; release?: true } {
35
+ if (isKeyRelease(data)) return { chordArmed, release: true };
36
+ const id = keyId(data);
37
+ if (chordArmed && id === "ctrl+k") return { key: "stopAll", chordArmed: false };
38
+ if (id === "ctrl+x") return { chordArmed: true };
39
+ const key = id ? STRIP_KEYS[id] : undefined;
40
+ if (key) return { key, chordArmed: false };
41
+ const text = keyText(data);
42
+ if (text === "x" || text === "X") return { key: "stop", chordArmed: false };
40
43
  return { chordArmed: false };
41
44
  }
45
+
46
+ /** A ↓ press (in any encoding, never its release): the key that enters the strip. */
47
+ export function isStripEntryKey(data: string): boolean {
48
+ return !isKeyRelease(data) && keyId(data) === "down";
49
+ }
50
+
51
+ /** The slice of pi's editor the strip reads (structural; every member optional). */
52
+ export interface EditorLike {
53
+ getLines?(): string[];
54
+ getCursor?(): { line: number; col: number };
55
+ isShowingAutocomplete?(): boolean;
56
+ /** pi-tui's history position: -1 when no recalled entry is shown. */
57
+ historyIndex?: unknown;
58
+ }
59
+
60
+ /**
61
+ * Whether ↓ belongs to the strip rather than the editor. In a draft the
62
+ * editor needs ↓ to move the cursor down, to walk forward through recalled
63
+ * history, and to move in the autocomplete list, so the strip takes ↓ only
64
+ * with the cursor on the draft's last line, no history entry shown and no
65
+ * autocomplete open (Claude Code's footer rule). An editor without the
66
+ * expected methods keeps the old behaviour (the strip takes ↓).
67
+ */
68
+ export function editorYieldsDown(editor: unknown): boolean {
69
+ if (!editor || typeof editor !== "object") return true;
70
+ const e = editor as EditorLike;
71
+ try {
72
+ if (e.isShowingAutocomplete?.()) return false;
73
+ // Read-only use of a private pi-tui field; if a pi bump renames it, the
74
+ // history case falls back to taking ↓ (the behaviour before this check).
75
+ if (typeof e.historyIndex === "number" && e.historyIndex > -1) return false;
76
+ const lines = e.getLines?.();
77
+ const cursor = e.getCursor?.();
78
+ if (!lines || !cursor) return true;
79
+ return cursor.line >= lines.length - 1;
80
+ } catch {
81
+ return true;
82
+ }
83
+ }