@bastani/atomic 0.9.11-alpha.5 → 0.9.11-alpha.7

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 (1127) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +12 -5
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  5. package/dist/builtin/mcp/README.md +3 -3
  6. package/dist/builtin/mcp/cli.js +0 -1
  7. package/dist/builtin/mcp/config.ts +0 -2
  8. package/dist/builtin/mcp/package.json +3 -3
  9. package/dist/builtin/mcp/types.ts +0 -1
  10. package/dist/builtin/subagents/CHANGELOG.md +12 -0
  11. package/dist/builtin/subagents/README.md +1 -1
  12. package/dist/builtin/subagents/agents/code-simplifier.md +47 -102
  13. package/dist/builtin/subagents/agents/codebase-analyzer.md +27 -130
  14. package/dist/builtin/subagents/agents/codebase-locator.md +24 -83
  15. package/dist/builtin/subagents/agents/codebase-online-researcher.md +60 -259
  16. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +29 -207
  17. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +28 -150
  18. package/dist/builtin/subagents/agents/codebase-research-locator.md +21 -118
  19. package/dist/builtin/subagents/agents/debugger.md +27 -65
  20. package/dist/builtin/subagents/agents/worker.md +23 -30
  21. package/dist/builtin/subagents/package.json +4 -4
  22. package/dist/builtin/subagents/prompts/gather-context-and-clarify.md +18 -11
  23. package/dist/builtin/subagents/prompts/parallel-cleanup.md +34 -33
  24. package/dist/builtin/subagents/prompts/parallel-context-build.md +22 -36
  25. package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +20 -52
  26. package/dist/builtin/subagents/prompts/parallel-research.md +17 -41
  27. package/dist/builtin/subagents/prompts/parallel-review.md +23 -28
  28. package/dist/builtin/subagents/prompts/review-loop.md +18 -27
  29. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +1 -1
  30. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +23 -4
  31. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
  32. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +10 -0
  33. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +1 -0
  34. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +2 -0
  35. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +8 -0
  36. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  37. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +6 -0
  38. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +2 -0
  39. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +7 -0
  40. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +1 -0
  41. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +3 -0
  42. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -2
  43. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -0
  44. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +5 -3
  45. package/dist/builtin/subagents/src/shared/settings.ts +4 -0
  46. package/dist/builtin/web-access/package.json +2 -2
  47. package/dist/builtin/workflows/CHANGELOG.md +44 -0
  48. package/dist/builtin/workflows/README.md +72 -70
  49. package/dist/builtin/workflows/ambient.d.ts +0 -5
  50. package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +7 -4
  51. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +1 -1
  52. package/dist/builtin/workflows/builtin/adversarial-verification.ts +2 -1
  53. package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +5 -2
  54. package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +5 -7
  55. package/dist/builtin/workflows/builtin/classify-and-act.ts +3 -2
  56. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +6 -3
  57. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +5 -5
  58. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +3 -2
  59. package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +7 -4
  60. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +6 -3
  61. package/dist/builtin/workflows/builtin/generate-and-filter.ts +3 -2
  62. package/dist/builtin/workflows/builtin/goal-models.ts +14 -18
  63. package/dist/builtin/workflows/builtin/goal-orchestrator-prompts.ts +39 -78
  64. package/dist/builtin/workflows/builtin/goal-prompts.ts +64 -244
  65. package/dist/builtin/workflows/builtin/goal-runner.ts +32 -64
  66. package/dist/builtin/workflows/builtin/goal.ts +2 -1
  67. package/dist/builtin/workflows/builtin/index.d.ts +17 -112
  68. package/dist/builtin/workflows/builtin/index.ts +1 -2
  69. package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +20 -12
  70. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +3 -0
  71. package/dist/builtin/workflows/builtin/loop-until-done.ts +3 -2
  72. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +52 -55
  73. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +45 -52
  74. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +41 -46
  75. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +16 -21
  76. package/dist/builtin/workflows/builtin/open-claude-design.ts +2 -1
  77. package/dist/builtin/workflows/builtin/ralph-core.ts +61 -57
  78. package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +41 -45
  79. package/dist/builtin/workflows/builtin/ralph-models.ts +33 -43
  80. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +35 -120
  81. package/dist/builtin/workflows/builtin/ralph-runner.ts +81 -108
  82. package/dist/builtin/workflows/builtin/ralph.ts +2 -1
  83. package/dist/builtin/workflows/builtin/shared-prompts.ts +110 -93
  84. package/dist/builtin/workflows/builtin/steering-context.ts +51 -0
  85. package/dist/builtin/workflows/builtin/tournament-prompts.ts +21 -12
  86. package/dist/builtin/workflows/builtin/tournament-runner.ts +3 -0
  87. package/dist/builtin/workflows/builtin/tournament.ts +3 -2
  88. package/dist/builtin/workflows/package.json +2 -2
  89. package/dist/builtin/workflows/skills/create-spec/SKILL.md +1 -1
  90. package/dist/builtin/workflows/skills/impeccable/SKILL.md +33 -129
  91. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +11 -3
  92. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +26 -0
  93. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +35 -0
  94. package/dist/builtin/workflows/skills/impeccable/reference/android.md +1 -1
  95. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +72 -189
  96. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +10 -9
  97. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +2 -2
  98. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +19 -108
  99. package/dist/builtin/workflows/skills/impeccable/reference/clarify.md +59 -253
  100. package/dist/builtin/workflows/skills/impeccable/reference/colorize.md +51 -222
  101. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +45 -0
  102. package/dist/builtin/workflows/skills/impeccable/reference/craft.md +3 -121
  103. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +28 -20
  104. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +97 -0
  105. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +23 -0
  106. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +32 -0
  107. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  108. package/dist/builtin/workflows/skills/impeccable/reference/delight.md +47 -279
  109. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +2 -2
  110. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +53 -0
  111. package/dist/builtin/workflows/skills/impeccable/reference/document.md +60 -73
  112. package/dist/builtin/workflows/skills/impeccable/reference/harden.md +1 -12
  113. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +23 -12
  114. package/dist/builtin/workflows/skills/impeccable/reference/init.md +64 -163
  115. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +1 -1
  116. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +52 -153
  117. package/dist/builtin/workflows/skills/impeccable/reference/live.md +47 -36
  118. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +105 -0
  119. package/dist/builtin/workflows/skills/impeccable/reference/{product.md → operate.md} +6 -5
  120. package/dist/builtin/workflows/skills/impeccable/reference/optimize.md +4 -4
  121. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -4
  122. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +68 -212
  123. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +3 -3
  124. package/dist/builtin/workflows/skills/impeccable/reference/routing.md +18 -0
  125. package/dist/builtin/workflows/skills/impeccable/reference/shape.md +38 -144
  126. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +48 -269
  127. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +38 -0
  128. package/dist/builtin/workflows/skills/impeccable/scripts/command-metadata.json +1 -1
  129. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +584 -0
  130. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +117 -9
  131. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +486 -59
  132. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +16 -45
  133. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +96 -10
  134. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +143 -26
  135. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +181 -12
  136. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +3187 -182
  137. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +102 -7
  138. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +282 -70
  139. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +183 -15
  140. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +22 -7
  141. package/dist/builtin/workflows/skills/impeccable/scripts/detector/findings.mjs +7 -1
  142. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +16 -2
  143. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +155 -42
  144. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +2988 -155
  145. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/constants.mjs +11 -0
  146. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +336 -0
  147. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +232 -0
  148. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +92 -30
  149. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +414 -120
  150. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +25 -8
  151. package/dist/builtin/workflows/skills/impeccable/scripts/lib/artifact-schema.mjs +93 -0
  152. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +165 -0
  153. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +329 -0
  154. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +20 -5
  155. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-paths.mjs +16 -8
  156. package/dist/builtin/workflows/skills/impeccable/scripts/lib/provider.mjs +1 -0
  157. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +455 -0
  158. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-notice.mjs +169 -0
  159. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +457 -0
  160. package/dist/builtin/workflows/skills/impeccable/scripts/lib/surface-briefs.mjs +151 -0
  161. package/dist/builtin/workflows/skills/impeccable/scripts/lib/target-slug.mjs +33 -0
  162. package/dist/builtin/workflows/skills/impeccable/scripts/lib/template-extensions.mjs +146 -0
  163. package/dist/builtin/workflows/skills/impeccable/scripts/live/completion.mjs +10 -1
  164. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +15 -0
  165. package/dist/builtin/workflows/skills/impeccable/scripts/live/generation-preflight.mjs +149 -0
  166. package/dist/builtin/workflows/skills/impeccable/scripts/live/poll-lanes.mjs +14 -0
  167. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +109 -32
  168. package/dist/builtin/workflows/skills/impeccable/scripts/live/source-lock.mjs +105 -0
  169. package/dist/builtin/workflows/skills/impeccable/scripts/live/source-search.mjs +105 -0
  170. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +8 -6
  171. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
  172. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +208 -68
  173. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +565 -115
  174. package/dist/builtin/workflows/skills/impeccable/scripts/live-commit-manual-edits.mjs +3 -0
  175. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +198 -14
  176. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +24 -6
  177. package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +6 -1
  178. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +44 -14
  179. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +398 -33
  180. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +9 -5
  181. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +81 -67
  182. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +7 -2
  183. package/dist/builtin/workflows/skills/impeccable/scripts/palette.mjs +76 -81
  184. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +4 -4
  185. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +890 -0
  186. package/dist/builtin/workflows/skills/impeccable/scripts/surface-brief.mjs +74 -0
  187. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +57 -252
  188. package/dist/builtin/workflows/skills/prompt-engineer/references/advanced_patterns.md +70 -226
  189. package/dist/builtin/workflows/skills/prompt-engineer/references/core_prompting.md +64 -103
  190. package/dist/builtin/workflows/skills/prompt-engineer/references/quality_improvement.md +81 -155
  191. package/dist/builtin/workflows/src/authoring.d.ts +5 -1
  192. package/dist/builtin/workflows/src/durable/backend.ts +68 -9
  193. package/dist/builtin/workflows/src/durable/boundary-lifecycle.ts +148 -0
  194. package/dist/builtin/workflows/src/durable/boundary-topology.ts +420 -0
  195. package/dist/builtin/workflows/src/durable/child-invocation.ts +14 -0
  196. package/dist/builtin/workflows/src/durable/child-primitive.ts +74 -44
  197. package/dist/builtin/workflows/src/durable/completed-catalog-stage-groups.ts +250 -0
  198. package/dist/builtin/workflows/src/durable/completed-catalog.ts +205 -131
  199. package/dist/builtin/workflows/src/durable/completed-inspection.ts +8 -2
  200. package/dist/builtin/workflows/src/durable/completed-subtree.ts +31 -0
  201. package/dist/builtin/workflows/src/durable/dbos-backend.ts +28 -24
  202. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +130 -3
  203. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +18 -0
  204. package/dist/builtin/workflows/src/durable/scoped-backend.ts +64 -17
  205. package/dist/builtin/workflows/src/durable/stage-primitive.ts +60 -60
  206. package/dist/builtin/workflows/src/durable/stage-topology-validation.ts +234 -0
  207. package/dist/builtin/workflows/src/durable/stage-topology.ts +53 -0
  208. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +49 -0
  209. package/dist/builtin/workflows/src/durable/tool-outcome.ts +120 -0
  210. package/dist/builtin/workflows/src/durable/tool-primitive.ts +367 -58
  211. package/dist/builtin/workflows/src/durable/types.ts +97 -0
  212. package/dist/builtin/workflows/src/durable/ui-primitive.ts +46 -0
  213. package/dist/builtin/workflows/src/durable/workflow-child-result.ts +58 -0
  214. package/dist/builtin/workflows/src/engine/options.ts +1 -0
  215. package/dist/builtin/workflows/src/engine/primitives/workflow.ts +19 -10
  216. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +11 -1
  217. package/dist/builtin/workflows/src/engine/run-durable-topology.ts +190 -18
  218. package/dist/builtin/workflows/src/engine/run-terminal-event.ts +37 -0
  219. package/dist/builtin/workflows/src/engine/run-terminal-failure.ts +50 -0
  220. package/dist/builtin/workflows/src/engine/run-tool-execution-tracker.ts +152 -0
  221. package/dist/builtin/workflows/src/engine/run-tool-node-lifecycle.ts +87 -0
  222. package/dist/builtin/workflows/src/engine/run.ts +111 -110
  223. package/dist/builtin/workflows/src/engine/runtime.ts +15 -2
  224. package/dist/builtin/workflows/src/extension/extension-factory.ts +1 -0
  225. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +11 -0
  226. package/dist/builtin/workflows/src/extension/index.bundle.mjs +6710 -4810
  227. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +16 -5
  228. package/dist/builtin/workflows/src/extension/render-result.ts +16 -2
  229. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +3 -0
  230. package/dist/builtin/workflows/src/extension/runtime.ts +4 -0
  231. package/dist/builtin/workflows/src/extension/wiring.ts +3 -1
  232. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +1 -0
  233. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +9 -3
  234. package/dist/builtin/workflows/src/extension/workflow-module-loader.ts +18 -3
  235. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +22 -11
  236. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +43 -0
  237. package/dist/builtin/workflows/src/extension/workflow-targets.ts +34 -30
  238. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +12 -5
  239. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +162 -63
  240. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +7 -1
  241. package/dist/builtin/workflows/src/runs/background/status.ts +18 -8
  242. package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +3 -11
  243. package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +24 -21
  244. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  245. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +30 -13
  246. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +102 -53
  247. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +13 -5
  248. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +49 -17
  249. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +11 -4
  250. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +1 -0
  251. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
  252. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +7 -1
  253. package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +53 -4
  254. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +146 -17
  255. package/dist/builtin/workflows/src/runs/foreground/stage-delivery-activity.ts +86 -0
  256. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +18 -6
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +45 -46
  258. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +5 -1
  259. package/dist/builtin/workflows/src/runs/foreground/stage-runner-pause.ts +195 -0
  260. package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +8 -0
  261. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +0 -13
  262. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +30 -2
  263. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +3 -143
  264. package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
  265. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +6 -11
  266. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +6 -11
  267. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +57 -6
  268. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +76 -11
  269. package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +206 -116
  270. package/dist/builtin/workflows/src/shared/intercom-group.ts +17 -10
  271. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +30 -0
  272. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +5 -0
  273. package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +3 -3
  274. package/dist/builtin/workflows/src/shared/store-factory.ts +2 -0
  275. package/dist/builtin/workflows/src/shared/store-internal.ts +8 -0
  276. package/dist/builtin/workflows/src/shared/store-public-types.ts +8 -0
  277. package/dist/builtin/workflows/src/shared/store-run-methods.ts +9 -0
  278. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +2 -0
  279. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +46 -0
  280. package/dist/builtin/workflows/src/shared/store-types.ts +34 -0
  281. package/dist/builtin/workflows/src/shared/types.ts +14 -24
  282. package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +11 -5
  283. package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +58 -0
  284. package/dist/builtin/workflows/src/shared/workflow-run-ownership.ts +53 -0
  285. package/dist/builtin/workflows/src/tui/graph-view-input.ts +2 -8
  286. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +11 -4
  287. package/dist/builtin/workflows/src/tui/graph-view-render.ts +1 -0
  288. package/dist/builtin/workflows/src/tui/graph-view-state.ts +27 -9
  289. package/dist/builtin/workflows/src/tui/graph-view-types.ts +4 -3
  290. package/dist/builtin/workflows/src/tui/node-card.ts +4 -3
  291. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +0 -4
  292. package/dist/builtin/workflows/src/tui/run-detail.ts +53 -17
  293. package/dist/builtin/workflows/src/tui/session-list.ts +8 -4
  294. package/dist/builtin/workflows/src/tui/stage-chat-view-delivery-activity.ts +121 -0
  295. package/dist/builtin/workflows/src/tui/stage-chat-view-live-events.ts +42 -0
  296. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +12 -0
  297. package/dist/builtin/workflows/src/tui/stage-chat-view-render-settings.ts +21 -1
  298. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +19 -19
  299. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +4 -0
  300. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +4 -2
  301. package/dist/builtin/workflows/src/tui/switcher.ts +13 -3
  302. package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +1 -1
  303. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +0 -9
  304. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +16 -49
  305. package/dist/builtin/workflows/src/tui/workflow-status.ts +7 -0
  306. package/dist/builtin/workflows/src/workflows/identity.ts +1 -1
  307. package/dist/cli/args.d.ts +0 -1
  308. package/dist/cli/args.d.ts.map +1 -1
  309. package/dist/cli/args.js +1 -20
  310. package/dist/cli/args.js.map +1 -1
  311. package/dist/cli/config-selector.js +1 -1
  312. package/dist/cli/config-selector.js.map +1 -1
  313. package/dist/cli/list-models.d.ts.map +1 -1
  314. package/dist/cli/list-models.js +1 -2
  315. package/dist/cli/list-models.js.map +1 -1
  316. package/dist/cli/session-picker.d.ts.map +1 -1
  317. package/dist/cli/session-picker.js +2 -1
  318. package/dist/cli/session-picker.js.map +1 -1
  319. package/dist/cli/startup-ui.js +2 -2
  320. package/dist/cli/startup-ui.js.map +1 -1
  321. package/dist/config-self-update.js +1 -1
  322. package/dist/config-self-update.js.map +1 -1
  323. package/dist/config.d.ts +2 -0
  324. package/dist/config.d.ts.map +1 -1
  325. package/dist/config.js +34 -10
  326. package/dist/config.js.map +1 -1
  327. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  328. package/dist/core/agent-session-accessors.js +2 -1
  329. package/dist/core/agent-session-accessors.js.map +1 -1
  330. package/dist/core/agent-session-auto-compaction.d.ts +4 -3
  331. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  332. package/dist/core/agent-session-auto-compaction.js +55 -59
  333. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  334. package/dist/core/agent-session-bash.d.ts +9 -6
  335. package/dist/core/agent-session-bash.d.ts.map +1 -1
  336. package/dist/core/agent-session-bash.js +32 -13
  337. package/dist/core/agent-session-bash.js.map +1 -1
  338. package/dist/core/agent-session-compaction.d.ts +11 -1
  339. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  340. package/dist/core/agent-session-compaction.js +87 -19
  341. package/dist/core/agent-session-compaction.js.map +1 -1
  342. package/dist/core/agent-session-custom-message-commit.d.ts +14 -0
  343. package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -0
  344. package/dist/core/agent-session-custom-message-commit.js +141 -0
  345. package/dist/core/agent-session-custom-message-commit.js.map +1 -0
  346. package/dist/core/agent-session-delivery-forwarding.d.ts +9 -0
  347. package/dist/core/agent-session-delivery-forwarding.d.ts.map +1 -0
  348. package/dist/core/agent-session-delivery-forwarding.js +36 -0
  349. package/dist/core/agent-session-delivery-forwarding.js.map +1 -0
  350. package/dist/core/agent-session-events.d.ts +1 -1
  351. package/dist/core/agent-session-events.d.ts.map +1 -1
  352. package/dist/core/agent-session-events.js +45 -14
  353. package/dist/core/agent-session-events.js.map +1 -1
  354. package/dist/core/agent-session-extension-bindings.d.ts +2 -6
  355. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  356. package/dist/core/agent-session-extension-bindings.js +18 -11
  357. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  358. package/dist/core/agent-session-message-queue.d.ts +5 -2
  359. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  360. package/dist/core/agent-session-message-queue.js +91 -97
  361. package/dist/core/agent-session-message-queue.js.map +1 -1
  362. package/dist/core/agent-session-methods.d.ts +47 -39
  363. package/dist/core/agent-session-methods.d.ts.map +1 -1
  364. package/dist/core/agent-session-methods.js.map +1 -1
  365. package/dist/core/agent-session-models.d.ts +2 -38
  366. package/dist/core/agent-session-models.d.ts.map +1 -1
  367. package/dist/core/agent-session-models.js +5 -147
  368. package/dist/core/agent-session-models.js.map +1 -1
  369. package/dist/core/agent-session-persistent-custom-messages.d.ts +47 -0
  370. package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -0
  371. package/dist/core/agent-session-persistent-custom-messages.js +267 -0
  372. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -0
  373. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  374. package/dist/core/agent-session-post-tool-compaction.js +34 -9
  375. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  376. package/dist/core/agent-session-prompt.d.ts +2 -0
  377. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  378. package/dist/core/agent-session-prompt.js +42 -16
  379. package/dist/core/agent-session-prompt.js.map +1 -1
  380. package/dist/core/agent-session-queue-pause.d.ts +10 -0
  381. package/dist/core/agent-session-queue-pause.d.ts.map +1 -0
  382. package/dist/core/agent-session-queue-pause.js +86 -0
  383. package/dist/core/agent-session-queue-pause.js.map +1 -0
  384. package/dist/core/agent-session-retry.d.ts +0 -11
  385. package/dist/core/agent-session-retry.d.ts.map +1 -1
  386. package/dist/core/agent-session-retry.js +8 -57
  387. package/dist/core/agent-session-retry.js.map +1 -1
  388. package/dist/core/agent-session-runtime-auth.d.ts +6 -0
  389. package/dist/core/agent-session-runtime-auth.d.ts.map +1 -0
  390. package/dist/core/agent-session-runtime-auth.js +26 -0
  391. package/dist/core/agent-session-runtime-auth.js.map +1 -0
  392. package/dist/core/agent-session-runtime.d.ts +13 -2
  393. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  394. package/dist/core/agent-session-runtime.js +32 -6
  395. package/dist/core/agent-session-runtime.js.map +1 -1
  396. package/dist/core/agent-session-services.d.ts +0 -2
  397. package/dist/core/agent-session-services.d.ts.map +1 -1
  398. package/dist/core/agent-session-services.js +6 -7
  399. package/dist/core/agent-session-services.js.map +1 -1
  400. package/dist/core/agent-session-state.d.ts.map +1 -1
  401. package/dist/core/agent-session-state.js +3 -0
  402. package/dist/core/agent-session-state.js.map +1 -1
  403. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  404. package/dist/core/agent-session-tool-hooks.js +6 -1
  405. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  406. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  407. package/dist/core/agent-session-tool-registry.js +2 -18
  408. package/dist/core/agent-session-tool-registry.js.map +1 -1
  409. package/dist/core/agent-session-transfer.d.ts +4 -0
  410. package/dist/core/agent-session-transfer.d.ts.map +1 -0
  411. package/dist/core/agent-session-transfer.js +71 -0
  412. package/dist/core/agent-session-transfer.js.map +1 -0
  413. package/dist/core/agent-session-tree.js +1 -1
  414. package/dist/core/agent-session-tree.js.map +1 -1
  415. package/dist/core/agent-session-types.d.ts +5 -11
  416. package/dist/core/agent-session-types.d.ts.map +1 -1
  417. package/dist/core/agent-session-types.js +0 -3
  418. package/dist/core/agent-session-types.js.map +1 -1
  419. package/dist/core/agent-session.d.ts +12 -2
  420. package/dist/core/agent-session.d.ts.map +1 -1
  421. package/dist/core/agent-session.js +8 -2
  422. package/dist/core/agent-session.js.map +1 -1
  423. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  424. package/dist/core/atomic-guide-command.js +31 -33
  425. package/dist/core/atomic-guide-command.js.map +1 -1
  426. package/dist/core/auth-storage.js +2 -2
  427. package/dist/core/auth-storage.js.map +1 -1
  428. package/dist/core/bash-executor.d.ts +5 -3
  429. package/dist/core/bash-executor.d.ts.map +1 -1
  430. package/dist/core/bash-executor.js +5 -4
  431. package/dist/core/bash-executor.js.map +1 -1
  432. package/dist/core/builtin-packages.d.ts.map +1 -1
  433. package/dist/core/builtin-packages.js +0 -6
  434. package/dist/core/builtin-packages.js.map +1 -1
  435. package/dist/core/compaction/branch-summarization.d.ts +8 -3
  436. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  437. package/dist/core/compaction/branch-summarization.js +17 -6
  438. package/dist/core/compaction/branch-summarization.js.map +1 -1
  439. package/dist/core/compaction/compaction-boundary.d.ts +18 -1
  440. package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
  441. package/dist/core/compaction/compaction-boundary.js +2 -2
  442. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  443. package/dist/core/compaction/compaction-runner.d.ts +61 -6
  444. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  445. package/dist/core/compaction/compaction-runner.js +242 -18
  446. package/dist/core/compaction/compaction-runner.js.map +1 -1
  447. package/dist/core/compaction/compaction-types.d.ts +53 -2
  448. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  449. package/dist/core/compaction/compaction-types.js.map +1 -1
  450. package/dist/core/compaction/fallback-planner.d.ts +64 -0
  451. package/dist/core/compaction/fallback-planner.d.ts.map +1 -0
  452. package/dist/core/compaction/fallback-planner.js +75 -0
  453. package/dist/core/compaction/fallback-planner.js.map +1 -0
  454. package/dist/core/compaction/index.d.ts +3 -0
  455. package/dist/core/compaction/index.d.ts.map +1 -1
  456. package/dist/core/compaction/index.js +3 -0
  457. package/dist/core/compaction/index.js.map +1 -1
  458. package/dist/core/compaction/planner-outcome.d.ts +86 -0
  459. package/dist/core/compaction/planner-outcome.d.ts.map +1 -0
  460. package/dist/core/compaction/planner-outcome.js +122 -0
  461. package/dist/core/compaction/planner-outcome.js.map +1 -0
  462. package/dist/core/compaction/range-planner-diagnostics.d.ts +58 -6
  463. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
  464. package/dist/core/compaction/range-planner-diagnostics.js +69 -31
  465. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
  466. package/dist/core/compaction/range-planner.d.ts +36 -8
  467. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  468. package/dist/core/compaction/range-planner.js +136 -51
  469. package/dist/core/compaction/range-planner.js.map +1 -1
  470. package/dist/core/compaction/region-trimming.d.ts +34 -0
  471. package/dist/core/compaction/region-trimming.d.ts.map +1 -0
  472. package/dist/core/compaction/region-trimming.js +73 -0
  473. package/dist/core/compaction/region-trimming.js.map +1 -0
  474. package/dist/core/compaction/transcript-serialization.d.ts +8 -1
  475. package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
  476. package/dist/core/compaction/transcript-serialization.js +78 -27
  477. package/dist/core/compaction/transcript-serialization.js.map +1 -1
  478. package/dist/core/context-tool-pairing.d.ts +19 -0
  479. package/dist/core/context-tool-pairing.d.ts.map +1 -0
  480. package/dist/core/context-tool-pairing.js +50 -0
  481. package/dist/core/context-tool-pairing.js.map +1 -0
  482. package/dist/core/diagnostics.d.ts +8 -0
  483. package/dist/core/diagnostics.d.ts.map +1 -1
  484. package/dist/core/diagnostics.js.map +1 -1
  485. package/dist/core/extensions/context-types.d.ts +3 -0
  486. package/dist/core/extensions/context-types.d.ts.map +1 -1
  487. package/dist/core/extensions/context-types.js.map +1 -1
  488. package/dist/core/extensions/index.d.ts +2 -0
  489. package/dist/core/extensions/index.d.ts.map +1 -1
  490. package/dist/core/extensions/index.js.map +1 -1
  491. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  492. package/dist/core/extensions/loader-api.js +48 -27
  493. package/dist/core/extensions/loader-api.js.map +1 -1
  494. package/dist/core/extensions/loader-runtime.d.ts +2 -4
  495. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  496. package/dist/core/extensions/loader-runtime.js +199 -18
  497. package/dist/core/extensions/loader-runtime.js.map +1 -1
  498. package/dist/core/extensions/message-types.d.ts +7 -4
  499. package/dist/core/extensions/message-types.d.ts.map +1 -1
  500. package/dist/core/extensions/message-types.js.map +1 -1
  501. package/dist/core/extensions/provider-types.d.ts +9 -4
  502. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  503. package/dist/core/extensions/provider-types.js.map +1 -1
  504. package/dist/core/extensions/runner-context.d.ts +2 -0
  505. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  506. package/dist/core/extensions/runner-context.js +4 -0
  507. package/dist/core/extensions/runner-context.js.map +1 -1
  508. package/dist/core/extensions/runner.d.ts +1 -0
  509. package/dist/core/extensions/runner.d.ts.map +1 -1
  510. package/dist/core/extensions/runner.js +28 -20
  511. package/dist/core/extensions/runner.js.map +1 -1
  512. package/dist/core/extensions/runtime-types.d.ts +25 -0
  513. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  514. package/dist/core/extensions/runtime-types.js.map +1 -1
  515. package/dist/core/extensions/tool-types.d.ts +7 -3
  516. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  517. package/dist/core/extensions/tool-types.js.map +1 -1
  518. package/dist/core/extensions/ui-types.d.ts +14 -4
  519. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  520. package/dist/core/extensions/ui-types.js.map +1 -1
  521. package/dist/core/fallback-models.d.ts +37 -0
  522. package/dist/core/fallback-models.d.ts.map +1 -0
  523. package/dist/core/fallback-models.js +48 -0
  524. package/dist/core/fallback-models.js.map +1 -0
  525. package/dist/core/flattened-tool-arguments.d.ts +4 -7
  526. package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
  527. package/dist/core/flattened-tool-arguments.js +4 -7
  528. package/dist/core/flattened-tool-arguments.js.map +1 -1
  529. package/dist/core/http-dispatcher.d.ts.map +1 -1
  530. package/dist/core/http-dispatcher.js +0 -5
  531. package/dist/core/http-dispatcher.js.map +1 -1
  532. package/dist/core/messages.d.ts +14 -2
  533. package/dist/core/messages.d.ts.map +1 -1
  534. package/dist/core/messages.js +28 -4
  535. package/dist/core/messages.js.map +1 -1
  536. package/dist/core/model-capabilities.d.ts +18 -0
  537. package/dist/core/model-capabilities.d.ts.map +1 -0
  538. package/dist/core/model-capabilities.js +23 -0
  539. package/dist/core/model-capabilities.js.map +1 -0
  540. package/dist/core/model-registry-auth.d.ts.map +1 -1
  541. package/dist/core/model-registry-auth.js +0 -2
  542. package/dist/core/model-registry-auth.js.map +1 -1
  543. package/dist/core/model-registry-builtins.d.ts +0 -2
  544. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  545. package/dist/core/model-registry-builtins.js +9 -76
  546. package/dist/core/model-registry-builtins.js.map +1 -1
  547. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  548. package/dist/core/model-registry-custom-loader.js +1 -12
  549. package/dist/core/model-registry-custom-loader.js.map +1 -1
  550. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  551. package/dist/core/model-registry-dynamic.js +3 -15
  552. package/dist/core/model-registry-dynamic.js.map +1 -1
  553. package/dist/core/model-registry-extension-refresh.d.ts +23 -0
  554. package/dist/core/model-registry-extension-refresh.d.ts.map +1 -0
  555. package/dist/core/model-registry-extension-refresh.js +32 -0
  556. package/dist/core/model-registry-extension-refresh.js.map +1 -0
  557. package/dist/core/model-registry-schemas.d.ts +118 -9
  558. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  559. package/dist/core/model-registry-schemas.js +10 -3
  560. package/dist/core/model-registry-schemas.js.map +1 -1
  561. package/dist/core/model-registry-types.d.ts +5 -5
  562. package/dist/core/model-registry-types.d.ts.map +1 -1
  563. package/dist/core/model-registry-types.js.map +1 -1
  564. package/dist/core/model-registry-validation.d.ts +7 -0
  565. package/dist/core/model-registry-validation.d.ts.map +1 -0
  566. package/dist/core/model-registry-validation.js +12 -0
  567. package/dist/core/model-registry-validation.js.map +1 -0
  568. package/dist/core/model-registry.d.ts +5 -3
  569. package/dist/core/model-registry.d.ts.map +1 -1
  570. package/dist/core/model-registry.js +34 -33
  571. package/dist/core/model-registry.js.map +1 -1
  572. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  573. package/dist/core/model-resolver-defaults.js +0 -1
  574. package/dist/core/model-resolver-defaults.js.map +1 -1
  575. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  576. package/dist/core/model-resolver-initial.js +9 -0
  577. package/dist/core/model-resolver-initial.js.map +1 -1
  578. package/dist/core/model-resolver-patterns.d.ts.map +1 -1
  579. package/dist/core/model-resolver-patterns.js +0 -2
  580. package/dist/core/model-resolver-patterns.js.map +1 -1
  581. package/dist/core/model-resolver-scope.d.ts +2 -0
  582. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  583. package/dist/core/model-resolver-scope.js +18 -4
  584. package/dist/core/model-resolver-scope.js.map +1 -1
  585. package/dist/core/model-resolver-types.d.ts +2 -0
  586. package/dist/core/model-resolver-types.d.ts.map +1 -1
  587. package/dist/core/model-resolver-types.js.map +1 -1
  588. package/dist/core/oauth-provider-bridge.d.ts +21 -0
  589. package/dist/core/oauth-provider-bridge.d.ts.map +1 -1
  590. package/dist/core/oauth-provider-bridge.js +68 -7
  591. package/dist/core/oauth-provider-bridge.js.map +1 -1
  592. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  593. package/dist/core/package-manager-auto-resources.js +12 -4
  594. package/dist/core/package-manager-auto-resources.js.map +1 -1
  595. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  596. package/dist/core/package-manager-resolver.js +42 -11
  597. package/dist/core/package-manager-resolver.js.map +1 -1
  598. package/dist/core/package-manager-types.d.ts +2 -0
  599. package/dist/core/package-manager-types.d.ts.map +1 -1
  600. package/dist/core/package-manager-types.js.map +1 -1
  601. package/dist/core/package-manager.d.ts +1 -1
  602. package/dist/core/package-manager.d.ts.map +1 -1
  603. package/dist/core/package-manager.js.map +1 -1
  604. package/dist/core/remote-catalog-provider.d.ts +1 -1
  605. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  606. package/dist/core/remote-catalog-provider.js +17 -11
  607. package/dist/core/remote-catalog-provider.js.map +1 -1
  608. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  609. package/dist/core/resource-loader-assets.js +30 -4
  610. package/dist/core/resource-loader-assets.js.map +1 -1
  611. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  612. package/dist/core/resource-loader-context-files.js +3 -1
  613. package/dist/core/resource-loader-context-files.js.map +1 -1
  614. package/dist/core/resource-loader-core.d.ts +2 -1
  615. package/dist/core/resource-loader-core.d.ts.map +1 -1
  616. package/dist/core/resource-loader-core.js +3 -0
  617. package/dist/core/resource-loader-core.js.map +1 -1
  618. package/dist/core/resource-loader-extensions.d.ts +1 -0
  619. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  620. package/dist/core/resource-loader-extensions.js +120 -7
  621. package/dist/core/resource-loader-extensions.js.map +1 -1
  622. package/dist/core/resource-loader-package-resources.d.ts.map +1 -1
  623. package/dist/core/resource-loader-package-resources.js +14 -1
  624. package/dist/core/resource-loader-package-resources.js.map +1 -1
  625. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  626. package/dist/core/resource-loader-reload.js +2 -1
  627. package/dist/core/resource-loader-reload.js.map +1 -1
  628. package/dist/core/resource-loader-source-info.d.ts.map +1 -1
  629. package/dist/core/resource-loader-source-info.js +6 -3
  630. package/dist/core/resource-loader-source-info.js.map +1 -1
  631. package/dist/core/sdk-types.d.ts +11 -10
  632. package/dist/core/sdk-types.d.ts.map +1 -1
  633. package/dist/core/sdk-types.js.map +1 -1
  634. package/dist/core/sdk.d.ts +1 -0
  635. package/dist/core/sdk.d.ts.map +1 -1
  636. package/dist/core/sdk.js +13 -84
  637. package/dist/core/sdk.js.map +1 -1
  638. package/dist/core/session-manager-core.d.ts +3 -3
  639. package/dist/core/session-manager-core.d.ts.map +1 -1
  640. package/dist/core/session-manager-core.js +18 -25
  641. package/dist/core/session-manager-core.js.map +1 -1
  642. package/dist/core/session-manager-entries.d.ts +2 -5
  643. package/dist/core/session-manager-entries.d.ts.map +1 -1
  644. package/dist/core/session-manager-entries.js +2 -8
  645. package/dist/core/session-manager-entries.js.map +1 -1
  646. package/dist/core/session-manager-history.d.ts +3 -3
  647. package/dist/core/session-manager-history.d.ts.map +1 -1
  648. package/dist/core/session-manager-history.js +49 -27
  649. package/dist/core/session-manager-history.js.map +1 -1
  650. package/dist/core/session-manager-storage.d.ts +6 -0
  651. package/dist/core/session-manager-storage.d.ts.map +1 -1
  652. package/dist/core/session-manager-storage.js +38 -5
  653. package/dist/core/session-manager-storage.js.map +1 -1
  654. package/dist/core/session-manager-types.d.ts +6 -6
  655. package/dist/core/session-manager-types.d.ts.map +1 -1
  656. package/dist/core/session-manager-types.js.map +1 -1
  657. package/dist/core/session-manager.d.ts +1 -1
  658. package/dist/core/session-manager.d.ts.map +1 -1
  659. package/dist/core/session-manager.js.map +1 -1
  660. package/dist/core/settings-manager-basic-accessors.d.ts +0 -4
  661. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  662. package/dist/core/settings-manager-basic-accessors.js +0 -50
  663. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  664. package/dist/core/settings-manager-core.d.ts +2 -4
  665. package/dist/core/settings-manager-core.d.ts.map +1 -1
  666. package/dist/core/settings-manager-core.js +5 -51
  667. package/dist/core/settings-manager-core.js.map +1 -1
  668. package/dist/core/settings-manager.d.ts +1 -1
  669. package/dist/core/settings-manager.d.ts.map +1 -1
  670. package/dist/core/settings-manager.js.map +1 -1
  671. package/dist/core/settings-storage.d.ts +3 -1
  672. package/dist/core/settings-storage.d.ts.map +1 -1
  673. package/dist/core/settings-storage.js +22 -0
  674. package/dist/core/settings-storage.js.map +1 -1
  675. package/dist/core/settings-types.d.ts +2 -4
  676. package/dist/core/settings-types.d.ts.map +1 -1
  677. package/dist/core/settings-types.js.map +1 -1
  678. package/dist/core/slash-commands.d.ts.map +1 -1
  679. package/dist/core/slash-commands.js +68 -22
  680. package/dist/core/slash-commands.js.map +1 -1
  681. package/dist/core/source-info.d.ts +3 -1
  682. package/dist/core/source-info.d.ts.map +1 -1
  683. package/dist/core/source-info.js +2 -0
  684. package/dist/core/source-info.js.map +1 -1
  685. package/dist/core/tools/ask-user-question/ask-user-question.js +1 -1
  686. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  687. package/dist/core/tools/bash-session-environment.d.ts +13 -0
  688. package/dist/core/tools/bash-session-environment.d.ts.map +1 -0
  689. package/dist/core/tools/bash-session-environment.js +35 -0
  690. package/dist/core/tools/bash-session-environment.js.map +1 -0
  691. package/dist/core/tools/bash.d.ts +4 -1
  692. package/dist/core/tools/bash.d.ts.map +1 -1
  693. package/dist/core/tools/bash.js +16 -8
  694. package/dist/core/tools/bash.js.map +1 -1
  695. package/dist/core/tools/tool-definition-wrapper.d.ts +3 -0
  696. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  697. package/dist/core/tools/tool-definition-wrapper.js +10 -2
  698. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  699. package/dist/extensions/index.js +1 -1
  700. package/dist/extensions/index.js.map +1 -1
  701. package/dist/extensions/llama/provider.d.ts +3 -2
  702. package/dist/extensions/llama/provider.d.ts.map +1 -1
  703. package/dist/extensions/llama/provider.js +9 -3
  704. package/dist/extensions/llama/provider.js.map +1 -1
  705. package/dist/index-extensions.d.ts +1 -1
  706. package/dist/index-extensions.d.ts.map +1 -1
  707. package/dist/index-extensions.js.map +1 -1
  708. package/dist/index.d.ts +2 -3
  709. package/dist/index.d.ts.map +1 -1
  710. package/dist/index.js +1 -2
  711. package/dist/index.js.map +1 -1
  712. package/dist/main-session-options.d.ts.map +1 -1
  713. package/dist/main-session-options.js +0 -4
  714. package/dist/main-session-options.js.map +1 -1
  715. package/dist/main-session.d.ts.map +1 -1
  716. package/dist/main-session.js +2 -1
  717. package/dist/main-session.js.map +1 -1
  718. package/dist/main.d.ts.map +1 -1
  719. package/dist/main.js +1 -17
  720. package/dist/main.js.map +1 -1
  721. package/dist/modes/index.d.ts +1 -1
  722. package/dist/modes/index.d.ts.map +1 -1
  723. package/dist/modes/index.js.map +1 -1
  724. package/dist/modes/interactive/chat-input-actions.d.ts +1 -1
  725. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
  726. package/dist/modes/interactive/chat-input-actions.js +14 -96
  727. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  728. package/dist/modes/interactive/components/atomic-banner.d.ts +9 -8
  729. package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
  730. package/dist/modes/interactive/components/atomic-banner.js +68 -24
  731. package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
  732. package/dist/modes/interactive/components/atomic-working-status.d.ts +52 -0
  733. package/dist/modes/interactive/components/atomic-working-status.d.ts.map +1 -0
  734. package/dist/modes/interactive/components/atomic-working-status.js +202 -0
  735. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -0
  736. package/dist/modes/interactive/components/chat-message-renderer.js +1 -1
  737. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  738. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  739. package/dist/modes/interactive/components/chat-session-host-actions.js +87 -7
  740. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  741. package/dist/modes/interactive/components/chat-session-host-editor.js +3 -3
  742. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
  743. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  744. package/dist/modes/interactive/components/chat-session-host-events.js +61 -9
  745. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  746. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  747. package/dist/modes/interactive/components/chat-session-host-rendering.js +23 -7
  748. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  749. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +27 -0
  750. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
  751. package/dist/modes/interactive/components/chat-session-host-runtime.js +120 -18
  752. package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
  753. package/dist/modes/interactive/components/chat-session-host-state.d.ts +9 -0
  754. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  755. package/dist/modes/interactive/components/chat-session-host-state.js +5 -0
  756. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  757. package/dist/modes/interactive/components/chat-session-host-types.d.ts +10 -0
  758. package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
  759. package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
  760. package/dist/modes/interactive/components/chat-session-host.d.ts +13 -0
  761. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  762. package/dist/modes/interactive/components/chat-session-host.js +22 -1
  763. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  764. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  765. package/dist/modes/interactive/components/compaction-boundary-message.js +2 -1
  766. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  767. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  768. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  769. package/dist/modes/interactive/components/custom-message.js +9 -2
  770. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  771. package/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  772. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  773. package/dist/modes/interactive/components/extension-editor.js +14 -43
  774. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  775. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  776. package/dist/modes/interactive/components/scoped-models-selector.js +18 -13
  777. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  778. package/dist/modes/interactive/components/startup-identity.d.ts +22 -0
  779. package/dist/modes/interactive/components/startup-identity.d.ts.map +1 -0
  780. package/dist/modes/interactive/components/startup-identity.js +58 -0
  781. package/dist/modes/interactive/components/startup-identity.js.map +1 -0
  782. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  783. package/dist/modes/interactive/components/tree-selector-content.js +0 -6
  784. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  785. package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -1
  786. package/dist/modes/interactive/components/tree-selector-model.js +0 -1
  787. package/dist/modes/interactive/components/tree-selector-model.js.map +1 -1
  788. package/dist/modes/interactive/components/working-status.d.ts +5 -11
  789. package/dist/modes/interactive/components/working-status.d.ts.map +1 -1
  790. package/dist/modes/interactive/components/working-status.js +14 -15
  791. package/dist/modes/interactive/components/working-status.js.map +1 -1
  792. package/dist/modes/interactive/external-editor.d.ts +23 -0
  793. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  794. package/dist/modes/interactive/external-editor.js +120 -0
  795. package/dist/modes/interactive/external-editor.js.map +1 -0
  796. package/dist/modes/interactive/interactive-agent-events.js +33 -22
  797. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  798. package/dist/modes/interactive/interactive-auth-login.js +16 -6
  799. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  800. package/dist/modes/interactive/interactive-auth-routing.js +3 -0
  801. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  802. package/dist/modes/interactive/interactive-bash-compact.d.ts +2 -1
  803. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  804. package/dist/modes/interactive/interactive-bash-compact.js +8 -0
  805. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  806. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  807. package/dist/modes/interactive/interactive-deferred-startup.js +49 -19
  808. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  809. package/dist/modes/interactive/interactive-editor-actions.js +4 -3
  810. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  811. package/dist/modes/interactive/interactive-extension-dialogs.js +1 -1
  812. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  813. package/dist/modes/interactive/interactive-extension-runtime.js +3 -2
  814. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  815. package/dist/modes/interactive/interactive-initial-session-binding.d.ts +4 -0
  816. package/dist/modes/interactive/interactive-initial-session-binding.d.ts.map +1 -0
  817. package/dist/modes/interactive/interactive-initial-session-binding.js +23 -0
  818. package/dist/modes/interactive/interactive-initial-session-binding.js.map +1 -0
  819. package/dist/modes/interactive/interactive-input-handling.d.ts +2 -1
  820. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  821. package/dist/modes/interactive/interactive-input-handling.js +27 -51
  822. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  823. package/dist/modes/interactive/interactive-mode-base.d.ts +11 -7
  824. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  825. package/dist/modes/interactive/interactive-mode-base.js +14 -6
  826. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  827. package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -4
  828. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  829. package/dist/modes/interactive/interactive-mode-deps.js +2 -4
  830. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  831. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -8
  832. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  833. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  834. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  835. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  836. package/dist/modes/interactive/interactive-mode.js +1 -0
  837. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  838. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +2 -3
  839. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  840. package/dist/modes/interactive/interactive-model-catalog-startup.js +3 -6
  841. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  842. package/dist/modes/interactive/interactive-model-routing.js +26 -97
  843. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  844. package/dist/modes/interactive/interactive-pause.d.ts +4 -0
  845. package/dist/modes/interactive/interactive-pause.d.ts.map +1 -0
  846. package/dist/modes/interactive/interactive-pause.js +8 -0
  847. package/dist/modes/interactive/interactive-pause.js.map +1 -0
  848. package/dist/modes/interactive/interactive-process-lifecycle.js +5 -4
  849. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  850. package/dist/modes/interactive/interactive-prompt-turn.d.ts +2 -0
  851. package/dist/modes/interactive/interactive-prompt-turn.d.ts.map +1 -0
  852. package/dist/modes/interactive/interactive-prompt-turn.js +41 -0
  853. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -0
  854. package/dist/modes/interactive/interactive-render-chat.js +20 -8
  855. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  856. package/dist/modes/interactive/interactive-resource-paths.js +11 -2
  857. package/dist/modes/interactive/interactive-resource-paths.js.map +1 -1
  858. package/dist/modes/interactive/interactive-resource-rendering.js +99 -0
  859. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  860. package/dist/modes/interactive/interactive-session-runtime.js +1 -1
  861. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  862. package/dist/modes/interactive/interactive-slash-commands.js +1 -1
  863. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  864. package/dist/modes/interactive/interactive-startup-chat-container.d.ts +20 -0
  865. package/dist/modes/interactive/interactive-startup-chat-container.d.ts.map +1 -0
  866. package/dist/modes/interactive/interactive-startup-chat-container.js +26 -0
  867. package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -0
  868. package/dist/modes/interactive/interactive-startup.d.ts +1 -1
  869. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  870. package/dist/modes/interactive/interactive-startup.js +30 -25
  871. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  872. package/dist/modes/interactive/interactive-summarization-retry-events.d.ts.map +1 -1
  873. package/dist/modes/interactive/interactive-summarization-retry-events.js +9 -3
  874. package/dist/modes/interactive/interactive-summarization-retry-events.js.map +1 -1
  875. package/dist/modes/interactive/theme/catppuccin-frappe.json +1 -1
  876. package/dist/modes/interactive/theme/catppuccin-latte.json +1 -1
  877. package/dist/modes/interactive/theme/catppuccin-macchiato.json +1 -1
  878. package/dist/modes/interactive/theme/catppuccin-mocha.json +9 -1
  879. package/dist/modes/interactive/theme/dark.json +1 -1
  880. package/dist/modes/interactive/theme/light.json +1 -1
  881. package/dist/modes/interactive/theme/theme-class.d.ts +4 -0
  882. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  883. package/dist/modes/interactive/theme/theme-class.js +7 -0
  884. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  885. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  886. package/dist/modes/interactive/theme/theme-loading.js +4 -0
  887. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  888. package/dist/modes/interactive/theme/theme-schema.d.ts +32 -0
  889. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  890. package/dist/modes/interactive/theme/theme-schema.js +8 -0
  891. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  892. package/dist/modes/interactive/theme/theme-schema.json +15 -2
  893. package/dist/modes/interactive/whimsical-messages.d.ts +1 -0
  894. package/dist/modes/interactive/whimsical-messages.d.ts.map +1 -1
  895. package/dist/modes/interactive/whimsical-messages.js +2 -2
  896. package/dist/modes/interactive/whimsical-messages.js.map +1 -1
  897. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -1
  898. package/dist/modes/interactive-engine/create-isolated-runtime.js +3 -1
  899. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
  900. package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -1
  901. package/dist/modes/interactive-engine/engine-args.js +0 -1
  902. package/dist/modes/interactive-engine/engine-args.js.map +1 -1
  903. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  904. package/dist/modes/interactive-engine/engine-custom-ui.js +5 -17
  905. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  906. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
  907. package/dist/modes/interactive-engine/engine-render-service.js +8 -19
  908. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  909. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +2 -0
  910. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  911. package/dist/modes/interactive-engine/extension-ui-bridge.js +3 -0
  912. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  913. package/dist/modes/interactive-engine/isolated-auth.d.ts +10 -0
  914. package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -0
  915. package/dist/modes/interactive-engine/isolated-auth.js +14 -0
  916. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -0
  917. package/dist/modes/interactive-engine/isolated-runtime.d.ts +9 -1
  918. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  919. package/dist/modes/interactive-engine/isolated-runtime.js +46 -34
  920. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  921. package/dist/modes/interactive-engine/protocol.d.ts +1 -1
  922. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  923. package/dist/modes/interactive-engine/protocol.js +3 -10
  924. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  925. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +1 -0
  926. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  927. package/dist/modes/interactive-engine/remote-model-catalog.js +10 -1
  928. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  929. package/dist/modes/interactive-engine/remote-queue-pause.d.ts +13 -0
  930. package/dist/modes/interactive-engine/remote-queue-pause.d.ts.map +1 -0
  931. package/dist/modes/interactive-engine/remote-queue-pause.js +38 -0
  932. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -0
  933. package/dist/modes/interactive-engine/remote-renderer.d.ts +3 -1
  934. package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -1
  935. package/dist/modes/interactive-engine/remote-renderer.js +4 -1
  936. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  937. package/dist/modes/print-mode.d.ts.map +1 -1
  938. package/dist/modes/print-mode.js +5 -0
  939. package/dist/modes/print-mode.js.map +1 -1
  940. package/dist/modes/rpc/jsonl.d.ts +2 -7
  941. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  942. package/dist/modes/rpc/jsonl.js +7 -24
  943. package/dist/modes/rpc/jsonl.js.map +1 -1
  944. package/dist/modes/rpc/queued-writer.d.ts +19 -0
  945. package/dist/modes/rpc/queued-writer.d.ts.map +1 -0
  946. package/dist/modes/rpc/{bounded-writer.js → queued-writer.js} +7 -30
  947. package/dist/modes/rpc/queued-writer.js.map +1 -0
  948. package/dist/modes/rpc/rpc-bash-request-owners.d.ts +24 -0
  949. package/dist/modes/rpc/rpc-bash-request-owners.d.ts.map +1 -0
  950. package/dist/modes/rpc/rpc-bash-request-owners.js +45 -0
  951. package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -0
  952. package/dist/modes/rpc/rpc-client-api.d.ts +8 -5
  953. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  954. package/dist/modes/rpc/rpc-client-api.js +10 -11
  955. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  956. package/dist/modes/rpc/rpc-client-process.d.ts +1 -4
  957. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  958. package/dist/modes/rpc/rpc-client-process.js +2 -14
  959. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  960. package/dist/modes/rpc/rpc-client.d.ts +8 -4
  961. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  962. package/dist/modes/rpc/rpc-client.js +21 -30
  963. package/dist/modes/rpc/rpc-client.js.map +1 -1
  964. package/dist/modes/rpc/rpc-command-handler.d.ts +7 -4
  965. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  966. package/dist/modes/rpc/rpc-command-handler.js +76 -93
  967. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  968. package/dist/modes/rpc/rpc-input-scheduler.d.ts +3 -3
  969. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  970. package/dist/modes/rpc/rpc-input-scheduler.js +7 -4
  971. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  972. package/dist/modes/rpc/rpc-mode.d.ts +1 -1
  973. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  974. package/dist/modes/rpc/rpc-mode.js +5 -5
  975. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  976. package/dist/modes/rpc/rpc-model-fallback-prompt.d.ts +4 -0
  977. package/dist/modes/rpc/rpc-model-fallback-prompt.d.ts.map +1 -0
  978. package/dist/modes/rpc/rpc-model-fallback-prompt.js +11 -0
  979. package/dist/modes/rpc/rpc-model-fallback-prompt.js.map +1 -0
  980. package/dist/modes/rpc/rpc-oauth-client.d.ts +22 -0
  981. package/dist/modes/rpc/rpc-oauth-client.d.ts.map +1 -0
  982. package/dist/modes/rpc/rpc-oauth-client.js +74 -0
  983. package/dist/modes/rpc/rpc-oauth-client.js.map +1 -0
  984. package/dist/modes/rpc/rpc-oauth-interaction.d.ts +9 -0
  985. package/dist/modes/rpc/rpc-oauth-interaction.d.ts.map +1 -0
  986. package/dist/modes/rpc/rpc-oauth-interaction.js +49 -0
  987. package/dist/modes/rpc/rpc-oauth-interaction.js.map +1 -0
  988. package/dist/modes/rpc/rpc-output-buffer.d.ts +2 -1
  989. package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -1
  990. package/dist/modes/rpc/rpc-output-buffer.js +4 -39
  991. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
  992. package/dist/modes/rpc/rpc-provider-auth.d.ts +23 -0
  993. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -0
  994. package/dist/modes/rpc/rpc-provider-auth.js +145 -0
  995. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -0
  996. package/dist/modes/rpc/rpc-responses.d.ts +0 -1
  997. package/dist/modes/rpc/rpc-responses.d.ts.map +1 -1
  998. package/dist/modes/rpc/rpc-responses.js +0 -14
  999. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  1000. package/dist/modes/rpc/rpc-types.d.ts +83 -27
  1001. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1002. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1003. package/dist/utils/clipboard.d.ts.map +1 -1
  1004. package/dist/utils/clipboard.js +21 -8
  1005. package/dist/utils/clipboard.js.map +1 -1
  1006. package/dist/utils/version-check.d.ts.map +1 -1
  1007. package/dist/utils/version-check.js +3 -1
  1008. package/dist/utils/version-check.js.map +1 -1
  1009. package/docs/changelog.mdx +12 -1
  1010. package/docs/compaction.md +101 -18
  1011. package/docs/custom-provider.md +13 -4
  1012. package/docs/docs.json +1 -0
  1013. package/docs/environment-variables.md +37 -0
  1014. package/docs/extensions.md +45 -9
  1015. package/docs/index.md +1 -0
  1016. package/docs/intercom.md +1 -1
  1017. package/docs/json.md +4 -4
  1018. package/docs/keybindings.md +4 -2
  1019. package/docs/llama-cpp.md +3 -1
  1020. package/docs/models.md +29 -43
  1021. package/docs/providers.md +18 -24
  1022. package/docs/quickstart.md +19 -16
  1023. package/docs/rpc.md +38 -85
  1024. package/docs/sdk.md +15 -22
  1025. package/docs/session-format.md +2 -15
  1026. package/docs/sessions.md +1 -1
  1027. package/docs/settings.md +10 -15
  1028. package/docs/skills.md +8 -0
  1029. package/docs/subagents.md +17 -9
  1030. package/docs/themes.md +10 -1
  1031. package/docs/tui.md +10 -5
  1032. package/docs/usage.md +21 -2
  1033. package/docs/windows.md +1 -1
  1034. package/docs/workflows.md +1096 -518
  1035. package/examples/extensions/README.md +1 -1
  1036. package/examples/extensions/handoff.ts +8 -1
  1037. package/examples/extensions/message-renderer.ts +2 -2
  1038. package/examples/extensions/summarize.ts +3 -0
  1039. package/examples/extensions/working-indicator.ts +2 -2
  1040. package/npm-shrinkwrap.json +40 -46
  1041. package/package.json +9 -7
  1042. package/dist/builtin/cursor/CHANGELOG.md +0 -281
  1043. package/dist/builtin/cursor/LICENSE +0 -26
  1044. package/dist/builtin/cursor/README.md +0 -24
  1045. package/dist/builtin/cursor/index.ts +0 -9
  1046. package/dist/builtin/cursor/package.json +0 -47
  1047. package/dist/builtin/cursor/src/auth.ts +0 -352
  1048. package/dist/builtin/cursor/src/catalog-cache.ts +0 -155
  1049. package/dist/builtin/cursor/src/config.ts +0 -123
  1050. package/dist/builtin/cursor/src/conversation-state.ts +0 -135
  1051. package/dist/builtin/cursor/src/cursor-models-raw.json +0 -412
  1052. package/dist/builtin/cursor/src/model-mapper.ts +0 -369
  1053. package/dist/builtin/cursor/src/model-reference.ts +0 -282
  1054. package/dist/builtin/cursor/src/models.ts +0 -54
  1055. package/dist/builtin/cursor/src/native-loader.ts +0 -71
  1056. package/dist/builtin/cursor/src/proto/README.md +0 -34
  1057. package/dist/builtin/cursor/src/proto/agent_pb.ts +0 -15294
  1058. package/dist/builtin/cursor/src/proto/protobuf-codec-base64.ts +0 -22
  1059. package/dist/builtin/cursor/src/proto/protobuf-codec-json.ts +0 -44
  1060. package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +0 -311
  1061. package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +0 -248
  1062. package/dist/builtin/cursor/src/proto/protobuf-codec.ts +0 -200
  1063. package/dist/builtin/cursor/src/provider.ts +0 -301
  1064. package/dist/builtin/cursor/src/stream.ts +0 -494
  1065. package/dist/builtin/cursor/src/transport-errors.ts +0 -74
  1066. package/dist/builtin/cursor/src/transport-frame.ts +0 -56
  1067. package/dist/builtin/cursor/src/transport-http2.ts +0 -122
  1068. package/dist/builtin/cursor/src/transport-native-client.ts +0 -161
  1069. package/dist/builtin/cursor/src/transport-run-stream.ts +0 -188
  1070. package/dist/builtin/cursor/src/transport-timeouts.ts +0 -87
  1071. package/dist/builtin/cursor/src/transport-types.ts +0 -143
  1072. package/dist/builtin/cursor/src/transport.ts +0 -26
  1073. package/dist/builtin/workflows/builtin/deep-research-codebase-runner.ts +0 -492
  1074. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +0 -383
  1075. package/dist/builtin/workflows/builtin/deep-research-codebase.d.ts +0 -35
  1076. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +0 -47
  1077. package/dist/builtin/workflows/skills/impeccable/reference/brand.md +0 -108
  1078. package/dist/builtin/workflows/skills/impeccable/reference/codex.md +0 -105
  1079. package/dist/builtin/workflows/skills/impeccable/reference/interaction-design.md +0 -189
  1080. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +0 -516
  1081. package/dist/core/context-window.d.ts +0 -54
  1082. package/dist/core/context-window.d.ts.map +0 -1
  1083. package/dist/core/context-window.js +0 -110
  1084. package/dist/core/context-window.js.map +0 -1
  1085. package/dist/core/copilot-anthropic-sse-repair.d.ts +0 -23
  1086. package/dist/core/copilot-anthropic-sse-repair.d.ts.map +0 -1
  1087. package/dist/core/copilot-anthropic-sse-repair.js +0 -340
  1088. package/dist/core/copilot-anthropic-sse-repair.js.map +0 -1
  1089. package/dist/core/copilot-errors.d.ts +0 -9
  1090. package/dist/core/copilot-errors.d.ts.map +0 -1
  1091. package/dist/core/copilot-errors.js +0 -32
  1092. package/dist/core/copilot-errors.js.map +0 -1
  1093. package/dist/core/copilot-gemini-payload-sanitizer.d.ts +0 -72
  1094. package/dist/core/copilot-gemini-payload-sanitizer.d.ts.map +0 -1
  1095. package/dist/core/copilot-gemini-payload-sanitizer.js +0 -296
  1096. package/dist/core/copilot-gemini-payload-sanitizer.js.map +0 -1
  1097. package/dist/core/copilot-gemini-reasoning.d.ts +0 -126
  1098. package/dist/core/copilot-gemini-reasoning.d.ts.map +0 -1
  1099. package/dist/core/copilot-gemini-reasoning.js +0 -265
  1100. package/dist/core/copilot-gemini-reasoning.js.map +0 -1
  1101. package/dist/core/copilot-gemini-tool-arguments.d.ts +0 -42
  1102. package/dist/core/copilot-gemini-tool-arguments.d.ts.map +0 -1
  1103. package/dist/core/copilot-gemini-tool-arguments.js +0 -159
  1104. package/dist/core/copilot-gemini-tool-arguments.js.map +0 -1
  1105. package/dist/core/copilot-hosts.d.ts +0 -12
  1106. package/dist/core/copilot-hosts.d.ts.map +0 -1
  1107. package/dist/core/copilot-hosts.js +0 -33
  1108. package/dist/core/copilot-hosts.js.map +0 -1
  1109. package/dist/core/copilot-model-catalog.d.ts +0 -114
  1110. package/dist/core/copilot-model-catalog.d.ts.map +0 -1
  1111. package/dist/core/copilot-model-catalog.js +0 -392
  1112. package/dist/core/copilot-model-catalog.js.map +0 -1
  1113. package/dist/core/copilot-model-static-fallbacks.d.ts +0 -43
  1114. package/dist/core/copilot-model-static-fallbacks.d.ts.map +0 -1
  1115. package/dist/core/copilot-model-static-fallbacks.js +0 -50
  1116. package/dist/core/copilot-model-static-fallbacks.js.map +0 -1
  1117. package/dist/core/copilot-model-synthesis.d.ts +0 -10
  1118. package/dist/core/copilot-model-synthesis.d.ts.map +0 -1
  1119. package/dist/core/copilot-model-synthesis.js +0 -91
  1120. package/dist/core/copilot-model-synthesis.js.map +0 -1
  1121. package/dist/modes/interactive/components/context-window-selector.d.ts +0 -53
  1122. package/dist/modes/interactive/components/context-window-selector.d.ts.map +0 -1
  1123. package/dist/modes/interactive/components/context-window-selector.js +0 -136
  1124. package/dist/modes/interactive/components/context-window-selector.js.map +0 -1
  1125. package/dist/modes/rpc/bounded-writer.d.ts +0 -27
  1126. package/dist/modes/rpc/bounded-writer.d.ts.map +0 -1
  1127. package/dist/modes/rpc/bounded-writer.js.map +0 -1
@@ -13,8 +13,11 @@
13
13
  * normalizeIgnoreValue(value)
14
14
  * readCache(cwd) / persistCache(cwd, cache) / resolveCacheCwd(primaryFile, sessionCwd)
15
15
  * bumpEditCount(cache, sessionId, filePath) -> number
16
+ * touchFile(cache, sessionId, filePath)
16
17
  * suppressionNotice(filePath)
17
18
  * filterFindings(findings, content, ext, config)
19
+ * ADVISORY_RULES / isAdvisoryFinding(finding)
20
+ * IMMEDIATE_TIER_RULES / splitFindingsByTier(findings) / perEditTieringActive(config, harness)
18
21
  * matchConfiguredExtension(filePath, extensions)
19
22
  * dedupeAgainstCache(findings, cache, sessionId, filePath)
20
23
  * renderTemplate(findings, filePath, config, opts)
@@ -25,6 +28,7 @@
25
28
  * matchesAnyGlob(filePath, globs)
26
29
  * normalizeScanTargets(primaryTargets, projectCwd)
27
30
  * runHook(deps) -> { exitCode, stdout, audit, reason? }
31
+ * runStopHook(deps) -> { exitCode, stdout, audit, emission? }
28
32
  *
29
33
  * Design notes:
30
34
  * - All errors are swallowed at the runHook seam. The detector throwing must
@@ -42,6 +46,16 @@ import path from 'node:path';
42
46
  import { pathToFileURL, fileURLToPath } from 'node:url';
43
47
  import { extractPlatform, loadContext } from './context.mjs';
44
48
  import { IMPECCABLE_COMMAND } from './lib/provider.mjs';
49
+ // `detector.extensions` (issue #316) is shared with Live's source search, which
50
+ // needs the same answer for `.heex` / `.blade.php` when it hunts for session
51
+ // markers. lib/template-extensions.mjs owns the shape; re-exported here because
52
+ // hook-lib has been the import site for matchConfiguredExtension since #347.
53
+ import {
54
+ matchConfiguredExtension,
55
+ mergeExtensions,
56
+ } from './lib/template-extensions.mjs';
57
+
58
+ export { matchConfiguredExtension };
45
59
 
46
60
  const __filename = fileURLToPath(import.meta.url);
47
61
  const __dirname = path.dirname(__filename);
@@ -70,10 +84,69 @@ export const SENSITIVE_PATH = new RegExp([
70
84
  ].join('|'), 'i');
71
85
 
72
86
  // Hard-skip regex for generated, lock, minified, and build-output paths.
73
- export const GENERATED_PATH = /(?:\.generated\.[a-z]+$|\.d\.ts$|\.min\.[a-z]+$|[/\\]node_modules[/\\]|[/\\](?:dist|build|out|\.next|\.cache|coverage)[/\\]|[/\\]?[^/\\]+\.lock(?:\.json)?$)/i;
87
+ // `generated` is matched as a whole path segment so authored names such as
88
+ // `generated-utils.ts` or `CodeGenerator.tsx` still get scanned.
89
+ export const GENERATED_PATH = /(?:\.generated\.[a-z]+$|\.d\.ts$|\.min\.[a-z]+$|[/\\]node_modules[/\\]|[/\\]generated[/\\]|[/\\](?:dist|build|out|\.next|\.cache|coverage)[/\\]|[/\\]?[^/\\]+\.lock(?:\.json)?$)/i;
74
90
 
75
91
  export const TRUTHY = /^(1|true|yes|on)$/i;
76
92
 
93
+ // ── Two-tier rule surfacing ──────────────────────────────────────────────
94
+ // The per-edit PostToolUse pass surfaces only this "immediate" tier: rules
95
+ // that are mechanical, unambiguous, and worth interrupting an edit for —
96
+ // broken output the user would see (broken images, overflow, clipped
97
+ // popovers, text on the viewport edge), objective contrast/legibility
98
+ // failures, single-property slop that is trivial to fix in place (gradient
99
+ // text, glow shadows), and design-system drift (which compounds with every
100
+ // further edit if left uncorrected). Everything else — copy-cadence rules,
101
+ // palette/typography taste, layout rhythm — is deferred to the Stop-event
102
+ // deep pass (`runStopHook`), which runs the FULL rule set over every file
103
+ // touched this session and surfaces the remainder once.
104
+ //
105
+ // Rationale (measured in the eval harness): the per-edit stream fires
106
+ // overwhelmingly on copy-level rules, and that steady nag stream makes
107
+ // models more conservative, while a single full pass at completion fixes
108
+ // contrast/padding/glow just as reliably. Restore the old full per-edit
109
+ // behavior with `.impeccable/config.json` → `hook: { "perEditRules": "all" }`.
110
+ export const IMMEDIATE_TIER_RULES = new Set([
111
+ // Broken output.
112
+ 'broken-image',
113
+ 'text-overflow',
114
+ 'clipped-overflow-container',
115
+ 'body-text-viewport-edge',
116
+ // Objective contrast / legibility failures.
117
+ 'low-contrast',
118
+ 'gray-on-color',
119
+ 'tiny-text',
120
+ // Single-property mechanical slop, trivial to fix at the edit site.
121
+ 'gradient-text',
122
+ 'dark-glow',
123
+ // Design-system drift compounds if not corrected at edit time.
124
+ 'design-system-font',
125
+ 'design-system-color',
126
+ 'design-system-radius',
127
+ 'design-system-font-size',
128
+ ]);
129
+
130
+ // ── Advisory rules ────────────────────────────────────────────────────────
131
+ // Advisory rules are opt-in noise: the CLI reports them in a separate section
132
+ // and they never count as failures. The design hook skips them entirely by
133
+ // default — in both the per-edit PostToolUse pass and the Stop deep pass — so
134
+ // the agent is never nagged about a taste call a human might make on purpose.
135
+ // A project opts back in with `.impeccable/config.json`:
136
+ // { "detector": { "advisoryRules": "include" } }
137
+ // This set is the hook's own copy of the registry's `advisory: true` rules,
138
+ // mirroring how IMMEDIATE_TIER_RULES lists rule ids inline so the hook stays
139
+ // self-contained and testable without loading the detector. Keep it in sync
140
+ // with the registry (cli/engine/registry/antipatterns.mjs).
141
+ export const ADVISORY_RULES = new Set([
142
+ 'em-dash-overuse',
143
+ ]);
144
+
145
+ export function isAdvisoryFinding(finding) {
146
+ const id = finding && normalizeIgnoreRule(finding.antipattern);
147
+ return Boolean(id && (ADVISORY_RULES.has(id) || finding.advisory === true));
148
+ }
149
+
77
150
  export const DEFAULT_CONFIG = Object.freeze({
78
151
  enabled: true,
79
152
  quiet: false,
@@ -83,12 +156,20 @@ export const DEFAULT_CONFIG = Object.freeze({
83
156
  ignoreFiles: [],
84
157
  ignoreValues: [],
85
158
  extensions: [],
86
- limits: { maxFindings: 5, maxChars: 8000 },
159
+ perEditRules: 'immediate',
160
+ // Advisory rules are skipped unless a project sets detector.advisoryRules to
161
+ // "include". See ADVISORY_RULES above.
162
+ advisoryRules: 'exclude',
163
+ // maxFileBytes: not every generated artifact lives under a path we can
164
+ // recognize. Committed browser bundles and vendored detector copies sit
165
+ // next to source and run 200KB+, while genuinely authored stylesheets in
166
+ // this codebase top out under 90KB. A single file past the ceiling is a
167
+ // bundle, and findings against a bundle are never actionable.
168
+ limits: { maxFindings: 5, maxChars: 8000, maxFileBytes: 131072 },
87
169
  });
88
170
 
89
171
  export const HOOK_LOCAL_IGNORE_PATTERNS = Object.freeze([
90
172
  '.impeccable/hook.cache.json',
91
- '.impeccable/hook.pending.json',
92
173
  '.impeccable/config.local.json',
93
174
  ]);
94
175
 
@@ -129,15 +210,9 @@ export function getCachePath(cwd) {
129
210
  return path.join(cwd, '.impeccable', 'hook.cache.json');
130
211
  }
131
212
 
132
- export function getPendingPath(cwd) {
133
- return path.join(cwd, '.impeccable', 'hook.pending.json');
134
- }
135
213
 
136
214
  export function resolveProjectCwd(event, fallback = process.cwd()) {
137
- return event?.cwd
138
- || (Array.isArray(event?.workspace_roots) && event.workspace_roots[0])
139
- || envProjectDir(fallback)
140
- || fallback;
215
+ return event?.cwd || fallback;
141
216
  }
142
217
 
143
218
  function looksLikeProjectRoot(dir) {
@@ -235,6 +310,11 @@ function cloneDefaultConfig() {
235
310
 
236
311
  function applyDetectorConfigSource(config, raw) {
237
312
  if (!raw || typeof raw !== 'object') return config;
313
+ // `detector.advisoryRules: "include"` opts the hook into advisory rules
314
+ // (em-dash overuse, etc.). Any other value keeps the default "exclude".
315
+ if (raw.advisoryRules === 'include' || raw.advisoryRules === 'exclude') {
316
+ config.advisoryRules = raw.advisoryRules;
317
+ }
238
318
  if (raw.designSystem && typeof raw.designSystem === 'object' && !Array.isArray(raw.designSystem)) {
239
319
  config.designSystem = {
240
320
  ...config.designSystem,
@@ -256,49 +336,6 @@ function applyDetectorConfigSource(config, raw) {
256
336
  return config;
257
337
  }
258
338
 
259
- // Extra scanned extensions from `detector.extensions` config. Entries are
260
- // `{ ext, engine }` (engine 'html' | 'text', default 'html' — the common case
261
- // for server-side templates) or bare strings as shorthand. Extensions are
262
- // matched against the end of the filename, not path.extname, so double
263
- // extensions like `.blade.php` and `.html.erb` work (issue #316).
264
- function normalizeExtensionEntries(entries) {
265
- if (!Array.isArray(entries)) return [];
266
- const out = [];
267
- for (const entry of entries) {
268
- const raw = typeof entry === 'string' ? entry : entry?.ext;
269
- if (typeof raw !== 'string') continue;
270
- let ext = raw.trim().toLowerCase();
271
- if (!ext) continue;
272
- if (!ext.startsWith('.')) ext = `.${ext}`;
273
- const engine = (!(typeof entry === 'string') && entry?.engine === 'text') ? 'text' : 'html';
274
- out.push({ ext, engine });
275
- }
276
- return out;
277
- }
278
-
279
- function mergeExtensions(existing, incoming) {
280
- const map = new Map();
281
- for (const entry of normalizeExtensionEntries(existing)) map.set(entry.ext, entry);
282
- for (const entry of normalizeExtensionEntries(incoming)) map.set(entry.ext, entry);
283
- return Array.from(map.values());
284
- }
285
-
286
- export function matchConfiguredExtension(filePath, extensions) {
287
- if (!Array.isArray(extensions) || extensions.length === 0) return null;
288
- const name = path.basename(String(filePath || '')).toLowerCase();
289
- if (!name) return null;
290
- // The longest matching suffix wins, so `.blade.php` beats a broader `.php`
291
- // entry regardless of config order.
292
- let best = null;
293
- for (const entry of normalizeExtensionEntries(extensions)) {
294
- if (name.length > entry.ext.length && name.endsWith(entry.ext)
295
- && (!best || entry.ext.length > best.ext.length)) {
296
- best = entry;
297
- }
298
- }
299
- return best;
300
- }
301
-
302
339
  function applyConfigSource(config, raw) {
303
340
  if (!raw || typeof raw !== 'object') return config;
304
341
  if (Object.prototype.hasOwnProperty.call(raw, 'enabled')) {
@@ -307,6 +344,9 @@ function applyConfigSource(config, raw) {
307
344
  if (Object.prototype.hasOwnProperty.call(raw, 'quiet')) {
308
345
  config.quiet = raw.quiet === true;
309
346
  }
347
+ if (raw.perEditRules === 'all' || raw.perEditRules === 'immediate') {
348
+ config.perEditRules = raw.perEditRules;
349
+ }
310
350
  if (typeof raw.auditLog === 'string' && raw.auditLog.trim()) {
311
351
  config.auditLog = raw.auditLog.trim();
312
352
  }
@@ -315,6 +355,7 @@ function applyConfigSource(config, raw) {
315
355
  config.limits = {
316
356
  maxFindings: numberOr(raw.limits.maxFindings, config.limits.maxFindings),
317
357
  maxChars: numberOr(raw.limits.maxChars, config.limits.maxChars),
358
+ maxFileBytes: numberOr(raw.limits.maxFileBytes, config.limits.maxFileBytes),
318
359
  };
319
360
  }
320
361
  return config;
@@ -502,12 +543,15 @@ export function normalizeIgnoreValueEntries(entries) {
502
543
  ...(Array.isArray(entry.files) ? entry.files.filter(v => typeof v === 'string' && v.trim()).map(v => v.trim()) : []),
503
544
  ]);
504
545
  if (files.length > 0) normalized.files = files;
505
- if (typeof entry.reason === 'string' && entry.reason.trim()) {
506
- normalized.reason = entry.reason.trim();
507
- }
546
+ // Key order is rule, value, files, createdAt, reason and must stay that way:
547
+ // normalizing runs on every write, so emitting a different order than the one
548
+ // already on disk rewrites every untouched entry and churns the diff.
508
549
  if (typeof entry.createdAt === 'string' && entry.createdAt.trim()) {
509
550
  normalized.createdAt = entry.createdAt.trim();
510
551
  }
552
+ if (typeof entry.reason === 'string' && entry.reason.trim()) {
553
+ normalized.reason = entry.reason.trim();
554
+ }
511
555
  out.push(normalized);
512
556
  }
513
557
  return out;
@@ -525,7 +569,9 @@ function mergeIgnoreValues(existing, incoming) {
525
569
  }
526
570
 
527
571
  function ignoreValueFilesKey(files) {
528
- return Array.isArray(files) && files.length > 0 ? files.join('\x1f') : '';
572
+ // Sort before joining: a scope is a set, so an entry already on disk in another
573
+ // order must compare equal rather than dedup as two distinct entries.
574
+ return Array.isArray(files) && files.length > 0 ? [...files].sort().join('\x1f') : '';
529
575
  }
530
576
 
531
577
  export function readCache(cwd) {
@@ -661,6 +707,14 @@ export function bumpEditCount(cache, sessionId, filePath) {
661
707
  return fileEntry.editCount;
662
708
  }
663
709
 
710
+ // Record that a file was scanned this session without bumping its edit count.
711
+ // The Stop deep pass reads the session's file list to know what to re-scan,
712
+ // so a file whose per-edit findings were all deferred still needs an entry.
713
+ export function touchFile(cache, sessionId, filePath) {
714
+ ensureFile(cache, sessionId, filePath);
715
+ ensureSession(cache, sessionId).updatedAt = Date.now();
716
+ }
717
+
664
718
  export function suppressionNotice(filePath) {
665
719
  return `${ENVELOPE_PREFIX} Suppressing further design hints on ${filePath}. More than ${EDIT_COUNT_THRESHOLD} edits in this session reached. Run ${IMPECCABLE_COMMAND} audit to revisit.`;
666
720
  }
@@ -723,14 +777,43 @@ export function filterFindings(findings, _content, _ext, config) {
723
777
  if (!Array.isArray(findings) || findings.length === 0) return [];
724
778
  const ignoreRules = new Set((config.ignoreRules || []).map((rule) => normalizeIgnoreRule(rule)));
725
779
  const ignoreValues = normalizeIgnoreValueEntries(config.ignoreValues || []);
780
+ // Advisory rules are skipped by default so the hook never nags about them;
781
+ // a project opts in with detector.advisoryRules: "include".
782
+ const includeAdvisory = (config?.advisoryRules || DEFAULT_CONFIG.advisoryRules) === 'include';
726
783
  return findings.filter((f) => {
727
784
  if (!f || typeof f !== 'object') return false;
785
+ if (!includeAdvisory && isAdvisoryFinding(f)) return false;
728
786
  if (ignoreRules.has(normalizeIgnoreRule(f.antipattern))) return false;
729
787
  if (isIgnoredFindingValue(f, ignoreValues)) return false;
730
788
  return true;
731
789
  });
732
790
  }
733
791
 
792
+ // Split filtered findings into the per-edit "immediate" tier and the tier
793
+ // deferred to the Stop deep pass. See IMMEDIATE_TIER_RULES for the tiering
794
+ // rationale.
795
+ export function splitFindingsByTier(findings) {
796
+ const immediate = [];
797
+ const deferred = [];
798
+ for (const f of Array.isArray(findings) ? findings : []) {
799
+ if (f && IMMEDIATE_TIER_RULES.has(normalizeIgnoreRule(f.antipattern))) {
800
+ immediate.push(f);
801
+ } else {
802
+ deferred.push(f);
803
+ }
804
+ }
805
+ return { immediate, deferred };
806
+ }
807
+
808
+ // Whether the per-edit pass for this harness should defer non-immediate
809
+ // findings to a Stop deep pass. Only Claude Code and Codex dispatch our Stop
810
+ // hook; GitHub Copilot has no deep pass wired, so deferring for it would
811
+ // silently drop the non-immediate rules entirely.
812
+ export function perEditTieringActive(config, harness) {
813
+ if (harness === 'github') return false;
814
+ return (config?.perEditRules || DEFAULT_CONFIG.perEditRules) !== 'all';
815
+ }
816
+
734
817
  function isIgnoredFindingValue(finding, ignoreValues) {
735
818
  if (!Array.isArray(ignoreValues) || ignoreValues.length === 0) return false;
736
819
  const rule = normalizeIgnoreRule(finding.antipattern);
@@ -769,6 +852,7 @@ export function extractFindingIgnoreValue(finding) {
769
852
  'design-system-font',
770
853
  'design-system-color',
771
854
  'design-system-radius',
855
+ 'design-system-font-size',
772
856
  ]);
773
857
  if (!directValueRules.has(rule)) return '';
774
858
  return normalizeIgnoreValue(extractFindingIgnoreValueRaw(finding, rule));
@@ -845,11 +929,20 @@ export function dedupeAgainstCache(findings, cache, sessionId, filePath) {
845
929
  return fresh;
846
930
  }
847
931
 
932
+ // Sync the remembered set to the findings present in the scan just performed.
933
+ //
934
+ // This replaces rather than accumulates, and that is the whole point. An
935
+ // append-only set made the hook lie twice over: the pending ack counted
936
+ // history instead of the live scan, so it kept naming findings the agent had
937
+ // already fixed, and a finding that was fixed and later reintroduced was
938
+ // deduped against a stale memory and never re-reported. Forgetting what is no
939
+ // longer there is what lets the count shrink and a regression fire again.
940
+ //
941
+ // Callers must pass the complete current finding set, not just the fresh ones.
848
942
  export function rememberFindings(cache, sessionId, filePath, findings) {
849
943
  const fileEntry = ensureFile(cache, sessionId, filePath);
850
- const known = new Set(fileEntry.findings || []);
851
- for (const f of findings) known.add(findingCacheKey(f));
852
- fileEntry.findings = Array.from(known);
944
+ const keys = new Set((findings || []).map(f => findingCacheKey(f)));
945
+ fileEntry.findings = Array.from(keys);
853
946
  ensureSession(cache, sessionId).updatedAt = Date.now();
854
947
  }
855
948
 
@@ -1054,7 +1147,7 @@ export function resolveTargetFiles(event, projectCwd) {
1054
1147
  if (ti && typeof ti.file_path === 'string' && ti.file_path) {
1055
1148
  add(ti.file_path);
1056
1149
  }
1057
- // Cursor Write / StrReplace use `path`, not `file_path`.
1150
+ // GitHub Copilot edit/create events use `path`, not `file_path`.
1058
1151
  if (ti && typeof ti.path === 'string' && ti.path) {
1059
1152
  add(ti.path);
1060
1153
  }
@@ -1066,7 +1159,6 @@ export function resolveTargetFiles(event, projectCwd) {
1066
1159
 
1067
1160
  export function resolveHarness(env = {}, event = null) {
1068
1161
  const explicit = env?.IMPECCABLE_HOOK_HARNESS;
1069
- if (explicit === 'cursor') return 'cursor';
1070
1162
  if (explicit === 'github') return 'github';
1071
1163
  if (explicit === 'claude' || explicit === 'codex') return 'claude';
1072
1164
  // GitHub Copilot's postToolUse event uses camelCase `toolName`/`toolArgs` and
@@ -1076,7 +1168,6 @@ export function resolveHarness(env = {}, event = null) {
1076
1168
  && event.tool_name === undefined && event.tool_input === undefined) {
1077
1169
  return 'github';
1078
1170
  }
1079
- if (typeof event?.conversation_id === 'string' && event.conversation_id) return 'cursor';
1080
1171
  return 'claude';
1081
1172
  }
1082
1173
 
@@ -1140,7 +1231,7 @@ function applyPatchText(rawArgs) {
1140
1231
  }
1141
1232
 
1142
1233
  function normalizeGitHubEvent(event, projectCwd) {
1143
- const cwd = event.cwd || envProjectDir(projectCwd) || projectCwd;
1234
+ const cwd = event.cwd || projectCwd;
1144
1235
  const sessionId = event.sessionId || event.session_id || 'unknown';
1145
1236
  const toolName = event.toolName || event.tool_name || null;
1146
1237
  const toolInput = event.tool_input && typeof event.tool_input === 'object' ? { ...event.tool_input } : {};
@@ -1174,33 +1265,7 @@ function normalizeGitHubEvent(event, projectCwd) {
1174
1265
  export function normalizeHookEvent(event, projectCwd, harness = 'claude') {
1175
1266
  if (!event || typeof event !== 'object') return event;
1176
1267
  if (harness === 'github') return normalizeGitHubEvent(event, projectCwd);
1177
- if (harness !== 'cursor') return event;
1178
-
1179
- const cwd = event.cwd
1180
- || (Array.isArray(event.workspace_roots) && event.workspace_roots[0])
1181
- || envProjectDir(projectCwd)
1182
- || projectCwd;
1183
- const sessionId = event.session_id || event.conversation_id || 'unknown';
1184
-
1185
- const ti = event.tool_input && typeof event.tool_input === 'object' ? event.tool_input : {};
1186
- const filePath = ti.file_path || ti.path || event.file_path;
1187
- if (filePath) {
1188
- return {
1189
- ...event,
1190
- cwd,
1191
- session_id: sessionId,
1192
- tool_input: { ...ti, file_path: filePath },
1193
- };
1194
- }
1195
-
1196
- return { ...event, cwd, session_id: sessionId };
1197
- }
1198
-
1199
- function envProjectDir(fallback) {
1200
- if (typeof process.env.CURSOR_PROJECT_DIR === 'string' && process.env.CURSOR_PROJECT_DIR) {
1201
- return process.env.CURSOR_PROJECT_DIR;
1202
- }
1203
- return fallback;
1268
+ return event;
1204
1269
  }
1205
1270
 
1206
1271
  // UI components often keep slop in a sibling/co-located stylesheet while the
@@ -1465,16 +1530,17 @@ export function appendDesignSystemNote(text, scanOptions) {
1465
1530
  // raw envelope. Asking the model to surface the resolution in its
1466
1531
  // reply is the cheapest way to make the feedback loop visible.
1467
1532
  function directiveFooter(display, opts = {}) {
1468
- const ignoreFileCommand = `${IMPECCABLE_COMMAND} hooks ignore-file ${quoteCommandArg(display)}`;
1469
- const fileIgnoreGuidance = opts.grouped
1470
- ? `run \`${IMPECCABLE_COMMAND} hooks ignore-file <path>\` for the specific file`
1471
- : `run \`${ignoreFileCommand}\``;
1533
+ // Offer the rule-scoped-to-file form first. `ignore-file` silences every rule
1534
+ // for the path forever, which is far more than one noisy rule on a real UI
1535
+ // surface justifies, and it was previously the only option named here.
1536
+ const target = opts.grouped ? '<path>' : quoteCommandArg(display);
1537
+ const fileIgnoreGuidance = `run \`${IMPECCABLE_COMMAND} hooks ignore-value <id> "*" --file ${target}\` to scope just that rule to the file, or \`${IMPECCABLE_COMMAND} hooks ignore-file ${target}\` only when the whole file is out of scope for design review (a fixture, a generated artifact, a deliberate demo)`;
1472
1538
  return [
1473
1539
  'Handle these before finalizing: fix findings that are real design problems, or explicitly classify contextually intentional findings as false positives. Acknowledge what you changed or why you are leaving a finding unchanged.',
1474
1540
  '',
1475
1541
  'Use context judgment before editing. A finding is not automatically a defect; literal or domain-appropriate motion, intentional demos or fixtures, documentation of bad design, and user-confirmed choices can be valid as-is.',
1476
1542
  '',
1477
- `Do not change intentional design just to satisfy the hook, and do not silence a real finding with an inline ignore comment to skip fixing it. Suppress a finding only after the user explicitly confirms it is intentional. Prefer a config ignore (one reviewable place, the commands below); reach for an inline \`impeccable-disable <rule>\` comment only when the waiver must travel with a file that leaves the repo, such as an exported or standalone document. Prefer the narrowest persisted exception: run the exact \`${IMPECCABLE_COMMAND} hooks ignore-value ... --shared\` command shown next to a value-specific finding. For \`overused-font\`, use \`ignore-value\` for a specific font and use \`${IMPECCABLE_COMMAND} hooks ignore-rule overused-font --all-values\` only when the user asks to ignore overused fonts generally. For file-specific findings without an ignore-value command, ${fileIgnoreGuidance}; use \`${IMPECCABLE_COMMAND} hooks ignore-rule <id>\` only when the user asks to suppress the whole non-value-specific rule. Run ${IMPECCABLE_COMMAND} audit for the full pass.`,
1543
+ `Do not change intentional design just to satisfy the hook, and do not silence a real finding with an inline ignore comment to skip fixing it. Suppress a finding only after the user explicitly confirms it is intentional. Prefer a config ignore (one reviewable place, the commands below); reach for an inline \`impeccable-disable <rule>\` comment only when the waiver must travel with a file that leaves the repo, such as an exported or standalone document. Prefer the narrowest persisted exception: run the exact \`${IMPECCABLE_COMMAND} hooks ignore-value ... --shared\` command shown next to a value-specific finding. For \`overused-font\`, use \`ignore-value\` for a specific font and use \`${IMPECCABLE_COMMAND} hooks ignore-rule overused-font --all-values\` only when the user asks to ignore overused fonts generally. For a finding whose line shows no exact ignore-value command, such as \`side-tab\`, ${fileIgnoreGuidance}; use \`${IMPECCABLE_COMMAND} hooks ignore-rule <id>\` only when the user asks to suppress the whole non-value-specific rule. Run ${IMPECCABLE_COMMAND} audit for the full pass.`,
1478
1544
  ].join('\n');
1479
1545
  }
1480
1546
 
@@ -1545,15 +1611,20 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1545
1611
  return result({ skipped: 'detector-missing', durationMs: Date.now() - started });
1546
1612
  }
1547
1613
  const scanOptions = designSystemOptions(config, det, projectCwd);
1614
+ const tiered = perEditTieringActive(config, harness);
1548
1615
 
1549
1616
  let pendingWinner = null;
1550
1617
  let cleanWinner = null;
1551
1618
  const freshGroups = [];
1552
1619
  let suppressionWinner = null;
1620
+ let cleanAckDeduped = false;
1621
+ let skippedBytes = 0;
1622
+ const quietMode = truthy(env.IMPECCABLE_HOOK_QUIET) || config.quiet === true;
1553
1623
  let detectorThrewAny = false;
1554
1624
  let lastSkip = 'no-scannable-file';
1555
1625
  let suppressedHit = false;
1556
1626
  let cacheDirty = false;
1627
+ let deferredTotal = 0;
1557
1628
 
1558
1629
  for (const filePath of targetFiles) {
1559
1630
  audit.file = filePath;
@@ -1585,6 +1656,17 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1585
1656
  continue;
1586
1657
  }
1587
1658
 
1659
+ const maxFileBytes = config.limits?.maxFileBytes ?? DEFAULT_CONFIG.limits.maxFileBytes;
1660
+ if (maxFileBytes > 0) {
1661
+ let size = 0;
1662
+ try { size = fs.statSync(filePath).size; } catch { size = 0; }
1663
+ if (size > maxFileBytes) {
1664
+ skippedBytes = size;
1665
+ lastSkip = 'too-large';
1666
+ continue;
1667
+ }
1668
+ }
1669
+
1588
1670
  if (primaryFileSet.has(filePath)) {
1589
1671
  const editCount = bumpEditCount(cache, sessionId, filePath);
1590
1672
  cacheDirty = true;
@@ -1614,36 +1696,75 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1614
1696
  }
1615
1697
 
1616
1698
  const filtered = filterFindings(findings || [], content, ext, config);
1617
- const fresh = dedupeAgainstCache(filtered, cache, sessionId, filePath);
1699
+ // Per-edit only surfaces the immediate tier; the rest waits for the
1700
+ // Stop deep pass. The file is still marked touched so the deep pass
1701
+ // knows to re-scan it.
1702
+ const { immediate, deferred } = tiered
1703
+ ? splitFindingsByTier(filtered)
1704
+ : { immediate: filtered, deferred: [] };
1705
+ if (deferred.length > 0) {
1706
+ touchFile(cache, sessionId, filePath);
1707
+ cacheDirty = true;
1708
+ deferredTotal += deferred.length;
1709
+ }
1710
+ const fresh = dedupeAgainstCache(immediate, cache, sessionId, filePath);
1618
1711
  audit.findings = (findings || []).length;
1619
1712
  audit.freshFindings = fresh.length;
1713
+ if (deferredTotal > 0) audit.deferred = deferredTotal;
1620
1714
 
1621
- if (fresh.length > 0) {
1622
- rememberFindings(cache, sessionId, filePath, fresh);
1623
- cacheDirty = true;
1624
- freshGroups.push({ filePath, findings: fresh });
1715
+ // A detector failure tells us nothing about the file, so leave whatever
1716
+ // was remembered alone rather than recording an empty scan as truth.
1717
+ if (detectorThrew) {
1718
+ detectorThrewAny = true;
1625
1719
  continue;
1626
1720
  }
1627
1721
 
1628
- if (detectorThrew) {
1629
- detectorThrewAny = true;
1722
+ // Sync the cache to this scan before deciding what to emit, so fixed
1723
+ // findings stop being remembered and a reintroduced one reads as fresh.
1724
+ // Only the immediate tier is remembered: a deferred finding the per-edit
1725
+ // pass never reported must still read as fresh to the Stop deep pass.
1726
+ rememberFindings(cache, sessionId, filePath, immediate);
1727
+ cacheDirty = true;
1728
+
1729
+ if (fresh.length > 0) {
1730
+ freshGroups.push({ filePath, findings: fresh });
1630
1731
  continue;
1631
1732
  }
1632
1733
 
1633
- if (filtered.length > 0 && !pendingWinner) {
1634
- const known = (ensureFile(cache, sessionId, filePath).findings || []).slice();
1635
- pendingWinner = { filePath, known };
1636
- } else if (filtered.length === 0 && !cleanWinner) {
1637
- cleanWinner = { filePath };
1734
+ if (immediate.length > 0 && !pendingWinner) {
1735
+ // Count the live scan, not the session's history.
1736
+ pendingWinner = { filePath, known: immediate.map(f => findingCacheKey(f)) };
1737
+ } else if (immediate.length === 0 && !cleanWinner) {
1738
+ // The clean ack carries no finding, only the standing steer that a
1739
+ // silent hook is not a verdict on the design. Repeating it on every
1740
+ // clean edit spends context to say nothing, so it fires once per file
1741
+ // per session. The pending ack, which names real unresolved work, is
1742
+ // deliberately left to repeat.
1743
+ //
1744
+ // Quiet mode emits nothing, so it must not consume the ack and leave a
1745
+ // later non-quiet run in this session silent.
1746
+ if (quietMode || !shouldEmitAckForFile(filePath, config)) {
1747
+ cleanWinner = { filePath };
1748
+ } else if (ensureFile(cache, sessionId, filePath).cleanAcked) {
1749
+ // Spent for this file. Remember it for the audit trail, but keep
1750
+ // scanning: another target in this same event may still be owed an
1751
+ // ack, and dropping out here would lose it.
1752
+ cleanAckDeduped = true;
1753
+ } else {
1754
+ ensureFile(cache, sessionId, filePath).cleanAcked = true;
1755
+ cleanWinner = { filePath };
1756
+ cleanAckDeduped = false;
1757
+ }
1638
1758
  }
1639
1759
  }
1640
1760
 
1641
1761
  // Persist only when the write is earned: fresh findings justify creating
1642
- // `.impeccable/` (dedup and suppression need it), and an already-present
1643
- // `.impeccable/` dir marks a project that opted in. A non-UI edit, or a
1644
- // clean UI edit in a project with no Impeccable footprint, must be a
1645
- // no-op on disk (issues #344, #305).
1646
- if (freshGroups.length > 0
1762
+ // `.impeccable/` (dedup and suppression need it), deferred findings do
1763
+ // too (the Stop deep pass needs the touched-file list to surface them),
1764
+ // and an already-present `.impeccable/` dir marks a project that opted
1765
+ // in. A non-UI edit, or a clean UI edit in a project with no Impeccable
1766
+ // footprint, must be a no-op on disk (issues #344, #305).
1767
+ if (freshGroups.length > 0 || deferredTotal > 0
1647
1768
  || (cacheDirty && fs.existsSync(path.join(projectCwd, '.impeccable')))) {
1648
1769
  persistCache(projectCwd, cache);
1649
1770
  }
@@ -1677,7 +1798,7 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1677
1798
  return result({ emitted: false, error: 'detector-threw', durationMs: Date.now() - started });
1678
1799
  }
1679
1800
 
1680
- if (truthy(env.IMPECCABLE_HOOK_QUIET) || config.quiet === true) {
1801
+ if (quietMode) {
1681
1802
  return result({ emitted: false, quiet: true, durationMs: Date.now() - started });
1682
1803
  }
1683
1804
 
@@ -1715,7 +1836,7 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1715
1836
  };
1716
1837
  }
1717
1838
 
1718
- if (cleanWinner && shouldEmitAckForFile(cleanWinner.filePath, config)) {
1839
+ if (cleanWinner && !cleanAckDeduped && shouldEmitAckForFile(cleanWinner.filePath, config)) {
1719
1840
  const text = appendDesignSystemNote(renderCleanAck(cleanWinner.filePath, { cwd: projectCwd }), scanOptions);
1720
1841
  return {
1721
1842
  exitCode: 0,
@@ -1732,15 +1853,29 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1732
1853
  };
1733
1854
  }
1734
1855
 
1735
- if (pendingWinner || cleanWinner) {
1856
+ if (pendingWinner) {
1736
1857
  return result({ emitted: false, skipped: 'non-ui-ack', durationMs: Date.now() - started });
1737
1858
  }
1738
1859
 
1860
+ // Distinct from non-ui-ack so the audit log shows noise being suppressed on
1861
+ // purpose rather than a file the hook could not classify.
1862
+ if (cleanWinner) {
1863
+ return result({ emitted: false, skipped: 'non-ui-ack', durationMs: Date.now() - started });
1864
+ }
1865
+
1866
+ if (cleanAckDeduped) {
1867
+ return result({ emitted: false, skipped: 'clean-ack-deduped', durationMs: Date.now() - started });
1868
+ }
1869
+
1739
1870
  if (suppressedHit) {
1740
1871
  return result({ suppressed: true, emitted: false, durationMs: Date.now() - started });
1741
1872
  }
1742
1873
 
1743
- return result({ skipped: lastSkip, durationMs: Date.now() - started });
1874
+ return result({
1875
+ skipped: lastSkip,
1876
+ ...(lastSkip === 'too-large' ? { bytes: skippedBytes } : {}),
1877
+ durationMs: Date.now() - started,
1878
+ });
1744
1879
  } catch (err) {
1745
1880
  return {
1746
1881
  exitCode: 0,
@@ -1750,10 +1885,169 @@ export async function runHook({ stdinJson, env = {}, cwd = process.cwd(), now =
1750
1885
  }
1751
1886
  }
1752
1887
 
1753
- export function payload(text, eventName = 'PostToolUse', harness = 'claude') {
1754
- if (harness === 'cursor') {
1755
- return JSON.stringify({ additional_context: text });
1888
+ // Cap on files the Stop deep pass will scan. The touched-file list is
1889
+ // session-scoped and already capped per edit, but a very long session could
1890
+ // accumulate more than the 30s hook timeout comfortably covers.
1891
+ export const STOP_MAX_FILES = 20;
1892
+
1893
+ /**
1894
+ * Run the Stop-event deep pass: the FULL detector rule set over every UI
1895
+ * file touched this session, surfaced once, deduped against everything the
1896
+ * per-edit hook already reported. Same result contract as runHook():
1897
+ * { exitCode, stdout, audit, emission? }
1898
+ *
1899
+ * Never throws; exits silent (and fast) when the session touched no UI
1900
+ * files. Output uses the Stop hookSpecificOutput channel: additionalContext
1901
+ * is delivered to the model and the conversation continues so it can act.
1902
+ */
1903
+ export async function runStopHook({ stdinJson, env = {}, cwd = process.cwd(), now = Date.now, detector } = {}) {
1904
+ const audit = { ts: new Date(now()).toISOString(), event: 'Stop' };
1905
+ const result = (extra) => ({ exitCode: 0, stdout: '', audit: { ...audit, ...extra } });
1906
+
1907
+ try {
1908
+ // Re-entrancy guard, same as the per-edit pass.
1909
+ if (depthIsSet(env.IMPECCABLE_HOOK_DEPTH) || depthIsSet(env.CLAUDE_HOOK_DEPTH)) {
1910
+ return result({ reentrant: true, durationMs: 0 });
1911
+ }
1912
+ if (truthy(env.IMPECCABLE_HOOK_DISABLED)) {
1913
+ return result({ skipped: 'env-disabled', durationMs: 0 });
1914
+ }
1915
+
1916
+ const started = Date.now();
1917
+
1918
+ let event;
1919
+ try {
1920
+ event = typeof stdinJson === 'string' ? JSON.parse(stdinJson) : stdinJson;
1921
+ } catch {
1922
+ return result({ skipped: 'stdin-malformed', durationMs: Date.now() - started });
1923
+ }
1924
+ if (!event || typeof event !== 'object') {
1925
+ return result({ skipped: 'stdin-empty', durationMs: Date.now() - started });
1926
+ }
1927
+
1928
+ // Claude Code's Stop-hook contract: `stop_hook_active` is true when this
1929
+ // hook is being re-invoked only because a prior invocation kept the turn
1930
+ // alive (here, via hookSpecificOutput.additionalContext). Re-scanning and
1931
+ // re-blocking now would loop until Claude Code's consecutive-block cap
1932
+ // force-ends the turn (issue #400). The prior fire already surfaced the
1933
+ // findings; whether to act on them is the agent's call. Exit fast with no
1934
+ // output before any scan. Only Claude Code sends this field; other
1935
+ // harnesses omit it, so the strict `=== true` is a no-op for them. This
1936
+ // guard makes the loop impossible regardless of the finding cache key's
1937
+ // line-number sensitivity (out of scope here; see findingCacheKey).
1938
+ if (event.stop_hook_active === true) {
1939
+ return result({ skipped: 'stop-hook-active', durationMs: Date.now() - started });
1940
+ }
1941
+
1942
+ const harness = resolveHarness(env, event);
1943
+ audit.harness = harness;
1944
+
1945
+ // A Stop event carries no file, so the session cwd is the project.
1946
+ // Umbrella-dir launches keyed their per-edit cache to the edited file's
1947
+ // project root (resolveCacheCwd); those sessions no-op here rather than
1948
+ // guessing which child project the session was about.
1949
+ const projectCwd = path.resolve(event.cwd || cwd);
1950
+ audit.cwd = projectCwd;
1951
+ const sessionId = event.session_id || 'unknown';
1952
+ audit.session = sessionId;
1953
+
1954
+ const config = readConfig(projectCwd);
1955
+ if (config.enabled === false) {
1956
+ return result({ skipped: 'config-disabled', durationMs: Date.now() - started });
1957
+ }
1958
+
1959
+ const cache = readCache(projectCwd);
1960
+ const touched = Object.keys(cache.sessions?.[sessionId]?.files || {});
1961
+ if (touched.length === 0) {
1962
+ return result({ skipped: 'no-touched-files', durationMs: Date.now() - started });
1963
+ }
1964
+
1965
+ const platform = resolveProjectPlatform(projectCwd);
1966
+ if (isNativePlatform(platform)) {
1967
+ return result({ skipped: 'native-platform', platform, durationMs: Date.now() - started });
1968
+ }
1969
+
1970
+ const det = detector || await loadDetector();
1971
+ if (!det || typeof det.detectText !== 'function') {
1972
+ return result({ skipped: 'detector-missing', durationMs: Date.now() - started });
1973
+ }
1974
+ const scanOptions = designSystemOptions(config, det, projectCwd);
1975
+
1976
+ const freshGroups = [];
1977
+ let scanned = 0;
1978
+ for (const filePath of touched) {
1979
+ if (scanned >= STOP_MAX_FILES) break;
1980
+ if (hasPathTraversal(filePath) || SENSITIVE_PATH.test(filePath)) continue;
1981
+ if (GENERATED_PATH.test(filePath)) continue;
1982
+ const ext = path.extname(filePath).toLowerCase();
1983
+ const configuredExt = matchConfiguredExtension(filePath, config.extensions);
1984
+ if (!ALLOWED_EXTS.has(ext) && !configuredExt) continue;
1985
+ const relForMatch = relativize(filePath, projectCwd);
1986
+ if (matchesAnyGlob(relForMatch, config.ignoreFiles) || matchesAnyGlob(filePath, config.ignoreFiles)) continue;
1987
+ if (!fs.existsSync(filePath)) continue;
1988
+
1989
+ scanned += 1;
1990
+ let content = '';
1991
+ try { content = fs.readFileSync(filePath, 'utf-8'); } catch { continue; }
1992
+
1993
+ let findings;
1994
+ const useHtmlEngine = configuredExt
1995
+ ? configuredExt.engine === 'html'
1996
+ : (ext === '.html' || ext === '.htm');
1997
+
1998
+ if (useHtmlEngine && typeof det.detectHtml === 'function') {
1999
+ try { findings = await det.detectHtml(filePath, scanOptions); } catch { findings = []; }
2000
+ } else {
2001
+ try { findings = await det.detectText(content, filePath, scanOptions); } catch { findings = []; }
2002
+ }
2003
+
2004
+ // Full rule set: no tier split here. Config/inline ignores still apply,
2005
+ // and the session dedupe drops everything the per-edit pass (or an
2006
+ // earlier Stop pass) already surfaced.
2007
+ const filtered = filterFindings(findings || [], content, ext, config);
2008
+ const fresh = dedupeAgainstCache(filtered, cache, sessionId, filePath);
2009
+ if (fresh.length > 0) {
2010
+ rememberFindings(cache, sessionId, filePath, fresh);
2011
+ freshGroups.push({ filePath, findings: fresh });
2012
+ }
2013
+ }
2014
+ audit.scannedFiles = scanned;
2015
+
2016
+ if (freshGroups.length === 0) {
2017
+ return result({ emitted: false, skipped: 'stop-clean', durationMs: Date.now() - started });
2018
+ }
2019
+
2020
+ // Fresh findings earn the cache write so the next Stop fire is silent
2021
+ // unless new issues appear.
2022
+ persistCache(projectCwd, cache);
2023
+
2024
+ const text = appendDesignSystemNote(renderGroupedTemplate(freshGroups, config, { cwd: projectCwd }), scanOptions);
2025
+ return {
2026
+ exitCode: 0,
2027
+ stdout: payload(text, 'Stop', harness),
2028
+ emission: {
2029
+ kind: 'stop-deep-pass',
2030
+ groups: freshGroups,
2031
+ },
2032
+ audit: {
2033
+ ...audit,
2034
+ emitted: true,
2035
+ freshFiles: freshGroups.length,
2036
+ freshFindings: freshGroups.reduce((sum, group) => sum + group.findings.length, 0),
2037
+ chars: text.length,
2038
+ durationMs: Date.now() - started,
2039
+ },
2040
+ };
2041
+ } catch (err) {
2042
+ return {
2043
+ exitCode: 0,
2044
+ stdout: '',
2045
+ audit: { ...audit, error: String(err && err.message ? err.message : err) },
2046
+ };
1756
2047
  }
2048
+ }
2049
+
2050
+ export function payload(text, eventName = 'PostToolUse', harness = 'claude') {
1757
2051
  // GitHub Copilot's postToolUse hook injects context via a top-level
1758
2052
  // `additionalContext` string (alongside an optional `modifiedResult`).
1759
2053
  if (harness === 'github') {