@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.
Files changed (309) hide show
  1. package/dist/{chunk-4KN4TTG7.js → chunk-43ONBFZX.js} +1 -1
  2. package/dist/{chunk-X7SZ5HLQ.js → chunk-V3VHZ2VX.js} +20 -27
  3. package/dist/execution/engine/engines/zcode/constants.cjs +29 -41
  4. package/dist/execution/engine/engines/zcode/constants.d.cts +65 -53
  5. package/dist/execution/engine/engines/zcode/constants.d.ts +65 -53
  6. package/dist/execution/engine/engines/zcode/constants.js +17 -27
  7. package/dist/execution/engine/engines/zcode/reader.d.cts +2 -1
  8. package/dist/execution/engine/engines/zcode/reader.d.ts +2 -1
  9. package/dist/execution/engine/engines/zcode/reader.js +2 -2
  10. package/dist/index.cjs +17100 -14082
  11. package/dist/index.d.cts +5336 -4033
  12. package/dist/index.d.ts +5336 -4033
  13. package/dist/index.js +17020 -14055
  14. package/dist/{types-DpUO16pj.d.cts → types-C3fE3R9x.d.cts} +280 -112
  15. package/dist/{types-DpUO16pj.d.ts → types-C3fE3R9x.d.ts} +280 -112
  16. package/dist.bundle/index.cjs +34933 -0
  17. package/package.json +3 -3
  18. package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +0 -1
  19. package/src/__tests__/append-system-prompt-assembly.test.ts +8 -7
  20. package/src/__tests__/fr4-get-state-handshake.test.ts +2 -2
  21. package/src/__tests__/m2-append-content-probe.test.ts +0 -1
  22. package/src/__tests__/manifest-store.test.ts +10 -9
  23. package/src/__tests__/record-store-cache.test.ts +0 -2
  24. package/src/__tests__/record-store-index.test.ts +1 -2
  25. package/src/__tests__/review-fix-loop-script.test.ts +4 -2
  26. package/src/__tests__/review-fix-loop-utils.test.ts +10 -10
  27. package/src/__tests__/robustness-low-batch1.test.ts +6 -5
  28. package/src/__tests__/robustness-medium-batch1.test.ts +2 -2
  29. package/src/__tests__/robustness-medium-batch2.test.ts +17 -6
  30. package/src/__tests__/robustness-medium-batch4.test.ts +2 -2
  31. package/src/__tests__/session-runner.test.ts +1 -1
  32. package/src/core/__tests__/host-services.test.ts +2 -2
  33. package/src/core/__tests__/logger.test.ts +1 -1
  34. package/src/core/error-message.ts +9 -0
  35. package/src/core/host-services.ts +21 -5
  36. package/src/core/notify-ports.ts +18 -5
  37. package/src/execution/__tests__/agent-profile.test.ts +4 -4
  38. package/src/execution/__tests__/agent-registry.test.ts +370 -0
  39. package/src/execution/__tests__/agent-result-mapper.test.ts +18 -2
  40. package/src/execution/__tests__/agents-assembly.test.ts +2 -2
  41. package/src/execution/__tests__/alive-store.test.ts +1 -1
  42. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
  43. package/src/execution/__tests__/chat-engine-routing.test.ts +68 -33
  44. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +4 -4
  45. package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
  46. package/src/execution/__tests__/collect-budget.test.ts +291 -0
  47. package/src/execution/__tests__/collect-coordinator-service.test.ts +327 -0
  48. package/src/execution/__tests__/collect-coordinator.test.ts +371 -0
  49. package/src/execution/__tests__/collect-mixed-dispatch.test.ts +262 -0
  50. package/src/execution/__tests__/config-collect-sync.test.ts +120 -0
  51. package/src/execution/__tests__/config.test.ts +1 -1
  52. package/src/execution/__tests__/delivery-methods.test.ts +75 -62
  53. package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
  54. package/src/execution/__tests__/descendant-sweep.test.ts +6 -6
  55. package/src/execution/__tests__/dialog-queue.test.ts +2 -2
  56. package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
  57. package/src/execution/__tests__/epipe-fallback.test.ts +29 -24
  58. package/src/execution/__tests__/execute-and-await-worktree.test.ts +21 -91
  59. package/src/execution/__tests__/execute-nesting.test.ts +34 -188
  60. package/src/execution/__tests__/execution-record.test.ts +217 -60
  61. package/src/execution/__tests__/execution-runtime-face.test.ts +5 -5
  62. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +4 -4
  63. package/src/execution/__tests__/finalize-record.test.ts +173 -17
  64. package/src/execution/__tests__/finalized-marker.test.ts +1 -1
  65. package/src/execution/__tests__/gc-timer.test.ts +56 -3
  66. package/src/execution/__tests__/get-record-for-action-restart.test.ts +12 -12
  67. package/src/execution/__tests__/get-state-handshake.test.ts +1 -1
  68. package/src/execution/__tests__/helpers/mock-extension-api.ts +1 -1
  69. package/src/execution/__tests__/helpers/session-runner-mocks.ts +113 -0
  70. package/src/execution/__tests__/helpers/spawn-mock.ts +150 -3
  71. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +137 -0
  72. package/src/execution/__tests__/keep-alive-no-progress.test.ts +50 -148
  73. package/src/execution/__tests__/kill-all-escalation.test.ts +2 -2
  74. package/src/execution/__tests__/lifecycle-predicates.test.ts +1 -2
  75. package/src/execution/__tests__/manifest-parentid.test.ts +4 -4
  76. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +1 -1
  77. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +1 -1
  78. package/src/execution/__tests__/model-resolver.test.ts +2 -2
  79. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +23 -121
  80. package/src/execution/__tests__/nested-visibility.test.ts +2 -0
  81. package/src/execution/__tests__/notify-batch.test.ts +500 -0
  82. package/src/execution/__tests__/notify-ledger.test.ts +1000 -18
  83. package/src/execution/__tests__/output-collector.test.ts +117 -6
  84. package/src/execution/__tests__/pi-invocation.test.ts +36 -4
  85. package/src/execution/__tests__/record-entry-collect.test.ts +102 -0
  86. package/src/execution/__tests__/record-store.test.ts +10 -9
  87. package/src/execution/__tests__/records-cwd-isolation.test.ts +2 -2
  88. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +29 -132
  89. package/src/execution/__tests__/recursive-visibility-env.test.ts +55 -179
  90. package/src/execution/__tests__/relay-env.test.ts +12 -1
  91. package/src/execution/__tests__/rpc-mode.test.ts +2 -2
  92. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +387 -0
  93. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +15 -9
  94. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +4 -4
  95. package/src/execution/__tests__/run-spawn-edges.test.ts +17 -15
  96. package/src/execution/__tests__/run-spawn-integration.test.ts +2 -2
  97. package/src/execution/__tests__/run-spawn-resume.test.ts +2 -2
  98. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +2 -2
  99. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +4 -4
  100. package/src/execution/__tests__/service-kill-escalation.test.ts +7 -5
  101. package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
  102. package/src/execution/__tests__/session-file-gc.test.ts +36 -1
  103. package/src/execution/__tests__/session-pending.test.ts +257 -14
  104. package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
  105. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +1 -1
  106. package/src/execution/__tests__/session-runner-close-prune.test.ts +2 -2
  107. package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
  108. package/src/execution/__tests__/session-runner-epipe.test.ts +3 -3
  109. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +5 -4
  110. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +290 -0
  111. package/src/execution/__tests__/session-runner-schema-env.test.ts +7 -5
  112. package/src/execution/__tests__/settled-watchdog.test.ts +282 -47
  113. package/src/execution/__tests__/spawn-args.test.ts +11 -10
  114. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +26 -23
  115. package/src/execution/__tests__/spawn-event-adapter.test.ts +3 -3
  116. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
  117. package/src/execution/__tests__/spawned-children.test.ts +2 -1
  118. package/src/execution/__tests__/start-collect-guard.test.ts +255 -0
  119. package/src/execution/__tests__/start-sync-model-guard.test.ts +5 -5
  120. package/src/execution/__tests__/stdin-writer.test.ts +6 -4
  121. package/src/execution/__tests__/stream-sink-retirement.test.ts +6 -6
  122. package/src/execution/__tests__/subagent-actions-core.test.ts +48 -22
  123. package/src/execution/__tests__/subagent-service-message-close.test.ts +29 -26
  124. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +21 -8
  125. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +27 -22
  126. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +30 -29
  127. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +45 -20
  128. package/src/execution/__tests__/subagent-service.test.ts +37 -30
  129. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +88 -12
  130. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +75 -0
  131. package/src/execution/__tests__/subprocess-agent-runner.test.ts +22 -20
  132. package/src/execution/__tests__/sync-collect-recovery.test.ts +1117 -0
  133. package/src/execution/__tests__/temp-prompt.test.ts +1 -1
  134. package/src/execution/__tests__/timeout-integration.test.ts +6 -5
  135. package/src/execution/__tests__/tombstone-store.test.ts +1 -1
  136. package/src/execution/__tests__/turn-limiter-semantics.test.ts +1 -1
  137. package/src/execution/__tests__/turn-limiter.test.ts +1 -1
  138. package/src/execution/__tests__/ui-request-handler-factory.test.ts +12 -6
  139. package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
  140. package/src/execution/__tests__/ui-request-queue.test.ts +142 -2
  141. package/src/execution/__tests__/worktree-git-ops.test.ts +1 -1
  142. package/src/execution/__tests__/worktree-manager.test.ts +14 -5
  143. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +4 -3
  144. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +2 -2
  145. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +1 -1
  146. package/src/execution/__tests__/worktree-registry.test.ts +1 -1
  147. package/src/execution/agent-registry.ts +74 -30
  148. package/src/execution/agent-result-mapper.ts +3 -0
  149. package/src/execution/cold-resurrect.ts +199 -0
  150. package/src/execution/collect-coordinator.ts +200 -0
  151. package/src/execution/config.ts +77 -5
  152. package/src/execution/engine/__tests__/common/capability-gate.test.ts +91 -0
  153. package/src/execution/engine/__tests__/common/data-dir.test.ts +1 -1
  154. package/src/execution/engine/__tests__/common/event-journal.test.ts +1 -1
  155. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +84 -0
  156. package/src/execution/engine/__tests__/common/kill-chain.test.ts +34 -7
  157. package/src/execution/engine/__tests__/common/persona-router.test.ts +4 -5
  158. package/src/execution/engine/__tests__/common/pool-manager.test.ts +213 -53
  159. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +149 -0
  160. package/src/execution/engine/__tests__/common/session-view-service.test.ts +499 -0
  161. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +22 -112
  162. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +15 -28
  163. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +1 -1
  164. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +12 -12
  165. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +2 -2
  166. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +21 -82
  167. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +4 -7
  168. package/src/execution/engine/__tests__/engine-discovery.test.ts +15 -3
  169. package/src/execution/engine/__tests__/model-prompt.test.ts +15 -3
  170. package/src/execution/engine/__tests__/registry.test.ts +4 -2
  171. package/src/execution/engine/__tests__/routing.test.ts +115 -6
  172. package/src/execution/engine/common/capability-gate.ts +92 -0
  173. package/src/execution/engine/common/journal-wiring.ts +97 -0
  174. package/src/execution/engine/common/kill-chain.ts +42 -10
  175. package/src/execution/engine/common/nesting-guard.ts +66 -0
  176. package/src/execution/engine/common/persona-router.ts +18 -8
  177. package/src/execution/engine/common/pool-manager.ts +332 -78
  178. package/src/execution/engine/common/session-view-service.ts +506 -0
  179. package/src/execution/engine/common/session-view-types.ts +125 -0
  180. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +174 -28
  181. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +257 -0
  182. package/src/execution/{argv-mirror.ts → engine/engines/pi/argv-mirror.ts} +43 -21
  183. package/src/execution/{get-state-handshake.ts → engine/engines/pi/get-state-handshake.ts} +1 -1
  184. package/src/execution/{output-collector.ts → engine/engines/pi/output-collector.ts} +108 -19
  185. package/src/execution/engine/engines/pi/pi-engine.ts +434 -38
  186. package/src/execution/{pi-invocation.ts → engine/engines/pi/pi-invocation.ts} +2 -2
  187. package/src/execution/engine/engines/pi/reader.ts +11 -0
  188. package/src/execution/engine/engines/pi/registration.ts +4 -2
  189. package/src/execution/{session-runner.ts → engine/engines/pi/session-runner.ts} +617 -412
  190. package/src/execution/{spawn-event-adapter.ts → engine/engines/pi/spawn-event-adapter.ts} +75 -34
  191. package/src/execution/{stdin-writer.ts → engine/engines/pi/stdin-writer.ts} +10 -9
  192. package/src/execution/{temp-prompt.ts → engine/engines/pi/temp-prompt.ts} +2 -2
  193. package/src/execution/{turn-limiter.ts → engine/engines/pi/turn-limiter.ts} +1 -1
  194. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +54 -27
  195. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
  196. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +13 -12
  197. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +7 -210
  198. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +6 -110
  199. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +247 -0
  200. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +451 -0
  201. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +20 -8
  202. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +77 -110
  203. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +26 -320
  204. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +210 -0
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +353 -0
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +282 -0
  207. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +372 -0
  208. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +48 -148
  209. package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
  210. package/src/execution/engine/engines/zcode/connection.ts +24 -11
  211. package/src/execution/engine/engines/zcode/constants.ts +75 -71
  212. package/src/execution/engine/engines/zcode/golden-sample.ts +8 -46
  213. package/src/execution/engine/engines/zcode/parser.ts +12 -346
  214. package/src/execution/engine/engines/zcode/preparer.ts +12 -143
  215. package/src/execution/engine/engines/zcode/session-channel.ts +351 -39
  216. package/src/execution/engine/engines/zcode/zcode-engine.ts +665 -760
  217. package/src/execution/engine/host-task-spec.ts +32 -36
  218. package/src/execution/engine/model-validation.ts +177 -0
  219. package/src/execution/engine/port.ts +24 -6
  220. package/src/execution/engine/routing.ts +75 -1
  221. package/src/execution/engine/types.ts +30 -103
  222. package/src/execution/execution-record.ts +229 -144
  223. package/src/execution/finalize-record.ts +141 -99
  224. package/src/execution/idle-gc.ts +28 -0
  225. package/src/execution/lifecycle-predicates.ts +1 -1
  226. package/src/execution/notifier.ts +234 -25
  227. package/src/execution/notify-host.ts +232 -0
  228. package/src/execution/record-entry.ts +16 -0
  229. package/src/execution/record-store.ts +280 -103
  230. package/src/execution/round-settlement.ts +93 -0
  231. package/src/execution/session-file-gc.ts +96 -62
  232. package/src/execution/session-reconstructor.ts +256 -143
  233. package/src/execution/sessions-index.ts +117 -47
  234. package/src/execution/settled-watchdog.ts +264 -52
  235. package/src/execution/subagent-actions-core.ts +84 -28
  236. package/src/execution/subagent-service.ts +1225 -964
  237. package/src/execution/subprocess-agent-runner.ts +144 -97
  238. package/src/execution/sync-rebuild.ts +87 -0
  239. package/src/execution/types.ts +72 -0
  240. package/src/execution/ui-request-handler-factory.ts +102 -74
  241. package/src/execution/ui-request-queue.ts +50 -19
  242. package/src/index.ts +442 -316
  243. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +1 -1
  244. package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
  245. package/src/orchestration/__tests__/args-validator.test.ts +14 -0
  246. package/src/orchestration/__tests__/config-loader.test.ts +1 -1
  247. package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +1 -1
  248. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +11 -9
  249. package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
  250. package/src/orchestration/__tests__/file-run-store-prune.test.ts +1 -1
  251. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +1 -1
  252. package/src/orchestration/__tests__/file-run-store.test.ts +7 -6
  253. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +2 -2
  254. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +1 -1
  255. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
  256. package/src/orchestration/__tests__/lifecycle.test.ts +7 -5
  257. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
  258. package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +1 -1
  259. package/src/orchestration/__tests__/run-snapshot.test.ts +8 -5
  260. package/src/orchestration/__tests__/script-generate.test.ts +5 -5
  261. package/src/orchestration/__tests__/script-lint.test.ts +17 -0
  262. package/src/orchestration/__tests__/skill-discovery.test.ts +2 -2
  263. package/src/orchestration/__tests__/test-mocks.ts +2 -0
  264. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +7 -6
  265. package/src/orchestration/__tests__/worker-message-pump-finalize-run.test.ts +229 -0
  266. package/src/orchestration/__tests__/{error-recovery-handlers.test.ts → worker-message-pump-handlers.test.ts} +27 -19
  267. package/src/orchestration/__tests__/{error-recovery-postmessage-defense.test.ts → worker-message-pump-postmessage-defense.test.ts} +8 -8
  268. package/src/orchestration/__tests__/{error-recovery-serialize-failed-result.test.ts → worker-message-pump-serialize-failed-result.test.ts} +2 -2
  269. package/src/orchestration/__tests__/{error-recovery-workflow-call.test.ts → worker-message-pump-workflow-call.test.ts} +1 -1
  270. package/src/orchestration/__tests__/worker-pending-timeout-abort.test.ts +1 -1
  271. package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
  272. package/src/orchestration/__tests__/workflow-files.test.ts +10 -10
  273. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
  274. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +1 -1
  275. package/src/orchestration/agent-opts-resolver.ts +1 -1
  276. package/src/orchestration/args-validator.ts +53 -31
  277. package/src/orchestration/execute-agent-call.ts +19 -73
  278. package/src/orchestration/launcher.ts +128 -81
  279. package/src/orchestration/lifecycle.ts +43 -45
  280. package/src/orchestration/models/ports.ts +4 -4
  281. package/src/orchestration/models/run-runtime.ts +2 -2
  282. package/src/orchestration/models/trace.ts +1 -1
  283. package/src/orchestration/models/types.ts +111 -22
  284. package/src/orchestration/models/workflow-run.ts +1 -1
  285. package/src/orchestration/script-lint.ts +91 -58
  286. package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +157 -150
  287. package/src/shared/__tests__/atomic-write.test.ts +1 -1
  288. package/src/shared/__tests__/meta-parser.test.ts +151 -0
  289. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +5 -5
  290. package/src/shared/__tests__/resource-discovery.test.ts +258 -215
  291. package/src/shared/atomic-write.ts +12 -9
  292. package/src/shared/meta-parser.ts +158 -84
  293. package/src/shared/model-ref.ts +15 -2
  294. package/src/shared/resource-discovery.ts +9 -183
  295. package/src/shared/schema-jsonify.ts +1 -1
  296. package/workflows/review-fix-loop-utils.cjs +151 -89
  297. package/workflows/review-fix-loop-utils.d.cts +287 -0
  298. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  299. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  300. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  301. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  302. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  303. package/src/execution/engine/engines/zcode/__tests__/preparer-appserver.test.ts +0 -387
  304. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -710
  305. package/src/execution/engine/engines/zcode/appserver-home.ts +0 -442
  306. package/src/execution/engine/engines/zcode/appserver-probe.ts +0 -141
  307. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  308. package/src/execution/execute-options-mapper.ts +0 -115
  309. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
@@ -1,15 +1,15 @@
1
- // zcode-engine-appserver.test.ts —— [R4] 引擎接线测试:全部跑 __fixtures__/
2
- // fake-appserver.mjs 子进程(scenario 注入),绝不 spawn 真 zcode.cjs。覆盖:
3
- // 模式分派骨架 / 事件时序前移(text_delta 流式 + 终态 message_end/turn_end +
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 透传 / 常驻 HOME 锚定(poolKey='home-appserver' + allProviders
6
- // config + fake 侧 HOME/env 断言)/ onHandleReady 回调时点(create 应答后)与
7
- // onPoolResolved 时点(prepare 期,先于首事件)/ abort 链 D3(stop 帧先发 → stop
8
- // 优雅生效不杀进程 / stop 无效 grace 耗尽 killChain 连坐)/ 凭据刷新(内容 hash
9
- // 不一致config 重写 + 连接重建)/ dispose(幂等 / close 帧先于 SIGTERM / dispose
10
- // 后 run 重建——不变量 4)/ 多会话并发不串线(RA3 地基,FAKE_STAMP_SESSION)/
11
- // -32603 Model config missing 错误归类 / capabilities 断言(eventGranularity 翻转
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, AgentTaskSpec } from "../../../types.ts";
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 { resolvePoolDir } from "../../../paths.ts";
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, pinnedZcodeMode, type ZcodeEngineDeps } from "../zcode-engine.ts";
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
- // [R5] 钉扎 appserver 定向(定向不探不降):本文件测常驻路径本体;缺省路径的
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<AgentTaskSpec>): AgentTaskSpec {
189
- return { task: "做点什么", slug: "s", model: `${PROVIDER}/m1`, ...overrides };
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=home-appserver,sessionRef 相对锚 HOME
273
- expect(handle.data.poolKey).toBe(ZCODE_APPSERVER_POOL_KEY);
274
- expect(handle.data.sessionRef).toEqual({ sessionId: GOLDEN_SESSION_ID, dbPath: ".zcode/cli/db/db.sqlite" });
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:${ZCODE_APPSERVER_POOL_KEY}`);
291
- expect(order[1]).toBe(`handle:${ZCODE_APPSERVER_POOL_KEY}:${GOLDEN_SESSION_ID}`);
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("常驻 HOME 锚定 + allProviders config + fake 侧 env/argv(HOME=池目录、遥测关、argv=app-server --cwd HOME)", async () => {
270
+ it("共享宿主 HOME:HOME 正向透传、遥测关、argv=app-server --cwd engineDataDir、无池 config/lockfile/pidfile、onChildSpawned 零调用", async () => {
296
271
  const { engine, stateFile, workspace } = makeEngine();
297
- const { handle } = await engine.run(makeTask({ cwd: workspace }), makeCtx());
298
- const homeDir = resolvePoolDir(dataDir, "zcode", ZCODE_APPSERVER_POOL_KEY);
299
- expect(handle.data.poolKey).toBe(ZCODE_APPSERVER_POOL_KEY);
300
- // 常驻 configallProviders(本测试源只有 test-provider 一个带 key 条目)
301
- const configPath = path.join(homeDir, ...ZCODE_POOL_CONFIG_SUFFIX);
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 envbase env 携带的宿主 HOME 值原样透传(buildAppServerEnv 不覆写
276
+ // HOME 键——launcher 同进程 import() 也不改 env)、遥测 false、统一嵌套标记
305
277
  const env = bootEnv(stateFile);
306
- expect(env["home"]).toBe(homeDir);
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", homeDir]);
311
- // 锁文件落 HOME
312
- expect(fs.existsSync(path.join(homeDir, "lockfile"))).toBe(true);
313
- // pidfile 已写(app-server 进程 pid——与 lockfile.pid 分离)
314
- const pidfile = JSON.parse(fs.readFileSync(path.join(homeDir, "appserver.pid"), "utf8")) as { pid: number };
315
- const lockfilePid = (JSON.parse(fs.readFileSync(path.join(homeDir, "lockfile"), "utf8")) as { pid: number }).pid;
316
- expect(typeof pidfile.pid).toBe("number");
317
- expect(pidfile.pid).not.toBe(lockfilePid); // D7 pid 归属分离:app-server pid ≠ 宿主 pid
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("effort → create 帧 thoughtLevel 透传(F15a:spec.effort 映射协议通道)", async () => {
315
+ it("thinkingLevel → create 帧 thoughtLevel 透传(F15a:task 声明映射协议通道)", async () => {
332
316
  const { engine, stateFile, workspace } = makeEngine();
333
- await engine.run(makeTask({ cwd: workspace, effort: "high" }), makeCtx());
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("effort 未传/空白 → create 帧无 thoughtLevel 键(A.2 ① strict 对象不设空键,防 -32602)", async () => {
322
+ it("thinkingLevel 未传/空白 → create 帧无 thoughtLevel 键(A.2 ① strict 对象不设空键,防 -32602)", async () => {
339
323
  const { engine, stateFile, workspace } = makeEngine();
340
- await engine.run(makeTask({ cwd: workspace, effort: " " }), makeCtx());
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("effort=medium(非常见档位)→ warn 一行提示且 thoughtLevel 键仍透传(RX2-F1:提示不拦截)", async () => {
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, effort: "medium" }), makeCtx());
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("effort=high(常见档位)→ 零 thoughtLevel 提示(RX2-F1:常见档位不出声)", async () => {
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, effort: "high" }), makeCtx());
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: ".zcode/cli/db/db.sqlite" });
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:${ZCODE_APPSERVER_POOL_KEY}`, "event:error"]);
586
- expect(handle.data.poolKey).toBe(ZCODE_APPSERVER_POOL_KEY);
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
- // 凭据刷新(D7:内容 hash 不一致 → config 重写 + 连接重建)
585
+ // 连接复用(共享宿主 HOME:无凭据刷新机制——登录态轮换后常驻连接用旧凭据,
586
+ // 引擎进程重启才生效;跨任务连接复用本身仍是 D1 不变量)
602
587
  // ============================================================
603
588
 
604
- describe("凭据刷新", () => {
605
- it("同内容源:第二任务复用连接(boot 1)+ config 不重写", async () => {
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("appserver 路径声明 eventGranularity='stream',其余能力位与 spawn 钉扎测试一致", () => {
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