@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
|
@@ -12,7 +12,7 @@ import type { GraphOverlayPort } from "../tui/overlay-adapter.js";
|
|
|
12
12
|
import type { ExtensionRuntime } from "./runtime.js";
|
|
13
13
|
import type { WorkflowInputEntry, WorkflowToolResult } from "./render-result.js";
|
|
14
14
|
import type { ExtensionAPI, PiCommandContext, PiArgumentCompletionResult } from "./public-types.js";
|
|
15
|
-
import { workflowArgumentCompletions } from "./workflow-command-completions.js";
|
|
15
|
+
import { workflowArgumentCompletions, workflowArgumentCompletionsNeedWorkflowResources } from "./workflow-command-completions.js";
|
|
16
16
|
import {
|
|
17
17
|
createWorkflowCommandReporter,
|
|
18
18
|
emitWorkflowCommandOutput,
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
type WorkflowCommandHandler,
|
|
24
24
|
type WorkflowCommandOutputDetails,
|
|
25
25
|
} from "./workflow-command-utils.js";
|
|
26
|
-
import { emitTerminalRunDetailSurface } from "./workflow-command-surfaces.js";
|
|
26
|
+
import { emitTerminalRunDetailSurface, formatWorkflowResourceLoadWarning } from "./workflow-command-surfaces.js";
|
|
27
27
|
import { handleRunControlCommand, type WorkflowRunControlDeps } from "./workflow-run-control-command.js";
|
|
28
28
|
import { workflowPolicyFromContext } from "./workflow-policy.js";
|
|
29
29
|
import {
|
|
@@ -39,6 +39,7 @@ export interface WorkflowSlashCommandDeps {
|
|
|
39
39
|
runtimeForContext: (ctx?: PiCommandContext) => ExtensionRuntime;
|
|
40
40
|
overlay: GraphOverlayPort;
|
|
41
41
|
reloadWorkflowResources: () => Promise<void> | void;
|
|
42
|
+
ensureWorkflowResourcesLoaded: () => Promise<void> | void;
|
|
42
43
|
runWithLifecycleSuppressedForPolicy: <T>(
|
|
43
44
|
policy: WorkflowExecutionPolicy,
|
|
44
45
|
fn: () => Promise<T>,
|
|
@@ -57,8 +58,11 @@ export function registerWorkflowSlashCommand(
|
|
|
57
58
|
{
|
|
58
59
|
description: "Run or inspect Atomic workflows. Usage: /workflow <name> [key=value…] | /workflow [list|status|connect|attach|interrupt|kill|pause|resume|inputs|reload] [args]",
|
|
59
60
|
handler: (args, ctx) => workflowSlashHandler(args, ctx, pi, deps),
|
|
60
|
-
getArgumentCompletions: (partial: string): PiArgumentCompletionResult =>
|
|
61
|
-
workflowArgumentCompletions(partial, deps.runtimeProxy)
|
|
61
|
+
getArgumentCompletions: (partial: string): PiArgumentCompletionResult | Promise<PiArgumentCompletionResult> => {
|
|
62
|
+
const buildCompletions = (): PiArgumentCompletionResult => workflowArgumentCompletions(partial, deps.runtimeProxy);
|
|
63
|
+
if (!workflowArgumentCompletionsNeedWorkflowResources(partial)) return buildCompletions();
|
|
64
|
+
return Promise.resolve(deps.ensureWorkflowResourcesLoaded()).then(buildCompletions).catch(buildCompletions);
|
|
65
|
+
},
|
|
62
66
|
},
|
|
63
67
|
workflowCommands,
|
|
64
68
|
);
|
|
@@ -76,10 +80,18 @@ async function workflowSlashHandler(
|
|
|
76
80
|
const fail = (msg: string): void => reporter.error(msg);
|
|
77
81
|
const withImplicitYesFlag = (tokens: string[]): string[] =>
|
|
78
82
|
tokens.some((t) => t === "--yes" || t === "-y") ? tokens : [...tokens, "-y"];
|
|
83
|
+
const ensureWorkflowResourcesVisible = async (): Promise<void> => {
|
|
84
|
+
try {
|
|
85
|
+
await deps.ensureWorkflowResourcesLoaded();
|
|
86
|
+
} catch (error) {
|
|
87
|
+
ctx.ui?.notify(formatWorkflowResourceLoadWarning(error), "warning");
|
|
88
|
+
}
|
|
89
|
+
};
|
|
79
90
|
const showWorkflowInputs = async (
|
|
80
91
|
workflowName: string,
|
|
81
92
|
command: WorkflowCommandOutputDetails["command"] = "inputs",
|
|
82
93
|
): Promise<void> => {
|
|
94
|
+
await ensureWorkflowResourcesVisible();
|
|
83
95
|
const result = await deps.runtimeForContext(ctx).dispatch({ workflow: workflowName, inputs: {}, action: "inputs" }, { policy });
|
|
84
96
|
if (result.action !== "inputs" || !("inputs" in result)) return;
|
|
85
97
|
const inputResult = result as Extract<WorkflowToolResult, { action: "inputs" }>;
|
|
@@ -99,6 +111,7 @@ async function workflowSlashHandler(
|
|
|
99
111
|
return;
|
|
100
112
|
}
|
|
101
113
|
if (!subcommand || subcommand === "list") {
|
|
114
|
+
await ensureWorkflowResourcesVisible();
|
|
102
115
|
const items = deps.runtimeProxy.registry.all().map((def) => ({
|
|
103
116
|
name: def.normalizedName,
|
|
104
117
|
description: def.description,
|
|
@@ -163,6 +176,7 @@ async function workflowSlashHandler(
|
|
|
163
176
|
typeof ctx.ui?.setEditorComponent === "function" || typeof ctx.ui?.custom === "function"
|
|
164
177
|
);
|
|
165
178
|
if (canOpenPicker) {
|
|
179
|
+
await ensureWorkflowResourcesVisible();
|
|
166
180
|
const schemaResult = await deps.runtimeForContext(ctx).dispatch({ workflow: workflowName, inputs: {}, action: "inputs" }, { policy });
|
|
167
181
|
const schema = schemaResult.action === "inputs" && "inputs" in schemaResult
|
|
168
182
|
? (schemaResult as Extract<WorkflowToolResult, { action: "inputs" }>)
|
|
@@ -185,6 +199,7 @@ async function workflowSlashHandler(
|
|
|
185
199
|
}
|
|
186
200
|
}
|
|
187
201
|
|
|
202
|
+
await ensureWorkflowResourcesVisible();
|
|
188
203
|
const result = await deps.runWithLifecycleSuppressedForPolicy(policy, () =>
|
|
189
204
|
deps.runtimeForContext(ctx).dispatch({ workflow: workflowName, inputs: mergedInputs, action: "run" }, { policy }),
|
|
190
205
|
);
|
|
@@ -45,6 +45,15 @@ export function emitTerminalRunDetailSurface(
|
|
|
45
45
|
emitChatSurface(pi, { kind: "detail", detail }, { content: renderRunDetail(detail, { width: 100 }) });
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
|
|
49
|
+
export function formatWorkflowResourceLoadWarning(error: unknown): string {
|
|
50
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
+
return [
|
|
52
|
+
"Workflow discovery diagnostics: workflow resources could not be fully refreshed.",
|
|
53
|
+
`- [error DISCOVERY_FAILED] workflow discovery: ${message}`,
|
|
54
|
+
"Using the currently loaded workflow registry; run `/workflow reload` after fixing the issue.",
|
|
55
|
+
].join("\n");
|
|
56
|
+
}
|
|
48
57
|
export function formatStartupDiagnostics(
|
|
49
58
|
configResult: ConfigLoadResult | null,
|
|
50
59
|
discoveryResult: DiscoveryResult | null,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export const WORKFLOW_TOOL_DESCRIPTION =
|
|
2
|
-
"Run named workflows or direct one-off task/tasks/chain workflows; " +
|
|
2
|
+
"Run named builtin, project, user, or package workflows, or direct one-off task/tasks/chain workflows; " +
|
|
3
|
+
"when workflow execution fits but another shape would better achieve the task, author a custom TypeScript workflow({...}) inline with normal coding tools, reload it, and run it; " +
|
|
3
4
|
"discover with list/get/inputs, inspect status/stages/stage details, " +
|
|
4
5
|
"send prompt answers or steering, pause/resume/interrupt/kill runs, and reload workflow resources. " +
|
|
5
6
|
"For large stage handoffs, write context to files/artifacts, pass paths via reads, and prompt downstream agents to 'Read the file at <path>...' instead of injecting large previous text. " +
|
|
@@ -8,26 +9,20 @@ export const WORKFLOW_TOOL_DESCRIPTION =
|
|
|
8
9
|
"then search it with rg/grep and read small ranges; transcript is path-only by default when sessionFile/transcriptPath exists, explicit tail/limit returns bounded previews, and missing transcript paths fall back to a small preview.";
|
|
9
10
|
|
|
10
11
|
export const DEFAULT_PROMPT_GUIDANCE: string[] = [
|
|
11
|
-
`**
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
|
|
12
|
+
`**Execution routing**: Use the least orchestration that reliably fits the user's intent.
|
|
13
|
+
- Keep interactive, exploratory, conceptual, and conversation-led work inline so the user can steer it turn by turn.
|
|
14
|
+
- Use a single subagent or a bounded subagent chain/parallel fan-out for specialist work while the parent remains in control. Multiple steps, files, tests, validation commands, or parallelism alone do not require a workflow.
|
|
15
|
+
- Use a workflow when the user clearly delegates a well-defined autonomous job that is likely long-running or background-oriented, or when the job materially needs durable stage tracking, artifacts/checkpoints, resumability, human-in-the-loop prompts, gates, retries, or bounded loops. When the user clearly delegates such a long-running job, choose and run an appropriate workflow rather than keeping it inline.
|
|
16
|
+
- Treat loop or stop-condition phrasing as a key workflow signal, especially requests such as "do X until Y", "repeat until", "iterate until", "review/fix until passing", "run checks and fix until green", or "keep going until done". When the user asks Atomic to execute such a loop, prefer a workflow so the stop condition, retries, evidence, and convergence are tracked. Do not let this override a clearly exploratory or conceptual conversation.
|
|
17
|
+
- Named workflows may be builtin, project, user, or package supplied. Direct \`task\`, \`tasks\`, and \`chain\` modes provide one-off tracked shapes. When workflow execution is warranted, you may always author a custom TypeScript \`workflow({...})\` inline with normal coding tools if that shape best achieves the user's task; it need not reuse an installed workflow or fit a direct mode. For richer branches, loops, gates, child workflows, or human-in-the-loop behavior, write the definition, reload workflow resources, then run it. The workflow tool does not have a create action; do not force-fit a builtin such as \`goal\` or \`ralph\` when a custom workflow better matches the job.`,
|
|
18
|
+
`**Workflow discovery and lifecycle**:
|
|
18
19
|
- For unfamiliar named workflows, discover with \`action: "list"\`, inspect with \`action: "get"\` or \`action: "inputs"\`, and run with \`action: "run"\`, \`workflow\`, and validated \`inputs\`; do not invent workflow names or input keys.
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
- Tip: when designing workflows, implement it in a way that you pass information from stage to stage by writing it to a file or artifact (either deterministic or model-driven), pass the path with \`reads\`, and explicitly prompt the downstream agent with wording like \`Read the file at <path>...\`; do not inject large \`previous\` payloads or session history into the next prompt unless explicitly requested to.
|
|
28
|
-
- When designing reviewer-gated workflows, distinguish implementation/review acceptance from post-approval final actions such as PR/MR/review creation, release tagging, deployment, or publication. Prompt reviewers/reducers to approve and stop the implementation loop when implementation and validation criteria are proven and only an explicitly authorized final action remains; carry that remainder as a next action or final-action field instead of another implementation turn.
|
|
29
|
-
- When authoring workflow, stage, reviewer, or reducer prompts, remember that a model stage sees its local prompt, artifacts, tools, and reads — not the workflow graph's name or surrounding implementation details unless you explicitly provide them. Describe the concrete action, available evidence, and success criteria directly (for example "review the current code delta" or "create/update the review request") instead of asking the model to reason from labels like "the create-PR workflow stage", "this Goal run", or "the Ralph reviewer". Use workflow or stage names only when the name itself is user-visible context or materially affects behavior.
|
|
30
|
-
- Prefer the \`goal\` workflow for small-to-medium non-trivial one-off fixes, debugging, docs/code changes, scoped multi-file edits, or test/fix loops when you can name the work surface, outcome, and validation; prefer the \`ralph\` workflow for larger/riskier work, migrations, new features, broad refactors, multi-package changes, or tasks estimated over ~2K LoC.
|
|
31
|
-
- Adjust \`goal.max_turns\` for Goal runs and \`ralph.max_loops\` for Ralph runs based on task complexity (estimated LoC, risk, validation effort, and number of unique files/areas touched).
|
|
32
|
-
- Define an objective that includes tight scope, concrete and verifiable done criteria, and validation steps; then monitor progress as above instead of doing parallel implementation yourself.`,
|
|
20
|
+
- Once you run a workflow, end the current turn and wait for user input or a lifecycle notice. Do not use sleep/status polling loops: key start, finish, and failure events arrive automatically. Use targeted \`status\`/\`stages\`/\`stage\` checks only when the user asks or the next step needs them, and use \`send\`/\`pause\`/\`resume\`/\`interrupt\`/\`kill\` only to answer, steer, or honor control requests.
|
|
21
|
+
- For transcripts, avoid whole-file reads. Get \`sessionFile\`/\`transcriptPath\` from \`stages\` or \`stage\`, preserve the exact path and platform separators, search with \`rg\`/\`grep\`, and read small relevant ranges; use explicit \`tail\` or \`limit\` only for a bounded preview.`,
|
|
22
|
+
`**Workflow authoring and handoffs**:
|
|
23
|
+
- When a user asks to create or edit a workflow, clarify only unresolved requirements that materially affect its purpose, inputs, stages, handoffs, validation, success criteria, or starter pattern. Read the workflow docs/examples, implement the TypeScript definition with normal coding tools, reload it, and run representative test inputs before presenting it. Use the create-spec skill when it adds value; it is not mandatory when context is already sufficient.
|
|
24
|
+
- Consult docs/workflows.md and its starter patterns (Classify-and-act, Fan-out-and-synthesize, Adversarial verification, Generate-and-filter, Tournament, and Loop until done) when designing a stage graph.
|
|
25
|
+
- Pass large stage context through files/artifacts and \`reads\` with an explicit \`Read the file at <path>...\` prompt rather than large \`previous\` payloads or injected session history.
|
|
26
|
+
- Separate implementation/review acceptance from explicitly authorized final actions such as PR/MR/review creation, release tagging, deployment, or publication. Stop implementation loops once acceptance is proven and carry a remaining final action separately.
|
|
27
|
+
- A model stage sees its local prompt, artifacts, tools, and reads, not the graph name or surrounding implementation. State the concrete action, evidence, and success criteria directly.`,
|
|
33
28
|
];
|
|
@@ -22,12 +22,14 @@ import {
|
|
|
22
22
|
resolveRunIdPrefix,
|
|
23
23
|
resolveStageTarget,
|
|
24
24
|
} from "./workflow-targets.js";
|
|
25
|
+
import { formatWorkflowResourceLoadWarning } from "./workflow-command-surfaces.js";
|
|
25
26
|
|
|
26
27
|
export interface WorkflowRunControlDeps {
|
|
27
28
|
pi: ExtensionAPI;
|
|
28
29
|
overlay: GraphOverlayPort;
|
|
29
30
|
getPersistence: () => WorkflowPersistencePort | undefined;
|
|
30
31
|
runtimeForContext: (ctx?: PiCommandContext) => ExtensionRuntime;
|
|
32
|
+
ensureWorkflowResourcesLoaded: () => Promise<void> | void;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
function resolveAttachStageId(runId: string, stageTarget: string | undefined): string | undefined | false {
|
|
@@ -61,6 +63,11 @@ async function handleDurableResume(
|
|
|
61
63
|
): Promise<boolean> {
|
|
62
64
|
const print = (msg: string): void => reporter.info(msg);
|
|
63
65
|
const fail = (msg: string): void => reporter.error(msg);
|
|
66
|
+
try {
|
|
67
|
+
await deps.ensureWorkflowResourcesLoaded();
|
|
68
|
+
} catch (error) {
|
|
69
|
+
ctx.ui?.notify(formatWorkflowResourceLoadWarning(error), "warning");
|
|
70
|
+
}
|
|
64
71
|
const runtime = deps.runtimeForContext(ctx);
|
|
65
72
|
const policy = workflowPolicyFromContext(ctx);
|
|
66
73
|
// Hydrate the durable backend from DBOS (if configured) before listing so a
|
|
@@ -121,6 +128,13 @@ export async function handleRunControlCommand(
|
|
|
121
128
|
const fail = (msg: string): void => reporter.error(msg);
|
|
122
129
|
const canOpenPicker = (ui: PiCommandContext["ui"] | undefined): boolean =>
|
|
123
130
|
policy.allowInputPicker && typeof ui?.custom === "function";
|
|
131
|
+
const ensureWorkflowResourcesVisible = async (): Promise<void> => {
|
|
132
|
+
try {
|
|
133
|
+
await deps.ensureWorkflowResourcesLoaded();
|
|
134
|
+
} catch (error) {
|
|
135
|
+
ctx.ui?.notify(formatWorkflowResourceLoadWarning(error), "warning");
|
|
136
|
+
}
|
|
137
|
+
};
|
|
124
138
|
const confirmationPrompt = policy.allowHumanInput && typeof ctx.ui?.confirm === "function"
|
|
125
139
|
? ctx.ui.confirm.bind(ctx.ui)
|
|
126
140
|
: undefined;
|
|
@@ -293,22 +307,23 @@ export async function handleRunControlCommand(
|
|
|
293
307
|
const liveRuns = topLevelWorkflowRuns(store.runs()).filter((run) =>
|
|
294
308
|
run.status === "paused" || (run.status === "failed" && run.resumable !== false),
|
|
295
309
|
);
|
|
296
|
-
// Durable entries: a `running` durable handle may be a crashed process
|
|
297
|
-
// (cross-session crash recovery), so it stays selectable UNLESS it
|
|
298
|
-
// matches an actively-executing live run in this session.
|
|
299
|
-
const activeLiveIds = new Set(
|
|
300
|
-
topLevelWorkflowRuns(store.runs())
|
|
301
|
-
.filter((run) => run.endedAt === undefined && run.status === "running" && run.exitReason !== "quit")
|
|
302
|
-
.map((run) => run.id),
|
|
303
|
-
);
|
|
304
|
-
const runtime = deps.runtimeForContext(ctx);
|
|
305
310
|
let durableEntries: readonly ResumableWorkflowEntry[] = [];
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
311
|
+
if (liveRuns.length === 0) {
|
|
312
|
+
// Durable entries: a `running` durable handle may be a crashed process
|
|
313
|
+
// (cross-session crash recovery), so it stays selectable UNLESS it
|
|
314
|
+
// matches an actively-executing live run in this session.
|
|
315
|
+
const activeLiveIds = new Set(
|
|
316
|
+
topLevelWorkflowRuns(store.runs())
|
|
317
|
+
.filter((run) => run.endedAt === undefined && run.status === "running" && run.exitReason !== "quit")
|
|
318
|
+
.map((run) => run.id),
|
|
319
|
+
);
|
|
320
|
+
await ensureWorkflowResourcesVisible();
|
|
321
|
+
const runtime = deps.runtimeForContext(ctx);
|
|
322
|
+
try {
|
|
323
|
+
const prepared = await runtime.prepareDurableResumable(undefined);
|
|
324
|
+
durableEntries = filterSelectorDurableEntries(runtime, prepared)
|
|
325
|
+
.filter((entry) => !activeLiveIds.has(entry.workflowId));
|
|
326
|
+
} catch (error) {
|
|
312
327
|
const message = error instanceof Error ? error.message : String(error);
|
|
313
328
|
fail(`Failed to list resumable workflows: ${message}`);
|
|
314
329
|
return true;
|
|
@@ -326,11 +341,12 @@ export async function handleRunControlCommand(
|
|
|
326
341
|
const isPaused = run?.status === "paused" || (run?.stages.some((s) => s.status === "paused") ?? false);
|
|
327
342
|
const isResumableContinuation = run !== undefined && !isPaused && ((run.status === "failed" && run.endedAt !== undefined && run.resumable !== false) || (run.endedAt === undefined && run.resumable === true && run.failureRecoverability === "recoverable"));
|
|
328
343
|
if (isResumableContinuation) {
|
|
344
|
+
await ensureWorkflowResourcesVisible();
|
|
329
345
|
const continuation = deps.runtimeForContext(ctx).resumeFailedRun(resolved.runId, undefined, { policy });
|
|
330
346
|
continuation.ok ? print(continuation.message) : fail(continuation.message);
|
|
331
347
|
} else {
|
|
332
348
|
const result = resumeRun(resolved.runId, {});
|
|
333
|
-
if (result.ok && result.mode === "snapshot" && run?.exitReason === "quit") {
|
|
349
|
+
if (result.ok && !isPaused && result.mode === "snapshot" && run?.exitReason === "quit") {
|
|
334
350
|
return await handleDurableResume(resolved.runId, ctx, reporter, deps);
|
|
335
351
|
}
|
|
336
352
|
if (result.ok && policy.allowInputPicker) deps.overlay.open(result.runId, overlaySurfaceFromContext(ctx));
|
|
@@ -389,7 +405,9 @@ export async function handleRunControlCommand(
|
|
|
389
405
|
return true;
|
|
390
406
|
}
|
|
391
407
|
const run = store.runs().find((r) => r.id === stageRunId);
|
|
392
|
-
const
|
|
408
|
+
const hadPausedRunState = run?.status === "paused";
|
|
409
|
+
const hadPausedStageState = run?.stages.some((s) => s.status === "paused") ?? false;
|
|
410
|
+
const isPaused = hadPausedRunState || hadPausedStageState;
|
|
393
411
|
const isResumableContinuation = run !== undefined && !isPaused && ((run.status === "failed" && run.endedAt !== undefined && run.resumable !== false) || (run.endedAt === undefined && run.resumable === true && run.failureRecoverability === "recoverable"));
|
|
394
412
|
const isActivelyRunning = run !== undefined && run.endedAt === undefined && run.status === "running" && !isPaused && run.exitReason !== "quit";
|
|
395
413
|
if (isActivelyRunning && action === "resume") {
|
|
@@ -397,27 +415,34 @@ export async function handleRunControlCommand(
|
|
|
397
415
|
return true;
|
|
398
416
|
}
|
|
399
417
|
if (isResumableContinuation) {
|
|
418
|
+
await ensureWorkflowResourcesVisible();
|
|
400
419
|
const continuation = deps.runtimeForContext(ctx).resumeFailedRun(stageRunId, stageId, { policy });
|
|
401
420
|
continuation.ok ? print(continuation.message) : fail(continuation.message);
|
|
402
421
|
return true;
|
|
403
422
|
}
|
|
423
|
+
// A quit, non-paused durable run is a resume shadow rather than a live
|
|
424
|
+
// stage-control pause. Routing directly to durable resume preserves the
|
|
425
|
+
// previous snapshot-only diversion without reopening a stale local overlay.
|
|
426
|
+
if (!isPaused && run?.exitReason === "quit" && action === "resume") {
|
|
427
|
+
return await handleDurableResume(stageRunId, ctx, reporter, deps);
|
|
428
|
+
}
|
|
404
429
|
const result = resumeRun(stageRunId, { stageId, message });
|
|
405
430
|
if (!result.ok) {
|
|
406
431
|
fail(`Run not found: ${stageRunId.slice(0, 8)}`);
|
|
407
432
|
return true;
|
|
408
433
|
}
|
|
409
|
-
if (result.mode === "snapshot" && run?.exitReason === "quit" && action === "resume") {
|
|
410
|
-
return await handleDurableResume(stageRunId, ctx, reporter, deps);
|
|
411
|
-
}
|
|
412
434
|
if (!isPaused) {
|
|
413
435
|
if (policy.allowInputPicker) deps.overlay.open(result.runId, overlaySurfaceFromContext(ctx));
|
|
414
436
|
print(result.message ?? `Snapshot available: run ${result.runId} (${result.snapshot.name}) — status: ${result.snapshot.status}, stages: ${result.snapshot.stages.length}`);
|
|
415
437
|
return true;
|
|
416
438
|
}
|
|
417
439
|
if (!message && stageId && policy.allowInputPicker) deps.overlay.open(runId, overlaySurfaceFromContext(ctx), stageId);
|
|
418
|
-
result.resumed.length === 0
|
|
419
|
-
|
|
420
|
-
|
|
440
|
+
if (result.resumed.length === 0) {
|
|
441
|
+
const runLevelResumed = hadPausedRunState && !hadPausedStageState && stageId === undefined && result.snapshot.status === "running";
|
|
442
|
+
runLevelResumed ? print(`Resumed run ${stageRunId.slice(0, 8)}.`) : fail(`No paused stages on run ${stageRunId.slice(0, 8)}.`);
|
|
443
|
+
} else {
|
|
444
|
+
print(`Resumed ${result.resumed.length} stage(s) on run ${stageRunId.slice(0, 8)}${message ? ` with message: "${message}"` : ""}.`);
|
|
445
|
+
}
|
|
421
446
|
return true;
|
|
422
447
|
}
|
|
423
448
|
|
|
@@ -49,7 +49,7 @@ const StageSessionOptionProperties = {
|
|
|
49
49
|
agentDir: Type.Optional(Type.String()),
|
|
50
50
|
authStorage: Type.Optional(SdkSessionOptionSchema("authStorage")),
|
|
51
51
|
modelRegistry: Type.Optional(SdkSessionOptionSchema("modelRegistry")),
|
|
52
|
-
model: Type.Optional(Type.Unsafe<WorkflowModelValue>({ description: "Primary model id or SDK model object. String ids may include a reasoning suffix, e.g. openai/gpt-5:high; valid levels: off|minimal|low|medium|high|xhigh. A parenthesized context-window token may precede or follow the suffix, e.g. github-copilot/claude-opus-4.8 (1m):xhigh or github-copilot/claude-opus-4.8:xhigh (1m). Use (long) for a generic long-context marker, or a rounded size matching the model's long tier (e.g. (1m) or (1.1m)); both select the model's advertised long tier." })),
|
|
52
|
+
model: Type.Optional(Type.Unsafe<WorkflowModelValue>({ description: "Primary model id or SDK model object. String ids may include a reasoning suffix, e.g. openai/gpt-5:high; valid levels: off|minimal|low|medium|high|xhigh|max. A parenthesized context-window token may precede or follow the suffix, e.g. github-copilot/claude-opus-4.8 (1m):xhigh or github-copilot/claude-opus-4.8:xhigh (1m). Use (long) for a generic long-context marker, or a rounded size matching the model's long tier (e.g. (1m) or (1.1m)); both select the model's advertised long tier." })),
|
|
53
53
|
contextWindow: Type.Optional(Type.Number({ description: "Context-window token budget for the stage session (e.g. 1000000). Non-strict by default: an unsupported value keeps the model's default window. Prefer the per-model `(1m)` token in a model/fallbackModels entry when only specific models should use a larger window." })),
|
|
54
54
|
contextWindowStrict: Type.Optional(Type.Boolean({ description: "Treat an unsupported contextWindow as an error instead of falling back to the model's default window." })),
|
|
55
55
|
thinkingLevel: Type.Optional(SdkSessionOptionSchema("thinkingLevel")),
|
|
@@ -71,8 +71,21 @@ const StageSessionOptionProperties = {
|
|
|
71
71
|
forkFromSessionFile: Type.Optional(Type.String()),
|
|
72
72
|
};
|
|
73
73
|
|
|
74
|
+
// Keep this union opaque to Value.Convert: branch ordering otherwise coerces
|
|
75
|
+
// boolean false to "false", or the legitimate string path "false" to false.
|
|
76
|
+
const WorkflowOutputSchema = Type.Unsafe<string | false>({
|
|
77
|
+
not: {
|
|
78
|
+
not: {
|
|
79
|
+
anyOf: [
|
|
80
|
+
{ type: "string" },
|
|
81
|
+
{ const: false },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
74
87
|
const WorkflowTaskOptionProperties = {
|
|
75
|
-
output: Type.Optional(
|
|
88
|
+
output: Type.Optional(WorkflowOutputSchema),
|
|
76
89
|
outputMode: Type.Optional(Type.Union([Type.Literal("inline"), Type.Literal("file-only")])),
|
|
77
90
|
reads: Type.Optional(Type.Union([Type.Array(Type.String()), Type.Literal(false)])),
|
|
78
91
|
worktree: Type.Optional(Type.Boolean()),
|
|
@@ -24,12 +24,14 @@ import {
|
|
|
24
24
|
resolveToolStageTarget,
|
|
25
25
|
stageFailureMessage,
|
|
26
26
|
} from "./workflow-targets.js";
|
|
27
|
+
import { formatWorkflowResourceLoadWarning } from "./workflow-command-surfaces.js";
|
|
27
28
|
|
|
28
29
|
export interface WorkflowControlActionDeps {
|
|
29
30
|
getPersistence: () => WorkflowPersistencePort | undefined;
|
|
30
31
|
reloadWorkflowResources: () => Promise<void> | void;
|
|
31
|
-
|
|
32
|
+
getRuntime: () => ExtensionRuntime;
|
|
32
33
|
policy: WorkflowExecutionPolicy;
|
|
34
|
+
ensureWorkflowResourcesLoaded: () => Promise<void> | void;
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
export function workflowPauseAction(args: WorkflowToolArgs): WorkflowToolResult {
|
|
@@ -166,10 +168,10 @@ export function workflowInterruptAction(args: WorkflowToolArgs): WorkflowToolRes
|
|
|
166
168
|
};
|
|
167
169
|
}
|
|
168
170
|
|
|
169
|
-
export function workflowResumeAction(
|
|
171
|
+
export async function workflowResumeAction(
|
|
170
172
|
args: WorkflowToolArgs,
|
|
171
|
-
deps: Pick<WorkflowControlActionDeps, "
|
|
172
|
-
): WorkflowToolResult {
|
|
173
|
+
deps: Pick<WorkflowControlActionDeps, "getRuntime" | "policy" | "ensureWorkflowResourcesLoaded">,
|
|
174
|
+
): Promise<WorkflowToolResult> {
|
|
173
175
|
const target = resolveToolRunTarget(args, "No active run to resume.");
|
|
174
176
|
if (target.kind === "all") return { action: "resume", runId: "--all", status: "noop", message: "Resume does not support --all." };
|
|
175
177
|
if (target.kind === "ambiguous") return { action: "resume", runId: target.target, status: "noop", message: ambiguousRunMessage(target.target, target.matches) };
|
|
@@ -178,25 +180,35 @@ export function workflowResumeAction(
|
|
|
178
180
|
if (!stage.ok) return { action: "resume", runId: target.runId, status: "noop", message: stage.message };
|
|
179
181
|
const stageRunId = stage.runId ?? target.runId;
|
|
180
182
|
const run = store.runs().find((r) => r.id === stageRunId);
|
|
181
|
-
const
|
|
183
|
+
const hadPausedRunState = run?.status === "paused";
|
|
184
|
+
const hadPausedStageState = run?.stages.some((s) => s.status === "paused") ?? false;
|
|
185
|
+
const isPaused = hadPausedRunState || hadPausedStageState;
|
|
182
186
|
const isResumableContinuation = run !== undefined && !isPaused && (
|
|
183
187
|
(run.status === "failed" && run.endedAt !== undefined && run.resumable !== false) ||
|
|
184
188
|
(run.endedAt === undefined && run.resumable === true && run.failureRecoverability === "recoverable")
|
|
185
189
|
);
|
|
186
190
|
if (isResumableContinuation) {
|
|
187
|
-
|
|
191
|
+
let warning: string | undefined;
|
|
192
|
+
try {
|
|
193
|
+
await deps.ensureWorkflowResourcesLoaded();
|
|
194
|
+
} catch (error) {
|
|
195
|
+
warning = formatWorkflowResourceLoadWarning(error);
|
|
196
|
+
}
|
|
197
|
+
const continuation = deps.getRuntime().resumeFailedRun(stageRunId, stage.stageId, { policy: deps.policy });
|
|
198
|
+
const message = warning === undefined ? continuation.message : `${warning}\n\n${continuation.message}`;
|
|
188
199
|
return {
|
|
189
200
|
action: "resume",
|
|
190
201
|
runId: continuation.ok ? continuation.runId : stageRunId,
|
|
191
202
|
status: continuation.ok ? "running" : "noop",
|
|
192
|
-
message
|
|
203
|
+
message,
|
|
193
204
|
};
|
|
194
205
|
}
|
|
195
206
|
const result = resumeRun(stageRunId, { stageId: stage.stageId, message: args.message });
|
|
196
207
|
if (result.ok) {
|
|
208
|
+
const runLevelResumed = hadPausedRunState && !hadPausedStageState && stage.stageId === undefined && result.snapshot.status === "running";
|
|
197
209
|
const message = result.message ?? (isPaused
|
|
198
210
|
? result.resumed.length === 0
|
|
199
|
-
? `No paused stages on run ${result.runId.slice(0, 8)}.`
|
|
211
|
+
? runLevelResumed ? `Resumed run ${result.runId.slice(0, 8)}.` : `No paused stages on run ${result.runId.slice(0, 8)}.`
|
|
200
212
|
: `Resumed ${result.resumed.length} stage(s) on run ${result.runId.slice(0, 8)}${args.message ? ` with message: "${args.message}"` : ""}.`
|
|
201
213
|
: `Snapshot available: run ${result.runId} (${result.snapshot.name}) — status: ${result.snapshot.status}, stages: ${result.snapshot.stages.length}`);
|
|
202
214
|
return { action: "resume", runId: result.runId, status: "ok", message };
|
|
@@ -26,12 +26,14 @@ import {
|
|
|
26
26
|
} from "./workflow-tool-inspection.js";
|
|
27
27
|
import { workflowSendAction } from "./workflow-tool-send.js";
|
|
28
28
|
import { isWorkflowStageToolContext, topLevelExpandedSnapshots } from "./workflow-targets.js";
|
|
29
|
+
import { formatWorkflowResourceLoadWarning } from "./workflow-command-surfaces.js";
|
|
29
30
|
|
|
30
31
|
export function makeExecuteWorkflowTool(
|
|
31
32
|
runtime: ExtensionRuntime | ((ctx: PiExecuteContext) => ExtensionRuntime),
|
|
32
33
|
getPersistence: () => WorkflowPersistencePort | undefined,
|
|
33
34
|
reloadWorkflowResources: () => Promise<void> | void,
|
|
34
|
-
) {
|
|
35
|
+
ensureWorkflowResourcesLoaded: () => Promise<void> | void = () => {},
|
|
36
|
+
): (args: WorkflowToolArgs, ctx: PiExecuteContext) => Promise<WorkflowToolResult> {
|
|
35
37
|
return async function executeWorkflowTool(
|
|
36
38
|
args: WorkflowToolArgs,
|
|
37
39
|
ctx: PiExecuteContext,
|
|
@@ -47,16 +49,28 @@ export function makeExecuteWorkflowTool(
|
|
|
47
49
|
stages: [],
|
|
48
50
|
};
|
|
49
51
|
}
|
|
50
|
-
const activeRuntime = typeof runtime === "function" ? runtime(ctx) : runtime;
|
|
51
52
|
const policy: WorkflowExecutionPolicy = workflowPolicyFromContext(ctx);
|
|
53
|
+
const getRuntime = (): ExtensionRuntime => typeof runtime === "function" ? runtime(ctx) : runtime;
|
|
54
|
+
const ensureWorkflowResourcesVisible = async (): Promise<void> => {
|
|
55
|
+
try {
|
|
56
|
+
await ensureWorkflowResourcesLoaded();
|
|
57
|
+
} catch (error) {
|
|
58
|
+
ctx.ui?.notify?.(formatWorkflowResourceLoadWarning(error), "warning");
|
|
59
|
+
}
|
|
60
|
+
};
|
|
52
61
|
|
|
53
62
|
switch (action) {
|
|
54
63
|
case "get":
|
|
55
|
-
|
|
64
|
+
await ensureWorkflowResourcesVisible();
|
|
65
|
+
return workflowGetResult(getRuntime(), args);
|
|
56
66
|
case "list":
|
|
57
|
-
case "inputs":
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
case "inputs": {
|
|
68
|
+
await ensureWorkflowResourcesVisible();
|
|
69
|
+
return getRuntime().dispatch(args, { policy });
|
|
70
|
+
}
|
|
71
|
+
case "run": {
|
|
72
|
+
if (hasDirectExecutionMode(args)) {
|
|
73
|
+
const activeRuntime = getRuntime();
|
|
60
74
|
const normalModeCount = directModeCount(args) + (hasNamedExecutionMode(args) ? 1 : 0);
|
|
61
75
|
if (normalModeCount !== 1) {
|
|
62
76
|
throw new Error("Workflow extension: specify exactly one normal execution mode: workflow, task, tasks, or chain");
|
|
@@ -64,7 +78,9 @@ export function makeExecuteWorkflowTool(
|
|
|
64
78
|
const details = await activeRuntime.runDirect(withForkParentSession(args, ctx), { policy });
|
|
65
79
|
return workflowRunResultFromDetails(details);
|
|
66
80
|
}
|
|
67
|
-
|
|
81
|
+
await ensureWorkflowResourcesVisible();
|
|
82
|
+
return getRuntime().dispatch(args, { policy });
|
|
83
|
+
}
|
|
68
84
|
case "status": {
|
|
69
85
|
const target = args.runId;
|
|
70
86
|
if (target !== undefined) {
|
|
@@ -92,7 +108,7 @@ export function makeExecuteWorkflowTool(
|
|
|
92
108
|
case "interrupt":
|
|
93
109
|
return workflowInterruptAction(args);
|
|
94
110
|
case "resume":
|
|
95
|
-
return workflowResumeAction(args, {
|
|
111
|
+
return workflowResumeAction(args, { getRuntime, policy, ensureWorkflowResourcesLoaded });
|
|
96
112
|
default: {
|
|
97
113
|
const _exhaustive: never = action;
|
|
98
114
|
throw new Error(`Workflow extension: unknown action "${_exhaustive}"`);
|
|
@@ -18,6 +18,7 @@ import { stageControlRegistry as defaultStageControlRegistry } from "../foregrou
|
|
|
18
18
|
import { appendRunEnd } from "../../shared/persistence-session-entries.js";
|
|
19
19
|
import { expandWorkflowGraph } from "../../shared/expanded-workflow-graph.js";
|
|
20
20
|
import { topLevelWorkflowRuns } from "../../shared/run-visibility.js";
|
|
21
|
+
import { actionableReturnedStatusText, effectiveRunStatus, structuredRecoverableWorkflowFailureText } from "../../shared/returned-run-status.js";
|
|
21
22
|
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
23
24
|
// Types
|
|
@@ -115,7 +116,7 @@ export function statusRuns(opts?: { all?: boolean; store?: Store }): RunStatusEn
|
|
|
115
116
|
return topLevelWorkflowRuns(snapshot.runs).map((run) => ({
|
|
116
117
|
runId: run.id,
|
|
117
118
|
name: run.name,
|
|
118
|
-
status: run
|
|
119
|
+
status: effectiveRunStatus(run),
|
|
119
120
|
startedAt: run.startedAt,
|
|
120
121
|
durationMs: run.durationMs,
|
|
121
122
|
stageCount: expandWorkflowGraph(snapshot, run.id).stages.length,
|
|
@@ -470,7 +471,7 @@ export function inspectRun(
|
|
|
470
471
|
const detail: RunDetail = {
|
|
471
472
|
runId: copy.id,
|
|
472
473
|
name: copy.name,
|
|
473
|
-
status: copy
|
|
474
|
+
status: effectiveRunStatus(copy),
|
|
474
475
|
mode: expandedStages.length > 1 ? "chain" : "single",
|
|
475
476
|
startedAt: copy.startedAt,
|
|
476
477
|
endedAt: copy.endedAt,
|
|
@@ -481,7 +482,7 @@ export function inspectRun(
|
|
|
481
482
|
inputs: copy.inputs,
|
|
482
483
|
stages: expandedStages.map((stage) => structuredClone(stage)),
|
|
483
484
|
result: copy.result,
|
|
484
|
-
error: copy.error,
|
|
485
|
+
error: copy.error ?? (effectiveRunStatus(copy) === copy.status ? undefined : (structuredRecoverableWorkflowFailureText(copy) ?? actionableReturnedStatusText(copy.result))),
|
|
485
486
|
exited: copy.exited,
|
|
486
487
|
exitReason: copy.exitReason,
|
|
487
488
|
failureKind: copy.failureKind,
|
|
@@ -23,14 +23,18 @@ import {
|
|
|
23
23
|
createWorktrees,
|
|
24
24
|
diffWorktrees,
|
|
25
25
|
findWorktreeTaskCwdConflict,
|
|
26
|
-
|
|
26
|
+
setupGitWorktreeCached,
|
|
27
27
|
formatWorktreeDiffSummary,
|
|
28
28
|
formatWorktreeTaskCwdConflict,
|
|
29
|
+
type GitWorktreeSetupCache,
|
|
30
|
+
type GitWorktreeSetupResult,
|
|
29
31
|
type WorktreeSetup,
|
|
30
32
|
} from "../shared/worktree.js";
|
|
31
33
|
import type { RunOpts, RunResult } from "./executor-types.js";
|
|
32
34
|
import { isWorkflowExitStatus } from "./executor-abort.js";
|
|
33
35
|
import { directTaskWithDefaults, resolveWorkflowPath, taskBaseDir, withoutUndefinedProperties } from "./executor-task-prompts.js";
|
|
36
|
+
export { createGitWorktreeSetupCache } from "../shared/worktree.js";
|
|
37
|
+
export type { GitWorktreeSetupCache } from "../shared/worktree.js";
|
|
34
38
|
|
|
35
39
|
export function directModelRequestsFromChain(
|
|
36
40
|
chain: readonly WorkflowChainStep[],
|
|
@@ -223,27 +227,44 @@ export function stageOptionsWithInputDefaults<T extends StageOptions>(options: T
|
|
|
223
227
|
return { ...defaults, ...withoutUndefinedProperties(options ?? {}) } as T;
|
|
224
228
|
}
|
|
225
229
|
|
|
226
|
-
export function stageOptionsWithGitWorktree<T extends StageOptions>(options: T | undefined, workflowInvocationCwd: string): T | undefined {
|
|
230
|
+
export function stageOptionsWithGitWorktree<T extends StageOptions>(options: T | undefined, workflowInvocationCwd: string, cache?: GitWorktreeSetupCache): T | undefined {
|
|
227
231
|
if (options === undefined) return undefined;
|
|
228
232
|
if (typeof options.gitWorktreeDir !== "string" || options.gitWorktreeDir.trim().length === 0) return options;
|
|
229
|
-
const setup =
|
|
233
|
+
const setup = setupGitWorktreeCached({
|
|
230
234
|
gitWorktreeDir: options.gitWorktreeDir,
|
|
231
235
|
baseBranch: options.baseBranch,
|
|
232
236
|
cwd: workflowInvocationCwd,
|
|
233
|
-
});
|
|
237
|
+
}, cache);
|
|
234
238
|
const explicitCwd = resolveWorktreeCwdOverride(options.cwd, setup.cwd);
|
|
235
239
|
return { ...options, gitWorktreeDir: undefined, baseBranch: undefined, cwd: explicitCwd ?? setup.cwd };
|
|
236
240
|
}
|
|
237
241
|
|
|
238
|
-
export function
|
|
242
|
+
export function setupWorkflowInputGitWorktree(inputDefaults: Partial<StageOptions>, workflowInvocationCwd: string, cache?: GitWorktreeSetupCache): GitWorktreeSetupResult | undefined {
|
|
239
243
|
if (typeof inputDefaults.gitWorktreeDir !== "string" || inputDefaults.gitWorktreeDir.trim().length === 0) {
|
|
240
|
-
return
|
|
244
|
+
return undefined;
|
|
241
245
|
}
|
|
242
|
-
return
|
|
246
|
+
return setupGitWorktreeCached({
|
|
243
247
|
gitWorktreeDir: inputDefaults.gitWorktreeDir,
|
|
244
248
|
baseBranch: inputDefaults.baseBranch,
|
|
245
249
|
cwd: workflowInvocationCwd,
|
|
246
|
-
})
|
|
250
|
+
}, cache);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export function workflowCwdWithInputWorktree(inputDefaults: Partial<StageOptions>, workflowInvocationCwd: string, cache?: GitWorktreeSetupCache): string {
|
|
254
|
+
return setupWorkflowInputGitWorktree(inputDefaults, workflowInvocationCwd, cache)?.cwd ?? workflowInvocationCwd;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function workflowInvocationMetadata(inputDefaults: Partial<StageOptions>, workflowInvocationCwd: string, cache?: GitWorktreeSetupCache): {
|
|
258
|
+
readonly invocationCwd: string;
|
|
259
|
+
readonly workflowCwd?: string;
|
|
260
|
+
readonly repositoryRoot?: string;
|
|
261
|
+
readonly gitWorktreeRoot?: string;
|
|
262
|
+
} {
|
|
263
|
+
const setup = setupWorkflowInputGitWorktree(inputDefaults, workflowInvocationCwd, cache);
|
|
264
|
+
return {
|
|
265
|
+
invocationCwd: workflowInvocationCwd,
|
|
266
|
+
...(setup !== undefined ? { workflowCwd: setup.cwd, repositoryRoot: setup.repositoryRoot, gitWorktreeRoot: setup.worktreeRoot } : {}),
|
|
267
|
+
};
|
|
247
268
|
}
|
|
248
269
|
|
|
249
270
|
function directWorktreeDiffsDir(options: WorkflowDirectOptions, setup: WorktreeSetup, runId: string, scope: string): string {
|
|
@@ -310,7 +310,7 @@ export function toolResultHasChatAnswer(result: unknown): boolean {
|
|
|
310
310
|
);
|
|
311
311
|
}
|
|
312
312
|
|
|
313
|
-
export
|
|
313
|
+
export { RESUME_CONTINUATION_PROMPT } from "../../shared/resume-continuation.js";
|
|
314
314
|
|
|
315
315
|
export function shouldInjectResumeContinuation(state: {
|
|
316
316
|
readonly resumeOccurred: boolean;
|