@zhushanwen/subagent-core 0.6.0 → 0.7.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/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
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// src/execution/round-supervisor/service-binding.ts
|
|
2
|
+
//
|
|
3
|
+
// [W4] SubagentService 与轮次活性监督器 / 注册对账 sweep 的装配绑定面。
|
|
4
|
+
//
|
|
5
|
+
// 从 subagent-service.ts 抽出(max-lines 纪律——监督器 deps 装配 + giveUp 编排 +
|
|
6
|
+
// sweep 挂点是纯绑定代码,内聚为一个文件;机制与语义注释见 supervisor.ts /
|
|
7
|
+
// reconcile-sweep.ts / domain.ts)。变化轴:改监督器通知文案 / giveUp 终态化编排 /
|
|
8
|
+
// sweep 的 store 读侧判据,只动本文件。
|
|
9
|
+
//
|
|
10
|
+
// 全部依赖经 RoundSupervisorBinding 惰性闭包注入(session 级状态运行时可变——
|
|
11
|
+
// 对齐 notify-host.ts createNotifyHost 的 deps 惰性求值先例)。
|
|
12
|
+
|
|
13
|
+
import { bestEffort } from "../best-effort.ts";
|
|
14
|
+
import { COLD_LOOKUP_SCAN_LIMIT } from "../cold-resurrect.ts";
|
|
15
|
+
import { tryTransition } from "../execution-record.ts";
|
|
16
|
+
import { writeFinalized } from "../finalized-marker.ts";
|
|
17
|
+
import { hasLiveProcessHandle } from "../lifecycle-predicates.ts";
|
|
18
|
+
import { FileRunStore } from "../../orchestration/file-run-store.ts";
|
|
19
|
+
import { resolvePiWorkflowStateDir } from "../workflow-state-root.ts";
|
|
20
|
+
import type { PiLike } from "../notify-host.ts";
|
|
21
|
+
import type { RecordStore } from "../record-store.ts";
|
|
22
|
+
import type { AgentResult, ExecutionRecord } from "../types.ts";
|
|
23
|
+
import {
|
|
24
|
+
RoundSupervisor,
|
|
25
|
+
runReconcileSweep,
|
|
26
|
+
type GiveUpKind,
|
|
27
|
+
type SupervisorCandidateRecord,
|
|
28
|
+
type SupervisorRecordView,
|
|
29
|
+
} from "./index.ts";
|
|
30
|
+
|
|
31
|
+
/** 绑定面(SubagentService 供给;全部惰性——见文件头注)。 */
|
|
32
|
+
export interface RoundSupervisorBinding {
|
|
33
|
+
getStore(): RecordStore;
|
|
34
|
+
getPi(): PiLike | null;
|
|
35
|
+
/** 所属根 session id(候选过滤;未初始化时 null)。 */
|
|
36
|
+
getSessionRootId(): string | null;
|
|
37
|
+
/** 主 session 文件(sweep 差集输入源;未 flush/未知时 undefined = 空跑)。 */
|
|
38
|
+
getMainSessionFile(): string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* record 终态化委托(service.finalizeRecord——注销合法发射点①的宿主路径)。
|
|
41
|
+
* 监督器 giveUp 的内存 record 分支消费;CAS 防双收尾由本文件 giveUp 先 tryTransition。
|
|
42
|
+
*/
|
|
43
|
+
finalizeClosed(record: ExecutionRecord, result: AgentResult): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** 监督器通知出口(决策指引 / 终止 / 替代通知统一走 steer——唤醒主 agent 的注意力
|
|
47
|
+
* 而非自动复活任务;pi 缺席(dispose 后)静默丢弃,对齐 notify-host 语义)。 */
|
|
48
|
+
function supervisorNotify(binding: RoundSupervisorBinding, content: string): void {
|
|
49
|
+
binding.getPi()?.sendMessage(
|
|
50
|
+
{ customType: "subagent-round-supervisor", content, display: false },
|
|
51
|
+
{ deliverAs: "steer" },
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** record 视图(内存 getMutable 优先,磁盘 findLightById 兜底——boot 重认领面对的
|
|
56
|
+
* 存量 record 只在磁盘:重启后内存 records Map 为空)。 */
|
|
57
|
+
function supervisorRecordView(binding: RoundSupervisorBinding, id: string): SupervisorRecordView | undefined {
|
|
58
|
+
const memory = binding.getStore().getMutable(id);
|
|
59
|
+
if (memory !== undefined) {
|
|
60
|
+
return {
|
|
61
|
+
id: memory.id,
|
|
62
|
+
status: memory.status === "closed" ? "closed" : "running",
|
|
63
|
+
resumable: memory.resumable === true,
|
|
64
|
+
hasResult: memory.result !== undefined,
|
|
65
|
+
chatMode: memory.chatMode === true,
|
|
66
|
+
rootSessionId: memory.rootSessionId,
|
|
67
|
+
agent: memory.agent,
|
|
68
|
+
slug: memory.slug,
|
|
69
|
+
startedAt: memory.startedAt,
|
|
70
|
+
closedReason: memory.closedReason,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const disk = binding.getStore().findLightById(id);
|
|
74
|
+
if (disk === undefined) return undefined;
|
|
75
|
+
return {
|
|
76
|
+
id: disk.id,
|
|
77
|
+
status: disk.status === "closed" ? "closed" : "running",
|
|
78
|
+
resumable: disk.resumable === true,
|
|
79
|
+
hasResult: disk.result !== undefined,
|
|
80
|
+
chatMode: disk.chatMode === true,
|
|
81
|
+
rootSessionId: disk.rootSessionId,
|
|
82
|
+
agent: disk.agent,
|
|
83
|
+
slug: disk.slug,
|
|
84
|
+
startedAt: disk.startedAt,
|
|
85
|
+
closedReason: disk.closedReason,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** 本 root session 的 running record 候选(内存 ∪ 磁盘重建投影)。 */
|
|
90
|
+
function supervisorCandidates(binding: RoundSupervisorBinding): SupervisorCandidateRecord[] {
|
|
91
|
+
const rootFilter = binding.getSessionRootId() ?? undefined;
|
|
92
|
+
return binding
|
|
93
|
+
.getStore()
|
|
94
|
+
.collectRecords(COLD_LOOKUP_SCAN_LIMIT, "running", rootFilter)
|
|
95
|
+
.map((r) => ({
|
|
96
|
+
id: r.id,
|
|
97
|
+
rootSessionId: r.rootSessionId,
|
|
98
|
+
agent: r.agent,
|
|
99
|
+
slug: r.slug,
|
|
100
|
+
startedAt: r.startedAt,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 监督器「该放弃 / superseded」执行(RoundSupervisorDeps.giveUp)。
|
|
106
|
+
* 形态分流:
|
|
107
|
+
* - 内存 record:CAS tryTransition → finalizeClosed(终态化 + 注销①发射 + worktree/
|
|
108
|
+
* manifest 收尾)——watchdog-expired 额外发终止通知(此时可重派);superseded 的
|
|
109
|
+
* 替代通知已由监督器先行发出。boot 直断不经本函数(孤儿恢复层直断 + in-flight
|
|
110
|
+
* 的重启中断 error 语义由 finalizeOrphanRecord 落位,见 supervisor.bootPartition 头注)。
|
|
111
|
+
* - 磁盘态(内存无 + findLightById 命中,boot 重认领后看门狗到期的形态):终态
|
|
112
|
+
* entry 落盘(reportSubagentRecord)+ finalized sidecar(best-effort,对齐孤儿
|
|
113
|
+
* 恢复形态)——不走 finalizeRecord(无内存 record,archive/CAS 不适用),其注销
|
|
114
|
+
* 由对账 sweep(发射点⑤「record 终态 → 差集补发」)收口。
|
|
115
|
+
*/
|
|
116
|
+
async function supervisorGiveUp(
|
|
117
|
+
binding: RoundSupervisorBinding,
|
|
118
|
+
recordId: string,
|
|
119
|
+
kind: GiveUpKind,
|
|
120
|
+
detail: { replacementId?: string },
|
|
121
|
+
): Promise<void> {
|
|
122
|
+
const store = binding.getStore();
|
|
123
|
+
const memory = store.getMutable(recordId);
|
|
124
|
+
const errorText =
|
|
125
|
+
kind === "watchdog-expired"
|
|
126
|
+
? "round supervisor: decision watchdog expired (guidance unanswered, no convergence) — task terminated; safe to re-dispatch"
|
|
127
|
+
: `round supervisor: superseded by replacement task ${detail.replacementId ?? "(unknown)"}`;
|
|
128
|
+
if (memory !== undefined) {
|
|
129
|
+
const failedResult: AgentResult = {
|
|
130
|
+
text: "",
|
|
131
|
+
turns: memory.turnCount,
|
|
132
|
+
durationMs: Date.now() - memory.startedAt,
|
|
133
|
+
success: false,
|
|
134
|
+
error: errorText,
|
|
135
|
+
sessionId: memory.id,
|
|
136
|
+
toolCalls: [],
|
|
137
|
+
};
|
|
138
|
+
// CAS 抢锁防与 cancel/dispose 双收尾;抢锁失败 = 对方已终态化,收尾跳过。
|
|
139
|
+
if (!tryTransitionClosed(memory)) return;
|
|
140
|
+
try {
|
|
141
|
+
await binding.finalizeClosed(memory, failedResult);
|
|
142
|
+
} catch (err) {
|
|
143
|
+
bestEffort(err, `round supervisor give-up finalize (${recordId})`, "error");
|
|
144
|
+
}
|
|
145
|
+
if (kind === "watchdog-expired") {
|
|
146
|
+
const view = supervisorRecordView(binding, recordId);
|
|
147
|
+
if (view !== undefined) {
|
|
148
|
+
supervisorNotify(
|
|
149
|
+
binding,
|
|
150
|
+
`Subagent "${view.agent}" (${view.slug || recordId}) was terminated after the decision watchdog ` +
|
|
151
|
+
`expired without your decision. It is now closed — you can safely re-dispatch the task if still needed.`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// 磁盘态分支(boot 重认领后的放弃——record 不在内存)。
|
|
158
|
+
const disk = store.findLightById(recordId);
|
|
159
|
+
if (disk === undefined) return;
|
|
160
|
+
if (disk.sessionFile) {
|
|
161
|
+
try {
|
|
162
|
+
writeFinalized(disk.sessionFile, "gc");
|
|
163
|
+
} catch (err) {
|
|
164
|
+
bestEffort(err, `round supervisor give-up sidecar (${recordId})`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
store.reportSubagentRecord({
|
|
169
|
+
...disk,
|
|
170
|
+
status: "closed",
|
|
171
|
+
closedReason: "gc",
|
|
172
|
+
endedAt: Date.now(),
|
|
173
|
+
error: errorText,
|
|
174
|
+
});
|
|
175
|
+
} catch (err) {
|
|
176
|
+
bestEffort(err, `round supervisor give-up entry (${recordId})`, "error");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** tryTransition closed+gc 的本地命名(CAS 语义见 execution-record.ts)。 */
|
|
181
|
+
function tryTransitionClosed(record: ExecutionRecord): boolean {
|
|
182
|
+
return tryTransition(record, "closed", "gc");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** 装配监督器实例(SubagentService.roundSupervisor 字段的工厂)。 */
|
|
186
|
+
export function createRoundSupervisorForService(binding: RoundSupervisorBinding): RoundSupervisor {
|
|
187
|
+
return new RoundSupervisor({
|
|
188
|
+
now: () => Date.now(),
|
|
189
|
+
getRecordView: (id) => supervisorRecordView(binding, id),
|
|
190
|
+
listCandidateRecords: () => supervisorCandidates(binding),
|
|
191
|
+
hasLiveProcess: (recordId) => hasLiveProcessHandle(recordId),
|
|
192
|
+
sendMergedFailureNotice: (view, errMsg) =>
|
|
193
|
+
supervisorNotify(
|
|
194
|
+
binding,
|
|
195
|
+
`Subagent "${view.agent}" (${view.slug || view.id}) failed: the engine/child process driving it died ` +
|
|
196
|
+
`(${errMsg}). The task is NOT completed and stays resumable — this supervisor has taken over and will ` +
|
|
197
|
+
`deliver a resume/re-dispatch guidance shortly. Do NOT re-dispatch this task before that guidance arrives.`,
|
|
198
|
+
),
|
|
199
|
+
sendDecisionGuidance: (view, opts) =>
|
|
200
|
+
supervisorNotify(
|
|
201
|
+
binding,
|
|
202
|
+
`Subagent "${view.agent}" (${view.slug || view.id}, id=${view.id}) died mid-task and stays resumable. ` +
|
|
203
|
+
`Decide now: resume it by sending a message to id=${view.id}, or re-dispatch a replacement task. ` +
|
|
204
|
+
`If you take no action it will be terminated automatically when the decision watchdog expires.` +
|
|
205
|
+
(opts.exemptionDisclaimer
|
|
206
|
+
? ` If you have already re-dispatched or no longer need this task, ignore this guidance; ` +
|
|
207
|
+
`the original task will be terminated automatically when the watchdog expires.`
|
|
208
|
+
: ""),
|
|
209
|
+
),
|
|
210
|
+
sendReplacedNotice: (view, replacementId) =>
|
|
211
|
+
supervisorNotify(
|
|
212
|
+
binding,
|
|
213
|
+
`Subagent "${view.agent}" (${view.slug || view.id}, id=${view.id}) was already replaced by your new ` +
|
|
214
|
+
`task ${replacementId} (same agent/slug started within the watchdog window). The original record is ` +
|
|
215
|
+
`being terminated; no resume is needed.`,
|
|
216
|
+
),
|
|
217
|
+
giveUp: (recordId, kind, detail) => void supervisorGiveUp(binding, recordId, kind, detail),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* [W4] 注册对账 sweep(发射点枚举⑤):对「本 session register entry × 对应
|
|
223
|
+
* record/run ∈ 终态集 ∪ 已归档/不存在」差集补发 unregister——appendEntry 权威落盘 +
|
|
224
|
+
* 尽力 emit(写法论证见 reconcile-sweep.ts 头注)。[F2] 判据按类型分流:subagent 走
|
|
225
|
+
* RecordStore,workflow/畸形走 FileRunStore(findStateByIdSync),bash 无收口通道
|
|
226
|
+
* 保守跳过(显式偏差 impl-plan §5)。触发点 = initSession(session
|
|
227
|
+
* reattach / session_start / 监督器启动三时机的承载点,根进程 only——与孤儿恢复
|
|
228
|
+
* 同一单扫描者判据,isChildProcess 由调用方传)。与 registry rebuild 的先后时序
|
|
229
|
+
* 不作保证,残余窗口由下次 session_start 收口(设计明示容忍)。
|
|
230
|
+
*/
|
|
231
|
+
export function runPendingReconcileSweepForService(binding: RoundSupervisorBinding, isChildProcess: boolean): void {
|
|
232
|
+
if (isChildProcess) return;
|
|
233
|
+
try {
|
|
234
|
+
// [F2] workflow run 判据供给:FileRunStore 构造轻量(无 IO 副作用,lastSavedAt
|
|
235
|
+
// 空 Map——findStateByIdSync 同步只读不触碰节流记账),sweep 挂点低频
|
|
236
|
+
// (initSession),每轮构造一次闭包持有。
|
|
237
|
+
// [F-1 修复] stateDir 必须与 pi 壳 JsonlRunStore 的落盘布局同源
|
|
238
|
+
//(<sessionDir>/workflow-state/,推导 = resolvePiWorkflowStateDir);缺省根
|
|
239
|
+
// <dataRoot>/workflow-state 是 zcode 宿主布局,与 pi 生产落盘不相交——曾致
|
|
240
|
+
// findStateByIdSync 恒 missing → sweep 按终态补注销活跃 run(W4 引入的装配错位)。
|
|
241
|
+
const workflowStore = new FileRunStore({ stateDir: resolvePiWorkflowStateDir() });
|
|
242
|
+
runReconcileSweep({
|
|
243
|
+
sessionFile: binding.getMainSessionFile(),
|
|
244
|
+
lookupRecordState: (id) => {
|
|
245
|
+
const memory = binding.getStore().getMutable(id);
|
|
246
|
+
if (memory !== undefined) {
|
|
247
|
+
return memory.status === "closed"
|
|
248
|
+
? { terminal: true, closedReason: memory.closedReason }
|
|
249
|
+
: "active";
|
|
250
|
+
}
|
|
251
|
+
const disk = binding.getStore().findLightById(id);
|
|
252
|
+
if (disk === undefined) return "missing";
|
|
253
|
+
return disk.status === "closed"
|
|
254
|
+
? { terminal: true, closedReason: disk.closedReason }
|
|
255
|
+
: "active";
|
|
256
|
+
},
|
|
257
|
+
// [F2] type=workflow 及畸形条目的收口判据(设计 D2 sweep 判据补全——
|
|
258
|
+
// 「终态集 ∪ 已归档/不存在」对 workflow run 同样成立)。running 映射 active
|
|
259
|
+
// (含全行损坏的保守形态);done → terminal(reason 即 DoneReason,经
|
|
260
|
+
// closedReasonToPendingReason 未知值兜底);文件缺失 → missing。
|
|
261
|
+
lookupWorkflowRunState: (runId) => {
|
|
262
|
+
const state = workflowStore.findStateByIdSync(runId);
|
|
263
|
+
if (state.kind === "missing") return "missing";
|
|
264
|
+
if (state.kind === "terminal") return { terminal: true, closedReason: state.reason };
|
|
265
|
+
return "active";
|
|
266
|
+
},
|
|
267
|
+
appendEntry: (customType, data) => binding.getPi()?.appendEntry(customType, data),
|
|
268
|
+
emit: (channel, data) => binding.getPi()?.events.emit(channel, data),
|
|
269
|
+
});
|
|
270
|
+
} catch (err) {
|
|
271
|
+
bestEffort(err, "pending reconcile sweep", "error");
|
|
272
|
+
}
|
|
273
|
+
}
|