@bastani/atomic 0.9.27 → 0.9.28-alpha.2
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 +61 -0
- package/dist/builtin/intercom/CHANGELOG.md +6 -0
- package/dist/builtin/intercom/broker/broker.ts +13 -1
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/CHANGELOG.md +6 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/web-access/index.bundle.mjs +194 -44
- package/dist/builtin/web-access/package.json +3 -3
- package/dist/builtin/workflows/CHANGELOG.md +31 -0
- package/dist/builtin/workflows/builtin/{chunk-gw7rghda.js → chunk-aqv8ny38.js} +257 -259
- package/dist/builtin/workflows/builtin/{chunk-gts8wgjr.js → chunk-br4ac9a3.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-9bhs02gm.js → chunk-p3xmajmj.js} +439 -40
- package/dist/builtin/workflows/builtin/chunk-p6jagvyf.js +8 -0
- package/dist/builtin/workflows/builtin/goal.js +2 -2
- package/dist/builtin/workflows/builtin/index.js +4 -4
- package/dist/builtin/workflows/builtin/ralph.js +2 -2
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/src/authoring.d.ts +14 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +108110 -107201
- package/dist/builtin/workflows/src/index.js +42226 -41077
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +16 -11
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +16 -1
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +12 -5
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/credential-print.d.ts +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +2 -56
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/codemode-worker.js +99 -3
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.js +6 -1
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +20 -3
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +3 -2
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +6 -0
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +96 -12
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +4 -1
- 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 +19 -3
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +3 -2
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +11 -16
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +1 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.js +2 -1
- package/dist/core/auth-storage-backends.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +15 -7
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/azure-provider-compat.d.ts +8 -0
- package/dist/core/azure-provider-compat.d.ts.map +1 -0
- package/dist/core/azure-provider-compat.js +65 -0
- package/dist/core/azure-provider-compat.js.map +1 -0
- package/dist/core/child-session-options.d.ts +1 -1
- package/dist/core/child-session-options.d.ts.map +1 -1
- package/dist/core/child-session-options.js +11 -2
- package/dist/core/child-session-options.js.map +1 -1
- package/dist/core/compaction/classifier-compaction.d.ts +13 -0
- package/dist/core/compaction/classifier-compaction.d.ts.map +1 -0
- package/dist/core/compaction/classifier-compaction.js +110 -0
- package/dist/core/compaction/classifier-compaction.js.map +1 -0
- package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
- package/dist/core/compaction/compaction-boundary.js +2 -6
- package/dist/core/compaction/compaction-boundary.js.map +1 -1
- package/dist/core/compaction/compaction-runner.d.ts +16 -1
- package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
- package/dist/core/compaction/compaction-runner.js +97 -12
- package/dist/core/compaction/compaction-runner.js.map +1 -1
- package/dist/core/compaction/compaction-types.d.ts +18 -1
- package/dist/core/compaction/compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/compaction-types.js +1 -1
- package/dist/core/compaction/compaction-types.js.map +1 -1
- package/dist/core/compaction/fallback-planner.d.ts +1 -0
- package/dist/core/compaction/fallback-planner.d.ts.map +1 -1
- package/dist/core/compaction/fallback-planner.js +2 -0
- package/dist/core/compaction/fallback-planner.js.map +1 -1
- package/dist/core/compaction/index.d.ts +3 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +3 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/model-resolver.d.ts +16 -0
- package/dist/core/compaction/model-resolver.d.ts.map +1 -0
- package/dist/core/compaction/model-resolver.js +18 -0
- package/dist/core/compaction/model-resolver.js.map +1 -0
- package/dist/core/compaction/morph-compaction.d.ts +14 -0
- package/dist/core/compaction/morph-compaction.d.ts.map +1 -0
- package/dist/core/compaction/morph-compaction.js +99 -0
- package/dist/core/compaction/morph-compaction.js.map +1 -0
- package/dist/core/compaction/pi-summary-fallback.d.ts +34 -0
- package/dist/core/compaction/pi-summary-fallback.d.ts.map +1 -0
- package/dist/core/compaction/pi-summary-fallback.js +357 -0
- package/dist/core/compaction/pi-summary-fallback.js.map +1 -0
- package/dist/core/compaction/planner-outcome.d.ts +10 -6
- package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
- package/dist/core/compaction/planner-outcome.js +11 -4
- package/dist/core/compaction/planner-outcome.js.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts +3 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.js +11 -0
- package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
- package/dist/core/compaction/range-planner.d.ts +3 -3
- package/dist/core/compaction/range-planner.d.ts.map +1 -1
- package/dist/core/compaction/range-planner.js +59 -28
- package/dist/core/compaction/range-planner.js.map +1 -1
- package/dist/core/compaction/region-trimming.d.ts.map +1 -1
- package/dist/core/compaction/region-trimming.js +7 -0
- package/dist/core/compaction/region-trimming.js.map +1 -1
- package/dist/core/compaction/structured-compaction-input.d.ts +19 -0
- package/dist/core/compaction/structured-compaction-input.d.ts.map +1 -0
- package/dist/core/compaction/structured-compaction-input.js +70 -0
- package/dist/core/compaction/structured-compaction-input.js.map +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
- package/dist/core/compaction/transcript-serialization.js +26 -0
- package/dist/core/compaction/transcript-serialization.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +3 -2
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +1 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +5 -0
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-host-modules.d.ts +1 -0
- package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-host-modules.js +12 -0
- package/dist/core/extensions/loader-host-modules.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +10 -4
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +47 -3
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +11 -4
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +38 -9
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +2 -0
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/extensions/workflow-events.d.ts +49 -0
- package/dist/core/extensions/workflow-events.d.ts.map +1 -1
- package/dist/core/extensions/workflow-events.js.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.d.ts +16 -4
- package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.js +72 -1
- package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
- package/dist/core/extensions/workflow-run-control.d.ts +11 -3
- package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control.js.map +1 -1
- package/dist/core/fast-model-variants.d.ts +1 -1
- package/dist/core/fast-model-variants.js +1 -1
- package/dist/core/fast-model-variants.js.map +1 -1
- package/dist/core/keybindings.d.ts +4 -4
- package/dist/core/messages.d.ts +1 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +5 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-fallback-failures.d.ts.map +1 -1
- package/dist/core/model-fallback-failures.js +5 -1
- package/dist/core/model-fallback-failures.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts.map +1 -1
- package/dist/core/model-resolver-cli.js +5 -1
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +1 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.js +6 -1
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver-patterns.d.ts.map +1 -1
- package/dist/core/model-resolver-patterns.js +2 -1
- package/dist/core/model-resolver-patterns.js.map +1 -1
- package/dist/core/model-resolver-scope.d.ts.map +1 -1
- package/dist/core/model-resolver-scope.js +3 -1
- package/dist/core/model-resolver-scope.js.map +1 -1
- package/dist/core/model-runtime-streaming.d.ts.map +1 -1
- package/dist/core/model-runtime-streaming.js +2 -0
- package/dist/core/model-runtime-streaming.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +48 -22
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer-internal.d.ts.map +1 -1
- package/dist/core/provider-composer-internal.js +4 -1
- package/dist/core/provider-composer-internal.js.map +1 -1
- package/dist/core/provider-display-names.js +1 -1
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +3 -0
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +1 -0
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +4 -0
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-internals.d.ts +1 -0
- package/dist/core/resource-loader-internals.d.ts.map +1 -1
- package/dist/core/resource-loader-internals.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +28 -5
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +2 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/sdk-types.d.ts +6 -4
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-lifecycle-work.d.ts +2 -1
- package/dist/core/session-lifecycle-work.d.ts.map +1 -1
- package/dist/core/session-lifecycle-work.js +15 -1
- package/dist/core/session-lifecycle-work.js.map +1 -1
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +4 -2
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +2 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +33 -4
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-core.js +2 -0
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-storage.d.ts.map +1 -1
- package/dist/core/settings-storage.js +2 -1
- package/dist/core/settings-storage.js.map +1 -1
- package/dist/core/settings-types.d.ts +1 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +3 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts +3 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +7 -3
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-loadout.d.ts.map +1 -1
- package/dist/core/tool-loadout.js +8 -1
- package/dist/core/tool-loadout.js.map +1 -1
- package/dist/core/tool-selection.d.ts +13 -0
- package/dist/core/tool-selection.d.ts.map +1 -0
- package/dist/core/tool-selection.js +43 -0
- package/dist/core/tool-selection.js.map +1 -0
- package/dist/core/tools/read.d.ts +7 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +11 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/transcript.d.ts +58 -0
- package/dist/core/transcript.d.ts.map +1 -0
- package/dist/core/transcript.js +185 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +2 -1
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +1 -0
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +4 -1
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +6 -3
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/herdr/index.d.ts.map +1 -1
- package/dist/extensions/herdr/index.js +15 -10
- package/dist/extensions/herdr/index.js.map +1 -1
- package/dist/extensions/herdr/pane-owner.d.ts +6 -2
- package/dist/extensions/herdr/pane-owner.d.ts.map +1 -1
- package/dist/extensions/herdr/pane-owner.js +19 -4
- package/dist/extensions/herdr/pane-owner.js.map +1 -1
- package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -1
- package/dist/extensions/mcp/client/oauth/flow.js +14 -1
- package/dist/extensions/mcp/client/oauth/flow.js.map +1 -1
- package/dist/extensions/mcp/client/oauth/types.d.ts +1 -0
- package/dist/extensions/mcp/client/oauth/types.d.ts.map +1 -1
- package/dist/extensions/mcp/client/oauth/types.js.map +1 -1
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +5 -2
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +18 -4
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -0
- package/dist/main.js.map +1 -1
- package/dist/migrations-azure.d.ts +4 -0
- package/dist/migrations-azure.d.ts.map +1 -0
- package/dist/migrations-azure.js +41 -0
- package/dist/migrations-azure.js.map +1 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +2 -1
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts +2 -0
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.js +9 -3
- package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts +2 -0
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js +15 -3
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +43 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +6 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-turn.js +6 -4
- package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +13 -1
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +8 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +2 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +1 -1
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.js +1 -0
- package/dist/modes/interactive/theme/tui-theme.js.map +1 -1
- package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-args.js +1 -0
- package/dist/modes/interactive-engine/engine-args.js.map +1 -1
- package/dist/utils/credential-redaction.d.ts +2 -0
- package/dist/utils/credential-redaction.d.ts.map +1 -0
- package/dist/utils/credential-redaction.js +20 -0
- package/dist/utils/credential-redaction.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +6 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/docs/codemode.md +3 -2
- package/docs/compaction/reference.md +10 -4
- package/docs/compaction.md +40 -8
- package/docs/docs.json +1 -0
- package/docs/extensions/api-reference.md +18 -0
- package/docs/extensions/authoring.md +1 -1
- package/docs/extensions/events.md +2 -2
- package/docs/extensions.md +2 -0
- package/docs/keybindings.md +9 -9
- package/docs/mcp-servers.md +4 -0
- package/docs/providers.md +33 -3
- package/docs/reference/cli.md +10 -3
- package/docs/sdk/reference.md +16 -1
- package/docs/sdk/web-server.md +325 -0
- package/docs/sdk.md +83 -1
- package/docs/security.md +1 -1
- package/docs/workflows/api-reference.md +74 -4
- package/docs/workflows/authoring.md +6 -2
- package/docs/workflows/builtins.md +4 -0
- package/docs/workflows/operations.md +12 -4
- package/npm-shrinkwrap.json +78 -74
- package/package.json +9 -9
|
@@ -35,10 +35,9 @@ import {
|
|
|
35
35
|
contradictedStopReviewLoopGap,
|
|
36
36
|
consolidateFindingsBatch,
|
|
37
37
|
parseFailureDiagnostics,
|
|
38
|
-
reviewerFailureText,
|
|
39
38
|
summarizeReviewConvergence,
|
|
40
39
|
reverify_consolidated_batch
|
|
41
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-p3xmajmj.js";
|
|
42
41
|
import {
|
|
43
42
|
VERIFICATION_SCALE
|
|
44
43
|
} from "./chunk-n1910xc4.js";
|
|
@@ -52,6 +51,12 @@ import { Type as Type2 } from "typebox";
|
|
|
52
51
|
// dist/builtin/workflows/builtin/goal-runner.ts
|
|
53
52
|
import { join as join3 } from "node:path";
|
|
54
53
|
|
|
54
|
+
// dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts
|
|
55
|
+
import { createStructuredOutputTool } from "@bastani/atomic";
|
|
56
|
+
function isWorkflowStructuredOutputContractError(error) {
|
|
57
|
+
return error instanceof Error && "code" in error && error.code === "ATOMIC_WORKFLOW_STRUCTURED_OUTPUT_CONTRACT";
|
|
58
|
+
}
|
|
59
|
+
|
|
55
60
|
// dist/builtin/workflows/builtin/goal-schemas.ts
|
|
56
61
|
import { Type } from "typebox";
|
|
57
62
|
var reviewFindingSchema = Type.Object({
|
|
@@ -163,100 +168,7 @@ async function writeReviewRoundArtifact(artifactDir, reviews, consolidatedFindin
|
|
|
163
168
|
import { randomUUID } from "node:crypto";
|
|
164
169
|
import { readFile, rename, rm, writeFile as writeFile2 } from "node:fs/promises";
|
|
165
170
|
import { dirname, join as join2 } from "node:path";
|
|
166
|
-
|
|
167
|
-
function withoutTurn2(value) {
|
|
168
|
-
const copy = { ...value };
|
|
169
|
-
delete copy.turn;
|
|
170
|
-
return copy;
|
|
171
|
-
}
|
|
172
|
-
function modelVisibleLedger(ledger) {
|
|
173
|
-
return {
|
|
174
|
-
goal_id: ledger.goal_id,
|
|
175
|
-
objective: ledger.objective,
|
|
176
|
-
acceptance_criteria: ledger.acceptance_criteria,
|
|
177
|
-
status: ledger.status,
|
|
178
|
-
created_at: ledger.created_at,
|
|
179
|
-
updated_at: ledger.updated_at,
|
|
180
|
-
receipts: ledger.receipts.map(withoutTurn2),
|
|
181
|
-
reviews: ledger.reviews.map(withoutTurn2),
|
|
182
|
-
blockers: ledger.blockers.map(withoutTurn2),
|
|
183
|
-
decisions: ledger.decisions.map(withoutTurn2),
|
|
184
|
-
lifecycle: ledger.lifecycle.map(withoutTurn2),
|
|
185
|
-
reverification: ledger.reverification ?? [],
|
|
186
|
-
convergence: ledger.convergence ?? []
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
function goalLedgerStatePath(ledgerPath) {
|
|
190
|
-
return join2(dirname(ledgerPath), LEDGER_STATE_FILENAME);
|
|
191
|
-
}
|
|
192
|
-
function appendLifecycleEvent(ledger, event, summary, turn = ledger.turns) {
|
|
193
|
-
ledger.lifecycle.push({
|
|
194
|
-
turn,
|
|
195
|
-
event,
|
|
196
|
-
status: ledger.status,
|
|
197
|
-
at: new Date().toISOString(),
|
|
198
|
-
summary
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
async function readExistingGoalLedger(ledgerPath) {
|
|
202
|
-
let contents;
|
|
203
|
-
try {
|
|
204
|
-
contents = await readFile(goalLedgerStatePath(ledgerPath), "utf8");
|
|
205
|
-
} catch (error) {
|
|
206
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
207
|
-
return;
|
|
208
|
-
throw error;
|
|
209
|
-
}
|
|
210
|
-
try {
|
|
211
|
-
return JSON.parse(contents);
|
|
212
|
-
} catch {
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
async function createGoalLedger(objective, acceptanceCriteria, artifactDir) {
|
|
217
|
-
const ledgerPath = join2(artifactDir, LEDGER_FILENAME);
|
|
218
|
-
const existing = await readExistingGoalLedger(ledgerPath);
|
|
219
|
-
if (existing !== undefined)
|
|
220
|
-
return { ledger: existing, ledgerPath, artifactDir };
|
|
221
|
-
const goalId = randomUUID();
|
|
222
|
-
const now = new Date().toISOString();
|
|
223
|
-
const ledger = {
|
|
224
|
-
goal_id: goalId,
|
|
225
|
-
objective,
|
|
226
|
-
acceptance_criteria: acceptanceCriteria,
|
|
227
|
-
status: "active",
|
|
228
|
-
turns: 0,
|
|
229
|
-
created_at: now,
|
|
230
|
-
updated_at: now,
|
|
231
|
-
receipts: [],
|
|
232
|
-
reviews: [],
|
|
233
|
-
blockers: [],
|
|
234
|
-
decisions: [],
|
|
235
|
-
lifecycle: [],
|
|
236
|
-
reverification: [],
|
|
237
|
-
convergence: []
|
|
238
|
-
};
|
|
239
|
-
appendLifecycleEvent(ledger, "created", "Goal created.", 0);
|
|
240
|
-
await writeGoalLedger(ledgerPath, ledger);
|
|
241
|
-
return { ledger, ledgerPath, artifactDir };
|
|
242
|
-
}
|
|
243
|
-
async function writeGoalLedger(ledgerPath, ledger) {
|
|
244
|
-
ledger.updated_at = new Date().toISOString();
|
|
245
|
-
const visibleContents = `${JSON.stringify(modelVisibleLedger(ledger), null, 2)}
|
|
246
|
-
`;
|
|
247
|
-
const stateContents = `${JSON.stringify(ledger, null, 2)}
|
|
248
|
-
`;
|
|
249
|
-
const statePath = goalLedgerStatePath(ledgerPath);
|
|
250
|
-
const pendingStatePath = `${statePath}.${randomUUID()}.tmp`;
|
|
251
|
-
await writeFile2(pendingStatePath, stateContents, { encoding: "utf8" });
|
|
252
|
-
try {
|
|
253
|
-
await rename(pendingStatePath, statePath);
|
|
254
|
-
} catch (error) {
|
|
255
|
-
await rm(pendingStatePath, { force: true });
|
|
256
|
-
throw error;
|
|
257
|
-
}
|
|
258
|
-
await writeFile2(ledgerPath, visibleContents, { encoding: "utf8" });
|
|
259
|
-
}
|
|
171
|
+
import { isDeepStrictEqual } from "node:util";
|
|
260
172
|
|
|
261
173
|
// dist/builtin/workflows/builtin/goal-reducer.ts
|
|
262
174
|
function reducerSummary(reviews, approved, nextAction) {
|
|
@@ -379,70 +291,6 @@ function reduceGoalDecision(ledger, turnReviews, options) {
|
|
|
379
291
|
};
|
|
380
292
|
}
|
|
381
293
|
|
|
382
|
-
// dist/builtin/workflows/builtin/goal-reports.ts
|
|
383
|
-
function formatReviewReport(reviews) {
|
|
384
|
-
if (reviews.length === 0)
|
|
385
|
-
return "No reviewer decisions were recorded.";
|
|
386
|
-
return reviews.map((review) => [
|
|
387
|
-
`### ${review.reviewer}`,
|
|
388
|
-
"",
|
|
389
|
-
`Decision: ${review.decision}`,
|
|
390
|
-
`Artifact: ${review.artifact_path}`,
|
|
391
|
-
`Verification remaining: ${review.verification_remaining}`,
|
|
392
|
-
"Finding alignment warning: beyond_objective and contradicts_objective findings are non-blocking and must not be folded into follow-up objectives without checking them against the acceptance criteria.",
|
|
393
|
-
review.findings.length === 0 ? "Findings: none" : [
|
|
394
|
-
"Findings:",
|
|
395
|
-
...review.findings.map((finding) => `- ${finding.objective_alignment}: ${finding.title}`)
|
|
396
|
-
].join(`
|
|
397
|
-
`),
|
|
398
|
-
review.requirements_traceability.length === 0 ? "Requirements traceability: none" : [
|
|
399
|
-
"Requirements traceability:",
|
|
400
|
-
...review.requirements_traceability.map((entry) => `- ${entry.status}: ${entry.requirement} — ${entry.evidence}`)
|
|
401
|
-
].join(`
|
|
402
|
-
`)
|
|
403
|
-
].join(`
|
|
404
|
-
`)).join(`
|
|
405
|
-
|
|
406
|
-
---
|
|
407
|
-
|
|
408
|
-
`);
|
|
409
|
-
}
|
|
410
|
-
function renderFinalReport(ledger, ledgerPath, remainingWork) {
|
|
411
|
-
const receiptLines = ledger.receipts.length > 0 ? ledger.receipts.map((receipt) => `- ${receipt.summary} (artifact: ${receipt.artifact_path})`) : ["- No receipts captured."];
|
|
412
|
-
const lastDecision = ledger.decisions.at(-1);
|
|
413
|
-
return [
|
|
414
|
-
"# Goal Run Final Report",
|
|
415
|
-
"",
|
|
416
|
-
"## Goal ID",
|
|
417
|
-
ledger.goal_id,
|
|
418
|
-
"",
|
|
419
|
-
"## Objective",
|
|
420
|
-
ledger.objective,
|
|
421
|
-
"",
|
|
422
|
-
"## Acceptance criteria",
|
|
423
|
-
ledger.acceptance_criteria,
|
|
424
|
-
"",
|
|
425
|
-
"## Final status",
|
|
426
|
-
ledger.status,
|
|
427
|
-
"",
|
|
428
|
-
"## Ledger artifact",
|
|
429
|
-
ledgerPath,
|
|
430
|
-
"",
|
|
431
|
-
"## Evidence and receipts",
|
|
432
|
-
...receiptLines,
|
|
433
|
-
"",
|
|
434
|
-
"## Final decision",
|
|
435
|
-
lastDecision?.reason ?? "No reducer decision was recorded.",
|
|
436
|
-
"",
|
|
437
|
-
"## Objective-alignment warning",
|
|
438
|
-
"Review findings classified beyond_objective or contradicts_objective are non-blocking and must not be promoted into follow-up objectives without checking them against the acceptance criteria.",
|
|
439
|
-
"",
|
|
440
|
-
"## Remaining work if incomplete",
|
|
441
|
-
ledger.status === "complete" ? "none" : remainingWork
|
|
442
|
-
].join(`
|
|
443
|
-
`);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
294
|
// dist/builtin/workflows/builtin/goal-review.ts
|
|
447
295
|
function reviewDecisionFromResult(result) {
|
|
448
296
|
return result.structured;
|
|
@@ -532,6 +380,225 @@ function reviewDecisionToRecord(args) {
|
|
|
532
380
|
};
|
|
533
381
|
}
|
|
534
382
|
|
|
383
|
+
// dist/builtin/workflows/builtin/goal-ledger.ts
|
|
384
|
+
var LEDGER_STATE_FILENAME = "goal-ledger-state.json";
|
|
385
|
+
function withoutTurn2(value) {
|
|
386
|
+
const copy = { ...value };
|
|
387
|
+
delete copy.turn;
|
|
388
|
+
return copy;
|
|
389
|
+
}
|
|
390
|
+
function modelVisibleLedger(ledger) {
|
|
391
|
+
return {
|
|
392
|
+
goal_id: ledger.goal_id,
|
|
393
|
+
objective: ledger.objective,
|
|
394
|
+
acceptance_criteria: ledger.acceptance_criteria,
|
|
395
|
+
status: ledger.status,
|
|
396
|
+
created_at: ledger.created_at,
|
|
397
|
+
updated_at: ledger.updated_at,
|
|
398
|
+
receipts: ledger.receipts.map(withoutTurn2),
|
|
399
|
+
reviews: ledger.reviews.map(withoutTurn2),
|
|
400
|
+
blockers: ledger.blockers.map(withoutTurn2),
|
|
401
|
+
decisions: ledger.decisions.map(withoutTurn2),
|
|
402
|
+
lifecycle: ledger.lifecycle.map(withoutTurn2),
|
|
403
|
+
reverification: ledger.reverification ?? [],
|
|
404
|
+
convergence: ledger.convergence ?? []
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
function goalLedgerStatePath(ledgerPath) {
|
|
408
|
+
return join2(dirname(ledgerPath), LEDGER_STATE_FILENAME);
|
|
409
|
+
}
|
|
410
|
+
function appendLifecycleEvent(ledger, event, summary, turn = ledger.turns) {
|
|
411
|
+
ledger.lifecycle.push({
|
|
412
|
+
turn,
|
|
413
|
+
event,
|
|
414
|
+
status: ledger.status,
|
|
415
|
+
at: new Date().toISOString(),
|
|
416
|
+
summary
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
async function readExistingGoalLedger(ledgerPath) {
|
|
420
|
+
let contents;
|
|
421
|
+
try {
|
|
422
|
+
contents = await readFile(goalLedgerStatePath(ledgerPath), "utf8");
|
|
423
|
+
} catch (error) {
|
|
424
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
425
|
+
return;
|
|
426
|
+
throw error;
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
return JSON.parse(contents);
|
|
430
|
+
} catch {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function isLegacyDatabaseInterruption(diagnostic) {
|
|
435
|
+
const failure = diagnostic.replace(/^(?:Orchestrator failed before producing a receipt|Reviewer execution failed before producing a decision|Reviewer execution failed while resolving its reads contract): /u, "");
|
|
436
|
+
return [
|
|
437
|
+
"Workflow database unavailable",
|
|
438
|
+
"Workflow database checkpoint timed out",
|
|
439
|
+
"Workflow database ownership generation changed",
|
|
440
|
+
"Managed PostgreSQL did not answer a health check in time",
|
|
441
|
+
"Managed PostgreSQL failed its live health check",
|
|
442
|
+
"managed PostgreSQL health-check failed",
|
|
443
|
+
"durable checkpoint timeout",
|
|
444
|
+
"lost DB connection"
|
|
445
|
+
].some((prefix) => failure === prefix || failure.startsWith(`${prefix}.`) || failure.startsWith(`${prefix}:`) || failure.startsWith(`${prefix} `));
|
|
446
|
+
}
|
|
447
|
+
function recoverLegacyExecutionInterruption(ledger) {
|
|
448
|
+
const decision = ledger.decisions.at(-1);
|
|
449
|
+
const event = ledger.lifecycle.at(-1);
|
|
450
|
+
if (ledger.status !== "needs_human" || decision === undefined || event === undefined || decision.turn !== ledger.turns || !Number.isInteger(decision.turn) || decision.turn < 1 || decision.decision !== "needs_human" || decision.parsed !== false || decision.approved !== false || decision.stopReviewLoop !== false || decision.nextAction !== "needs_human" || decision.finalActionRemaining !== false || decision.complete_votes !== 0 || decision.review_quorum !== DEFAULT_REVIEW_QUORUM || decision.blocker !== undefined || event.event !== "status_decided" || event.status !== "needs_human" || event.turn !== decision.turn || event.summary !== decision.reason || ledger.decisions.slice(0, -1).some((record) => record.turn >= decision.turn || record.decision !== "continue") || ledger.lifecycle.slice(0, -1).some((record) => record.turn > decision.turn || record.turn === decision.turn && record.event === "status_decided") || ledger.blockers.some((record) => record.turn >= decision.turn)) {
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
const diagnostic = decision.diagnostics[0];
|
|
454
|
+
if (decision.diagnostics.length !== 1 || diagnostic === undefined)
|
|
455
|
+
return false;
|
|
456
|
+
if (!isLegacyDatabaseInterruption(diagnostic))
|
|
457
|
+
return false;
|
|
458
|
+
const turnReviews = ledger.reviews.filter((record) => record.turn >= decision.turn);
|
|
459
|
+
const turnReceipts = ledger.receipts.filter((record) => record.turn >= decision.turn);
|
|
460
|
+
const previousEvent = ledger.lifecycle.at(-2);
|
|
461
|
+
const orchestratorInterrupted = diagnostic.startsWith("Orchestrator failed before producing a receipt: ") && decision.reason === [diagnostic, ...convergence_escalation_evidence(ledger.convergence ?? [])].join(`
|
|
462
|
+
`) && turnReceipts.length === 0 && turnReviews.length === 0 && previousEvent?.event === "work_turn_started" && previousEvent.turn === decision.turn && previousEvent.status === "active" && previousEvent.summary === "Orchestrator started.";
|
|
463
|
+
const review = turnReviews[0];
|
|
464
|
+
const reviewerInterrupted = (diagnostic.startsWith("Reviewer execution failed before producing a decision: ") || diagnostic.startsWith("Reviewer execution failed while resolving its reads contract: ")) && turnReviews.length === 1 && review !== undefined && turnReceipts.length === 1 && turnReceipts[0]?.turn === decision.turn && previousEvent?.event === "reviews_recorded" && previousEvent.turn === decision.turn && previousEvent.status === "active" && previousEvent.summary === "Recorded 1 reviewer decisions." && isDeepStrictEqual(review, reviewDecisionToRecord({
|
|
465
|
+
turn: decision.turn,
|
|
466
|
+
reviewer: "reviewer-error",
|
|
467
|
+
artifactPath: review.artifact_path,
|
|
468
|
+
decision: reviewerErrorDecision(diagnostic),
|
|
469
|
+
parsed: false,
|
|
470
|
+
diagnostics: [diagnostic],
|
|
471
|
+
allowFinalActionRemaining: false
|
|
472
|
+
})) && decision.reason === [
|
|
473
|
+
`Reviewer execution failed before quorum could be established. Remaining work: ${collectRemainingWork([review])}`,
|
|
474
|
+
...convergence_escalation_evidence(ledger.convergence ?? [])
|
|
475
|
+
].join(`
|
|
476
|
+
`);
|
|
477
|
+
if (!orchestratorInterrupted && !reviewerInterrupted)
|
|
478
|
+
return false;
|
|
479
|
+
ledger.decisions.pop();
|
|
480
|
+
ledger.lifecycle.pop();
|
|
481
|
+
if (reviewerInterrupted) {
|
|
482
|
+
ledger.reviews = ledger.reviews.filter((record) => record !== review);
|
|
483
|
+
ledger.lifecycle.pop();
|
|
484
|
+
} else {
|
|
485
|
+
ledger.turns = Math.max(0, ...ledger.decisions.map((record) => record.turn));
|
|
486
|
+
}
|
|
487
|
+
ledger.status = "active";
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
async function createGoalLedger(objective, acceptanceCriteria, artifactDir) {
|
|
491
|
+
const ledgerPath = join2(artifactDir, LEDGER_FILENAME);
|
|
492
|
+
const existing = await readExistingGoalLedger(ledgerPath);
|
|
493
|
+
if (existing !== undefined) {
|
|
494
|
+
if (recoverLegacyExecutionInterruption(existing))
|
|
495
|
+
await writeGoalLedger(ledgerPath, existing);
|
|
496
|
+
return { ledger: existing, ledgerPath, artifactDir };
|
|
497
|
+
}
|
|
498
|
+
const goalId = randomUUID();
|
|
499
|
+
const now = new Date().toISOString();
|
|
500
|
+
const ledger = {
|
|
501
|
+
goal_id: goalId,
|
|
502
|
+
objective,
|
|
503
|
+
acceptance_criteria: acceptanceCriteria,
|
|
504
|
+
status: "active",
|
|
505
|
+
turns: 0,
|
|
506
|
+
created_at: now,
|
|
507
|
+
updated_at: now,
|
|
508
|
+
receipts: [],
|
|
509
|
+
reviews: [],
|
|
510
|
+
blockers: [],
|
|
511
|
+
decisions: [],
|
|
512
|
+
lifecycle: [],
|
|
513
|
+
reverification: [],
|
|
514
|
+
convergence: []
|
|
515
|
+
};
|
|
516
|
+
appendLifecycleEvent(ledger, "created", "Goal created.", 0);
|
|
517
|
+
await writeGoalLedger(ledgerPath, ledger);
|
|
518
|
+
return { ledger, ledgerPath, artifactDir };
|
|
519
|
+
}
|
|
520
|
+
async function writeGoalLedger(ledgerPath, ledger) {
|
|
521
|
+
ledger.updated_at = new Date().toISOString();
|
|
522
|
+
const visibleContents = `${JSON.stringify(modelVisibleLedger(ledger), null, 2)}
|
|
523
|
+
`;
|
|
524
|
+
const stateContents = `${JSON.stringify(ledger, null, 2)}
|
|
525
|
+
`;
|
|
526
|
+
const statePath = goalLedgerStatePath(ledgerPath);
|
|
527
|
+
const pendingStatePath = `${statePath}.${randomUUID()}.tmp`;
|
|
528
|
+
await writeFile2(pendingStatePath, stateContents, { encoding: "utf8" });
|
|
529
|
+
try {
|
|
530
|
+
await rename(pendingStatePath, statePath);
|
|
531
|
+
} catch (error) {
|
|
532
|
+
await rm(pendingStatePath, { force: true });
|
|
533
|
+
throw error;
|
|
534
|
+
}
|
|
535
|
+
await writeFile2(ledgerPath, visibleContents, { encoding: "utf8" });
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// dist/builtin/workflows/builtin/goal-reports.ts
|
|
539
|
+
function formatReviewReport(reviews) {
|
|
540
|
+
if (reviews.length === 0)
|
|
541
|
+
return "No reviewer decisions were recorded.";
|
|
542
|
+
return reviews.map((review) => [
|
|
543
|
+
`### ${review.reviewer}`,
|
|
544
|
+
"",
|
|
545
|
+
`Decision: ${review.decision}`,
|
|
546
|
+
`Artifact: ${review.artifact_path}`,
|
|
547
|
+
`Verification remaining: ${review.verification_remaining}`,
|
|
548
|
+
"Finding alignment warning: beyond_objective and contradicts_objective findings are non-blocking and must not be folded into follow-up objectives without checking them against the acceptance criteria.",
|
|
549
|
+
review.findings.length === 0 ? "Findings: none" : [
|
|
550
|
+
"Findings:",
|
|
551
|
+
...review.findings.map((finding) => `- ${finding.objective_alignment}: ${finding.title}`)
|
|
552
|
+
].join(`
|
|
553
|
+
`),
|
|
554
|
+
review.requirements_traceability.length === 0 ? "Requirements traceability: none" : [
|
|
555
|
+
"Requirements traceability:",
|
|
556
|
+
...review.requirements_traceability.map((entry) => `- ${entry.status}: ${entry.requirement} — ${entry.evidence}`)
|
|
557
|
+
].join(`
|
|
558
|
+
`)
|
|
559
|
+
].join(`
|
|
560
|
+
`)).join(`
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
`);
|
|
565
|
+
}
|
|
566
|
+
function renderFinalReport(ledger, ledgerPath, remainingWork) {
|
|
567
|
+
const receiptLines = ledger.receipts.length > 0 ? ledger.receipts.map((receipt) => `- ${receipt.summary} (artifact: ${receipt.artifact_path})`) : ["- No receipts captured."];
|
|
568
|
+
const lastDecision = ledger.decisions.at(-1);
|
|
569
|
+
return [
|
|
570
|
+
"# Goal Run Final Report",
|
|
571
|
+
"",
|
|
572
|
+
"## Goal ID",
|
|
573
|
+
ledger.goal_id,
|
|
574
|
+
"",
|
|
575
|
+
"## Objective",
|
|
576
|
+
ledger.objective,
|
|
577
|
+
"",
|
|
578
|
+
"## Acceptance criteria",
|
|
579
|
+
ledger.acceptance_criteria,
|
|
580
|
+
"",
|
|
581
|
+
"## Final status",
|
|
582
|
+
ledger.status,
|
|
583
|
+
"",
|
|
584
|
+
"## Ledger artifact",
|
|
585
|
+
ledgerPath,
|
|
586
|
+
"",
|
|
587
|
+
"## Evidence and receipts",
|
|
588
|
+
...receiptLines,
|
|
589
|
+
"",
|
|
590
|
+
"## Final decision",
|
|
591
|
+
lastDecision?.reason ?? "No reducer decision was recorded.",
|
|
592
|
+
"",
|
|
593
|
+
"## Objective-alignment warning",
|
|
594
|
+
"Review findings classified beyond_objective or contradicts_objective are non-blocking and must not be promoted into follow-up objectives without checking them against the acceptance criteria.",
|
|
595
|
+
"",
|
|
596
|
+
"## Remaining work if incomplete",
|
|
597
|
+
ledger.status === "complete" ? "none" : remainingWork
|
|
598
|
+
].join(`
|
|
599
|
+
`);
|
|
600
|
+
}
|
|
601
|
+
|
|
535
602
|
// dist/builtin/workflows/builtin/goal-prompts.ts
|
|
536
603
|
var GOAL_CONTINUATION_REFERENCE = [
|
|
537
604
|
"Continuation and completion:",
|
|
@@ -776,23 +843,6 @@ async function createGoalArtifactDirectory(ctx) {
|
|
|
776
843
|
const artifactDir = await ctx.tool("artifact-root", { workflow: "goal" }, async () => workflowArtifactDirectoryPath(ctx.runId));
|
|
777
844
|
return ensureWorkflowArtifactDirectory(artifactDir);
|
|
778
845
|
}
|
|
779
|
-
function reviewerExecutionFailedDecision(input) {
|
|
780
|
-
const evidence = convergence_escalation_evidence(input.convergence ?? []);
|
|
781
|
-
return {
|
|
782
|
-
turn: input.turn,
|
|
783
|
-
decision: "needs_human",
|
|
784
|
-
reason: [input.reason, ...evidence].join(`
|
|
785
|
-
`),
|
|
786
|
-
complete_votes: input.reviews.filter((review) => review.decision === "complete").length,
|
|
787
|
-
review_quorum: input.reviewQuorum,
|
|
788
|
-
parsed: input.reviews.every((review) => review.parsed),
|
|
789
|
-
approved: false,
|
|
790
|
-
stopReviewLoop: false,
|
|
791
|
-
nextAction: "needs_human",
|
|
792
|
-
finalActionRemaining: false,
|
|
793
|
-
diagnostics: input.reviews.flatMap((review) => review.parse_diagnostics)
|
|
794
|
-
};
|
|
795
|
-
}
|
|
796
846
|
async function runGoalWorkflow(ctx, options) {
|
|
797
847
|
const inputs = ctx.inputs;
|
|
798
848
|
const createPr = options.createPr;
|
|
@@ -812,12 +862,13 @@ async function runGoalWorkflow(ctx, options) {
|
|
|
812
862
|
let latestReviews = [];
|
|
813
863
|
let latestReviewArtifactPaths = [];
|
|
814
864
|
let latestReviewReportPath;
|
|
815
|
-
let terminalRemainingWork;
|
|
816
865
|
let previousOrchestratorSessionFile;
|
|
817
|
-
const recordedTurns = ledger.
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
866
|
+
const recordedTurns = new Set(ledger.decisions.map((decision) => decision.turn));
|
|
867
|
+
const lastRecordedTurn = Math.max(0, ...recordedTurns);
|
|
868
|
+
for (let turn = 1;turn <= maxTurns && (ledger.status === "active" || turn <= lastRecordedTurn); turn += 1) {
|
|
869
|
+
const replayingRecordedTurn = recordedTurns.has(turn);
|
|
870
|
+
const turnAlreadyStarted = ledger.lifecycle.some((event) => event.turn === turn && event.event === "work_turn_started");
|
|
871
|
+
if (!replayingRecordedTurn && !turnAlreadyStarted) {
|
|
821
872
|
appendLifecycleEvent(ledger, "work_turn_started", "Orchestrator started.", turn);
|
|
822
873
|
await writeGoalLedger(ledgerPath, ledger);
|
|
823
874
|
}
|
|
@@ -830,44 +881,14 @@ async function runGoalWorkflow(ctx, options) {
|
|
|
830
881
|
latestReviewArtifactPaths,
|
|
831
882
|
workflowStartCwd
|
|
832
883
|
}) : renderForkedGoalOrchestratorPrompt(ledger, ledgerPath, latestReviewArtifactPaths);
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
...orchestratorForkOptions
|
|
842
|
-
});
|
|
843
|
-
} catch (err) {
|
|
844
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
845
|
-
const baseReason = `Orchestrator failed before producing a receipt: ${message}`;
|
|
846
|
-
terminalRemainingWork = baseReason;
|
|
847
|
-
const reason = [baseReason, ...convergence_escalation_evidence(ledger.convergence ?? [])].join(`
|
|
848
|
-
`);
|
|
849
|
-
latestReviews = [];
|
|
850
|
-
latestReviewArtifactPaths = [];
|
|
851
|
-
latestReviewReportPath = undefined;
|
|
852
|
-
ledger.turns = Math.max(ledger.turns, turn);
|
|
853
|
-
ledger.status = "needs_human";
|
|
854
|
-
ledger.decisions.push({
|
|
855
|
-
turn,
|
|
856
|
-
decision: "needs_human",
|
|
857
|
-
reason,
|
|
858
|
-
complete_votes: 0,
|
|
859
|
-
review_quorum: reviewQuorum,
|
|
860
|
-
parsed: false,
|
|
861
|
-
approved: false,
|
|
862
|
-
stopReviewLoop: false,
|
|
863
|
-
nextAction: "needs_human",
|
|
864
|
-
finalActionRemaining: false,
|
|
865
|
-
diagnostics: [baseReason]
|
|
866
|
-
});
|
|
867
|
-
appendLifecycleEvent(ledger, "status_decided", reason, turn);
|
|
868
|
-
await writeGoalLedger(ledgerPath, ledger);
|
|
869
|
-
break;
|
|
870
|
-
}
|
|
884
|
+
const orchestrator = await ctx.task(`orchestrator-${turn}`, {
|
|
885
|
+
prompt: orchestratorPrompt,
|
|
886
|
+
reads: [ledgerPath, ...latestReviewArtifactPaths],
|
|
887
|
+
output: orchestratorReceiptPath,
|
|
888
|
+
outputMode: "file-only",
|
|
889
|
+
...orchestratorModelConfig,
|
|
890
|
+
...orchestratorForkOptions
|
|
891
|
+
});
|
|
871
892
|
previousOrchestratorSessionFile = orchestrator.sessionFile;
|
|
872
893
|
if (!replayingRecordedTurn) {
|
|
873
894
|
ledger.turns = turn;
|
|
@@ -905,34 +926,23 @@ async function runGoalWorkflow(ctx, options) {
|
|
|
905
926
|
reviewerStep(`risk-reviewer-${turn}`, "Risk Reviewer: owns adversarial boundary checks across transition matrices, configuration precedence, feature-flag coupling, permissive inputs, and over-implementation.", "Probe state transitions, configuration paths and precedence, low-level API behavior across feature flags, and contract-permitted edge inputs. Also hunt for regressions, scope shrinkage, repository convention violations, unsafe assumptions, and blockers that are real repeated impasses rather than ordinary remaining work.")
|
|
906
927
|
];
|
|
907
928
|
let reviewResults;
|
|
908
|
-
let
|
|
909
|
-
let reviewerExecutionDiagnostic;
|
|
929
|
+
let reviewerContractError;
|
|
910
930
|
try {
|
|
911
931
|
reviewResults = await ctx.parallel(reviewerSteps, {
|
|
912
932
|
task: objective,
|
|
913
933
|
failFast: true,
|
|
914
934
|
group: `goal-reviewers-turn-${turn}`
|
|
915
935
|
});
|
|
916
|
-
} catch (
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
reviewResults = [
|
|
921
|
-
{
|
|
922
|
-
name: "reviewer-error",
|
|
923
|
-
stageName: "reviewer-error",
|
|
924
|
-
text: failure
|
|
925
|
-
}
|
|
926
|
-
];
|
|
936
|
+
} catch (error) {
|
|
937
|
+
if (!isWorkflowStructuredOutputContractError(error))
|
|
938
|
+
throw error;
|
|
939
|
+
reviewerContractError = error;
|
|
940
|
+
reviewResults = [{ name: "reviewer-error", stageName: "reviewer-error", text: error.message }];
|
|
927
941
|
}
|
|
928
942
|
latestReviews = await Promise.all(reviewResults.map(async (result) => {
|
|
929
943
|
const reviewerName = result.name ?? result.stageName;
|
|
930
944
|
const normalizedReviewerName = reviewerName.replace(/-\d+$/u, "");
|
|
931
|
-
const parsed =
|
|
932
|
-
decision: reviewerErrorDecision(reviewerExecutionDiagnostic ?? "Reviewer execution failed."),
|
|
933
|
-
parsed: false,
|
|
934
|
-
diagnostics: [reviewerExecutionDiagnostic ?? "Reviewer execution failed."]
|
|
935
|
-
} : parsedReviewDecisionFromResult(result, reviewerName);
|
|
945
|
+
const parsed = reviewerContractError === undefined ? parsedReviewDecisionFromResult(result, reviewerName) : { decision: reviewerErrorDecision(reviewerContractError.message), parsed: false, diagnostics: [reviewerContractError.message] };
|
|
936
946
|
const reviewArtifactPath = join3(artifactDir, `review-${artifactSafeName(normalizedReviewerName)}.json`);
|
|
937
947
|
const record = reviewDecisionToRecord({
|
|
938
948
|
turn,
|
|
@@ -974,7 +984,7 @@ async function runGoalWorkflow(ctx, options) {
|
|
|
974
984
|
const findings = latestReviews.flatMap((review) => review.findings);
|
|
975
985
|
const traceability = latestReviews.flatMap((review) => review.requirements_traceability);
|
|
976
986
|
ledger.convergence ??= [];
|
|
977
|
-
if (!replayingRecordedTurn &&
|
|
987
|
+
if (!replayingRecordedTurn && roundProducedDecisions) {
|
|
978
988
|
ledger.convergence.push(record_convergence({
|
|
979
989
|
unresolvedBlockingCount: reverified.batch.filter((entry) => entry.blocking).length,
|
|
980
990
|
meanFindingConfidence: findings.length === 0 ? null : findings.reduce((total, finding) => total + finding.confidence_score, 0) / findings.length,
|
|
@@ -990,41 +1000,29 @@ async function runGoalWorkflow(ctx, options) {
|
|
|
990
1000
|
if (!replayingRecordedTurn) {
|
|
991
1001
|
appendLifecycleEvent(ledger, "reviews_recorded", `Recorded ${latestReviews.length} reviewer decisions.`, turn);
|
|
992
1002
|
}
|
|
993
|
-
if (reviewerBatchFailed) {
|
|
994
|
-
terminalRemainingWork = collectRemainingWork(latestReviews);
|
|
995
|
-
const reason = `Reviewer execution failed before quorum could be established. Remaining work: ${terminalRemainingWork}`;
|
|
996
|
-
const decision = reviewerExecutionFailedDecision({
|
|
997
|
-
turn,
|
|
998
|
-
reviewQuorum,
|
|
999
|
-
reviews: latestReviews,
|
|
1000
|
-
reason,
|
|
1001
|
-
convergence: ledger.convergence
|
|
1002
|
-
});
|
|
1003
|
-
ledger.decisions.push(decision);
|
|
1004
|
-
ledger.status = "needs_human";
|
|
1005
|
-
appendLifecycleEvent(ledger, "status_decided", decision.reason, turn);
|
|
1006
|
-
await writeGoalLedger(ledgerPath, ledger);
|
|
1007
|
-
break;
|
|
1008
|
-
}
|
|
1009
1003
|
if (replayingRecordedTurn)
|
|
1010
1004
|
continue;
|
|
1011
1005
|
const reducerOutcome = reduceGoalDecision(ledger, latestReviews, {
|
|
1012
1006
|
turn,
|
|
1013
|
-
maxTurns,
|
|
1007
|
+
maxTurns: reviewerContractError === undefined ? maxTurns : turn,
|
|
1014
1008
|
reviewQuorum,
|
|
1015
1009
|
blockerThreshold,
|
|
1016
1010
|
nextActionOnComplete: createPr ? "pull-request" : "finish",
|
|
1017
1011
|
convergence: ledger.convergence
|
|
1018
1012
|
});
|
|
1013
|
+
const decision = reviewerContractError === undefined ? reducerOutcome.decision : {
|
|
1014
|
+
...reducerOutcome.decision,
|
|
1015
|
+
reason: `Reviewer output contract exhausted before quorum could be established. ${reviewerContractError.message}`
|
|
1016
|
+
};
|
|
1019
1017
|
if (reducerOutcome.blockerObservation !== undefined) {
|
|
1020
1018
|
ledger.blockers.push(reducerOutcome.blockerObservation);
|
|
1021
1019
|
}
|
|
1022
|
-
ledger.decisions.push(
|
|
1020
|
+
ledger.decisions.push(decision);
|
|
1023
1021
|
ledger.status = reducerOutcome.status;
|
|
1024
|
-
appendLifecycleEvent(ledger, "status_decided",
|
|
1022
|
+
appendLifecycleEvent(ledger, "status_decided", decision.reason, turn);
|
|
1025
1023
|
await writeGoalLedger(ledgerPath, ledger);
|
|
1026
1024
|
}
|
|
1027
|
-
const remainingWork = ledger.status === "complete" ? "none" :
|
|
1025
|
+
const remainingWork = ledger.status === "complete" ? "none" : collectRemainingWork(latestReviews);
|
|
1028
1026
|
const finalReport = renderFinalReport(ledger, ledgerPath, remainingWork);
|
|
1029
1027
|
const reviewReport = formatReviewReport(latestReviews);
|
|
1030
1028
|
let finalPrReport;
|