@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
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
// zcode-engine-appserver.test.ts ——
|
|
2
|
-
// fake-appserver.mjs 子进程(scenario 注入),绝不 spawn 真
|
|
3
|
-
//
|
|
1
|
+
// zcode-engine-appserver.test.ts —— 引擎接线测试(2026-09 起单一 app-server 形态):
|
|
2
|
+
// 全部跑 __fixtures__/fake-appserver.mjs 子进程(scenario 注入),绝不 spawn 真
|
|
3
|
+
// zcode.cjs。覆盖:事件时序前移(text_delta 流式 + 终态 message_end/turn_end +
|
|
4
4
|
// resolve 严格晚于末事件——不变量 2)/ usage 映射(与 parser.mapZcodeUsage 同源)/
|
|
5
|
-
// per-session model 透传 /
|
|
6
|
-
//
|
|
7
|
-
// onPoolResolved 时点(prepare
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// 后 run 重建——不变量 4)/
|
|
11
|
-
// -32603 Model config missing 错误归类 /
|
|
12
|
-
//
|
|
5
|
+
// per-session model 透传 / 共享宿主 HOME(poolKey 恒 'shared'、HOME 正向透传、
|
|
6
|
+
// argv=app-server --cwd engineDataDir、无池 config/lockfile/pidfile)/
|
|
7
|
+
// onHandleReady 回调时点(create 应答后)与 onPoolResolved 时点(prepare 期,
|
|
8
|
+
// 先于首事件)/ abort 链 D3(stop 帧先发 → stop 优雅生效不杀进程 / stop 无效
|
|
9
|
+
// grace 耗尽 → killChain 连坐)/ 连接复用(跨任务 boot 1)/ dispose(幂等 /
|
|
10
|
+
// close 帧先于 SIGTERM / dispose 后 run 重建——不变量 4)/ 多会话并发不串线
|
|
11
|
+
// (RA3 地基,FAKE_STAMP_SESSION)/ -32603 Model config missing 错误归类 /
|
|
12
|
+
// capabilities 断言(eventGranularity 翻转无下游破坏的生产零消费方守卫)。
|
|
13
13
|
|
|
14
14
|
import * as fs from "node:fs";
|
|
15
15
|
import * as os from "node:os";
|
|
@@ -19,18 +19,24 @@ import { fileURLToPath } from "node:url";
|
|
|
19
19
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
20
20
|
|
|
21
21
|
import type { EngineRunResult, RunContext } from "../../../port.ts";
|
|
22
|
-
import type { AgentEvent
|
|
22
|
+
import type { AgentEvent } from "../../../types.ts";
|
|
23
|
+
import type { AgentCallOpts } from "../../../../../orchestration/models/types.ts";
|
|
23
24
|
import { getLogger } from "../../../../../core/logger.ts";
|
|
24
|
-
import {
|
|
25
|
-
import { ZCODE_APPSERVER_POOL_KEY, ZCODE_POOL_CONFIG_SUFFIX } from "../constants.ts";
|
|
25
|
+
import { ZCODE_SHARED_POOL_KEY } from "../constants.ts";
|
|
26
26
|
import { ZCODE_APPSERVER_GOLDEN } from "../golden-sample.ts";
|
|
27
27
|
import { AppServerConnection } from "../connection.ts";
|
|
28
28
|
import { SessionChannel } from "../session-channel.ts";
|
|
29
|
-
import { ZcodeEngine,
|
|
29
|
+
import { ZcodeEngine, type ZcodeEngineDeps } from "../zcode-engine.ts";
|
|
30
30
|
|
|
31
31
|
const FAKE_CLI = fileURLToPath(new URL("./__fixtures__/fake-appserver.mjs", import.meta.url));
|
|
32
32
|
const PROVIDER = "test-provider";
|
|
33
33
|
|
|
34
|
+
/** 宿主 zcode 会话 db 期望值的独立展开(①级读取钥匙)——刻意不 import 实现的
|
|
35
|
+
* hostZcodeDbPath(自指断言:实现改错时断言仍绿),路径知识独立于实现复述。 */
|
|
36
|
+
function expectedHostDbPath(): string {
|
|
37
|
+
return path.resolve(os.homedir(), ".zcode", "cli", "db", "db.sqlite");
|
|
38
|
+
}
|
|
39
|
+
|
|
34
40
|
/** 与 zcode-engine.ts 同一 facade 单例引用(spy 它的方法即拦截引擎的 warn 出声)。 */
|
|
35
41
|
const subagentsLogger = getLogger("subagents");
|
|
36
42
|
|
|
@@ -74,7 +80,7 @@ beforeEach(() => {
|
|
|
74
80
|
|
|
75
81
|
afterEach(async () => {
|
|
76
82
|
for (const engine of engines.splice(0)) await engine.dispose().catch(() => undefined);
|
|
77
|
-
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
83
|
+
fs.rmSync(tmpRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 20 });
|
|
78
84
|
});
|
|
79
85
|
|
|
80
86
|
interface ScenarioOverrides {
|
|
@@ -122,9 +128,7 @@ function makeEngine(overrides: ScenarioOverrides = {}): EngineHandle_ {
|
|
|
122
128
|
sources: { v2ConfigPath: v2Path },
|
|
123
129
|
processEnv: {
|
|
124
130
|
PATH: process.env.PATH ?? "",
|
|
125
|
-
|
|
126
|
-
// 探针门控/降级链见 zcode-engine-degrade.test.ts
|
|
127
|
-
XYZ_ZCODE_MODE: "appserver",
|
|
131
|
+
HOME: "/fake-host-home",
|
|
128
132
|
FAKE_STATE_FILE: stateFile,
|
|
129
133
|
FAKE_SESSION_SCENARIO: scenarioFile,
|
|
130
134
|
...(overrides.stampSession === true ? { FAKE_STAMP_SESSION: "1" } : {}),
|
|
@@ -185,45 +189,14 @@ function bootEnv(stateFile: string): Record<string, unknown> {
|
|
|
185
189
|
return isRecord(env) ? env : {};
|
|
186
190
|
}
|
|
187
191
|
|
|
188
|
-
function makeTask(overrides?: Partial<
|
|
189
|
-
return {
|
|
192
|
+
function makeTask(overrides?: Partial<AgentCallOpts>): AgentCallOpts {
|
|
193
|
+
return { prompt: "做点什么", description: "s", model: `${PROVIDER}/m1`, ...overrides };
|
|
190
194
|
}
|
|
191
195
|
|
|
192
196
|
function makeCtx(overrides?: Partial<RunContext>): RunContext {
|
|
193
197
|
return { taskId: "sa-appserver", poolKey: "", ...overrides };
|
|
194
198
|
}
|
|
195
199
|
|
|
196
|
-
// ============================================================
|
|
197
|
-
// 模式分派骨架(D2——降级链归 R5,此处只验分派点)
|
|
198
|
-
// ============================================================
|
|
199
|
-
|
|
200
|
-
describe("模式分派(XYZ_ZCODE_MODE)", () => {
|
|
201
|
-
it("pinnedZcodeMode 三态:定向值原样;缺省/未知值 undefined(undefined → 缺省 appserver 路径的探针门控 run 分派由 degrade 套件覆盖)", () => {
|
|
202
|
-
expect(pinnedZcodeMode({ XYZ_ZCODE_MODE: "spawn" })).toBe("spawn");
|
|
203
|
-
expect(pinnedZcodeMode({ XYZ_ZCODE_MODE: "appserver" })).toBe("appserver");
|
|
204
|
-
expect(pinnedZcodeMode({})).toBeUndefined();
|
|
205
|
-
expect(pinnedZcodeMode({ XYZ_ZCODE_MODE: "garbage" })).toBeUndefined();
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it("spawn 定向:launch 通道走原 spawn 路径(不 spawn app-server——boot 计数 0)", async () => {
|
|
209
|
-
const fakeLaunch = vi.fn(() => {
|
|
210
|
-
throw new Error("spawn 定向下不应走 app-server 连接;launch fake 仅供模式断言");
|
|
211
|
-
});
|
|
212
|
-
// spawn 定向 + 无 launch fake 会真 spawn zcode.cjs(缺省路径不存在)——用
|
|
213
|
-
// launch fake 拦截即可证明走了 spawn 分支
|
|
214
|
-
const { engine } = { engine: new ZcodeEngine({
|
|
215
|
-
engineDataDir: () => dataDir,
|
|
216
|
-
cliPath: FAKE_CLI,
|
|
217
|
-
sources: { v2ConfigPath: v2Path },
|
|
218
|
-
processEnv: { PATH: process.env.PATH ?? "", XYZ_ZCODE_MODE: "spawn" },
|
|
219
|
-
launch: fakeLaunch as unknown as ZcodeEngineDeps["launch"],
|
|
220
|
-
}) };
|
|
221
|
-
engines.push(engine);
|
|
222
|
-
await expect(engine.run(makeTask(), makeCtx())).rejects.toThrow(/无法启动 zcode CLI/);
|
|
223
|
-
expect(fakeLaunch).toHaveBeenCalledTimes(1);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
200
|
// ============================================================
|
|
228
201
|
// 事件时序前移 + usage 映射 + 句柄回调时点(不变量 2/3)
|
|
229
202
|
// ============================================================
|
|
@@ -269,9 +242,11 @@ describe("事件流与回调时点(缺省 appserver 路径)", () => {
|
|
|
269
242
|
expect(outcome.usage).toEqual({ input: 12599, output: 17, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 1 });
|
|
270
243
|
expect(outcome.exitCode).toBe(0);
|
|
271
244
|
|
|
272
|
-
// handle 锚定:poolKey
|
|
273
|
-
|
|
274
|
-
expect(handle.data.
|
|
245
|
+
// handle 锚定:poolKey 恒 'shared',sessionRef.dbPath = 宿主 HOME 绝对路径
|
|
246
|
+
// (期望值独立展开,见 expectedHostDbPath 注释——不调实现函数)
|
|
247
|
+
expect(handle.data.poolKey).toBe(ZCODE_SHARED_POOL_KEY);
|
|
248
|
+
expect(handle.data.sessionRef).toEqual({ sessionId: GOLDEN_SESSION_ID, dbPath: expectedHostDbPath() });
|
|
249
|
+
expect(String(handle.data.sessionRef["dbPath"]).startsWith("/")).toBe(true);
|
|
275
250
|
}, 15_000);
|
|
276
251
|
|
|
277
252
|
it("回调时点:onPoolResolved(prepare 期)先于 onHandleReady(create 应答后)先于首事件", async () => {
|
|
@@ -287,37 +262,46 @@ describe("事件流与回调时点(缺省 appserver 路径)", () => {
|
|
|
287
262
|
},
|
|
288
263
|
}),
|
|
289
264
|
);
|
|
290
|
-
expect(order[0]).toBe(`pool:${
|
|
291
|
-
expect(order[1]).toBe(`handle:${
|
|
265
|
+
expect(order[0]).toBe(`pool:${ZCODE_SHARED_POOL_KEY}`);
|
|
266
|
+
expect(order[1]).toBe(`handle:${ZCODE_SHARED_POOL_KEY}:${GOLDEN_SESSION_ID}`);
|
|
292
267
|
expect(order[2]).toBe("event");
|
|
293
268
|
}, 15_000);
|
|
294
269
|
|
|
295
|
-
it("
|
|
270
|
+
it("共享宿主 HOME:HOME 正向透传、遥测关、argv=app-server --cwd engineDataDir、无池 config/lockfile/pidfile、onChildSpawned 零调用", async () => {
|
|
296
271
|
const { engine, stateFile, workspace } = makeEngine();
|
|
297
|
-
const
|
|
298
|
-
const
|
|
299
|
-
expect(handle.data.poolKey).toBe(
|
|
300
|
-
//
|
|
301
|
-
|
|
302
|
-
const written = JSON.parse(fs.readFileSync(configPath, "utf8")) as Record<string, unknown>;
|
|
303
|
-
expect(Object.keys(written["provider"] as object)).toEqual([PROVIDER]);
|
|
304
|
-
// fake 侧 boot env:HOME=常驻 HOME、遥测 false、嵌套标记
|
|
272
|
+
const onChildSpawned = vi.fn();
|
|
273
|
+
const { handle } = await engine.run(makeTask({ cwd: workspace }), makeCtx({ onChildSpawned }));
|
|
274
|
+
expect(handle.data.poolKey).toBe(ZCODE_SHARED_POOL_KEY);
|
|
275
|
+
// fake 侧 boot env:base env 携带的宿主 HOME 值原样透传(buildAppServerEnv 不覆写
|
|
276
|
+
// HOME 键——launcher 同进程 import() 也不改 env)、遥测 false、统一嵌套标记
|
|
305
277
|
const env = bootEnv(stateFile);
|
|
306
|
-
expect(env["home"]).toBe(
|
|
278
|
+
expect(env["home"]).toBe("/fake-host-home");
|
|
307
279
|
expect(env["telemetry"]).toBe("false");
|
|
308
280
|
expect(env["unifiedNested"]).toBe("1");
|
|
309
281
|
const boot = readState(stateFile).find((e) => e.ev === "boot");
|
|
310
|
-
expect(boot?.["argv"]).toEqual(["app-server", "--cwd",
|
|
311
|
-
//
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
expect(
|
|
318
|
-
expect(lockfilePid).toBe(process.pid); // lockfile.pid = 持锁宿主(本测试进程)
|
|
282
|
+
expect(boot?.["argv"]).toEqual(["app-server", "--cwd", dataDir]);
|
|
283
|
+
// D6:app-server 常驻进程是引擎自管资源(dispose 收割),不进宿主终止链——
|
|
284
|
+
// run 全程 onChildSpawned 不被调用(宿主 killAll 不误杀共享进程)
|
|
285
|
+
expect(onChildSpawned).not.toHaveBeenCalled();
|
|
286
|
+
// 池化时代的产物全部不存在:engines/zcode/ 只含 fs 拦截 launcher,无池
|
|
287
|
+
// config/lockfile/pidfile/journal 目录
|
|
288
|
+
const engineDir = fs.readdirSync(path.join(dataDir, "engines", "zcode"));
|
|
289
|
+
expect(engineDir).toEqual(["appserver-launcher.cjs"]);
|
|
319
290
|
}, 15_000);
|
|
320
291
|
|
|
292
|
+
it("maxTurns(pi 专属)→ 引擎内不再拒绝([D3-④] 能力拒绝上提宿主 capability-gate,防双轨拦截复活)", async () => {
|
|
293
|
+
// [D3-④ 合并注] capability 拒绝唯一实现 = common/capability-gate(两调用点 = chat 域
|
|
294
|
+
// executeViaEngine 同步段 + SAR run 前,拒绝语义 engine_capability_unsupported 由
|
|
295
|
+
// capability-gate.test.ts 承载)。引擎域 run() 不做 shape 检查——本用例反转回归面:
|
|
296
|
+
// maxTurns 直传引擎不得再被拒(曾因引擎内残留拦截与 gate 形成双轨)。
|
|
297
|
+
const { engine, stateFile, workspace } = makeEngine();
|
|
298
|
+
const r = await engine.run(makeTask({ cwd: workspace, maxTurns: 10 }), makeCtx());
|
|
299
|
+
expect(r.outcome.error).toBeUndefined();
|
|
300
|
+
expect(r.outcome.content).toBe(GOLDEN_FULL_TEXT);
|
|
301
|
+
// 正常走 app-server 流程(create×1——maxTurns 对 zcode 无通道,静默不透传)
|
|
302
|
+
expect(sentFrames(stateFile, "session/create")).toHaveLength(1);
|
|
303
|
+
}, 10_000);
|
|
304
|
+
|
|
321
305
|
it("per-session model:create 帧 model={providerId,modelId}(task.model 拆分)+ toolDenylist 透传", async () => {
|
|
322
306
|
const { engine, stateFile, workspace } = makeEngine();
|
|
323
307
|
await engine.run(makeTask({ cwd: workspace, denyTools: ["bash", ""] }), makeCtx());
|
|
@@ -328,28 +312,28 @@ describe("事件流与回调时点(缺省 appserver 路径)", () => {
|
|
|
328
312
|
expect(create.params["mode"]).toBe("yolo");
|
|
329
313
|
}, 15_000);
|
|
330
314
|
|
|
331
|
-
it("
|
|
315
|
+
it("thinkingLevel → create 帧 thoughtLevel 透传(F15a:task 声明映射协议通道)", async () => {
|
|
332
316
|
const { engine, stateFile, workspace } = makeEngine();
|
|
333
|
-
await engine.run(makeTask({ cwd: workspace,
|
|
317
|
+
await engine.run(makeTask({ cwd: workspace, thinkingLevel: "high" }), makeCtx());
|
|
334
318
|
const create = sentFrames(stateFile, "session/create")[0];
|
|
335
319
|
expect(create.params["thoughtLevel"]).toBe("high");
|
|
336
320
|
}, 15_000);
|
|
337
321
|
|
|
338
|
-
it("
|
|
322
|
+
it("thinkingLevel 未传/空白 → create 帧无 thoughtLevel 键(A.2 ① strict 对象不设空键,防 -32602)", async () => {
|
|
339
323
|
const { engine, stateFile, workspace } = makeEngine();
|
|
340
|
-
await engine.run(makeTask({ cwd: workspace,
|
|
324
|
+
await engine.run(makeTask({ cwd: workspace, thinkingLevel: " " }), makeCtx());
|
|
341
325
|
const create = sentFrames(stateFile, "session/create")[0];
|
|
342
326
|
expect("thoughtLevel" in create.params).toBe(false);
|
|
343
327
|
}, 15_000);
|
|
344
328
|
|
|
345
|
-
it("
|
|
329
|
+
it("thinkingLevel=medium(非常见档位)→ warn 一行提示且 thoughtLevel 键仍透传(RX2-F1:提示不拦截)", async () => {
|
|
346
330
|
const { engine, stateFile, workspace } = makeEngine();
|
|
347
331
|
const warns: string[] = [];
|
|
348
332
|
const warnSpy = vi.spyOn(subagentsLogger, "warn").mockImplementation(((msg: string) => {
|
|
349
333
|
warns.push(msg);
|
|
350
334
|
}) as typeof subagentsLogger.warn);
|
|
351
335
|
try {
|
|
352
|
-
await engine.run(makeTask({ cwd: workspace,
|
|
336
|
+
await engine.run(makeTask({ cwd: workspace, thinkingLevel: "medium" }), makeCtx());
|
|
353
337
|
} finally {
|
|
354
338
|
warnSpy.mockRestore();
|
|
355
339
|
}
|
|
@@ -364,14 +348,14 @@ describe("事件流与回调时点(缺省 appserver 路径)", () => {
|
|
|
364
348
|
expect(create.params["thoughtLevel"]).toBe("medium");
|
|
365
349
|
}, 15_000);
|
|
366
350
|
|
|
367
|
-
it("
|
|
351
|
+
it("thinkingLevel=high(常见档位)→ 零 thoughtLevel 提示(RX2-F1:常见档位不出声)", async () => {
|
|
368
352
|
const { engine, workspace } = makeEngine();
|
|
369
353
|
const warns: string[] = [];
|
|
370
354
|
const warnSpy = vi.spyOn(subagentsLogger, "warn").mockImplementation(((msg: string) => {
|
|
371
355
|
warns.push(msg);
|
|
372
356
|
}) as typeof subagentsLogger.warn);
|
|
373
357
|
try {
|
|
374
|
-
await engine.run(makeTask({ cwd: workspace,
|
|
358
|
+
await engine.run(makeTask({ cwd: workspace, thinkingLevel: "high" }), makeCtx());
|
|
375
359
|
} finally {
|
|
376
360
|
warnSpy.mockRestore();
|
|
377
361
|
}
|
|
@@ -490,7 +474,7 @@ describe("事件流与回调时点(缺省 appserver 路径)", () => {
|
|
|
490
474
|
expect(outcome.error).toContain("-32004");
|
|
491
475
|
expect(outcome.error).toContain(GOLDEN_SESSION_ID);
|
|
492
476
|
expect(outcome.sessionId).toBe(GOLDEN_SESSION_ID);
|
|
493
|
-
expect(handle.data.sessionRef).toEqual({ sessionId: GOLDEN_SESSION_ID, dbPath:
|
|
477
|
+
expect(handle.data.sessionRef).toEqual({ sessionId: GOLDEN_SESSION_ID, dbPath: expectedHostDbPath() });
|
|
494
478
|
}, 15_000);
|
|
495
479
|
});
|
|
496
480
|
|
|
@@ -582,8 +566,8 @@ describe("abort 链(D3)", () => {
|
|
|
582
566
|
expect(handle.data.sessionRef["sessionId"]).toBeUndefined();
|
|
583
567
|
// 不变量 3:poolKey 声明先于首个事件(error)——journal writer 重定向先于落盘,
|
|
584
568
|
// 落盘池与 handle.poolKey 同值同源(短路分支不满足即落 shared 占位池漂移)
|
|
585
|
-
expect(order).toEqual([`pool:${
|
|
586
|
-
expect(handle.data.poolKey).toBe(
|
|
569
|
+
expect(order).toEqual([`pool:${ZCODE_SHARED_POOL_KEY}`, "event:error"]);
|
|
570
|
+
expect(handle.data.poolKey).toBe(ZCODE_SHARED_POOL_KEY);
|
|
587
571
|
expect(readState(stateFile)).toHaveLength(0); // 连惰性启动都没触发
|
|
588
572
|
}, 10_000);
|
|
589
573
|
|
|
@@ -598,34 +582,18 @@ describe("abort 链(D3)", () => {
|
|
|
598
582
|
});
|
|
599
583
|
|
|
600
584
|
// ============================================================
|
|
601
|
-
//
|
|
585
|
+
// 连接复用(共享宿主 HOME:无凭据刷新机制——登录态轮换后常驻连接用旧凭据,
|
|
586
|
+
// 引擎进程重启才生效;跨任务连接复用本身仍是 D1 不变量)
|
|
602
587
|
// ============================================================
|
|
603
588
|
|
|
604
|
-
describe("
|
|
605
|
-
it("
|
|
589
|
+
describe("连接复用", () => {
|
|
590
|
+
it("第二任务复用常驻连接(boot 1),两会话独立 create", async () => {
|
|
606
591
|
const { engine, stateFile, workspace } = makeEngine();
|
|
607
592
|
await engine.run(makeTask({ cwd: workspace }), makeCtx());
|
|
608
593
|
await engine.run(makeTask({ cwd: workspace }), makeCtx());
|
|
609
594
|
expect(bootCount(stateFile)).toBe(1);
|
|
610
595
|
expect(sentFrames(stateFile, "session/create")).toHaveLength(2);
|
|
611
596
|
}, 20_000);
|
|
612
|
-
|
|
613
|
-
it("apiKey 变更:config 重写 + 旧连接关闭重建(boot 2)", async () => {
|
|
614
|
-
const { engine, stateFile, workspace } = makeEngine();
|
|
615
|
-
await engine.run(makeTask({ cwd: workspace }), makeCtx());
|
|
616
|
-
const homeDir = resolvePoolDir(dataDir, "zcode", ZCODE_APPSERVER_POOL_KEY);
|
|
617
|
-
const configPath = path.join(homeDir, ...ZCODE_POOL_CONFIG_SUFFIX);
|
|
618
|
-
const before = fs.readFileSync(configPath, "utf8");
|
|
619
|
-
// 变更凭据内容(同文件重写——mtime 变但内容才是判据;此处两者都变)
|
|
620
|
-
writeJson(v2Path, {
|
|
621
|
-
provider: { [PROVIDER]: { options: { apiKey: "k-v2", baseURL: "https://t.example" }, models: { m1: {} } } },
|
|
622
|
-
});
|
|
623
|
-
await engine.run(makeTask({ cwd: workspace }), makeCtx());
|
|
624
|
-
const after = fs.readFileSync(configPath, "utf8");
|
|
625
|
-
expect(after).not.toBe(before);
|
|
626
|
-
expect(after).toContain("k-v2");
|
|
627
|
-
expect(bootCount(stateFile)).toBe(2); // 连接重建(旧进程被杀、新进程读新配置)
|
|
628
|
-
}, 20_000);
|
|
629
597
|
});
|
|
630
598
|
|
|
631
599
|
// ============================================================
|
|
@@ -702,8 +670,6 @@ describe("dispose", () => {
|
|
|
702
670
|
const ghostRt = {
|
|
703
671
|
conn,
|
|
704
672
|
channel: new SessionChannel(conn),
|
|
705
|
-
homePoolKey: ZCODE_APPSERVER_POOL_KEY,
|
|
706
|
-
homeDir: resolvePoolDir(dataDir, "zcode", ZCODE_APPSERVER_POOL_KEY),
|
|
707
673
|
activeSessions: new Set<string>(["sess_ghost"]),
|
|
708
674
|
};
|
|
709
675
|
(engine as unknown as { appserverRuntime: unknown }).appserverRuntime = ghostRt;
|
|
@@ -757,7 +723,7 @@ describe("多会话并发(单常驻进程双会话不串线)", () => {
|
|
|
757
723
|
// ============================================================
|
|
758
724
|
|
|
759
725
|
describe("capabilities(D5:仅 eventGranularity 变)", () => {
|
|
760
|
-
it("
|
|
726
|
+
it("单一 app-server 形态声明 eventGranularity='stream',其余能力位与设计声明一致", () => {
|
|
761
727
|
const { engine } = makeEngine();
|
|
762
728
|
expect(engine.capabilities()).toEqual({
|
|
763
729
|
schemaEnforcement: "emulated",
|
|
@@ -770,6 +736,7 @@ describe("capabilities(D5:仅 eventGranularity 变)", () => {
|
|
|
770
736
|
resume: "cold",
|
|
771
737
|
interrupt: "kill-only",
|
|
772
738
|
permissionMode: "native",
|
|
739
|
+
maxTurns: false,
|
|
773
740
|
});
|
|
774
741
|
});
|
|
775
742
|
|