@zhushanwen/subagent-core 0.2.0 → 0.5.1
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/README.md +45 -2
- package/agents/analyst.md +60 -0
- package/agents/coder.md +69 -0
- package/agents/debugger.md +66 -0
- package/agents/doc-reviewer.md +49 -0
- package/agents/explorer.md +63 -0
- package/agents/general-purpose.md +32 -0
- package/agents/orchestrator.md +61 -0
- package/agents/planner.md +53 -0
- package/agents/researcher.md +67 -0
- package/agents/reviewer.md +73 -0
- package/dist/chunk-43ONBFZX.js +240 -0
- package/dist/chunk-APZY4IME.js +27 -0
- package/dist/chunk-V3VHZ2VX.js +59 -0
- package/dist/execution/engine/engines/zcode/constants.cjs +62 -9
- package/dist/execution/engine/engines/zcode/constants.d.cts +116 -12
- package/dist/execution/engine/engines/zcode/constants.d.ts +116 -12
- package/dist/execution/engine/engines/zcode/constants.js +39 -7
- package/dist/execution/engine/engines/zcode/reader.d.cts +2 -1
- package/dist/execution/engine/engines/zcode/reader.d.ts +2 -1
- package/dist/execution/engine/engines/zcode/reader.js +4 -234
- package/dist/execution/engine/paths.js +7 -19
- package/dist/index.cjs +18234 -1277
- package/dist/index.d.cts +5646 -673
- package/dist/index.d.ts +5646 -673
- package/dist/index.js +17828 -1277
- package/dist/{types-BxyAidGf.d.cts → types-Dv4QhSJ_.d.cts} +678 -112
- package/dist/{types-BxyAidGf.d.ts → types-Dv4QhSJ_.d.ts} +678 -112
- package/package.json +7 -4
- package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +0 -1
- package/src/__tests__/append-system-prompt-assembly.test.ts +8 -7
- package/src/__tests__/fr4-get-state-handshake.test.ts +2 -2
- package/src/__tests__/m2-append-content-probe.test.ts +0 -1
- package/src/__tests__/manifest-store.test.ts +10 -9
- package/src/__tests__/record-store-cache.test.ts +0 -2
- package/src/__tests__/record-store-index.test.ts +1 -2
- package/src/__tests__/review-fix-loop-script.test.ts +93 -3
- package/src/__tests__/review-fix-loop-utils.test.ts +31 -10
- package/src/__tests__/robustness-low-batch1.test.ts +6 -5
- package/src/__tests__/robustness-medium-batch1.test.ts +2 -2
- package/src/__tests__/robustness-medium-batch2.test.ts +17 -6
- package/src/__tests__/robustness-medium-batch4.test.ts +2 -2
- package/src/__tests__/session-runner.test.ts +1 -1
- package/src/__tests__/smoke.test.ts +9 -2
- package/src/core/__tests__/host-services.test.ts +2 -2
- package/src/core/__tests__/logger.test.ts +1 -1
- package/src/core/error-message.ts +9 -0
- package/src/core/host-services.ts +21 -5
- package/src/core/notify-ports.ts +18 -5
- package/src/execution/__tests__/agent-profile.test.ts +232 -0
- package/src/execution/__tests__/agent-registry.test.ts +370 -0
- package/src/execution/__tests__/agent-result-mapper.test.ts +18 -2
- package/src/execution/__tests__/agents-assembly.test.ts +219 -0
- package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
- package/src/execution/__tests__/chat-engine-routing.test.ts +136 -30
- package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +5 -4
- package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
- package/src/execution/__tests__/create-concurrency-pool.test.ts +194 -0
- package/src/execution/__tests__/delivery-methods.test.ts +77 -62
- package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
- package/src/execution/__tests__/descendant-sweep.test.ts +269 -0
- package/src/execution/__tests__/dialog-queue.test.ts +199 -1
- package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
- package/src/execution/__tests__/epipe-fallback.test.ts +31 -24
- package/src/execution/__tests__/execute-and-await-worktree.test.ts +21 -91
- package/src/execution/__tests__/execute-nesting.test.ts +34 -188
- package/src/execution/__tests__/execution-record.test.ts +217 -60
- package/src/execution/__tests__/execution-runtime-face.test.ts +272 -0
- package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +3 -3
- package/src/execution/__tests__/finalize-record.test.ts +278 -16
- package/src/execution/__tests__/gc-timer.test.ts +57 -2
- package/src/execution/__tests__/get-record-for-action-restart.test.ts +14 -12
- package/src/execution/__tests__/get-state-handshake.test.ts +127 -0
- package/src/execution/__tests__/helpers/mock-extension-api.ts +1 -1
- package/src/execution/__tests__/helpers/session-runner-mocks.ts +113 -0
- package/src/execution/__tests__/helpers/spawn-mock.ts +150 -3
- package/src/execution/__tests__/helpers/subagent-service-mocks.ts +137 -0
- package/src/execution/__tests__/keep-alive-no-progress.test.ts +280 -0
- package/src/execution/__tests__/kill-all-escalation.test.ts +196 -0
- package/src/execution/__tests__/lifecycle-manager-idle-timer-identity.test.ts +117 -0
- package/src/execution/__tests__/lifecycle-manager.test.ts +39 -0
- package/src/execution/__tests__/lifecycle-predicates.test.ts +1 -2
- package/src/execution/__tests__/manifest-parentid.test.ts +4 -4
- package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +99 -0
- package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +113 -0
- package/src/execution/__tests__/model-resolver.test.ts +2 -2
- package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +23 -121
- package/src/execution/__tests__/nested-visibility.test.ts +2 -0
- package/src/execution/__tests__/notify-ledger.test.ts +1249 -0
- package/src/execution/__tests__/output-collector.test.ts +117 -6
- package/src/execution/__tests__/pi-invocation.test.ts +1 -1
- package/src/execution/__tests__/record-store-orphan-revive.test.ts +159 -0
- package/src/execution/__tests__/record-store.test.ts +89 -5
- package/src/execution/__tests__/records-cwd-isolation.test.ts +2 -2
- package/src/execution/__tests__/recursive-visibility-baseline.test.ts +29 -132
- package/src/execution/__tests__/recursive-visibility-env.test.ts +55 -179
- package/src/execution/__tests__/rpc-mode.test.ts +2 -2
- package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +387 -0
- package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +19 -9
- package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +5 -4
- package/src/execution/__tests__/run-spawn-edges.test.ts +418 -26
- package/src/execution/__tests__/run-spawn-integration.test.ts +3 -3
- package/src/execution/__tests__/run-spawn-resume.test.ts +2 -2
- package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +2 -2
- package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +16 -8
- package/src/execution/__tests__/service-kill-escalation.test.ts +91 -0
- package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
- package/src/execution/__tests__/session-file-gc.test.ts +35 -0
- package/src/execution/__tests__/session-pending.test.ts +471 -0
- package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
- package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +110 -0
- package/src/execution/__tests__/session-runner-close-prune.test.ts +181 -0
- package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
- package/src/execution/__tests__/session-runner-epipe.test.ts +4 -3
- package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +227 -0
- package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +290 -0
- package/src/execution/__tests__/session-runner-schema-env.test.ts +7 -5
- package/src/execution/__tests__/settled-watchdog.test.ts +524 -0
- package/src/execution/__tests__/spawn-args.test.ts +11 -10
- package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +26 -23
- package/src/execution/__tests__/spawn-event-adapter.test.ts +1 -1
- package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
- package/src/execution/__tests__/spawned-children.test.ts +155 -11
- package/src/execution/__tests__/start-sync-model-guard.test.ts +4 -4
- package/src/execution/__tests__/stdin-writer.test.ts +6 -4
- package/src/execution/__tests__/stream-sink-retirement.test.ts +6 -6
- package/src/execution/__tests__/subagent-actions-core.test.ts +1017 -0
- package/src/execution/__tests__/subagent-service-message-close.test.ts +99 -35
- package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +174 -0
- package/src/execution/__tests__/subagent-service-notify-gate.test.ts +271 -0
- package/src/execution/__tests__/subagent-service-parent-guard.test.ts +33 -29
- package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +341 -0
- package/src/execution/__tests__/subagent-service.test.ts +37 -30
- package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +88 -12
- package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +75 -0
- package/src/execution/__tests__/subprocess-agent-runner.test.ts +22 -20
- package/src/execution/__tests__/temp-prompt.test.ts +1 -1
- package/src/execution/__tests__/timeout-integration.test.ts +13 -12
- package/src/execution/__tests__/turn-limiter-semantics.test.ts +1 -1
- package/src/execution/__tests__/turn-limiter.test.ts +1 -1
- package/src/execution/__tests__/ui-request-handler-factory.test.ts +107 -7
- package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
- package/src/execution/__tests__/ui-request-queue.test.ts +167 -2
- package/src/execution/__tests__/worktree-git-ops.test.ts +571 -0
- package/src/execution/__tests__/worktree-manager.test.ts +14 -5
- package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +4 -3
- package/src/execution/__tests__/worktree-reconcile-aging.test.ts +204 -0
- package/src/execution/agent-registry.ts +298 -30
- package/src/execution/agent-result-mapper.ts +3 -0
- package/src/execution/agents-assembly.ts +88 -0
- package/src/execution/cold-resurrect.ts +199 -0
- package/src/execution/concurrency-pool.ts +71 -9
- package/src/execution/dialog-queue.ts +101 -3
- package/src/execution/engine/__tests__/common/capability-gate.test.ts +91 -0
- package/src/execution/engine/__tests__/common/data-dir.test.ts +1 -1
- package/src/execution/engine/__tests__/common/journal-wiring.test.ts +84 -0
- package/src/execution/engine/__tests__/common/kill-chain.test.ts +34 -7
- package/src/execution/engine/__tests__/common/persona-router.test.ts +4 -5
- package/src/execution/engine/__tests__/common/pool-manager.test.ts +211 -51
- package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +149 -0
- package/src/execution/engine/__tests__/common/session-view-service.test.ts +499 -0
- package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +56 -99
- package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +88 -15
- package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +33 -7
- package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +1 -1
- package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +75 -54
- package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +128 -0
- package/src/execution/engine/__tests__/engine-discovery.test.ts +15 -3
- package/src/execution/engine/__tests__/model-prompt.test.ts +15 -3
- package/src/execution/engine/__tests__/registry.test.ts +94 -3
- package/src/execution/engine/__tests__/routing.test.ts +115 -6
- package/src/execution/engine/common/capability-gate.ts +92 -0
- package/src/execution/engine/common/journal-wiring.ts +97 -0
- package/src/execution/engine/common/kill-chain.ts +42 -10
- package/src/execution/engine/common/nesting-guard.ts +66 -0
- package/src/execution/engine/common/persona-router.ts +18 -8
- package/src/execution/engine/common/pool-manager.ts +332 -78
- package/src/execution/engine/common/session-view-service.ts +506 -0
- package/src/execution/engine/common/session-view-types.ts +125 -0
- package/src/execution/engine/engine-discovery.ts +12 -16
- package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +174 -28
- package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +257 -0
- package/src/execution/{argv-mirror.ts → engine/engines/pi/argv-mirror.ts} +43 -21
- package/src/execution/{get-state-handshake.ts → engine/engines/pi/get-state-handshake.ts} +86 -11
- package/src/execution/{output-collector.ts → engine/engines/pi/output-collector.ts} +108 -19
- package/src/execution/engine/engines/pi/pi-engine.ts +434 -38
- package/src/execution/{pi-invocation.ts → engine/engines/pi/pi-invocation.ts} +2 -2
- package/src/execution/engine/engines/pi/reader.ts +11 -0
- package/src/execution/engine/engines/pi/registration.ts +4 -2
- package/src/execution/engine/engines/pi/session-runner.ts +2840 -0
- package/src/execution/{spawn-event-adapter.ts → engine/engines/pi/spawn-event-adapter.ts} +75 -34
- package/src/execution/{stdin-writer.ts → engine/engines/pi/stdin-writer.ts} +10 -9
- package/src/execution/{temp-prompt.ts → engine/engines/pi/temp-prompt.ts} +2 -2
- package/src/execution/{turn-limiter.ts → engine/engines/pi/turn-limiter.ts} +1 -1
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +301 -0
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +36 -0
- package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
- package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +473 -0
- package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +7 -210
- package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +6 -110
- package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +247 -0
- package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +451 -0
- package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +792 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +782 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +168 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +210 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +353 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +282 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +372 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +65 -47
- package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
- package/src/execution/engine/engines/zcode/connection.ts +598 -0
- package/src/execution/engine/engines/zcode/constants.ts +147 -14
- package/src/execution/engine/engines/zcode/golden-sample.ts +42 -34
- package/src/execution/engine/engines/zcode/parser.ts +12 -346
- package/src/execution/engine/engines/zcode/preparer.ts +22 -150
- package/src/execution/engine/engines/zcode/session-channel.ts +968 -0
- package/src/execution/engine/engines/zcode/zcode-engine.ts +1023 -250
- package/src/execution/engine/host-task-spec.ts +32 -36
- package/src/execution/engine/model-validation.ts +177 -0
- package/src/execution/engine/port.ts +65 -7
- package/src/execution/engine/registry.ts +53 -0
- package/src/execution/engine/routing.ts +75 -1
- package/src/execution/engine/types.ts +30 -103
- package/src/execution/execution-record.ts +222 -144
- package/src/execution/finalize-record.ts +181 -85
- package/src/execution/idle-gc.ts +28 -0
- package/src/execution/lifecycle-manager.ts +27 -3
- package/src/execution/lifecycle-predicates.ts +1 -1
- package/src/execution/manifest-store.ts +53 -62
- package/src/execution/notifier.ts +10 -10
- package/src/execution/notify-host.ts +212 -0
- package/src/execution/notify-ledger.ts +117 -16
- package/src/execution/record-entry.ts +8 -2
- package/src/execution/record-store.ts +148 -88
- package/src/execution/round-settlement.ts +93 -0
- package/src/execution/session-file-gc.ts +96 -62
- package/src/execution/session-pending.ts +213 -62
- package/src/execution/session-reconstructor.ts +256 -143
- package/src/execution/sessions-index.ts +127 -102
- package/src/execution/settled-watchdog.ts +311 -0
- package/src/execution/subagent-actions-core.ts +686 -0
- package/src/execution/subagent-service.ts +1106 -907
- package/src/execution/subprocess-agent-runner.ts +144 -97
- package/src/execution/types.ts +9 -0
- package/src/execution/ui-request-handler-factory.ts +126 -75
- package/src/execution/ui-request-queue.ts +50 -19
- package/src/execution/worktree-git-ops.ts +397 -0
- package/src/execution/worktree-manager.ts +72 -10
- package/src/execution/worktree-registry.ts +6 -12
- package/src/index.ts +542 -9
- package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +42 -3
- package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +3 -5
- package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
- package/src/orchestration/__tests__/args-meta.test.ts +358 -0
- package/src/orchestration/__tests__/args-validator.test.ts +14 -0
- package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +312 -0
- package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +384 -0
- package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
- package/src/orchestration/__tests__/file-run-store-prune.test.ts +168 -0
- package/src/orchestration/__tests__/file-run-store-throttle.test.ts +168 -0
- package/src/orchestration/__tests__/file-run-store.test.ts +390 -0
- package/src/orchestration/__tests__/helpers/flush-microtasks.ts +13 -0
- package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +34 -0
- package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +357 -0
- package/src/orchestration/__tests__/lifecycle-recover-crashed.test.ts +289 -0
- package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
- package/src/orchestration/__tests__/lifecycle.test.ts +84 -5
- package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
- package/src/orchestration/__tests__/run-snapshot.test.ts +356 -0
- package/src/orchestration/__tests__/script-generate.test.ts +314 -0
- package/src/orchestration/__tests__/script-lint.test.ts +17 -0
- package/src/orchestration/__tests__/test-mocks.ts +2 -0
- package/src/orchestration/__tests__/worker-exit-without-result.test.ts +7 -6
- package/src/orchestration/__tests__/worker-message-pump-finalize-run.test.ts +229 -0
- package/src/orchestration/__tests__/{error-recovery-handlers.test.ts → worker-message-pump-handlers.test.ts} +28 -27
- package/src/orchestration/__tests__/{error-recovery-postmessage-defense.test.ts → worker-message-pump-postmessage-defense.test.ts} +8 -8
- package/src/orchestration/__tests__/{error-recovery-serialize-failed-result.test.ts → worker-message-pump-serialize-failed-result.test.ts} +2 -2
- package/src/orchestration/__tests__/{error-recovery-workflow-call.test.ts → worker-message-pump-workflow-call.test.ts} +1 -1
- package/src/orchestration/__tests__/worker-pending-timeout-abort.test.ts +275 -0
- package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +78 -1
- package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
- package/src/orchestration/__tests__/workflow-files.test.ts +186 -0
- package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
- package/src/orchestration/__tests__/workflow-run-summary.test.ts +119 -0
- package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +124 -0
- package/src/orchestration/agent-opts-resolver.ts +8 -8
- package/src/orchestration/args-meta.ts +198 -0
- package/src/orchestration/args-validator.ts +53 -31
- package/src/orchestration/execute-agent-call.ts +25 -79
- package/src/orchestration/file-run-store.ts +327 -0
- package/src/orchestration/launcher.ts +160 -104
- package/src/orchestration/lifecycle.ts +371 -97
- package/src/orchestration/models/agent-call.ts +7 -7
- package/src/orchestration/models/budget.ts +5 -5
- package/src/orchestration/models/ports.ts +4 -4
- package/src/orchestration/models/run-runtime.ts +15 -15
- package/src/orchestration/models/trace.ts +9 -9
- package/src/orchestration/models/types.ts +111 -22
- package/src/orchestration/models/workflow-run.ts +28 -28
- package/src/orchestration/models/workflow-script.ts +4 -4
- package/src/orchestration/run-snapshot.ts +266 -0
- package/src/orchestration/script-generate.ts +154 -0
- package/src/orchestration/script-lint.ts +123 -90
- package/src/orchestration/worker-handle.ts +10 -10
- package/src/orchestration/worker-host.ts +10 -10
- package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +498 -221
- package/src/orchestration/worker-script-builder.ts +401 -346
- package/src/orchestration/workflow-files.ts +37 -11
- package/src/orchestration/workflow-run-summary.ts +69 -0
- package/src/orchestration/workflow-script-registry-impl.ts +31 -9
- package/src/shared/__tests__/agent-ref.test.ts +209 -2
- package/src/shared/__tests__/atomic-write.test.ts +267 -0
- package/src/shared/__tests__/bounded-serialize.test.ts +236 -0
- package/src/shared/__tests__/injection-render.test.ts +518 -0
- package/src/shared/__tests__/meta-parser.test.ts +151 -0
- package/src/shared/__tests__/resource-discovery-host-roots.test.ts +474 -0
- package/src/shared/__tests__/resource-discovery.test.ts +261 -217
- package/src/shared/agent-ref.ts +143 -2
- package/src/shared/atomic-write.ts +323 -0
- package/src/shared/bounded-serialize.ts +154 -0
- package/src/shared/injection-render.ts +279 -0
- package/src/shared/meta-parser.ts +182 -68
- package/src/shared/model-ref.ts +15 -2
- package/src/shared/resource-discovery.ts +97 -204
- package/src/shared/resource-meta.ts +14 -0
- package/src/shared/schema-jsonify.ts +1 -1
- package/src/shared/xml-injection.ts +9 -9
- package/workflows/README.md +9 -9
- package/workflows/chain.js +4 -2
- package/workflows/map-reduce.js +5 -3
- package/workflows/parallel.js +5 -3
- package/workflows/review-fix-loop-utils.cjs +165 -92
- package/workflows/review-fix-loop-utils.d.cts +287 -0
- package/workflows/review-fix-loop.js +18 -7
- package/workflows/scatter-gather.js +4 -2
- package/dist/chunk-3VOERJPJ.js +0 -22
- package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
- package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
- package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
- package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -580
- package/src/execution/engine/engines/zcode/launcher.ts +0 -161
- package/src/execution/execute-options-mapper.ts +0 -115
- package/src/execution/session-runner.ts +0 -1789
- package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
|
@@ -76,13 +76,13 @@ function checkEntryPoint(source: string): LintFinding[] {
|
|
|
76
76
|
function checkLine(lineText: string, lineNum: number): LintFinding[] {
|
|
77
77
|
const results: LintFinding[] = [];
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
// 跳过注释行
|
|
80
80
|
const trimmed = lineText.trim();
|
|
81
81
|
if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*")) {
|
|
82
82
|
return results;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
// result.output / result.parsedOutput / result.content
|
|
86
86
|
const resultAccessPatterns: Array<{ regex: RegExp; field: string }> = [
|
|
87
87
|
{ regex: /\bresult\s*\.\s*output\b/, field: "output" },
|
|
88
88
|
{ regex: /\bresult\s*\.\s*parsedOutput\b/, field: "parsedOutput" },
|
|
@@ -99,7 +99,7 @@ function checkLine(lineText: string, lineNum: number): LintFinding[] {
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
// 文件传状态(readFileSync of STATE)
|
|
103
103
|
if (/readFileSync\(.*STATE.*\)|readFileSync\(.*state.*\.json/i.test(lineText)) {
|
|
104
104
|
results.push({
|
|
105
105
|
severity: "warning",
|
|
@@ -109,7 +109,7 @@ function checkLine(lineText: string, lineNum: number): LintFinding[] {
|
|
|
109
109
|
});
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
// unlinkSync 清理状态
|
|
113
113
|
if (/unlinkSync.*state/i.test(lineText)) {
|
|
114
114
|
results.push({
|
|
115
115
|
severity: "warning",
|
|
@@ -136,6 +136,36 @@ function stripStringsAndComments(line: string): string {
|
|
|
136
136
|
.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
/** 注释行判定:行注释开头或块注释续行开头(* 与斜杠星号前缀)。 */
|
|
140
|
+
function isCommentLine(trimmed: string): boolean {
|
|
141
|
+
return trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** 括号平衡增量:圆/花/方括号开符计 +1,闭符计 -1,其余 0。 */
|
|
145
|
+
function bracketDepthDelta(text: string): number {
|
|
146
|
+
let delta = 0;
|
|
147
|
+
for (const ch of text) {
|
|
148
|
+
if (ch === "(" || ch === "{" || ch === "[") delta++;
|
|
149
|
+
if (ch === ")" || ch === "}" || ch === "]") delta--;
|
|
150
|
+
}
|
|
151
|
+
return delta;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 检测行内「agent(」字面量对象调用起点;命中返回替换后的调用头圆括号及其后原文
|
|
155
|
+
//(计括号用),未命中 / 非字面量实参返回 undefined。
|
|
156
|
+
//
|
|
157
|
+
// 非字面量实参(agent(callVar) / agent(expr))返回 undefined:description 等选项在调用点
|
|
158
|
+
// 静态不可见,checkAgentDescription 无法验证运行时构造的调用——继续报 warning 即误报
|
|
159
|
+
// (review-fix-loop 的 agent(call) 三连误报根因)。
|
|
160
|
+
// 形如 agent( 换行 { 的多行字面量调用(argTail 为空)保留原追踪行为。
|
|
161
|
+
function matchAgentCallHead(codeLine: string): string | undefined {
|
|
162
|
+
if (!/\bagent\s*\(/.test(codeLine)) return undefined;
|
|
163
|
+
const afterAgent = codeLine.replace(/^.*?\bagent\s*\(/, "(");
|
|
164
|
+
const argTail = afterAgent.trimStart().slice(1).trimStart();
|
|
165
|
+
if (argTail.length > 0 && !argTail.startsWith("{")) return undefined;
|
|
166
|
+
return afterAgent;
|
|
167
|
+
}
|
|
168
|
+
|
|
139
169
|
/**
|
|
140
170
|
* 遍历 source 中所有 agent 调用的行范围,对每个调用执行 callback。
|
|
141
171
|
*
|
|
@@ -150,9 +180,6 @@ function stripStringsAndComments(line: string): string {
|
|
|
150
180
|
* 内嵌的 agent() 调用——它们同样被 `\bagent\s*\(` 匹配)。
|
|
151
181
|
*
|
|
152
182
|
* 匹配前逐行剔除字符串/注释内容(MF-4):字符串字面量里的 "agent(s)" 不再误触发。
|
|
153
|
-
* 非字面量实参(agent(callVar) / agent(expr))跳过不回调:description 等选项在调用点
|
|
154
|
-
* 静态不可见,checkAgentDescription 无法验证运行时构造的调用——继续报 warning 即误报
|
|
155
|
-
* (review-fix-loop 的 agent(call) 三连误报根因)。
|
|
156
183
|
*
|
|
157
184
|
* @param callback (startLine, endLine) 0-based 行号
|
|
158
185
|
*/
|
|
@@ -169,49 +196,35 @@ function forEachAgentCallRange(
|
|
|
169
196
|
const line = lines[i];
|
|
170
197
|
const trimmed = line.trim();
|
|
171
198
|
|
|
172
|
-
|
|
173
|
-
if (
|
|
199
|
+
// 跳过注释
|
|
200
|
+
if (isCommentLine(trimmed)) {
|
|
174
201
|
continue;
|
|
175
202
|
}
|
|
176
203
|
|
|
177
204
|
// 匹配/计括号都用剔除字符串与注释后的行,避免字面量内容干扰
|
|
178
205
|
const codeLine = stripStringsAndComments(line);
|
|
179
206
|
|
|
180
|
-
|
|
181
|
-
|
|
207
|
+
if (!inAgentCall) {
|
|
208
|
+
// 检测 agent 调用开始(非字面量实参 → undefined,跳过本行)
|
|
209
|
+
const afterAgent = matchAgentCallHead(codeLine);
|
|
210
|
+
if (afterAgent === undefined) continue;
|
|
182
211
|
inAgentCall = true;
|
|
183
212
|
depth = 0;
|
|
184
213
|
agentStartLine = i;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
// 非字面量实参(agent(callVar) / agent(expr))→ 跳过(见函数头注释)。
|
|
188
|
-
// 形如 `agent(` 换行 `{` 的多行字面量调用(argTail 为空)保留原追踪行为。
|
|
189
|
-
const argTail = afterAgent.trimStart().slice(1).trimStart();
|
|
190
|
-
if (argTail.length > 0 && !argTail.startsWith("{")) {
|
|
191
|
-
inAgentCall = false;
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
for (const ch of afterAgent) {
|
|
195
|
-
if (ch === "(" || ch === "{" || ch === "[") depth++;
|
|
196
|
-
if (ch === ")" || ch === "}" || ch === "]") depth--;
|
|
197
|
-
}
|
|
214
|
+
// 从 agent( 开始计括号
|
|
215
|
+
depth += bracketDepthDelta(afterAgent);
|
|
198
216
|
if (depth <= 0) {
|
|
199
|
-
|
|
217
|
+
// 单行 agent 调用
|
|
200
218
|
callback(agentStartLine, i);
|
|
201
219
|
inAgentCall = false;
|
|
202
220
|
}
|
|
203
221
|
continue;
|
|
204
222
|
}
|
|
205
223
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
if (depth <= 0) {
|
|
212
|
-
callback(agentStartLine, i);
|
|
213
|
-
inAgentCall = false;
|
|
214
|
-
}
|
|
224
|
+
depth += bracketDepthDelta(codeLine);
|
|
225
|
+
if (depth <= 0) {
|
|
226
|
+
callback(agentStartLine, i);
|
|
227
|
+
inAgentCall = false;
|
|
215
228
|
}
|
|
216
229
|
}
|
|
217
230
|
}
|
|
@@ -247,15 +260,15 @@ function checkAgentCallOptions(
|
|
|
247
260
|
for (let i = startLine; i <= endLine; i++) {
|
|
248
261
|
const line = lines[i];
|
|
249
262
|
|
|
250
|
-
|
|
263
|
+
// 跳过变量声明(const/let/var outputSchema = ...)
|
|
251
264
|
if (/\b(?:const|let|var)\s+outputSchema\b/.test(line)) {
|
|
252
265
|
continue;
|
|
253
266
|
}
|
|
254
267
|
|
|
255
|
-
|
|
268
|
+
// 匹配:outputSchema 作为对象 key(简写或显式)
|
|
256
269
|
if (/\boutputSchema\s*[,\}]/.test(line) || /\boutputSchema\s*:/.test(line)) {
|
|
257
|
-
|
|
258
|
-
|
|
270
|
+
// 排除:outputSchema 作为 value(在另一个 key 的冒号后)
|
|
271
|
+
// e.g. "schema: outputSchema," — outputSchema 前是冒号
|
|
259
272
|
const beforeOutput = line.substring(0, line.indexOf("outputSchema"));
|
|
260
273
|
if (/:\s*$/.test(beforeOutput)) {
|
|
261
274
|
continue; // outputSchema 是 value,不是 key
|
|
@@ -329,7 +342,7 @@ function checkAgentDescription(source: string): LintFinding[] {
|
|
|
329
342
|
// 对象以展开开头(agent({ ...call, ... })):description 来自运行时对象、调用点静态
|
|
330
343
|
// 不可见——无法验证即不报(review-fix-loop 的 agent({ ...call, agent: ... }) 即此形态)。
|
|
331
344
|
if (/\{\s*\.\.\./.test(range)) return;
|
|
332
|
-
|
|
345
|
+
// 匹配 description 或 label 作为对象 key(后跟冒号)
|
|
333
346
|
if (!/\b(description|label)\s*:/.test(range)) {
|
|
334
347
|
findings.push({
|
|
335
348
|
severity: "warning",
|
|
@@ -416,7 +429,7 @@ function isIIFEAwaited(source: string, iifeStart: number): boolean {
|
|
|
416
429
|
function checkBareAsyncIIFE(source: string): LintFinding[] {
|
|
417
430
|
if (!ENTRY_POINT_PATTERNS.some((p) => p.test(source))) return [];
|
|
418
431
|
|
|
419
|
-
|
|
432
|
+
// 用 matchAll 检查所有 IIFE(脚本可能有多个,每个都需独立判断)
|
|
420
433
|
const findings: LintFinding[] = [];
|
|
421
434
|
for (const match of source.matchAll(BARE_ASYNC_IIFE_PATTERN)) {
|
|
422
435
|
const iifeStart = match.index ?? 0;
|
|
@@ -519,13 +532,13 @@ function checkMetaPhases(source: string): LintFinding[] {
|
|
|
519
532
|
function checkPhaseConsistency(source: string): LintFinding[] {
|
|
520
533
|
const findings: LintFinding[] = [];
|
|
521
534
|
|
|
522
|
-
|
|
535
|
+
// 提取 meta.phases 声明的字符串 + 声明所在行号
|
|
523
536
|
const declared = new Map<string, number>();
|
|
524
537
|
const phasesArrayMatch = source.match(/phases\s*:\s*\[[^\]]*\]/);
|
|
525
538
|
if (phasesArrayMatch && phasesArrayMatch.index !== undefined) {
|
|
526
539
|
const inner = phasesArrayMatch[0];
|
|
527
|
-
|
|
528
|
-
|
|
540
|
+
// 对象数组(如 [{title,detail}])由 checkMetaPhases 单独报,这里跳过提取,
|
|
541
|
+
// 避免从对象字段里误抽出字符串作 declared。
|
|
529
542
|
if (!/\[\s*\{/.test(inner)) {
|
|
530
543
|
const phasesLine = source.slice(0, phasesArrayMatch.index).split("\n").length;
|
|
531
544
|
for (const m of inner.matchAll(/['"]([^'"]+)['"]/g)) {
|
|
@@ -534,7 +547,7 @@ function checkPhaseConsistency(source: string): LintFinding[] {
|
|
|
534
547
|
}
|
|
535
548
|
}
|
|
536
549
|
|
|
537
|
-
|
|
550
|
+
// 提取所有 phase() 调用实参 + 首次出现的行号
|
|
538
551
|
const called = new Map<string, number>();
|
|
539
552
|
for (const m of source.matchAll(/\bphase\s*\(\s*['"]([^'"]+)['"]/g)) {
|
|
540
553
|
if (m.index === undefined) continue;
|
|
@@ -542,10 +555,10 @@ function checkPhaseConsistency(source: string): LintFinding[] {
|
|
|
542
555
|
if (!called.has(m[1])) called.set(m[1], lineNum);
|
|
543
556
|
}
|
|
544
557
|
|
|
545
|
-
|
|
558
|
+
// 两者都为空 → 跳过(脚本不使用 phase 机制)
|
|
546
559
|
if (declared.size === 0 && called.size === 0) return [];
|
|
547
560
|
|
|
548
|
-
|
|
561
|
+
// 声明了但从未 phase() 调用
|
|
549
562
|
for (const [name, line] of declared) {
|
|
550
563
|
if (!called.has(name)) {
|
|
551
564
|
findings.push({
|
|
@@ -557,7 +570,7 @@ function checkPhaseConsistency(source: string): LintFinding[] {
|
|
|
557
570
|
}
|
|
558
571
|
}
|
|
559
572
|
|
|
560
|
-
|
|
573
|
+
// 调用了但未声明
|
|
561
574
|
for (const [name, line] of called) {
|
|
562
575
|
if (!declared.has(name)) {
|
|
563
576
|
findings.push({
|
|
@@ -613,6 +626,54 @@ function checkMetaFieldQuality(field: string, value: string): LintFinding[] {
|
|
|
613
626
|
return findings;
|
|
614
627
|
}
|
|
615
628
|
|
|
629
|
+
/** 对象的 keys 全部收集进集合(非对象安全退化:不加任何 key)。 */
|
|
630
|
+
function collectObjectKeys(src: unknown, out: Set<string>): void {
|
|
631
|
+
if (src === null || typeof src !== "object") return;
|
|
632
|
+
for (const k of Object.keys(src as Record<string, unknown>)) out.add(k);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/** patternProperties 的 `^word\\d+$` 形态提取 word 前缀作参数名(其余形态不加)。 */
|
|
636
|
+
function collectPatternPropertyNames(pp: unknown, out: Set<string>): void {
|
|
637
|
+
if (pp === null || typeof pp !== "object") return;
|
|
638
|
+
for (const p of Object.keys(pp as Record<string, unknown>)) {
|
|
639
|
+
const m = p.match(/^\^([a-zA-Z]+)\\d\+\$$/);
|
|
640
|
+
if (m) out.add(m[1] as string);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/** W1 参数名集合 = parameters.properties keys + patternProperties 的 word 前缀。 */
|
|
645
|
+
function collectDeclaredParamNames(parameters: unknown): Set<string> {
|
|
646
|
+
const paramNames = new Set<string>();
|
|
647
|
+
if (parameters === null || typeof parameters !== "object") return paramNames;
|
|
648
|
+
const params = parameters as Record<string, unknown>;
|
|
649
|
+
collectObjectKeys(params.properties, paramNames);
|
|
650
|
+
collectPatternPropertyNames(params.patternProperties, paramNames);
|
|
651
|
+
return paramNames;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/** W1:单字段内已声明参数名的 ':'/'=' 形态检查(文案见 finding)。 */
|
|
655
|
+
function findParamNameFindings(
|
|
656
|
+
field: string,
|
|
657
|
+
value: string,
|
|
658
|
+
paramNames: ReadonlySet<string>,
|
|
659
|
+
): LintFinding[] {
|
|
660
|
+
const findings: LintFinding[] = [];
|
|
661
|
+
// W1:已声明参数名的 ':'/'=' 形态(参数名转义防 RegExp 注入崩溃——exec-review F2;
|
|
662
|
+
// ':' 形态加 \\b 前缀防子串误报(subtask: 不命中 task——exec-review F6))
|
|
663
|
+
for (const name of paramNames) {
|
|
664
|
+
const nameEsc = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
665
|
+
if (new RegExp(`\\b${nameEsc}:\\s`).test(value) || new RegExp(`\\b${nameEsc}=\\S`).test(value)) {
|
|
666
|
+
findings.push({
|
|
667
|
+
severity: "error",
|
|
668
|
+
line: 1,
|
|
669
|
+
message: `meta.${field} 包含已声明参数名 '${name}'('${name}:' / '${name}=' 形态)——参数契约请 read 脚本文件的 @pi-meta parameters 查询,description/when/notFor 只放路由信息`,
|
|
670
|
+
suggestion: `从 meta.${field} 移除 '${name}: ...' / '${name}=...',改在 parameters/usage 中声明`,
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
return findings;
|
|
675
|
+
}
|
|
676
|
+
|
|
616
677
|
/**
|
|
617
678
|
* W1-W3:SSOT lint(m4)——保 §5.1 注入段 description 短单句、不含已声明参数名。
|
|
618
679
|
* 仅对 parseResourceMeta 解析成功的 meta 执行(旧 const meta 格式不检查)。
|
|
@@ -624,44 +685,16 @@ function checkMetaFieldQuality(field: string, value: string): LintFinding[] {
|
|
|
624
685
|
*/
|
|
625
686
|
function checkMetaQuality(meta: { description?: string; when?: string; notFor?: string; parameters?: Record<string, unknown> }): LintFinding[] {
|
|
626
687
|
const findings: LintFinding[] = [];
|
|
627
|
-
const
|
|
628
|
-
|
|
629
|
-
// W1 参数名集合
|
|
630
|
-
const paramNames = new Set<string>();
|
|
631
|
-
if (meta.parameters && typeof meta.parameters === "object") {
|
|
632
|
-
const props = (meta.parameters as Record<string, unknown>).properties;
|
|
633
|
-
if (props !== null && typeof props === "object") {
|
|
634
|
-
for (const k of Object.keys(props as Record<string, unknown>)) paramNames.add(k);
|
|
635
|
-
}
|
|
636
|
-
const pp = (meta.parameters as Record<string, unknown>).patternProperties;
|
|
637
|
-
if (pp !== null && typeof pp === "object") {
|
|
638
|
-
for (const p of Object.keys(pp as Record<string, unknown>)) {
|
|
639
|
-
const m = p.match(/^\^([a-zA-Z]+)\\d\+\$$/);
|
|
640
|
-
if (m) paramNames.add(m[1] as string);
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
}
|
|
688
|
+
const paramNames = collectDeclaredParamNames(meta.parameters);
|
|
644
689
|
|
|
645
690
|
const fields: Array<[string, string]> = [
|
|
646
|
-
["description", description],
|
|
691
|
+
["description", meta.description ?? ""],
|
|
647
692
|
["when", meta.when ?? ""],
|
|
648
693
|
["notFor", meta.notFor ?? ""],
|
|
649
694
|
];
|
|
650
695
|
for (const [field, value] of fields) {
|
|
651
696
|
if (value.length === 0) continue;
|
|
652
|
-
|
|
653
|
-
// ':' 形态加 \\b 前缀防子串误报(subtask: 不命中 task——exec-review F6))
|
|
654
|
-
for (const name of paramNames) {
|
|
655
|
-
const nameEsc = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
656
|
-
if (new RegExp(`\\b${nameEsc}:\\s`).test(value) || new RegExp(`\\b${nameEsc}=\\S`).test(value)) {
|
|
657
|
-
findings.push({
|
|
658
|
-
severity: "error",
|
|
659
|
-
line: 1,
|
|
660
|
-
message: `meta.${field} 包含已声明参数名 '${name}'('${name}:' / '${name}=' 形态)——参数契约请 read 脚本文件的 @pi-meta parameters 查询,description/when/notFor 只放路由信息`,
|
|
661
|
-
suggestion: `从 meta.${field} 移除 '${name}: ...' / '${name}=...',改在 parameters/usage 中声明`,
|
|
662
|
-
});
|
|
663
|
-
}
|
|
664
|
-
}
|
|
697
|
+
findings.push(...findParamNameFindings(field, value, paramNames));
|
|
665
698
|
findings.push(...checkMetaFieldQuality(field, value));
|
|
666
699
|
}
|
|
667
700
|
return findings;
|
|
@@ -724,10 +757,10 @@ export function lintScript(source: string): LintResult {
|
|
|
724
757
|
const lines = source.split("\n");
|
|
725
758
|
const findings: LintFinding[] = [];
|
|
726
759
|
|
|
727
|
-
|
|
760
|
+
// 入口检查(必须有 agent/parallel/pipeline 之一)
|
|
728
761
|
findings.push(...checkEntryPoint(source));
|
|
729
762
|
|
|
730
|
-
|
|
763
|
+
// 逐行检查(result.output、文件传状态等)
|
|
731
764
|
for (let i = 0; i < lines.length; i++) {
|
|
732
765
|
findings.push(...checkLine(lines[i], i + 1));
|
|
733
766
|
}
|
|
@@ -735,23 +768,23 @@ export function lintScript(source: string): LintResult {
|
|
|
735
768
|
// agent 调用上下文检查(outputSchema 作为 key)
|
|
736
769
|
findings.push(...checkAgentCalls(source));
|
|
737
770
|
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
771
|
+
// [HISTORICAL] 顶层未 await 的异步 IIFE + 内部调 agent——子进程被提前 kill。
|
|
772
|
+
// 教训来源:daily-news-impact.js 用 (async function main(){...})();() 包裹整个脚本,
|
|
773
|
+
// worker 外层 IIFE 不等内层 IIFE 就 postMessage("return"),主线程 transition done
|
|
774
|
+
// → release runtime → controller.abort() → spawn 后 2ms SIGKILL 子进程。
|
|
775
|
+
// 诊断耗时 4 轮:先后误判为 model 故障 / 工具缺失 / turn-signal abort / 并发门闩 gate 异常,
|
|
776
|
+
// 最终靠 worker-host → handleReturn → release → abort 的调用栈定位。
|
|
744
777
|
findings.push(...checkBareAsyncIIFE(source));
|
|
745
778
|
|
|
746
|
-
|
|
747
|
-
|
|
779
|
+
// m4 W1-W3:meta 质量(description/when/notFor 短单句 + 不含已声明参数名)。
|
|
780
|
+
// 仅对 IF1 解析成功的 @pi-meta 执行——旧 const meta 格式(D1 无 adapter)不检查。
|
|
748
781
|
const meta = parseResourceMeta(source, "workflow");
|
|
749
782
|
if (meta && meta.kind === "workflow") {
|
|
750
783
|
findings.push(...checkMetaQuality(meta));
|
|
751
784
|
}
|
|
752
785
|
|
|
753
|
-
|
|
754
|
-
|
|
786
|
+
// 显示性检查(warning):agent 缺 description / meta.phases 形式 / phase 一致性。
|
|
787
|
+
// 目的:让 TUI /workflows 视图避免 unnamed agent 与 (unnamed) phase 分组。
|
|
755
788
|
findings.push(...checkAgentDescription(source));
|
|
756
789
|
findings.push(...checkMetaPhases(source));
|
|
757
790
|
findings.push(...checkPhaseConsistency(source));
|
|
@@ -29,7 +29,7 @@ export type WorkerExitHandler = (code: number) => void;
|
|
|
29
29
|
|
|
30
30
|
export class WorkerHandle {
|
|
31
31
|
private readonly worker: Worker;
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
33
|
* 竞态守卫。true = 此 handle 仍是当前活动 handle;false = 已 terminate,
|
|
34
34
|
* 后续事件(已终止 worker 延迟触发的 message/error/exit)必须忽略。
|
|
35
35
|
*
|
|
@@ -42,17 +42,17 @@ export class WorkerHandle {
|
|
|
42
42
|
this.worker = worker;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
/** 此 handle 是否仍是当前活动 handle(terminate 后 false,G-025)。 */
|
|
46
46
|
get isCurrent(): boolean {
|
|
47
47
|
return this.current;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
/** 底层 Worker(WorkerHost/RunRuntime 偶尔需要直接访问,如 ref/href)。 */
|
|
51
51
|
get raw(): Worker {
|
|
52
52
|
return this.worker;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
/**
|
|
56
56
|
* 向 worker 发送消息。terminate 后 no-op(已终止 handle 的 postMessage 无意义)。
|
|
57
57
|
*/
|
|
58
58
|
postMessage(msg: unknown): void {
|
|
@@ -60,7 +60,7 @@ export class WorkerHandle {
|
|
|
60
60
|
this.worker.postMessage(msg);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
/**
|
|
64
64
|
* 终止 worker 线程。幂等——重复调用安全,第二次起 no-op。
|
|
65
65
|
* 置 isCurrent=false 后再 await worker.terminate,确保并发 exit 事件
|
|
66
66
|
* 在 terminate resolve 之前到达时也被守卫拦下。
|
|
@@ -71,13 +71,13 @@ export class WorkerHandle {
|
|
|
71
71
|
try {
|
|
72
72
|
await this.worker.terminate();
|
|
73
73
|
} catch (err) {
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
// terminate 失败不阻断(worker 可能已退出)。current 已 false,安全。
|
|
75
|
+
// 不向上抛——调用方(RunRuntime.release)不应被底层线程错误打断。
|
|
76
76
|
void err;
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
/**
|
|
81
81
|
* 绑定 message 回调。仅当 isCurrent 时触发——已终止 handle 的事件被吞掉。
|
|
82
82
|
* 返回 this 便于链式 onMessage(...).onError(...).onExit(...)。
|
|
83
83
|
*/
|
|
@@ -89,7 +89,7 @@ export class WorkerHandle {
|
|
|
89
89
|
return this;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
/**
|
|
93
93
|
* 绑定 error 回调。仅当 isCurrent 时触发。
|
|
94
94
|
*/
|
|
95
95
|
onError(handler: WorkerErrorHandler): this {
|
|
@@ -100,7 +100,7 @@ export class WorkerHandle {
|
|
|
100
100
|
return this;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
/**
|
|
104
104
|
* 绑定 exit 回调。仅当 isCurrent 时触发——这是 G-025 的关键守卫:
|
|
105
105
|
* terminate(old) → startWorker(new) → old exit 触发时,old handle.current
|
|
106
106
|
* 已为 false,回调 no-op,不会误删 new worker。
|
|
@@ -28,7 +28,7 @@ import { buildWorkerScript } from "./worker-script-builder.ts";
|
|
|
28
28
|
// ── WorkerHostImpl ───────────────────────────────────────────
|
|
29
29
|
|
|
30
30
|
export class WorkerHostImpl implements WorkerHost {
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
32
|
* 启动一个 Worker thread 运行 workflow 脚本。
|
|
33
33
|
*
|
|
34
34
|
* 1. 用 buildWorkerScript(spec.scriptSource) 包装用户脚本(注入 agent/parallel/
|
|
@@ -59,9 +59,9 @@ export class WorkerHostImpl implements WorkerHost {
|
|
|
59
59
|
name: spec.scriptName,
|
|
60
60
|
description: spec.description,
|
|
61
61
|
},
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
// D-12 regression fix (round-2 #1):注入 budget,否则 worker 内 $BUDGET.total 恒为 0。
|
|
63
|
+
// 旧 agent-call-handler.ts 删除时同时丢失了 budget 注入和 budget-update 发送方,
|
|
64
|
+
// 导致依赖 $BUDGET 做动态预算分支的脚本静默得到全 0。
|
|
65
65
|
budget: {
|
|
66
66
|
maxTokens: spec.budgetTokens,
|
|
67
67
|
usedTokens: 0,
|
|
@@ -77,9 +77,9 @@ export class WorkerHostImpl implements WorkerHost {
|
|
|
77
77
|
|
|
78
78
|
const handle = new WorkerHandle(worker);
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
// 绑定事件——WorkerHandle 内部用 isCurrent 守卫,terminate 后回调 no-op(G-025)。
|
|
81
|
+
// handlers 的 onMessage/onError/onExit 都是 async,这里 void 掉 promise(worker 事件
|
|
82
|
+
// 不能 await,且 handler 内部错误由 lifecycle 统一捕获)。
|
|
83
83
|
handle.onMessage((raw) => {
|
|
84
84
|
void handlers.onMessage(raw);
|
|
85
85
|
});
|
|
@@ -87,9 +87,9 @@ export class WorkerHostImpl implements WorkerHost {
|
|
|
87
87
|
void handlers.onError(err);
|
|
88
88
|
});
|
|
89
89
|
handle.onExit((code) => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
// C.3 修复:传 handle 给 onExit,调用方用 handle.isCurrent 做竞态防护。
|
|
91
|
+
// 注意:此时 handle.isCurrent 仍为 true(onExit 回调仅在 isCurrent 时触发,
|
|
92
|
+
// WorkerHandle 的内部守卫已过滤掉 terminate 后的 stale exit)。
|
|
93
93
|
void handlers.onExit(code, handle);
|
|
94
94
|
});
|
|
95
95
|
|