@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.
- package/CHANGELOG.md +63 -0
- package/README.md +12 -5
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/CHANGELOG.md +6 -0
- package/dist/builtin/mcp/README.md +3 -3
- package/dist/builtin/mcp/cli.js +0 -1
- package/dist/builtin/mcp/config.ts +0 -2
- package/dist/builtin/mcp/package.json +3 -3
- package/dist/builtin/mcp/types.ts +0 -1
- package/dist/builtin/subagents/CHANGELOG.md +12 -0
- package/dist/builtin/subagents/README.md +1 -1
- package/dist/builtin/subagents/agents/code-simplifier.md +47 -102
- package/dist/builtin/subagents/agents/codebase-analyzer.md +27 -130
- package/dist/builtin/subagents/agents/codebase-locator.md +24 -83
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +60 -259
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +29 -207
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +28 -150
- package/dist/builtin/subagents/agents/codebase-research-locator.md +21 -118
- package/dist/builtin/subagents/agents/debugger.md +27 -65
- package/dist/builtin/subagents/agents/worker.md +23 -30
- package/dist/builtin/subagents/package.json +4 -4
- package/dist/builtin/subagents/prompts/gather-context-and-clarify.md +18 -11
- package/dist/builtin/subagents/prompts/parallel-cleanup.md +34 -33
- package/dist/builtin/subagents/prompts/parallel-context-build.md +22 -36
- package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +20 -52
- package/dist/builtin/subagents/prompts/parallel-research.md +17 -41
- package/dist/builtin/subagents/prompts/parallel-review.md +23 -28
- package/dist/builtin/subagents/prompts/review-loop.md +18 -27
- package/dist/builtin/subagents/src/extension/prompt-guidance.ts +1 -1
- package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +23 -4
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +10 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +8 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +6 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +7 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +3 -0
- package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -2
- package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +5 -3
- package/dist/builtin/subagents/src/shared/settings.ts +4 -0
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +44 -0
- package/dist/builtin/workflows/README.md +72 -70
- package/dist/builtin/workflows/ambient.d.ts +0 -5
- package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +7 -4
- package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +1 -1
- package/dist/builtin/workflows/builtin/adversarial-verification.ts +2 -1
- package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +5 -2
- package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +5 -7
- package/dist/builtin/workflows/builtin/classify-and-act.ts +3 -2
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +6 -3
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +5 -5
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +3 -2
- package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +7 -4
- package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +6 -3
- package/dist/builtin/workflows/builtin/generate-and-filter.ts +3 -2
- package/dist/builtin/workflows/builtin/goal-models.ts +14 -18
- package/dist/builtin/workflows/builtin/goal-orchestrator-prompts.ts +39 -78
- package/dist/builtin/workflows/builtin/goal-prompts.ts +64 -244
- package/dist/builtin/workflows/builtin/goal-runner.ts +32 -64
- package/dist/builtin/workflows/builtin/goal.ts +2 -1
- package/dist/builtin/workflows/builtin/index.d.ts +17 -112
- package/dist/builtin/workflows/builtin/index.ts +1 -2
- package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +20 -12
- package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +3 -0
- package/dist/builtin/workflows/builtin/loop-until-done.ts +3 -2
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +52 -55
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +45 -52
- package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +41 -46
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +16 -21
- package/dist/builtin/workflows/builtin/open-claude-design.ts +2 -1
- package/dist/builtin/workflows/builtin/ralph-core.ts +61 -57
- package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +41 -45
- package/dist/builtin/workflows/builtin/ralph-models.ts +33 -43
- package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +35 -120
- package/dist/builtin/workflows/builtin/ralph-runner.ts +81 -108
- package/dist/builtin/workflows/builtin/ralph.ts +2 -1
- package/dist/builtin/workflows/builtin/shared-prompts.ts +110 -93
- package/dist/builtin/workflows/builtin/steering-context.ts +51 -0
- package/dist/builtin/workflows/builtin/tournament-prompts.ts +21 -12
- package/dist/builtin/workflows/builtin/tournament-runner.ts +3 -0
- package/dist/builtin/workflows/builtin/tournament.ts +3 -2
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/create-spec/SKILL.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +33 -129
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +11 -3
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +26 -0
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +35 -0
- package/dist/builtin/workflows/skills/impeccable/reference/android.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/animate.md +72 -189
- package/dist/builtin/workflows/skills/impeccable/reference/audit.md +10 -9
- package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +19 -108
- package/dist/builtin/workflows/skills/impeccable/reference/clarify.md +59 -253
- package/dist/builtin/workflows/skills/impeccable/reference/colorize.md +51 -222
- package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +45 -0
- package/dist/builtin/workflows/skills/impeccable/reference/craft.md +3 -121
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +28 -20
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +97 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +23 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +32 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/dist/builtin/workflows/skills/impeccable/reference/delight.md +47 -279
- package/dist/builtin/workflows/skills/impeccable/reference/distill.md +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +53 -0
- package/dist/builtin/workflows/skills/impeccable/reference/document.md +60 -73
- package/dist/builtin/workflows/skills/impeccable/reference/harden.md +1 -12
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +23 -12
- package/dist/builtin/workflows/skills/impeccable/reference/init.md +64 -163
- package/dist/builtin/workflows/skills/impeccable/reference/ios.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/layout.md +52 -153
- package/dist/builtin/workflows/skills/impeccable/reference/live.md +47 -36
- package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +105 -0
- package/dist/builtin/workflows/skills/impeccable/reference/{product.md → operate.md} +6 -5
- package/dist/builtin/workflows/skills/impeccable/reference/optimize.md +4 -4
- package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -4
- package/dist/builtin/workflows/skills/impeccable/reference/polish.md +68 -212
- package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/routing.md +18 -0
- package/dist/builtin/workflows/skills/impeccable/reference/shape.md +38 -144
- package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +48 -269
- package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +38 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/command-metadata.json +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +584 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +117 -9
- package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +486 -59
- package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +16 -45
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +96 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +143 -26
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +181 -12
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +3187 -182
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +102 -7
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +282 -70
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +183 -15
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +22 -7
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/findings.mjs +7 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +16 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +155 -42
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +2988 -155
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/constants.mjs +11 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +336 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +232 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +92 -30
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +414 -120
- package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +25 -8
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/artifact-schema.mjs +93 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +165 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +329 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +20 -5
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-paths.mjs +16 -8
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/provider.mjs +1 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +455 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-notice.mjs +169 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +457 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/surface-briefs.mjs +151 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/target-slug.mjs +33 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/template-extensions.mjs +146 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/completion.mjs +10 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +15 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/generation-preflight.mjs +149 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/poll-lanes.mjs +14 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +109 -32
- package/dist/builtin/workflows/skills/impeccable/scripts/live/source-lock.mjs +105 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/source-search.mjs +105 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +8 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +208 -68
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +565 -115
- package/dist/builtin/workflows/skills/impeccable/scripts/live-commit-manual-edits.mjs +3 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +198 -14
- package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +24 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +6 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +44 -14
- package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +398 -33
- package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +9 -5
- package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +81 -67
- package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +7 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/palette.mjs +76 -81
- package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +4 -4
- package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +890 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/surface-brief.mjs +74 -0
- package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +57 -252
- package/dist/builtin/workflows/skills/prompt-engineer/references/advanced_patterns.md +70 -226
- package/dist/builtin/workflows/skills/prompt-engineer/references/core_prompting.md +64 -103
- package/dist/builtin/workflows/skills/prompt-engineer/references/quality_improvement.md +81 -155
- package/dist/builtin/workflows/src/authoring.d.ts +5 -1
- package/dist/builtin/workflows/src/durable/backend.ts +68 -9
- package/dist/builtin/workflows/src/durable/boundary-lifecycle.ts +148 -0
- package/dist/builtin/workflows/src/durable/boundary-topology.ts +420 -0
- package/dist/builtin/workflows/src/durable/child-invocation.ts +14 -0
- package/dist/builtin/workflows/src/durable/child-primitive.ts +74 -44
- package/dist/builtin/workflows/src/durable/completed-catalog-stage-groups.ts +250 -0
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +205 -131
- package/dist/builtin/workflows/src/durable/completed-inspection.ts +8 -2
- package/dist/builtin/workflows/src/durable/completed-subtree.ts +31 -0
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +28 -24
- package/dist/builtin/workflows/src/durable/dbos-envelope.ts +130 -3
- package/dist/builtin/workflows/src/durable/dbos-metadata.ts +18 -0
- package/dist/builtin/workflows/src/durable/scoped-backend.ts +64 -17
- package/dist/builtin/workflows/src/durable/stage-primitive.ts +60 -60
- package/dist/builtin/workflows/src/durable/stage-topology-validation.ts +234 -0
- package/dist/builtin/workflows/src/durable/stage-topology.ts +53 -0
- package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +49 -0
- package/dist/builtin/workflows/src/durable/tool-outcome.ts +120 -0
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +367 -58
- package/dist/builtin/workflows/src/durable/types.ts +97 -0
- package/dist/builtin/workflows/src/durable/ui-primitive.ts +46 -0
- package/dist/builtin/workflows/src/durable/workflow-child-result.ts +58 -0
- package/dist/builtin/workflows/src/engine/options.ts +1 -0
- package/dist/builtin/workflows/src/engine/primitives/workflow.ts +19 -10
- package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +11 -1
- package/dist/builtin/workflows/src/engine/run-durable-topology.ts +190 -18
- package/dist/builtin/workflows/src/engine/run-terminal-event.ts +37 -0
- package/dist/builtin/workflows/src/engine/run-terminal-failure.ts +50 -0
- package/dist/builtin/workflows/src/engine/run-tool-execution-tracker.ts +152 -0
- package/dist/builtin/workflows/src/engine/run-tool-node-lifecycle.ts +87 -0
- package/dist/builtin/workflows/src/engine/run.ts +111 -110
- package/dist/builtin/workflows/src/engine/runtime.ts +15 -2
- package/dist/builtin/workflows/src/extension/extension-factory.ts +1 -0
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +11 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +6710 -4810
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +16 -5
- package/dist/builtin/workflows/src/extension/render-result.ts +16 -2
- package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +3 -0
- package/dist/builtin/workflows/src/extension/runtime.ts +4 -0
- package/dist/builtin/workflows/src/extension/wiring.ts +3 -1
- package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +1 -0
- package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +9 -3
- package/dist/builtin/workflows/src/extension/workflow-module-loader.ts +18 -3
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +22 -11
- package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +43 -0
- package/dist/builtin/workflows/src/extension/workflow-targets.ts +34 -30
- package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +12 -5
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +162 -63
- package/dist/builtin/workflows/src/runs/background/run-inspect.ts +7 -1
- package/dist/builtin/workflows/src/runs/background/status.ts +18 -8
- package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +3 -11
- package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +24 -21
- package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +30 -13
- package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +102 -53
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +13 -5
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +49 -17
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +11 -4
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +1 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +7 -1
- package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +53 -4
- package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +146 -17
- package/dist/builtin/workflows/src/runs/foreground/stage-delivery-activity.ts +86 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +18 -6
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +45 -46
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +5 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-pause.ts +195 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +8 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +0 -13
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +30 -2
- package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +3 -143
- package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +6 -11
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +6 -11
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +57 -6
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +76 -11
- package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +206 -116
- package/dist/builtin/workflows/src/shared/intercom-group.ts +17 -10
- package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +30 -0
- package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +5 -0
- package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +3 -3
- package/dist/builtin/workflows/src/shared/store-factory.ts +2 -0
- package/dist/builtin/workflows/src/shared/store-internal.ts +8 -0
- package/dist/builtin/workflows/src/shared/store-public-types.ts +8 -0
- package/dist/builtin/workflows/src/shared/store-run-methods.ts +9 -0
- package/dist/builtin/workflows/src/shared/store-stage-methods.ts +2 -0
- package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +46 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +34 -0
- package/dist/builtin/workflows/src/shared/types.ts +14 -24
- package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +11 -5
- package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +58 -0
- package/dist/builtin/workflows/src/shared/workflow-run-ownership.ts +53 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +2 -8
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +11 -4
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +1 -0
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +27 -9
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +4 -3
- package/dist/builtin/workflows/src/tui/node-card.ts +4 -3
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +0 -4
- package/dist/builtin/workflows/src/tui/run-detail.ts +53 -17
- package/dist/builtin/workflows/src/tui/session-list.ts +8 -4
- package/dist/builtin/workflows/src/tui/stage-chat-view-delivery-activity.ts +121 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-live-events.ts +42 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +12 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-render-settings.ts +21 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +19 -19
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +4 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +4 -2
- package/dist/builtin/workflows/src/tui/switcher.ts +13 -3
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +1 -1
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +0 -9
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +16 -49
- package/dist/builtin/workflows/src/tui/workflow-status.ts +7 -0
- package/dist/builtin/workflows/src/workflows/identity.ts +1 -1
- package/dist/cli/args.d.ts +0 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -20
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +1 -2
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +2 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config-self-update.js +1 -1
- package/dist/config-self-update.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -10
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.js +2 -1
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts +4 -3
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +55 -59
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts +9 -6
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +32 -13
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts +11 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +87 -19
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-custom-message-commit.d.ts +14 -0
- package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -0
- package/dist/core/agent-session-custom-message-commit.js +141 -0
- package/dist/core/agent-session-custom-message-commit.js.map +1 -0
- package/dist/core/agent-session-delivery-forwarding.d.ts +9 -0
- package/dist/core/agent-session-delivery-forwarding.d.ts.map +1 -0
- package/dist/core/agent-session-delivery-forwarding.js +36 -0
- package/dist/core/agent-session-delivery-forwarding.js.map +1 -0
- package/dist/core/agent-session-events.d.ts +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +45 -14
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +2 -6
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +18 -11
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts +5 -2
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +91 -97
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +47 -39
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-models.d.ts +2 -38
- package/dist/core/agent-session-models.d.ts.map +1 -1
- package/dist/core/agent-session-models.js +5 -147
- package/dist/core/agent-session-models.js.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.d.ts +47 -0
- package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -0
- package/dist/core/agent-session-persistent-custom-messages.js +267 -0
- package/dist/core/agent-session-persistent-custom-messages.js.map +1 -0
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.js +34 -9
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts +2 -0
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +42 -16
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-queue-pause.d.ts +10 -0
- package/dist/core/agent-session-queue-pause.d.ts.map +1 -0
- package/dist/core/agent-session-queue-pause.js +86 -0
- package/dist/core/agent-session-queue-pause.js.map +1 -0
- package/dist/core/agent-session-retry.d.ts +0 -11
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +8 -57
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-runtime-auth.d.ts +6 -0
- package/dist/core/agent-session-runtime-auth.d.ts.map +1 -0
- package/dist/core/agent-session-runtime-auth.js +26 -0
- package/dist/core/agent-session-runtime-auth.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +13 -2
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +32 -6
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +0 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +6 -7
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +3 -0
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
- package/dist/core/agent-session-tool-hooks.js +6 -1
- package/dist/core/agent-session-tool-hooks.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +2 -18
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-transfer.d.ts +4 -0
- package/dist/core/agent-session-transfer.d.ts.map +1 -0
- package/dist/core/agent-session-transfer.js +71 -0
- package/dist/core/agent-session-transfer.js.map +1 -0
- package/dist/core/agent-session-tree.js +1 -1
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +5 -11
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js +0 -3
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +8 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/atomic-guide-command.d.ts.map +1 -1
- package/dist/core/atomic-guide-command.js +31 -33
- package/dist/core/atomic-guide-command.js.map +1 -1
- package/dist/core/auth-storage.js +2 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +5 -3
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +5 -4
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/builtin-packages.js +0 -6
- package/dist/core/builtin-packages.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +8 -3
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +17 -6
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction-boundary.d.ts +18 -1
- package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
- package/dist/core/compaction/compaction-boundary.js +2 -2
- package/dist/core/compaction/compaction-boundary.js.map +1 -1
- package/dist/core/compaction/compaction-runner.d.ts +61 -6
- package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
- package/dist/core/compaction/compaction-runner.js +242 -18
- package/dist/core/compaction/compaction-runner.js.map +1 -1
- package/dist/core/compaction/compaction-types.d.ts +53 -2
- package/dist/core/compaction/compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/compaction-types.js.map +1 -1
- package/dist/core/compaction/fallback-planner.d.ts +64 -0
- package/dist/core/compaction/fallback-planner.d.ts.map +1 -0
- package/dist/core/compaction/fallback-planner.js +75 -0
- package/dist/core/compaction/fallback-planner.js.map +1 -0
- package/dist/core/compaction/index.d.ts +3 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +3 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/planner-outcome.d.ts +86 -0
- package/dist/core/compaction/planner-outcome.d.ts.map +1 -0
- package/dist/core/compaction/planner-outcome.js +122 -0
- package/dist/core/compaction/planner-outcome.js.map +1 -0
- package/dist/core/compaction/range-planner-diagnostics.d.ts +58 -6
- package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.js +69 -31
- package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
- package/dist/core/compaction/range-planner.d.ts +36 -8
- package/dist/core/compaction/range-planner.d.ts.map +1 -1
- package/dist/core/compaction/range-planner.js +136 -51
- package/dist/core/compaction/range-planner.js.map +1 -1
- package/dist/core/compaction/region-trimming.d.ts +34 -0
- package/dist/core/compaction/region-trimming.d.ts.map +1 -0
- package/dist/core/compaction/region-trimming.js +73 -0
- package/dist/core/compaction/region-trimming.js.map +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts +8 -1
- package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
- package/dist/core/compaction/transcript-serialization.js +78 -27
- package/dist/core/compaction/transcript-serialization.js.map +1 -1
- package/dist/core/context-tool-pairing.d.ts +19 -0
- package/dist/core/context-tool-pairing.d.ts.map +1 -0
- package/dist/core/context-tool-pairing.js +50 -0
- package/dist/core/context-tool-pairing.js.map +1 -0
- package/dist/core/diagnostics.d.ts +8 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +3 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +2 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +48 -27
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-runtime.d.ts +2 -4
- package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
- package/dist/core/extensions/loader-runtime.js +199 -18
- package/dist/core/extensions/loader-runtime.js.map +1 -1
- package/dist/core/extensions/message-types.d.ts +7 -4
- package/dist/core/extensions/message-types.d.ts.map +1 -1
- package/dist/core/extensions/message-types.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +9 -4
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +2 -0
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +4 -0
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +28 -20
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +25 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +7 -3
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +14 -4
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/fallback-models.d.ts +37 -0
- package/dist/core/fallback-models.d.ts.map +1 -0
- package/dist/core/fallback-models.js +48 -0
- package/dist/core/fallback-models.js.map +1 -0
- package/dist/core/flattened-tool-arguments.d.ts +4 -7
- package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
- package/dist/core/flattened-tool-arguments.js +4 -7
- package/dist/core/flattened-tool-arguments.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +0 -5
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/messages.d.ts +14 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +28 -4
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-capabilities.d.ts +18 -0
- package/dist/core/model-capabilities.d.ts.map +1 -0
- package/dist/core/model-capabilities.js +23 -0
- package/dist/core/model-capabilities.js.map +1 -0
- package/dist/core/model-registry-auth.d.ts.map +1 -1
- package/dist/core/model-registry-auth.js +0 -2
- package/dist/core/model-registry-auth.js.map +1 -1
- package/dist/core/model-registry-builtins.d.ts +0 -2
- package/dist/core/model-registry-builtins.d.ts.map +1 -1
- package/dist/core/model-registry-builtins.js +9 -76
- package/dist/core/model-registry-builtins.js.map +1 -1
- package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
- package/dist/core/model-registry-custom-loader.js +1 -12
- package/dist/core/model-registry-custom-loader.js.map +1 -1
- package/dist/core/model-registry-dynamic.d.ts.map +1 -1
- package/dist/core/model-registry-dynamic.js +3 -15
- package/dist/core/model-registry-dynamic.js.map +1 -1
- package/dist/core/model-registry-extension-refresh.d.ts +23 -0
- package/dist/core/model-registry-extension-refresh.d.ts.map +1 -0
- package/dist/core/model-registry-extension-refresh.js +32 -0
- package/dist/core/model-registry-extension-refresh.js.map +1 -0
- package/dist/core/model-registry-schemas.d.ts +118 -9
- package/dist/core/model-registry-schemas.d.ts.map +1 -1
- package/dist/core/model-registry-schemas.js +10 -3
- package/dist/core/model-registry-schemas.js.map +1 -1
- package/dist/core/model-registry-types.d.ts +5 -5
- package/dist/core/model-registry-types.d.ts.map +1 -1
- package/dist/core/model-registry-types.js.map +1 -1
- package/dist/core/model-registry-validation.d.ts +7 -0
- package/dist/core/model-registry-validation.d.ts.map +1 -0
- package/dist/core/model-registry-validation.js +12 -0
- package/dist/core/model-registry-validation.js.map +1 -0
- package/dist/core/model-registry.d.ts +5 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +34 -33
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-defaults.d.ts.map +1 -1
- package/dist/core/model-resolver-defaults.js +0 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.js +9 -0
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver-patterns.d.ts.map +1 -1
- package/dist/core/model-resolver-patterns.js +0 -2
- package/dist/core/model-resolver-patterns.js.map +1 -1
- package/dist/core/model-resolver-scope.d.ts +2 -0
- package/dist/core/model-resolver-scope.d.ts.map +1 -1
- package/dist/core/model-resolver-scope.js +18 -4
- package/dist/core/model-resolver-scope.js.map +1 -1
- package/dist/core/model-resolver-types.d.ts +2 -0
- package/dist/core/model-resolver-types.d.ts.map +1 -1
- package/dist/core/model-resolver-types.js.map +1 -1
- package/dist/core/oauth-provider-bridge.d.ts +21 -0
- package/dist/core/oauth-provider-bridge.d.ts.map +1 -1
- package/dist/core/oauth-provider-bridge.js +68 -7
- package/dist/core/oauth-provider-bridge.js.map +1 -1
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
- package/dist/core/package-manager-auto-resources.js +12 -4
- package/dist/core/package-manager-auto-resources.js.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.js +42 -11
- package/dist/core/package-manager-resolver.js.map +1 -1
- package/dist/core/package-manager-types.d.ts +2 -0
- package/dist/core/package-manager-types.d.ts.map +1 -1
- package/dist/core/package-manager-types.js.map +1 -1
- package/dist/core/package-manager.d.ts +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +17 -11
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader-assets.d.ts.map +1 -1
- package/dist/core/resource-loader-assets.js +30 -4
- package/dist/core/resource-loader-assets.js.map +1 -1
- package/dist/core/resource-loader-context-files.d.ts.map +1 -1
- package/dist/core/resource-loader-context-files.js +3 -1
- package/dist/core/resource-loader-context-files.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +2 -1
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +3 -0
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-extensions.d.ts +1 -0
- package/dist/core/resource-loader-extensions.d.ts.map +1 -1
- package/dist/core/resource-loader-extensions.js +120 -7
- package/dist/core/resource-loader-extensions.js.map +1 -1
- package/dist/core/resource-loader-package-resources.d.ts.map +1 -1
- package/dist/core/resource-loader-package-resources.js +14 -1
- package/dist/core/resource-loader-package-resources.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +2 -1
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-source-info.d.ts.map +1 -1
- package/dist/core/resource-loader-source-info.js +6 -3
- package/dist/core/resource-loader-source-info.js.map +1 -1
- package/dist/core/sdk-types.d.ts +11 -10
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +13 -84
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +3 -3
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +18 -25
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +2 -5
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +2 -8
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-history.d.ts +3 -3
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +49 -27
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/session-manager-storage.d.ts +6 -0
- package/dist/core/session-manager-storage.d.ts.map +1 -1
- package/dist/core/session-manager-storage.js +38 -5
- package/dist/core/session-manager-storage.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +6 -6
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +0 -4
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +0 -50
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-core.d.ts +2 -4
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-core.js +5 -51
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-storage.d.ts +3 -1
- package/dist/core/settings-storage.d.ts.map +1 -1
- package/dist/core/settings-storage.js +22 -0
- package/dist/core/settings-storage.js.map +1 -1
- package/dist/core/settings-types.d.ts +2 -4
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +68 -22
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +3 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +2 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.js +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
- package/dist/core/tools/bash-session-environment.d.ts +13 -0
- package/dist/core/tools/bash-session-environment.d.ts.map +1 -0
- package/dist/core/tools/bash-session-environment.js +35 -0
- package/dist/core/tools/bash-session-environment.js.map +1 -0
- package/dist/core/tools/bash.d.ts +4 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -8
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +3 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +10 -2
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts +3 -2
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +9 -3
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/main-session-options.d.ts.map +1 -1
- package/dist/main-session-options.js +0 -4
- package/dist/main-session-options.js.map +1 -1
- package/dist/main-session.d.ts.map +1 -1
- package/dist/main-session.js +2 -1
- package/dist/main-session.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -17
- package/dist/main.js.map +1 -1
- package/dist/modes/index.d.ts +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/chat-input-actions.d.ts +1 -1
- package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
- package/dist/modes/interactive/chat-input-actions.js +14 -96
- package/dist/modes/interactive/chat-input-actions.js.map +1 -1
- package/dist/modes/interactive/components/atomic-banner.d.ts +9 -8
- package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
- package/dist/modes/interactive/components/atomic-banner.js +68 -24
- package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
- package/dist/modes/interactive/components/atomic-working-status.d.ts +52 -0
- package/dist/modes/interactive/components/atomic-working-status.d.ts.map +1 -0
- package/dist/modes/interactive/components/atomic-working-status.js +202 -0
- package/dist/modes/interactive/components/atomic-working-status.js.map +1 -0
- package/dist/modes/interactive/components/chat-message-renderer.js +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js +87 -7
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.js +3 -3
- package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.js +61 -9
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +23 -7
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +27 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.js +120 -18
- package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +9 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +5 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.d.ts +10 -0
- package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +13 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +22 -1
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js +2 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +9 -2
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +3 -2
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +14 -43
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +18 -13
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/startup-identity.d.ts +22 -0
- package/dist/modes/interactive/components/startup-identity.d.ts.map +1 -0
- package/dist/modes/interactive/components/startup-identity.js +58 -0
- package/dist/modes/interactive/components/startup-identity.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.js +0 -6
- package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-model.js +0 -1
- package/dist/modes/interactive/components/tree-selector-model.js.map +1 -1
- package/dist/modes/interactive/components/working-status.d.ts +5 -11
- package/dist/modes/interactive/components/working-status.d.ts.map +1 -1
- package/dist/modes/interactive/components/working-status.js +14 -15
- package/dist/modes/interactive/components/working-status.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts +23 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -0
- package/dist/modes/interactive/external-editor.js +120 -0
- package/dist/modes/interactive/external-editor.js.map +1 -0
- package/dist/modes/interactive/interactive-agent-events.js +33 -22
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js +16 -6
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.js +3 -0
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.d.ts +2 -1
- package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.js +8 -0
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +49 -19
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.js +4 -3
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-dialogs.js +1 -1
- package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +3 -2
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-initial-session-binding.d.ts +4 -0
- package/dist/modes/interactive/interactive-initial-session-binding.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-initial-session-binding.js +23 -0
- package/dist/modes/interactive/interactive-initial-session-binding.js.map +1 -0
- package/dist/modes/interactive/interactive-input-handling.d.ts +2 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +27 -51
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +11 -7
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +14 -6
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -4
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +2 -4
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -8
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +2 -3
- package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.js +3 -6
- package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +26 -97
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-pause.d.ts +4 -0
- package/dist/modes/interactive/interactive-pause.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-pause.js +8 -0
- package/dist/modes/interactive/interactive-pause.js.map +1 -0
- package/dist/modes/interactive/interactive-process-lifecycle.js +5 -4
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-turn.d.ts +2 -0
- package/dist/modes/interactive/interactive-prompt-turn.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-prompt-turn.js +41 -0
- package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -0
- package/dist/modes/interactive/interactive-render-chat.js +20 -8
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-paths.js +11 -2
- package/dist/modes/interactive/interactive-resource-paths.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.js +99 -0
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup-chat-container.d.ts +20 -0
- package/dist/modes/interactive/interactive-startup-chat-container.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-startup-chat-container.js +26 -0
- package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -0
- package/dist/modes/interactive/interactive-startup.d.ts +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +30 -25
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-summarization-retry-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-summarization-retry-events.js +9 -3
- package/dist/modes/interactive/interactive-summarization-retry-events.js.map +1 -1
- package/dist/modes/interactive/theme/catppuccin-frappe.json +1 -1
- package/dist/modes/interactive/theme/catppuccin-latte.json +1 -1
- package/dist/modes/interactive/theme/catppuccin-macchiato.json +1 -1
- package/dist/modes/interactive/theme/catppuccin-mocha.json +9 -1
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/light.json +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts +4 -0
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +7 -0
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.js +4 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts +32 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.js +8 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +15 -2
- package/dist/modes/interactive/whimsical-messages.d.ts +1 -0
- package/dist/modes/interactive/whimsical-messages.d.ts.map +1 -1
- package/dist/modes/interactive/whimsical-messages.js +2 -2
- package/dist/modes/interactive/whimsical-messages.js.map +1 -1
- package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/create-isolated-runtime.js +3 -1
- package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-args.js +0 -1
- package/dist/modes/interactive-engine/engine-args.js.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +5 -17
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.js +8 -19
- package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +2 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.js +3 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.d.ts +10 -0
- package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -0
- package/dist/modes/interactive-engine/isolated-auth.js +14 -0
- package/dist/modes/interactive-engine/isolated-auth.js.map +1 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +9 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +46 -34
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
- package/dist/modes/interactive-engine/protocol.js +3 -10
- package/dist/modes/interactive-engine/protocol.js.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts +1 -0
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js +10 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
- package/dist/modes/interactive-engine/remote-queue-pause.d.ts +13 -0
- package/dist/modes/interactive-engine/remote-queue-pause.d.ts.map +1 -0
- package/dist/modes/interactive-engine/remote-queue-pause.js +38 -0
- package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -0
- package/dist/modes/interactive-engine/remote-renderer.d.ts +3 -1
- package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-renderer.js +4 -1
- package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +5 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +2 -7
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js +7 -24
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/queued-writer.d.ts +19 -0
- package/dist/modes/rpc/queued-writer.d.ts.map +1 -0
- package/dist/modes/rpc/{bounded-writer.js → queued-writer.js} +7 -30
- package/dist/modes/rpc/queued-writer.js.map +1 -0
- package/dist/modes/rpc/rpc-bash-request-owners.d.ts +24 -0
- package/dist/modes/rpc/rpc-bash-request-owners.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-bash-request-owners.js +45 -0
- package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -0
- package/dist/modes/rpc/rpc-client-api.d.ts +8 -5
- package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-api.js +10 -11
- package/dist/modes/rpc/rpc-client-api.js.map +1 -1
- package/dist/modes/rpc/rpc-client-process.d.ts +1 -4
- package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-process.js +2 -14
- package/dist/modes/rpc/rpc-client-process.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +8 -4
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +21 -30
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts +7 -4
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +76 -93
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.d.ts +3 -3
- package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.js +7 -4
- package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +5 -5
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-model-fallback-prompt.d.ts +4 -0
- package/dist/modes/rpc/rpc-model-fallback-prompt.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-model-fallback-prompt.js +11 -0
- package/dist/modes/rpc/rpc-model-fallback-prompt.js.map +1 -0
- package/dist/modes/rpc/rpc-oauth-client.d.ts +22 -0
- package/dist/modes/rpc/rpc-oauth-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-oauth-client.js +74 -0
- package/dist/modes/rpc/rpc-oauth-client.js.map +1 -0
- package/dist/modes/rpc/rpc-oauth-interaction.d.ts +9 -0
- package/dist/modes/rpc/rpc-oauth-interaction.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-oauth-interaction.js +49 -0
- package/dist/modes/rpc/rpc-oauth-interaction.js.map +1 -0
- package/dist/modes/rpc/rpc-output-buffer.d.ts +2 -1
- package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-output-buffer.js +4 -39
- package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.d.ts +23 -0
- package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-provider-auth.js +145 -0
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -0
- package/dist/modes/rpc/rpc-responses.d.ts +0 -1
- package/dist/modes/rpc/rpc-responses.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-responses.js +0 -14
- package/dist/modes/rpc/rpc-responses.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +83 -27
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +21 -8
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +3 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/changelog.mdx +12 -1
- package/docs/compaction.md +101 -18
- package/docs/custom-provider.md +13 -4
- package/docs/docs.json +1 -0
- package/docs/environment-variables.md +37 -0
- package/docs/extensions.md +45 -9
- package/docs/index.md +1 -0
- package/docs/intercom.md +1 -1
- package/docs/json.md +4 -4
- package/docs/keybindings.md +4 -2
- package/docs/llama-cpp.md +3 -1
- package/docs/models.md +29 -43
- package/docs/providers.md +18 -24
- package/docs/quickstart.md +19 -16
- package/docs/rpc.md +38 -85
- package/docs/sdk.md +15 -22
- package/docs/session-format.md +2 -15
- package/docs/sessions.md +1 -1
- package/docs/settings.md +10 -15
- package/docs/skills.md +8 -0
- package/docs/subagents.md +17 -9
- package/docs/themes.md +10 -1
- package/docs/tui.md +10 -5
- package/docs/usage.md +21 -2
- package/docs/windows.md +1 -1
- package/docs/workflows.md +1096 -518
- package/examples/extensions/README.md +1 -1
- package/examples/extensions/handoff.ts +8 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/examples/extensions/summarize.ts +3 -0
- package/examples/extensions/working-indicator.ts +2 -2
- package/npm-shrinkwrap.json +40 -46
- package/package.json +9 -7
- package/dist/builtin/cursor/CHANGELOG.md +0 -281
- package/dist/builtin/cursor/LICENSE +0 -26
- package/dist/builtin/cursor/README.md +0 -24
- package/dist/builtin/cursor/index.ts +0 -9
- package/dist/builtin/cursor/package.json +0 -47
- package/dist/builtin/cursor/src/auth.ts +0 -352
- package/dist/builtin/cursor/src/catalog-cache.ts +0 -155
- package/dist/builtin/cursor/src/config.ts +0 -123
- package/dist/builtin/cursor/src/conversation-state.ts +0 -135
- package/dist/builtin/cursor/src/cursor-models-raw.json +0 -412
- package/dist/builtin/cursor/src/model-mapper.ts +0 -369
- package/dist/builtin/cursor/src/model-reference.ts +0 -282
- package/dist/builtin/cursor/src/models.ts +0 -54
- package/dist/builtin/cursor/src/native-loader.ts +0 -71
- package/dist/builtin/cursor/src/proto/README.md +0 -34
- package/dist/builtin/cursor/src/proto/agent_pb.ts +0 -15294
- package/dist/builtin/cursor/src/proto/protobuf-codec-base64.ts +0 -22
- package/dist/builtin/cursor/src/proto/protobuf-codec-json.ts +0 -44
- package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +0 -311
- package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +0 -248
- package/dist/builtin/cursor/src/proto/protobuf-codec.ts +0 -200
- package/dist/builtin/cursor/src/provider.ts +0 -301
- package/dist/builtin/cursor/src/stream.ts +0 -494
- package/dist/builtin/cursor/src/transport-errors.ts +0 -74
- package/dist/builtin/cursor/src/transport-frame.ts +0 -56
- package/dist/builtin/cursor/src/transport-http2.ts +0 -122
- package/dist/builtin/cursor/src/transport-native-client.ts +0 -161
- package/dist/builtin/cursor/src/transport-run-stream.ts +0 -188
- package/dist/builtin/cursor/src/transport-timeouts.ts +0 -87
- package/dist/builtin/cursor/src/transport-types.ts +0 -143
- package/dist/builtin/cursor/src/transport.ts +0 -26
- package/dist/builtin/workflows/builtin/deep-research-codebase-runner.ts +0 -492
- package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +0 -383
- package/dist/builtin/workflows/builtin/deep-research-codebase.d.ts +0 -35
- package/dist/builtin/workflows/builtin/deep-research-codebase.ts +0 -47
- package/dist/builtin/workflows/skills/impeccable/reference/brand.md +0 -108
- package/dist/builtin/workflows/skills/impeccable/reference/codex.md +0 -105
- package/dist/builtin/workflows/skills/impeccable/reference/interaction-design.md +0 -189
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +0 -516
- package/dist/core/context-window.d.ts +0 -54
- package/dist/core/context-window.d.ts.map +0 -1
- package/dist/core/context-window.js +0 -110
- package/dist/core/context-window.js.map +0 -1
- package/dist/core/copilot-anthropic-sse-repair.d.ts +0 -23
- package/dist/core/copilot-anthropic-sse-repair.d.ts.map +0 -1
- package/dist/core/copilot-anthropic-sse-repair.js +0 -340
- package/dist/core/copilot-anthropic-sse-repair.js.map +0 -1
- package/dist/core/copilot-errors.d.ts +0 -9
- package/dist/core/copilot-errors.d.ts.map +0 -1
- package/dist/core/copilot-errors.js +0 -32
- package/dist/core/copilot-errors.js.map +0 -1
- package/dist/core/copilot-gemini-payload-sanitizer.d.ts +0 -72
- package/dist/core/copilot-gemini-payload-sanitizer.d.ts.map +0 -1
- package/dist/core/copilot-gemini-payload-sanitizer.js +0 -296
- package/dist/core/copilot-gemini-payload-sanitizer.js.map +0 -1
- package/dist/core/copilot-gemini-reasoning.d.ts +0 -126
- package/dist/core/copilot-gemini-reasoning.d.ts.map +0 -1
- package/dist/core/copilot-gemini-reasoning.js +0 -265
- package/dist/core/copilot-gemini-reasoning.js.map +0 -1
- package/dist/core/copilot-gemini-tool-arguments.d.ts +0 -42
- package/dist/core/copilot-gemini-tool-arguments.d.ts.map +0 -1
- package/dist/core/copilot-gemini-tool-arguments.js +0 -159
- package/dist/core/copilot-gemini-tool-arguments.js.map +0 -1
- package/dist/core/copilot-hosts.d.ts +0 -12
- package/dist/core/copilot-hosts.d.ts.map +0 -1
- package/dist/core/copilot-hosts.js +0 -33
- package/dist/core/copilot-hosts.js.map +0 -1
- package/dist/core/copilot-model-catalog.d.ts +0 -114
- package/dist/core/copilot-model-catalog.d.ts.map +0 -1
- package/dist/core/copilot-model-catalog.js +0 -392
- package/dist/core/copilot-model-catalog.js.map +0 -1
- package/dist/core/copilot-model-static-fallbacks.d.ts +0 -43
- package/dist/core/copilot-model-static-fallbacks.d.ts.map +0 -1
- package/dist/core/copilot-model-static-fallbacks.js +0 -50
- package/dist/core/copilot-model-static-fallbacks.js.map +0 -1
- package/dist/core/copilot-model-synthesis.d.ts +0 -10
- package/dist/core/copilot-model-synthesis.d.ts.map +0 -1
- package/dist/core/copilot-model-synthesis.js +0 -91
- package/dist/core/copilot-model-synthesis.js.map +0 -1
- package/dist/modes/interactive/components/context-window-selector.d.ts +0 -53
- package/dist/modes/interactive/components/context-window-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/context-window-selector.js +0 -136
- package/dist/modes/interactive/components/context-window-selector.js.map +0 -1
- package/dist/modes/rpc/bounded-writer.d.ts +0 -27
- package/dist/modes/rpc/bounded-writer.d.ts.map +0 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
506
|
-
|
|
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
|
-
|
|
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
|
|
851
|
-
|
|
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
|
-
//
|
|
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 ||
|
|
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
|
-
|
|
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
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
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
|
-
|
|
1629
|
-
|
|
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 (
|
|
1634
|
-
|
|
1635
|
-
pendingWinner = { filePath, known };
|
|
1636
|
-
} else if (
|
|
1637
|
-
|
|
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),
|
|
1643
|
-
//
|
|
1644
|
-
//
|
|
1645
|
-
//
|
|
1646
|
-
|
|
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 (
|
|
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
|
|
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({
|
|
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
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
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') {
|