@zhushanwen/subagent-core 0.4.0 → 0.6.0
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/dist/{chunk-4KN4TTG7.js → chunk-43ONBFZX.js} +1 -1
- package/dist/{chunk-X7SZ5HLQ.js → chunk-V3VHZ2VX.js} +20 -27
- package/dist/execution/engine/engines/zcode/constants.cjs +29 -41
- package/dist/execution/engine/engines/zcode/constants.d.cts +65 -53
- package/dist/execution/engine/engines/zcode/constants.d.ts +65 -53
- package/dist/execution/engine/engines/zcode/constants.js +17 -27
- 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 +2 -2
- package/dist/index.cjs +17100 -14082
- package/dist/index.d.cts +5336 -4033
- package/dist/index.d.ts +5336 -4033
- package/dist/index.js +17020 -14055
- package/dist/{types-DpUO16pj.d.cts → types-C3fE3R9x.d.cts} +280 -112
- package/dist/{types-DpUO16pj.d.ts → types-C3fE3R9x.d.ts} +280 -112
- package/dist.bundle/index.cjs +34933 -0
- package/package.json +3 -3
- 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 +4 -2
- package/src/__tests__/review-fix-loop-utils.test.ts +10 -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/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 +4 -4
- 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 +2 -2
- package/src/execution/__tests__/alive-store.test.ts +1 -1
- package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
- package/src/execution/__tests__/chat-engine-routing.test.ts +68 -33
- package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +4 -4
- package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
- package/src/execution/__tests__/collect-budget.test.ts +291 -0
- package/src/execution/__tests__/collect-coordinator-service.test.ts +327 -0
- package/src/execution/__tests__/collect-coordinator.test.ts +371 -0
- package/src/execution/__tests__/collect-mixed-dispatch.test.ts +262 -0
- package/src/execution/__tests__/config-collect-sync.test.ts +120 -0
- package/src/execution/__tests__/config.test.ts +1 -1
- package/src/execution/__tests__/delivery-methods.test.ts +75 -62
- package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
- package/src/execution/__tests__/descendant-sweep.test.ts +6 -6
- package/src/execution/__tests__/dialog-queue.test.ts +2 -2
- package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
- package/src/execution/__tests__/epipe-fallback.test.ts +29 -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 +5 -5
- package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +4 -4
- package/src/execution/__tests__/finalize-record.test.ts +173 -17
- package/src/execution/__tests__/finalized-marker.test.ts +1 -1
- package/src/execution/__tests__/gc-timer.test.ts +56 -3
- package/src/execution/__tests__/get-record-for-action-restart.test.ts +12 -12
- package/src/execution/__tests__/get-state-handshake.test.ts +1 -1
- 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 +50 -148
- package/src/execution/__tests__/kill-all-escalation.test.ts +2 -2
- 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 +1 -1
- package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +1 -1
- 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-batch.test.ts +500 -0
- package/src/execution/__tests__/notify-ledger.test.ts +1000 -18
- package/src/execution/__tests__/output-collector.test.ts +117 -6
- package/src/execution/__tests__/pi-invocation.test.ts +36 -4
- package/src/execution/__tests__/record-entry-collect.test.ts +102 -0
- package/src/execution/__tests__/record-store.test.ts +10 -9
- 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__/relay-env.test.ts +12 -1
- 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 +15 -9
- package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +4 -4
- package/src/execution/__tests__/run-spawn-edges.test.ts +17 -15
- package/src/execution/__tests__/run-spawn-integration.test.ts +2 -2
- 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 +4 -4
- package/src/execution/__tests__/service-kill-escalation.test.ts +7 -5
- package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
- package/src/execution/__tests__/session-file-gc.test.ts +36 -1
- package/src/execution/__tests__/session-pending.test.ts +257 -14
- package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
- package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +1 -1
- package/src/execution/__tests__/session-runner-close-prune.test.ts +2 -2
- package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
- package/src/execution/__tests__/session-runner-epipe.test.ts +3 -3
- package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +5 -4
- 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 +282 -47
- 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 +3 -3
- package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
- package/src/execution/__tests__/spawned-children.test.ts +2 -1
- package/src/execution/__tests__/start-collect-guard.test.ts +255 -0
- package/src/execution/__tests__/start-sync-model-guard.test.ts +5 -5
- 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 +48 -22
- package/src/execution/__tests__/subagent-service-message-close.test.ts +29 -26
- package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +21 -8
- package/src/execution/__tests__/subagent-service-notify-gate.test.ts +27 -22
- package/src/execution/__tests__/subagent-service-parent-guard.test.ts +30 -29
- package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +45 -20
- 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__/sync-collect-recovery.test.ts +1117 -0
- package/src/execution/__tests__/temp-prompt.test.ts +1 -1
- package/src/execution/__tests__/timeout-integration.test.ts +6 -5
- package/src/execution/__tests__/tombstone-store.test.ts +1 -1
- 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 +12 -6
- package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
- package/src/execution/__tests__/ui-request-queue.test.ts +142 -2
- package/src/execution/__tests__/worktree-git-ops.test.ts +1 -1
- 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 +2 -2
- package/src/execution/__tests__/worktree-reconcile.integration.test.ts +1 -1
- package/src/execution/__tests__/worktree-registry.test.ts +1 -1
- package/src/execution/agent-registry.ts +74 -30
- package/src/execution/agent-result-mapper.ts +3 -0
- package/src/execution/cold-resurrect.ts +199 -0
- package/src/execution/collect-coordinator.ts +200 -0
- package/src/execution/config.ts +77 -5
- 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/event-journal.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 +213 -53
- 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 +22 -112
- package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +15 -28
- package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +1 -1
- package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +12 -12
- package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +2 -2
- package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +21 -82
- package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +4 -7
- 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 +4 -2
- 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/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} +1 -1
- 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/{session-runner.ts → engine/engines/pi/session-runner.ts} +617 -412
- 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 +54 -27
- package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
- package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +13 -12
- 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 +20 -8
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +77 -110
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +26 -320
- 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 +48 -148
- package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
- package/src/execution/engine/engines/zcode/connection.ts +24 -11
- package/src/execution/engine/engines/zcode/constants.ts +75 -71
- package/src/execution/engine/engines/zcode/golden-sample.ts +8 -46
- package/src/execution/engine/engines/zcode/parser.ts +12 -346
- package/src/execution/engine/engines/zcode/preparer.ts +12 -143
- package/src/execution/engine/engines/zcode/session-channel.ts +351 -39
- package/src/execution/engine/engines/zcode/zcode-engine.ts +665 -760
- 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 +24 -6
- package/src/execution/engine/routing.ts +75 -1
- package/src/execution/engine/types.ts +30 -103
- package/src/execution/execution-record.ts +229 -144
- package/src/execution/finalize-record.ts +141 -99
- package/src/execution/idle-gc.ts +28 -0
- package/src/execution/lifecycle-predicates.ts +1 -1
- package/src/execution/notifier.ts +234 -25
- package/src/execution/notify-host.ts +232 -0
- package/src/execution/record-entry.ts +16 -0
- package/src/execution/record-store.ts +280 -103
- package/src/execution/round-settlement.ts +93 -0
- package/src/execution/session-file-gc.ts +96 -62
- package/src/execution/session-reconstructor.ts +256 -143
- package/src/execution/sessions-index.ts +117 -47
- package/src/execution/settled-watchdog.ts +264 -52
- package/src/execution/subagent-actions-core.ts +84 -28
- package/src/execution/subagent-service.ts +1225 -964
- package/src/execution/subprocess-agent-runner.ts +144 -97
- package/src/execution/sync-rebuild.ts +87 -0
- package/src/execution/types.ts +72 -0
- package/src/execution/ui-request-handler-factory.ts +102 -74
- package/src/execution/ui-request-queue.ts +50 -19
- package/src/index.ts +442 -316
- package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +1 -1
- package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
- package/src/orchestration/__tests__/args-validator.test.ts +14 -0
- package/src/orchestration/__tests__/config-loader.test.ts +1 -1
- package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +1 -1
- package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +11 -9
- package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
- package/src/orchestration/__tests__/file-run-store-prune.test.ts +1 -1
- package/src/orchestration/__tests__/file-run-store-throttle.test.ts +1 -1
- package/src/orchestration/__tests__/file-run-store.test.ts +7 -6
- package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +2 -2
- package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +1 -1
- package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
- package/src/orchestration/__tests__/lifecycle.test.ts +7 -5
- package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
- package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +1 -1
- package/src/orchestration/__tests__/run-snapshot.test.ts +8 -5
- package/src/orchestration/__tests__/script-generate.test.ts +5 -5
- package/src/orchestration/__tests__/script-lint.test.ts +17 -0
- package/src/orchestration/__tests__/skill-discovery.test.ts +2 -2
- 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} +27 -19
- 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 +1 -1
- package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
- package/src/orchestration/__tests__/workflow-files.test.ts +10 -10
- package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
- package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +1 -1
- package/src/orchestration/agent-opts-resolver.ts +1 -1
- package/src/orchestration/args-validator.ts +53 -31
- package/src/orchestration/execute-agent-call.ts +19 -73
- package/src/orchestration/launcher.ts +128 -81
- package/src/orchestration/lifecycle.ts +43 -45
- package/src/orchestration/models/ports.ts +4 -4
- package/src/orchestration/models/run-runtime.ts +2 -2
- package/src/orchestration/models/trace.ts +1 -1
- package/src/orchestration/models/types.ts +111 -22
- package/src/orchestration/models/workflow-run.ts +1 -1
- package/src/orchestration/script-lint.ts +91 -58
- package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +157 -150
- package/src/shared/__tests__/atomic-write.test.ts +1 -1
- package/src/shared/__tests__/meta-parser.test.ts +151 -0
- package/src/shared/__tests__/resource-discovery-host-roots.test.ts +5 -5
- package/src/shared/__tests__/resource-discovery.test.ts +258 -215
- package/src/shared/atomic-write.ts +12 -9
- package/src/shared/meta-parser.ts +158 -84
- package/src/shared/model-ref.ts +15 -2
- package/src/shared/resource-discovery.ts +9 -183
- package/src/shared/schema-jsonify.ts +1 -1
- package/workflows/review-fix-loop-utils.cjs +151 -89
- package/workflows/review-fix-loop-utils.d.cts +287 -0
- 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__/preparer-appserver.test.ts +0 -387
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -710
- package/src/execution/engine/engines/zcode/appserver-home.ts +0 -442
- package/src/execution/engine/engines/zcode/appserver-probe.ts +0 -141
- package/src/execution/engine/engines/zcode/launcher.ts +0 -161
- package/src/execution/execute-options-mapper.ts +0 -115
- package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import { computeElapsedSeconds, projectOutcome } from "./execution-record.ts";
|
|
18
18
|
import { isResumable } from "./lifecycle-predicates.ts";
|
|
19
|
-
import { SLUG_MAX_LENGTH } from "
|
|
19
|
+
import { SLUG_MAX_LENGTH } from "../orchestration/models/types.ts";
|
|
20
20
|
import type { ModelInfo } from "./model-resolver.ts";
|
|
21
21
|
import type { SubagentService } from "./subagent-service.ts";
|
|
22
22
|
import { displayAgentName } from "../shared/agent-ref.ts";
|
|
@@ -34,6 +34,7 @@ import type {
|
|
|
34
34
|
SubagentRecord,
|
|
35
35
|
} from "./types.ts";
|
|
36
36
|
import { ResurrectDeniedError } from "./types.ts";
|
|
37
|
+
import { COLLECT_SCAN_LIMIT } from "./collect-coordinator.ts";
|
|
37
38
|
|
|
38
39
|
// ============================================================
|
|
39
40
|
// 常量
|
|
@@ -105,6 +106,14 @@ export interface StartHandlerInput {
|
|
|
105
106
|
idleTimeoutMs?: number;
|
|
106
107
|
/** 执行引擎(三层路由第一层:本参数 > agent frontmatter engine > config defaultEngine)。 */
|
|
107
108
|
engine?: string;
|
|
109
|
+
/**
|
|
110
|
+
* 同步收集模式(subagent-sync-collect U1 foundation)。undefined = config
|
|
111
|
+
* collectSync.default(缺省 "async")。schema 层枚举限 "async"|"sync";运行时
|
|
112
|
+
* 宽收 string 与 engine 字段同风格(pi 工具框架把 schema Static 解析为 string;
|
|
113
|
+
* 非法值 ≠ "sync" 按 async 处理,E4 守卫用精确 "sync" 判定)。透传
|
|
114
|
+
* service.execute(ExecuteOptions.collect;record.collectMode 落点归 U2 接线)。
|
|
115
|
+
*/
|
|
116
|
+
collect?: string;
|
|
108
117
|
}
|
|
109
118
|
|
|
110
119
|
/** start 领域对象(宿主 adapter 包成 bg 工具结果)。 */
|
|
@@ -209,7 +218,7 @@ export function endedMessageGuard(service: SubagentService, id: string, original
|
|
|
209
218
|
if (original instanceof ResurrectDeniedError) return original;
|
|
210
219
|
let snap: SubagentRecord | undefined;
|
|
211
220
|
try {
|
|
212
|
-
snap = service.lookupRecordAnyState(id);
|
|
221
|
+
snap = service.queries.lookupRecordAnyState(id);
|
|
213
222
|
} catch {
|
|
214
223
|
snap = undefined;
|
|
215
224
|
}
|
|
@@ -340,6 +349,21 @@ export async function startHandler(
|
|
|
340
349
|
);
|
|
341
350
|
if (slug.length > SLUG_MAX_LENGTH) throw new Error(`slug must be ≤${SLUG_MAX_LENGTH} chars (got ${slug.length}). Shorten to a kebab-case label, e.g. "fix-login", "extract-urls".`);
|
|
342
351
|
|
|
352
|
+
// ── collect 解析(subagent-sync-collect)──
|
|
353
|
+
// resolved = 显式参数 ?? config collectSync.default(U2 偏差#3 接线:经 service
|
|
354
|
+
// 公开访问器读真实 config,内部 DEFAULT 兑底——config 未配/读失败不炸)。
|
|
355
|
+
// E4 守卫放在 resolved 之后:显式 collect:"sync" + conversation 即拒;config 默认
|
|
356
|
+
// sync + conversation 同样被拦(同一守卫,无需改判定)。
|
|
357
|
+
const resolvedCollect = input.collect ?? service.getCollectSyncDefault();
|
|
358
|
+
// E4(设计 §3.1.5):sync 仅支持 one-shot。immediate throw——校验先于 service.execute,
|
|
359
|
+
// 不产生半启动 record(与 skillPath 路径守卫同风格:参数语义校验前置)。
|
|
360
|
+
if (input.conversation === true && resolvedCollect === "sync") {
|
|
361
|
+
throw new Error(
|
|
362
|
+
'collect:"sync" only supports one-shot subagents — it cannot be combined with conversation:true. ' +
|
|
363
|
+
'Remove either conversation or collect (use collect:"async", or omit it, for conversational subagents).',
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
343
367
|
const handle = await service.execute({
|
|
344
368
|
task,
|
|
345
369
|
slug,
|
|
@@ -357,11 +381,31 @@ export async function startHandler(
|
|
|
357
381
|
conversation: input.conversation,
|
|
358
382
|
idleTimeoutMs: input.idleTimeoutMs,
|
|
359
383
|
engine: input.engine,
|
|
384
|
+
// B1(code-simplify 审查发现的行为缺口):config collectSync.default=sync 且调用方
|
|
385
|
+
// 省略 collect 时,record 本体也要落 sync(设计 §3.1.3「缺省 = config 默认」作用于
|
|
386
|
+
// record,而非仅回显)——createRecordForMode 只认 opts.collect==="sync",原样透传
|
|
387
|
+
// input.collect 会让 record 走 async 逐条通知而响应声称已入批。仅 sync 落值:
|
|
388
|
+
// async/缺省路径传 undefined 语义(旧 record 零迁移)字节不变。
|
|
389
|
+
collect: resolvedCollect === "sync" ? "sync" : input.collect,
|
|
360
390
|
ctxModel,
|
|
361
391
|
signal,
|
|
362
392
|
// background detached 运行,完成由 notify 驱动新 turn。
|
|
363
393
|
});
|
|
364
394
|
|
|
395
|
+
const response: BgResponse = {
|
|
396
|
+
status: "running",
|
|
397
|
+
mode: "background",
|
|
398
|
+
message: BG_MESSAGE,
|
|
399
|
+
notifyContract: NOTIFY_CONTRACT,
|
|
400
|
+
};
|
|
401
|
+
// 同步收集登记回显段(设计 §3.1.1):仅 resolved 为 sync 时附段——async 响应
|
|
402
|
+
// 字节零变化(G3)。pendingSyncCount = 未闭合批 sync 成员总数(含本条,跨轮续累)。
|
|
403
|
+
// 本条 record 已由 createRecordForMode 落 collectMode(U2 偏差#4 接线),
|
|
404
|
+
// 枚举天然含本条,无需补偿。
|
|
405
|
+
if (resolvedCollect === "sync") {
|
|
406
|
+
response.collect = { mode: "sync", pendingSyncCount: countPendingSyncRecords(service) };
|
|
407
|
+
}
|
|
408
|
+
|
|
365
409
|
return {
|
|
366
410
|
kind: "bg",
|
|
367
411
|
subagentId: handle.subagentId,
|
|
@@ -369,15 +413,27 @@ export async function startHandler(
|
|
|
369
413
|
slug: handle.details.slug,
|
|
370
414
|
// registry 全等回显:record.model 由 resolved(裁决放行条目)拼接,原样透出。
|
|
371
415
|
model: handle.details.model,
|
|
372
|
-
response
|
|
373
|
-
status: "running",
|
|
374
|
-
mode: "background",
|
|
375
|
-
message: BG_MESSAGE,
|
|
376
|
-
notifyContract: NOTIFY_CONTRACT,
|
|
377
|
-
},
|
|
416
|
+
response,
|
|
378
417
|
};
|
|
379
418
|
}
|
|
380
419
|
|
|
420
|
+
/**
|
|
421
|
+
* 当前未闭合批的 sync 成员计数(pendingSyncCount 口径,设计 §3.1.3):本进程全部
|
|
422
|
+
* record(含已终态未 flush 的缓冲成员,故 statusFilter="all")中 collectMode="sync"
|
|
423
|
+
* 且无 batchFinalized 标记的数量。含调用方刚启动的本条(record 已带 collectMode 入
|
|
424
|
+
* 枚举——U2 偏差#4 接线)。
|
|
425
|
+
*
|
|
426
|
+
* 扫描上限与 service 冷路径全扫兑底同量级;常量用本 feature 已导出的
|
|
427
|
+
* COLLECT_SCAN_LIMIT(collect 域扫描上限单点定义,S4 code-simplify)。
|
|
428
|
+
*/
|
|
429
|
+
function countPendingSyncRecords(service: SubagentService): number {
|
|
430
|
+
let count = 0;
|
|
431
|
+
for (const r of service.queries.collectRecords(COLLECT_SCAN_LIMIT, "all")) {
|
|
432
|
+
if (r.collectMode === "sync" && r.batchFinalized !== true) count += 1;
|
|
433
|
+
}
|
|
434
|
+
return count;
|
|
435
|
+
}
|
|
436
|
+
|
|
381
437
|
// ============================================================
|
|
382
438
|
// list handler
|
|
383
439
|
// ============================================================
|
|
@@ -400,12 +456,12 @@ export function listHandler(
|
|
|
400
456
|
// collectRecords 是 service 核心能力:statusFilter 决定 running-only 还是全部。
|
|
401
457
|
// 防截断(先多取再过滤)已下沉到 store 层——这里直接传 limit + filter。
|
|
402
458
|
const filter = includeFinished ? "all" : "running";
|
|
403
|
-
const all = service.collectRecords(limit, filter);
|
|
459
|
+
const all = service.queries.collectRecords(limit, filter);
|
|
404
460
|
// collectRecords 磁盘源是 light(无 totalTokens/model 等):SubagentListItem 对
|
|
405
461
|
// LLM 消费方暴露 totalTokens/model,逐项 getFullRecord 补全(per-file 缓存,仅首次
|
|
406
462
|
// 全量解析;显式 tool 调用非渲染热路径,成本可接受)。
|
|
407
463
|
const items: SubagentListItem[] = all.map((r) =>
|
|
408
|
-
recordToListItem(service.getFullRecord(r.id) ?? r),
|
|
464
|
+
recordToListItem(service.queries.getFullRecord(r.id) ?? r),
|
|
409
465
|
);
|
|
410
466
|
const running = items.filter((i) => i.status === "running").length;
|
|
411
467
|
|
|
@@ -424,13 +480,13 @@ export async function cancelHandler(
|
|
|
424
480
|
if (!id) throw new Error("cancelParam.subagentId is required for action:'cancel'");
|
|
425
481
|
|
|
426
482
|
// step 1: id 不存在(findRecord 只查内存 running record,不从 session.jsonl 重建)
|
|
427
|
-
const rec = service.findRecord(id);
|
|
483
|
+
const rec = service.queries.findRecord(id);
|
|
428
484
|
if (!rec) {
|
|
429
485
|
// 全树可见后,list/completion 可能列出其他进程(父/兄弟)的 running record
|
|
430
486
|
//(collectRecords 扫共享 sessionsDir 按 rootSessionId 过滤,跨进程互相可见),而 cancel
|
|
431
487
|
// 只作用于本进程内存 record。区分两种失败,避免「may have finished」误导(该 record 正
|
|
432
488
|
// 被列出且未 finished,只是不属于本进程内存)。仅文案区分,不改 cancel 作用域。
|
|
433
|
-
const treeRec = service.collectRecords(DEFAULT_LIST_LIMIT, "all").find((r) => r.id === id);
|
|
489
|
+
const treeRec = service.queries.collectRecords(DEFAULT_LIST_LIMIT, "all").find((r) => r.id === id);
|
|
434
490
|
if (treeRec && treeRec.status === "running") {
|
|
435
491
|
throw new Error(
|
|
436
492
|
`Subagent record "${id}" is running but owned by another process in the tree ` +
|
|
@@ -448,8 +504,8 @@ export async function cancelHandler(
|
|
|
448
504
|
// 走 close 行为路径(idle 终态化 done;running 立即 SIGTERM cancelled),
|
|
449
505
|
// 返回 cancel 响应(向后兼容 cancel action 的返回类型)。非 chatMode 保持现有 cancel 行为。
|
|
450
506
|
if (rec.chatMode) {
|
|
451
|
-
const chatRecord = service.getRecordForAction(id);
|
|
452
|
-
await service.closeSubagent(chatRecord, true);
|
|
507
|
+
const chatRecord = service.chatActions.getRecordForAction(id);
|
|
508
|
+
await service.chatActions.closeSubagent(chatRecord, true);
|
|
453
509
|
return { subagentId: id, response: { cancelled: true } };
|
|
454
510
|
}
|
|
455
511
|
// step 3: service.cancel boolean(list-view 契约不变);false = 已终态(CAS 抢锁失败)。
|
|
@@ -459,7 +515,7 @@ export async function cancelHandler(
|
|
|
459
515
|
// CAS 失败 = record 在 cancel 期间被 detached 路径 finalize(done/failed)。
|
|
460
516
|
// re-query 查当前真实状态。终态 record 被 archive 立即移出内存,
|
|
461
517
|
// 诚实报告 "unknown (evicted from memory)" 而非回落到可能过期的 rec.status。
|
|
462
|
-
const now = service.findRecord(id);
|
|
518
|
+
const now = service.queries.findRecord(id);
|
|
463
519
|
const statusDesc = now ? now.status : "unknown (evicted from memory)";
|
|
464
520
|
throw new Error(`Subagent ${id} could not be cancelled (it likely just finished; status: ${statusDesc})`);
|
|
465
521
|
}
|
|
@@ -474,9 +530,9 @@ export async function cancelHandler(
|
|
|
474
530
|
* message action handler:向对话模式 subagent 续聊/插入消息。
|
|
475
531
|
*
|
|
476
532
|
* 状态 × interrupt 自动映射(agent 只表达意图):
|
|
477
|
-
* running →
|
|
533
|
+
* running → deliverChatMessage 热路径(进程活:prompt + streamingBehavior,interrupt=true
|
|
478
534
|
* 抢占 / false 排队)
|
|
479
|
-
* 进程死 →
|
|
535
|
+
* 进程死 → deliverChatMessage 冷路径(resumeRound 重开 session + prompt,interrupt 自动
|
|
480
536
|
* 退化,agent 无感)
|
|
481
537
|
* 终态 → throw ended(正常路径不命中——终态 record 已 archive,getRecordForAction 先 throw not found)
|
|
482
538
|
*
|
|
@@ -503,13 +559,13 @@ export async function messageHandler(
|
|
|
503
559
|
// 升级文案——close/cancel 维持原语义(它们不需要恢复通道)。
|
|
504
560
|
let record: ExecutionRecord;
|
|
505
561
|
try {
|
|
506
|
-
record = service.getRecordForAction(id, { allowReconnect: true });
|
|
562
|
+
record = service.chatActions.getRecordForAction(id, { allowReconnect: true });
|
|
507
563
|
} catch (err) {
|
|
508
564
|
throw endedMessageGuard(service, id, err);
|
|
509
565
|
}
|
|
510
566
|
|
|
511
567
|
// one-shot upgrade:非 chatMode 的 active record(running/idle)收到 message 时
|
|
512
|
-
// 自动升级为 chatMode,后续走
|
|
568
|
+
// 自动升级为 chatMode,后续走 deliverChatMessage 统一投递路径(热路径或冷路径 resume)。
|
|
513
569
|
// closed/cancelled 终态 record 不可 upgrade(getRecordForAction 已抛 not found)。
|
|
514
570
|
// chatMode 是 ExecutionRecord 的 readonly 字段,用 Mutable<T> 显式断言绕过 readonly 约束(upgrade 语义)。
|
|
515
571
|
// Object.assign 隐式绕过 readonly 不可追踪,改为单字段显式赋值。
|
|
@@ -526,7 +582,7 @@ export async function messageHandler(
|
|
|
526
582
|
// 不按 record.status(进程长驻,idle 态进程仍活,续聊走热路径 prompt 而非重开 session)。
|
|
527
583
|
// upgrade 后 record.chatMode 已为 true,统一进此分支。
|
|
528
584
|
if (record.chatMode) {
|
|
529
|
-
await service.
|
|
585
|
+
await service.chatActions.deliverChatMessage(record, text, interrupt);
|
|
530
586
|
} else {
|
|
531
587
|
// 终态(closed/cancelled):防御性兜底(终态 record 已 archive,正常走 not found)
|
|
532
588
|
throw new Error(
|
|
@@ -550,7 +606,7 @@ export async function messageHandler(
|
|
|
550
606
|
* 有活进程在跑轮 → 置 closeAfterRound,轮完成时终态化——返回 {closed:true} 即承诺轮结束后资源已释放
|
|
551
607
|
* force:true = 立即终止——running 立即 SIGTERM(cancelBackground 显式 kill)+ closed+cancelled
|
|
552
608
|
*
|
|
553
|
-
* 行为分流委托
|
|
609
|
+
* 行为分流委托 chatActions.closeSubagent(归属守卫由 chatActions.getRecordForAction 把关)。
|
|
554
610
|
* 已终态 record 由 getRecordForAction throw not found(「已结束的不能再操作」语义)。
|
|
555
611
|
*/
|
|
556
612
|
export async function closeHandler(
|
|
@@ -561,9 +617,9 @@ export async function closeHandler(
|
|
|
561
617
|
if (!id) throw new Error("closeParam.subagentId is required for action:'close'");
|
|
562
618
|
const force = input?.force === true;
|
|
563
619
|
|
|
564
|
-
// 归属守卫(决策 3)+ 行为分流(
|
|
565
|
-
const record = service.getRecordForAction(id);
|
|
566
|
-
await service.closeSubagent(record, force);
|
|
620
|
+
// 归属守卫(决策 3)+ 行为分流(chatActions.closeSubagent)
|
|
621
|
+
const record = service.chatActions.getRecordForAction(id);
|
|
622
|
+
await service.chatActions.closeSubagent(record, force);
|
|
567
623
|
|
|
568
624
|
return { kind: "close", subagentId: id, response: { closed: true } };
|
|
569
625
|
}
|
|
@@ -621,7 +677,7 @@ export async function forkFromHandler(
|
|
|
621
677
|
* (守卫 6 已保证 sessionFile 非空,返回类型随之收窄)。 */
|
|
622
678
|
function assertAndLookupForkFromSource(service: SubagentService, id: string): SubagentRecord & { sessionFile: string } {
|
|
623
679
|
// 守卫 1:本进程内存 running —— 直接 message 即可,fork-from 会双写其 session 文件。
|
|
624
|
-
if (service.findRecord(id)) {
|
|
680
|
+
if (service.queries.findRecord(id)) {
|
|
625
681
|
throw new Error(
|
|
626
682
|
`subagent ${id} is still active in this process — use action:'message' to continue it directly. ` +
|
|
627
683
|
`If you want a parallel branch from its history, close it first (action:'close'), then fork-from.`,
|
|
@@ -629,7 +685,7 @@ function assertAndLookupForkFromSource(service: SubagentService, id: string): Su
|
|
|
629
685
|
}
|
|
630
686
|
|
|
631
687
|
// 守卫 2:全态查找(内存 archived + 磁盘重建)。
|
|
632
|
-
const source = service.lookupRecordAnyState(id);
|
|
688
|
+
const source = service.queries.lookupRecordAnyState(id);
|
|
633
689
|
if (!source) {
|
|
634
690
|
throw new Error(
|
|
635
691
|
`No subagent record with id "${id}". It may never have existed or been garbage-collected — ` +
|
|
@@ -652,7 +708,7 @@ function assertAndLookupForkFromSource(service: SubagentService, id: string): Su
|
|
|
652
708
|
|
|
653
709
|
// 守卫 4:主动告别(cancelled tombstone / user-close 正式关闭)——close 语义无旁路:
|
|
654
710
|
// fork-from 与 message 一致拒绝(guard 一致性规格),文案升级为统一「主动关闭」形态
|
|
655
|
-
//(含 closedReason 显式列入),与
|
|
711
|
+
//(含 closedReason 显式列入),与 deliverChatMessage 的同类分支同语系不同落地(此处强调不可 branch)。
|
|
656
712
|
if (source.status === "closed" && (source.closedReason === "cancelled" || source.closedReason === "user-close")) {
|
|
657
713
|
throw new Error(
|
|
658
714
|
`subagent ${id} was deliberately closed by user (closedReason: ${source.closedReason}) — ` +
|
|
@@ -662,7 +718,7 @@ function assertAndLookupForkFromSource(service: SubagentService, id: string): Su
|
|
|
662
718
|
}
|
|
663
719
|
|
|
664
720
|
// 守卫 5:worktree 记录 —— WorktreeHandle 不可序列化,checkout 已被 reaper/cleanup
|
|
665
|
-
// 回收;fork 子进程若复用旧路径会回落主 repo(破坏文件隔离)。与
|
|
721
|
+
// 回收;fork 子进程若复用旧路径会回落主 repo(破坏文件隔离)。与 deliverChatMessage 的
|
|
666
722
|
// hadWorktree 守卫同一判据同一理由。
|
|
667
723
|
if (source.worktree === true) {
|
|
668
724
|
throw new Error(
|