@bastani/atomic 0.9.5-alpha.8 → 0.9.5
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 +122 -0
- package/README.md +2 -2
- package/dist/builtin/cursor/CHANGELOG.md +12 -0
- package/dist/builtin/cursor/package.json +3 -3
- package/dist/builtin/cursor/src/model-mapper.ts +6 -3
- package/dist/builtin/intercom/CHANGELOG.md +37 -0
- package/dist/builtin/intercom/README.md +4 -2
- package/dist/builtin/intercom/broker/broker.ts +6 -114
- package/dist/builtin/intercom/broker/client.ts +29 -54
- package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
- package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
- package/dist/builtin/intercom/broker/send-handler.ts +106 -0
- package/dist/builtin/intercom/broker/send-signature.ts +37 -0
- package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
- package/dist/builtin/intercom/index-heavy.ts +49 -53
- package/dist/builtin/intercom/index.ts +278 -262
- package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
- package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
- package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
- package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
- package/dist/builtin/intercom/lifecycle.ts +37 -20
- package/dist/builtin/intercom/package.json +3 -6
- package/dist/builtin/intercom/reply-routing.ts +17 -0
- package/dist/builtin/intercom/subagent-relay.ts +58 -12
- package/dist/builtin/intercom/types.ts +3 -3
- package/dist/builtin/mcp/CHANGELOG.md +38 -0
- package/dist/builtin/mcp/OAUTH.md +1 -0
- package/dist/builtin/mcp/README.md +10 -6
- package/dist/builtin/mcp/apps-cancellation.ts +32 -0
- package/dist/builtin/mcp/call-tool-result.ts +9 -0
- package/dist/builtin/mcp/caller-wait.ts +50 -0
- package/dist/builtin/mcp/command-registration.ts +82 -0
- package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
- package/dist/builtin/mcp/direct-tools.ts +40 -255
- package/dist/builtin/mcp/host-html-template.ts +4 -2
- package/dist/builtin/mcp/index.ts +274 -239
- package/dist/builtin/mcp/init.ts +96 -126
- package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
- package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
- package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
- package/dist/builtin/mcp/metadata-hydration.ts +52 -0
- package/dist/builtin/mcp/package.json +3 -3
- package/dist/builtin/mcp/proxy-auth.ts +4 -4
- package/dist/builtin/mcp/proxy-call.ts +111 -40
- package/dist/builtin/mcp/proxy-connect.ts +35 -15
- package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
- package/dist/builtin/mcp/proxy-modes.ts +3 -3
- package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
- package/dist/builtin/mcp/startup-warmup.ts +98 -0
- package/dist/builtin/mcp/state-lease.ts +12 -0
- package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
- package/dist/builtin/mcp/ui-server.ts +8 -8
- package/dist/builtin/mcp/ui-session.ts +9 -18
- package/dist/builtin/subagents/CHANGELOG.md +78 -0
- package/dist/builtin/subagents/README.md +30 -29
- package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
- package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
- package/dist/builtin/subagents/agents/debugger.md +2 -2
- package/dist/builtin/subagents/agents/worker.md +2 -2
- package/dist/builtin/subagents/package.json +5 -5
- package/dist/builtin/subagents/prompts/review-loop.md +1 -1
- package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
- package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
- package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
- package/dist/builtin/subagents/src/extension/index.ts +289 -320
- package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
- package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
- package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
- package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
- package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
- package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
- package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
- package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
- package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
- package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
- package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
- package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
- package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
- package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
- package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
- package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
- package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
- package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
- package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
- package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
- package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
- package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
- package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -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 +7 -9
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
- package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
- package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
- package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
- package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
- package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
- package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
- package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
- package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
- package/dist/builtin/subagents/src/shared/settings.ts +20 -10
- package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
- package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
- package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
- package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
- package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
- package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
- package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
- package/dist/builtin/subagents/src/tui/render-widget.ts +157 -89
- package/dist/builtin/web-access/CHANGELOG.md +28 -0
- package/dist/builtin/web-access/README.md +4 -0
- package/dist/builtin/web-access/content-tools.ts +8 -3
- package/dist/builtin/web-access/index-heavy.ts +1 -1
- package/dist/builtin/web-access/index.ts +190 -46
- package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/web-access/result-renderers.ts +1 -1
- package/dist/builtin/web-access/summary-review.ts +1 -1
- package/dist/builtin/web-access/web-search-activity.ts +1 -1
- package/dist/builtin/web-access/web-search-return.ts +7 -0
- package/dist/builtin/web-access/web-search-summary.ts +1 -1
- package/dist/builtin/web-access/web-search-tool.ts +4 -2
- package/dist/builtin/workflows/CHANGELOG.md +86 -0
- package/dist/builtin/workflows/README.md +5 -5
- package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +27 -4
- package/dist/builtin/workflows/builtin/goal-runner.ts +86 -27
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +10 -0
- package/dist/builtin/workflows/builtin/ralph-core.ts +9 -9
- package/dist/builtin/workflows/builtin/ralph-models.ts +71 -36
- package/dist/builtin/workflows/builtin/ralph-runner.ts +20 -31
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
- package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
- package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
- package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
- package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
- package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
- package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
- package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
- package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
- package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
- package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
- package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
- package/dist/builtin/workflows/src/durable/backend.ts +12 -0
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +17 -1
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
- package/dist/builtin/workflows/src/durable/stage-primitive.ts +2 -1
- package/dist/builtin/workflows/src/durable/types.ts +16 -0
- package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
- package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
- package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
- package/dist/builtin/workflows/src/engine/run.ts +20 -19
- package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
- package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
- package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
- package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -22
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
- package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
- package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +3 -2
- package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
- package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
- package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
- package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
- package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
- package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
- package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts +23 -3
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +129 -17
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +9 -1
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +1 -1
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +6 -3
- 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-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +2 -2
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +1 -1
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +3 -2
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +4 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/anthropic-thinking-guard.d.ts +5 -5
- package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
- package/dist/core/anthropic-thinking-guard.js +42 -32
- package/dist/core/anthropic-thinking-guard.js.map +1 -1
- package/dist/core/atomic-guide-command.d.ts.map +1 -1
- package/dist/core/atomic-guide-command.js +15 -15
- package/dist/core/atomic-guide-command.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +14 -9
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +79 -46
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
- package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
- package/dist/core/compaction/context-assistant-turns.js +87 -0
- package/dist/core/compaction/context-assistant-turns.js.map +1 -0
- package/dist/core/compaction/context-compaction-critical.d.ts +1 -1
- package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-critical.js +2 -2
- package/dist/core/compaction/context-compaction-critical.js.map +1 -1
- package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
- package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
- package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
- package/dist/core/compaction/context-compaction-eviction.d.ts +10 -2
- package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-eviction.js +196 -146
- package/dist/core/compaction/context-compaction-eviction.js.map +1 -1
- package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-prompt.js +1 -1
- package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
- package/dist/core/compaction/context-compaction-types.d.ts +2 -0
- package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-types.js.map +1 -1
- package/dist/core/compaction/context-deletion-application.d.ts +5 -4
- package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-application.js +17 -15
- package/dist/core/compaction/context-deletion-application.js.map +1 -1
- package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-store.js +1 -1
- package/dist/core/compaction/context-deletion-store.js.map +1 -1
- package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
- package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-targets.js +36 -31
- package/dist/core/compaction/context-deletion-targets.js.map +1 -1
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
- package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
- package/dist/core/compaction/context-transcript-analysis.d.ts +1 -2
- package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
- package/dist/core/compaction/context-transcript-analysis.js +33 -37
- package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
- package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
- package/dist/core/copilot-model-synthesis.js +3 -1
- package/dist/core/copilot-model-synthesis.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +2 -1
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +2 -7
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +6 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +72 -29
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/messages.d.ts +9 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +100 -18
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry-builtins.d.ts.map +1 -1
- package/dist/core/model-registry-builtins.js +5 -0
- 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 +49 -8
- 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 +11 -5
- package/dist/core/model-registry-dynamic.js.map +1 -1
- package/dist/core/model-registry-loader.d.ts.map +1 -1
- package/dist/core/model-registry-loader.js +8 -0
- package/dist/core/model-registry-loader.js.map +1 -1
- package/dist/core/model-registry-schemas.d.ts +93 -8
- package/dist/core/model-registry-schemas.d.ts.map +1 -1
- package/dist/core/model-registry-schemas.js +24 -12
- package/dist/core/model-registry-schemas.js.map +1 -1
- package/dist/core/model-registry-types.d.ts +7 -6
- 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.d.ts +5 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +23 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts.map +1 -1
- package/dist/core/model-resolver-cli.js +33 -5
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts +6 -1
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.js +12 -7
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -0
- package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.js +24 -9
- package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
- package/dist/core/resource-loader-context-files.d.ts +1 -0
- package/dist/core/resource-loader-context-files.d.ts.map +1 -1
- package/dist/core/resource-loader-context-files.js +13 -10
- package/dist/core/resource-loader-context-files.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-entry-normalization.d.ts +7 -0
- package/dist/core/session-entry-normalization.d.ts.map +1 -0
- package/dist/core/session-entry-normalization.js +14 -0
- package/dist/core/session-entry-normalization.js.map +1 -0
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +1 -0
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-history.d.ts +2 -2
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +127 -108
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +2 -2
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-types.d.ts +1 -1
- 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 +2 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +141 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -8
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main-deferred-startup.d.ts.map +1 -1
- package/dist/main-deferred-startup.js +2 -2
- package/dist/main-deferred-startup.js.map +1 -1
- package/dist/main-early-input.d.ts.map +1 -1
- package/dist/main-early-input.js +7 -0
- package/dist/main-early-input.js.map +1 -1
- package/dist/main-session.d.ts.map +1 -1
- package/dist/main-session.js +1 -0
- package/dist/main-session.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.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 +0 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-options.js +3 -1
- package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +2 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +3 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +21 -9
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
- package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-child-ordering.js +26 -0
- package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +43 -30
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +41 -6
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +3 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +2 -2
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -2
- 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-model-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +11 -4
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.js +0 -3
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +15 -1
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +5 -1
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +20 -21
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/global-theme.js +26 -2
- package/dist/modes/interactive/theme/global-theme.js.map +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +2 -0
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +3 -0
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/fs-watch.d.ts +24 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js +60 -5
- package/dist/utils/fs-watch.js.map +1 -1
- package/docs/changelog.mdx +19 -0
- package/docs/compaction.md +60 -49
- package/docs/custom-provider.md +18 -5
- package/docs/development.md +4 -0
- package/docs/extensions.md +11 -2
- package/docs/json.md +1 -1
- package/docs/models.md +69 -10
- package/docs/providers.md +1 -1
- package/docs/quickstart.md +12 -8
- package/docs/rpc.md +2 -2
- package/docs/sdk.md +1 -1
- package/docs/settings.md +4 -4
- package/docs/subagents.md +40 -5
- package/docs/tools.md +1 -1
- package/docs/usage.md +4 -2
- package/docs/windows.md +4 -0
- package/docs/workflows.md +33 -48
- package/examples/extensions/preset.ts +2 -2
- package/examples/extensions/subagent/README.md +2 -2
- package/examples/extensions/subagent/index.ts +1 -2
- package/examples/extensions/subagent/schemas.ts +4 -1
- package/examples/sdk/12-full-control.ts +1 -1
- package/npm-shrinkwrap.json +48 -51
- package/package.json +7 -7
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Impeccable design hook — PostToolUse entry point.
|
|
4
|
+
*
|
|
5
|
+
* Reads the Claude Code / Codex / Cursor hook event from stdin, runs the design
|
|
6
|
+
* detector against the touched file, and emits a system reminder via
|
|
7
|
+
* `hookSpecificOutput.additionalContext` when findings exist.
|
|
8
|
+
*
|
|
9
|
+
* Contract: never break a turn. Always exit 0. Clean files emit a small ack
|
|
10
|
+
* unless quiet mode is enabled.
|
|
11
|
+
*
|
|
12
|
+
* Most logic lives in `hook-lib.mjs` so it is unit-testable without a
|
|
13
|
+
* subprocess. This file is the thin stdin/stdout adapter.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { runHook, writeAuditLog } from './hook-lib.mjs';
|
|
17
|
+
|
|
18
|
+
async function readStdin() {
|
|
19
|
+
if (process.stdin.isTTY) return '';
|
|
20
|
+
const chunks = [];
|
|
21
|
+
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
22
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function main() {
|
|
26
|
+
// Snapshot the inherited env FIRST so the re-entrancy guard checks the
|
|
27
|
+
// parent's value, not the value we are about to export for any child
|
|
28
|
+
// processes the hook might ever spawn.
|
|
29
|
+
const inheritedEnv = { ...process.env };
|
|
30
|
+
process.env.IMPECCABLE_HOOK_DEPTH = process.env.IMPECCABLE_HOOK_DEPTH || '1';
|
|
31
|
+
|
|
32
|
+
let stdinJson = '';
|
|
33
|
+
try { stdinJson = await readStdin(); } catch { /* fall through */ }
|
|
34
|
+
|
|
35
|
+
const result = await runHook({
|
|
36
|
+
stdinJson,
|
|
37
|
+
env: inheritedEnv,
|
|
38
|
+
cwd: process.cwd(),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
writeAuditLog(process.env, result.audit, process.cwd());
|
|
42
|
+
|
|
43
|
+
if (result.stdout) process.stdout.write(result.stdout);
|
|
44
|
+
process.exit(result.exitCode || 0);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
main().catch((err) => {
|
|
48
|
+
// Last-ditch: never break the agent's turn even if something we did not
|
|
49
|
+
// anticipate goes wrong. Audit-log the failure if logging is enabled.
|
|
50
|
+
try {
|
|
51
|
+
writeAuditLog(process.env, {
|
|
52
|
+
ts: new Date().toISOString(),
|
|
53
|
+
event: 'PostToolUse',
|
|
54
|
+
error: String(err && err.message ? err.message : err),
|
|
55
|
+
});
|
|
56
|
+
} catch { /* swallow */ }
|
|
57
|
+
if (process.env.IMPECCABLE_HOOK_DEBUG) {
|
|
58
|
+
process.stderr.write(`[impeccable-hook] ${err}\n`);
|
|
59
|
+
}
|
|
60
|
+
process.exit(0);
|
|
61
|
+
});
|
|
@@ -459,11 +459,13 @@ export function filterDetectionFindings(findings, config) {
|
|
|
459
459
|
function isIgnoredFindingValue(finding, ignoreValues) {
|
|
460
460
|
if (!Array.isArray(ignoreValues) || ignoreValues.length === 0) return false;
|
|
461
461
|
const rule = normalizeIgnoreRule(finding.antipattern);
|
|
462
|
+
if (!rule) return false;
|
|
463
|
+
// File-scoped wildcards suppress rules with no extractable value, such as side-tab.
|
|
462
464
|
const value = extractFindingIgnoreValue(finding);
|
|
463
|
-
if (!rule || !value) return false;
|
|
464
465
|
return ignoreValues.some((entry) => {
|
|
466
|
+
if (entry.rule !== rule) return false;
|
|
465
467
|
const wildcardValue = entry.value === '*';
|
|
466
|
-
if (
|
|
468
|
+
if (!wildcardValue && (!value || !ignoreValueMatches(rule, entry.value, value))) return false;
|
|
467
469
|
if (!Array.isArray(entry.files) || entry.files.length === 0) return !wildcardValue;
|
|
468
470
|
return findingMatchesScopedIgnoreFile(finding, entry.files);
|
|
469
471
|
});
|
|
@@ -41,12 +41,12 @@ export function isGeneratedFile(filePath, options = {}) {
|
|
|
41
41
|
|
|
42
42
|
function isGitIgnored(absPath, cwd) {
|
|
43
43
|
try {
|
|
44
|
-
execFileSync('git', ['check-ignore', '--quiet', absPath], {
|
|
44
|
+
execFileSync('git', ['check-ignore', '--quiet', '--', absPath], {
|
|
45
45
|
cwd,
|
|
46
46
|
stdio: 'ignore',
|
|
47
47
|
});
|
|
48
48
|
return true; // exit 0 = ignored
|
|
49
|
-
} catch
|
|
49
|
+
} catch {
|
|
50
50
|
// Exit code 1 = not ignored. Exit code 128 = not a git repo or other error.
|
|
51
51
|
// In both cases, treat as "not known to be ignored."
|
|
52
52
|
return false;
|
|
@@ -97,9 +97,9 @@ export function substitutePropsWithExprs(markup, contract) {
|
|
|
97
97
|
|
|
98
98
|
export function parseSvelteComponentFile(content) {
|
|
99
99
|
const text = String(content || '');
|
|
100
|
-
const scriptMatch = text.match(/^([\s\S]*?)<script\b[^>]*>[\s\S]*?<\/script[^>]*>/i);
|
|
100
|
+
const scriptMatch = text.match(/^([\s\S]*?)<script\b[^>]*>[\s\S]*?<\/script\b[^>]*>/i);
|
|
101
101
|
const withoutScript = scriptMatch ? text.slice(scriptMatch[0].length) : text;
|
|
102
|
-
const styleMatch = withoutScript.match(/<style\b[^>]*>[\s\S]*?<\/style[^>]*>/i);
|
|
102
|
+
const styleMatch = withoutScript.match(/<style\b[^>]*>[\s\S]*?<\/style\b[^>]*>/i);
|
|
103
103
|
const styleBlock = styleMatch ? styleMatch[0] : '';
|
|
104
104
|
const markup = styleMatch
|
|
105
105
|
? withoutScript.slice(0, styleMatch.index).trim()
|
|
@@ -107,7 +107,7 @@ export function parseSvelteComponentFile(content) {
|
|
|
107
107
|
const cssLines = styleBlock
|
|
108
108
|
? styleBlock
|
|
109
109
|
.replace(/^<style\b[^>]*>/i, '')
|
|
110
|
-
.replace(/<\/style\
|
|
110
|
+
.replace(/<\/style\b[^>]*>$/i, '')
|
|
111
111
|
.split('\n')
|
|
112
112
|
.map((line) => line.trimEnd())
|
|
113
113
|
: [];
|
|
@@ -290,7 +290,7 @@ function appendCssToSvelteStyle(lines, cssLines) {
|
|
|
290
290
|
|
|
291
291
|
function findLastStyleCloseLine(lines) {
|
|
292
292
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
293
|
-
if (/<\/style\
|
|
293
|
+
if (/<\/style\b[^>]*>/.test(lines[i])) return i;
|
|
294
294
|
}
|
|
295
295
|
return -1;
|
|
296
296
|
}
|
|
@@ -632,24 +632,21 @@ function inlineSvelteComponentInsertAccept({
|
|
|
632
632
|
}
|
|
633
633
|
|
|
634
634
|
function svelteMarkupHasVisibleContent(markup) {
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
// sequences cannot survive a single pass (CodeQL: complete sanitization).
|
|
638
|
-
let text = raw;
|
|
639
|
-
let prev;
|
|
635
|
+
let stripped = String(markup || '');
|
|
636
|
+
let previous;
|
|
640
637
|
do {
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
.replace(/<script
|
|
644
|
-
.replace(/<style
|
|
638
|
+
previous = stripped;
|
|
639
|
+
stripped = stripped
|
|
640
|
+
.replace(/<script[\s\S]*?<\/script\b[^>]*>/gi, ' ')
|
|
641
|
+
.replace(/<style[\s\S]*?<\/style\b[^>]*>/gi, ' ')
|
|
645
642
|
.replace(/<!--[\s\S]*?-->/g, '');
|
|
646
|
-
} while (
|
|
647
|
-
text =
|
|
643
|
+
} while (stripped !== previous);
|
|
644
|
+
const text = stripped
|
|
648
645
|
.replace(/<[^>]+>/g, ' ')
|
|
649
646
|
.replace(/\s+/g, ' ')
|
|
650
647
|
.trim();
|
|
651
648
|
if (text.length > 0) return true;
|
|
652
|
-
return /<(img|svg|canvas|video|audio|picture|input|button|select|textarea)\b/i.test(
|
|
649
|
+
return /<(img|svg|canvas|video|audio|picture|input|button|select|textarea)\b/i.test(markup || '');
|
|
653
650
|
}
|
|
654
651
|
|
|
655
652
|
function mergeOriginalTopLevelAttrs(markup, originalMarkup) {
|
|
@@ -400,12 +400,18 @@ function readHtmlAttr(tag, name) {
|
|
|
400
400
|
return decodeHtmlAttr(match[2]);
|
|
401
401
|
}
|
|
402
402
|
|
|
403
|
+
const HTML_ATTR_ENTITIES = {
|
|
404
|
+
'"': '"',
|
|
405
|
+
'<': '<',
|
|
406
|
+
'>': '>',
|
|
407
|
+
'&': '&',
|
|
408
|
+
};
|
|
409
|
+
|
|
403
410
|
function decodeHtmlAttr(value) {
|
|
404
|
-
return String(value || '')
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
.replace(/&/g, '&');
|
|
411
|
+
return String(value || '').replace(
|
|
412
|
+
/&(?:quot|lt|gt|amp);/g,
|
|
413
|
+
(entity) => HTML_ATTR_ENTITIES[entity] || entity,
|
|
414
|
+
);
|
|
409
415
|
}
|
|
410
416
|
|
|
411
417
|
// ---------------------------------------------------------------------------
|
|
@@ -531,8 +537,8 @@ function stripStyleAndJoin(lines, block) {
|
|
|
531
537
|
// Strip any complete <style> elements on this line (self-closed or
|
|
532
538
|
// same-line-closed), including their body content.
|
|
533
539
|
line = line
|
|
534
|
-
.replace(/<style\b[^>]*>[\s\S]*?<\/style[^>]*>/g, '')
|
|
535
|
-
.replace(/<style\b[^>]*\/\s*>/g, '');
|
|
540
|
+
.replace(/<style\b[^>]*>[\s\S]*?<\/style\b[^>]*>/g, ' ')
|
|
541
|
+
.replace(/<style\b[^>]*\/\s*>/g, ' ');
|
|
536
542
|
|
|
537
543
|
// If a <style> opener remains (multi-line body starts here), strip from
|
|
538
544
|
// the opener to end-of-line and flip into skip mode.
|
|
@@ -544,10 +550,10 @@ function stripStyleAndJoin(lines, block) {
|
|
|
544
550
|
out.push(line);
|
|
545
551
|
} else {
|
|
546
552
|
// In multi-line style body; drop everything until we see </style>.
|
|
547
|
-
const closeIdx = line.search(/<\/style\
|
|
553
|
+
const closeIdx = line.search(/<\/style\b[^>]*>/);
|
|
548
554
|
if (closeIdx !== -1) {
|
|
549
555
|
inStyle = false;
|
|
550
|
-
out.push(line.slice(closeIdx).replace(/<\/style\
|
|
556
|
+
out.push(line.slice(closeIdx).replace(/<\/style\b[^>]*>/, ' '));
|
|
551
557
|
}
|
|
552
558
|
// else: skip line entirely
|
|
553
559
|
}
|
|
@@ -637,7 +643,7 @@ function extractCss(lines, block, id) {
|
|
|
637
643
|
// Self-closing: nothing to carbonize.
|
|
638
644
|
if (/<style\b[^>]*\/\s*>/.test(line)) return null;
|
|
639
645
|
// Same-line open + close: extract inner text.
|
|
640
|
-
const sameLine = line.match(/<style\b[^>]*>([\s\S]*?)<\/style[^>]*>/);
|
|
646
|
+
const sameLine = line.match(/<style\b[^>]*>([\s\S]*?)<\/style\b[^>]*>/);
|
|
641
647
|
if (sameLine) {
|
|
642
648
|
const inner = stripJsxTemplateWrap(sameLine[1]);
|
|
643
649
|
return inner.length > 0 ? inner.split('\n') : null;
|
|
@@ -650,7 +656,7 @@ function extractCss(lines, block, id) {
|
|
|
650
656
|
// Detect </style> anywhere on the line — JSX template-literal closes
|
|
651
657
|
// (`}</style>`) put the close mid-line, and we don't want to absorb the
|
|
652
658
|
// template-literal punctuation as CSS content.
|
|
653
|
-
const closeIdx = line.
|
|
659
|
+
const closeIdx = line.search(/<\/style\b[^>]*>/);
|
|
654
660
|
if (closeIdx !== -1) break;
|
|
655
661
|
content.push(line);
|
|
656
662
|
}
|
|
@@ -153,6 +153,7 @@
|
|
|
153
153
|
let scrollLockRaf = null;
|
|
154
154
|
let scrollLockAbort = null;
|
|
155
155
|
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
|
156
|
+
const VARIANT_STATE_STYLE_ID = 'impeccable-variant-state';
|
|
156
157
|
|
|
157
158
|
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
|
158
159
|
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
|
@@ -3035,16 +3036,26 @@
|
|
|
3035
3036
|
function applyParamValue(variantEl, param, value) {
|
|
3036
3037
|
if (!variantEl) return;
|
|
3037
3038
|
const attr = 'data-p-' + param.id;
|
|
3038
|
-
if (param.kind === '
|
|
3039
|
-
variantEl.style.setProperty('--p-' + param.id, String(value));
|
|
3040
|
-
} else if (param.kind === 'toggle') {
|
|
3039
|
+
if (param.kind === 'toggle') {
|
|
3041
3040
|
const on = !!value;
|
|
3042
|
-
variantEl.style.setProperty('--p-' + param.id, on ? '1' : '0');
|
|
3043
3041
|
if (on) variantEl.setAttribute(attr, 'on');
|
|
3044
3042
|
else variantEl.removeAttribute(attr);
|
|
3045
3043
|
} else if (param.kind === 'steps') {
|
|
3046
3044
|
variantEl.setAttribute(attr, String(value));
|
|
3047
3045
|
}
|
|
3046
|
+
// Svelte component variants are client-mounted into
|
|
3047
|
+
// [data-impeccable-component-mount] with no [data-impeccable-variant="N"]
|
|
3048
|
+
// wrapper for the state stylesheet to target, and the element is not SSR'd,
|
|
3049
|
+
// so there is no React hydration to mismatch. Drive range/toggle --p-* inline
|
|
3050
|
+
// on the mounted element so scoped preview CSS resolves them.
|
|
3051
|
+
if (svelteComponentSession?.sessionId === currentSessionId) {
|
|
3052
|
+
if (param.kind === 'range') variantEl.style.setProperty('--p-' + param.id, String(value));
|
|
3053
|
+
else if (param.kind === 'toggle') variantEl.style.setProperty('--p-' + param.id, value ? '1' : '0');
|
|
3054
|
+
return;
|
|
3055
|
+
}
|
|
3056
|
+
// range/toggle --p-* custom properties are driven through the injected
|
|
3057
|
+
// variant-state stylesheet so we never mutate inline style on SSR'd divs.
|
|
3058
|
+
updateVariantStateStylesheet(currentSessionId, visibleVariant);
|
|
3048
3059
|
}
|
|
3049
3060
|
|
|
3050
3061
|
function applyParamDefaults(variantEl, params) {
|
|
@@ -4714,6 +4725,7 @@
|
|
|
4714
4725
|
paramsCurrentValues = {};
|
|
4715
4726
|
tuneOpen = false;
|
|
4716
4727
|
hideParamsPanel();
|
|
4728
|
+
if (currentSessionId && visibleVariant) updateVariantStateStylesheet(currentSessionId, visibleVariant);
|
|
4717
4729
|
return;
|
|
4718
4730
|
}
|
|
4719
4731
|
applyParamDefaults(variantEl, params);
|
|
@@ -4771,20 +4783,7 @@
|
|
|
4771
4783
|
|
|
4772
4784
|
function isVariantShown(el) {
|
|
4773
4785
|
if (!el) return false;
|
|
4774
|
-
|
|
4775
|
-
if (el.style?.display === 'none') return false;
|
|
4776
|
-
return true;
|
|
4777
|
-
}
|
|
4778
|
-
|
|
4779
|
-
function setVariantShown(el, shown) {
|
|
4780
|
-
if (!el) return;
|
|
4781
|
-
if (shown) {
|
|
4782
|
-
el.removeAttribute('hidden');
|
|
4783
|
-
el.style.display = '';
|
|
4784
|
-
} else {
|
|
4785
|
-
el.setAttribute('hidden', '');
|
|
4786
|
-
el.style.display = 'none';
|
|
4787
|
-
}
|
|
4786
|
+
return getComputedStyle(el).display !== 'none';
|
|
4788
4787
|
}
|
|
4789
4788
|
|
|
4790
4789
|
function scheduleCyclingBarSync(sessionId, variantNum) {
|
|
@@ -4823,11 +4822,7 @@
|
|
|
4823
4822
|
}
|
|
4824
4823
|
const wrapper = document.querySelector('[data-impeccable-variants="' + sessionId + '"]');
|
|
4825
4824
|
if (!wrapper) return false;
|
|
4826
|
-
|
|
4827
|
-
const v = child.dataset ? child.dataset.impeccableVariant : null;
|
|
4828
|
-
if (!v) continue;
|
|
4829
|
-
setVariantShown(child, v === String(num));
|
|
4830
|
-
}
|
|
4825
|
+
updateVariantStateStylesheet(sessionId, num);
|
|
4831
4826
|
// Unconditional refresh - covers first-reveal (no-op if state isn't
|
|
4832
4827
|
// CYCLING yet, the subsequent CYCLING transition triggers its own
|
|
4833
4828
|
// refresh) and every cycle step.
|
|
@@ -5081,7 +5076,7 @@
|
|
|
5081
5076
|
}
|
|
5082
5077
|
|
|
5083
5078
|
function extractSvelteComponentStyle(source) {
|
|
5084
|
-
const match = String(source || '').match(/<style\b[^>]*>([\s\S]*?)<\/style\
|
|
5079
|
+
const match = String(source || '').match(/<style\b[^>]*>([\s\S]*?)<\/style\b[^>]*>/i);
|
|
5085
5080
|
return match ? match[1].trim() : '';
|
|
5086
5081
|
}
|
|
5087
5082
|
|
|
@@ -5109,7 +5104,8 @@
|
|
|
5109
5104
|
}
|
|
5110
5105
|
|
|
5111
5106
|
function scopeCssToSveltePreview(css, sessionId) {
|
|
5112
|
-
const
|
|
5107
|
+
const escapedSessionId = String(sessionId).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
5108
|
+
const prefix = '[data-impeccable-variants="' + escapedSessionId + '"] ';
|
|
5113
5109
|
return scopeCssBlock(String(css || ''), prefix).trim();
|
|
5114
5110
|
}
|
|
5115
5111
|
|
|
@@ -5492,6 +5488,7 @@
|
|
|
5492
5488
|
if (pendingSvelteComponentRetryObserver) { pendingSvelteComponentRetryObserver.disconnect(); pendingSvelteComponentRetryObserver = null; }
|
|
5493
5489
|
if (pendingVariantAnchorRetryObserver) { pendingVariantAnchorRetryObserver.disconnect(); pendingVariantAnchorRetryObserver = null; }
|
|
5494
5490
|
stopScrollLock();
|
|
5491
|
+
removeVariantStateStylesheet();
|
|
5495
5492
|
clearSession();
|
|
5496
5493
|
clearHandled();
|
|
5497
5494
|
resetSessionFileMeta();
|
|
@@ -5609,7 +5606,7 @@
|
|
|
5609
5606
|
if (!/\.[cm]?[jt]sx$/i.test(String(filePath || ''))) return block;
|
|
5610
5607
|
return String(block)
|
|
5611
5608
|
.replace(
|
|
5612
|
-
/<style\b([^>]*)>\s*\{\s*`([\s\S]*?)`\s*\}\s*<\/style[^>]*>/g,
|
|
5609
|
+
/<style\b([^>]*)>\s*\{\s*`([\s\S]*?)`\s*\}\s*<\/style\b[^>]*>/g,
|
|
5613
5610
|
(_match, attrs, css) => '<style' + attrs + '>' + css + '</style>',
|
|
5614
5611
|
)
|
|
5615
5612
|
.replace(/\bclassName\s*=\s*\{\s*`([^`]*?)`\s*\}/g, (_match, value) => {
|
|
@@ -5806,6 +5803,68 @@
|
|
|
5806
5803
|
return variantDiv;
|
|
5807
5804
|
}
|
|
5808
5805
|
|
|
5806
|
+
// Variant visibility and range/toggle params are expressed through ONE
|
|
5807
|
+
// injected stylesheet, never inline attributes on the variant divs. Those
|
|
5808
|
+
// divs are scaffolded into page source, so SSR frameworks (Next.js App
|
|
5809
|
+
// Router) server-render them; toggling their `hidden` / inline `style` /
|
|
5810
|
+
// `--p-*` client-side trips a React 19 hydration mismatch on the next
|
|
5811
|
+
// Fast-Refresh re-render — the same failure mode the scroll-anchor (#276)
|
|
5812
|
+
// and pick-cursor (#286) fixes address. A stylesheet rule has the same
|
|
5813
|
+
// computed effect without mutating any hydrated element's attributes.
|
|
5814
|
+
// (steps params keep driving `data-p-*` attributes, matching scoped CSS.)
|
|
5815
|
+
const VARIANT_HIDE_DECL = 'display: none !important;';
|
|
5816
|
+
const VARIANT_SHOW_DECL = 'display: block !important;';
|
|
5817
|
+
|
|
5818
|
+
// Build a direct-child variant selector for a session. With `num`, targets a
|
|
5819
|
+
// single variant (`… > [data-impeccable-variant="N"]`); without it, targets
|
|
5820
|
+
// every variant via the bare `[data-impeccable-variant]` attribute.
|
|
5821
|
+
function variantStateSelector(sessionId, num) {
|
|
5822
|
+
const wrapper = '[data-impeccable-variants="' + sessionId + '"]';
|
|
5823
|
+
const variant = num == null
|
|
5824
|
+
? '[data-impeccable-variant]'
|
|
5825
|
+
: '[data-impeccable-variant="' + num + '"]';
|
|
5826
|
+
return wrapper + ' > ' + variant;
|
|
5827
|
+
}
|
|
5828
|
+
|
|
5829
|
+
// Serialize the visible variant's knob values into `--p-<id>` custom-property
|
|
5830
|
+
// declarations. Only range (number) and toggle (boolean) values become a
|
|
5831
|
+
// custom property; steps params drive `data-p-*` attributes instead.
|
|
5832
|
+
function variantParamDecls(values) {
|
|
5833
|
+
return Object.entries(values || {})
|
|
5834
|
+
.map(([id, val]) => {
|
|
5835
|
+
if (typeof val === 'number') return ' --p-' + id + ': ' + val + ';';
|
|
5836
|
+
if (typeof val === 'boolean') return ' --p-' + id + ': ' + (val ? '1' : '0') + ';';
|
|
5837
|
+
return '';
|
|
5838
|
+
})
|
|
5839
|
+
.join('');
|
|
5840
|
+
}
|
|
5841
|
+
|
|
5842
|
+
function updateVariantStateStylesheet(sessionId, num) {
|
|
5843
|
+
if (!sessionId || num == null || num < 1) return;
|
|
5844
|
+
|
|
5845
|
+
let styleEl = document.getElementById(VARIANT_STATE_STYLE_ID);
|
|
5846
|
+
if (!styleEl) {
|
|
5847
|
+
styleEl = document.createElement('style');
|
|
5848
|
+
styleEl.id = VARIANT_STATE_STYLE_ID;
|
|
5849
|
+
(document.head || document.documentElement).appendChild(styleEl);
|
|
5850
|
+
}
|
|
5851
|
+
|
|
5852
|
+
// Hide every variant except the visible one (incl. the SSR'd "original").
|
|
5853
|
+
const hideOthers = variantStateSelector(sessionId)
|
|
5854
|
+
+ ':not([data-impeccable-variant="' + num + '"]) { ' + VARIANT_HIDE_DECL + ' }';
|
|
5855
|
+
|
|
5856
|
+
// Force-show the visible variant (beats the source inline display:none on
|
|
5857
|
+
// v2/v3) and apply its knob values as custom properties.
|
|
5858
|
+
const showVisible = variantStateSelector(sessionId, num)
|
|
5859
|
+
+ ' { ' + VARIANT_SHOW_DECL + variantParamDecls(paramsCurrentValues) + ' }';
|
|
5860
|
+
|
|
5861
|
+
styleEl.textContent = hideOthers + '\n' + showVisible + '\n';
|
|
5862
|
+
}
|
|
5863
|
+
|
|
5864
|
+
function removeVariantStateStylesheet() {
|
|
5865
|
+
document.getElementById(VARIANT_STATE_STYLE_ID)?.remove();
|
|
5866
|
+
}
|
|
5867
|
+
|
|
5809
5868
|
// Hold window.scrollY at a fixed value across DOM mutations inside the
|
|
5810
5869
|
// session's wrapper (HMR patches, variant inserts, cycle swaps).
|
|
5811
5870
|
function startScrollLock(sessionId, initialTargetY) {
|
|
@@ -7636,6 +7695,7 @@ void main() {
|
|
|
7636
7695
|
stopScrollTracking();
|
|
7637
7696
|
if (variantObserver) { variantObserver.disconnect(); variantObserver = null; }
|
|
7638
7697
|
stopScrollLock();
|
|
7698
|
+
removeVariantStateStylesheet();
|
|
7639
7699
|
clearScrollY();
|
|
7640
7700
|
clearSession();
|
|
7641
7701
|
resetSessionFileMeta();
|
|
@@ -7897,6 +7957,7 @@ void main() {
|
|
|
7897
7957
|
if (variantObserver) { variantObserver.disconnect(); variantObserver = null; }
|
|
7898
7958
|
if (pendingVariantAnchorRetryObserver) { pendingVariantAnchorRetryObserver.disconnect(); pendingVariantAnchorRetryObserver = null; }
|
|
7899
7959
|
stopScrollLock();
|
|
7960
|
+
removeVariantStateStylesheet();
|
|
7900
7961
|
clearScrollY();
|
|
7901
7962
|
finalizeInsertSession();
|
|
7902
7963
|
clearSession();
|
|
@@ -7928,7 +7989,7 @@ void main() {
|
|
|
7928
7989
|
const barTopFromBottom = barRect && barRect.height > 0
|
|
7929
7990
|
? Math.max(16, window.innerHeight - barRect.top + 12)
|
|
7930
7991
|
: 16;
|
|
7931
|
-
|
|
7992
|
+
const currentToast = el('div', {
|
|
7932
7993
|
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
|
7933
7994
|
transform: 'translateX(-50%) translateY(8px)',
|
|
7934
7995
|
background: C.ink, color: C.white,
|
|
@@ -7938,19 +7999,24 @@ void main() {
|
|
|
7938
7999
|
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
|
7939
8000
|
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
|
7940
8001
|
});
|
|
7941
|
-
toastEl
|
|
7942
|
-
|
|
7943
|
-
|
|
8002
|
+
toastEl = currentToast;
|
|
8003
|
+
currentToast.id = PREFIX + '-toast';
|
|
8004
|
+
currentToast.textContent = message;
|
|
8005
|
+
uiAppend(currentToast);
|
|
7944
8006
|
requestAnimationFrame(() => {
|
|
7945
|
-
toastEl
|
|
7946
|
-
|
|
8007
|
+
if (toastEl !== currentToast) return;
|
|
8008
|
+
currentToast.style.opacity = '1';
|
|
8009
|
+
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
|
7947
8010
|
});
|
|
7948
8011
|
setTimeout(() => {
|
|
7949
|
-
if (toastEl)
|
|
7950
|
-
|
|
7951
|
-
|
|
7952
|
-
|
|
7953
|
-
|
|
8012
|
+
if (toastEl !== currentToast) return;
|
|
8013
|
+
currentToast.style.opacity = '0';
|
|
8014
|
+
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
|
8015
|
+
setTimeout(() => {
|
|
8016
|
+
if (toastEl !== currentToast) return;
|
|
8017
|
+
currentToast.remove();
|
|
8018
|
+
toastEl = null;
|
|
8019
|
+
}, 250);
|
|
7954
8020
|
}, duration);
|
|
7955
8021
|
}
|
|
7956
8022
|
|
|
@@ -9984,6 +10050,7 @@ void main() {
|
|
|
9984
10050
|
window.postMessage({ source: 'impeccable-command', action: 'remove' }, '*');
|
|
9985
10051
|
setLiveState('IDLE');
|
|
9986
10052
|
document.getElementById(PICK_CURSOR_STYLE_ID)?.remove();
|
|
10053
|
+
removeVariantStateStylesheet();
|
|
9987
10054
|
window.__IMPECCABLE_LIVE_INIT__ = false;
|
|
9988
10055
|
console.log('[impeccable] Live mode exited.');
|
|
9989
10056
|
}
|
|
@@ -310,6 +310,7 @@ The agent should insert variant HTML at insertLine.`);
|
|
|
310
310
|
];
|
|
311
311
|
|
|
312
312
|
let outputFile = targetFile;
|
|
313
|
+
let outputLines;
|
|
313
314
|
let outputStartLine = startLine + 1;
|
|
314
315
|
let outputEndLine = startLine + wrapperLines.length + (originalLines.length - 1);
|
|
315
316
|
let insertLine;
|
|
@@ -570,6 +571,14 @@ function splitClassList(classes) {
|
|
|
570
571
|
return String(classes).split(/[,\s]+/).map(c => c.trim()).filter(Boolean);
|
|
571
572
|
}
|
|
572
573
|
|
|
574
|
+
function attrEscapeDouble(str) {
|
|
575
|
+
return String(str)
|
|
576
|
+
.replace(/&/g, '&')
|
|
577
|
+
.replace(/"/g, '"')
|
|
578
|
+
.replace(/</g, '<')
|
|
579
|
+
.replace(/>/g, '>');
|
|
580
|
+
}
|
|
581
|
+
|
|
573
582
|
function detectCommentSyntax(filePath) {
|
|
574
583
|
const ext = path.extname(filePath).toLowerCase();
|
|
575
584
|
if (ext === '.jsx' || ext === '.tsx') {
|
|
@@ -197,6 +197,10 @@ export class InMemoryDurableBackend implements DurableWorkflowBackend {
|
|
|
197
197
|
inputs: handle.inputs,
|
|
198
198
|
createdAt: handle.createdAt,
|
|
199
199
|
status: handle.status,
|
|
200
|
+
...(handle.invocationCwd !== undefined ? { invocationCwd: handle.invocationCwd } : existing?.handle.invocationCwd !== undefined ? { invocationCwd: existing.handle.invocationCwd } : {}),
|
|
201
|
+
...(handle.workflowCwd !== undefined ? { workflowCwd: handle.workflowCwd } : existing?.handle.workflowCwd !== undefined ? { workflowCwd: existing.handle.workflowCwd } : {}),
|
|
202
|
+
...(handle.repositoryRoot !== undefined ? { repositoryRoot: handle.repositoryRoot } : existing?.handle.repositoryRoot !== undefined ? { repositoryRoot: existing.handle.repositoryRoot } : {}),
|
|
203
|
+
...(handle.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: handle.gitWorktreeRoot } : existing?.handle.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: existing.handle.gitWorktreeRoot } : {}),
|
|
200
204
|
...(handle.sessionFile !== undefined ? { sessionFile: handle.sessionFile } : {}),
|
|
201
205
|
completedCheckpoints,
|
|
202
206
|
pendingPrompts,
|
|
@@ -285,6 +289,10 @@ export class InMemoryDurableBackend implements DurableWorkflowBackend {
|
|
|
285
289
|
...(h.label !== undefined ? { label: h.label } : {}),
|
|
286
290
|
...(h.rootWorkflowId !== undefined ? { rootWorkflowId: h.rootWorkflowId } : {}),
|
|
287
291
|
...(h.resumable !== undefined ? { resumable: h.resumable } : {}),
|
|
292
|
+
...(h.invocationCwd !== undefined ? { invocationCwd: h.invocationCwd } : {}),
|
|
293
|
+
...(h.workflowCwd !== undefined ? { workflowCwd: h.workflowCwd } : {}),
|
|
294
|
+
...(h.repositoryRoot !== undefined ? { repositoryRoot: h.repositoryRoot } : {}),
|
|
295
|
+
...(h.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: h.gitWorktreeRoot } : {}),
|
|
288
296
|
ts: h.updatedAt,
|
|
289
297
|
};
|
|
290
298
|
}
|
|
@@ -337,6 +345,10 @@ function toResumableEntry(handle: DurableWorkflowHandle): ResumableWorkflowEntry
|
|
|
337
345
|
...(handle.label !== undefined ? { label: handle.label } : {}),
|
|
338
346
|
...(handle.rootWorkflowId !== undefined ? { rootWorkflowId: handle.rootWorkflowId } : {}),
|
|
339
347
|
...(handle.resumable !== undefined ? { resumable: handle.resumable } : {}),
|
|
348
|
+
...(handle.invocationCwd !== undefined ? { invocationCwd: handle.invocationCwd } : {}),
|
|
349
|
+
...(handle.workflowCwd !== undefined ? { workflowCwd: handle.workflowCwd } : {}),
|
|
350
|
+
...(handle.repositoryRoot !== undefined ? { repositoryRoot: handle.repositoryRoot } : {}),
|
|
351
|
+
...(handle.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: handle.gitWorktreeRoot } : {}),
|
|
340
352
|
createdAt: handle.createdAt,
|
|
341
353
|
updatedAt: handle.updatedAt,
|
|
342
354
|
};
|
|
@@ -359,6 +359,10 @@ export class DbosDurableBackend implements DurableWorkflowBackend {
|
|
|
359
359
|
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
360
360
|
...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
|
|
361
361
|
...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
|
|
362
|
+
...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
|
|
363
|
+
...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
|
|
364
|
+
...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
|
|
365
|
+
...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
|
|
362
366
|
});
|
|
363
367
|
}
|
|
364
368
|
}
|
|
@@ -395,6 +399,10 @@ function encodeMetadata(entry: DurableCheckpointEntry): WorkflowSerializableValu
|
|
|
395
399
|
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
396
400
|
...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
|
|
397
401
|
...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
|
|
402
|
+
...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
|
|
403
|
+
...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
|
|
404
|
+
...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
|
|
405
|
+
...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
|
|
398
406
|
ts: entry.ts,
|
|
399
407
|
},
|
|
400
408
|
};
|
|
@@ -425,7 +433,11 @@ function parseDurableCheckpointEntry(value: WorkflowSerializableValue): DurableC
|
|
|
425
433
|
|| typeof entry.ts !== "number"
|
|
426
434
|
|| (entry.label !== undefined && typeof entry.label !== "string")
|
|
427
435
|
|| (entry.rootWorkflowId !== undefined && typeof entry.rootWorkflowId !== "string")
|
|
428
|
-
|| (entry.resumable !== undefined && typeof entry.resumable !== "boolean")
|
|
436
|
+
|| (entry.resumable !== undefined && typeof entry.resumable !== "boolean")
|
|
437
|
+
|| (entry.invocationCwd !== undefined && typeof entry.invocationCwd !== "string")
|
|
438
|
+
|| (entry.workflowCwd !== undefined && typeof entry.workflowCwd !== "string")
|
|
439
|
+
|| (entry.repositoryRoot !== undefined && typeof entry.repositoryRoot !== "string")
|
|
440
|
+
|| (entry.gitWorktreeRoot !== undefined && typeof entry.gitWorktreeRoot !== "string")) {
|
|
429
441
|
return undefined;
|
|
430
442
|
}
|
|
431
443
|
return {
|
|
@@ -440,6 +452,10 @@ function parseDurableCheckpointEntry(value: WorkflowSerializableValue): DurableC
|
|
|
440
452
|
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
441
453
|
...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
|
|
442
454
|
...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
|
|
455
|
+
...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
|
|
456
|
+
...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
|
|
457
|
+
...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
|
|
458
|
+
...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
|
|
443
459
|
};
|
|
444
460
|
}
|
|
445
461
|
|
|
@@ -107,6 +107,10 @@ function parseDurableEntry(raw: Record<string, unknown>): DurableCheckpointEntry
|
|
|
107
107
|
...(typeof raw["label"] === "string" ? { label: raw["label"] } : {}),
|
|
108
108
|
...(typeof raw["rootWorkflowId"] === "string" ? { rootWorkflowId: raw["rootWorkflowId"] } : {}),
|
|
109
109
|
...(typeof raw["resumable"] === "boolean" ? { resumable: raw["resumable"] } : {}),
|
|
110
|
+
...(typeof raw["invocationCwd"] === "string" ? { invocationCwd: raw["invocationCwd"] } : {}),
|
|
111
|
+
...(typeof raw["workflowCwd"] === "string" ? { workflowCwd: raw["workflowCwd"] } : {}),
|
|
112
|
+
...(typeof raw["repositoryRoot"] === "string" ? { repositoryRoot: raw["repositoryRoot"] } : {}),
|
|
113
|
+
...(typeof raw["gitWorktreeRoot"] === "string" ? { gitWorktreeRoot: raw["gitWorktreeRoot"] } : {}),
|
|
110
114
|
ts,
|
|
111
115
|
};
|
|
112
116
|
}
|
|
@@ -142,6 +146,10 @@ function entryToResumable(entry: DurableCheckpointEntry, sessionFile: string): R
|
|
|
142
146
|
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
143
147
|
...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
|
|
144
148
|
...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
|
|
149
|
+
...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
|
|
150
|
+
...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
|
|
151
|
+
...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
|
|
152
|
+
...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
|
|
145
153
|
createdAt: entry.ts,
|
|
146
154
|
updatedAt: entry.ts,
|
|
147
155
|
};
|
|
@@ -197,6 +205,10 @@ export function persistDurableCacheEntry(
|
|
|
197
205
|
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
198
206
|
...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
|
|
199
207
|
...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
|
|
208
|
+
...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
|
|
209
|
+
...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
|
|
210
|
+
...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
|
|
211
|
+
...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
|
|
200
212
|
ts: entry.ts,
|
|
201
213
|
});
|
|
202
214
|
}
|
|
@@ -167,11 +167,14 @@ export function resumeDurableWorkflow(
|
|
|
167
167
|
// ORIGINAL workflow id as the run id so durable checkpoints replay.
|
|
168
168
|
backend.setWorkflowStatus(resolved.workflowId, "running");
|
|
169
169
|
|
|
170
|
-
const
|
|
170
|
+
const resumeRunOpts: RunOpts = {
|
|
171
171
|
...deps.baseRunOpts,
|
|
172
|
+
...(handle.invocationCwd !== undefined ? { cwd: handle.invocationCwd } : {}),
|
|
172
173
|
runId: resolved.workflowId,
|
|
173
174
|
durableBackend: backend,
|
|
174
|
-
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const accepted: DetachedAccepted = runDetached(def, inputs, resumeRunOpts);
|
|
175
178
|
|
|
176
179
|
return {
|
|
177
180
|
ok: true,
|
|
@@ -7,6 +7,7 @@ import type { DurableWorkflowBackend } from "./backend.js";
|
|
|
7
7
|
import type { ParallelFailFastScope } from "../runs/foreground/executor-types.js";
|
|
8
8
|
import { durableHash } from "./backend.js";
|
|
9
9
|
import { recordCheckpointDurably } from "./tool-primitive.js";
|
|
10
|
+
import { RESUME_CONTINUATION_PROMPT } from "../shared/resume-continuation.js";
|
|
10
11
|
import type { DurableStageCheckpoint } from "./types.js";
|
|
11
12
|
export type DurableCompletedStageCheckpoint = DurableStageCheckpoint & { readonly output: WorkflowSerializableValue };
|
|
12
13
|
|
|
@@ -66,7 +67,7 @@ export async function recordStageSessionCheckpoint(deps: DurableStageDeps, stage
|
|
|
66
67
|
return true;
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
const MID_SESSION_RESUME_PROMPT =
|
|
70
|
+
const MID_SESSION_RESUME_PROMPT = RESUME_CONTINUATION_PROMPT;
|
|
70
71
|
|
|
71
72
|
function withMidSessionResumePrompt<T extends StageContext>(stage: T, enabled: boolean): T {
|
|
72
73
|
if (!enabled) return stage;
|