@pugi/cli 0.1.0-beta.9 → 0.1.0-beta.91

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 (411) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LICENSE +1 -1
  3. package/assets/pugi-prozr2-mascot.ansi +9 -0
  4. package/bin/run.js +33 -1
  5. package/dist/commands/deploy.js +40 -40
  6. package/dist/commands/flatten.js +191 -0
  7. package/dist/commands/jobs-watch.js +201 -0
  8. package/dist/commands/jobs.js +42 -27
  9. package/dist/commands/smoke.js +133 -0
  10. package/dist/core/agent-progress/cleanup.js +134 -0
  11. package/dist/core/agent-progress/schema.js +144 -0
  12. package/dist/core/agent-progress/writer.js +101 -0
  13. package/dist/core/agents/adaptive-router.js +330 -0
  14. package/dist/core/agents/query-decomposer.js +297 -0
  15. package/dist/core/agents/registry.js +3 -3
  16. package/dist/core/approvals/shortcut-resolver.js +98 -0
  17. package/dist/core/artifact-chain/dispatcher.js +148 -0
  18. package/dist/core/artifact-chain/exporter.js +164 -0
  19. package/dist/core/artifact-chain/state.js +243 -0
  20. package/dist/core/artifact-chain/steps.js +169 -0
  21. package/dist/core/ask-user/question.js +92 -0
  22. package/dist/core/audit/audit-trail.js +275 -0
  23. package/dist/core/auth/ensure-authenticated.js +129 -0
  24. package/dist/core/auth/env-provider.js +238 -0
  25. package/dist/core/auto-open-browser.js +4 -4
  26. package/dist/core/auto-update/channels.js +122 -0
  27. package/dist/core/auto-update/checker.js +241 -0
  28. package/dist/core/auto-update/state.js +235 -0
  29. package/dist/core/bare-mode/index.js +107 -0
  30. package/dist/core/bash/redirect.js +281 -0
  31. package/dist/core/bash-classifier.js +436 -40
  32. package/dist/core/checkpoint/resumer.js +149 -0
  33. package/dist/core/checkpoint/rewinder.js +291 -0
  34. package/dist/core/checkpoints/shadow-git.js +670 -0
  35. package/dist/core/citations/parser.js +109 -0
  36. package/dist/core/classifier/yolo-classifier.js +88 -0
  37. package/dist/core/codegraph/decision-store.js +248 -0
  38. package/dist/core/codegraph/detect-repo.js +459 -0
  39. package/dist/core/codegraph/install.js +134 -0
  40. package/dist/core/codegraph/offer-hook.js +220 -0
  41. package/dist/core/compact/auto-trigger.js +96 -0
  42. package/dist/core/compact/buffer-rewriter.js +115 -0
  43. package/dist/core/compact/summarizer.js +208 -0
  44. package/dist/core/compact/token-counter.js +108 -0
  45. package/dist/core/consensus/anvil-fanout.js +25 -25
  46. package/dist/core/consensus/diff-capture.js +121 -12
  47. package/dist/core/consensus/rubric.js +21 -21
  48. package/dist/core/context/builder.js +6 -6
  49. package/dist/core/context/compaction-events.js +8 -8
  50. package/dist/core/context/compaction.js +31 -31
  51. package/dist/core/context/index.js +15 -8
  52. package/dist/core/context/invariants.js +51 -51
  53. package/dist/core/context/markdown-loader.js +28 -10
  54. package/dist/core/context/markdown-traverse.js +255 -0
  55. package/dist/core/context/pugiignore.js +41 -41
  56. package/dist/core/context/repo-skeleton.js +37 -37
  57. package/dist/core/context/tool-eviction.js +55 -0
  58. package/dist/core/context/watcher.js +32 -32
  59. package/dist/core/context/working-set.js +23 -23
  60. package/dist/core/coordinator/agent-tools.js +77 -0
  61. package/dist/core/coordinator/agent-toolset.js +65 -0
  62. package/dist/core/coordinator/fsm.js +73 -0
  63. package/dist/core/coordinator/mode-fsm.js +70 -0
  64. package/dist/core/cost/rate-card.js +129 -0
  65. package/dist/core/cost/tracker.js +221 -0
  66. package/dist/core/credentials.js +13 -13
  67. package/dist/core/cron/scheduler.js +138 -0
  68. package/dist/core/denial-tracking/index.js +8 -0
  69. package/dist/core/denial-tracking/state.js +264 -0
  70. package/dist/core/diagnostics/probe-runner.js +93 -0
  71. package/dist/core/diagnostics/probes/api.js +46 -0
  72. package/dist/core/diagnostics/probes/auth.js +93 -0
  73. package/dist/core/diagnostics/probes/bare-mode.js +42 -0
  74. package/dist/core/diagnostics/probes/cli-version.js +127 -0
  75. package/dist/core/diagnostics/probes/config.js +72 -0
  76. package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
  77. package/dist/core/diagnostics/probes/disk.js +81 -0
  78. package/dist/core/diagnostics/probes/engine-live.js +46 -0
  79. package/dist/core/diagnostics/probes/git.js +65 -0
  80. package/dist/core/diagnostics/probes/hooks.js +118 -0
  81. package/dist/core/diagnostics/probes/mcp.js +75 -0
  82. package/dist/core/diagnostics/probes/node.js +59 -0
  83. package/dist/core/diagnostics/probes/pnpm.js +36 -0
  84. package/dist/core/diagnostics/probes/pugi-md.js +89 -0
  85. package/dist/core/diagnostics/probes/sandbox.js +40 -0
  86. package/dist/core/diagnostics/probes/session.js +74 -0
  87. package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
  88. package/dist/core/diagnostics/probes/workspace.js +63 -0
  89. package/dist/core/diagnostics/types.js +70 -0
  90. package/dist/core/dispatch/cache-cleanup.js +197 -0
  91. package/dist/core/dispatch/cache-handoff.js +295 -0
  92. package/dist/core/edits/apply-patch-layer-e.js +189 -0
  93. package/dist/core/edits/dispatch.js +333 -7
  94. package/dist/core/edits/format-detector.js +260 -0
  95. package/dist/core/edits/format-matrix.js +26 -0
  96. package/dist/core/edits/fuzzy-ladder.js +650 -0
  97. package/dist/core/edits/index.js +5 -1
  98. package/dist/core/edits/journal.js +199 -0
  99. package/dist/core/edits/layer-a-apply.js +15 -15
  100. package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
  101. package/dist/core/edits/layer-b-apply.js +9 -9
  102. package/dist/core/edits/layer-c-apply.js +6 -6
  103. package/dist/core/edits/layer-d-ast.js +557 -14
  104. package/dist/core/edits/marker-parser.js +12 -12
  105. package/dist/core/edits/security-gate.js +27 -27
  106. package/dist/core/edits/verify-hook.js +273 -0
  107. package/dist/core/edits/worktree.js +29 -29
  108. package/dist/core/engine/anvil-client.js +214 -26
  109. package/dist/core/engine/auto-compact.js +179 -0
  110. package/dist/core/engine/budgets.js +186 -0
  111. package/dist/core/engine/context-prefix.js +155 -0
  112. package/dist/core/engine/index.js +1 -1
  113. package/dist/core/engine/intensity.js +158 -0
  114. package/dist/core/engine/intent.js +260 -0
  115. package/dist/core/engine/native-pugi.js +1295 -227
  116. package/dist/core/engine/prompts.js +129 -19
  117. package/dist/core/engine/strip-internal-fields.js +124 -0
  118. package/dist/core/engine/tool-bridge.js +1792 -59
  119. package/dist/core/evaluation/golden-dataset.js +293 -0
  120. package/dist/core/feedback/queue.js +177 -0
  121. package/dist/core/feedback/submitter.js +145 -0
  122. package/dist/core/file-cache.js +113 -1
  123. package/dist/core/flatten/flatten-repo.js +439 -0
  124. package/dist/core/format/osc8-link.js +28 -0
  125. package/dist/core/hook-chains.js +392 -0
  126. package/dist/core/hooks/citation-verify-hook.js +138 -0
  127. package/dist/core/hooks/citation-verify.js +112 -0
  128. package/dist/core/hooks/events.js +46 -0
  129. package/dist/core/hooks/index.js +15 -0
  130. package/dist/core/hooks/registry.js +216 -0
  131. package/dist/core/hooks/runner.js +236 -0
  132. package/dist/core/hooks/v2/event-emitter.js +115 -0
  133. package/dist/core/hooks/v2/executor.js +282 -0
  134. package/dist/core/hooks/v2/index.js +25 -0
  135. package/dist/core/hooks/v2/lifecycle.js +104 -0
  136. package/dist/core/hooks/v2/loader.js +216 -0
  137. package/dist/core/hooks/v2/matcher.js +125 -0
  138. package/dist/core/hooks/v2/trust.js +143 -0
  139. package/dist/core/hooks/v2/types.js +86 -0
  140. package/dist/core/hooks/worktree-events.js +158 -0
  141. package/dist/core/image/renderer.js +71 -0
  142. package/dist/core/init/detector.js +582 -0
  143. package/dist/core/init/template-renderer.js +242 -0
  144. package/dist/core/jobs/registry.js +18 -18
  145. package/dist/core/ledger/results-tsv.js +142 -0
  146. package/dist/core/log-discipline/stdout-redirect.js +51 -0
  147. package/dist/core/lsp/cache.js +105 -0
  148. package/dist/core/lsp/client.js +551 -41
  149. package/dist/core/lsp/language-detect.js +66 -0
  150. package/dist/core/lsp/post-edit-diagnostics.js +171 -0
  151. package/dist/core/lsp/server-detect.js +173 -0
  152. package/dist/core/lsp/symbol-cache.js +162 -0
  153. package/dist/core/lsp/symbol-tools.js +664 -0
  154. package/dist/core/mcp/client.js +97 -28
  155. package/dist/core/mcp/http-server.js +553 -0
  156. package/dist/core/mcp/orchestrator-tools.js +662 -0
  157. package/dist/core/mcp/permission.js +190 -0
  158. package/dist/core/mcp/registry.js +39 -17
  159. package/dist/core/mcp/server-tools.js +219 -0
  160. package/dist/core/mcp/server.js +397 -0
  161. package/dist/core/mcp/trust.js +10 -10
  162. package/dist/core/memory/dual-write.js +416 -0
  163. package/dist/core/memory/passive-extract.js +130 -0
  164. package/dist/core/memory/phase1-kinds.js +20 -0
  165. package/dist/core/memory/secret-scanner.js +304 -0
  166. package/dist/core/memory-sync/queue.js +170 -0
  167. package/dist/core/metrics/extract.js +113 -0
  168. package/dist/core/modes/roo-modes.js +68 -0
  169. package/dist/core/onboarding/ensure-initialized.js +133 -0
  170. package/dist/core/onboarding/marker.js +111 -0
  171. package/dist/core/onboarding/telemetry-state.js +108 -0
  172. package/dist/core/output-style/presets.js +176 -0
  173. package/dist/core/output-style/state.js +185 -0
  174. package/dist/core/path-security.js +287 -5
  175. package/dist/core/permission.js +82 -22
  176. package/dist/core/permissions/auto-classifier.js +124 -0
  177. package/dist/core/permissions/bash-parser.js +371 -0
  178. package/dist/core/permissions/circuit-breaker.js +83 -0
  179. package/dist/core/permissions/constrained-edit.js +91 -0
  180. package/dist/core/permissions/gate.js +278 -0
  181. package/dist/core/permissions/index.js +20 -0
  182. package/dist/core/permissions/mode.js +174 -0
  183. package/dist/core/permissions/network-egress.js +137 -0
  184. package/dist/core/permissions/state.js +241 -0
  185. package/dist/core/permissions/tool-class.js +93 -0
  186. package/dist/core/plan-mode/ui-state.js +51 -0
  187. package/dist/core/plans/plan-artifact.js +721 -0
  188. package/dist/core/policy-limits/etag-store.js +122 -0
  189. package/dist/core/prd-check/parser.js +215 -0
  190. package/dist/core/prd-check/reporter.js +127 -0
  191. package/dist/core/prd-check/session-review.js +557 -0
  192. package/dist/core/prd-check/verifiers.js +223 -0
  193. package/dist/core/prompt-cache/client-cache.js +99 -0
  194. package/dist/core/prompts/assembly.js +29 -0
  195. package/dist/core/prompts/registry.js +364 -0
  196. package/dist/core/pugi-md/cc-compat-rules.js +735 -0
  197. package/dist/core/pugi-md/context-injector.js +76 -0
  198. package/dist/core/pugi-md/walk-up.js +207 -0
  199. package/dist/core/python/uv-installer.js +270 -0
  200. package/dist/core/python/uv-resolver.js +83 -0
  201. package/dist/core/rate-limit/narrator.js +146 -0
  202. package/dist/core/recipes/cli-types.js +20 -0
  203. package/dist/core/recipes/loader.js +103 -0
  204. package/dist/core/recipes/runner.js +345 -0
  205. package/dist/core/recipes/schema.js +587 -0
  206. package/dist/core/release-notes/parser.js +241 -0
  207. package/dist/core/release-notes/state.js +116 -0
  208. package/dist/core/repl/ask.js +37 -37
  209. package/dist/core/repl/cancellation.js +26 -26
  210. package/dist/core/repl/cap-warning.js +4 -4
  211. package/dist/core/repl/clipboard-read.js +11 -11
  212. package/dist/core/repl/dispatch-fsm.js +12 -12
  213. package/dist/core/repl/history-search.js +15 -15
  214. package/dist/core/repl/history.js +28 -18
  215. package/dist/core/repl/kill-ring.js +5 -5
  216. package/dist/core/repl/model-pricing.js +135 -0
  217. package/dist/core/repl/privacy-banner.js +22 -22
  218. package/dist/core/repl/session.js +2148 -217
  219. package/dist/core/repl/slash-commands.js +501 -41
  220. package/dist/core/repl/store/index.js +1 -1
  221. package/dist/core/repl/store/jsonl-log.js +22 -22
  222. package/dist/core/repl/store/lockfile.js +10 -10
  223. package/dist/core/repl/store/session-store.js +136 -107
  224. package/dist/core/repl/store/types.js +15 -15
  225. package/dist/core/repl/store/uuid-v7.js +12 -12
  226. package/dist/core/repl/workspace-context.js +43 -21
  227. package/dist/core/repo-map/build.js +125 -0
  228. package/dist/core/repo-map/cache.js +185 -0
  229. package/dist/core/repo-map/extractor.js +254 -0
  230. package/dist/core/repo-map/formatter.js +145 -0
  231. package/dist/core/repo-map/page-rank.js +105 -0
  232. package/dist/core/repo-map/scanner.js +211 -0
  233. package/dist/core/retry-budget/budget.js +284 -0
  234. package/dist/core/retry-budget/index.js +5 -0
  235. package/dist/core/retry-budget/retry-cap.js +74 -0
  236. package/dist/core/routing/lead-worker.js +43 -0
  237. package/dist/core/routing/pre-flight-estimator.js +108 -0
  238. package/dist/core/runs/run-tree.js +103 -0
  239. package/dist/core/security/injection-scanner.js +367 -0
  240. package/dist/core/security/output-filter.js +418 -0
  241. package/dist/core/session/env-file.js +105 -0
  242. package/dist/core/session/section-budgets.js +140 -0
  243. package/dist/core/session.js +92 -0
  244. package/dist/core/settings.js +324 -5
  245. package/dist/core/share/formatter.js +271 -0
  246. package/dist/core/share/redactor.js +221 -0
  247. package/dist/core/share/uploader.js +267 -0
  248. package/dist/core/skills/defaults.js +30 -30
  249. package/dist/core/skills/loader.js +22 -22
  250. package/dist/core/skills/sources.js +27 -27
  251. package/dist/core/smoke/headless-driver.js +174 -0
  252. package/dist/core/smoke/orchestrator.js +194 -0
  253. package/dist/core/smoke/runner.js +238 -0
  254. package/dist/core/smoke/scenario-parser.js +316 -0
  255. package/dist/core/statusline.js +99 -0
  256. package/dist/core/subagents/dispatcher-real.js +600 -0
  257. package/dist/core/subagents/dispatcher.js +132 -43
  258. package/dist/core/subagents/index.js +19 -6
  259. package/dist/core/subagents/isolation-matrix.js +213 -0
  260. package/dist/core/subagents/spawn.js +19 -4
  261. package/dist/core/telemetry/emitter.js +229 -0
  262. package/dist/core/telemetry/queue.js +251 -0
  263. package/dist/core/theme/context.js +91 -0
  264. package/dist/core/theme/presets.js +228 -0
  265. package/dist/core/theme/state.js +181 -0
  266. package/dist/core/todos/invariant.js +10 -0
  267. package/dist/core/todos/state.js +177 -0
  268. package/dist/core/tool-schema/compressor.js +89 -0
  269. package/dist/core/transport/version-interceptor.js +166 -0
  270. package/dist/core/trust.js +2 -2
  271. package/dist/core/tui/thinking-block.js +64 -0
  272. package/dist/core/vim/keymap.js +288 -0
  273. package/dist/core/vim/state.js +92 -0
  274. package/dist/core/watch-markers/marker-watcher.js +133 -0
  275. package/dist/core/worktree/include-parser.js +249 -0
  276. package/dist/core/worktree-manager/cleanup.js +123 -0
  277. package/dist/core/worktree-manager/manager.js +303 -0
  278. package/dist/index.js +36 -0
  279. package/dist/runtime/bootstrap.js +190 -0
  280. package/dist/runtime/cli.js +4185 -549
  281. package/dist/runtime/commands/agents.js +31 -31
  282. package/dist/runtime/commands/budget.js +5 -5
  283. package/dist/runtime/commands/cancel.js +231 -0
  284. package/dist/runtime/commands/chain.js +489 -0
  285. package/dist/runtime/commands/codegraph-status.js +227 -0
  286. package/dist/runtime/commands/compact.js +297 -0
  287. package/dist/runtime/commands/config.js +73 -39
  288. package/dist/runtime/commands/cost.js +199 -0
  289. package/dist/runtime/commands/delegate.js +27 -4
  290. package/dist/runtime/commands/dispatch.js +126 -0
  291. package/dist/runtime/commands/doctor.js +579 -0
  292. package/dist/runtime/commands/feedback.js +184 -0
  293. package/dist/runtime/commands/hooks.js +187 -0
  294. package/dist/runtime/commands/init.js +254 -0
  295. package/dist/runtime/commands/lsp.js +200 -38
  296. package/dist/runtime/commands/mcp.js +879 -0
  297. package/dist/runtime/commands/memory.js +582 -0
  298. package/dist/runtime/commands/model.js +237 -0
  299. package/dist/runtime/commands/onboarding.js +275 -0
  300. package/dist/runtime/commands/patch.js +12 -12
  301. package/dist/runtime/commands/permissions.js +112 -0
  302. package/dist/runtime/commands/plan.js +143 -0
  303. package/dist/runtime/commands/prd-check.js +285 -0
  304. package/dist/runtime/commands/privacy.js +17 -17
  305. package/dist/runtime/commands/recipe.js +325 -0
  306. package/dist/runtime/commands/redo-blob-store.js +92 -0
  307. package/dist/runtime/commands/redo.js +361 -0
  308. package/dist/runtime/commands/release-notes.js +229 -0
  309. package/dist/runtime/commands/repo-map.js +95 -0
  310. package/dist/runtime/commands/report.js +299 -0
  311. package/dist/runtime/commands/resume.js +118 -0
  312. package/dist/runtime/commands/review-consensus.js +68 -53
  313. package/dist/runtime/commands/rewind.js +333 -0
  314. package/dist/runtime/commands/roster.js +14 -14
  315. package/dist/runtime/commands/sessions.js +163 -0
  316. package/dist/runtime/commands/share.js +316 -0
  317. package/dist/runtime/commands/skills.js +31 -31
  318. package/dist/runtime/commands/status.js +186 -0
  319. package/dist/runtime/commands/stickers.js +82 -0
  320. package/dist/runtime/commands/style.js +194 -0
  321. package/dist/runtime/commands/theme.js +196 -0
  322. package/dist/runtime/commands/undo.js +54 -22
  323. package/dist/runtime/commands/update.js +289 -0
  324. package/dist/runtime/commands/vim.js +140 -0
  325. package/dist/runtime/commands/worktree.js +8 -8
  326. package/dist/runtime/commands/worktrees.js +155 -0
  327. package/dist/runtime/headless-repl.js +195 -0
  328. package/dist/runtime/headless.js +543 -0
  329. package/dist/runtime/load-hooks-or-exit.js +71 -0
  330. package/dist/runtime/plan-decompose.js +22 -22
  331. package/dist/runtime/sigint-guard.js +272 -0
  332. package/dist/runtime/update-check.js +28 -28
  333. package/dist/runtime/version.js +65 -0
  334. package/dist/runtime/worktree-bootstrap.js +579 -0
  335. package/dist/skills/bundled/batch.js +617 -0
  336. package/dist/skills/bundled/index.js +45 -0
  337. package/dist/skills/bundled/loop.js +358 -0
  338. package/dist/skills/bundled/remember.js +383 -0
  339. package/dist/skills/bundled/simplify.js +289 -0
  340. package/dist/skills/bundled/skillify.js +373 -0
  341. package/dist/skills/bundled/stuck.js +558 -0
  342. package/dist/skills/bundled/verify.js +439 -0
  343. package/dist/testing/vcr.js +486 -0
  344. package/dist/tools/agent-tool.js +229 -0
  345. package/dist/tools/apply-patch.js +89 -28
  346. package/dist/tools/ask-user-question.js +337 -0
  347. package/dist/tools/ask-user.js +115 -0
  348. package/dist/tools/bash.js +624 -46
  349. package/dist/tools/brief.js +224 -0
  350. package/dist/tools/cron.js +433 -0
  351. package/dist/tools/enter-worktree.js +250 -0
  352. package/dist/tools/exit-worktree.js +147 -0
  353. package/dist/tools/file-tools.js +161 -44
  354. package/dist/tools/lsp-tools.js +377 -1
  355. package/dist/tools/mcp-tool.js +260 -0
  356. package/dist/tools/multi-edit.js +361 -0
  357. package/dist/tools/powershell.js +268 -0
  358. package/dist/tools/registry.js +99 -4
  359. package/dist/tools/skill-tool.js +96 -0
  360. package/dist/tools/sleep.js +99 -0
  361. package/dist/tools/synthetic-output.js +133 -0
  362. package/dist/tools/tasks.js +208 -0
  363. package/dist/tools/todo-write.js +184 -0
  364. package/dist/tools/verify-plan-execution.js +295 -0
  365. package/dist/tools/web-fetch-injection-scanner.js +207 -0
  366. package/dist/tools/web-fetch.js +195 -10
  367. package/dist/tools/web-search.js +458 -0
  368. package/dist/tui/agent-progress-card.js +111 -0
  369. package/dist/tui/agent-tree.js +11 -1
  370. package/dist/tui/ask-modal.js +14 -14
  371. package/dist/tui/ask-user-question-chips.js +315 -0
  372. package/dist/tui/ask-user-question-prompt.js +203 -0
  373. package/dist/tui/compact-banner.js +81 -0
  374. package/dist/tui/conversation-pane.js +85 -11
  375. package/dist/tui/cost-table.js +111 -0
  376. package/dist/tui/device-flow.js +2 -2
  377. package/dist/tui/doctor-table.js +46 -0
  378. package/dist/tui/feedback-prompt.js +156 -0
  379. package/dist/tui/input-box.js +247 -32
  380. package/dist/tui/login-picker.js +3 -3
  381. package/dist/tui/markdown-render.js +6 -6
  382. package/dist/tui/multi-file-diff-approval.js +375 -0
  383. package/dist/tui/onboarding-wizard.js +240 -0
  384. package/dist/tui/permissions-picker.js +86 -0
  385. package/dist/tui/render.js +36 -1
  386. package/dist/tui/repl-render.js +176 -25
  387. package/dist/tui/repl-splash-art.js +16 -16
  388. package/dist/tui/repl-splash-mascot.js +48 -24
  389. package/dist/tui/repl-splash.js +22 -22
  390. package/dist/tui/repl.js +125 -45
  391. package/dist/tui/slash-palette.js +6 -6
  392. package/dist/tui/splash.js +2 -2
  393. package/dist/tui/status-bar.js +109 -31
  394. package/dist/tui/status-table.js +7 -0
  395. package/dist/tui/stickers-art.js +136 -0
  396. package/dist/tui/style-table.js +28 -0
  397. package/dist/tui/theme-table.js +29 -0
  398. package/dist/tui/thinking-spinner.js +123 -0
  399. package/dist/tui/tool-stream-pane.js +53 -4
  400. package/dist/tui/update-banner.js +27 -2
  401. package/dist/tui/vim-input.js +267 -0
  402. package/dist/tui/welcome-banner.js +107 -0
  403. package/dist/tui/welcome-data.js +293 -0
  404. package/dist/tui/workspace-context.js +2 -2
  405. package/package.json +31 -16
  406. package/test/scenarios/codegen-create-file.scenario.txt +13 -0
  407. package/test/scenarios/compact-force.scenario.txt +12 -0
  408. package/test/scenarios/identity.scenario.txt +12 -0
  409. package/test/scenarios/persona-handoff.scenario.txt +12 -0
  410. package/test/scenarios/walkback.scenario.txt +12 -0
  411. package/dist/core/engine/compaction-hook.js +0 -154
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Edit-format auto-select (PUGI-79).
3
+ *
4
+ * The 4-layer diff dispatcher (Layer A single-block, B ordered batch,
5
+ * C sha256-gated rewrite, D AST-aware) is layer-agnostic at the wire
6
+ * — the model emits whichever marker family it was prompted with, and
7
+ * `dispatch.ts` routes per envelope. Empirically though, different
8
+ * model families have markedly different success rates per layer:
9
+ *
10
+ * - Anthropic Claude family — native function-calling shape;
11
+ * produces clean single-block Layer A edits with high recall
12
+ * against `+++ NEW / --- OLD / ===` markers.
13
+ * - Open-weight Qwen3 / Kimi / DeepSeek — historically stronger
14
+ * with whole-file Layer C rewrites OR sha256-gated patches; the
15
+ * conflict-marker (Gemini-style) Layer A surface has higher
16
+ * ambiguity rates on these models.
17
+ * - DeepSeek-coder family — anchors well on Layer C primary with
18
+ * Layer A as fallback (their RLHF set leaned hard on patch-style
19
+ * emit).
20
+ * - Reasoning models (o-series, gpt-5) — handle Layer D AST-aware
21
+ * operations when an LSP bridge is available; Layer C primary
22
+ * otherwise.
23
+ *
24
+ * The existing `format-matrix.ts` keyed exact slugs only — fine for
25
+ * the canonical set but blind to vendor-prefixed slugs that come back
26
+ * from the Anvil gateway (e.g. `anthropic/claude-sonnet-4-20250514`,
27
+ * `qwen/qwen3-coder`, `deepseek/deepseek-chat-v3.1`). This detector
28
+ * layers ON TOP of the matrix:
29
+ *
30
+ * 1. exact-key match against `EDIT_FORMAT_MATRIX` — wins outright.
31
+ * 2. vendor-prefix strip → second exact-key probe (so
32
+ * `anthropic/claude-sonnet-4-6` resolves the same as `claude-sonnet-4-6`).
33
+ * 3. family inference from the (possibly prefixed) slug — returns
34
+ * the family-default chain (see `FAMILY_DEFAULTS`).
35
+ * 4. unknown — wildcard `*` from the matrix.
36
+ *
37
+ * The output is the same `EditFormatChain` shape the matrix already
38
+ * exposes so callers (dispatcher hint, persona prompt hint) consume a
39
+ * single contract.
40
+ *
41
+ * NOT a routing decision: the dispatcher's per-layer routing is still
42
+ * driven by what the model actually emits. The detector's output is a
43
+ * HINT — surfaced to the persona prompt so the model has the right
44
+ * marker template loaded, and surfaced to the dispatcher's fuzzy ladder
45
+ * / fallback ordering so an ambiguous response gets retried in an order
46
+ * that matches the model's empirical strengths.
47
+ *
48
+ * Spec: this is the PUGI-79 implementation; the issue ships the
49
+ * detector + dispatcher hint + persona hint together.
50
+ */
51
+ import { EDIT_FORMAT_MATRIX, } from './format-matrix.js';
52
+ /**
53
+ * Family-level default chains. These are deliberately CONSERVATIVE —
54
+ * each family's primary is the layer with the highest observed apply-
55
+ * rate across the 2026-05 dogfood corpus; fallbacks rank in observed
56
+ * success order. The exact-slug entries in `EDIT_FORMAT_MATRIX` can
57
+ * override per-model; family defaults are the floor.
58
+ *
59
+ * Anthropic:
60
+ * The Anvil corpus shows Claude family hitting ~95% Layer A apply on
61
+ * first try; Layer C is the rescue when the file is large enough
62
+ * that the operator's region selection ambiguates. Matrix entries
63
+ * for `claude-opus-4-7` + `claude-sonnet-4-6` override to Layer C
64
+ * primary because the larger context windows let those models hold
65
+ * the whole file comfortably.
66
+ *
67
+ * Open-weight (qwen / deepseek / kimi):
68
+ * These ship whole-file rewrites more reliably than partial diffs —
69
+ * the patch-style envelopes their fine-tune sets prefer match Layer
70
+ * C semantics. Layer A is the fallback because they can still emit
71
+ * sensible search/replace pairs when prompted explicitly.
72
+ *
73
+ * Reasoning (gpt-5 / o-series):
74
+ * Layer C primary because the longer reasoning trace burns through
75
+ * the partial-diff format's positional constraints. Layer D rides
76
+ * the wire when an LSP is bridged; the matrix entries override per-
77
+ * model when that's available (see `qwen3-coder-480b → D`).
78
+ *
79
+ * Unknown:
80
+ * Defers to the wildcard chain from the matrix (Layer A primary).
81
+ */
82
+ const FAMILY_DEFAULTS = {
83
+ anthropic: { primary: 'A', fallback: ['C', 'B'] },
84
+ openai: { primary: 'C', fallback: ['A', 'B'] },
85
+ gemini: { primary: 'A', fallback: ['C', 'B'] },
86
+ qwen: { primary: 'A', fallback: ['C', 'B'] },
87
+ deepseek: { primary: 'C', fallback: ['A', 'B'] },
88
+ kimi: { primary: 'C', fallback: ['A', 'B'] },
89
+ unknown: { primary: 'A', fallback: ['B', 'C'] },
90
+ };
91
+ /**
92
+ * Detect the model family from a slug. Handles vendor-prefixed forms
93
+ * (`<vendor>/<model>` and `<provider>:<model>`) plus bare-name forms.
94
+ * Case-insensitive on the family name; case-preserving on the rest.
95
+ *
96
+ * Order matters: vendor prefix wins when present (the gateway is
97
+ * authoritative about which family routed). Otherwise the bare slug
98
+ * gets prefix-matched against well-known family stems. Unknown slugs
99
+ * surface as `unknown` — the caller falls back to the matrix wildcard.
100
+ */
101
+ export function detectModelFamily(modelSlug) {
102
+ if (!modelSlug)
103
+ return 'unknown';
104
+ const raw = modelSlug.trim();
105
+ if (raw.length === 0)
106
+ return 'unknown';
107
+ const lower = raw.toLowerCase();
108
+ // Vendor-prefix form: `<vendor>/<model>`. The vendor wins outright
109
+ // because the gateway is authoritative — `anthropic/<anything>`
110
+ // routes Claude family regardless of the suffix.
111
+ const slashIdx = lower.indexOf('/');
112
+ if (slashIdx > 0) {
113
+ const vendor = lower.slice(0, slashIdx);
114
+ switch (vendor) {
115
+ case 'anthropic':
116
+ return 'anthropic';
117
+ case 'openai':
118
+ return 'openai';
119
+ case 'google':
120
+ case 'gemini':
121
+ case 'xai':
122
+ return 'gemini';
123
+ case 'qwen':
124
+ case 'alibaba':
125
+ return 'qwen';
126
+ case 'deepseek':
127
+ return 'deepseek';
128
+ case 'moonshot':
129
+ case 'kimi':
130
+ return 'kimi';
131
+ default:
132
+ // Unknown vendor — fall through to bare-name detection on the
133
+ // suffix. Some gateways (OpenRouter style) put the family
134
+ // name AFTER the vendor (e.g. `together/qwen-coder`), so the
135
+ // suffix still carries signal.
136
+ return detectFamilyFromBareName(lower.slice(slashIdx + 1));
137
+ }
138
+ }
139
+ // Provider-prefix form: `ollama:<model>` (engine-VM local runtime).
140
+ // The prefix is informational; strip and continue.
141
+ const colonIdx = lower.indexOf(':');
142
+ if (colonIdx > 0) {
143
+ const prefix = lower.slice(0, colonIdx);
144
+ if (prefix === 'ollama' || prefix === 'lmstudio' || prefix === 'llama-cpp') {
145
+ return detectFamilyFromBareName(lower.slice(colonIdx + 1));
146
+ }
147
+ }
148
+ return detectFamilyFromBareName(lower);
149
+ }
150
+ /**
151
+ * Bare-name detector. Lower-case input. Prefix-match against family
152
+ * stems; longest match wins so `claude-opus-4-7` doesn't accidentally
153
+ * route through the generic `c*` lane.
154
+ */
155
+ function detectFamilyFromBareName(name) {
156
+ if (name.startsWith('claude'))
157
+ return 'anthropic';
158
+ if (name.startsWith('gpt') || name.startsWith('o1') || name.startsWith('o3') || name.startsWith('o4')) {
159
+ return 'openai';
160
+ }
161
+ if (name.startsWith('gemini') || name.startsWith('grok'))
162
+ return 'gemini';
163
+ if (name.startsWith('qwen'))
164
+ return 'qwen';
165
+ if (name.startsWith('deepseek'))
166
+ return 'deepseek';
167
+ if (name.startsWith('kimi') || name.startsWith('moonshot'))
168
+ return 'kimi';
169
+ return 'unknown';
170
+ }
171
+ /**
172
+ * Family-default chain. Exported for callers that want the family-
173
+ * level recommendation without running the full detector pipeline
174
+ * (e.g. observability surfaces that already resolved the family).
175
+ */
176
+ export function familyDefaultChain(family) {
177
+ // Defensive clone: the FAMILY_DEFAULTS table is readonly conceptually
178
+ // but the EditFormatChain type allows fallback array mutation. Clone
179
+ // so callers cannot accidentally mutate the table.
180
+ const base = FAMILY_DEFAULTS[family];
181
+ return { primary: base.primary, fallback: [...base.fallback] };
182
+ }
183
+ /**
184
+ * Resolve the preferred edit-format chain for a model slug.
185
+ *
186
+ * Resolution order:
187
+ * 1. Exact slug match in EDIT_FORMAT_MATRIX — overrides everything.
188
+ * This lets per-model tuning (e.g. `qwen3-coder-480b → D`) win
189
+ * over the family default.
190
+ * 2. Vendor-prefix strip + exact match — so `anthropic/claude-...`
191
+ * resolves to the bare `claude-...` entry when present.
192
+ * 3. Family inference — `FAMILY_DEFAULTS[detectModelFamily(slug)]`.
193
+ * 4. Wildcard fallback — `EDIT_FORMAT_MATRIX['*']`.
194
+ *
195
+ * The returned chain is always a fresh object so caller mutations
196
+ * cannot leak back into the matrix.
197
+ */
198
+ export function detectEditFormat(modelSlug) {
199
+ const fallbackWildcard = EDIT_FORMAT_MATRIX['*'] ?? { primary: 'A', fallback: [] };
200
+ if (!modelSlug || modelSlug.trim().length === 0) {
201
+ return { primary: fallbackWildcard.primary, fallback: [...fallbackWildcard.fallback] };
202
+ }
203
+ const raw = modelSlug.trim();
204
+ // Step 1 — exact match wins.
205
+ const exact = EDIT_FORMAT_MATRIX[raw];
206
+ if (exact)
207
+ return { primary: exact.primary, fallback: [...exact.fallback] };
208
+ // Step 2 — vendor-prefix strip (e.g. `anthropic/claude-sonnet-4-6`).
209
+ const slashIdx = raw.indexOf('/');
210
+ if (slashIdx > 0) {
211
+ const suffix = raw.slice(slashIdx + 1);
212
+ const stripped = EDIT_FORMAT_MATRIX[suffix];
213
+ if (stripped)
214
+ return { primary: stripped.primary, fallback: [...stripped.fallback] };
215
+ }
216
+ // Step 3 — family inference.
217
+ const family = detectModelFamily(raw);
218
+ if (family !== 'unknown')
219
+ return familyDefaultChain(family);
220
+ // Step 4 — wildcard.
221
+ return { primary: fallbackWildcard.primary, fallback: [...fallbackWildcard.fallback] };
222
+ }
223
+ /**
224
+ * Render a one-line marker-format hint for the persona prompt. The
225
+ * dispatcher already accepts every marker family (anthropic / gemini /
226
+ * openai), so the hint is preference, not gating — surface the
227
+ * preferred template + alternative so the model knows which envelope
228
+ * has the highest apply-rate for its family.
229
+ *
230
+ * Returns `null` when the slug is unknown / unset; the caller drops
231
+ * the hint module on null so the prompt is not polluted with empty
232
+ * sections.
233
+ */
234
+ export function renderEditFormatHint(modelSlug) {
235
+ if (!modelSlug || modelSlug.trim().length === 0)
236
+ return null;
237
+ const family = detectModelFamily(modelSlug);
238
+ if (family === 'unknown')
239
+ return null;
240
+ const chain = detectEditFormat(modelSlug);
241
+ const markerStyle = FAMILY_MARKER_TEMPLATE[family];
242
+ return `# Edit-format hint (auto-selected for ${family})
243
+ Preferred layer: Layer ${chain.primary}${chain.fallback.length > 0 ? ` (fallback: ${chain.fallback.map((l) => `Layer ${l}`).join(' -> ')})` : ''}.
244
+ Marker template: ${markerStyle}
245
+ The dispatcher accepts any marker family; this hint optimises apply-rate for the resolved model.`;
246
+ }
247
+ /**
248
+ * Marker template literal per family. Mirrors the three envelopes the
249
+ * marker-parser accepts; used by `renderEditFormatHint` so the model
250
+ * sees a concrete shape next to the layer recommendation.
251
+ */
252
+ const FAMILY_MARKER_TEMPLATE = {
253
+ anthropic: '+++ NEW <file> / <new contents> / --- OLD <file> / <old contents> / ===',
254
+ openai: '@@@ REWRITE <file> sha256=<hex> / <full new contents> / @@@ END',
255
+ gemini: '<<<<<<< SEARCH <file> / <old> / ======= / <new> / >>>>>>> REPLACE',
256
+ qwen: '<<<<<<< SEARCH <file> / <old> / ======= / <new> / >>>>>>> REPLACE',
257
+ deepseek: '@@@ REWRITE <file> sha256=<hex> / <full new contents> / @@@ END',
258
+ kimi: '@@@ REWRITE <file> sha256=<hex> / <full new contents> / @@@ END',
259
+ };
260
+ //# sourceMappingURL=format-detector.js.map
@@ -0,0 +1,26 @@
1
+ export const EDIT_FORMAT_MATRIX = {
2
+ 'claude-opus-4-7': { primary: 'C', fallback: ['A', 'B'] },
3
+ 'claude-sonnet-4-6': { primary: 'C', fallback: ['A', 'B'] },
4
+ 'claude-haiku-4-5': { primary: 'A', fallback: ['B'] },
5
+ 'gpt-5': { primary: 'C', fallback: ['A'] },
6
+ 'gpt-5-mini': { primary: 'A', fallback: ['B'] },
7
+ 'deepseek-v4-pro': { primary: 'A', fallback: ['B', 'C'] },
8
+ 'deepseek-coder-v2': { primary: 'A', fallback: ['B'] },
9
+ 'qwen3-coder-480b': { primary: 'D', fallback: ['A', 'B'] },
10
+ 'qwen3:0.6b': { primary: 'A', fallback: [] },
11
+ 'gemini-2.5-pro': { primary: 'C', fallback: ['A'] },
12
+ 'gemini-2.0-flash': { primary: 'A', fallback: ['B'] },
13
+ 'ollama:qwen3-coder:30b': { primary: 'A', fallback: ['B'] },
14
+ '*': { primary: 'A', fallback: ['B', 'C'] },
15
+ };
16
+ export function pickEditFormat(model, fileSize, isLSPAvailable = () => false) {
17
+ const chain = EDIT_FORMAT_MATRIX[model] ?? EDIT_FORMAT_MATRIX['*'] ?? { primary: 'A', fallback: [] };
18
+ if (chain.primary === 'C' && fileSize > 4000) {
19
+ return { primary: 'A', fallback: ['B'] };
20
+ }
21
+ if (chain.primary === 'D' && !isLSPAvailable()) {
22
+ return { primary: chain.fallback[0] ?? 'A', fallback: chain.fallback.slice(1) };
23
+ }
24
+ return chain;
25
+ }
26
+ //# sourceMappingURL=format-matrix.js.map