@zhushanwen/subagent-core 0.6.0 → 0.7.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 +1 -1
- package/dist/chunk-KXVBIVOU.js +16 -0
- package/dist/chunk-T2SYBW3I.js +24 -0
- package/dist/chunk-VURUAGMM.js +2305 -0
- package/dist/{types-C3fE3R9x.d.cts → engine-discovery-scan-ocpM8FmI.d.cts} +770 -668
- package/dist/{types-C3fE3R9x.d.ts → engine-discovery-scan-ocpM8FmI.d.ts} +770 -668
- package/dist/execution/engine/engine-discovery-scan.cjs +2210 -0
- package/dist/execution/engine/engine-discovery-scan.d.cts +4 -0
- package/dist/execution/engine/engine-discovery-scan.d.ts +4 -0
- package/dist/execution/engine/engine-discovery-scan.js +20 -0
- package/dist/execution/engine/paths.cjs +6 -23
- package/dist/execution/engine/paths.d.cts +1 -8
- package/dist/execution/engine/paths.d.ts +1 -8
- package/dist/execution/engine/paths.js +1 -1
- package/dist/execution/relay-env.cjs +12 -28
- package/dist/execution/relay-env.d.cts +1 -33
- package/dist/execution/relay-env.d.ts +1 -33
- package/dist/execution/relay-env.js +5 -3
- package/dist/index.cjs +14045 -16059
- package/dist/index.d.cts +1035 -1579
- package/dist/index.d.ts +1035 -1579
- package/dist/index.js +9838 -13800
- package/dist.bundle/index.cjs +28875 -30323
- package/package.json +20 -26
- package/src/__tests__/record-store-last-line.test.ts +16 -7
- package/src/core/error-message.ts +7 -6
- package/src/core/host-services.ts +8 -2
- package/src/core/notify-ports.ts +17 -2
- package/src/execution/__tests__/chat-engine-routing.test.ts +62 -28
- package/src/execution/__tests__/chat-round-first-round-watchdog.test.ts +255 -0
- package/src/execution/__tests__/collect-coordinator-service.test.ts +36 -47
- package/src/execution/__tests__/collect-mixed-dispatch.test.ts +20 -53
- package/src/execution/__tests__/delivery-methods.test.ts +179 -237
- package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -2
- package/src/execution/__tests__/execute-nesting.test.ts +20 -13
- package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +20 -33
- package/src/execution/__tests__/gc-timer.test.ts +7 -22
- package/src/execution/__tests__/get-record-for-action-restart.test.ts +20 -10
- package/src/execution/__tests__/helpers/fake-engine-port.ts +187 -0
- package/src/execution/__tests__/helpers/spawn-mock.ts +36 -9
- package/src/execution/__tests__/helpers/subagent-service-mocks.ts +1 -1
- package/src/execution/__tests__/idle-gc.test.ts +200 -0
- package/src/execution/__tests__/lifecycle-predicates.test.ts +26 -21
- package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +5 -2
- package/src/execution/__tests__/reconcile-sweep.test.ts +200 -0
- package/src/execution/__tests__/record-store.test.ts +60 -6
- package/src/execution/__tests__/recursive-visibility-baseline.test.ts +20 -13
- package/src/execution/__tests__/round-supervisor.test.ts +293 -0
- package/src/execution/__tests__/session-pending.test.ts +119 -17
- package/src/execution/__tests__/stream-sink-retirement.test.ts +10 -10
- package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +1 -11
- package/src/execution/__tests__/subagent-service-notify-gate.test.ts +33 -30
- package/src/execution/__tests__/subagent-service-parent-guard.test.ts +2 -9
- package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +59 -129
- package/src/execution/__tests__/subagent-service.test.ts +2 -2
- package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +109 -7
- package/src/execution/__tests__/subprocess-agent-runner.test.ts +108 -36
- package/src/execution/__tests__/sync-collect-recovery.test.ts +21 -36
- package/src/execution/__tests__/workflow-state-root.test.ts +232 -0
- package/src/execution/agent-registry.ts +6 -2
- package/src/execution/dialog-queue.ts +6 -73
- package/src/execution/engine/__tests__/common/capability-gate.test.ts +115 -15
- package/src/execution/engine/__tests__/common/errors.test.ts +11 -18
- package/src/execution/engine/__tests__/common/kill-chain.test.ts +7 -0
- package/src/execution/engine/__tests__/common/nesting-guard.test.ts +9 -3
- package/src/execution/engine/__tests__/common/session-view-service.test.ts +90 -3
- package/src/execution/engine/__tests__/conformance/H9-test-disposition.md +116 -0
- package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/fake-engine-protocol.mjs +377 -0
- package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/recorded.fixture.json +331 -0
- package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/smoke-run.fixture.json +213 -0
- package/src/execution/engine/__tests__/conformance/chat-round-protocol.test.ts +230 -0
- package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +69 -42
- package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +4 -81
- package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +67 -44
- package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +81 -54
- package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +133 -70
- package/src/execution/engine/__tests__/conformance/engine-crash.test.ts +143 -0
- package/src/execution/engine/__tests__/conformance/fake-engine-capabilities.ts +19 -0
- package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +7 -2
- package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +6 -5
- package/src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts +398 -0
- package/src/execution/engine/__tests__/conformance/registry-fork-filter.test.ts +221 -0
- package/src/execution/engine/__tests__/conformance/round-liveness-supervisor.test.ts +302 -0
- package/src/execution/engine/__tests__/conformance/static-spawn-guard.test.ts +58 -0
- package/src/execution/engine/__tests__/engine-discovery-scan.test.ts +558 -0
- package/src/execution/engine/__tests__/host-task-spec.test.ts +45 -0
- package/src/execution/engine/__tests__/model-ref-split.test.ts +74 -0
- package/src/execution/engine/__tests__/registry.test.ts +206 -1
- package/src/execution/engine/__tests__/routing.test.ts +97 -0
- package/src/execution/engine/__tests__/run-failure-worktree-cleanup.test.ts +97 -0
- package/src/execution/engine/client/__tests__/__fixtures__/fake-engine.mjs +294 -0
- package/src/execution/engine/client/__tests__/engine-client.test.ts +516 -0
- package/src/execution/engine/client/__tests__/mirror.test.ts +67 -0
- package/src/execution/engine/client/__tests__/pid-file.test.ts +257 -0
- package/src/execution/engine/client/__tests__/protocol-closure.test.ts +95 -0
- package/src/execution/engine/client/__tests__/remote-engine.test.ts +457 -0
- package/src/execution/engine/client/client-options.ts +103 -0
- package/src/execution/engine/client/engine-client.ts +687 -0
- package/src/execution/engine/client/mirror.ts +167 -0
- package/src/execution/engine/client/pid-file.ts +392 -0
- package/src/execution/engine/client/reaper.ts +95 -0
- package/src/execution/engine/client/remote-engine.ts +441 -0
- package/src/execution/engine/client/reverse-router.ts +255 -0
- package/src/execution/engine/common/capability-gate.ts +109 -22
- package/src/execution/engine/common/errors.ts +9 -25
- package/src/execution/engine/common/event-journal.ts +4 -50
- package/src/execution/engine/common/journal-replay.ts +3 -1
- package/src/execution/engine/common/kill-chain.ts +18 -251
- package/src/execution/engine/common/nesting-guard.ts +18 -114
- package/src/execution/engine/common/pool-manager.ts +4 -0
- package/src/execution/engine/common/session-view-service.ts +56 -84
- package/src/execution/engine/config.ts +151 -0
- package/src/execution/engine/d8-compat.ts +346 -0
- package/src/execution/engine/engine-discovery-roots.ts +107 -0
- package/src/execution/engine/engine-discovery-scan.ts +269 -0
- package/src/execution/engine/engine-discovery.ts +30 -7
- package/src/execution/engine/engine-inspect-package.ts +282 -0
- package/src/execution/engine/engine-manifest.ts +244 -0
- package/src/execution/engine/host/__tests__/host-askuser-endpoint.test.ts +123 -0
- package/src/execution/engine/host/__tests__/host-bridge.test.ts +135 -0
- package/src/execution/engine/host/__tests__/spawned-children.test.ts +73 -0
- package/src/execution/engine/host/host-bridge.ts +150 -0
- package/src/execution/engine/host/host-ui-endpoint.ts +47 -0
- package/src/execution/engine/host/pi-host-binding.ts +91 -0
- package/src/execution/engine/host/spawned-children.ts +139 -0
- package/src/execution/engine/host-task-spec.ts +29 -2
- package/src/execution/engine/model-validation.ts +55 -2
- package/src/execution/engine/paths.ts +16 -41
- package/src/execution/engine/port.ts +48 -2
- package/src/execution/engine/registry.ts +153 -34
- package/src/execution/engine/routing.ts +225 -52
- package/src/execution/engine/types.ts +25 -200
- package/src/execution/finalize-record.ts +25 -0
- package/src/execution/idle-gc.ts +89 -14
- package/src/execution/lifecycle-manager.ts +10 -7
- package/src/execution/lifecycle-predicates.ts +10 -8
- package/src/execution/record-store.ts +29 -2
- package/src/execution/relay-env.ts +19 -36
- package/src/execution/round-supervisor/domain.ts +89 -0
- package/src/execution/round-supervisor/index.ts +33 -0
- package/src/execution/round-supervisor/notify-accounting.ts +87 -0
- package/src/execution/round-supervisor/reconcile-sweep.ts +235 -0
- package/src/execution/round-supervisor/service-binding.test.ts +661 -0
- package/src/execution/round-supervisor/service-binding.ts +273 -0
- package/src/execution/round-supervisor/supervisor.ts +426 -0
- package/src/execution/session-pending.ts +68 -74
- package/src/execution/settled-watchdog.ts +39 -0
- package/src/execution/subagent-service.ts +746 -400
- package/src/execution/subprocess-agent-runner.ts +16 -8
- package/src/execution/types.ts +41 -117
- package/src/execution/ui-channels.ts +13 -214
- package/src/execution/ui-request-handler-factory.ts +7 -4
- package/src/execution/ui-request-observability.ts +2 -2
- package/src/execution/workflow-state-root.ts +67 -0
- package/src/execution/worktree-git-ops.ts +5 -0
- package/src/execution/worktree-manager.ts +11 -1
- package/src/index.ts +55 -26
- package/src/orchestration/__tests__/execute-agent-call.test.ts +1 -1
- package/src/orchestration/execute-agent-call.ts +1 -1
- package/src/orchestration/file-run-store.ts +144 -59
- package/src/orchestration/models/types.ts +43 -42
- package/src/shared/zcode-model-ref.ts +31 -0
- package/dist/chunk-43ONBFZX.js +0 -240
- package/dist/chunk-A4IVZWVX.js +0 -31
- package/dist/chunk-APZY4IME.js +0 -27
- package/dist/chunk-V3VHZ2VX.js +0 -59
- package/dist/execution/engine/engines/zcode/constants.cjs +0 -107
- package/dist/execution/engine/engines/zcode/constants.d.cts +0 -135
- package/dist/execution/engine/engines/zcode/constants.d.ts +0 -135
- package/dist/execution/engine/engines/zcode/constants.js +0 -54
- package/dist/execution/engine/engines/zcode/reader.cjs +0 -276
- package/dist/execution/engine/engines/zcode/reader.d.cts +0 -21
- package/dist/execution/engine/engines/zcode/reader.d.ts +0 -21
- package/dist/execution/engine/engines/zcode/reader.js +0 -9
- package/src/__tests__/append-system-prompt-assembly.test.ts +0 -243
- package/src/__tests__/fr4-get-state-handshake.test.ts +0 -125
- package/src/__tests__/session-runner.test.ts +0 -69
- package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
- package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -191
- package/src/execution/__tests__/descendant-sweep-guards.test.ts +0 -220
- package/src/execution/__tests__/descendant-sweep.test.ts +0 -269
- package/src/execution/__tests__/engine-model-validation.test.ts +0 -741
- package/src/execution/__tests__/epipe-fallback.test.ts +0 -248
- package/src/execution/__tests__/execution-runtime-face.test.ts +0 -272
- package/src/execution/__tests__/get-state-handshake.test.ts +0 -127
- package/src/execution/__tests__/helpers/session-runner-mocks.ts +0 -113
- package/src/execution/__tests__/keep-alive-no-progress.test.ts +0 -280
- package/src/execution/__tests__/kill-all-escalation.test.ts +0 -196
- package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +0 -113
- package/src/execution/__tests__/output-collector.test.ts +0 -469
- package/src/execution/__tests__/pi-invocation.test.ts +0 -166
- package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -149
- package/src/execution/__tests__/rpc-mode.test.ts +0 -89
- package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +0 -387
- package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -277
- package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -254
- package/src/execution/__tests__/run-spawn-edges.test.ts +0 -1079
- package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
- package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
- package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
- package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -207
- package/src/execution/__tests__/service-kill-escalation.test.ts +0 -91
- package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +0 -110
- package/src/execution/__tests__/session-runner-close-prune.test.ts +0 -181
- package/src/execution/__tests__/session-runner-dispatch.test.ts +0 -489
- package/src/execution/__tests__/session-runner-epipe.test.ts +0 -179
- package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +0 -227
- package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +0 -290
- package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -352
- package/src/execution/__tests__/settled-watchdog.test.ts +0 -524
- package/src/execution/__tests__/spawn-args.test.ts +0 -446
- package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -192
- package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
- package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -208
- package/src/execution/__tests__/spawned-children.test.ts +0 -236
- package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
- package/src/execution/__tests__/stdin-writer.test.ts +0 -464
- package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -693
- package/src/execution/__tests__/temp-prompt.test.ts +0 -53
- package/src/execution/__tests__/timeout-integration.test.ts +0 -616
- package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
- package/src/execution/__tests__/turn-limiter.test.ts +0 -65
- package/src/execution/__tests__/ui-request-handler.test.ts +0 -205
- package/src/execution/__tests__/ui-request-queue.test.ts +0 -298
- package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -230
- package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
- package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +0 -149
- package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
- package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +0 -128
- package/src/execution/engine/__tests__/paths.test.ts +0 -39
- package/src/execution/engine/common/schema-emulation.ts +0 -189
- package/src/execution/engine/common/session-view-projection.ts +0 -51
- package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -615
- package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
- package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +0 -257
- package/src/execution/engine/engines/pi/argv-mirror.ts +0 -135
- package/src/execution/engine/engines/pi/get-state-handshake.ts +0 -179
- package/src/execution/engine/engines/pi/output-collector.ts +0 -317
- package/src/execution/engine/engines/pi/pi-engine.ts +0 -811
- package/src/execution/engine/engines/pi/pi-invocation.ts +0 -120
- package/src/execution/engine/engines/pi/reader.ts +0 -59
- package/src/execution/engine/engines/pi/registration.ts +0 -37
- package/src/execution/engine/engines/pi/session-runner.ts +0 -2840
- package/src/execution/engine/engines/pi/spawn-event-adapter.ts +0 -404
- package/src/execution/engine/engines/pi/stdin-writer.ts +0 -199
- package/src/execution/engine/engines/pi/temp-prompt.ts +0 -62
- package/src/execution/engine/engines/pi/turn-limiter.ts +0 -102
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +0 -301
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +0 -36
- package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +0 -321
- package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +0 -473
- package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -43
- package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -124
- package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
- package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -71
- package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +0 -247
- package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +0 -451
- package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +0 -792
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +0 -782
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +0 -168
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +0 -210
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +0 -353
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +0 -282
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +0 -372
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -145
- package/src/execution/engine/engines/zcode/appserver-launcher.ts +0 -167
- package/src/execution/engine/engines/zcode/connection.ts +0 -598
- package/src/execution/engine/engines/zcode/constants.ts +0 -176
- package/src/execution/engine/engines/zcode/golden-sample.ts +0 -47
- package/src/execution/engine/engines/zcode/parser.ts +0 -102
- package/src/execution/engine/engines/zcode/preparer.ts +0 -235
- package/src/execution/engine/engines/zcode/reader.ts +0 -381
- package/src/execution/engine/engines/zcode/registration.ts +0 -37
- package/src/execution/engine/engines/zcode/session-channel.ts +0 -968
- package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -1431
- package/src/execution/round-settlement.ts +0 -93
- package/src/execution/ui-request-queue.ts +0 -215
- package/src/shared/schema-env.ts +0 -44
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhushanwen/subagent-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Cross-host shared subagent execution layer and workflow orchestration core (dual-form npm package: TS source for workspace, dist ESM+CJS for npm)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,28 +22,6 @@
|
|
|
22
22
|
},
|
|
23
23
|
"default": "./dist/index.js"
|
|
24
24
|
},
|
|
25
|
-
"./engines/zcode/reader": {
|
|
26
|
-
"import": {
|
|
27
|
-
"types": "./dist/execution/engine/engines/zcode/reader.d.ts",
|
|
28
|
-
"default": "./dist/execution/engine/engines/zcode/reader.js"
|
|
29
|
-
},
|
|
30
|
-
"require": {
|
|
31
|
-
"types": "./dist/execution/engine/engines/zcode/reader.d.cts",
|
|
32
|
-
"default": "./dist/execution/engine/engines/zcode/reader.cjs"
|
|
33
|
-
},
|
|
34
|
-
"default": "./dist/execution/engine/engines/zcode/reader.js"
|
|
35
|
-
},
|
|
36
|
-
"./engines/zcode/constants": {
|
|
37
|
-
"import": {
|
|
38
|
-
"types": "./dist/execution/engine/engines/zcode/constants.d.ts",
|
|
39
|
-
"default": "./dist/execution/engine/engines/zcode/constants.js"
|
|
40
|
-
},
|
|
41
|
-
"require": {
|
|
42
|
-
"types": "./dist/execution/engine/engines/zcode/constants.d.cts",
|
|
43
|
-
"default": "./dist/execution/engine/engines/zcode/constants.cjs"
|
|
44
|
-
},
|
|
45
|
-
"default": "./dist/execution/engine/engines/zcode/constants.js"
|
|
46
|
-
},
|
|
47
25
|
"./engine/paths": {
|
|
48
26
|
"import": {
|
|
49
27
|
"types": "./dist/execution/engine/paths.d.ts",
|
|
@@ -55,6 +33,17 @@
|
|
|
55
33
|
},
|
|
56
34
|
"default": "./dist/execution/engine/paths.js"
|
|
57
35
|
},
|
|
36
|
+
"./engine/engine-discovery-scan": {
|
|
37
|
+
"import": {
|
|
38
|
+
"types": "./dist/execution/engine/engine-discovery-scan.d.ts",
|
|
39
|
+
"default": "./dist/execution/engine/engine-discovery-scan.js"
|
|
40
|
+
},
|
|
41
|
+
"require": {
|
|
42
|
+
"types": "./dist/execution/engine/engine-discovery-scan.d.cts",
|
|
43
|
+
"default": "./dist/execution/engine/engine-discovery-scan.cjs"
|
|
44
|
+
},
|
|
45
|
+
"default": "./dist/execution/engine/engine-discovery-scan.js"
|
|
46
|
+
},
|
|
58
47
|
"./relay-env": {
|
|
59
48
|
"import": {
|
|
60
49
|
"types": "./dist/execution/relay-env.d.ts",
|
|
@@ -84,19 +73,24 @@
|
|
|
84
73
|
"ajv": "^8.20.0",
|
|
85
74
|
"proper-lockfile": "^4.1.2",
|
|
86
75
|
"yaml": "^2.9.0",
|
|
87
|
-
"@xyz-agent/extension-protocol": "0.8.2"
|
|
76
|
+
"@xyz-agent/extension-protocol": "0.8.2",
|
|
77
|
+
"@zhushanwen/subagent-engine-sdk": "0.2.1"
|
|
88
78
|
},
|
|
89
79
|
"devDependencies": {
|
|
90
80
|
"@types/node": "^24.0.0",
|
|
91
81
|
"@vitest/coverage-v8": "^4.1.9",
|
|
92
82
|
"tsup": "^8.5.1",
|
|
93
83
|
"typescript": "^5.7.0",
|
|
94
|
-
"vitest": "^4.1.8"
|
|
84
|
+
"vitest": "^4.1.8",
|
|
85
|
+
"@zhushanwen/pi-subagent-cli": "0.1.2",
|
|
86
|
+
"@zhushanwen/zcode-subagent-cli": "0.1.2"
|
|
95
87
|
},
|
|
96
88
|
"scripts": {
|
|
97
89
|
"build": "tsup",
|
|
98
90
|
"build:bundle": "tsup",
|
|
99
91
|
"test": "vitest run",
|
|
100
|
-
"typecheck": "tsc --noEmit"
|
|
92
|
+
"typecheck": "tsc --noEmit",
|
|
93
|
+
"record:engine-fixtures": "node scripts/record-engine-fixtures.mjs",
|
|
94
|
+
"test:engine-protocol": "vitest run src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts src/execution/engine/__tests__/conformance/static-spawn-guard.test.ts"
|
|
101
95
|
}
|
|
102
96
|
}
|
|
@@ -81,7 +81,10 @@ describe("readLastJsonlLine 孤儿终态判定(超长末行 / 截断行)", (
|
|
|
81
81
|
const rec = recovered("orphan-bigline");
|
|
82
82
|
expect(rec.status).toBe("closed");
|
|
83
83
|
expect(rec.closedReason).toBe("gc");
|
|
84
|
-
|
|
84
|
+
// 回归锚点本体:300KB 完整行不误判截断([F3] in-flight 重启中断 error 在场,
|
|
85
|
+
// 但无截断标记——64KB 固定尾窗的旧实现会把本行从中间切开判「truncated」)。
|
|
86
|
+
expect(rec.error).toContain("host restart");
|
|
87
|
+
expect(rec.error).not.toContain("truncated");
|
|
85
88
|
});
|
|
86
89
|
|
|
87
90
|
it("末行截断(无尾换行的半行 JSON)→ closed/gc + error 标记截断", () => {
|
|
@@ -91,7 +94,9 @@ describe("readLastJsonlLine 孤儿终态判定(超长末行 / 截断行)", (
|
|
|
91
94
|
const rec = recovered("orphan-truncated");
|
|
92
95
|
expect(rec.status).toBe("closed");
|
|
93
96
|
expect(rec.closedReason).toBe("gc");
|
|
94
|
-
|
|
97
|
+
// [F3] 无 resumable 信号 = in-flight:截断判定并入重启中断文案("— last line truncated")
|
|
98
|
+
expect(rec.error).toContain("host restart");
|
|
99
|
+
expect(rec.error).toContain("truncated");
|
|
95
100
|
});
|
|
96
101
|
|
|
97
102
|
it("超长且截断的末行 → 仍判截断 error(扩窗是为完整行服务,不放宽截断判定)", () => {
|
|
@@ -99,15 +104,18 @@ describe("readLastJsonlLine 孤儿终态判定(超长末行 / 截断行)", (
|
|
|
99
104
|
writeOrphanSession("orphan-bigcut", bigTruncated, { trailingNewline: false });
|
|
100
105
|
const rec = recovered("orphan-bigcut");
|
|
101
106
|
expect(rec.status).toBe("closed");
|
|
102
|
-
|
|
107
|
+
// [F3] 无 resumable 信号 = in-flight:截断判定并入重启中断文案
|
|
108
|
+
expect(rec.error).toContain("host restart");
|
|
109
|
+
expect(rec.error).toContain("truncated");
|
|
103
110
|
});
|
|
104
111
|
|
|
105
|
-
it("常规末行(多行文件、完整 JSON)→ closed/gc
|
|
112
|
+
it("常规末行(多行文件、完整 JSON)→ closed/gc;无 resumable 信号 = in-flight 重启中断([F3])", () => {
|
|
106
113
|
writeOrphanSession("orphan-normal", JSON.stringify({ type: "message", role: "assistant", content: "final" }));
|
|
107
114
|
const rec = recovered("orphan-normal");
|
|
108
115
|
expect(rec.status).toBe("closed");
|
|
109
116
|
expect(rec.closedReason).toBe("gc");
|
|
110
|
-
|
|
117
|
+
// [F3] 末行完整但无 resumable/result 信号 = 在途被重启中断:投影不得谎报 completed
|
|
118
|
+
expect(rec.error).toContain("host restart");
|
|
111
119
|
});
|
|
112
120
|
|
|
113
121
|
it("仅 identity 单行文件(首行即末行,合法 JSON)→ closed 无 error", () => {
|
|
@@ -122,8 +130,9 @@ describe("readLastJsonlLine 孤儿终态判定(超长末行 / 截断行)", (
|
|
|
122
130
|
// identity 首行 + 紧跟空行结尾:非空段只剩 identity(窗口到文件头,首段完整)
|
|
123
131
|
fs.writeFileSync(path.join(sessionsDir, "2026-07-18T12-00-00-000Z_orphan-empty.jsonl"), identity + "\n", "utf8");
|
|
124
132
|
const rec = recovered("orphan-empty");
|
|
125
|
-
// 唯一非空行 = identity 首行(合法 JSON)→
|
|
133
|
+
// 唯一非空行 = identity 首行(合法 JSON)→ 无截断标记;[F3] in-flight 重启中断 error 在场
|
|
126
134
|
expect(rec.status).toBe("closed");
|
|
127
|
-
expect(rec.error).
|
|
135
|
+
expect(rec.error).toContain("host restart");
|
|
136
|
+
expect(rec.error).not.toContain("truncated");
|
|
128
137
|
});
|
|
129
138
|
});
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* toErrorMessage re-export shim——单源在 @zhushanwen/subagent-engine-sdk
|
|
3
|
+
* (round1-reuse R11 微副本收编;core → SDK 边界正向合法)。本文件路径不变,
|
|
4
|
+
* core 内部 8 个消费方 import 不动。
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* [A8 修复]:非 Error 的 object 入参经 SDK 单源输出 JSON 结构化文本(原
|
|
7
|
+
* String(e) = "[object Object]");Error 入参输出逐字节不变。core barrel 不导出
|
|
8
|
+
* 该符号(导出面零变化)。
|
|
6
9
|
*/
|
|
7
|
-
export
|
|
8
|
-
return e instanceof Error ? e.message : String(e);
|
|
9
|
-
}
|
|
10
|
+
export { toErrorMessage } from "@zhushanwen/subagent-engine-sdk";
|
|
@@ -32,12 +32,18 @@ export interface HostServices {
|
|
|
32
32
|
/** 结构化日志:对齐现 getLogger 调用面(level/component/message/data)。缺省 sink 按级分化:
|
|
33
33
|
* warn/error 走 console、debug no-op(对齐 pi-extension-logger 语义,见 NULL_HOST.log)。 */
|
|
34
34
|
log(level: LogLevel, component: string, message: string, data?: unknown): void;
|
|
35
|
-
/** agent/skill/workflow 资源发现根(可选端口,缺席 = 调用方降级)。宿主只提供根列表
|
|
36
|
-
* (按优先级低→高);扫描 / 同名遮蔽(last-writer-wins)/ 遮蔽报告语义归 core 统一。
|
|
35
|
+
/** agent/skill/workflow/引擎包 资源发现根(可选端口,缺席 = 调用方降级)。宿主只提供根列表
|
|
36
|
+
* (按优先级低→高);扫描 / 同名遮蔽(last-writer-wins)/ 遮蔽报告语义归 core 统一。
|
|
37
|
+
*
|
|
38
|
+
* engines kind(W4,设计 §3.4 L1 第二通道):引擎包发现根——dir 下一级(及 org 分组
|
|
39
|
+
* 二级)子项 = 候选引擎包目录,命中 package.json `xyz-agent.subagentEngine` manifest
|
|
40
|
+
* 即发现。打包态主通道是 env `XYZ_AGENT_ENGINE_ROOTS`(W9 注入),此端口承载宿主
|
|
41
|
+
* 自身模块域(如 pi 宿主包 node_modules 的引擎包 dependencies 安装位)。 */
|
|
37
42
|
discoveryRoots?(): {
|
|
38
43
|
agents?: DiscoveryRoot[];
|
|
39
44
|
skills?: DiscoveryRoot[];
|
|
40
45
|
workflows?: DiscoveryRoot[];
|
|
46
|
+
engines?: DiscoveryRoot[];
|
|
41
47
|
};
|
|
42
48
|
}
|
|
43
49
|
|
package/src/core/notify-ports.ts
CHANGED
|
@@ -92,11 +92,26 @@ export interface DeliveryHandle {
|
|
|
92
92
|
dispose(): void;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
/** countActiveFromEntries 的过滤选项([F1] 与 pending-notifications 的
|
|
96
|
+
* CountActiveOptions 对齐的子集——core 契约面只暴露跨 session 基准一个字段)。 */
|
|
97
|
+
export interface CountActivePortOptions {
|
|
98
|
+
/**
|
|
99
|
+
* [W4 读侧过滤②] 跨 session 残留过滤基准:传入时端口实现按「register entry 的
|
|
100
|
+
* sessionId ≠ 基准 → 跳过」过滤——fork 继承的父级注册残留(翻 process 档后 U4
|
|
101
|
+
* 补注销不再中性化,永久留存于子 session 文件)不进差集。
|
|
102
|
+
* 缺省(undefined)= 不过滤(向后兼容:既有调用方零改动行为不变)。
|
|
103
|
+
*/
|
|
104
|
+
currentSessionId?: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
95
107
|
export interface NotifyDomainPorts {
|
|
96
108
|
/** pending 活跃计数(pi 会话 entries 中 register − unregister 差集的数值)。
|
|
97
109
|
* 契约为 number 而非 pi 侧 CountActiveResult:core 消费面只读 count,契约面最窄;
|
|
98
|
-
* pi 壳注入时拆 `countActiveFromEntries(entries).count`。
|
|
99
|
-
|
|
110
|
+
* pi 壳注入时拆 `countActiveFromEntries(entries).count`。
|
|
111
|
+
* [F1] 第二参为可选过滤基准(CountActivePortOptions)——core 消费方(后代判定
|
|
112
|
+
* 读侧)持有「被读 entries 所属 session」概念时必须传入,使跨 session 残留不进
|
|
113
|
+
* 差集;与 pending-notifications 实装签名(entries, opts?) 对齐。 */
|
|
114
|
+
countActiveFromEntries?(entries: unknown[], opts?: CountActivePortOptions): number;
|
|
100
115
|
/** 投递内核工厂。签名与 @xyz-agent/session-delivery 的 createDelivery 结构兼容,
|
|
101
116
|
* pi 壳直传其本体即可。缺席 = 消费方降级直发。 */
|
|
102
117
|
createDelivery?(port: DeliveryPort, options?: DeliveryConfig): DeliveryHandle;
|
|
@@ -76,7 +76,12 @@ import type {
|
|
|
76
76
|
import { ModelConfigService } from "../model-config-service.ts";
|
|
77
77
|
import type { ModelInfo, ModelRegistryLike } from "../model-resolver.ts";
|
|
78
78
|
import { toSubagentRecordEntry } from "../record-entry.ts";
|
|
79
|
-
|
|
79
|
+
// W10(§2.10 ②):子进程句柄断言改读 core 侧状态镜像(host/spawned-children——
|
|
80
|
+
// 协议化后 spawnedChildren 持有方在引擎进程,core 消费镜像面;判据 pid 同构)。
|
|
81
|
+
import {
|
|
82
|
+
coreSpawnedChildrenMirror,
|
|
83
|
+
_resetCoreSpawnedChildrenMirrorForTest,
|
|
84
|
+
} from "../engine/host/spawned-children.ts";
|
|
80
85
|
import { SubagentService } from "../subagent-service.ts";
|
|
81
86
|
import type { ExecuteOptions } from "../types.ts";
|
|
82
87
|
|
|
@@ -121,6 +126,23 @@ class FakeEngine implements EnginePort {
|
|
|
121
126
|
}
|
|
122
127
|
|
|
123
128
|
capabilities(): EngineCapabilities {
|
|
129
|
+
// [W3] id==='pi' 的注册占位按 pi 真实能力位声明(gate 同步面放行 pi 全参数——
|
|
130
|
+
// V4⑤ 反向守护;否则 maxTurns/conversation 会被误拦)。
|
|
131
|
+
if (this.id === "pi") {
|
|
132
|
+
return {
|
|
133
|
+
schemaEnforcement: "native",
|
|
134
|
+
steer: "unsupported",
|
|
135
|
+
conversation: "native",
|
|
136
|
+
personaInjection: "flag",
|
|
137
|
+
eventGranularity: "stream",
|
|
138
|
+
sandbox: "emulated",
|
|
139
|
+
sessionRead: "full",
|
|
140
|
+
resume: "native",
|
|
141
|
+
interrupt: "kill-only",
|
|
142
|
+
permissionMode: "native",
|
|
143
|
+
maxTurns: true,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
124
146
|
return ZCODE_LIKE_CAPS;
|
|
125
147
|
}
|
|
126
148
|
async probe(): Promise<ProbeReport> {
|
|
@@ -231,6 +253,7 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
231
253
|
let agentDir: string;
|
|
232
254
|
|
|
233
255
|
beforeEach(() => {
|
|
256
|
+
_resetCoreSpawnedChildrenMirrorForTest();
|
|
234
257
|
// u0-data-discovery 注入化:execute 链路的 getEngineDataDir 回退段经
|
|
235
258
|
// HostServices.dataRoot() 端口,未 configureCore 即消费抛 core_host_not_configured
|
|
236
259
|
// (execute fail-safe 吞掉后表现为 mock 计数 0)——端口态显式配置,值不被断言
|
|
@@ -284,8 +307,10 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
284
307
|
expect(mockSpawn).not.toHaveBeenCalled();
|
|
285
308
|
});
|
|
286
309
|
|
|
287
|
-
it("[缺省] 全缺省 → pi
|
|
288
|
-
//
|
|
310
|
+
it("[缺省] 全缺省 → pi 路由派发([W3] pi 缺省经 registry cli 形态 port 协议派发)", async () => {
|
|
311
|
+
// [W3 改写] 原「不注册任何引擎也照跑(inproc DI 直连 spawn)」随 chat 域收口
|
|
312
|
+
// 消亡:pi 路由 = registry 'pi' 的 cli 形态 port(pi-host-binding 解析)。未注册
|
|
313
|
+
// 时为不可用 stub——engine.run 抛 engine_not_found,record 按 MF-6 回退可恢复。
|
|
289
314
|
clearEngines();
|
|
290
315
|
const modelService = new ModelConfigService({ agentDir, cwd: agentDir });
|
|
291
316
|
modelService.initModel({
|
|
@@ -296,8 +321,13 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
296
321
|
const service = new SubagentService({ cwd: agentDir, modelService });
|
|
297
322
|
service.initSession({ pi: makePi(), sessionId: "test-session" });
|
|
298
323
|
|
|
299
|
-
await service.execute(baseOpts(agentDir));
|
|
300
|
-
|
|
324
|
+
const handle = await service.execute(baseOpts(agentDir));
|
|
325
|
+
// 不可用 stub:轮次派发在首次 engine.run 拒绝(engine_not_found)→ chatMode=false
|
|
326
|
+
// 一次性 run 终态销毁(无孤儿 record——拒绝点唯一化在 run)。
|
|
327
|
+
await vi.waitFor(() => {
|
|
328
|
+
const rec = service.queries.collectRecords(10, "all").find((r) => r.id === handle.subagentId);
|
|
329
|
+
expect(rec?.status).toBe("closed");
|
|
330
|
+
});
|
|
301
331
|
});
|
|
302
332
|
|
|
303
333
|
// ============================================================
|
|
@@ -305,9 +335,9 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
305
335
|
// ============================================================
|
|
306
336
|
|
|
307
337
|
it("[D5] 全缺省 pi record:engine===undefined 且 entry JSON 不含 engine 键", async () => {
|
|
308
|
-
const { service } = setup(agentDir);
|
|
338
|
+
const { service, piEngine } = setup(agentDir);
|
|
309
339
|
const handle = await service.execute(baseOpts(agentDir));
|
|
310
|
-
await vi.waitFor(() => expect(
|
|
340
|
+
await vi.waitFor(() => expect(piEngine.runs.length).toBe(1));
|
|
311
341
|
|
|
312
342
|
const rec = service.queries.collectRecords(10, "running").find((r) => r.id === handle.subagentId);
|
|
313
343
|
expect(rec).toBeDefined();
|
|
@@ -318,12 +348,11 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
318
348
|
it("[D5] 显式 engine:'pi' 路由回 pi:record 不盖章 engine", async () => {
|
|
319
349
|
const { service, piEngine, zcode } = setup(agentDir);
|
|
320
350
|
const handle = await service.execute(baseOpts(agentDir, { engine: "pi" }));
|
|
321
|
-
await vi.waitFor(() => expect(
|
|
351
|
+
await vi.waitFor(() => expect(piEngine.runs.length).toBe(1));
|
|
322
352
|
|
|
323
353
|
expect(zcode.runs.length).toBe(0);
|
|
324
|
-
//
|
|
325
|
-
|
|
326
|
-
expect(piEngine.runs.length).toBe(0);
|
|
354
|
+
// [W3] pi chat 路由 = registry 'pi' port(cli 形态替身)——显式 pi 请求命中它
|
|
355
|
+
expect(piEngine.runs.length).toBe(1);
|
|
327
356
|
const rec = service.queries.collectRecords(10, "running").find((r) => r.id === handle.subagentId);
|
|
328
357
|
expect(rec?.engine).toBeUndefined();
|
|
329
358
|
});
|
|
@@ -339,9 +368,11 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
339
368
|
.catch((e: unknown) => e);
|
|
340
369
|
expect(err).toBeInstanceOf(Error);
|
|
341
370
|
expect((err as Error).message).toContain("不支持 conversation");
|
|
342
|
-
// 恢复指引(EngineError.recovery
|
|
343
|
-
|
|
344
|
-
expect((err as { recovery?: string }).recovery).toContain("
|
|
371
|
+
// 恢复指引(EngineError.recovery):W3 协议化口径——调参数 / 修 manifest / 升级
|
|
372
|
+
// 引擎包(引擎包是能力声明载体;「改用 engine: pi」内置兜底指引已随协议化删除)
|
|
373
|
+
expect((err as { recovery?: string }).recovery).toContain("去掉 conversation 参数");
|
|
374
|
+
expect((err as { recovery?: string }).recovery).toContain("修 manifest capabilities");
|
|
375
|
+
expect((err as { recovery?: string }).recovery).toContain("升级引擎包");
|
|
345
376
|
expect(zcode.runs.length).toBe(0);
|
|
346
377
|
expect(service.queries.collectRecords(10, "all")).toHaveLength(0);
|
|
347
378
|
});
|
|
@@ -369,22 +400,24 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
369
400
|
expect(err).toBeInstanceOf(Error);
|
|
370
401
|
expect((err as Error).message).toContain("engine_capability_unsupported");
|
|
371
402
|
expect((err as Error).message).toContain("maxTurns");
|
|
372
|
-
|
|
403
|
+
// W3 协议化口径:恢复指引 = 去参数 / 修 manifest / 升级引擎包(不再指向 engine: pi)
|
|
404
|
+
expect((err as { recovery?: string }).recovery).toContain("去掉 maxTurns 参数");
|
|
405
|
+
expect((err as { recovery?: string }).recovery).toContain("修 manifest capabilities");
|
|
373
406
|
// 「不产生孤儿 record」断言落点(V4④):store 无新增条目、引擎未被触达
|
|
374
407
|
expect(zcode.runs.length).toBe(0);
|
|
375
408
|
expect(service.queries.collectRecords(10, "all")).toHaveLength(0);
|
|
376
409
|
});
|
|
377
410
|
|
|
378
411
|
it("[V4⑤ 反向] pi + maxTurns/fork/conversation/worktree → 零拦截(pi 既有合法能力无回归)", async () => {
|
|
379
|
-
const { service, zcode } = setup(agentDir);
|
|
380
|
-
// maxTurns=3(V4⑤ 场景原样):正常进入 pi 轮次(
|
|
412
|
+
const { service, piEngine, zcode } = setup(agentDir);
|
|
413
|
+
// maxTurns=3(V4⑤ 场景原样):正常进入 pi 轮次(engine.run 被调),无同步拒绝
|
|
381
414
|
const handle = await service.execute(baseOpts(agentDir, { maxTurns: 3 }));
|
|
382
|
-
await vi.waitFor(() => expect(
|
|
415
|
+
await vi.waitFor(() => expect(piEngine.runs.length).toBe(1));
|
|
383
416
|
expect(zcode.runs.length).toBe(0);
|
|
384
417
|
expect(service.queries.collectRecords(10, "running").find((r) => r.id === handle.subagentId)).toBeDefined();
|
|
385
|
-
// fork / conversation 组合同样直通(第二次
|
|
418
|
+
// fork / conversation 组合同样直通(第二次 run 被调,无 engine_capability_unsupported)
|
|
386
419
|
await service.execute(baseOpts(agentDir, { fork: true, conversation: true }));
|
|
387
|
-
await vi.waitFor(() => expect(
|
|
420
|
+
await vi.waitFor(() => expect(piEngine.runs.length).toBeGreaterThanOrEqual(2));
|
|
388
421
|
// pi + worktree:预检放行(caps.sandbox='emulated')——execute 不因能力被拒而
|
|
389
422
|
// reject(worktree 创建成败是另一维度,与拦截无关)
|
|
390
423
|
await expect(service.execute(baseOpts(agentDir, { worktree: true }))).resolves.toBeTypeOf("object");
|
|
@@ -475,7 +508,7 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
475
508
|
|
|
476
509
|
// 引擎经 RunContext.onChildSpawned 上报子进程 → 宿主记账(kill-chain 数据源)
|
|
477
510
|
zcode.runs[0].ctx.onChildSpawned?.(child);
|
|
478
|
-
expect(getChildByRecord(handle.subagentId)).toBe(child);
|
|
511
|
+
expect(coreSpawnedChildrenMirror().getChildByRecord(handle.subagentId)?.pid).toBe(child.pid);
|
|
479
512
|
|
|
480
513
|
// cancel → controller.abort → engine 收到的 signal aborted(kill-chain 两级的第一级)
|
|
481
514
|
expect(zcode.runs[0].ctx.signal?.aborted).toBe(false);
|
|
@@ -483,7 +516,8 @@ describe("chat 工具域引擎路由分叉(U0:D4/D5/D10)", () => {
|
|
|
483
516
|
expect(zcode.runs[0].ctx.signal?.aborted).toBe(true);
|
|
484
517
|
// 子进程退出后记账按句移除
|
|
485
518
|
child.emit("close", 0, null);
|
|
486
|
-
|
|
519
|
+
// 按句移除断言(W10 注):inproc 双模不回灌 childStateChanged,镜像移除由
|
|
520
|
+
// protocol-blackbox 承载(同 subprocess-agent-runner-routing D10 注)。
|
|
487
521
|
});
|
|
488
522
|
});
|
|
489
523
|
|
|
@@ -507,15 +541,15 @@ describe("chat 引擎分支 U2:probe 兜底 / journal / engineHandle", () => {
|
|
|
507
541
|
vi.clearAllMocks();
|
|
508
542
|
});
|
|
509
543
|
|
|
510
|
-
it("[兜底] 默认路由 zcode + probe 失败 → 回退 pi
|
|
544
|
+
it("[兜底] 默认路由 zcode + probe 失败 → 回退 pi 协议 run + engineFallback 留痕", async () => {
|
|
511
545
|
writeGlobalConfig(agentDir, "zcode");
|
|
512
546
|
const { service, zcode, piEngine } = setup(agentDir);
|
|
513
547
|
zcode.probeFailed = true;
|
|
514
548
|
|
|
515
549
|
const handle = await service.execute(baseOpts(agentDir));
|
|
516
|
-
// 兜底 = 走 pi
|
|
517
|
-
await vi.waitFor(() => expect(
|
|
518
|
-
expect(
|
|
550
|
+
// 兜底 = 走 pi 协议 run 路径(engine.run 被调;[W3] pi 与 run 域同路)
|
|
551
|
+
await vi.waitFor(() => expect(piEngine.runs.length).toBe(1));
|
|
552
|
+
expect(mockSpawn).not.toHaveBeenCalled();
|
|
519
553
|
|
|
520
554
|
const rec = service.queries.collectRecords(10, "running").find((r) => r.id === handle.subagentId);
|
|
521
555
|
expect(rec?.engine).toBe("pi");
|
|
@@ -668,9 +702,9 @@ describe("chat 引擎分支 U2:probe 兜底 / journal / engineHandle", () => {
|
|
|
668
702
|
});
|
|
669
703
|
|
|
670
704
|
it("[D5 回归] pi 纯缺省路径 entry 不含 engine/engineFallback/engineHandle 键", async () => {
|
|
671
|
-
const { service, pi } = setup(agentDir);
|
|
705
|
+
const { service, piEngine, pi } = setup(agentDir);
|
|
672
706
|
const handle = await service.execute(baseOpts(agentDir));
|
|
673
|
-
await vi.waitFor(() => expect(
|
|
707
|
+
await vi.waitFor(() => expect(piEngine.runs.length).toBe(1));
|
|
674
708
|
|
|
675
709
|
const rec = service.queries.collectRecords(10, "running").find((r) => r.id === handle.subagentId);
|
|
676
710
|
const entryJson = JSON.stringify(toSubagentRecordEntry(rec!));
|