@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
package/dist/index.d.cts
CHANGED
|
@@ -1,50 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { E as EnginePort, D as DiscoverEnginesOptions, a as ExecutionRecord, C as ClosedReason, b as ExecutionOutcome, A as AgentEventLogEntry, c as ExecutionStatus, P as ProjectedOutcome, R as RecordSnapshot, S as SubagentRecord, d as ExecuteOptions, e as SubagentStream, f as AgentResult, g as AgentResult$1, h as SubagentsGlobalConfig, M as ModelRegistryLike, i as ModelInfo, j as AgentConfig, k as ResolvedModel, l as StreamSink, m as ExecutionHandle, n as ExecutionMode, o as PatchResult, p as AgentCallOpts, q as ExecutionTraceNode, T as TracePatch, r as RunStatus, s as DoneReason, W as WorkerLogEntry, t as DisplayItem, u as CancelResponse, v as CloseResponse, F as ForkFromResponse, L as ListResponse, w as MessageResponse, B as BgResponse, x as ExternalState, y as SubagentListItem, z as DiscoveryRoot } from './engine-discovery-scan-ocpM8FmI.cjs';
|
|
2
|
+
export { G as CLOSED_REASONS, H as CoreLogger, I as DEFAULT_AGENT_NAME, J as DEFAULT_DATA_ROOT, K as DEFAULT_ENGINE_ID, N as DirtyWorktreeError, O as EngineHandle, Q as EngineRunResult, U as ForkDepthExceededError, V as HostServices, X as LogLevel, Y as ResurrectDeniedError, Z as RunContext, _ as SLUG_MAX_LENGTH, $ as SubagentToolResult, a0 as configureCore, a1 as getHostServices, a2 as getLogger, a3 as normalizeEngineId } from './engine-discovery-scan-ocpM8FmI.cjs';
|
|
3
|
+
import { ProbeReport, SessionView, ToolCall, UiRequest, UiRequestHandler, UiResponse, AgentEvent, UiChannelRegistry, WorktreeHandle, AgentOutcomeUsage } from '@zhushanwen/subagent-engine-sdk';
|
|
4
|
+
export { AgentEvent, AgentOutcome, ChannelHandler, EngineCapabilities, EngineHandleData, InteractAction, InteractResult, ProbeReport, ReplayedTurn, SessionView, ToolCallEntry, UiChannelRegistry } from '@zhushanwen/subagent-engine-sdk';
|
|
4
5
|
import { Worker } from 'node:worker_threads';
|
|
5
|
-
|
|
6
|
+
import 'node:child_process';
|
|
6
7
|
import '@xyz-agent/extension-protocol';
|
|
7
8
|
|
|
8
9
|
/** thinking level 支持顺序(低→高)。spawn 侧 `:level` 后缀仅接受本白名单值。 */
|
|
9
10
|
declare const THINKING_ORDER: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
type LogLevel = "debug" | "warn" | "error";
|
|
13
|
-
/** core logger 接口。与 pi-extension-logger 的 ExtensionLogger 结构兼容——
|
|
14
|
-
* u0-log 批次替换是纯 import 源替换,调用面(方法名/参数序)逐文件等价。 */
|
|
15
|
-
interface CoreLogger {
|
|
16
|
-
debug(msg: string, data?: unknown): void;
|
|
17
|
-
warn(msg: string, data?: unknown): void;
|
|
18
|
-
error(msg: string, data?: unknown): void;
|
|
19
|
-
}
|
|
20
|
-
declare function getLogger(component: string): CoreLogger;
|
|
21
|
-
|
|
22
|
-
/** 发现根条目:dir 为扫描根路径;source 是宿主提供的语义标签(遮蔽报告透传用)。
|
|
23
|
-
* source 不枚举封闭集——core 只透传不解释(宿主如 pi 壳用 user-pi/npm/npm-dev)。 */
|
|
24
|
-
interface DiscoveryRoot {
|
|
25
|
-
dir: string;
|
|
26
|
-
source: string;
|
|
27
|
-
}
|
|
28
|
-
interface HostServices {
|
|
29
|
-
/** 数据根目录:引擎隔离池 / journal / record 派生存放的锚点。
|
|
30
|
-
* pi 壳返回 getAgentDir()(独立 pi 用户 journal 不漂目录);zsw 壳返回 zsw 数据根。 */
|
|
31
|
-
dataRoot(): string;
|
|
32
|
-
/** 结构化日志:对齐现 getLogger 调用面(level/component/message/data)。缺省 sink 按级分化:
|
|
33
|
-
* warn/error 走 console、debug no-op(对齐 pi-extension-logger 语义,见 NULL_HOST.log)。 */
|
|
34
|
-
log(level: LogLevel, component: string, message: string, data?: unknown): void;
|
|
35
|
-
/** agent/skill/workflow 资源发现根(可选端口,缺席 = 调用方降级)。宿主只提供根列表
|
|
36
|
-
* (按优先级低→高);扫描 / 同名遮蔽(last-writer-wins)/ 遮蔽报告语义归 core 统一。 */
|
|
37
|
-
discoveryRoots?(): {
|
|
38
|
-
agents?: DiscoveryRoot[];
|
|
39
|
-
skills?: DiscoveryRoot[];
|
|
40
|
-
workflows?: DiscoveryRoot[];
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/** core 缺省数据根(~/.subagent-core,homedir 推导——禁止写死绝对路径,排查规则)。
|
|
44
|
-
* 供无自有数据根的轻宿主显式采用;core 自身不静默兜底到该值。 */
|
|
45
|
-
declare const DEFAULT_DATA_ROOT: string;
|
|
46
|
-
declare function configureCore(host: HostServices): void;
|
|
47
|
-
declare function getHostServices(): HostServices;
|
|
12
|
+
type ExtensionMode = "tui" | "rpc" | "json" | "print";
|
|
48
13
|
|
|
49
14
|
/** 投递意图(与 session-delivery 的 DeliveryIntent 字面量一致)。 */
|
|
50
15
|
type DeliveryIntent = "interrupt-at-turn-boundary" | "after-run";
|
|
@@ -118,229 +83,33 @@ interface DeliveryHandle {
|
|
|
118
83
|
/** 销毁(清队列 + 清 timer + 退订)。 */
|
|
119
84
|
dispose(): void;
|
|
120
85
|
}
|
|
86
|
+
/** countActiveFromEntries 的过滤选项([F1] 与 pending-notifications 的
|
|
87
|
+
* CountActiveOptions 对齐的子集——core 契约面只暴露跨 session 基准一个字段)。 */
|
|
88
|
+
interface CountActivePortOptions {
|
|
89
|
+
/**
|
|
90
|
+
* [W4 读侧过滤②] 跨 session 残留过滤基准:传入时端口实现按「register entry 的
|
|
91
|
+
* sessionId ≠ 基准 → 跳过」过滤——fork 继承的父级注册残留(翻 process 档后 U4
|
|
92
|
+
* 补注销不再中性化,永久留存于子 session 文件)不进差集。
|
|
93
|
+
* 缺省(undefined)= 不过滤(向后兼容:既有调用方零改动行为不变)。
|
|
94
|
+
*/
|
|
95
|
+
currentSessionId?: string;
|
|
96
|
+
}
|
|
121
97
|
interface NotifyDomainPorts {
|
|
122
98
|
/** pending 活跃计数(pi 会话 entries 中 register − unregister 差集的数值)。
|
|
123
99
|
* 契约为 number 而非 pi 侧 CountActiveResult:core 消费面只读 count,契约面最窄;
|
|
124
|
-
* pi 壳注入时拆 `countActiveFromEntries(entries).count`。
|
|
125
|
-
|
|
100
|
+
* pi 壳注入时拆 `countActiveFromEntries(entries).count`。
|
|
101
|
+
* [F1] 第二参为可选过滤基准(CountActivePortOptions)——core 消费方(后代判定
|
|
102
|
+
* 读侧)持有「被读 entries 所属 session」概念时必须传入,使跨 session 残留不进
|
|
103
|
+
* 差集;与 pending-notifications 实装签名(entries, opts?) 对齐。 */
|
|
104
|
+
countActiveFromEntries?(entries: unknown[], opts?: CountActivePortOptions): number;
|
|
126
105
|
/** 投递内核工厂。签名与 @xyz-agent/session-delivery 的 createDelivery 结构兼容,
|
|
127
106
|
* pi 壳直传其本体即可。缺席 = 消费方降级直发。 */
|
|
128
107
|
createDelivery?(port: DeliveryPort, options?: DeliveryConfig): DeliveryHandle;
|
|
129
108
|
}
|
|
130
109
|
declare function configureNotifyDomain(ports: NotifyDomainPorts): void;
|
|
131
110
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* subagent text_delta streaming sink。
|
|
136
|
-
*
|
|
137
|
-
* background subagent 执行期间,session-runner 的 agentEvent 出口把每个 text_delta
|
|
138
|
-
* 传到 SubagentStream.onDelta。本模块做 100ms 时间窗合并后,通过 StreamSink.setWidget
|
|
139
|
-
* 转发到 RPC stdout(经 ctx.ui.setWidget → extension_ui_request 通道)。
|
|
140
|
-
*
|
|
141
|
-
* SubagentStream 是一个生命周期对象——内聚 buffer/timer 状态 + onDelta/dispose 方法。
|
|
142
|
-
* 调用方(subagent-service)创建后只需在 text_delta 时调 onDelta、终态时调 dispose,
|
|
143
|
-
* 不需要拆散 push/clear 两个函数跨层透传。
|
|
144
|
-
*
|
|
145
|
-
* 设计要点:
|
|
146
|
-
* - leading edge:第一个 delta 立即 flush(前端尽快看到开始)
|
|
147
|
-
* - trailing edge:后续 delta 追加 buffer,timer 到期后 flush
|
|
148
|
-
* - 每次 flush 把 buffer 的累积文本 split("\n") 截尾 MAX_WIDGET_LINES 行传给 setWidget
|
|
149
|
-
* - dispose 清除 widget + 清 timer
|
|
150
|
-
*/
|
|
151
|
-
|
|
152
|
-
/** UI streaming sink 的最小接口(ctx.ui.setWidget 的 duck-typed 子集)。
|
|
153
|
-
*
|
|
154
|
-
* 当前只有一个 adapter(index.ts session_start 包装 ctx.ui.setWidget)。
|
|
155
|
-
* 保留接口而非裸函数类型,因为 StreamSink 的语义是「UI sink 契约」——
|
|
156
|
-
* 测试 mock 和未来可能的第二 sink(如写文件)都走此契约。 */
|
|
157
|
-
interface StreamSink {
|
|
158
|
-
setWidget(key: string, lines: string[] | undefined): void;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* subagent text_delta streaming 生命周期对象。
|
|
162
|
-
*
|
|
163
|
-
* 创建后:
|
|
164
|
-
* - `onDelta(delta)`:session-runner 每次 text_delta 调
|
|
165
|
-
* - `dispose()`:subagent 终态时调,清除 widget + 清 timer
|
|
166
|
-
*
|
|
167
|
-
* buffer/timer 状态全部内聚在此对象,调用方不需要关心合并逻辑。
|
|
168
|
-
*/
|
|
169
|
-
declare class SubagentStream {
|
|
170
|
-
private readonly widgetKey;
|
|
171
|
-
private readonly sink;
|
|
172
|
-
private buffer;
|
|
173
|
-
private timer;
|
|
174
|
-
private hasFlushed;
|
|
175
|
-
private disposed;
|
|
176
|
-
constructor(recordId: string, sink: StreamSink);
|
|
177
|
-
/** 接收一个 text_delta 增量。空串静默丢弃(不消耗 leading edge)。 */
|
|
178
|
-
onDelta(delta: string): void;
|
|
179
|
-
/** 终态清理:清除 widget + 清 timer(幂等)。 */
|
|
180
|
-
dispose(): void;
|
|
181
|
-
private flush;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* run 的运行期上下文。任务声明(AgentCallOpts,D6 合流后的单一形状)与运行期句柄
|
|
186
|
-
* 分离——signal/ctxModel/onComplete 从 ExecuteOptions 移出(设计 §3.3.5 删字段去向),
|
|
187
|
-
* 因为它们是宿主注入的运行期对象,不属于跨引擎持久化的任务声明。
|
|
188
|
-
*
|
|
189
|
-
* 常驻进程友好(D1):onEvent 回调式(而非迭代器式)+ AbortSignal——引擎内部换常驻
|
|
190
|
-
* server 实现(未来 driver host)时接口不动。
|
|
191
|
-
*/
|
|
192
|
-
interface RunContext {
|
|
193
|
-
/** = record.id(bg-N-xxx / run-N)——journal 文件名与池引用计数 key(P2 消费)。 */
|
|
194
|
-
taskId: string;
|
|
195
|
-
/** D5 隔离池(宿主分配,设计 §3.3.9;pi 无池化恒 'shared')。 */
|
|
196
|
-
poolKey: string;
|
|
197
|
-
/** abort 分级入口(D1:引擎原生中断 → 公共杀链兜底)。 */
|
|
198
|
-
signal?: AbortSignal;
|
|
199
|
-
/** 事件流出口(host 消费后统一落 journal,D6 第②级)。 */
|
|
200
|
-
onEvent?: (event: AgentEvent) => void;
|
|
201
|
-
/**
|
|
202
|
-
* model 解析第三层兜底(现有 D-008 语义不变)——**pi 链路专属兜底**:经
|
|
203
|
-
* taskSpecToExecuteOptions → resolveModel 第三层消费(PiEngine 直通)。自带
|
|
204
|
-
* provider 体系与缺省模型的引擎(如 zcode:requested > 引擎缺省常量链)按自身
|
|
205
|
-
* 默认链解析,不消费本字段(zcode 侧在「ctx 有模型但被忽略」时出声留痕,
|
|
206
|
-
* zcode-engine.warnIgnoredCtxModel)。
|
|
207
|
-
*/
|
|
208
|
-
ctxModel?: ModelInfo;
|
|
209
|
-
/**
|
|
210
|
-
* text_delta streaming 通道(宿主侧 UI widget)。与 onEvent 平行的 text_delta 出口:
|
|
211
|
-
* background 路径 onEvent=undefined 但流式仍需送达(双通道互斥设计,见 session-runner
|
|
212
|
-
* agentEvent 出口注释)。pi 回填期承载 AgentRunner port 的 stream 透传(行为零变化),
|
|
213
|
-
* 语义上是宿主设施而非引擎专有——未来引擎的 text_delta 同样可走此通道。
|
|
214
|
-
*/
|
|
215
|
-
stream?: SubagentStream;
|
|
216
|
-
/**
|
|
217
|
-
* [P1 pi 回填透传] 调用方已持有的 schema 激活预编码值(AgentCallOpts.schemaEnv 直传
|
|
218
|
-
* 形态)。生产路径中 resolveAgentOpts 恒耦合产出 schema+schemaEnv(值 = JSON.stringify
|
|
219
|
-
* (schema)),引擎从 task.schema 派生即可逐字节等值;解耦形态(有 schemaEnv 无
|
|
220
|
-
* schema)生产不可达、仅见于直构调用,派生无源——本字段是其唯一透交通道。
|
|
221
|
-
* 引擎在 task.schema 存在时忽略此值(派生优先,设计 §3.3.5 删字段去向)。
|
|
222
|
-
*/
|
|
223
|
-
schemaEnv?: string;
|
|
224
|
-
/**
|
|
225
|
-
* [P4 D9①] 引擎 fallback 留痕(probe 失败路由回默认引擎)。路由层(routing.ts)
|
|
226
|
-
* 产出,引擎投影到 outcome.engineFallback(zcode 等无 record 通路的引擎以此留痕;
|
|
227
|
-
* pi 引擎另经 ExecuteOptions 投影进 record)。
|
|
228
|
-
*/
|
|
229
|
-
engineFallback?: {
|
|
230
|
-
from: string;
|
|
231
|
-
reason: string;
|
|
232
|
-
};
|
|
233
|
-
/**
|
|
234
|
-
* [P4 对齐点③] 引擎声明实际隔离池 key(journal 落盘路径权威)。宿主创建 journal
|
|
235
|
-
* writer 时只能用缺省占位 poolKey(pi 恒 'shared'),非池化稳定的引擎(zcode 按
|
|
236
|
-
* provider+model 池化)在 prepare 期确定 poolKey 后回调本方法重定向 writer——
|
|
237
|
-
* 保证 journal 落盘路径与 handle.poolKey 同源(单一权威,不再两边推导)。
|
|
238
|
-
* 契约:必须在首个事件 emit 之前调用(zcode coarse 事件在终态后合成,天然满足;
|
|
239
|
-
* 未来流式引擎需在事件出口前调用)。
|
|
240
|
-
*/
|
|
241
|
-
onPoolResolved?: (poolKey: string) => void;
|
|
242
|
-
/**
|
|
243
|
-
* [R4 §3.4 不变量 3] 运行中句柄回填通道:引擎在「session/create 应答到达后」
|
|
244
|
-
* 立即回调(早于 run resolve——stream 引擎的 run 生命周期远长于会话建立)。
|
|
245
|
-
* 与 onPoolResolved 分立两个时点:poolKey 在 prepare 期(onPoolResolved,连接
|
|
246
|
-
* 建立前即可知),sessionRef 在 create 应答后(本回调)。编排层收到后立即回填
|
|
247
|
-
* record.engineHandle 并落 entry——运行中的 GUI 经 entry 重建 record 即拿到
|
|
248
|
-
* ①②级读取钥匙,不再等 run resolve 后的终态回填。可选回调:不支持运行中回填
|
|
249
|
-
* 的引擎(spawn 单轮、终态即回填)不调用,宿主语义不受影响。
|
|
250
|
-
*/
|
|
251
|
-
onHandleReady?: (partial: Pick<EngineHandleData, "sessionRef" | "poolKey">) => void;
|
|
252
|
-
/**
|
|
253
|
-
* [U0 D10] 引擎 spawn 的子进程句柄注册钩子(宿主终止链记账)。引擎在 spawn 成功后
|
|
254
|
-
* 同步回调(与 pi runSpawn 的 spawnedChildren.set 同构时机);宿主据此把 child 注册进
|
|
255
|
-
* session-runner 的 spawnedChildren Map(cancel SIGTERM / dispose 收割兜底 / killAll
|
|
256
|
-
* 全量清理对非 pi 引擎 record 生效)。close/error 后由宿主按句守卫移除。可选:引擎
|
|
257
|
-
* 内部不 spawn 进程(如未来常驻 driver host 实现)时不调用,宿主记账自然为空。
|
|
258
|
-
*
|
|
259
|
-
* 边界声明(R1 D6):本钩子只用于 per-record 一次性 spawn(一任务一进程模态)。
|
|
260
|
-
* 引擎持有的常驻进程(跨任务共享,如 app-server 常驻连接)不经本钩子注册、不进
|
|
261
|
-
* spawnedChildren Map——其生命周期完全归引擎 dispose 管理(防 per-record 重复
|
|
262
|
-
* SIGTERM / 单任务 abort 误杀共享进程)。
|
|
263
|
-
*/
|
|
264
|
-
onChildSpawned?: (child: ChildProcess) => void;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* run 的返回:终态 + 可持久化 handle。
|
|
268
|
-
*
|
|
269
|
-
* handle 语义(设计 §3.3.5 run 错误语义三条):prepare 期错误(credential_missing /
|
|
270
|
-
* model_not_available / prompt_too_large)在进程创建前 reject、不产生 handle;运行中
|
|
271
|
-
* 失败不 reject——合成 error outcome + 正常 handle 返回(record 必须收尾);abort 走
|
|
272
|
-
* 完杀链后同前(exitCode=null + error 含杀链标记)。
|
|
273
|
-
*/
|
|
274
|
-
interface EngineRunResult {
|
|
275
|
-
handle: EngineHandle;
|
|
276
|
-
outcome: AgentOutcome;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* subagent 执行引擎的唯一契约点(D1)。实现方:PiEngine(回填)/ ZcodeEngine(P3)/
|
|
280
|
-
* 未来各引擎适配器。上层(工具面/workflow 引擎/GUI)只消费中立类型,不感知引擎。
|
|
281
|
-
*
|
|
282
|
-
* 贯穿纪律(设计 §3.3.1):宿主编排——引擎只当单 agent 执行器,六家原生多 agent 机制
|
|
283
|
-
* 一律禁用不依赖。
|
|
284
|
-
*/
|
|
285
|
-
interface EnginePort {
|
|
286
|
-
/** 注册表 key('pi' | 'zcode' | ...)。 */
|
|
287
|
-
readonly id: string;
|
|
288
|
-
/** D3(同步无副作用——调用前拒绝的判据)。 */
|
|
289
|
-
capabilities(): EngineCapabilities;
|
|
290
|
-
/** D7(factory 初始化 + 版本变化检测触发;opts.force 跳过缓存强探)。 */
|
|
291
|
-
probe(opts?: {
|
|
292
|
-
force?: boolean;
|
|
293
|
-
}): Promise<ProbeReport>;
|
|
294
|
-
/** D1 主语义:fire-to-completion。[D6 合流] task = AgentCallOpts(单一任务形状,
|
|
295
|
-
* 原 AgentTaskSpec 已并入——字段裁定见 orchestration/models/types.ts)。 */
|
|
296
|
-
run(task: AgentCallOpts, ctx: RunContext): Promise<EngineRunResult>;
|
|
297
|
-
/**
|
|
298
|
-
* D1 可选面:交互控制面。pi 首期原生实现(现有 chatMode 行为直通);不支持
|
|
299
|
-
* conversation 的引擎返回 engine_capability_unsupported(同步拒绝、不创建进程)。
|
|
300
|
-
*/
|
|
301
|
-
interact(handle: EngineHandle, action: InteractAction): Promise<InteractResult>;
|
|
302
|
-
/** D6 三级降级链:①引擎原生读取 → ②宿主 event journal(P2)→ ③outcome-only。 */
|
|
303
|
-
read(handle: EngineHandle): Promise<SessionView>;
|
|
304
|
-
/**
|
|
305
|
-
* [U7] 可选面:模型可发现性——引擎自带 provider/model 体系时(如 zcode 的 v2 桌面
|
|
306
|
-
* 登录态),列出当前环境实际可用的模型清单(带凭据校验),供 system prompt 引擎段
|
|
307
|
-
* 与 GUI 引擎选择器消费。省略/返回 null = 「与主 agent 模型体系一致」(pi 的语义:
|
|
308
|
-
* system prompt 已有 <available_provider_models> 段,无需引擎再列)。
|
|
309
|
-
* engine-neutral:未来引擎(AcpEngine 等)实现本方法即自动获得注入与展示,宿主
|
|
310
|
-
* 侧零改动。
|
|
311
|
-
*/
|
|
312
|
-
listModels?(): Array<{
|
|
313
|
-
id: string;
|
|
314
|
-
name?: string;
|
|
315
|
-
}> | null;
|
|
316
|
-
/**
|
|
317
|
-
* [u-h2 D2-2] 可选面:派发同步期 model 校验(引擎 registry 单源裁决)。实现引擎复用其
|
|
318
|
-
* prepare 期同一校验函数(zcode: resolveZcodeModelRef——同一函数两处消费,canonicalRef
|
|
319
|
-
* 归一化与短名缺省 provider 决策不产生双实现漂移);校验失败同步 throw(编排层包装为
|
|
320
|
-
* 「引擎与模型不配套」错误,见 engine/model-validation.ts)。
|
|
321
|
-
*
|
|
322
|
-
* modelRef undefined = 查询引擎缺省模型(D2-1:主 agent 的 pi id 不透传给非 pi 引擎,
|
|
323
|
-
* 缺省语义归引擎——zcode 落 ZCODE_FALLBACK_DEFAULT_MODEL)。返回 canonical 全名供
|
|
324
|
-
* record.model 留痕。
|
|
325
|
-
*
|
|
326
|
-
* 未实现:model 透传,引擎自身 prepare 期校验兜底(现状语义);pi 不实现(pi 链走
|
|
327
|
-
* 既有三层解析 + assertCanonicalModelRef 裁决,搬迁是大重构,设计 D2-2 被否②)。
|
|
328
|
-
*/
|
|
329
|
-
validateModel?(modelRef: string | undefined): {
|
|
330
|
-
canonicalRef: string;
|
|
331
|
-
};
|
|
332
|
-
/**
|
|
333
|
-
* [R1 D6] 可选停机面:释放引擎持有的常驻资源(如 app-server 常驻进程 / 长连接)。
|
|
334
|
-
* 幂等契约(§3.4 不变量 4):重复调用无副作用;dispose 后首个 run 自动重建(与
|
|
335
|
-
* 「进程死后重建」同一代码路径)。可选成员保持向后兼容——无常驻资源的引擎(pi
|
|
336
|
-
* 现状 spawn 单轮)不必实现。等待策略(D6①「触发不等待」):宿主收割入口
|
|
337
|
-
* (registry disposeEngines → killAllSpawnedChildren)只同步调用拿 Promise 不
|
|
338
|
-
* await,引擎实现须自行保证同步面(立即 fire close 帧 + 同步 SIGTERM)在返回
|
|
339
|
-
* Promise 前完成;grace→SIGKILL 升级序列属异步面(promise 段)。
|
|
340
|
-
*/
|
|
341
|
-
dispose?(): Promise<void>;
|
|
342
|
-
}
|
|
343
|
-
|
|
111
|
+
/** 宿主接线:登记补扫发现参数(与发现扫描同源;重复登记覆盖,幂等)。 */
|
|
112
|
+
declare function setEngineDiscoveryRescanOptions(opts: DiscoverEnginesOptions): void;
|
|
344
113
|
/** 三层路由的输入(各层值由调用方装配;undefined = 该层不指定)。 */
|
|
345
114
|
interface EngineRoutingInput {
|
|
346
115
|
/** 第一层:调用参数 engine(workflow step 级 / AgentCallOpts.engine)。 */
|
|
@@ -376,6 +145,12 @@ interface EngineRouteOptions {
|
|
|
376
145
|
hasEngineFn?: (engineId: string) => boolean;
|
|
377
146
|
/** 注册表清单(缺省 registry.listEngines——engine_not_found 文案的数据源)。 */
|
|
378
147
|
listEnginesFn?: () => string[];
|
|
148
|
+
/**
|
|
149
|
+
* 可用引擎清单(D4 回落目标序:manifest displayName 稳定序;缺省
|
|
150
|
+
* registry.listEnginesByDisplayName)。清单内 id 即视为可用(发现且已注册)——
|
|
151
|
+
* 调用方负责排序口径;routeEngine 按序取第一个 ≠ 请求引擎的 id 作回落目标。
|
|
152
|
+
*/
|
|
153
|
+
listAvailableEnginesFn?: () => string[];
|
|
379
154
|
}
|
|
380
155
|
interface EngineRouteResult {
|
|
381
156
|
engine: EnginePort;
|
|
@@ -395,1332 +170,875 @@ interface EngineRouteResult {
|
|
|
395
170
|
* 路由 + 探针 + fallback 编排(SAR run 入口调用)。
|
|
396
171
|
*
|
|
397
172
|
* 失败形态(全部抛结构化错误,调用方转 AgentResult.error):
|
|
398
|
-
* - 未注册 id
|
|
173
|
+
* - 未注册 id(call/frontmatter 层):EngineNotFoundError(engine_not_found)
|
|
174
|
+
* - default 层缺省引擎不在清单且无任何可用引擎:EngineNotFoundError
|
|
175
|
+
* (「未发现任何引擎包」+ 安装指引,D4)
|
|
399
176
|
* - strict 或守卫命中:EngineError(engine_probe_failed)
|
|
400
177
|
* - 守卫 c(显式 model + 将换引擎):EngineError(model_not_available)
|
|
401
178
|
*/
|
|
402
179
|
declare function routeEngine(opts: EngineRouteOptions): Promise<EngineRouteResult>;
|
|
403
180
|
|
|
404
181
|
/**
|
|
405
|
-
*
|
|
182
|
+
* 三级发现装载 + 把引擎清单同步到 engines.json(session_start 时调用)。
|
|
183
|
+
*
|
|
184
|
+
* 发现时机(W4 §2.4):与 syncEnginesFile 同点——扩展组合根的模块加载点与
|
|
185
|
+
* session_start 兜底点即本函数既有调用点(调用方零改动),扫描一次 + 装载进注册表
|
|
186
|
+
* (装载结果即缓存);只读 manifest 不握手(portFactory 惰性,扫描不 spawn 引擎)。
|
|
187
|
+
*
|
|
188
|
+
* 投影源(§3.4 投影面表「清单 = 已发现且可执行」)= 本次发现装载结果 ∪ inproc 过渡
|
|
189
|
+
* 注册快照(listEngines() 剔除历史发现装载的 id——registry 无撤销 API,引擎包卸载
|
|
190
|
+
* 后已装载 descriptor 会滞留,投影时经 loadedDiscoveryIds 排除即「卸载 → 下次扫描
|
|
191
|
+
* 自动消失」清理通道;A4 新引擎装包零改 core 出现在清单)。W11 删 inproc 后清单 =
|
|
192
|
+
* 纯发现结果(零命中 → 空清单,GUI 按既有语义给 engine_not_found + 安装指引)。
|
|
406
193
|
*
|
|
407
194
|
* 幂等:内容与现文件一致时零写入(mtime 不动——读侧无谓失效);写入走 tmp+rename
|
|
408
195
|
* 原子替换(shared/atomic-write 统一原语,U6b 迁移——与池 config 同防线)。
|
|
409
|
-
* fail-safe
|
|
410
|
-
*
|
|
196
|
+
* fail-safe:发现与 IO 异常都吞掉(可发现性降级不阻塞 session 启动——GUI 兜底显示
|
|
197
|
+
* 既有清单)。
|
|
411
198
|
*/
|
|
412
199
|
declare function syncEnginesFile(agentDir: string): void;
|
|
413
200
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
* SP-1 重构:旧 completed/failed 合并为 closed(L1 统一终态)。
|
|
423
|
-
* cancelled 保持独立(用户取消语义)。crashed 不进 manifest——
|
|
424
|
-
* crashed 是重启重建时靠 sidecar 四分支推断的派生态(见 record-store.ts reconstructAll)。
|
|
425
|
-
* 历史 "error"/"completed"/"failed" 值由读侧 mapManifestStatus 向后兼容映射。
|
|
426
|
-
*/
|
|
427
|
-
status: "running" | "closed" | "cancelled";
|
|
428
|
-
createdAt: number;
|
|
429
|
-
completedAt?: number;
|
|
430
|
-
sessionFile?: string;
|
|
431
|
-
/** FR-7 补字段:manifest 写入时从 ExecutionRecord 抓取,供 manifestToSubagent 投影真实值。 */
|
|
432
|
-
task?: string;
|
|
433
|
-
slug?: string;
|
|
434
|
-
model?: string;
|
|
435
|
-
}
|
|
436
|
-
declare class ManifestStore {
|
|
437
|
-
private readonly dir;
|
|
438
|
-
/** [perf] per-file 缓存:file → { stamp, record }。record=null 表示「已解析但非法」(缓存
|
|
439
|
-
* 负结果避免反复 parse 损坏文件)。stat 戳变化(writeManifest tmp→rename 后 mtime/size 变)
|
|
440
|
-
* 自动失效;删除的文件在下次扫描时修剪。 */
|
|
441
|
-
private readonly cache;
|
|
442
|
-
constructor(dir: string);
|
|
443
|
-
/**
|
|
444
|
-
* 原子写:tmp → fsync → rename → fsync dir(shared/atomic-write 统一原语,
|
|
445
|
-
* U6b 迁移——原逐行实现与 writeAtomicFile 逐环等值)。真异步(fs.promises,
|
|
446
|
-
* 不阻塞 event loop)。
|
|
447
|
-
*
|
|
448
|
-
* 失败时原语尽力清理残留 tmp(debug 记录,不掩盖原错误)并原样上抛——
|
|
449
|
-
* 调用方(finalizeRecord)决定降级策略。
|
|
450
|
-
*/
|
|
451
|
-
writeManifest(record: ManifestRecord): Promise<void>;
|
|
452
|
-
/**
|
|
453
|
-
* 按 id 读 manifest。文件不存在/JSON 损坏/schema 不合法均返回 null。
|
|
454
|
-
* 调用方需处理 null。
|
|
455
|
-
*/
|
|
456
|
-
readManifest(id: string): Promise<ManifestRecord | null>;
|
|
457
|
-
/**
|
|
458
|
-
* 同步读取所有 manifest 记录(best-effort,损坏/非法文件跳过)。
|
|
459
|
-
* 供 RecordStore.collectRecords 投影 orphan 记录使用——替代对私有 dir 的反射访问。
|
|
460
|
-
* 仅返回通过 isValidManifest 校验的记录。
|
|
461
|
-
*
|
|
462
|
-
* [perf] per-file 缓存 + stat 戳校验:collectRecords 每次渲染都调本方法,旧实现每次
|
|
463
|
-
* 全量 readFileSync + JSON.parse 千级 manifest(实测 ~300ms/次)。命中缓存的文件零读取。
|
|
464
|
-
*/
|
|
465
|
-
listAllSync(): readonly ManifestRecord[];
|
|
466
|
-
/**
|
|
467
|
-
* 启动时恢复 tmp 文件。
|
|
468
|
-
* 3 分支逻辑:
|
|
469
|
-
* 1. manifest 已存在 → 删 tmp(陈旧)
|
|
470
|
-
* 2. tmp 合法 + manifest 缺失 → rename tmp 为 manifest
|
|
471
|
-
* 3. tmp 非法 + manifest 缺失 → 删 tmp
|
|
472
|
-
*
|
|
473
|
-
* [T5④ / PS-13] per-file 容错:单个 tmp 文件操作失败(ENOENT——并发回收/外部清理
|
|
474
|
-
* 抢先、EACCES 等)只 warn + 跳过该文件,不再中断整轮——旧实现单文件 ENOENT 即抛,
|
|
475
|
-
* 剩余 tmp 本轮不再处理,自愈但不可见(残留顺延下次启动)。跳过数经 warn 汇总留痕,
|
|
476
|
-
* 调用方返回值形态不变(跳过者不计数)。
|
|
477
|
-
*/
|
|
478
|
-
recoverTmpFiles(): Promise<{
|
|
479
|
-
deleted: number;
|
|
480
|
-
recovered: number;
|
|
481
|
-
}>;
|
|
482
|
-
}
|
|
201
|
+
/**
|
|
202
|
+
* 单 record 终止记账(镜像置死位):实际终止在引擎进程内(协议 interact cancel /
|
|
203
|
+
* close 或 run 域 cancel 帧承载);宿主侧调用点是终止意图的记账面,宿主进程组级
|
|
204
|
+
* 收割兜底 = EngineClient killAll(EnginePort.dispose / abort 杀链,见 remote-engine)。
|
|
205
|
+
*/
|
|
206
|
+
declare function killRecordChildWithEscalation(recordId: string, _source: string): void;
|
|
207
|
+
/** 全量收割记账(dispose / parent-shutdown):镜像整体置死。 */
|
|
208
|
+
declare function killAllSpawnedChildren(_signal?: NodeJS.Signals): number;
|
|
483
209
|
|
|
484
|
-
/** store 变更监听器(返回取消订阅函数)。 */
|
|
485
|
-
type ChangeListener = () => void;
|
|
486
|
-
/** status 过滤模式(collectRecords 的核心能力参数)。 */
|
|
487
|
-
type StatusFilter = "running" | "all";
|
|
488
|
-
/** Pi ExtensionAPI 的最小子集(仅 collectRecords 跳过损坏 manifest 时上报用)。
|
|
489
|
-
* 解构为局部类型,避免与 subagent-service 的 PiLike 循环依赖。 */
|
|
490
|
-
type RecordStorePi = {
|
|
491
|
-
appendEntry?: (customType: string, data: unknown) => void;
|
|
492
|
-
} | null | undefined;
|
|
493
210
|
/**
|
|
494
|
-
*
|
|
495
|
-
*
|
|
496
|
-
*
|
|
497
|
-
|
|
211
|
+
* D8 兼容 deps 形状(zsw runner-core.js:163 实测调用面 {engineDataDir, cliPath?})。
|
|
212
|
+
* 与 engines/zcode ZcodeEngineDeps 结构兼容:zsw 传入对象可直接赋值;sources /
|
|
213
|
+
* probeVersion 为兼容残留字段——协议形态下不跨进程(忽略 + warn)。
|
|
214
|
+
*/
|
|
215
|
+
interface D8CompatZcodeEngineDeps {
|
|
216
|
+
/** 引擎数据根(→ 引擎子进程 env XYZ_AGENT_DATA_DIR,见设计 §3.6 注入矩阵)。 */
|
|
217
|
+
engineDataDir: () => string;
|
|
218
|
+
/** 引擎 CLI 入口覆盖(L3 等价;缺省 = vendored 相对定位)。 */
|
|
219
|
+
cliPath?: string;
|
|
220
|
+
/** 兼容残留:模型来源/凭据路径——不跨进程(不变量 5),忽略。 */
|
|
221
|
+
sources?: unknown;
|
|
222
|
+
/** 兼容残留:版本探测执行器——协议 probe 由引擎实现承担,忽略。 */
|
|
223
|
+
probeVersion?: unknown;
|
|
224
|
+
/** env 基底合并(buildEngineChildEnv baseEnv;缺省 {...process.env})。 */
|
|
225
|
+
processEnv?: NodeJS.ProcessEnv;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* [W11 收口] 旧 ZcodeEngineDeps 的兼容别名:barrel 原类型导出(zsw 调用面的 deps
|
|
229
|
+
* 形状契约)与 D8CompatZcodeEngineDeps 合并——结构同源(engineDataDir/cliPath/
|
|
230
|
+
* sources/probeVersion/processEnv),别名保留免 zsw 侧机械改名。
|
|
231
|
+
*/
|
|
232
|
+
type ZcodeEngineDeps = D8CompatZcodeEngineDeps;
|
|
233
|
+
/**
|
|
234
|
+
* D8 薄壳:确保 id 'zcode' 的引擎 descriptor 已注册,engineDataDir 记入 descriptor。
|
|
498
235
|
*
|
|
499
|
-
*
|
|
236
|
+
* 注册表已有 descriptor(W4 发现器先装载 / 重复调用)→ 直接保留——发现器 cli
|
|
237
|
+
* descriptor 携带完整 manifest 快照,权威高于薄壳构造。未注册 → vendored 定位构造
|
|
238
|
+
* cli descriptor(经 W4 inspectEnginePackage 全量 manifest 解析;engineDataDir 经
|
|
239
|
+
* 合成 env XYZ_AGENT_DATA_DIR 被 portFactory 捕获——「以显式值为准」)。[W11/DoD#5]
|
|
240
|
+
* 定位/解析失败保持未注册(inproc 回退已删,不变量 6「失败不静默」——派发期
|
|
241
|
+
* engine_not_found 显式报错 + 恢复指引;XYZ_ZCODE_CLI 覆盖通道由 createZcodeEngine
|
|
242
|
+
* 的 deps.cliPath 等价承载)。
|
|
243
|
+
*/
|
|
244
|
+
declare function registerZcodeEngine(engineDataDir?: () => string): void;
|
|
245
|
+
/**
|
|
246
|
+
* D8 薄壳:deps → 协议客户端映射,返回 RemoteEngine('zcode')(implements EnginePort,
|
|
247
|
+
* 对 zsw 透传结构兼容)。构造同步、不 throw(§3.5.3 代理形态)——引擎包缺失时
|
|
248
|
+
* command = 期望路径,失败显式发生在首次协议调用(engine_crashed + 恢复指引)。
|
|
249
|
+
*/
|
|
250
|
+
declare function createZcodeEngine(deps: D8CompatZcodeEngineDeps): EnginePort;
|
|
251
|
+
|
|
252
|
+
/** maxTurns → spawn watchdog 毫秒估算(floor 语义:maxTurns 小时取下限)。 */
|
|
253
|
+
declare function maxTurnsToWatchdogMs(maxTurns: number): number;
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 恒在状态段 <current_subagent_engine>(设计 D6:pi 引擎也声明——AI 不需要
|
|
257
|
+
* 「从段缺失反推」当前引擎)。三种形态(§3.1 终态逐字基准 + 失败路径表):
|
|
258
|
+
* - 缺省 / pi:声明 pi + 指向上方核心段 <available_provider_models>(无冲突 bullet);
|
|
259
|
+
* - 非 pi 且已注册:指向下方该引擎清单段 + 「pi registry id 不适用」+ AGENTS.md
|
|
260
|
+
* 冲突裁决 bullet + 省略 model 用引擎默认;
|
|
261
|
+
* - 未注册引擎(如配置手误 "ghost"):如实显示配置值 + 警告行(派发将报
|
|
262
|
+
* engine_not_found,指引修 subagents/config.json)——G4 诚实降级:不静默、不伪造。
|
|
500
263
|
*
|
|
501
|
-
*
|
|
502
|
-
*
|
|
264
|
+
* 字节稳定(D7):纯字符串确定性拼装(无 localeCompare / 无随机序 / 无时间态);
|
|
265
|
+
* 引擎注册与否经 hasEngine 只读判断(不取实例、不触发工厂副作用),同输入恒同输出。
|
|
266
|
+
*/
|
|
267
|
+
declare function buildSubagentEngineSection(defaultEngine: string | undefined): string;
|
|
268
|
+
/**
|
|
269
|
+
* 依据全局 defaultEngine 生成追加段(不含前导换行)。
|
|
503
270
|
*
|
|
504
|
-
*
|
|
505
|
-
*
|
|
271
|
+
* 规则(设计 §3.1 失败路径表 + G4 + U2 一致性审查修订):
|
|
272
|
+
* - defaultEngine 为 pi / 缺省 → 不注入(pi 段已由核心提供);
|
|
273
|
+
* - 引擎未注册 → 不注入(状态段 <current_subagent_engine> 已有警告行,避免双份);
|
|
274
|
+
* - 已注册且 listModels 有清单 → 注入该引擎段(渲染不变);
|
|
275
|
+
* - 已注册但 listModels 未实现 / 返回 null → 「与主 agent 模型体系一致」声明段
|
|
276
|
+
* (port 契约语义:引擎无自有 provider 枚举面,id 见上方核心段,见
|
|
277
|
+
* buildCoreAlignedHint);
|
|
278
|
+
* - 已注册但空清单 / listModels 抛异常 → 「无凭据模型」提示行段(引擎 provider
|
|
279
|
+
* 体系存在但当前无可用模型,见 buildEmptyModelsHint;从「静默不注入」改为如实
|
|
280
|
+
* 声明——空清单返回空串会让 AI 误以为没有任何引擎清单可看)。
|
|
281
|
+
* fail-safe:listModels 异常同样落提示行段、不向外抛(注入失败不阻塞 agent loop——
|
|
282
|
+
* 与 system-prompt extension 的 before_agent_start 处置一致)。
|
|
506
283
|
*/
|
|
507
|
-
declare
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
284
|
+
declare function buildEngineModelsPromptAppend(defaultEngine: string | undefined): string;
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* record 携带的引擎 handle 消费面(EngineHandleData 的结构子集,双端契约不变):
|
|
288
|
+
* journalPath 绝对路径;sessionRef 内 dbPath 相对池目录 / 绝对路径均可。
|
|
289
|
+
*/
|
|
290
|
+
interface EngineHandleView {
|
|
291
|
+
/** 引擎自定义定位符(zcode = { sessionId, dbPath })。 */
|
|
292
|
+
sessionRef: Record<string, string>;
|
|
293
|
+
/** journal 绝对路径(②级数据源;读前校验 engines 根前缀白名单)。 */
|
|
294
|
+
journalPath?: string;
|
|
295
|
+
/** 隔离池定位(路径布局 SSOT:resolvePoolDir 消费)。 */
|
|
296
|
+
poolKey: string;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* 历史读取输入的 record 快照(消费字段级子集,不绑定 runtime 的完整
|
|
300
|
+
* SubagentRecord 形状——core 不 import workspace private 类型)。
|
|
301
|
+
* engine / engineHandle 是不可信源(JSONL 文本派生),由 extractEngineId /
|
|
302
|
+
* parseEngineHandle 守卫式消费。
|
|
303
|
+
*/
|
|
304
|
+
interface SubagentRecordSnapshot {
|
|
305
|
+
subagentId: string;
|
|
306
|
+
task: string;
|
|
307
|
+
result?: string;
|
|
308
|
+
error?: string;
|
|
309
|
+
startedAt?: number;
|
|
310
|
+
endedAt?: number;
|
|
311
|
+
/** record.engine('pi' | 'zcode' | ...,缺省 = pi 由 extractEngineId 归一)。 */
|
|
312
|
+
engine?: unknown;
|
|
313
|
+
/** record.engineHandle(parseEngineHandle 守卫消费)。 */
|
|
314
|
+
engineHandle?: unknown;
|
|
315
|
+
}
|
|
316
|
+
/** GUI 工具调用视图(结构兼容 shared ToolCall 的消费子集;id/时间戳为展示占位)。 */
|
|
317
|
+
interface HistoryToolCallView {
|
|
318
|
+
id: string;
|
|
319
|
+
toolName: string;
|
|
320
|
+
input: unknown;
|
|
321
|
+
output?: string;
|
|
322
|
+
details?: Record<string, unknown>;
|
|
323
|
+
status: "completed" | "error";
|
|
324
|
+
startTime: number;
|
|
325
|
+
endTime: number;
|
|
326
|
+
}
|
|
327
|
+
/** GUI thinking 块视图(结构兼容 shared ThinkingBlock)。 */
|
|
328
|
+
interface HistoryThinkingView {
|
|
329
|
+
id: string;
|
|
330
|
+
content: string;
|
|
331
|
+
collapsed: boolean;
|
|
332
|
+
}
|
|
333
|
+
/** GUI usage 视图(结构兼容 shared Usage)。 */
|
|
334
|
+
interface HistoryUsageView {
|
|
335
|
+
inputTokens: number;
|
|
336
|
+
outputTokens: number;
|
|
337
|
+
}
|
|
338
|
+
/** GUI 消息视图(结构兼容 shared Message 的消费子集——见文件头「为什么不 import shared」)。 */
|
|
339
|
+
interface HistoryMessage {
|
|
340
|
+
id: string;
|
|
341
|
+
role: "user" | "assistant";
|
|
342
|
+
content: string;
|
|
343
|
+
status: "complete" | "error";
|
|
344
|
+
toolCalls?: HistoryToolCallView[];
|
|
345
|
+
thinking?: HistoryThinkingView[];
|
|
346
|
+
usage?: HistoryUsageView;
|
|
347
|
+
timestamp: number;
|
|
348
|
+
error?: string;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* engineHandle 唯一守卫(D1 双守卫收敛点)。
|
|
352
|
+
* 语义取收敛前 extractor 侧的严格版(两份 guard 此前已在「sessionRef 含非 string 值」
|
|
353
|
+
* 维度分叉:extractor 整体拒绝、history 侧逐键过滤——收敛选整体拒绝,坏形状不进
|
|
354
|
+
* record,读侧按缺 handle 降级 outcome-only,两侧行为面等价落点都是降级):
|
|
355
|
+
* - poolKey 缺失 / 非 string / 空串 → undefined(定位符不完整,读侧降③级)
|
|
356
|
+
* - sessionRef 非 plain object 或含非 string 值 → undefined(整体拒绝)
|
|
357
|
+
* - journalPath 可选 string(空串视为缺省)
|
|
358
|
+
*/
|
|
359
|
+
declare function parseEngineHandle(raw: unknown): EngineHandleView | undefined;
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* 引擎原生 reader(①级):handle + dataDir → SessionView。
|
|
363
|
+
* 返回 undefined = 本级不可达/失败(编排层降②级);reader 内部自行留 debug 日志。
|
|
364
|
+
* 双端复用约束(设计 §3.3.7):实现必须无状态纯函数、不 import 引擎运行时件。
|
|
365
|
+
*
|
|
366
|
+
* [W11/H1] 本模块零静态引擎依赖:①级 reader 全部经注入面注册——生产调用方 =
|
|
367
|
+
* runtime 协议客户端(W8 subagent-engine-history 把「协议 read」注册为引擎原生
|
|
368
|
+
* reader,引擎 id 动态、zcode sqlite 直读在引擎进程内完成);注册表初始为空,
|
|
369
|
+
* 未注册引擎直接落②级 journal。
|
|
370
|
+
*/
|
|
371
|
+
type NativeSessionReader = (handle: EngineHandleView, dataDir: string) => Promise<SessionView | undefined>;
|
|
372
|
+
/**
|
|
373
|
+
* 登记引擎原生 reader(W11/H1 后的唯①级接入点)。重复注册同 id = 覆盖
|
|
374
|
+
* (幂等,对齐 registerEngine 惯例)。生产调用方 = 宿主协议客户端接线
|
|
375
|
+
* (runtime subagent-engine-history 的 ensureProtocolReaderFor)。
|
|
376
|
+
*/
|
|
377
|
+
declare function registerNativeSessionReader(engineId: string, reader: NativeSessionReader): void;
|
|
378
|
+
/**
|
|
379
|
+
* 非 pi record 的历史详情读取(三级降级主入口,D1 收敛后的唯一生产实现)。
|
|
380
|
+
*
|
|
381
|
+
* 降级顺序 ①→②→③ 逐级尝试,每级失败留 debug/warn 日志不抛崩溃(GUI 详情页
|
|
382
|
+
* 永不白屏报错,设计 A8)。engineId='pi' 返回 [](pi 的①级 = 调用方现有 JSONL
|
|
383
|
+
* 直读链,A1 守护)。未注册 reader 的引擎(W11 后 = 宿主未接线协议 reader 的
|
|
384
|
+
* 进程)跳过①级直落②级 journal——record 字段就够,详情页至少有摘要卡。
|
|
385
|
+
*
|
|
386
|
+
* @param record record 快照(engine/engineHandle 为不可信源,内部守卫消费)
|
|
387
|
+
* @param dataDir xyz-agent 数据根(journal/dbPath 白名单经 paths.ts 布局 SSOT 推导)
|
|
388
|
+
*/
|
|
389
|
+
declare function readSubagentHistoryMessages(record: SubagentRecordSnapshot, dataDir: string): Promise<HistoryMessage[]>;
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* 从 turns[] 末尾推导当前活动行(running 时)。
|
|
393
|
+
*
|
|
394
|
+
* 优先级:最后一个未闭合 turn 的末尾 running toolCall → thinking → text → undefined
|
|
395
|
+
*
|
|
396
|
+
* 仅 status==="running" 时返回;terminal 态返回 undefined。
|
|
397
|
+
*
|
|
398
|
+
* 注意:返回的 type 联合("tool"|"text"|"thinking")是手写的,未通过类型守卫从
|
|
399
|
+
* AgentEvent 派生——它映射的是累积的 turn 状态(InternalToolCall._status + turn.thinking/text),
|
|
400
|
+
* 而非单个事件。若未来新增 turn 内容模式(如 reasoning_summary),须同步扩展本函数,
|
|
401
|
+
* 否则会静默返回 undefined(活动行运行中途消失)。updateFromEvent 的 switch 有 never 穷尽
|
|
402
|
+
* 检查,但本函数没有,依赖人工同步。
|
|
403
|
+
*/
|
|
404
|
+
declare function getCurrentActivity(record: ExecutionRecord): {
|
|
405
|
+
type: "tool" | "text" | "thinking";
|
|
406
|
+
label: string;
|
|
407
|
+
} | undefined;
|
|
408
|
+
/**
|
|
409
|
+
* 聚合所有 turn 的 toolCalls(扁平化),并 strip InternalToolCall 的内部字段。
|
|
410
|
+
* 供 collectResult / schema enforcement 读,替代旧闭包 toolCalls 旁路。
|
|
411
|
+
*
|
|
412
|
+
* 返回 ToolCall[](不含 _status / startedTs)——跨边界导出形状清洁,
|
|
413
|
+
* 避免内部状态机字段泄漏到 AgentResult.toolCalls / 持久化层。
|
|
414
|
+
*/
|
|
415
|
+
declare function getAllToolCalls(record: ExecutionRecord): ToolCall[];
|
|
416
|
+
/**
|
|
417
|
+
* 聚合所有 turn 的 toolCalls 总数(免克隆计数)。
|
|
418
|
+
*
|
|
419
|
+
* getAllToolCalls 会 flatMap + strip 克隆出完整数组——只需计数的调用方(渲染签名
|
|
420
|
+
* 每 200ms tick 调用一次)用它是纯浪费;本函数 reduce 累加各 turn 的 length,零分配。
|
|
421
|
+
* 与 getAllToolCalls(...).length 恒等(同一 turns 源)。
|
|
422
|
+
*/
|
|
423
|
+
declare function countAllToolCalls(record: ExecutionRecord): number;
|
|
424
|
+
/**
|
|
425
|
+
* closed 终态 → 三态 outcome 的唯一权威派生(D6 收敛:原 notifier/bg-notify-render/
|
|
426
|
+
* shared deriveClosedDisplay 三处手写同构 switch 的单一实现)。
|
|
427
|
+
*
|
|
428
|
+
* 判定顺序(顺序敏感,勿回退成「error 有值即 failed」的无视取消规则):
|
|
429
|
+
* 1. closedReason === "cancelled" → "cancelled"(取消优先,不参与 error——abort 合成
|
|
430
|
+
* result 可能携带 error,但用户取消语义优先)
|
|
431
|
+
* 2. error 非空(truthy,与旧三处同构的 `record.error &&` 判定逐字对齐——空串 error
|
|
432
|
+
* 不构成失败)→ "failed"
|
|
433
|
+
* 3. 其余 → "completed"
|
|
434
|
+
*
|
|
435
|
+
* [D6 待核项保真] 「failed 优先于 patchFile 提示」:失败轮也会写 patchFile
|
|
436
|
+
* (doFinalizeRecord Step 0 对 worktreeHandle 无条件 collectPatch),消费方必须先按
|
|
437
|
+
* outcome 分流再渲染 patch 提示——failed 分支不展示 patch/result。历史 bug:notifier
|
|
438
|
+
* 的 patchFile 分支曾遮蔽 gc+error 判定,失败终态被 LLM 告知 completed(M1 修复存档)。
|
|
439
|
+
*
|
|
440
|
+
* [D6 显式取舍] parent-shutdown/parent-fork/parent-new 合成关闭(subagent-service
|
|
441
|
+
* disposeAllRecords 合成 result 恒写 error:"closed due to ${reason}")在本映射下落
|
|
442
|
+
* "failed"——语义为「父进程关闭时子 agent 未完成即失败」,选定行为而非疏漏,
|
|
443
|
+
* 勿当 bug 改回 cancelled 造成派生矛盾。
|
|
444
|
+
*
|
|
445
|
+
* 唯一写点 completeRecord 调用本函数冻结 record.outcome;通知 payload(notifier 投影
|
|
446
|
+
* 边界)与无 outcome 字段的存量/重建 record 由 projectOutcome 兜底复用本函数。
|
|
447
|
+
*/
|
|
448
|
+
declare function deriveOutcome(closedReason: ClosedReason | undefined, error: string | undefined | null): ExecutionOutcome;
|
|
449
|
+
/**
|
|
450
|
+
* 投影层 outcome 唯一出口:running → undefined(终态语义不适用活跃态);closed →
|
|
451
|
+
* 一等 outcome 字段直读优先,字段缺失(存量/磁盘重建 record——outcome 持久化不在
|
|
452
|
+
* U3 领地内)时回退 deriveOutcome(closedReason, error) 兜底——单一权威函数,
|
|
453
|
+
* 消费方零手写推导。返回值联合含 "closed-legacy" 预留态,消费方必须处理。
|
|
454
|
+
*/
|
|
455
|
+
declare function projectOutcome(record: {
|
|
456
|
+
status: ExecutionStatus;
|
|
457
|
+
outcome?: ExecutionOutcome;
|
|
458
|
+
closedReason?: ClosedReason;
|
|
459
|
+
error?: string;
|
|
460
|
+
}): ProjectedOutcome | undefined;
|
|
461
|
+
/** elapsedSeconds 唯一计算点(共享 helper,消除三处发散)。endedAt 缺失用 Date.now()。 */
|
|
462
|
+
declare function computeElapsedSeconds(record: {
|
|
463
|
+
startedAt: number;
|
|
464
|
+
endedAt?: number;
|
|
465
|
+
}): number;
|
|
466
|
+
/**
|
|
467
|
+
* 投影到 live 进度快照。elapsedSeconds/currentActivity/eventLog 均现算派生。
|
|
468
|
+
* 供 WorkflowsView 在 agent 运行期间读取实时进度。
|
|
469
|
+
*/
|
|
470
|
+
declare function projectLiveProgress(record: ExecutionRecord): {
|
|
471
|
+
status: ExecutionRecord["status"];
|
|
472
|
+
turns: number;
|
|
473
|
+
totalTokens: number;
|
|
474
|
+
elapsedSeconds: number;
|
|
475
|
+
eventLog: AgentEventLogEntry[];
|
|
476
|
+
currentActivity: ReturnType<typeof getCurrentActivity>;
|
|
477
|
+
lastError: string | undefined;
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
/** 入队项的 child 引用形状(只取 pid 用于 rejectChildDialogs 匹配)。 */
|
|
481
|
+
interface DialogChildRef {
|
|
482
|
+
pid: number;
|
|
483
|
+
}
|
|
484
|
+
/** enqueue 的可选项。child 用于 rejectChildDialogs 关联(child close 时批量 reject)。 */
|
|
485
|
+
interface EnqueueOptions {
|
|
486
|
+
child?: DialogChildRef;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* L2 跨子进程全局 dialog 串行队列(进程单例)。
|
|
490
|
+
*
|
|
491
|
+
* 用法(createUiRequestHandlerForMode 返回的总 handler 内):
|
|
492
|
+
* ```ts
|
|
493
|
+
* const dialogQueue = new DialogGlobalQueue();
|
|
494
|
+
* return async (req: UiRequest) => {
|
|
495
|
+
* // 调用方负责判断:dialog 入队,fire-and-forget 直接调 realHandler
|
|
496
|
+
* if (isDialogMethod(req.method)) return dialogQueue.enqueue(req, realHandler);
|
|
497
|
+
* return realHandler(req);
|
|
498
|
+
* };
|
|
499
|
+
* ```
|
|
500
|
+
*
|
|
501
|
+
* 语义保证:
|
|
502
|
+
* - FIFO 串行:前一个 handler settle 后才处理下一个
|
|
503
|
+
* - SR-4:rejectChildDialogs(child) 把该 child 的 pending 全部 resolve 为 {cancelled:true}
|
|
504
|
+
* - handler 抛错兜底:catch → {cancelled:true} → 继续下一个(队列不卡死)
|
|
505
|
+
* - 超时上界(LC-3/T2⑦):每个 dialog 项必有上界——req.timeout 显式传值优先,
|
|
506
|
+
* 未传挂 DEFAULT_DIALOG_TIMEOUT_MS(30min,裁决值);到点 settle {cancelled:true}
|
|
507
|
+
* 并 warn(恢复指引见 dialogTimeoutLogMessage),L2 processing 释放、队列继续推进。
|
|
508
|
+
* 「等用户无限久」改为默认有界是有意的行为变更。
|
|
509
|
+
* - 调用方约定只对 dialog 类调 enqueue;fire-and-forget 由调用方直接调 handler 不入队
|
|
510
|
+
*(enqueue 内仍防御性兼容 fire-and-forget,但不保证行为)
|
|
511
|
+
*
|
|
512
|
+
* 线程模型:纯 Promise + 微任务驱动,无锁。Node 单线程 event loop 保证队列状态一致。
|
|
513
|
+
*
|
|
514
|
+
* 单 session 假设(M-2,与 index.ts lastSessionId 同源):本队列是进程级单例(实例挂在
|
|
515
|
+
* globalThis[Symbol.for("@zhushanwen/pi-subagents.dialogQueue")],见 getOrCreateDialogQueue)。
|
|
516
|
+
* rejectAll() 清空所有 pending dialog——无 per-session 隔离。Pi 当前架构保证单进程
|
|
517
|
+
* 单 session 串行(同进程不会并发多个 session),故 session_shutdown 调 rejectAll() 只会清掉
|
|
518
|
+
* 当前 session 的 pending。若未来 Pi 支持同进程多 session 并发,session A 退出会误清 session B
|
|
519
|
+
* 的 pending dialog——届时需改为 per-session 隔离(入队项 QueueItem 带 sessionId,rejectAll
|
|
520
|
+
* 改 rejectAllForSession(sessionId),session_shutdown 只清当前 session)。
|
|
521
|
+
*/
|
|
522
|
+
declare class DialogGlobalQueue {
|
|
523
|
+
/** 等待处理的队列(FIFO)。正在处理的项从 queue shift 出后由 current 持有。 */
|
|
524
|
+
private queue;
|
|
525
|
+
/** 正在处理的项(handler 已调、未 settle)。用于 rejectChildDialogs 取消占位中的 dialog。 */
|
|
526
|
+
private current;
|
|
527
|
+
private processing;
|
|
528
|
+
/**
|
|
529
|
+
* 入队一个 UI 请求,返回 Promise<UiResponse>。
|
|
608
530
|
*
|
|
609
|
-
*
|
|
610
|
-
*
|
|
531
|
+
* 调用方约定:只对 dialog 类(isDialogMethod===true)调 enqueue。fire-and-forget 由
|
|
532
|
+
* 调用方(ui-request-handler-factory.ts)在 enqueue 前判 isDialogMethod 后直接调 handler,
|
|
533
|
+
* 不经过本队列。enqueue 内仍防御性兼容 fire-and-forget(万一调用方未判):直接调 handler 返回,
|
|
534
|
+
* 不入队串行,但调用方不应依赖此防御行为。
|
|
611
535
|
*
|
|
612
|
-
*
|
|
613
|
-
|
|
536
|
+
* dialog 项处理(TC-E4 case 1):进队列 FIFO 串行,等前一个 settle 后才调 handler
|
|
537
|
+
*(争输入焦点,防并发弹窗)。
|
|
538
|
+
*
|
|
539
|
+
* handler 抛错兜底:catch → 回 {cancelled:true}(dialog 路径,队列不卡死)。
|
|
540
|
+
* SR-4:opts.child 用于 rejectChildDialogs 关联(dialog 项会被批量 reject,含 current)。
|
|
541
|
+
*
|
|
542
|
+
* @param req UI 请求(约定只传 dialog 类;fire-and-forget 防御性兼容)
|
|
543
|
+
* @param handler 真正执行请求的 handler(TUI/GUI 模式分流后的 realHandler)
|
|
544
|
+
* @param opts 可选 child 引用(用于 rejectChildDialogs 关联)
|
|
545
|
+
* @returns handler 的响应;dialog 抛错时回 {cancelled:true};child close 时回 {cancelled:true}
|
|
614
546
|
*/
|
|
615
|
-
|
|
547
|
+
enqueue(req: UiRequest, handler: UiRequestHandler, opts?: EnqueueOptions): Promise<UiResponse>;
|
|
616
548
|
/**
|
|
617
|
-
*
|
|
618
|
-
*
|
|
619
|
-
*
|
|
549
|
+
* settle 一个 item(幂等)。handler 完成 / rejectChildDialogs / rejectAll / 超时 timer
|
|
550
|
+
* 都通过本方法,settled 标志保证只 settle 一次(防竞争)。
|
|
551
|
+
*
|
|
552
|
+
* #19 单一推进点:本方法 settle Promise + 清状态后,**唯一**调 processNext 推进队列。
|
|
553
|
+
* processNext 尾部不再调 processNext(旧代码双重推进,虽靠 processing 标志幂等,但语义混乱)。
|
|
554
|
+
* 为什么推进必须在 settleItem 而非 processNext 尾部:rejectChildDialogs 取消一个永不 settle
|
|
555
|
+
* 的 current(handler 等用户输入卡死)时,processNext 的 `await item.handler` 永不 resume,
|
|
556
|
+
* 尾部不会执行;只有 settleItem 里的 processNext 才能打破死锁,推进下一个。
|
|
557
|
+
*
|
|
558
|
+
* [A2-2] 超时 timer 清理也统一收口在这里:任何路径抢先 settle(reject/rejectAll/超时
|
|
559
|
+
* 自身)都必须撤下 armed timer——handler 永挂时 processNext 内联的 clearTimeout 不可达,
|
|
560
|
+
* 不在这里清则 timer 到期触发虚假「dialog timed out」warn 且句柄滞留至超时点。
|
|
620
561
|
*/
|
|
621
|
-
|
|
562
|
+
private settleItem;
|
|
622
563
|
/**
|
|
623
|
-
*
|
|
624
|
-
* 判定真实终态并落 entry,消除「父扩展死后再无人写终态 → 侧栏永久 running」。
|
|
564
|
+
* SR-4:把指定 child 的所有 pending dialog resolve 为 {cancelled:true}。
|
|
625
565
|
*
|
|
626
|
-
*
|
|
627
|
-
*
|
|
628
|
-
* entry 供侧栏 waiting 细分;
|
|
629
|
-
* - 子 JSONL 末行完整 JSON.parse → closed(closedReason=gc,与分支 2 重建映射一致;
|
|
630
|
-
* done/failed 细分由 error 字段经 deriveClosedDisplay 派生)+ 写 .finalized sidecar
|
|
631
|
-
* (防重锚——下次重建走分支 2 不再进判定);
|
|
632
|
-
* - 末行截断 → closed + error(保守,错误方向安全)+ sidecar;
|
|
633
|
-
* - 文件不可读(IO 错误,可能暂时)→ 不判终态,落 resumable entry(防御性路径,
|
|
634
|
-
* IO 恢复后重开可重判)。
|
|
566
|
+
* 触发场景:子进程 close(用户取消 / crash / 超时 kill)时,其 pending dialog 的 handler
|
|
567
|
+
* 可能永不 settle(等用户输入),导致 Promise 永挂 + 内存泄漏。本方法批量清理。
|
|
635
568
|
*
|
|
636
|
-
*
|
|
637
|
-
*
|
|
638
|
-
*
|
|
639
|
-
*
|
|
640
|
-
* E1 候选集恒空的真根因)。缺省(undefined)时 merge 无源,行为与旧版一致。
|
|
641
|
-
* 参数为追加式第二参(rootSessionFilter 保持首参):既有调用面只传过滤参。
|
|
569
|
+
* 处理范围(TC-E4 case 2):
|
|
570
|
+
* - 正在处理中(current)的该 child 项:settle {cancelled:true},解阻塞队列推进下一个
|
|
571
|
+
* (关键:handler 可能永不 settle,必须由这里打破死锁)
|
|
572
|
+
* - 队列中等待处理的该 child 项:settle {cancelled:true} 并移除
|
|
642
573
|
*
|
|
643
|
-
*
|
|
644
|
-
* 终态形态双重防护 = sidecar + 缓存)。调用方:index.ts session_start 恢复段(一次)。
|
|
574
|
+
* 不影响其他 child 的 pending dialog(TC-E4 case 2 子测试 2)。
|
|
645
575
|
*/
|
|
646
|
-
|
|
576
|
+
rejectChildDialogs(child: DialogChildRef): void;
|
|
647
577
|
/**
|
|
648
|
-
*
|
|
649
|
-
* 防重锚(orphanJudged 标记)已由调用方完成。
|
|
578
|
+
* 处理队列下一项(FIFO)。
|
|
650
579
|
*
|
|
651
|
-
*
|
|
652
|
-
*
|
|
653
|
-
* 分流 / IO 保守 / 终态覆写)统一基于 merge 后的 rec,同款口径。
|
|
654
|
-
*/
|
|
655
|
-
private finalizeOrphanRecord;
|
|
656
|
-
/** [v2 D3] 孤儿覆写 merge 字段集:末条 entry 的批域标记 + 轮终正文/模型,仅补 rec 侧
|
|
657
|
-
* undefined/空值(model 的空值形态是 ""——light 重建无 model_change entry 时起步
|
|
658
|
-
* 空串),不覆盖已有值。merge 后写 entry 经 reportSubagentRecord →
|
|
659
|
-
* toSubagentRecordEntry 序列化,undefined 字段自然缺省(不引入显式 null)。 */
|
|
660
|
-
private static mergeOrphanLastEntry;
|
|
661
|
-
/**
|
|
662
|
-
* [E2E 实测缺口] entry-born 孤儿恢复:register entry 已落主 session、但子 session 文件
|
|
663
|
-
* 从未创建(父进程死在 spawn 窗口期——register 写点与子进程首笔写入之间的窗口;外部
|
|
664
|
-
* 删除子文件的已知边界同形)。目录扫描(reconstructAll)看不见这类 record(无文件即
|
|
665
|
-
* 无扫描集),recoverOrphanRecords 判不到,侧栏(runtime entry 扫描源)永久 spinner。
|
|
580
|
+
* processing 标志保证串行:handler 运行期间 processing=true,新的 processNext 调用直接返回;
|
|
581
|
+
* handler settle 后由 settleItem 清 processing=false 并推进下一项(#19 单一推进点)。
|
|
666
582
|
*
|
|
667
|
-
*
|
|
668
|
-
*
|
|
669
|
-
* 在途 spawn)→ 按无文件判据收敛:chatMode=true → resumable(分流语义一致);否则
|
|
670
|
-
* closed+gc+error(子文件由子进程创建,无文件 = 子进程从未开跑,error 方向安全)。
|
|
671
|
-
* 调用点:initSession 的 recoverOrphanRecords 之后(session_start,内存恒空)。
|
|
672
|
-
*/
|
|
673
|
-
recoverEntryOnlyOrphans(mainSessionFile: string | undefined, rootSessionFilter?: string): void;
|
|
674
|
-
/**
|
|
675
|
-
* entry-born 孤儿候选判定(recoverEntryOnlyOrphans 的守卫链拆出):末条 running、
|
|
676
|
-
* root session 匹配、无子文件锚、不在内存活 record(防误杀在途 spawn)、未判过。
|
|
677
|
-
*/
|
|
678
|
-
private isEntryOrphanCandidate;
|
|
679
|
-
/** entry-born 孤儿按无文件判据收敛落 entry:chatMode → resumable(分流语义一致);
|
|
680
|
-
* 否则 closed+gc+error(子文件由子进程创建,无文件 = 子进程从未开跑,error 方向安全)。 */
|
|
681
|
-
private finalizeEntryOnlyOrphan;
|
|
682
|
-
/**
|
|
683
|
-
* [E1/U5] sync 批崩溃恢复扫描:主 session 文件「每 id 末条 subagent-record entry」
|
|
684
|
-
* (collectLastRecordEntries + rebuildEntryRecord 组合通路,设计 §3.1.3「标记读取
|
|
685
|
-
* 通路」——batchFinalized 落标 entry 写主 session 文件,本扫描同文件域才可见;禁走
|
|
686
|
-
* collectRecords light 路径,它只读子文件 identity 头+sidecar,主 session 落标
|
|
687
|
-
* entry 不可见)。返回每 id 末条重建的完整 record(含 collectMode/batchFinalized /
|
|
688
|
-
* 终态五字段,损坏 entry 跳过);调用方(service.recoverSyncCollectBatch 的 E1 过滤、
|
|
689
|
-
* recoverOrphanRecords 的覆写 merge)自行取舍。主文件不可读(含新 session 未 flush
|
|
690
|
-
* 的 ENOENT)→ 空数组静默。
|
|
691
|
-
*/
|
|
692
|
-
scanLastRecordEntries(mainSessionFile: string | undefined): SubagentRecord[];
|
|
693
|
-
/** 订阅变更。返回取消订阅函数。 */
|
|
694
|
-
onChange(listener: ChangeListener): () => void;
|
|
695
|
-
/** 触发所有监听器(TUI widget/list requestRender)。dispose 后短路。
|
|
696
|
-
* [perf] 不清空磁盘缓存:per-file stat 戳自校验(任何磁盘写入改变戳 → 单文件重建),
|
|
697
|
-
* 内存事件(register/archive)不改变磁盘文件——旧实现整体失效是全量重扫的根因。 */
|
|
698
|
-
notifyChange(): void;
|
|
699
|
-
/** session 结束清理。 */
|
|
700
|
-
dispose(): void;
|
|
701
|
-
/**
|
|
702
|
-
* /resume /fork /new 后复活(dispose 的逆操作)。
|
|
583
|
+
* handler 抛错兜底(TC-E4 case 3):catch → settle {cancelled:true} → 继续。
|
|
584
|
+
* 不能让一个失败卡死队列(processing 永远 true)。
|
|
703
585
|
*
|
|
704
|
-
*
|
|
705
|
-
*
|
|
706
|
-
*
|
|
707
|
-
*
|
|
708
|
-
*
|
|
709
|
-
*
|
|
586
|
+
* LC-3/T2⑦ 超时上界:`await item.handler` 原本无上界——host UI promise 挂死或用户
|
|
587
|
+
* 永不回答时 processing 恒 true(全局 dialog 死锁)。现在每项挂队列级 timer:
|
|
588
|
+
* req.timeout(请求方显式传值)优先,未传/非法挂 DEFAULT_DIALOG_TIMEOUT_MS。
|
|
589
|
+
* 到点 settle {cancelled:true}(完整错误消息落父进程日志,含恢复指引与等待时长),
|
|
590
|
+
* settleItem 的 settled 标志保证与 handler 完成 / rejectChildDialogs 三方竞态下
|
|
591
|
+
* 恰 settle 一次。timer 回调闭包捕获 item(非读 this.current):迟到触发时
|
|
592
|
+
* settled 标志已置位,直接 noop,不误伤后继项。
|
|
710
593
|
*/
|
|
711
|
-
|
|
594
|
+
private processNext;
|
|
712
595
|
/**
|
|
713
|
-
*
|
|
596
|
+
* #10:把所有 pending dialog(queue + current)全部 settle 为 {cancelled:true},
|
|
597
|
+
* 并清空 queue/current/processing 状态。session_shutdown 调用,保证不留永挂 Promise。
|
|
714
598
|
*
|
|
715
|
-
*
|
|
716
|
-
* 1. .cancelled → closed(closedReason=cancelled)
|
|
717
|
-
* 2. .finalized → closed(closedReason=sidecar 内容 reason;空/旧格式 → disconnected)
|
|
718
|
-
* 3. .alive + pid 存活 + 未超软超时 → running, externalInstance=true
|
|
719
|
-
* 4. 兜底(无 marker、pid 死、超时)→ running(v4 B-1 可续聊语义)
|
|
599
|
+
* 约定签名:rejectAll(): void(无参,返 void)。Group C 的 index.ts session_shutdown 依赖此契约。
|
|
720
600
|
*
|
|
721
|
-
*
|
|
722
|
-
*
|
|
601
|
+
* 幂等:依赖 settleItem 的 settled 标志——重复调用只会对已 settled 项 noop。
|
|
602
|
+
* 顺序敏感(#19 推进点在 settleItem):必须先清空 queue 数组再 settle current,
|
|
603
|
+
* 否则 settleItem(current) 同步触发的 processNext 会从旧 queue 抢占下一项作为新 current,
|
|
604
|
+
* 避开本方法的 cancel 语义。清空后 processNext 看到空队列直接返回,新 current 不会被抢占。
|
|
723
605
|
*
|
|
724
|
-
* session
|
|
725
|
-
*
|
|
726
|
-
|
|
727
|
-
private reconstructAll;
|
|
728
|
-
/**
|
|
729
|
-
* 扫描单文件:stat 戳(jsonl + 3 sidecar)校验,全同 → 复用缓存(零文件读取,
|
|
730
|
-
* 含负缓存直接返回 null);否则重建 light。
|
|
731
|
-
* identity 定位两级:头部 64KB(首轮会话)→ 全文 fallback(续聊场景 identity
|
|
732
|
-
* append 在尾部);两级都找不到 → 写负缓存(防每轮全文重读)。
|
|
733
|
-
* 返回 null:文件消失/读失败/无 identity → 跳过。
|
|
606
|
+
* 单 session 假设(M-2):见类注释。本方法清空所有 pending 不分 session——依赖 Pi 单进程
|
|
607
|
+
* 单 session 串行保证。session_shutdown handler(index.ts)调用本方法时,进程内只会有当前
|
|
608
|
+
* session 的 pending dialog。多 session 并发场景的迁移策略(rejectAllForSession)见类注释。
|
|
734
609
|
*/
|
|
735
|
-
|
|
610
|
+
rejectAll(): void;
|
|
611
|
+
/** 清空队列状态(仅在 rejectAll 之后调用)。pending Promise 必须先由 rejectAll settle。
|
|
612
|
+
* 不 settle Promise 的纯状态重置——单独调用会导致 Promise 永挂(footgun),故设为 private。
|
|
613
|
+
* 外部调用方应使用 rejectAll()(它 settle 所有 pending + 重置状态,是原子操作)。 */
|
|
614
|
+
private resetState;
|
|
615
|
+
/** 当前队列长度(测试/诊断用)。含等待处理项(不含 current)。 */
|
|
616
|
+
get size(): number;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
interface ManifestRecord {
|
|
620
|
+
id: string;
|
|
621
|
+
rootSessionId: string;
|
|
622
|
+
/** 直接父 subagent record ID(层级树构建用)。顶层 record 缺失(undefined)。M3a 补字段。 */
|
|
623
|
+
parentRecordId?: string;
|
|
624
|
+
agentName: string;
|
|
736
625
|
/**
|
|
737
|
-
*
|
|
738
|
-
*
|
|
739
|
-
*
|
|
740
|
-
* sidecar
|
|
741
|
-
*
|
|
742
|
-
* 返回 undefined = 索引未命中/戳不匹配(调用方落到原三级探测);null = 负条目命中
|
|
743
|
-
* (「确认无 identity」跨实例持久,零探测跳过,与内存负缓存同款形态)。
|
|
626
|
+
* 终态枚举:finalizeRecord 写 running/closed/cancelled 三态。
|
|
627
|
+
* SP-1 重构:旧 completed/failed 合并为 closed(L1 统一终态)。
|
|
628
|
+
* cancelled 保持独立(用户取消语义)。crashed 不进 manifest——
|
|
629
|
+
* crashed 是重启重建时靠 sidecar 四分支推断的派生态(见 record-store.ts reconstructAll)。
|
|
630
|
+
* 历史 "error"/"completed"/"failed" 值由读侧 mapManifestStatus 向后兼容映射。
|
|
744
631
|
*/
|
|
745
|
-
|
|
632
|
+
status: "running" | "closed" | "cancelled";
|
|
633
|
+
createdAt: number;
|
|
634
|
+
completedAt?: number;
|
|
635
|
+
sessionFile?: string;
|
|
636
|
+
/** FR-7 补字段:manifest 写入时从 ExecutionRecord 抓取,供 manifestToSubagent 投影真实值。 */
|
|
637
|
+
task?: string;
|
|
638
|
+
slug?: string;
|
|
639
|
+
model?: string;
|
|
640
|
+
}
|
|
641
|
+
declare class ManifestStore {
|
|
642
|
+
private readonly dir;
|
|
643
|
+
/** [perf] per-file 缓存:file → { stamp, record }。record=null 表示「已解析但非法」(缓存
|
|
644
|
+
* 负结果避免反复 parse 损坏文件)。stat 戳变化(writeManifest tmp→rename 后 mtime/size 变)
|
|
645
|
+
* 自动失效;删除的文件在下次扫描时修剪。 */
|
|
646
|
+
private readonly cache;
|
|
647
|
+
constructor(dir: string);
|
|
746
648
|
/**
|
|
747
|
-
*
|
|
748
|
-
*
|
|
749
|
-
*
|
|
750
|
-
* 不清 dirty——未落盘的探测成果跨轮携带,直至真正写入。
|
|
649
|
+
* 原子写:tmp → fsync → rename → fsync dir(shared/atomic-write 统一原语,
|
|
650
|
+
* U6b 迁移——原逐行实现与 writeAtomicFile 逐环等值)。真异步(fs.promises,
|
|
651
|
+
* 不阻塞 event loop)。
|
|
751
652
|
*
|
|
752
|
-
*
|
|
753
|
-
*
|
|
754
|
-
* (pid+单调序号)保证:交错 rename 的终态必为某一次的完整快照(last-writer-wins,
|
|
755
|
-
* 陈旧快照胜出时下轮戳不匹配自愈),不依赖本方法串行化。
|
|
653
|
+
* 失败时原语尽力清理残留 tmp(debug 记录,不掩盖原错误)并原样上抛——
|
|
654
|
+
* 调用方(finalizeRecord)决定降级策略。
|
|
756
655
|
*/
|
|
757
|
-
|
|
656
|
+
writeManifest(record: ManifestRecord): Promise<void>;
|
|
758
657
|
/**
|
|
759
|
-
*
|
|
760
|
-
*
|
|
761
|
-
* reconstructAll 修剪掉消失文件(修剪时置 indexDirty),下次过窗写时快照清除
|
|
762
|
-
* 磁盘上的陈旧条目。
|
|
658
|
+
* 按 id 读 manifest。文件不存在/JSON 损坏/schema 不合法均返回 null。
|
|
659
|
+
* 调用方需处理 null。
|
|
763
660
|
*/
|
|
764
|
-
|
|
661
|
+
readManifest(id: string): Promise<ManifestRecord | null>;
|
|
765
662
|
/**
|
|
766
|
-
*
|
|
767
|
-
*
|
|
768
|
-
*
|
|
769
|
-
*
|
|
663
|
+
* 同步读取所有 manifest 记录(best-effort,损坏/非法文件跳过)。
|
|
664
|
+
* 供 RecordStore.collectRecords 投影 orphan 记录使用——替代对私有 dir 的反射访问。
|
|
665
|
+
* 仅返回通过 isValidManifest 校验的记录。
|
|
666
|
+
*
|
|
667
|
+
* [perf] per-file 缓存 + stat 戳校验:collectRecords 每次渲染都调本方法,旧实现每次
|
|
668
|
+
* 全量 readFileSync + JSON.parse 千级 manifest(实测 ~300ms/次)。命中缓存的文件零读取。
|
|
770
669
|
*/
|
|
771
|
-
|
|
670
|
+
listAllSync(): readonly ManifestRecord[];
|
|
772
671
|
/**
|
|
773
|
-
*
|
|
774
|
-
*
|
|
775
|
-
*
|
|
776
|
-
*
|
|
672
|
+
* 启动时恢复 tmp 文件。
|
|
673
|
+
* 3 分支逻辑:
|
|
674
|
+
* 1. manifest 已存在 → 删 tmp(陈旧)
|
|
675
|
+
* 2. tmp 合法 + manifest 缺失 → rename tmp 为 manifest
|
|
676
|
+
* 3. tmp 非法 + manifest 缺失 → 删 tmp
|
|
777
677
|
*
|
|
778
|
-
*
|
|
779
|
-
*
|
|
678
|
+
* [T5④ / PS-13] per-file 容错:单个 tmp 文件操作失败(ENOENT——并发回收/外部清理
|
|
679
|
+
* 抢先、EACCES 等)只 warn + 跳过该文件,不再中断整轮——旧实现单文件 ENOENT 即抛,
|
|
680
|
+
* 剩余 tmp 本轮不再处理,自愈但不可见(残留顺延下次启动)。跳过数经 warn 汇总留痕,
|
|
681
|
+
* 调用方返回值形态不变(跳过者不计数)。
|
|
780
682
|
*/
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
private static refreshAlive;
|
|
786
|
-
/** identity 基底 + sidecar 状态矩阵 → 缓存条目(索引命中与探测重建两分支的公共装配点)。 */
|
|
787
|
-
private static buildFileCacheEntry;
|
|
788
|
-
/** identity 基底(头部 light 或全量 recon)+ 四分支 sidecar 状态矩阵 → SubagentRecord。 */
|
|
789
|
-
private static buildRecord;
|
|
790
|
-
/** 排序比较器:status priority(running<failed<cancelled<done)+ startedAt desc。 */
|
|
791
|
-
private static compareRecords;
|
|
792
|
-
/** FR-8: 同步读取所有 manifest 记录(封装 ManifestStore.listAllSync,消除反射访问)。 */
|
|
793
|
-
private readManifestsSync;
|
|
794
|
-
/** FR-8: ManifestRecord → SubagentRecord(manifest 源投影)。
|
|
795
|
-
* task/slug/model 从 manifest 真实值投影(配合 writeManifest 补字段),缺失兜底空串。
|
|
796
|
-
* status 越界(mapManifestStatus 返回 null)时返回 null,由 collectRecords 跳过。 */
|
|
797
|
-
private static manifestToSubagent;
|
|
798
|
-
/** ExecutionRecord → SubagentRecord(内存源投影)。 */
|
|
799
|
-
private static recordToSubagent;
|
|
683
|
+
recoverTmpFiles(): Promise<{
|
|
684
|
+
deleted: number;
|
|
685
|
+
recovered: number;
|
|
686
|
+
}>;
|
|
800
687
|
}
|
|
801
688
|
|
|
802
|
-
/**
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
* ExtensionUiRequest 平铺构造)。channel/channelPayload 由 parseChannel 填充。
|
|
812
|
-
*
|
|
813
|
-
* 契约来源:.fix-plans/00-master-summary.md §二 2.2。 */
|
|
814
|
-
interface UiRequest {
|
|
815
|
-
/** Pi rpc-types.ts 的 method(select/confirm/input/editor 为 dialog 类)。 */
|
|
816
|
-
method: UiMethod;
|
|
817
|
-
/** 请求 id(从 extension_ui_request envelope 顶层提取,用于 response 关联)。 */
|
|
818
|
-
id: string;
|
|
819
|
-
title?: string;
|
|
820
|
-
options?: string[];
|
|
821
|
-
message?: string;
|
|
822
|
-
placeholder?: string;
|
|
823
|
-
prefill?: string;
|
|
824
|
-
notifyType?: string;
|
|
825
|
-
statusKey?: string;
|
|
826
|
-
statusText?: string | undefined;
|
|
827
|
-
widgetKey?: string;
|
|
828
|
-
widgetLines?: string[] | undefined;
|
|
829
|
-
widgetPlacement?: "aboveEditor" | "belowEditor";
|
|
830
|
-
text?: string;
|
|
831
|
-
timeout?: number;
|
|
832
|
-
/** channel 名(从 method 对应字段的 NUL 前缀解析)。
|
|
833
|
-
* select → 从 title 解析;setWidget → 从 widgetLines[0] 解析;其他 → undefined。
|
|
834
|
-
* 已知值:"ask_user"(select)、"gui_widget"(setWidget)。handler 按 channel 分发。 */
|
|
835
|
-
channel?: string;
|
|
836
|
-
/** channel 解析后的结构化 payload(已 JSON.parse)。
|
|
837
|
-
* ask_user: {questions, allowCancel};gui_widget: {component};无 channel: undefined。 */
|
|
838
|
-
channelPayload?: unknown;
|
|
839
|
-
/** 内部元数据字段:发起该 UI 请求的子进程 pid(由 session-runner.handleUiRequest 从
|
|
840
|
-
* child.pid 填入)。L2 队列据此关联 rejectChildDialogs(child close 时批量 reject)。
|
|
841
|
-
* 下划线前缀表示内部字段,非 Pi 协议字段,不参与 stdin 回写。 */
|
|
842
|
-
_childPid?: number;
|
|
843
|
-
}
|
|
844
|
-
/** UI 响应(handler 返回,session-runner 按 shape 回写 stdin)。
|
|
845
|
-
* - {value}: select/input/editor 的答案
|
|
846
|
-
* - {confirmed}: confirm 的答案
|
|
847
|
-
* - {cancelled}: 取消(child close / handler 抛错 / 用户取消)
|
|
848
|
-
* - {ack}: fire-and-forget(当前不透传到 TUI,留作协议完整) */
|
|
849
|
-
type UiResponse = {
|
|
850
|
-
value: string;
|
|
851
|
-
} | {
|
|
852
|
-
confirmed: boolean;
|
|
853
|
-
} | {
|
|
854
|
-
cancelled: true;
|
|
855
|
-
} | {
|
|
856
|
-
ack: true;
|
|
857
|
-
};
|
|
858
|
-
/** UI 请求 handler 签名(单函数,按 req.method 内部路由)。
|
|
859
|
-
* 实现方负责:channel 业务路由(ask_user → AskUserComponent)+ 默认转发(ctx.ui.*)。
|
|
860
|
-
* 抛错由调用方(DialogGlobalQueue / session-runner)兜底为 {cancelled:true}。 */
|
|
861
|
-
type UiRequestHandler = (req: UiRequest) => Promise<UiResponse>;
|
|
862
|
-
/** 入队项的 child 引用形状(只取 pid 用于 rejectChildDialogs 匹配)。 */
|
|
863
|
-
interface DialogChildRef {
|
|
864
|
-
pid: number;
|
|
865
|
-
}
|
|
866
|
-
/** enqueue 的可选项。child 用于 rejectChildDialogs 关联(child close 时批量 reject)。 */
|
|
867
|
-
interface EnqueueOptions {
|
|
868
|
-
child?: DialogChildRef;
|
|
869
|
-
}
|
|
689
|
+
/** store 变更监听器(返回取消订阅函数)。 */
|
|
690
|
+
type ChangeListener = () => void;
|
|
691
|
+
/** status 过滤模式(collectRecords 的核心能力参数)。 */
|
|
692
|
+
type StatusFilter = "running" | "all";
|
|
693
|
+
/** Pi ExtensionAPI 的最小子集(仅 collectRecords 跳过损坏 manifest 时上报用)。
|
|
694
|
+
* 解构为局部类型,避免与 subagent-service 的 PiLike 循环依赖。 */
|
|
695
|
+
type RecordStorePi = {
|
|
696
|
+
appendEntry?: (customType: string, data: unknown) => void;
|
|
697
|
+
} | null | undefined;
|
|
870
698
|
/**
|
|
871
|
-
*
|
|
699
|
+
* Record 容器。进程单例(随 SubagentService 重建)。
|
|
872
700
|
*
|
|
873
|
-
*
|
|
874
|
-
*
|
|
875
|
-
* const dialogQueue = new DialogGlobalQueue();
|
|
876
|
-
* return async (req: UiRequest) => {
|
|
877
|
-
* // 调用方负责判断:dialog 入队,fire-and-forget 直接调 realHandler
|
|
878
|
-
* if (isDialogMethod(req.method)) return dialogQueue.enqueue(req, realHandler);
|
|
879
|
-
* return realHandler(req);
|
|
880
|
-
* };
|
|
881
|
-
* ```
|
|
701
|
+
* 内存只留 running record——终态 record 在 archive 时立即移除,collectRecords
|
|
702
|
+
* 读时从 sessions/*.jsonl 重建([perf] light 头部扫描 + per-file 缓存)。
|
|
882
703
|
*
|
|
883
|
-
*
|
|
884
|
-
* - FIFO 串行:前一个 handler settle 后才处理下一个
|
|
885
|
-
* - SR-4:rejectChildDialogs(child) 把该 child 的 pending 全部 resolve 为 {cancelled:true}
|
|
886
|
-
* - handler 抛错兜底:catch → {cancelled:true} → 继续下一个(队列不卡死)
|
|
887
|
-
* - 超时上界(LC-3/T2⑦):每个 dialog 项必有上界——req.timeout 显式传值优先,
|
|
888
|
-
* 未传挂 DEFAULT_DIALOG_TIMEOUT_MS(30min,裁决值);到点 settle {cancelled:true}
|
|
889
|
-
* 并 warn(恢复指引见 dialogTimeoutLogMessage),L2 processing 释放、队列继续推进。
|
|
890
|
-
* 「等用户无限久」改为默认有界是有意的行为变更。
|
|
891
|
-
* - 调用方约定只对 dialog 类调 enqueue;fire-and-forget 由调用方直接调 handler 不入队
|
|
892
|
-
*(enqueue 内仍防御性兼容 fire-and-forget,但不保证行为)
|
|
704
|
+
* 任何 mutate → notifyChange()(仅通知监听器;磁盘缓存靠 stat 戳自校验,不清空)。
|
|
893
705
|
*
|
|
894
|
-
*
|
|
706
|
+
* record 状态查询面(U10① D6):按状态枚举 listRunning/collectRecords(statusFilter)、
|
|
707
|
+
* 按 id 查询 getMutable/findLightById/getFullRecord——方法签名即导出形态,本类零改动。
|
|
895
708
|
*
|
|
896
|
-
*
|
|
897
|
-
*
|
|
898
|
-
* rejectAll() 清空所有 pending dialog——无 per-session 隔离。Pi 当前架构保证单进程
|
|
899
|
-
* 单 session 串行(同进程不会并发多个 session),故 session_shutdown 调 rejectAll() 只会清掉
|
|
900
|
-
* 当前 session 的 pending。若未来 Pi 支持同进程多 session 并发,session A 退出会误清 session B
|
|
901
|
-
* 的 pending dialog——届时需改为 per-session 隔离(入队项 QueueItem 带 sessionId,rejectAll
|
|
902
|
-
* 改 rejectAllForSession(sessionId),session_shutdown 只清当前 session)。
|
|
709
|
+
* @experimental execution 运行时面(设计 docs/design/subagent-core-sink-design.md §3.3 D6):
|
|
710
|
+
* 一个 minor 周期内允许签名微调,稳定后转常规 semver 承诺。
|
|
903
711
|
*/
|
|
904
|
-
declare class
|
|
905
|
-
|
|
906
|
-
private
|
|
907
|
-
|
|
908
|
-
private
|
|
909
|
-
private
|
|
712
|
+
declare class RecordStore {
|
|
713
|
+
private readonly sessionsDir;
|
|
714
|
+
private readonly manifestStore?;
|
|
715
|
+
private readonly records;
|
|
716
|
+
private readonly listeners;
|
|
717
|
+
private _disposed;
|
|
718
|
+
/** 孤儿终态恢复的已判定缓存(residual-fixes):resumable 形态无 sidecar 锚,同进程重复调用跳过。 */
|
|
719
|
+
private orphanJudged;
|
|
720
|
+
/** Pi handle(用于 appendEntry 上报损坏 manifest)。构造时可空,setPi() 后续注入。
|
|
721
|
+
* 显式存为字段而非构造参数 readonly:setPi 需要写权限。 */
|
|
722
|
+
private pi;
|
|
723
|
+
/** [perf] per-file 缓存(key = sessionFile 绝对路径)。不再整体失效——stat 戳精准校验。
|
|
724
|
+
* 值含负缓存(确认无 identity 的文件),防每轮全文 fallback 重读。 */
|
|
725
|
+
private readonly fileCache;
|
|
726
|
+
/** record id → sessionFile 索引(getFullRecord 按 id 定位文件)。随 fileCache 同步维护。 */
|
|
727
|
+
private readonly idToFile;
|
|
728
|
+
/** [perf] sessionsDir 最近一次全量扫描的 mtime(快路径判变,见 reconstructAll)。
|
|
729
|
+
* null = 未扫过 / 已 dispose。 */
|
|
730
|
+
private dirStamp;
|
|
731
|
+
/** [perf L-1] 首扫惰性装载的磁盘索引只读映像(key = jsonl basename)。
|
|
732
|
+
* 扫描尾(flushIndexAfterScan)与 readdir 失败路径释放——运行期索引不再被读(L1 接管)。 */
|
|
733
|
+
private indexEntries;
|
|
734
|
+
/** [perf L-1] 本轮起未落盘的探测标志:scanFile 走过探测分支即置位。发起写时消费
|
|
735
|
+
* (置 false)、写失败恢复;未写路径不清位——未落盘的探测成果跨轮携带直至真正写入。 */
|
|
736
|
+
private indexDirty;
|
|
737
|
+
/** [perf L-1] 上次成功落盘墙钟(节流基准)。0 = 从未写过 → 首扫 dirty 必写;
|
|
738
|
+
* 仅成功分支推进(写失败不推进节流窗,下轮过窗重试)。 */
|
|
739
|
+
private lastIndexWriteAt;
|
|
740
|
+
/** [perf L-1] loadIndex 高版本标志的进程级持久态:true 时本进程所有后续扫描均不
|
|
741
|
+
* 落盘(防 v1/v2 last-writer-wins 覆盖振荡),直至下次 loadIndex 重新评估。 */
|
|
742
|
+
private indexHigherVersion;
|
|
743
|
+
constructor(sessionsDir: string, manifestStore?: ManifestStore | undefined,
|
|
744
|
+
/** Pi 入口(注入 appendEntry 用于上报损坏 manifest)。
|
|
745
|
+
* SubagentService 构造时 this.pi 尚未注入(session_start 之前),传 undefined 兜底;
|
|
746
|
+
* 后续通过 setPi() 注入(见下)。允许 null = 兼容 PiLike 字段类型。 */
|
|
747
|
+
pi?: RecordStorePi);
|
|
748
|
+
/** session_start 后由 SubagentService.initSession 调,注入真实 Pi handle。
|
|
749
|
+
* 设计为独立方法而非要求构造时必传——RecordStore 在 SubagentService 构造时即建
|
|
750
|
+
* (与 sessionsDir/manifestStore 一同初始化),但 this.pi 此时尚未注入。
|
|
751
|
+
* 后续构造期外的 appendEntry 上报才有意义。 */
|
|
752
|
+
setPi(pi: RecordStorePi): void;
|
|
753
|
+
/** 注册新 record。触发 onChange。
|
|
754
|
+
* W16 [D4]:record 诞生(→ running)即 append 自描述快照 entry——pi 文件是
|
|
755
|
+
* 扩展数据持久化权威,custom entry 不进 LLM context。 */
|
|
756
|
+
register(record: ExecutionRecord): void;
|
|
910
757
|
/**
|
|
911
|
-
*
|
|
758
|
+
* 归档:record 已被 completeRecord 设置了终态 status。
|
|
759
|
+
* 立即从内存移除(终态 record 下次读时从 session.jsonl 重建)。
|
|
760
|
+
* cancelled record 由调用方先写 tombstone(cancel 路径),此处只负责移除。
|
|
912
761
|
*
|
|
913
|
-
*
|
|
914
|
-
*
|
|
915
|
-
|
|
916
|
-
|
|
762
|
+
* W16 [D4]:终态冻结字段(result/endedAt/closedReason)在 completeRecord 已就绪,
|
|
763
|
+
* 此处 append 的快照即完整终态记录(所有终态路径的必经锚点)。
|
|
764
|
+
*/
|
|
765
|
+
archive(record: ExecutionRecord): void;
|
|
766
|
+
/**
|
|
767
|
+
* W16 [D4]:类外状态写点上报(record-store 内的迁移点 register/archive 已内置)。
|
|
917
768
|
*
|
|
918
|
-
*
|
|
919
|
-
|
|
769
|
+
* 供 service 层直接改 record.status 的恢复写点调用(chatMode 续轮 idle→running
|
|
770
|
+
* 冷路径 resumeRound、轮终 finalizeRoundToIdle 回 running-resumable)——这些
|
|
771
|
+
* 写点绕过 register/archive,若不显式上报,pi 文件缺失该次迁移、重建源滞后。
|
|
772
|
+
* pi 未注入(session_start 前)时可选链静默降级,不阻断主流程。
|
|
773
|
+
*/
|
|
774
|
+
reportRecordTransition(record: ExecutionRecord): void;
|
|
775
|
+
/** 按 id 查找。返回可变 record(仅 runtime 内部用)。 */
|
|
776
|
+
getMutable(id: string): ExecutionRecord | undefined;
|
|
777
|
+
/**
|
|
778
|
+
* abort 所有 running record 的 controller(background 子进程 SIGTERM)。
|
|
920
779
|
*
|
|
921
|
-
*
|
|
922
|
-
*
|
|
780
|
+
* 仅在 SubagentService.dispose(进程退出路径)调用。不做 CAS/tombstone——dispose
|
|
781
|
+
* 是终局,状态机收尾无意义;目的是让 background 子进程的 AbortSignal 触发 →
|
|
782
|
+
* runSpawn 的 signal listener → child.kill("SIGTERM"),防止主进程退出后子进程成孤儿。
|
|
923
783
|
*
|
|
924
|
-
*
|
|
925
|
-
*
|
|
926
|
-
*
|
|
927
|
-
*
|
|
784
|
+
* sync record 无 controller(undefined),跳过——sync 是阻塞调用,主进程不会先于
|
|
785
|
+
* sync subagent 退出(除非 SIGKILL/崩溃,此时任何清理都无效)。
|
|
786
|
+
*
|
|
787
|
+
* 返回被 abort 的 record 数(诊断用)。
|
|
928
788
|
*/
|
|
929
|
-
|
|
789
|
+
abortRunningControllers(): number;
|
|
790
|
+
/** 列出所有 running record 的只读快照(widget 计数、诊断用)。 */
|
|
791
|
+
listRunning(): RecordSnapshot[];
|
|
792
|
+
/** SP-4: 列出所有活跃 record(running + idle)的可变引用。
|
|
793
|
+
* 供 SubagentService.disposeAllRecords 做级联关闭。 */
|
|
794
|
+
listAllActive(): ExecutionRecord[];
|
|
930
795
|
/**
|
|
931
|
-
*
|
|
932
|
-
* 都通过本方法,settled 标志保证只 settle 一次(防竞争)。
|
|
796
|
+
* 合并内存(running) + 磁盘(sessions/*.jsonl 重建) → SubagentRecord[]。
|
|
933
797
|
*
|
|
934
|
-
*
|
|
935
|
-
*
|
|
936
|
-
*
|
|
937
|
-
*
|
|
938
|
-
*
|
|
798
|
+
* ╔══════════════════════════════════════════════════════════════════╗
|
|
799
|
+
* ║ 1. 磁盘源:扫 sessionsDir 的 .jsonl,逐个 scanFile([perf] 头部 ║
|
|
800
|
+
* ║ identity 轻量重建 + stat 戳缓存命中零读取)。cancelled ║
|
|
801
|
+
* ║ tombstone override status。详情字段(eventLog/result/turns) ║
|
|
802
|
+
* ║ 缺省,由 getFullRecord(id) 懒加载 ║
|
|
803
|
+
* ║ 2. 内存源覆盖(同 id 内存优先——running record 更新鲜) ║
|
|
804
|
+
* ║ 3. session 过滤:只留 rootSessionId === rootSessionFilter 的 ║
|
|
805
|
+
* ║ record。rootSessionId 缺失(旧文件)的 record 一律排除 ║
|
|
806
|
+
* ║ (无法判定归属,隔离优先)。rootSessionFilter 为 undefined ║
|
|
807
|
+
* ║ 时不过滤(向后兼容)。 ║
|
|
808
|
+
* ║ 4. statusFilter:"running" → 只留 running(内存源); ║
|
|
809
|
+
* ║ "all"(默认)→ 内存 + 磁盘 ║
|
|
810
|
+
* ║ 5. 排序:STATUS_PRIORITY + startedAt desc ║
|
|
811
|
+
* ║ 6. slice(limit) ║
|
|
812
|
+
* ╚══════════════════════════════════════════════════════════════════╝
|
|
939
813
|
*
|
|
940
|
-
*
|
|
941
|
-
*
|
|
942
|
-
*
|
|
814
|
+
* statusFilter="running" 时仍先取够多再过滤(防 limit 截断把 running 滤没),
|
|
815
|
+
* 与旧 listHandler 的防截断逻辑一致,下沉到此。
|
|
816
|
+
*
|
|
817
|
+
* session 隔离:同一 cwd 下多个 Pi session 共享 sessionsDir,靠 rootSessionId
|
|
818
|
+
* 区分。内存与磁盘源都按 rootSessionFilter 过滤后再 merge/sort/slice。
|
|
943
819
|
*/
|
|
944
|
-
|
|
820
|
+
collectRecords(limit: number, statusFilter?: StatusFilter, rootSessionFilter?: string): SubagentRecord[];
|
|
945
821
|
/**
|
|
946
|
-
*
|
|
822
|
+
* 重建 SubagentRecord 的自描述 entry 落盘入口(签名适配:reportRecordTransition 收
|
|
823
|
+
* ExecutionRecord,重建孤儿的数据源是 SubagentRecord——直接经 toSubagentRecordEntry
|
|
824
|
+
* 投影 appendEntry,绕过 recordToSubagent)。pi 未注入时可选链静默。
|
|
825
|
+
*/
|
|
826
|
+
reportSubagentRecord(record: SubagentRecord): void;
|
|
827
|
+
/**
|
|
828
|
+
* 孤儿终态恢复:对重建矩阵分支 4 兜底(running 且无 externalInstance)的 record
|
|
829
|
+
* 判定真实终态并落 entry,消除「父扩展死后再无人写终态 → 侧栏永久 running」。
|
|
947
830
|
*
|
|
948
|
-
*
|
|
949
|
-
*
|
|
831
|
+
* 判定(residual-fixes §5.2 三判据 + chat 分流):
|
|
832
|
+
* - chatMode = true → 不终态化(跨重启可续聊是产品语义,v4 B-1),落 resumable
|
|
833
|
+
* entry 供侧栏 waiting 细分;
|
|
834
|
+
* - 子 JSONL 末行完整 JSON.parse → closed(closedReason=gc,与分支 2 重建映射一致;
|
|
835
|
+
* done/failed 细分由 error 字段经 deriveClosedDisplay 派生)+ 写 .finalized sidecar
|
|
836
|
+
* (防重锚——下次重建走分支 2 不再进判定);
|
|
837
|
+
* - 末行截断 → closed + error(保守,错误方向安全)+ sidecar;
|
|
838
|
+
* - 文件不可读(IO 错误,可能暂时)→ 不判终态,落 resumable entry(防御性路径,
|
|
839
|
+
* IO 恢复后重开可重判)。
|
|
950
840
|
*
|
|
951
|
-
*
|
|
952
|
-
*
|
|
953
|
-
*
|
|
954
|
-
*
|
|
841
|
+
* [v2 D3] mainSessionFile = 覆写 merge 数据源(主 session 每 id 末条 entry,与 E1
|
|
842
|
+
* 的 scanLastRecordEntries 同款通路):崩溃前的批域标记(collectMode/batchFinalized)
|
|
843
|
+
* 与轮终 result/model 只活在主文件 entry——重建矩阵(buildRecord)的数据源
|
|
844
|
+
* (sidecar/子文件 identity)不含它们,覆写前不 merge 就会被抹掉(v2 §2.2 断链 2:
|
|
845
|
+
* E1 候选集恒空的真根因)。缺省(undefined)时 merge 无源,行为与旧版一致。
|
|
846
|
+
* 参数为追加式第二参(rootSessionFilter 保持首参):既有调用面只传过滤参。
|
|
955
847
|
*
|
|
956
|
-
*
|
|
848
|
+
* 防重:orphanJudged 实例级缓存(resumable 形态无 sidecar 锚,同进程重复调用跳过;
|
|
849
|
+
* 终态形态双重防护 = sidecar + 缓存)。调用方:index.ts session_start 恢复段(一次)。
|
|
957
850
|
*/
|
|
958
|
-
|
|
851
|
+
recoverOrphanRecords(rootSessionFilter?: string, mainSessionFile?: string): void;
|
|
959
852
|
/**
|
|
960
|
-
*
|
|
961
|
-
*
|
|
962
|
-
* processing 标志保证串行:handler 运行期间 processing=true,新的 processNext 调用直接返回;
|
|
963
|
-
* handler settle 后由 settleItem 清 processing=false 并推进下一项(#19 单一推进点)。
|
|
964
|
-
*
|
|
965
|
-
* handler 抛错兜底(TC-E4 case 3):catch → settle {cancelled:true} → 继续。
|
|
966
|
-
* 不能让一个失败卡死队列(processing 永远 true)。
|
|
853
|
+
* 单孤儿 record 的终态判定与落 entry(residual-fixes §5.2 三判据 + chat 分流)。
|
|
854
|
+
* 防重锚(orphanJudged 标记)已由调用方完成。
|
|
967
855
|
*
|
|
968
|
-
*
|
|
969
|
-
*
|
|
970
|
-
*
|
|
971
|
-
* 到点 settle {cancelled:true}(完整错误消息落父进程日志,含恢复指引与等待时长),
|
|
972
|
-
* settleItem 的 settled 标志保证与 handler 完成 / rejectChildDialogs 三方竞态下
|
|
973
|
-
* 恰 settle 一次。timer 回调闭包捕获 item(非读 this.current):迟到触发时
|
|
974
|
-
* settled 标志已置位,直接 noop,不误伤后继项。
|
|
856
|
+
* [v2 D3] 覆写前 merge(lastEntry = 主 session 同 id 末条 entry 重建,调用方构建):
|
|
857
|
+
* 覆写是状态迁移不是信息重建,迁移不应丢末条既有信息。三个落 entry 分支(chatMode
|
|
858
|
+
* 分流 / IO 保守 / 终态覆写)统一基于 merge 后的 rec,同款口径。
|
|
975
859
|
*/
|
|
976
|
-
private
|
|
860
|
+
private finalizeOrphanRecord;
|
|
861
|
+
/** [v2 D3] 孤儿覆写 merge 字段集:末条 entry 的批域标记 + 轮终正文/模型,仅补 rec 侧
|
|
862
|
+
* undefined/空值(model 的空值形态是 ""——light 重建无 model_change entry 时起步
|
|
863
|
+
* 空串),不覆盖已有值。merge 后写 entry 经 reportSubagentRecord →
|
|
864
|
+
* toSubagentRecordEntry 序列化,undefined 字段自然缺省(不引入显式 null)。 */
|
|
865
|
+
private static mergeOrphanLastEntry;
|
|
977
866
|
/**
|
|
978
|
-
*
|
|
979
|
-
*
|
|
980
|
-
*
|
|
981
|
-
*
|
|
982
|
-
*
|
|
983
|
-
* 幂等:依赖 settleItem 的 settled 标志——重复调用只会对已 settled 项 noop。
|
|
984
|
-
* 顺序敏感(#19 推进点在 settleItem):必须先清空 queue 数组再 settle current,
|
|
985
|
-
* 否则 settleItem(current) 同步触发的 processNext 会从旧 queue 抢占下一项作为新 current,
|
|
986
|
-
* 避开本方法的 cancel 语义。清空后 processNext 看到空队列直接返回,新 current 不会被抢占。
|
|
867
|
+
* [E2E 实测缺口] entry-born 孤儿恢复:register entry 已落主 session、但子 session 文件
|
|
868
|
+
* 从未创建(父进程死在 spawn 窗口期——register 写点与子进程首笔写入之间的窗口;外部
|
|
869
|
+
* 删除子文件的已知边界同形)。目录扫描(reconstructAll)看不见这类 record(无文件即
|
|
870
|
+
* 无扫描集),recoverOrphanRecords 判不到,侧栏(runtime entry 扫描源)永久 spinner。
|
|
987
871
|
*
|
|
988
|
-
*
|
|
989
|
-
*
|
|
990
|
-
*
|
|
872
|
+
* 判定:读主 session 的 subagent-record entry,取每 id 末条;末条 status=running 且
|
|
873
|
+
* 无子文件锚(不在 reconstructAll 结果中)且不在内存活 record(防误杀刚 register 的
|
|
874
|
+
* 在途 spawn)→ 按无文件判据收敛:chatMode=true → resumable(分流语义一致);否则
|
|
875
|
+
* closed+gc+error(子文件由子进程创建,无文件 = 子进程从未开跑,error 方向安全)。
|
|
876
|
+
* 调用点:initSession 的 recoverOrphanRecords 之后(session_start,内存恒空)。
|
|
991
877
|
*/
|
|
992
|
-
|
|
993
|
-
/** 清空队列状态(仅在 rejectAll 之后调用)。pending Promise 必须先由 rejectAll settle。
|
|
994
|
-
* 不 settle Promise 的纯状态重置——单独调用会导致 Promise 永挂(footgun),故设为 private。
|
|
995
|
-
* 外部调用方应使用 rejectAll()(它 settle 所有 pending + 重置状态,是原子操作)。 */
|
|
996
|
-
private resetState;
|
|
997
|
-
/** 当前队列长度(测试/诊断用)。含等待处理项(不含 current)。 */
|
|
998
|
-
get size(): number;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
/**
|
|
1002
|
-
* [M-1] maxTurns → watchdog 毫秒换算(纯函数,可导出复用)。
|
|
1003
|
-
*
|
|
1004
|
-
* **换算语义(floor 文档化)**:`max(30min, maxTurns × 5min)`——按 maxTurns 线性估算,
|
|
1005
|
-
* 带 30 分钟下限(floor)。maxTurns 换算结果低于 30 分钟时(含 ≤6 的整数与小数,
|
|
1006
|
-
* 如 0.5)一律钳到 30 分钟:单 turn 约 5 分钟是经验值(复杂 tool + 长 LLM 响应约
|
|
1007
|
-
* 3-4 分钟,留 1-2 分钟余量),maxTurns 过小时不设 floor 会把 watchdog 紧到误杀。
|
|
1008
|
-
* - maxTurns=2 → 30min(floor 生效,非 2×5=10min——zsw 曾自实现无 floor 版本致该
|
|
1009
|
-
* 配置被 10min 误杀,见 sink 设计 §2.1 例 1;两宿主统一消费本函数即同语义)
|
|
1010
|
-
* - maxTurns=6 → 30min(恰为 floor 临界)
|
|
1011
|
-
* - maxTurns=20 → 100 分钟
|
|
1012
|
-
* - maxTurns=100 → 500 分钟(8 小时+,覆盖全量重构)
|
|
1013
|
-
*
|
|
1014
|
-
* 旧实现固定 30 分钟(SPAWN_WATCHDOG_MS),与 maxTurns 无关:maxTurns=100 的长任务
|
|
1015
|
-
* (全量重构/大规模迁移)正常需数小时,30 分钟到达即被误杀,limiter 机制形同虚设。
|
|
1016
|
-
*
|
|
1017
|
-
* [预算语义对齐 2026-08] maxTurns 未传/<=0 → 不挂 watchdog(不限)的挂载判定**不归本
|
|
1018
|
-
* 函数**——本函数只做换算,挂载判定单一入口是 resolveSpawnWatchdogMs(未传时走
|
|
1019
|
-
* SPAWN_WATCHDOG_ENV 兑底,显式 <=0 = 显式不限压过 env)。用户须知风险:watchdog 防
|
|
1020
|
-
* 的是 pi 子进程 hang 泄漏(卡死在单个 tool 内 turn_end 永不触发,limiter 失效),
|
|
1021
|
-
* 默认关闭意味着无 maxTurns 的 spawn 若 hang 将永不自动回收——须用 SPAWN_WATCHDOG_ENV
|
|
1022
|
-
* 显式兑底。
|
|
1023
|
-
*
|
|
1024
|
-
* [MF-4] 同时是 agent_end keep-alive 的「有活跃后代」等待超时(不 kill 分支),
|
|
1025
|
-
* 替代旧固定 2h(WAIT_DESCENDANT_TIMEOUT_MS,已删除)——wave 开发 >2h 不被误杀。
|
|
1026
|
-
* [export] 测试可观测(run-spawn-edges MF-4 用例断言 keep-alive 等待超时 = 动态值;
|
|
1027
|
-
* max-turns-to-watchdog-ms.test.ts 锚定 floor/边界换算)。
|
|
1028
|
-
*
|
|
1029
|
-
* @param maxTurns 调用方指定的 turn 上限;调用方保证 > 0(否则走 resolveSpawnWatchdogMs)
|
|
1030
|
-
*/
|
|
1031
|
-
declare function maxTurnsToWatchdogMs(maxTurns: number): number;
|
|
1032
|
-
/**
|
|
1033
|
-
* kill 所有未退出的 spawned 子进程(dispose 兜底用)。
|
|
1034
|
-
*
|
|
1035
|
-
* [R1 D6③] 编排扩容:先触发 engine registry 各已实例化引擎的 dispose(常驻资源
|
|
1036
|
-
* 归引擎所有,见 EnginePort.dispose / registry.disposeEngines),再杀 per-record
|
|
1037
|
-
* children——顺序不可反(D6①:SIGTERM 先发会导致引擎侧 close 帧必丢)。dispose
|
|
1038
|
-
* 触发不等待:本函数保持同步契约(宿主调用点零改动,函数签名与导出名不变),
|
|
1039
|
-
* 引擎 dispose 的同步面(fire close 帧 + 同步 SIGTERM)由引擎实现保证,异步
|
|
1040
|
-
* promise 段(grace→SIGKILL)的 rejection 由 registry 侧 catch 吞掉,防
|
|
1041
|
-
* unhandledRejection 崩宿主。
|
|
1042
|
-
*
|
|
1043
|
-
* [R1 D6 注释契约] spawnedChildren Map 是 per-record 一次性 spawn 模态(一任务一
|
|
1044
|
-
* 进程,key=record.id);引擎持有的常驻进程(跨任务共享)**不进本 Map**——其生命
|
|
1045
|
-
* 周期完全归引擎 dispose 管理(边界声明见 RunContext.onChildSpawned)。常驻进程的
|
|
1046
|
-
* 注册/回收问题在引擎层解决(R4),此处只立 Map 模态契约。
|
|
1047
|
-
*
|
|
1048
|
-
* 遍历 spawnedChildren Map 的 values(),对每个「未确认死亡」的子进程发信号。
|
|
1049
|
-
* 已退出的子进程在 close/error 事件时已从 Map 移除(按句守卫 removeChildRegistration——
|
|
1050
|
-
* Map 当前值仍是该 child 才删,防误删 resume spawn 的新注册),故 Map 中只剩「活着的」
|
|
1051
|
-
* 或「已被 kill 但 close 事件尚未回调的」。
|
|
1052
|
-
*
|
|
1053
|
-
* [T2-⑤ / LC-2] 死亡判定按 exitCode/signalCode 而非 killed 标记——killed=true 只表示
|
|
1054
|
-
* 「发过 kill 请求」,不等于「已死」:SIGTERM 可能被无视(卡死在不可中断 native 调用),
|
|
1055
|
-
* 旧实现按 killed 跳过会让这类进程脱离最后一次回收窗口。现规则:
|
|
1056
|
-
* - 已确认死亡(exitCode/signalCode 任一非 null)→ 跳过(无论 killed 与否);
|
|
1057
|
-
* - killed 但未确认死亡(SIGTERM 已发、进程仍在)→ 直接升级 SIGKILL(dispose 是
|
|
1058
|
-
* 最后兜底,没有 30s 升级窗口可等——killAllSpawnedChildren 保持快速返回契约);
|
|
1059
|
-
* - 未 killed 且未确认死亡 → 发调用方指定 signal。
|
|
1060
|
-
*
|
|
1061
|
-
* 用于 SubagentService.dispose(进程退出路径):覆盖 sync 子进程(controller 为 undefined,
|
|
1062
|
-
* abortRunningControllers 跳过它们)。background 子进程此时已被 abortRunningControllers 经
|
|
1063
|
-
* controller.abort 路径 kill,本函数对它们的再处理是 SIGKILL 升级检查(T2-⑤ 语义),
|
|
1064
|
-
* 对已死句柄 child.kill 返回 false 无害。
|
|
1065
|
-
*
|
|
1066
|
-
* 不 await 子进程退出(dispose 要快速返回)。
|
|
1067
|
-
*
|
|
1068
|
-
* @returns 被 kill 的子进程数(诊断用)
|
|
1069
|
-
*/
|
|
1070
|
-
declare function killAllSpawnedChildren(signal?: NodeJS.Signals): number;
|
|
1071
|
-
/** SessionRunner 的依赖注入容器(由 Runtime 提供,解耦 Core 与 Pi SDK 实例)。 */
|
|
1072
|
-
interface SessionRunnerContext {
|
|
1073
|
-
/** 进程当前工作目录(作为 spawn 子进程的 cwd 基准)。 */
|
|
1074
|
-
cwd: string;
|
|
1075
|
-
/** agent 配置目录(由 Pi 核心 getAgentDir() 决定,默认 ~/.pi/agent)。 */
|
|
1076
|
-
agentDir: string;
|
|
1077
|
-
/** 额外 skill 目录(ADR-031 废弃 discovery.json 后固定为空数组)。供子进程 --skill 注入。 */
|
|
1078
|
-
skillDirs: string[];
|
|
1079
|
-
/** 主 agent cwd(fork sessionDir 编码用)。fork 未开启时等于 cwd。 */
|
|
1080
|
-
mainCwd: string;
|
|
1081
|
-
/** 主 agent session 文件路径(fork 源)。fork 未开启时 undefined。 */
|
|
1082
|
-
mainSessionFile?: string;
|
|
878
|
+
recoverEntryOnlyOrphans(mainSessionFile: string | undefined, rootSessionFilter?: string): void;
|
|
1083
879
|
/**
|
|
1084
|
-
*
|
|
1085
|
-
*
|
|
1086
|
-
* 解耦 Core 与 Runtime——session-runner 不直接依赖 WorktreeManager。
|
|
1087
|
-
* [D5a] 返回 Promise(注册表 pid 补全走跨进程锁内 RMW);实现方保证不 reject
|
|
1088
|
-
* (WorktreeRegistry.mutate 内部降级兜底),本侧 fire-and-forget 安全。
|
|
880
|
+
* entry-born 孤儿候选判定(recoverEntryOnlyOrphans 的守卫链拆出):末条 running、
|
|
881
|
+
* root session 匹配、无子文件锚、不在内存活 record(防误杀在途 spawn)、未判过。
|
|
1089
882
|
*/
|
|
1090
|
-
|
|
883
|
+
private isEntryOrphanCandidate;
|
|
884
|
+
/** entry-born 孤儿按无文件判据收敛落 entry:chatMode → resumable(分流语义一致);
|
|
885
|
+
* 否则 closed+gc+error(子文件由子进程创建,无文件 = 子进程从未开跑,error 方向安全)。 */
|
|
886
|
+
private finalizeEntryOnlyOrphan;
|
|
1091
887
|
/**
|
|
1092
|
-
*
|
|
1093
|
-
*
|
|
1094
|
-
*
|
|
1095
|
-
*
|
|
1096
|
-
*
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1099
|
-
*
|
|
1100
|
-
* W3 接入 SubagentService.notifyMissingHandler 的 appendEntry。
|
|
888
|
+
* [E1/U5] sync 批崩溃恢复扫描:主 session 文件「每 id 末条 subagent-record entry」
|
|
889
|
+
* (collectLastRecordEntries + rebuildEntryRecord 组合通路,设计 §3.1.3「标记读取
|
|
890
|
+
* 通路」——batchFinalized 落标 entry 写主 session 文件,本扫描同文件域才可见;禁走
|
|
891
|
+
* collectRecords light 路径,它只读子文件 identity 头+sidecar,主 session 落标
|
|
892
|
+
* entry 不可见)。返回每 id 末条重建的完整 record(含 collectMode/batchFinalized /
|
|
893
|
+
* 终态五字段,损坏 entry 跳过);调用方(service.recoverSyncCollectBatch 的 E1 过滤、
|
|
894
|
+
* recoverOrphanRecords 的覆写 merge)自行取舍。主文件不可读(含新 session 未 flush
|
|
895
|
+
* 的 ENOENT)→ 空数组静默。
|
|
1101
896
|
*/
|
|
1102
|
-
|
|
897
|
+
scanLastRecordEntries(mainSessionFile: string | undefined): SubagentRecord[];
|
|
898
|
+
/** 订阅变更。返回取消订阅函数。 */
|
|
899
|
+
onChange(listener: ChangeListener): () => void;
|
|
900
|
+
/** 触发所有监听器(TUI widget/list requestRender)。dispose 后短路。
|
|
901
|
+
* [perf] 不清空磁盘缓存:per-file stat 戳自校验(任何磁盘写入改变戳 → 单文件重建),
|
|
902
|
+
* 内存事件(register/archive)不改变磁盘文件——旧实现整体失效是全量重扫的根因。 */
|
|
903
|
+
notifyChange(): void;
|
|
904
|
+
/** session 结束清理。 */
|
|
905
|
+
dispose(): void;
|
|
1103
906
|
/**
|
|
1104
|
-
*
|
|
907
|
+
* /resume /fork /new 后复活(dispose 的逆操作)。
|
|
1105
908
|
*
|
|
1106
|
-
*
|
|
1107
|
-
*
|
|
1108
|
-
*
|
|
909
|
+
* [PS-10/T6④] 同步复位 orphanJudged 防重缓存:resumable 形态(IO-error 保守分支 /
|
|
910
|
+
* chatMode 分流)没有 .finalized sidecar 锚,重判资格完全由本缓存承载——dispose 时
|
|
911
|
+
* 有 clear(session 结束),但 revive 此前不复位,导致「同进程内曾经的 IO 失败记录
|
|
912
|
+
* 永久停留 resumable」,与本文件 recoverOrphanRecords 注释承诺的「IO 恢复后重开可重判」
|
|
913
|
+
* 不符。/new 复活正是「重开」语义:IO 已恢复的记录下次 recoverOrphanRecords 重新判定
|
|
914
|
+
* 收敛终态;仍不可读的记录重判再落一次 resumable entry(幂等,末条语义不变)。
|
|
1109
915
|
*/
|
|
1110
|
-
|
|
1111
|
-
/**
|
|
1112
|
-
|
|
1113
|
-
/** 所属根 session ID(跨进程身份贯穿用)。子进程的 record.rootSessionId 全指向真 ROOT,
|
|
1114
|
-
* 使主进程 /subagents 能看到完整递归树。runSpawn 无条件注入为子进程 env(设计 recursive-subagent-visibility.md)。 */
|
|
1115
|
-
sessionRootId: string;
|
|
1116
|
-
/** [MF-3] 所属根进程 cwd(跨进程落盘目录编码键)。根进程=自身 cwd;worktree 模式下子进程
|
|
1117
|
-
* mainCwd=checkout 路径,rootCwd 贯穿真 ROOT——session 文件落盘统一用 ROOT cwd 编码,
|
|
1118
|
-
* 主进程磁盘重建才能看到全树(设计 recursive-subagent-visibility.md)。 */
|
|
1119
|
-
rootCwd: string;
|
|
1120
|
-
/**
|
|
1121
|
-
* [V2 模块 3] chatMode 本轮完成通知挂载点。
|
|
916
|
+
revive(): void;
|
|
917
|
+
/**
|
|
918
|
+
* 四分支 sidecar 矩阵重建([perf] light 版)。
|
|
1122
919
|
*
|
|
1123
|
-
*
|
|
1124
|
-
*
|
|
1125
|
-
*
|
|
1126
|
-
*
|
|
1127
|
-
*
|
|
920
|
+
* 优先级:
|
|
921
|
+
* 1. .cancelled → closed(closedReason=cancelled)
|
|
922
|
+
* 2. .finalized → closed(closedReason=sidecar 内容 reason;空/旧格式 → disconnected)
|
|
923
|
+
* 3. .alive + pid 存活 + 未超软超时 → running, externalInstance=true
|
|
924
|
+
* 4. 兜底(无 marker、pid 死、超时)→ running(v4 B-1 可续聊语义)
|
|
1128
925
|
*
|
|
1129
|
-
*
|
|
1130
|
-
*
|
|
1131
|
-
* 一起系统处理)。非 chatMode 路径不触发 agent_settled handler,本字段无影响。
|
|
926
|
+
* [perf]:逐文件 scanFile(stat 戳校验 + 头部 identity 轻量重建)。命中缓存的
|
|
927
|
+
* 文件零文件读取;变化的文件只重建自身,其余 N-1 个复用缓存。
|
|
1132
928
|
*
|
|
1133
|
-
*
|
|
929
|
+
* session 隔离:rootSessionFilter 非空时,只保留 rootSessionId 匹配的 record。
|
|
930
|
+
* rootSessionId 缺失(旧文件,未带身份字段)一律排除(无法判定归属)。
|
|
1134
931
|
*/
|
|
1135
|
-
|
|
1136
|
-
}
|
|
1137
|
-
/**
|
|
1138
|
-
* resume spawn 选项——重开已结束的 session 文件继续对话(M1 基建)。
|
|
1139
|
-
*
|
|
1140
|
-
* resume 时 pi 子进程用 `--session <sessionFile> --mode rpc` 续写原文件(探针 P-1/P-8
|
|
1141
|
-
* 实测:路径不变、entry 续写、上下文保留)。runSpawn 收到此参数后:
|
|
1142
|
-
* - buildSpawnArgs 追加 `--session <sessionFile>`
|
|
1143
|
-
* - record.sessionFile 提前设为 resume.sessionFile(handshake 只验证 spawn 成功,不覆盖)
|
|
1144
|
-
* - model/thinkingLevel 优先用此处的值(防多轮对话模型漂移,探针 P-10),否则回退 opts.resolved
|
|
1145
|
-
*
|
|
1146
|
-
* 注意:M1 只暴露能力,messageHandler(M2)才会真正调用。
|
|
1147
|
-
*/
|
|
1148
|
-
interface SpawnResumeOpts {
|
|
1149
|
-
/** resume 目标 session 文件绝对路径(pi `--session` 参数值)。 */
|
|
1150
|
-
sessionFile: string;
|
|
932
|
+
private reconstructAll;
|
|
1151
933
|
/**
|
|
1152
|
-
*
|
|
1153
|
-
*
|
|
934
|
+
* 扫描单文件:stat 戳(jsonl + 3 sidecar)校验,全同 → 复用缓存(零文件读取,
|
|
935
|
+
* 含负缓存直接返回 null);否则重建 light。
|
|
936
|
+
* identity 定位两级:头部 64KB(首轮会话)→ 全文 fallback(续聊场景 identity
|
|
937
|
+
* append 在尾部);两级都找不到 → 写负缓存(防每轮全文重读)。
|
|
938
|
+
* 返回 null:文件消失/读失败/无 identity → 跳过。
|
|
1154
939
|
*/
|
|
1155
|
-
|
|
1156
|
-
/** resume 时覆盖的 thinkingLevel;不传则回退 opts.resolved。 */
|
|
1157
|
-
thinkingLevel?: string;
|
|
1158
|
-
}
|
|
1159
|
-
declare function killRecordChildWithEscalation(recordId: string, source: string): void;
|
|
1160
|
-
|
|
1161
|
-
/** chat 域轮次的身份快照(编排层 resolveIdentity 的产物形态——引擎侧透传给 launcher;
|
|
1162
|
-
* 身份解析产物是 host 编排件,不并入任务声明 AgentCallOpts,见 ChatRoundTicket 注释)。 */
|
|
1163
|
-
interface ChatRoundIdentity {
|
|
1164
|
-
agent: string;
|
|
1165
|
-
agentConfig: AgentConfig | undefined;
|
|
1166
|
-
resolved: ResolvedModel;
|
|
1167
|
-
}
|
|
1168
|
-
/**
|
|
1169
|
-
* chat 域预备轮次交接包(D2 单轨):编排层(executeViaEngine / 冷路径续轮)预建的
|
|
1170
|
-
* record/opts/identity/host 上下文经 run 的 ctx.taskId 交接给引擎。
|
|
1171
|
-
*
|
|
1172
|
-
* [u-3b D6 双形态消化评估结论:双形态保留(结构性裁决,非过渡态)]
|
|
1173
|
-
* run 的 task 形参(AgentCallOpts,任务声明)与 ticket 是两个变化轴的载体,不可合一:
|
|
1174
|
-
* - task 形参 = 纯数据任务声明(跨引擎持久化语义,workflow 域由 SAR 直传);
|
|
1175
|
-
* - ticket = chat 域 host 编排交接件,主体是运行期对象与 Service 内部形态——
|
|
1176
|
-
* ① ctx: SessionRunnerContext 回调簇 / signal / priority / stream 是运行期句柄
|
|
1177
|
-
* (port 设计 §3.3.5 删字段去向:运行期对象不入任务声明);
|
|
1178
|
-
* ② record: ExecutionRecord 是 Service 内部 record 生命周期对象;
|
|
1179
|
-
* ③ resume: SpawnResumeOpts 是 session-runner 私有 spawn 选项;
|
|
1180
|
-
* ④ opts: ExecuteOptions 是 Service 内部编排形状(D6 明确保留的类型),且是
|
|
1181
|
-
* forkFromSessionFile 的唯一 lossless 载体(该字段仅 pi chat 域消费,不入
|
|
1182
|
-
* 合流形状——chat pi fork-from 链路 = 壳 fork-from action → ExecuteOptions
|
|
1183
|
-
* .forkFromSessionFile → 本 ticket → runChatRound → runAndFinalize → runSpawn,
|
|
1184
|
-
* 全程不经任务声明,由 pi-engine 测试锁定零回归)。
|
|
1185
|
-
* 把任一类塞进 AgentCallOpts 会让 engine 契约反向耦合 execution 内部类型。故 chat
|
|
1186
|
-
* 分支 ticket 优先消费(task 形参仅满足 port 签名),workflow 分支消费 task 形参——
|
|
1187
|
-
* 这是「编排交接」与「任务声明」的职责分界,不是待消除的中间态。
|
|
1188
|
-
*/
|
|
1189
|
-
interface ChatRoundTicket {
|
|
1190
|
-
record: ExecutionRecord;
|
|
1191
|
-
opts: ExecuteOptions;
|
|
1192
|
-
identity: ChatRoundIdentity;
|
|
1193
|
-
ctx: SessionRunnerContext;
|
|
1194
|
-
signal: AbortSignal | undefined;
|
|
1195
|
-
priority: number;
|
|
1196
|
-
stream?: SubagentStream;
|
|
1197
|
-
/** resume 选项(冷路径续轮):重开已 idle 的 session 续聊。undefined = 新 session。 */
|
|
1198
|
-
resume?: SpawnResumeOpts;
|
|
1199
|
-
}
|
|
1200
|
-
/**
|
|
1201
|
-
* PiEngine 委托的编排服务面——SubagentService 的结构子集(鸭子类型:生产实现是
|
|
1202
|
-
* SubagentService 单例;测试可注入 fake,不必构造整个 Service)。
|
|
1203
|
-
* 为什么用结构接口而非直接 import SubagentService 类型:pi-engine 只依赖它实际消费的
|
|
1204
|
-
* 方法面,防 Service 内部演进(增删私有方法)连锁影响引擎适配层。
|
|
1205
|
-
*
|
|
1206
|
-
* chat 域轮次面(takeChatRound/runChatRound/resumeChatRound/reportRecordTransition)
|
|
1207
|
-
* 声明为可选项(u-2c 聚合后形态):两处生产绑定(registration.ts / SAR)均绑
|
|
1208
|
-
* subagentService.asEngineService(= piEngineServiceAdapter),可选面实际恒被提供——
|
|
1209
|
-
* 并非「仅 chat 绑定的实例提供、SAR 的实例不提供」。两域分支改由 taskId 空间区分:
|
|
1210
|
-
* chat ticket 的 key 是 record.id(编排层预建时 set),SAR 的 taskId 是独立铸造的
|
|
1211
|
-
* `sa-<uuid>`(subprocess-agent-runner.ts),恒不在 ticket map 中 → run 的
|
|
1212
|
-
* takeChatRound 探测恒 miss → 恒走 executeAndAwait 分支。可选面保留 optional 的意义
|
|
1213
|
-
* 是测试可注入仅含 workflow 面的 fake;requireResumeFace / runChatTicket 的 throw
|
|
1214
|
-
* 分支在生产绑定(asEngineService 全量提供)下不可达,仅防 fake 绑定漏面时静默
|
|
1215
|
-
* 丢消息/丢轮次。
|
|
1216
|
-
*/
|
|
1217
|
-
interface PiEngineService {
|
|
1218
|
-
executeAndAwait(opts: ExecuteOptions, signal?: AbortSignal, onEvent?: (event: AgentEvent) => void, stream?: SubagentStream): Promise<AgentResult>;
|
|
1219
|
-
getRecordForAction(id: string): ExecutionRecord;
|
|
1220
|
-
closeSubagent(record: ExecutionRecord, force: boolean): Promise<void>;
|
|
1221
|
-
cancel(id: string): boolean;
|
|
1222
|
-
collectRecords(limit: number, statusFilter?: StatusFilter): SubagentRecord[];
|
|
1223
|
-
/** chat 域轮次交接(run 的 chat 分支入口):按 taskId 取走预备包(一次性消费)。 */
|
|
1224
|
-
takeChatRound?(taskId: string): ChatRoundTicket | undefined;
|
|
1225
|
-
/** 执行预备的 chat 轮次(编排归 Service:pool 槽 + runSpawn + 终态迁移)。 */
|
|
1226
|
-
runChatRound?(ticket: ChatRoundTicket): Promise<AgentResult$1>;
|
|
1227
|
-
/** 冷路径续轮(interact message 分支的编排回调:守卫 + record 迁移 + 预备轮次 kick-off)。 */
|
|
1228
|
-
resumeChatRound?(record: ExecutionRecord, text: string): void;
|
|
1229
|
-
/** record 状态迁移上报(热路径投递后让 runtime 派生缓存失效 / GUI 回流)。 */
|
|
1230
|
-
reportRecordTransition?(record: ExecutionRecord): void;
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
|
-
/**
|
|
1234
|
-
* 把 'pi' 引擎登记进 registry(幂等——组合根可能多次执行,如每次 session_start)。
|
|
1235
|
-
* 工厂绑进程单例 getSubagentService:惰性求值,session_start 注入前调用 getEngine
|
|
1236
|
-
* 只会拿到引擎实例,真正 run 时才解析服务。
|
|
1237
|
-
*/
|
|
1238
|
-
declare function registerPiEngine(): void;
|
|
1239
|
-
|
|
1240
|
-
/** provider 注册表条目的最小消费面(凭据 + 模型清单校验)。 */
|
|
1241
|
-
interface ZcodeProviderEntry {
|
|
1242
|
-
options?: {
|
|
1243
|
-
apiKey?: unknown;
|
|
1244
|
-
};
|
|
1245
|
-
models?: Record<string, unknown>;
|
|
1246
|
-
[k: string]: unknown;
|
|
1247
|
-
}
|
|
1248
|
-
/** [R4] 规范化全名 provider/model → create 参数的 per-session model 拆分(A.2 ① strict 对象)。 */
|
|
1249
|
-
declare function splitZcodeModelRef(modelRef: string): {
|
|
1250
|
-
providerId: string;
|
|
1251
|
-
modelId: string;
|
|
1252
|
-
};
|
|
1253
|
-
declare function hasApiKey(entry: ZcodeProviderEntry): boolean;
|
|
1254
|
-
interface ZcodeSourcePaths {
|
|
1255
|
-
/** 桌面登录态 config(唯一凭据源)。缺省 ~/.zcode/v2/config.json。 */
|
|
1256
|
-
v2ConfigPath?: string;
|
|
1257
|
-
}
|
|
1258
|
-
/**
|
|
1259
|
-
* 短名(无 provider 前缀)解析的默认 provider(zsub DEFAULT_PROVIDER_ID 同构)。
|
|
1260
|
-
* 导出(sink 设计 U1 模型切分四件之一):barrel re-export 供第三宿主模型路由消费,
|
|
1261
|
-
* 实现体内聚本文件不挪。
|
|
1262
|
-
*/
|
|
1263
|
-
declare const DEFAULT_PROVIDER_ID = "builtin:bigmodel-coding-plan";
|
|
1264
|
-
|
|
1265
|
-
/** ZcodeEngine 构造依赖(全部可注入——测试不依赖真机 CLI/真凭据)。 */
|
|
1266
|
-
interface ZcodeEngineDeps {
|
|
940
|
+
private scanFile;
|
|
1267
941
|
/**
|
|
1268
|
-
*
|
|
1269
|
-
*
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
/** zcode CLI 路径;缺省 ZCODE_CLI_DEFAULT_PATH。 */
|
|
1273
|
-
cliPath?: string;
|
|
1274
|
-
/** 源 config 路径覆盖(测试注入临时源;缺省读 ~/.zcode)。 */
|
|
1275
|
-
sources?: ZcodeSourcePaths;
|
|
1276
|
-
/** 版本探测执行器(probe check "version";测试注入 fake 防真实子进程)。 */
|
|
1277
|
-
probeVersion?: (cliPath: string) => Promise<string | undefined>;
|
|
1278
|
-
/** env 基底(测试注入;缺省 process.env——app-server env 组装经它)。 */
|
|
1279
|
-
processEnv?: NodeJS.ProcessEnv;
|
|
1280
|
-
}
|
|
1281
|
-
/** zcode 引擎适配器。 */
|
|
1282
|
-
declare class ZcodeEngine implements EnginePort {
|
|
1283
|
-
readonly id = "zcode";
|
|
1284
|
-
private readonly deps;
|
|
1285
|
-
private probeCache;
|
|
1286
|
-
private appserverRuntime;
|
|
1287
|
-
/**
|
|
1288
|
-
* [P0-1 U4] 引擎停机标志(dispose 置位,不重置——dispose 后首个 run 走重建路径
|
|
1289
|
-
* 不受影响):瞬时重试判定据此排除 dispose 收割引发的崩溃形态——停机后的重试轮
|
|
1290
|
-
* 会经 ensureAppServerRuntime 惰性重建进程(复活已停机引擎),违背 dispose 防泄漏
|
|
1291
|
-
* 语义。
|
|
1292
|
-
*/
|
|
1293
|
-
private disposed;
|
|
1294
|
-
constructor(deps: ZcodeEngineDeps);
|
|
1295
|
-
/**
|
|
1296
|
-
* zcode 链路实际接通的能力(D3 链路口径。声明升级必须先改链路再改声明(C4 原则)。
|
|
1297
|
-
*/
|
|
1298
|
-
capabilities(): EngineCapabilities;
|
|
1299
|
-
/** 探针(D7):二进制存在 + 版本解析(zcode 无公开契约,版本漂移的入口信号)。 */
|
|
1300
|
-
probe(opts?: {
|
|
1301
|
-
force?: boolean;
|
|
1302
|
-
}): Promise<ProbeReport>;
|
|
1303
|
-
/** check 1:二进制存在性(isFile 才算——同名目录不是可执行入口)。 */
|
|
1304
|
-
private probeBinaryCheck;
|
|
1305
|
-
/** check 2:`--version` 解析(probeVersion 可注入——测试 fake 防真实子进程)。 */
|
|
1306
|
-
private probeVersionCheck;
|
|
1307
|
-
/** 探针失败的恢复指引(§3.3.3 终态四:版本确认命令 + 探针重跑 + 调研文档路径)。 */
|
|
1308
|
-
private probeFailureRecovery;
|
|
1309
|
-
/** D1 主语义:唯一通道 = app-server 常驻连接(spawn 降级链已删除)。 */
|
|
1310
|
-
run(task: AgentCallOpts, ctx: RunContext): Promise<EngineRunResult>;
|
|
1311
|
-
/**
|
|
1312
|
-
* 常驻路径主编排:模型解析(v2 单源校验)→ 惰性连接 + runTurn(事件时序前移:
|
|
1313
|
-
* text_delta 流式、终态后 message_end/turn_end)→ schema 仿真重试 → outcome/handle。
|
|
1314
|
-
* poolKey 固定 'shared'(共享宿主 HOME,无池),onPoolResolved 在 prepare 期、
|
|
1315
|
-
* onHandleReady 在 create 应答后(§3.4 不变量 3)。
|
|
1316
|
-
*/
|
|
1317
|
-
private runViaAppServer;
|
|
1318
|
-
/** pre-aborted 短路收口:合成中止 outcome + 'shared' 锚定 handle。 */
|
|
1319
|
-
private abortedAppServerRun;
|
|
1320
|
-
/**
|
|
1321
|
-
* 首轮执行 + 双重试编排(常驻路径):
|
|
1322
|
-
* - **schema 仿真重试**(既有语义):parsed 但校验失败时重试一次(强化 JSON 输出
|
|
1323
|
-
* 指令——与 structured-output 的重试语义对齐)。
|
|
1324
|
-
* - **瞬时失败自动重试一次**([P0-1 U4/D6]):末次 attempt 为 timeout 类(idle/
|
|
1325
|
-
* ceiling)或连接崩溃类失败且非用户 abort → 用新会话重跑一次(attempt 本就每次
|
|
1326
|
-
* 新建会话)。重试轮 prompt 用 basePrompt 原样重跑(失败形态非 schema),文案补
|
|
1327
|
-
* 「已自动重试一次」句(retried 标记仅对真实发生的重试生效)。
|
|
1328
|
-
*
|
|
1329
|
-
* 两次重试一次封顶各自独立(D6 被否①:多次重试/指数退避不做——重跑一轮=整任务
|
|
1330
|
-
* 重算,一次封顶)。组合序:瞬时重试在前、schema 重试在后——瞬时重试轮 parsed 且
|
|
1331
|
-
* 校验失败时仍进 schema 重试(末次 attempt 语义,schema 重试编排保持现状不动)。
|
|
942
|
+
* [perf L-1] 磁盘索引查询(首扫惰性装载,miss/空索引时 get 恒 undefined = 无索引)。
|
|
943
|
+
* 条目戳匹配 jsonl 当前 stat → 零内容读取构造缓存条目。sidecar payload(tombstone/
|
|
944
|
+
* alive)是活态数据,沿用探测分支的每轮重读语义;finalized reason 静态数据仅在
|
|
945
|
+
* sidecar 存在时读一次(文件小,成本可忽略)。
|
|
1332
946
|
*
|
|
1333
|
-
*
|
|
1334
|
-
*
|
|
1335
|
-
* 只在最终轮终态后合成(不变量 2/5)。
|
|
947
|
+
* 返回 undefined = 索引未命中/戳不匹配(调用方落到原三级探测);null = 负条目命中
|
|
948
|
+
* (「确认无 identity」跨实例持久,零探测跳过,与内存负缓存同款形态)。
|
|
1336
949
|
*/
|
|
1337
|
-
private
|
|
1338
|
-
/** 常驻路径的 handle 合成(poolKey 固定 'shared';dbPath = 宿主 HOME 绝对路径)。 */
|
|
1339
|
-
private appServerHandle;
|
|
950
|
+
private buildEntryFromIndex;
|
|
1340
951
|
/**
|
|
1341
|
-
*
|
|
1342
|
-
*
|
|
952
|
+
* [perf L-1] 扫描尾索引落盘(节流):释放映像 → dirty/高版本/60s 节流窗三重门 →
|
|
953
|
+
* fire-and-forget saveIndex(fileCache 全量投影)。写决策与发起在同步栈(collectRecords
|
|
954
|
+
* 返回后不会再有本轮写);仅写完成的回调(推进节流窗)是异步的。所有 return 路径均
|
|
955
|
+
* 不清 dirty——未落盘的探测成果跨轮携带,直至真正写入。
|
|
1343
956
|
*
|
|
1344
|
-
*
|
|
1345
|
-
*
|
|
1346
|
-
*
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
* killChain 后等待连接 finalize 实际完成(child 置空 + onClose 广播)再宣告链终局:
|
|
1351
|
-
* shutdown resolve 于 `exit` 事件,而 finalize 挂 `close`(stdio 排空)——两者之间的
|
|
1352
|
-
* 事件窗口内 conn.child 仍非 null,紧接的下一任务 request 会复用垂死进程(写入成功
|
|
1353
|
-
* 但必败,走崩溃路径)而非触发重建。与 shutdownRuntimeAndDisposeChannel 的
|
|
1354
|
-
* HARVEST_GRACE 同款 race 形态(close 永不到达不挂死)。超时入口的 await 链终局
|
|
1355
|
-
* 语义(D6 重试时序依据)因此是「进程收割确认完成」而非「SIGTERM 已发出」。
|
|
1356
|
-
*/
|
|
1357
|
-
private awaitConnFinalized;
|
|
1358
|
-
/**
|
|
1359
|
-
* D3 abort 链执行体(双入口分岔,P0-1 U2 参数化——设计
|
|
1360
|
-
* timeout-zcode-turn-and-settled-watchdog.md §6 D3 v1.1):
|
|
1361
|
-
* - **用户取消入口**(`escalateOn: "turn-settled"`,现状语义零改动;fire-and-forget——
|
|
1362
|
-
* 与 turn promise 并行推进):stop 帧(超时 ZCODE_APPSERVER_STOP_TIMEOUT_MS)→
|
|
1363
|
-
* grace 窗口内 turn 落定即止(不杀共享进程)→ 超窗 killChain(conn.shutdown 全序:
|
|
1364
|
-
* SIGTERM→grace→SIGKILL)。turn 的最终落定由 attempt 主路径 await 收口,本链不
|
|
1365
|
-
* 直接产出终态。abort 与 create 竞态(signal 先到、session 未建立):等会话建立
|
|
1366
|
-
* (带上限)再发 stop——否则 stop 永远发不出,直接连坐杀共享进程。
|
|
1367
|
-
* - **超时入口**(`escalateOn: "stop-outcome"`,channel 判死后由 catch await 链终局):
|
|
1368
|
-
* turn 已 reject,对它 race 恒真不可用(v1 击穿点)——升级判据改挂在 **stop 应答
|
|
1369
|
-
* 三态**:①成功应答 → 服务端接受停 turn,止损确认,链终止;②协议性 error 应答
|
|
1370
|
-
* (有 error 帧即控制面活的证据,多因 runTurn finally 的 closeSession 先行关会话,
|
|
1371
|
-
* 健康形态竞态)→ 链终止**不升级**(止损由 close 回收 + 服务端自治承担;把
|
|
1372
|
-
* 「stop 报错」一律升级会误杀健康共享进程并连坐并发任务);③超时/写入失败/进程
|
|
1373
|
-
* 死等连接级失败(控制面死)→ killChain 升级。判据实现依据:error 应答帧 reject
|
|
1374
|
-
* 携带 number code(isAppServerRpcError);连接级失败是无 code 的新 Error
|
|
1375
|
-
* (connection.request 三态 reject 形态)。返回值即止损路径(超时入口的 outcome
|
|
1376
|
-
* 文案素材——D3 强制可观测面)。
|
|
1377
|
-
*/
|
|
1378
|
-
private appServerAbortChain;
|
|
1379
|
-
/**
|
|
1380
|
-
* 惰性获取常驻运行时(D1:每引擎实例一条连接,全任务共享;连接自身的崩溃重建在
|
|
1381
|
-
* connection 层内部完成——同一条代码路径,§3.4 不变量 4)。常驻进程不进宿主
|
|
1382
|
-
* spawnedChildren、不调 onChildSpawned(D6——生命周期归 dispose)。进程级 --cwd
|
|
1383
|
-
* 用引擎数据目录(连接跨任务共享的中性位置,工作区由 create 的
|
|
1384
|
-
* workspace.workspacePath 按任务传递——D10 基线不预设任务级进程 cwd)。
|
|
1385
|
-
* spawn 经 fs 拦截 wrapper(appserver-launcher:cli config 读取重定向为
|
|
1386
|
-
* 「真实文件 + v2 provider 注入」——CLI 形态 app-server 在共享宿主 HOME 下的
|
|
1387
|
-
* 唯一凭据供数通路,机制与漂移面见该文件头注)。
|
|
1388
|
-
*/
|
|
1389
|
-
private ensureAppServerRuntime;
|
|
1390
|
-
/**
|
|
1391
|
-
* [R5 修复 R4 既有竞态] shutdown → 等崩溃收割实际发生 → channel 退订。killChain 在
|
|
1392
|
-
* `exit` 事件 resolve,而连接 finalize(onClose → channel 的 failAllTurns)挂
|
|
1393
|
-
* `close` 事件——两者之间有一个事件循环窗口:shutdown resolve 后立即退订,在途
|
|
1394
|
-
* turn 会错过收割、挂到 turnTimeoutMs(300s)。退订前等 onClose 触发(本方法先于
|
|
1395
|
-
* shutdown 订阅;channel 的订阅在构造期更早——其 failAllTurns 先于本 promise
|
|
1396
|
-
* resolve 执行);ZCODE_APPSERVER_HARVEST_GRACE_MS 兜底防 `close` 永不到达时挂死。
|
|
1397
|
-
* [P0-1 U5/D7] grace race 输掉(close 迟到/永不到达——stdio 被孙进程持有排空不
|
|
1398
|
-
* 尽等病态形态)时,channel.dispose() 内置的 dispose 收割(failAllTurns 先于退订,
|
|
1399
|
-
* SessionChannel.dispose)兜底在途 turn——退化终点从「挂满 turn 自身 idle/总上界
|
|
1400
|
-
* 预算」收敛为「grace 窗口内明确失败」(设计 §3.4 退化路径闭合);race 窗口与
|
|
1401
|
-
* awaitConnFinalized 同源同量级(ZCODE_APPSERVER_HARVEST_GRACE_MS)。正常 close
|
|
1402
|
-
* 先到时 onClose 收割先行,dispose 收割幂等 no-op(零回归)。
|
|
1403
|
-
*/
|
|
1404
|
-
private shutdownRuntimeAndDisposeChannel;
|
|
1405
|
-
/**
|
|
1406
|
-
* [R1 D6 主体] 引擎停机面:①fire 全部在途会话的 session/close 帧(不等待
|
|
1407
|
-
* 应答——D6① 顺序规定:close 帧必须先于 SIGTERM,否则对面来不及处理即被杀)→
|
|
1408
|
-
* ②同步 SIGTERM(conn.shutdown 调用内 killChain 前缀同步执行——同步面在返回
|
|
1409
|
-
* Promise 前完成)→ ③grace → SIGKILL(异步面,Promise resolve 于进程退出)。
|
|
1410
|
-
* 幂等:运行时字段取走即置空,二次调用零副作用;dispose 后首个 run 经
|
|
1411
|
-
* ensureAppServerRuntime 自动重建(与崩溃重建同一代码路径,不变量 4)。
|
|
1412
|
-
*/
|
|
1413
|
-
dispose(): Promise<void>;
|
|
1414
|
-
/** 终态合成(extension-conventions 函数 80 行上限,从 run 提取):aborted / run-failed / parsed 三分支。 */
|
|
1415
|
-
private finalizeOutcome;
|
|
1416
|
-
/** abort 合成终态:exitCode=null(record 正常收尾,不留僵尸)。 */
|
|
1417
|
-
private applyAbortedOutcome;
|
|
1418
|
-
/**
|
|
1419
|
-
* run-failed 合成终态:错误信息由 buildAppServerRunFailedMessage 产出(已含恢复
|
|
1420
|
-
* 指引)直接透传;附带的会话 id 落 outcome.sessionId(错误规格表 -32004 行「含会话
|
|
1421
|
-
* id」——appServerHandle 据此写 handle.sessionRef,run-failed 不再恒缺)。
|
|
1422
|
-
*/
|
|
1423
|
-
private applyRunFailedOutcome;
|
|
1424
|
-
/** parsed 合成终态:content/sessionId/usage 落位 + schema 校验分流 + coarse 事件。 */
|
|
1425
|
-
private applyParsedOutcome;
|
|
1426
|
-
/**
|
|
1427
|
-
* D1 可选面:zcode 首期不支持 conversation(capabilities 声明)——同步拒绝、
|
|
1428
|
-
* 不创建进程,文案给可操作建议(A11)。
|
|
1429
|
-
*/
|
|
1430
|
-
interact(_handle: EngineHandle, _action: InteractAction): Promise<InteractResult>;
|
|
1431
|
-
/** [U7] 模型可发现性:v2 桌面登录态聚合(带凭据 provider × models),失败安全返回清单本身可能为空。 */
|
|
1432
|
-
listModels(): Array<{
|
|
1433
|
-
id: string;
|
|
1434
|
-
name?: string;
|
|
1435
|
-
}>;
|
|
957
|
+
* 并发安全:节流基准只在写成功后推进,W1 在途时新一轮过窗扫描可再 dispatch W2(不做
|
|
958
|
+
* 进程内排队——fire-and-forget 语义保持)。安全性由 saveIndex 的 tmp 唯一性
|
|
959
|
+
* (pid+单调序号)保证:交错 rename 的终态必为某一次的完整快照(last-writer-wins,
|
|
960
|
+
* 陈旧快照胜出时下轮戳不匹配自愈),不依赖本方法串行化。
|
|
961
|
+
*/
|
|
962
|
+
private flushIndexAfterScan;
|
|
1436
963
|
/**
|
|
1437
|
-
* [
|
|
1438
|
-
*
|
|
1439
|
-
*
|
|
1440
|
-
*
|
|
1441
|
-
* (engine/model-validation.ts)包装成「引擎与模型不配套」文案。
|
|
964
|
+
* [perf L-1] fileCache 全量投影 → 索引快照(basename → 正/负条目)。
|
|
965
|
+
* 投影式单一 SSOT:不维护第二份可变索引映像(防双轨漂移);fileCache 已被
|
|
966
|
+
* reconstructAll 修剪掉消失文件(修剪时置 indexDirty),下次过窗写时快照清除
|
|
967
|
+
* 磁盘上的陈旧条目。
|
|
1442
968
|
*/
|
|
1443
|
-
|
|
1444
|
-
canonicalRef: string;
|
|
1445
|
-
};
|
|
969
|
+
private projectIndexEntries;
|
|
1446
970
|
/**
|
|
1447
|
-
*
|
|
1448
|
-
*
|
|
1449
|
-
*
|
|
1450
|
-
*
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
*
|
|
1458
|
-
*
|
|
1459
|
-
*
|
|
1460
|
-
*
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
*
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
private buildPrompt;
|
|
1483
|
-
}
|
|
1484
|
-
/**
|
|
1485
|
-
* prepare 期能力拒绝的历史载体(code 进 message 前缀,调用方可程序化分流)。
|
|
1486
|
-
* [U10① D6] execution 运行时面错误族成员:export 供宿主 instanceof 分流。
|
|
1487
|
-
* [D3-④ 合并注] 引擎内 shape 拒绝已上提 common/capability-gate(EngineError 承载),
|
|
1488
|
-
* 本引擎不再抛出;保留 export 维持错误族面兼容(execution-runtime-face.test 消费),
|
|
1489
|
-
* 待波 2 收口时随 export 面清理一并裁决。
|
|
1490
|
-
*/
|
|
1491
|
-
declare class ZcodeTaskShapeError extends Error {
|
|
1492
|
-
readonly code: string;
|
|
1493
|
-
constructor(code: string, message: string);
|
|
1494
|
-
}
|
|
1495
|
-
|
|
1496
|
-
/** 构造 ZcodeEngine(DI 工厂——测试/宿主注入 deps)。 */
|
|
1497
|
-
declare function createZcodeEngine(deps: ZcodeEngineDeps): ZcodeEngine;
|
|
1498
|
-
/**
|
|
1499
|
-
* 把 'zcode' 引擎登记进 registry(幂等——组合根可能多次执行,registerEngine 覆盖
|
|
1500
|
-
* 语义)。工厂惰性:登记不触发任何文件/进程探测,首次 getEngine 才建实例。
|
|
1501
|
-
*/
|
|
1502
|
-
declare function registerZcodeEngine(engineDataDir?: () => string): void;
|
|
1503
|
-
|
|
1504
|
-
/**
|
|
1505
|
-
* 缺省引擎 id(D9:缺省引擎 = 'pi',回填期零风险默认)。
|
|
1506
|
-
* P1 无 per-agent/调用级 engine 字段(P4 配置路由引入三层优先级),一切执行恒走缺省。
|
|
1507
|
-
*/
|
|
1508
|
-
declare const DEFAULT_ENGINE_ID = "pi";
|
|
1509
|
-
/**
|
|
1510
|
-
* defaultEngine 缺省归一(单一权威源):空白 / undefined 归一到缺省引擎('pi')。
|
|
1511
|
-
* 引擎感知检测 diff 与状态段渲染必须对同一读取结果给出同一引擎 id——若两处各自
|
|
1512
|
-
* 内联归一,一致性只靠注释人工耦合,漂移即两处说谎;故收敛到本函数供各处调用。
|
|
1513
|
-
* sanitize 保证透传值非空,但可能带首尾空格,故 trim 后再判。
|
|
1514
|
-
*/
|
|
1515
|
-
declare function normalizeEngineId(engine: string | undefined): string;
|
|
1516
|
-
|
|
1517
|
-
/**
|
|
1518
|
-
* 恒在状态段 <current_subagent_engine>(设计 D6:pi 引擎也声明——AI 不需要
|
|
1519
|
-
* 「从段缺失反推」当前引擎)。三种形态(§3.1 终态逐字基准 + 失败路径表):
|
|
1520
|
-
* - 缺省 / pi:声明 pi + 指向上方核心段 <available_provider_models>(无冲突 bullet);
|
|
1521
|
-
* - 非 pi 且已注册:指向下方该引擎清单段 + 「pi registry id 不适用」+ AGENTS.md
|
|
1522
|
-
* 冲突裁决 bullet + 省略 model 用引擎默认;
|
|
1523
|
-
* - 未注册引擎(如配置手误 "ghost"):如实显示配置值 + 警告行(派发将报
|
|
1524
|
-
* engine_not_found,指引修 subagents/config.json)——G4 诚实降级:不静默、不伪造。
|
|
1525
|
-
*
|
|
1526
|
-
* 字节稳定(D7):纯字符串确定性拼装(无 localeCompare / 无随机序 / 无时间态);
|
|
1527
|
-
* 引擎注册与否经 hasEngine 只读判断(不取实例、不触发工厂副作用),同输入恒同输出。
|
|
1528
|
-
*/
|
|
1529
|
-
declare function buildSubagentEngineSection(defaultEngine: string | undefined): string;
|
|
1530
|
-
/**
|
|
1531
|
-
* 依据全局 defaultEngine 生成追加段(不含前导换行)。
|
|
1532
|
-
*
|
|
1533
|
-
* 规则(设计 §3.1 失败路径表 + G4 + U2 一致性审查修订):
|
|
1534
|
-
* - defaultEngine 为 pi / 缺省 → 不注入(pi 段已由核心提供);
|
|
1535
|
-
* - 引擎未注册 → 不注入(状态段 <current_subagent_engine> 已有警告行,避免双份);
|
|
1536
|
-
* - 已注册且 listModels 有清单 → 注入该引擎段(渲染不变);
|
|
1537
|
-
* - 已注册但 listModels 未实现 / 返回 null → 「与主 agent 模型体系一致」声明段
|
|
1538
|
-
* (port 契约语义:引擎无自有 provider 枚举面,id 见上方核心段,见
|
|
1539
|
-
* buildCoreAlignedHint);
|
|
1540
|
-
* - 已注册但空清单 / listModels 抛异常 → 「无凭据模型」提示行段(引擎 provider
|
|
1541
|
-
* 体系存在但当前无可用模型,见 buildEmptyModelsHint;从「静默不注入」改为如实
|
|
1542
|
-
* 声明——空清单返回空串会让 AI 误以为没有任何引擎清单可看)。
|
|
1543
|
-
* fail-safe:listModels 异常同样落提示行段、不向外抛(注入失败不阻塞 agent loop——
|
|
1544
|
-
* 与 system-prompt extension 的 before_agent_start 处置一致)。
|
|
1545
|
-
*/
|
|
1546
|
-
declare function buildEngineModelsPromptAppend(defaultEngine: string | undefined): string;
|
|
971
|
+
* [perf] byId 索引直查 light record(单文件 stat 校验,不触发 getFullRecord 的
|
|
972
|
+
* 全量重建)。idToFile 未热(进程重启后尚未扫描过)时返回 undefined,调用方
|
|
973
|
+
* 自行兜底全目录扫描——用于把「跨重启后每条 message 一次 collectRecords 全扫」
|
|
974
|
+
* 降为 O(1) 索引命中。
|
|
975
|
+
*/
|
|
976
|
+
findLightById(id: string): SubagentRecord | undefined;
|
|
977
|
+
/**
|
|
978
|
+
* [perf] 单 record 详情懒加载:内存 running record 投影全量;磁盘 record 全量重建
|
|
979
|
+
* (reconstructFromFile)并套用同一 sidecar 状态矩阵。结果缓存在 FileCacheEntry.full,
|
|
980
|
+
* stat 戳变化时随 light 一起失效。列表 collectRecords 返回 light(无 eventLog/
|
|
981
|
+
* result/turns 等重数据),详情面板/工具 list 按需调本方法补齐。
|
|
982
|
+
*
|
|
983
|
+
* 返回 undefined:id 不存在(内存与磁盘均无)。reconstructFromFile 失败(无
|
|
984
|
+
* assistant message 等)→ 返回 light(无详情可补,缓存哨兵防重复全文重读)。
|
|
985
|
+
*/
|
|
986
|
+
getFullRecord(id: string): SubagentRecord | undefined;
|
|
987
|
+
/** alive 探活刷新(scanFile 缓存命中与 reconstructAll 快路径共用):
|
|
988
|
+
* 分支 3 的 running + alive 条目每扫重查 pid(结果不落盘,进程死亡无 IO),
|
|
989
|
+
* 保留旧实现「每次 collectRecords 重新 isProcessAlive」的语义。 */
|
|
990
|
+
private static refreshAlive;
|
|
991
|
+
/** identity 基底 + sidecar 状态矩阵 → 缓存条目(索引命中与探测重建两分支的公共装配点)。 */
|
|
992
|
+
private static buildFileCacheEntry;
|
|
993
|
+
/** identity 基底(头部 light 或全量 recon)+ 四分支 sidecar 状态矩阵 → SubagentRecord。 */
|
|
994
|
+
private static buildRecord;
|
|
995
|
+
/** 排序比较器:status priority(running<failed<cancelled<done)+ startedAt desc。 */
|
|
996
|
+
private static compareRecords;
|
|
997
|
+
/** FR-8: 同步读取所有 manifest 记录(封装 ManifestStore.listAllSync,消除反射访问)。 */
|
|
998
|
+
private readManifestsSync;
|
|
999
|
+
/** FR-8: ManifestRecord → SubagentRecord(manifest 源投影)。
|
|
1000
|
+
* task/slug/model 从 manifest 真实值投影(配合 writeManifest 补字段),缺失兜底空串。
|
|
1001
|
+
* status 越界(mapManifestStatus 返回 null)时返回 null,由 collectRecords 跳过。 */
|
|
1002
|
+
private static manifestToSubagent;
|
|
1003
|
+
/** ExecutionRecord → SubagentRecord(内存源投影)。 */
|
|
1004
|
+
private static recordToSubagent;
|
|
1005
|
+
}
|
|
1547
1006
|
|
|
1548
1007
|
/**
|
|
1549
|
-
*
|
|
1550
|
-
*
|
|
1008
|
+
* chat 域轮次交接包的 core 契约基座(设计 §3.8 D2「ChatRoundTicket → HostBridge」)。
|
|
1009
|
+
* pi 专有扩展(identity / SessionRunnerContext / SpawnResumeOpts resume)在
|
|
1010
|
+
* pi-engine.ChatRoundTicket extends 本接口(W7 随包迁移;过渡期 record/opts/signal/
|
|
1011
|
+
* priority/stream 五字段的宿主编排语义在此单一权威)。
|
|
1551
1012
|
*/
|
|
1552
|
-
interface
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
poolKey: string;
|
|
1013
|
+
interface HostChatRoundTicket {
|
|
1014
|
+
record: ExecutionRecord;
|
|
1015
|
+
opts: ExecuteOptions;
|
|
1016
|
+
signal: AbortSignal | undefined;
|
|
1017
|
+
priority: number;
|
|
1018
|
+
stream?: SubagentStream;
|
|
1559
1019
|
}
|
|
1560
1020
|
/**
|
|
1561
|
-
*
|
|
1562
|
-
*
|
|
1563
|
-
*
|
|
1564
|
-
*
|
|
1021
|
+
* HostBridge 的服务实现面(SubagentService 的结构子集,鸭子类型——与原 pi-engine 的
|
|
1022
|
+
* PiEngineService 同一形态的协议化泛化:chat 域轮次面泛型参数化,pi 绑定 =
|
|
1023
|
+
* HostBridgeServiceFace<ChatRoundTicket>,见 pi-host-binding.ts 的 re-export)。
|
|
1024
|
+
* 为什么用结构接口而非 import SubagentService 类型:防 Service 内部演进连锁影响
|
|
1025
|
+
* 契约面 + 测试可注入 fake(PiEngineService 的既有先例,语义照搬)。
|
|
1565
1026
|
*/
|
|
1566
|
-
interface
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
/**
|
|
1579
|
-
|
|
1580
|
-
id: string;
|
|
1581
|
-
toolName: string;
|
|
1582
|
-
input: unknown;
|
|
1583
|
-
output?: string;
|
|
1584
|
-
details?: Record<string, unknown>;
|
|
1585
|
-
status: "completed" | "error";
|
|
1586
|
-
startTime: number;
|
|
1587
|
-
endTime: number;
|
|
1588
|
-
}
|
|
1589
|
-
/** GUI thinking 块视图(结构兼容 shared ThinkingBlock)。 */
|
|
1590
|
-
interface HistoryThinkingView {
|
|
1591
|
-
id: string;
|
|
1592
|
-
content: string;
|
|
1593
|
-
collapsed: boolean;
|
|
1594
|
-
}
|
|
1595
|
-
/** GUI usage 视图(结构兼容 shared Usage)。 */
|
|
1596
|
-
interface HistoryUsageView {
|
|
1597
|
-
inputTokens: number;
|
|
1598
|
-
outputTokens: number;
|
|
1599
|
-
}
|
|
1600
|
-
/** GUI 消息视图(结构兼容 shared Message 的消费子集——见文件头「为什么不 import shared」)。 */
|
|
1601
|
-
interface HistoryMessage {
|
|
1602
|
-
id: string;
|
|
1603
|
-
role: "user" | "assistant";
|
|
1604
|
-
content: string;
|
|
1605
|
-
status: "complete" | "error";
|
|
1606
|
-
toolCalls?: HistoryToolCallView[];
|
|
1607
|
-
thinking?: HistoryThinkingView[];
|
|
1608
|
-
usage?: HistoryUsageView;
|
|
1609
|
-
timestamp: number;
|
|
1610
|
-
error?: string;
|
|
1027
|
+
interface HostBridgeServiceFace<TTicket extends HostChatRoundTicket = HostChatRoundTicket> {
|
|
1028
|
+
executeAndAwait(opts: ExecuteOptions, signal?: AbortSignal, onEvent?: (event: AgentEvent) => void, stream?: SubagentStream): Promise<AgentResult>;
|
|
1029
|
+
getRecordForAction(id: string): ExecutionRecord;
|
|
1030
|
+
closeSubagent(record: ExecutionRecord, force: boolean): Promise<void>;
|
|
1031
|
+
cancel(id: string): boolean;
|
|
1032
|
+
collectRecords(limit: number, statusFilter?: StatusFilter): SubagentRecord[];
|
|
1033
|
+
/** chat 域轮次交接(run 的 chat 分支入口):按 taskId 取走预备包(一次性消费)。 */
|
|
1034
|
+
takeChatRound?(taskId: string): TTicket | undefined;
|
|
1035
|
+
/** 执行预备的 chat 轮次(编排归 Service:pool 槽 + runSpawn + 终态迁移)。 */
|
|
1036
|
+
runChatRound?(ticket: TTicket): Promise<AgentResult$1>;
|
|
1037
|
+
/** 冷路径续轮(interact message 分支的编排回调:守卫 + record 迁移 + kick-off)。 */
|
|
1038
|
+
resumeChatRound?(record: ExecutionRecord, text: string): void;
|
|
1039
|
+
/** record 状态迁移上报(热路径投递后让 runtime 派生缓存失效 / GUI 回流)。 */
|
|
1040
|
+
reportRecordTransition?(record: ExecutionRecord): void;
|
|
1611
1041
|
}
|
|
1612
|
-
/**
|
|
1613
|
-
* engineHandle 唯一守卫(D1 双守卫收敛点)。
|
|
1614
|
-
* 语义取收敛前 extractor 侧的严格版(两份 guard 此前已在「sessionRef 含非 string 值」
|
|
1615
|
-
* 维度分叉:extractor 整体拒绝、history 侧逐键过滤——收敛选整体拒绝,坏形状不进
|
|
1616
|
-
* record,读侧按缺 handle 降级 outcome-only,两侧行为面等价落点都是降级):
|
|
1617
|
-
* - poolKey 缺失 / 非 string / 空串 → undefined(定位符不完整,读侧降③级)
|
|
1618
|
-
* - sessionRef 非 plain object 或含非 string 值 → undefined(整体拒绝)
|
|
1619
|
-
* - journalPath 可选 string(空串视为缺省)
|
|
1620
|
-
*/
|
|
1621
|
-
declare function parseEngineHandle(raw: unknown): EngineHandleView | undefined;
|
|
1622
|
-
|
|
1623
|
-
/**
|
|
1624
|
-
* 非 pi record 的历史详情读取(三级降级主入口,D1 收敛后的唯一生产实现)。
|
|
1625
|
-
*
|
|
1626
|
-
* 降级顺序 ①→②→③ 逐级尝试,每级失败留 debug/warn 日志不抛崩溃(GUI 详情页
|
|
1627
|
-
* 永不白屏报错,设计 A8)。engineId='pi' 返回 [](pi 的①级 = 调用方现有 JSONL
|
|
1628
|
-
* 直读链,A1 守护)。未注册 reader 的引擎(未来)直接落③级——record 字段就够,
|
|
1629
|
-
* 详情页至少有摘要卡。
|
|
1630
|
-
*
|
|
1631
|
-
* @param record record 快照(engine/engineHandle 为不可信源,内部守卫消费)
|
|
1632
|
-
* @param dataDir xyz-agent 数据根(journal/dbPath 白名单经 paths.ts 布局 SSOT 推导)
|
|
1633
|
-
*/
|
|
1634
|
-
declare function readSubagentHistoryMessages(record: SubagentRecordSnapshot, dataDir: string): Promise<HistoryMessage[]>;
|
|
1635
|
-
|
|
1636
|
-
/**
|
|
1637
|
-
* 从 turns[] 末尾推导当前活动行(running 时)。
|
|
1638
|
-
*
|
|
1639
|
-
* 优先级:最后一个未闭合 turn 的末尾 running toolCall → thinking → text → undefined
|
|
1640
|
-
*
|
|
1641
|
-
* 仅 status==="running" 时返回;terminal 态返回 undefined。
|
|
1642
|
-
*
|
|
1643
|
-
* 注意:返回的 type 联合("tool"|"text"|"thinking")是手写的,未通过类型守卫从
|
|
1644
|
-
* AgentEvent 派生——它映射的是累积的 turn 状态(InternalToolCall._status + turn.thinking/text),
|
|
1645
|
-
* 而非单个事件。若未来新增 turn 内容模式(如 reasoning_summary),须同步扩展本函数,
|
|
1646
|
-
* 否则会静默返回 undefined(活动行运行中途消失)。updateFromEvent 的 switch 有 never 穷尽
|
|
1647
|
-
* 检查,但本函数没有,依赖人工同步。
|
|
1648
|
-
*/
|
|
1649
|
-
declare function getCurrentActivity(record: ExecutionRecord): {
|
|
1650
|
-
type: "tool" | "text" | "thinking";
|
|
1651
|
-
label: string;
|
|
1652
|
-
} | undefined;
|
|
1653
|
-
/**
|
|
1654
|
-
* 聚合所有 turn 的 toolCalls(扁平化),并 strip InternalToolCall 的内部字段。
|
|
1655
|
-
* 供 collectResult / schema enforcement 读,替代旧闭包 toolCalls 旁路。
|
|
1656
|
-
*
|
|
1657
|
-
* 返回 ToolCall[](不含 _status / startedTs)——跨边界导出形状清洁,
|
|
1658
|
-
* 避免内部状态机字段泄漏到 AgentResult.toolCalls / 持久化层。
|
|
1659
|
-
*/
|
|
1660
|
-
declare function getAllToolCalls(record: ExecutionRecord): ToolCall[];
|
|
1661
|
-
/**
|
|
1662
|
-
* 聚合所有 turn 的 toolCalls 总数(免克隆计数)。
|
|
1663
|
-
*
|
|
1664
|
-
* getAllToolCalls 会 flatMap + strip 克隆出完整数组——只需计数的调用方(渲染签名
|
|
1665
|
-
* 每 200ms tick 调用一次)用它是纯浪费;本函数 reduce 累加各 turn 的 length,零分配。
|
|
1666
|
-
* 与 getAllToolCalls(...).length 恒等(同一 turns 源)。
|
|
1667
|
-
*/
|
|
1668
|
-
declare function countAllToolCalls(record: ExecutionRecord): number;
|
|
1669
|
-
/**
|
|
1670
|
-
* closed 终态 → 三态 outcome 的唯一权威派生(D6 收敛:原 notifier/bg-notify-render/
|
|
1671
|
-
* shared deriveClosedDisplay 三处手写同构 switch 的单一实现)。
|
|
1672
|
-
*
|
|
1673
|
-
* 判定顺序(顺序敏感,勿回退成「error 有值即 failed」的无视取消规则):
|
|
1674
|
-
* 1. closedReason === "cancelled" → "cancelled"(取消优先,不参与 error——abort 合成
|
|
1675
|
-
* result 可能携带 error,但用户取消语义优先)
|
|
1676
|
-
* 2. error 非空(truthy,与旧三处同构的 `record.error &&` 判定逐字对齐——空串 error
|
|
1677
|
-
* 不构成失败)→ "failed"
|
|
1678
|
-
* 3. 其余 → "completed"
|
|
1679
|
-
*
|
|
1680
|
-
* [D6 待核项保真] 「failed 优先于 patchFile 提示」:失败轮也会写 patchFile
|
|
1681
|
-
* (doFinalizeRecord Step 0 对 worktreeHandle 无条件 collectPatch),消费方必须先按
|
|
1682
|
-
* outcome 分流再渲染 patch 提示——failed 分支不展示 patch/result。历史 bug:notifier
|
|
1683
|
-
* 的 patchFile 分支曾遮蔽 gc+error 判定,失败终态被 LLM 告知 completed(M1 修复存档)。
|
|
1684
|
-
*
|
|
1685
|
-
* [D6 显式取舍] parent-shutdown/parent-fork/parent-new 合成关闭(subagent-service
|
|
1686
|
-
* disposeAllRecords 合成 result 恒写 error:"closed due to ${reason}")在本映射下落
|
|
1687
|
-
* "failed"——语义为「父进程关闭时子 agent 未完成即失败」,选定行为而非疏漏,
|
|
1688
|
-
* 勿当 bug 改回 cancelled 造成派生矛盾。
|
|
1689
|
-
*
|
|
1690
|
-
* 唯一写点 completeRecord 调用本函数冻结 record.outcome;通知 payload(notifier 投影
|
|
1691
|
-
* 边界)与无 outcome 字段的存量/重建 record 由 projectOutcome 兜底复用本函数。
|
|
1692
|
-
*/
|
|
1693
|
-
declare function deriveOutcome(closedReason: ClosedReason | undefined, error: string | undefined | null): ExecutionOutcome;
|
|
1694
|
-
/**
|
|
1695
|
-
* 投影层 outcome 唯一出口:running → undefined(终态语义不适用活跃态);closed →
|
|
1696
|
-
* 一等 outcome 字段直读优先,字段缺失(存量/磁盘重建 record——outcome 持久化不在
|
|
1697
|
-
* U3 领地内)时回退 deriveOutcome(closedReason, error) 兜底——单一权威函数,
|
|
1698
|
-
* 消费方零手写推导。返回值联合含 "closed-legacy" 预留态,消费方必须处理。
|
|
1699
|
-
*/
|
|
1700
|
-
declare function projectOutcome(record: {
|
|
1701
|
-
status: ExecutionStatus;
|
|
1702
|
-
outcome?: ExecutionOutcome;
|
|
1703
|
-
closedReason?: ClosedReason;
|
|
1704
|
-
error?: string;
|
|
1705
|
-
}): ProjectedOutcome | undefined;
|
|
1706
|
-
/** elapsedSeconds 唯一计算点(共享 helper,消除三处发散)。endedAt 缺失用 Date.now()。 */
|
|
1707
|
-
declare function computeElapsedSeconds(record: {
|
|
1708
|
-
startedAt: number;
|
|
1709
|
-
endedAt?: number;
|
|
1710
|
-
}): number;
|
|
1711
|
-
/**
|
|
1712
|
-
* 投影到 live 进度快照。elapsedSeconds/currentActivity/eventLog 均现算派生。
|
|
1713
|
-
* 供 WorkflowsView 在 agent 运行期间读取实时进度。
|
|
1714
|
-
*/
|
|
1715
|
-
declare function projectLiveProgress(record: ExecutionRecord): {
|
|
1716
|
-
status: ExecutionRecord["status"];
|
|
1717
|
-
turns: number;
|
|
1718
|
-
totalTokens: number;
|
|
1719
|
-
elapsedSeconds: number;
|
|
1720
|
-
eventLog: AgentEventLogEntry[];
|
|
1721
|
-
currentActivity: ReturnType<typeof getCurrentActivity>;
|
|
1722
|
-
lastError: string | undefined;
|
|
1723
|
-
};
|
|
1724
1042
|
|
|
1725
1043
|
/** 三态读取结果(判别联合,调用方按 status 分派)。 */
|
|
1726
1044
|
type GlobalConfigReadResult =
|
|
@@ -2073,19 +1391,26 @@ declare class SubagentService {
|
|
|
2073
1391
|
* 在子进程注册(session-runner spawnedChildren.set)之前,锁空洞由此守卫兜住;EPIPE
|
|
2074
1392
|
* 兜底不持锁,同样被覆盖)。child 注册完成后投递走热路径,不经此守卫。 */
|
|
2075
1393
|
private readonly resumesInFlight;
|
|
2076
|
-
/**
|
|
2077
|
-
*
|
|
2078
|
-
*
|
|
2079
|
-
*
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
private readonly settleRound;
|
|
1394
|
+
/**
|
|
1395
|
+
* [W3 chat 域收口] chat 轮次反向通道路由表(recordId 键):首轮 run chat 注册、
|
|
1396
|
+
* interact 续聊轮复用——host/streamDelta(recordId 分支)与 host/roundLifecycle
|
|
1397
|
+
* (recordId 键)的分发目标(EngineClient.recordRoutes 经
|
|
1398
|
+
* EnginePort.registerChatRoundRoute 注册)。record 终态化路径注销([F-5 修复]
|
|
1399
|
+
* 汇聚点 = doFinalizeRecord 的 onFinalized 钩子 + cancelBackground /
|
|
1400
|
+
* disposeAllRecords 两处直连终态化路径显式注销)。
|
|
1401
|
+
*/
|
|
1402
|
+
private readonly chatRoundRoutes;
|
|
2086
1403
|
/** [D4-③] 冷路径复活依赖(原四件 private 方法的搬移落点——cold-resurrect.ts;
|
|
2087
1404
|
* deps 闭包惰性求值:sessionRootId / execNesting 基线运行时可变)。 */
|
|
2088
1405
|
private readonly coldResurrectDeps;
|
|
1406
|
+
/**
|
|
1407
|
+
* [W4] 轮次活性监督器(D2「等待有主」权威层):死亡事件纳管(run failed / 引擎
|
|
1408
|
+
* exited → adoptOnProcessDeath)+ boot 分区重认领(initSession)+ 三态判定
|
|
1409
|
+
* (record 级视图)+ 该放弃(终态化 failed + 注销 + 终止通知)。装配绑定面
|
|
1410
|
+
* (deps/giveUp 编排/sweep 挂点)在 round-supervisor/service-binding.ts——变化轴
|
|
1411
|
+
* 独立(通知文案 / 终态化编排 / store 读侧判据只动该文件),本字段只持实例。
|
|
1412
|
+
*/
|
|
1413
|
+
private readonly roundSupervisor;
|
|
2089
1414
|
/** [D4 查询面聚合] 读模型消费面(壳 interface/ 视图与 tool 查询经此访问;
|
|
2090
1415
|
* 纯委托——方法本体保留 private 实现不重写,行为逐字节等价)。 */
|
|
2091
1416
|
readonly queries: SubagentQueries;
|
|
@@ -2180,7 +1505,13 @@ declare class SubagentService {
|
|
|
2180
1505
|
onParentNew(): number;
|
|
2181
1506
|
/** SP-4: idle record GC(30 天 TTL,实现抽至 idle-gc.ts)。stop 函数(dispose 调)。 */
|
|
2182
1507
|
private stopIdleGc;
|
|
2183
|
-
/** 启动 idle record GC 定时器(session_start 调用,幂等)。
|
|
1508
|
+
/** 启动 idle record GC 定时器(session_start 调用,幂等)。
|
|
1509
|
+
* [W4] WorkflowRun store(FileRunStore)同批纳入:running 且 startedAt 超 30 天
|
|
1510
|
+
* 锚窗的 run 终态化归档(只终态化不补注销,见 idle-gc.ts 头注)。宿主未
|
|
1511
|
+
* configureCore 时 loadAll 抛错由 idle-gc 内部吞掉(单轮跳过)。
|
|
1512
|
+
* [F-1 修复] stateDir 与 pi 壳 JsonlRunStore 落盘布局同源
|
|
1513
|
+
* (resolvePiWorkflowStateDir → <sessionDir>/workflow-state/)——缺省 dataRoot 根
|
|
1514
|
+
* 与 pi 生产落盘不相交,WorkflowRun GC 曾恒空转(W4 引入的装配错位)。 */
|
|
2184
1515
|
startGcTimer(): void;
|
|
2185
1516
|
/** 停止 idle record GC 定时器(dispose 调用)。 */
|
|
2186
1517
|
private stopGcTimer;
|
|
@@ -2339,21 +1670,20 @@ declare class SubagentService {
|
|
|
2339
1670
|
*/
|
|
2340
1671
|
private lookupRecordAnyState;
|
|
2341
1672
|
/**
|
|
2342
|
-
* [V2 决策 3] chatMode 统一投递入口(message action 的 Service
|
|
2343
|
-
*
|
|
2344
|
-
*
|
|
2345
|
-
*
|
|
2346
|
-
*
|
|
2347
|
-
* 热路径(进程活):prompt + streamingBehavior——pi 权威裁决 busy/idle(F3/F4)。
|
|
2348
|
-
* 冷路径(进程死):冷路径续轮(resumeChatRound)重开 session + prompt(仅崩溃/
|
|
2349
|
-
* timeout kill/跨重启命中)。
|
|
1673
|
+
* [V2 决策 3 → W3 协议形态] chatMode 统一投递入口(message action 的 Service 面)
|
|
1674
|
+
* ——经协议 interact(message action)发往 pi-subagent-cli 引擎进程。协议知识
|
|
1675
|
+
* (stdin prompt 命令 + streamingBehavior 映射 + EPIPE 兜底)在引擎进程内
|
|
1676
|
+
* (chat-session.deliverMessage);编排层按结构化结果分流:
|
|
2350
1677
|
*
|
|
2351
|
-
*
|
|
2352
|
-
*
|
|
1678
|
+
* 受理(引擎侧进程活):prompt + streamingBehavior——pi 权威裁决 busy/idle。
|
|
1679
|
+
* 冷路径(engine_session_not_resumable = 进程死/无活进程):冷路径续轮
|
|
1680
|
+
* (resumeColdRound → run chat + resume 锚点接续,仅崩溃/timeout kill/跨重启命中)。
|
|
1681
|
+
* 其他拒绝(EPIPE 兜底耗尽 / engine_interact_failed):业务拒绝原样 throw
|
|
1682
|
+
* (文案自带行动语言——与 inproc 形态逐字节一致)。
|
|
2353
1683
|
*
|
|
2354
1684
|
* @param record 目标 record(chatMode,running 或 idle)
|
|
2355
1685
|
* @param text 消息正文
|
|
2356
|
-
* @param interrupt true=steer(抢占)/ false=followUp
|
|
1686
|
+
* @param interrupt true=steer(抢占)/ false=followUp(排队)
|
|
2357
1687
|
*/
|
|
2358
1688
|
private deliverChatMessage;
|
|
2359
1689
|
/**
|
|
@@ -2551,6 +1881,18 @@ declare class SubagentService {
|
|
|
2551
1881
|
* 落 entry 前)→ 终态迁移。bg notify 归编排侧(与 pi 轮次收尾通知归编排对称)。
|
|
2552
1882
|
*/
|
|
2553
1883
|
private runEngineTask;
|
|
1884
|
+
/**
|
|
1885
|
+
* [W4 表 3 行 1] 引擎/子进程死亡、宿主存活的 record 处置:run 终态如实记 failed
|
|
1886
|
+
* 证据(record.error),record **保持 resumable**(session 文件在盘,逻辑任务可续
|
|
1887
|
+
* ——冷路径 resume 可直接续写),交监督器接管(合并单条通知 + 三态判定)。禁止
|
|
1888
|
+
* 两个事故方向:completed 谎报(G3)与 closed 直接终局(resume 可能性丢失,等待
|
|
1889
|
+
* 无主——2026-09-08 事故环 2/3 的 core 侧形态)。
|
|
1890
|
+
*
|
|
1891
|
+
* 判据状态源钉死 record 级:写点只动 record 字段(resumable/result/error),
|
|
1892
|
+
* 不清镜像不查引擎——引擎进程被动重建(ensureConnected 退避重填镜像)不翻转
|
|
1893
|
+
* 本处置(纳管模型:死亡事件纳管、重建不解管)。
|
|
1894
|
+
*/
|
|
1895
|
+
private adoptResumableAfterEngineDeath;
|
|
2554
1896
|
/**
|
|
2555
1897
|
* 分层并发配额:depth 越深可用配额越少(下限 1)。fork 深度护栏在池维度的投影,
|
|
2556
1898
|
* 公式约定以 concurrency-pool.ts 注释为登记处、此处为唯一代码锚点。
|
|
@@ -2559,71 +1901,124 @@ declare class SubagentService {
|
|
|
2559
1901
|
/**
|
|
2560
1902
|
* engine.run resolve 的终态迁移:outcome.error → failed(success=false + error 文案);
|
|
2561
1903
|
* 否则 done(result=content)。CAS 抢锁(tryTransition)防与 cancelBackground 双收尾。
|
|
1904
|
+
*
|
|
1905
|
+
* [W4 表 3 行 1] 进程死亡分诊:outcome.error 存在且 **exitCode === null**(引擎侧
|
|
1906
|
+
* 进程被信号终止/崩溃的合成 outcome 形态——RemoteEngine 运行中失败合成分支恒
|
|
1907
|
+
* exitCode:null,引擎如实上报的 turn 失败带数值 exitCode;engine-client 注释同源
|
|
1908
|
+
* 「exitCode null = 被信号杀死,杀链判据」)且宿主存活且非 conversation 形态 →
|
|
1909
|
+
* record 保持 resumable 交监督器接管(如实 failed 证据 + 合并通知 + 三态判定),
|
|
1910
|
+
* 不再 closed 终局。返回 true = 走了接管分支(调用方跳过 bg 完成回注)。
|
|
2562
1911
|
*/
|
|
2563
1912
|
private finalizeEngineOutcome;
|
|
2564
|
-
/**
|
|
1913
|
+
/**
|
|
1914
|
+
* workflow 域"干活 + 收尾"(sync await;[W3] 执行叶 = 协议 engine.run——原 inproc
|
|
1915
|
+
* runSpawn 链随 inproc pi 引擎目录 删除消亡,journal 接线 / record 终态迁移语义保持)。
|
|
1916
|
+
* 编排分段保持「装配(池槽/worktree)→ 执行 → 回收(finally)→ 错误收口 → 终态收口」。
|
|
1917
|
+
*/
|
|
2565
1918
|
private runAndFinalize;
|
|
1919
|
+
/** engine.run taskSpec 装配单一来源(runAndFinalize 与 kickOffChatRound 共用):
|
|
1920
|
+
* executeOptions 协议映射 + model = record 留痕词形(resolved 解析产物,
|
|
1921
|
+
* joinEngineModelRef 规范形)覆盖——原 identity.resolved 经 runSpawn --model
|
|
1922
|
+
* 兜底的协议等价承载。 */
|
|
1923
|
+
private taskSpecWithModel;
|
|
1924
|
+
/**
|
|
1925
|
+
* one-shot(非 chatMode)终态收口(原 settleOneShotOutcome 分支):成功轮消费
|
|
1926
|
+
* closeAfterRound 挂起标志;失败/取消一次性销毁。CAS 抢锁失败(cancel/dispose 抢先
|
|
1927
|
+
* 终态化)静默跳过。runAndFinalize(workflow 域)与 kickOffChatRound 非 chatMode
|
|
1928
|
+
* 分支共用。
|
|
1929
|
+
*/
|
|
1930
|
+
private settleOneShotOutcome;
|
|
1931
|
+
/** AgentOutcome → execution AgentResult 单一映射源(workflow run 域映射;
|
|
1932
|
+
* finalizeEngineOutcome 终态 result 复用此处构造——exitCode null = 被信号杀死的
|
|
1933
|
+
* 合成终态,error 如实透传)。 */
|
|
1934
|
+
private outcomeToAgentResult;
|
|
2566
1935
|
/** [U04 提取·装配] 池槽获取:pooled(background)record 排队 acquire。成功返回 undefined
|
|
2567
1936
|
* 继续执行;失败返回终态 result 供调用方 early-return(该路径在 try/finally 之前,
|
|
2568
1937
|
* 不触发轮次资源回收——与原控制流逐字节一致)。 */
|
|
2569
1938
|
private acquirePoolOrFinalize;
|
|
2570
1939
|
/** [U04 提取·装配] 解析 worktree 参数:boolean → WorktreeHandle | undefined(true/undefined 由 run 内部处理)。 */
|
|
2571
1940
|
private resolveWorktreeHandle;
|
|
2572
|
-
/** [U04 提取·装配] [MF#4][MF#2] fork 深度护栏:ALS 传递深度(主 session 链无 store→0,fork 推进 +1)。 */
|
|
2573
|
-
private resolveForkDepths;
|
|
2574
|
-
/** [U04 提取·执行] runSpawn 的两层 ALS 包装(forkDepthAls 外层 + execNesting 内层)。 */
|
|
2575
|
-
private runSpawnNested;
|
|
2576
1941
|
/** [U04 提取·回收] 轮次资源回收(finally 语义,幂等):池槽归还(仅 pooled 且 acquire
|
|
2577
|
-
* 成功)、streaming widget
|
|
1942
|
+
* 成功)、streaming widget 清除。 */
|
|
2578
1943
|
private releaseRoundResources;
|
|
2579
1944
|
/** [U04 提取·错误收口] MF-6(决策 6 spec §3.1):chatMode(含 resume)spawn/创建失败
|
|
2580
1945
|
* 不销毁对话——回退 idle(可恢复),让 agent 可重试 message 或 close。与一次性模式
|
|
2581
1946
|
* (finalizeFailed 终态销毁)区分。返回合成 failed result(swallow,不 re-throw)。 */
|
|
2582
1947
|
private finalizeChatSpawnFailure;
|
|
2583
|
-
/** [U04 提取·收口派生] closedReason 派生:aborted → cancelled;否则 success → user-close,!success → gc。 */
|
|
2584
|
-
private deriveClosedReason;
|
|
2585
|
-
/** [U04 提取·终态收口] CAS 抢锁:抢到则按 chatMode 分流完整收尾;没抢到(cancel 已先设
|
|
2586
|
-
* closed+cancelled)则跳过。 */
|
|
2587
|
-
private settleFinalOutcome;
|
|
2588
|
-
/** [U04 提取·终态收口] chatMode 轮次分流(原 A/B 分支,De Morgan 等价拆分):
|
|
2589
|
-
* 成功轮(!aborted && success)与失败/取消轮(其补集 !success || aborted)各自处理
|
|
2590
|
-
* closeAfterRound 挂起语义。 */
|
|
2591
|
-
private settleChatRoundOutcome;
|
|
2592
|
-
/** [U04 提取·终态收口] one-shot(非 chatMode)分流(原 C/D 分支):成功轮消费
|
|
2593
|
-
* closeAfterRound 挂起标志;失败/取消一次性销毁。 */
|
|
2594
|
-
private settleOneShotOutcome;
|
|
2595
1948
|
/** [U04 提取·终态收口] closeAfterRound 挂起标志消费(原三处分支的公共收尾序列):
|
|
2596
1949
|
* 清标志 + 终态化 closed。reason:成功轮恒 user-close;失败/取消轮用派生值。 */
|
|
2597
1950
|
private consumeCloseAfterRound;
|
|
2598
1951
|
/**
|
|
2599
|
-
* pi chat 域轮次的 detached 编排(
|
|
2600
|
-
*
|
|
2601
|
-
*
|
|
2602
|
-
*
|
|
2603
|
-
*
|
|
2604
|
-
*
|
|
2605
|
-
*
|
|
1952
|
+
* pi chat 域轮次的 detached 编排([W3 协议形态]):轮次经协议 run(会话形态
|
|
1953
|
+
* chat{recordId, resume?})发往 pi-subagent-cli 引擎进程——
|
|
1954
|
+
* - 应答时点 = 首轮 agent_settled(W2 契约:idle 帧先于应答帧;outcome = 本轮
|
|
1955
|
+
* 内容非会话终态)→ 应答到达即本轮 settle(round+1 / 增量通知 / closeAfterRound
|
|
1956
|
+
* 消费,见 settleChatRoundFromResponse);
|
|
1957
|
+
* - 流式 delta / 轮次生命周期经 host/streamDelta + host/roundLifecycle 反向通道
|
|
1958
|
+
* 回流:首轮 runId 键(RunContext.stream / onRoundLifecycle)、续聊轮 recordId
|
|
1959
|
+
* 键(chatRoundRoutes 注册的 recordId 路由);
|
|
1960
|
+
* - recordId 路由在本方法注册(首轮 + 冷续轮替换式重注册),record 终态化路径注销。
|
|
2606
1961
|
* chat 域不接 event journal(pi 子代理 session JSONL 即原生数据源;与迁移前产物
|
|
2607
1962
|
* 形态一致——journal 接线仅 workflow 域 SAR 与非 pi 引擎 chat 路径)。
|
|
2608
1963
|
*/
|
|
2609
1964
|
private kickOffChatRound;
|
|
2610
|
-
/**
|
|
2611
|
-
*
|
|
2612
|
-
*
|
|
1965
|
+
/**
|
|
1966
|
+
* [W3] chat 轮次生命周期帧消费(host/roundLifecycle,runId 键首轮 / recordId 键续聊轮
|
|
1967
|
+
* 经本方法收敛)。相位 → 宿主编排语义(W4 协议事件面三入口):
|
|
1968
|
+
* - settled:轮收敛——settled-watchdog 中段让位收尾段(noteRoundSettledFromProtocol);
|
|
1969
|
+
* - idle:轮收口进 idle 稳态——两段守护一并清(disarmRoundFromProtocol)+ 冷续锚点
|
|
1970
|
+
* 回填(sessionFile/engineHandle,idle 帧先于 run 应答帧)+ **idle 定时器挂载**
|
|
1971
|
+
* (引擎不实现 idle 定时器——core arm,W2 交接契约);
|
|
1972
|
+
* - failed:轮异常终止(engine_round_aborted / engine_round_crashed /
|
|
1973
|
+
* engine_round_epipe_exhausted)——record 如实标 failed(禁 completed 谎报),
|
|
1974
|
+
* chatMode 按 MF-6 回退可恢复(onChatRoundFailed)。
|
|
1975
|
+
*/
|
|
1976
|
+
private handleChatRoundPhase;
|
|
1977
|
+
/**
|
|
1978
|
+
* [W3] idle 相位 = idle 定时器锚点(原 session-runner handleAgentSettledForChatMode
|
|
1979
|
+
* 的 armIdleTimer 段):挂载降级链(配置值 → DEFAULT 兜底 + warn)语义保持;超时
|
|
1980
|
+
* 处置 = 引擎侧进程回收(协议 interact close force)——idle timer SIGTERM 的协议形态。
|
|
1981
|
+
*/
|
|
1982
|
+
private armChatIdleTimer;
|
|
1983
|
+
/** [W3] idle 帧锚点回填(冷续锚点 = 引擎侧会话滚动/compaction 后的最新定位)。 */
|
|
1984
|
+
private backfillChatAnchor;
|
|
1985
|
+
/**
|
|
1986
|
+
* [W3] chat 轮 failed 相位分诊:错误如实落 record(失败相位错误码——engine_round_
|
|
1987
|
+
* aborted(宿主 cancel/close)/ engine_round_crashed(子进程外部死亡)/
|
|
1988
|
+
* engine_round_epipe_exhausted(EPIPE 兜底耗尽)),禁 completed 谎报。chatMode 按
|
|
1989
|
+
* MF-6 不销毁对话——回退可恢复(finalizeRoundToIdle + 通知),冷续 run 接续;
|
|
1990
|
+
* record 已终态(cancel/close 抢先)= 迟到帧,幂等跳过。
|
|
1991
|
+
*/
|
|
1992
|
+
private onChatRoundFailed;
|
|
1993
|
+
/**
|
|
1994
|
+
* [W3] 首轮 run 应答到达(= 首轮 agent_settled,W2 契约)的本轮 settle:round+1 /
|
|
1995
|
+
* 轮次增量通知 / base 推进 / reportRecordTransition / closeAfterRound 消费——语义
|
|
1996
|
+
* 权威自持于此(原 round-settlement.ts createRoundSettler 已删,本闭包为其唯一后继),
|
|
1997
|
+
* 唯一偏差 = 轮次文本源:协议形态下 live turns 留在引擎进程内,core 以应答
|
|
1998
|
+
* outcome.content(W2「outcome = 本轮内容」)为增量权威,record.turns 派生不可用。
|
|
1999
|
+
* idle 定时器挂载不在此处——idle 相位帧先于应答帧到达,armChatIdleTimer 已锚定。
|
|
2000
|
+
*/
|
|
2001
|
+
private settleChatRoundFromResponse;
|
|
2002
|
+
/** [W3] chat 域引擎终止意图(协议面):cancel = interact cancel(引擎侧 SIGTERM →
|
|
2003
|
+
* settle 等待 → 杀链升级);close = interact close force(立即杀链收割)。fire-and-forget
|
|
2004
|
+
* ——失败 best-effort 留证(宿主组级收割兜底 = EngineClient killAll,dispose 路径)。 */
|
|
2005
|
+
private terminateChatSession;
|
|
2006
|
+
/** chat record 的协议 interact handle(engineHandle 缺省时按 recordId 合成——
|
|
2007
|
+
* 引擎侧 interact 定位键 = sessionRef.recordId;sessionFile 有值时一并携带)。 */
|
|
2008
|
+
private chatHandleFor;
|
|
2009
|
+
/** [W3] pi 引擎 port 解析(chat 域路由与终止面共用):registry cli 形态 port,
|
|
2010
|
+
* 未注册 = 不可用 stub(engine_not_found,见 pi-host-binding)。 */
|
|
2011
|
+
private resolveChatEnginePort;
|
|
2012
|
+
/** [W3] record 终态化路径的 chat 反向通道路由注销(幂等)。 */
|
|
2013
|
+
private unregisterChatRoundRoute;
|
|
2014
|
+
/** 引擎服务面适配器(HostBridgeServiceFace 结构视图):闭包持有本实例的编排面。
|
|
2015
|
+
* [W3] chat 域轮次交接可选面(takeChatRound/runChatRound/resumeChatRound)随
|
|
2016
|
+
* inproc PiEngine 删除移除——引擎经协议 converse,不再回调宿主编排面。 */
|
|
2613
2017
|
private piEngineServiceAdapter;
|
|
2614
|
-
/** [D4 聚合连带]
|
|
2615
|
-
*
|
|
2616
|
-
*
|
|
2617
|
-
|
|
2618
|
-
get asEngineService(): PiEngineService;
|
|
2619
|
-
/** chat 域轮次交接的消费侧(PiEngine.run 回调):一次性取走,防重复消费。私有名与
|
|
2620
|
-
* PiEngineService 可选面成员不同名(历史约束:D4 聚合前的结构化直绑时代,私有同名
|
|
2621
|
-
* 成员会阻断 SubagentService 直绑;聚合后经 asEngineService 显式视图,约束已消失,
|
|
2622
|
-
* 不同名保留为与 adapter 显式映射一致的命名纪律)。 */
|
|
2623
|
-
private takeChatTicket;
|
|
2624
|
-
/** PiEngine chat 分支的执行回调:原 runAndFinalize 直调链的 EnginePort 化落点
|
|
2625
|
-
* (编排归 Service——pool 槽 + runSpawn + 终态迁移,行为零变化)。 */
|
|
2626
|
-
private runTicketRound;
|
|
2018
|
+
/** [D4 聚合连带] 引擎服务面的显式结构视图(SAR 构造 resolveHostPiEnginePort 时
|
|
2019
|
+
* 传入的 getService 兼容位消费——W3 后该面无引擎侧消费方,保留使 SAR 调用点
|
|
2020
|
+
* 零改动,W8 收口时随签名一并清理)。getter 形态:face 视图(惰性构造)。 */
|
|
2021
|
+
get asEngineService(): HostBridgeServiceFace;
|
|
2627
2022
|
/**
|
|
2628
2023
|
* 取消 background record。CAS 抢锁(tryTransition)——抢到则 notify + 写 tombstone;
|
|
2629
2024
|
* 没抢到(detached 已 finalize,record 已终态)返回 false,不触碰任何收尾副作用。
|
|
@@ -2645,7 +2040,13 @@ declare class SubagentService {
|
|
|
2645
2040
|
private finalizeRoundToIdle;
|
|
2646
2041
|
/** run() 创建期异常的收尾(H1 修复):createAndConfigureSession 失败会抛,本方法合成 failed
|
|
2647
2042
|
* AgentResult → CAS 抢锁 → finalizeRecord(与正常路径同形)。返回合成 result 供 runAndFinalize
|
|
2648
|
-
* 继续返回(不 re-throw,swallow 策略)。
|
|
2043
|
+
* 继续返回(不 re-throw,swallow 策略)。
|
|
2044
|
+
* [W3 契约变更⑤(run 期失败清理前置副作用)] kickOffEngineRun 前已建的 worktree
|
|
2045
|
+
* (executeViaEngine 创建点,record.worktreeHandle 已绑定)经本方法 → finalizeRecord
|
|
2046
|
+
* → doFinalizeRecord Step 3b cleanupWorktreeIfBound 清理(manifest 多声明 run 期
|
|
2047
|
+
* 失败 / engine.run prepare 期 reject 共用本收尾链);CAS 没抢锁(cancel 抢先终态)
|
|
2048
|
+
* 时由 cancelBackground 的 worktree cleanup 覆盖。唯一前置副作用 = worktree(并发
|
|
2049
|
+
* 池槽 acquire/release 在 kickOffEngineRun finally 内自回收,journal 是宿主数据不清理)。 */
|
|
2649
2050
|
private finalizeFailed;
|
|
2650
2051
|
/** S1: 排队中被 abort 走 cancelled 终态(对齐已运行被 abort 的 cancelBackground)。 */
|
|
2651
2052
|
private finalizeAborted;
|
|
@@ -2671,8 +2072,6 @@ declare class SubagentService {
|
|
|
2671
2072
|
* 由 lifecycle-manager 的 warn 回落承接)。execute/executeAndAwait 两入口共用。
|
|
2672
2073
|
*/
|
|
2673
2074
|
private assertIdleTimeoutMsSafe;
|
|
2674
|
-
/** 构造 SessionRunnerContext(spawn 模式:无需 SDK 实例)。 */
|
|
2675
|
-
private buildSessionRunnerContext;
|
|
2676
2075
|
}
|
|
2677
2076
|
/** 获取进程单例。session_start 前为 null。 */
|
|
2678
2077
|
declare function getSubagentService(): SubagentService | null;
|
|
@@ -2837,20 +2236,6 @@ type BestEffortLevel = "debug" | "error";
|
|
|
2837
2236
|
*/
|
|
2838
2237
|
declare function bestEffort(err: unknown, context: string, level?: BestEffortLevel): void;
|
|
2839
2238
|
|
|
2840
|
-
/** channel handler 签名:接收 UiRequest,返回 UiResponse。
|
|
2841
|
-
* 具体类型定义在 session-runner.ts(W2 工作),此处用最小形状避免循环依赖。
|
|
2842
|
-
* handler 实现方按 channel 注册,由 session-runner 按 req.channel 分派。 */
|
|
2843
|
-
type ChannelHandler = (req: unknown) => Promise<unknown>;
|
|
2844
|
-
/** channel 注册表接口。职责单一:只管业务路由,不管排队、不管透传判定。
|
|
2845
|
-
* - register(channel, handler):注册 channel 对应的 handler(同名覆盖)
|
|
2846
|
-
* - resolve(channel):取 channel 对应的 handler,未注册返回 undefined
|
|
2847
|
-
* - list():列举所有已注册 channel 名 */
|
|
2848
|
-
interface UiChannelRegistry {
|
|
2849
|
-
register(channel: string, handler: ChannelHandler): void;
|
|
2850
|
-
resolve(channel: string): ChannelHandler | undefined;
|
|
2851
|
-
list(): string[];
|
|
2852
|
-
}
|
|
2853
|
-
|
|
2854
2239
|
/** 获取或创建进程级 channel registry(canonical 单例)。
|
|
2855
2240
|
*
|
|
2856
2241
|
* **唯一创建点**:canonical UiChannelRegistry 实例仅由本函数创建。
|
|
@@ -3180,7 +2565,7 @@ declare class Budget {
|
|
|
3180
2565
|
* 而非原始 token 数直接相加。retry 间的真实消耗如实记录,避免预算被低估。
|
|
3181
2566
|
* 详见上方权重常量的口径说明。
|
|
3182
2567
|
*/
|
|
3183
|
-
consume(usage:
|
|
2568
|
+
consume(usage: AgentOutcomeUsage): void;
|
|
3184
2569
|
/** 累加调用计数(每次 agent dispatch 后调用;持久化快照同步)。 */
|
|
3185
2570
|
incrementCallCount(): void;
|
|
3186
2571
|
/**
|
|
@@ -4431,6 +3816,23 @@ interface CreateConcurrencyPoolOptions {
|
|
|
4431
3816
|
*/
|
|
4432
3817
|
declare function createConcurrencyPool(options: CreateConcurrencyPoolOptions): ConcurrencyPool;
|
|
4433
3818
|
|
|
3819
|
+
/** provider 条目(v2 config.provider.<id>)的最小消费面(索引签名形态)。 */
|
|
3820
|
+
interface ZcodeProviderEntryLike {
|
|
3821
|
+
options?: {
|
|
3822
|
+
apiKey?: unknown;
|
|
3823
|
+
};
|
|
3824
|
+
}
|
|
3825
|
+
/** 短名(无 provider 前缀)解析的默认 provider(zsub DEFAULT_PROVIDER_ID 同构)。 */
|
|
3826
|
+
declare const DEFAULT_PROVIDER_ID = "builtin:bigmodel-coding-plan";
|
|
3827
|
+
/** zsub 同构的兜底缺省模型(v2 config 无 model.main 且 task 未指定时)。 */
|
|
3828
|
+
declare const ZCODE_FALLBACK_DEFAULT_MODEL = "builtin:bigmodel-coding-plan/GLM-5.3";
|
|
3829
|
+
/** [R4] 规范化全名 provider/model → create 参数的 per-session model 拆分。 */
|
|
3830
|
+
declare function splitZcodeModelRef(modelRef: string): {
|
|
3831
|
+
providerId: string;
|
|
3832
|
+
modelId: string;
|
|
3833
|
+
};
|
|
3834
|
+
declare function hasApiKey(entry: ZcodeProviderEntryLike): boolean;
|
|
3835
|
+
|
|
4434
3836
|
/**
|
|
4435
3837
|
* gitRun 的包装错误:message 格式与提取源 gitRunAsync 逐字一致;exitCode/stderr/
|
|
4436
3838
|
* timedOut 为诊断属性(P-errshape 实测 Node 24:execFile 的 err.stderr 为
|
|
@@ -5618,7 +5020,38 @@ interface FileRunStoreOptions {
|
|
|
5618
5020
|
* {@link DEFAULT_SAVE_MIN_INTERVAL_MS}。测试经此注入小窗口(fake timers 推进)。
|
|
5619
5021
|
*/
|
|
5620
5022
|
saveMinIntervalMs?: number;
|
|
5023
|
+
/**
|
|
5024
|
+
* [F-1 修复] run 状态目录覆盖。缺省 = `<dataRoot>/workflow-state`(zcode 宿主布局,
|
|
5025
|
+
* 见 stateDir());pi 宿主的读侧装配点(round-supervisor sweep / idle-gc)必须传
|
|
5026
|
+
* resolvePiWorkflowStateDir()(execution/workflow-state-root.ts)——pi 宿主 run state
|
|
5027
|
+
* 由 JsonlRunStore 落 `<sessionDir>/workflow-state/`,与缺省根不相交。
|
|
5028
|
+
*/
|
|
5029
|
+
stateDir?: string;
|
|
5030
|
+
}
|
|
5031
|
+
/** pruneStateFilesBeyondCap 的宿主注入依赖(日志与错误字符串化——tag 前缀由注入方决定)。 */
|
|
5032
|
+
interface PruneStateDeps {
|
|
5033
|
+
/** warn 通道(readdir / unlink 失败留证;清理是旁路维护,失败不抛) */
|
|
5034
|
+
warn: (msg: string) => void;
|
|
5035
|
+
/** debug 通道(成功裁剪记录) */
|
|
5036
|
+
debug: (msg: string) => void;
|
|
5037
|
+
/** error → 可读字符串(core 侧 err.message 兜底 String,宿主可用自有 error 工具) */
|
|
5038
|
+
toMsg: (err: unknown) => string;
|
|
5621
5039
|
}
|
|
5040
|
+
/**
|
|
5041
|
+
* 把 state 目录裁剪到 cap 个最新 state 文件(mtime 升序删最旧,C1)。
|
|
5042
|
+
*
|
|
5043
|
+
* 语义(OR-5,两宿主单源):
|
|
5044
|
+
* - 只删目录内命中 {@link STATE_FILE_GLOB} 的文件;任何失败都不抛(清理是旁路
|
|
5045
|
+
* 维护,不能拖垮持久化主链路):readdir 失败静默放弃本轮(ENOENT = 从未持久化,
|
|
5046
|
+
* 正常态),单个 unlink 失败(非 ENOENT)warn 留证后继续删其余——ENOENT 视为
|
|
5047
|
+
* 并发删除竞态下的已达成目标,不告警;
|
|
5048
|
+
* - stat 全集取 mtime,allSettled 部分降级——单文件 stat 失败(并发删除 ENOENT
|
|
5049
|
+
* 等)静默跳过该文件,不阻断本轮裁剪。
|
|
5050
|
+
*
|
|
5051
|
+
* cap 解析(env 通道等)归调用方:FileRunStore 方法含 envName 通道超集;
|
|
5052
|
+
* pi 宿主 jsonl-run-store 经 getEnvStateMaxRuns 解析后直传。
|
|
5053
|
+
*/
|
|
5054
|
+
declare function pruneStateFilesBeyondCap(stateDir: string, cap: number, deps: PruneStateDeps): Promise<void>;
|
|
5622
5055
|
/**
|
|
5623
5056
|
* RunStore port 的宿主无关文件实现(port 见 models/ports.ts)。
|
|
5624
5057
|
*
|
|
@@ -5631,15 +5064,21 @@ interface FileRunStoreOptions {
|
|
|
5631
5064
|
* warn——单行损坏不拖垮整个 run 的恢复(与 pi 壳 kill-9 恢复同容忍度)。
|
|
5632
5065
|
* 版本衔接(快照 codec 归 run-snapshot.ts 单源,D4):存量无 v 行按当前版本
|
|
5633
5066
|
* 宽容读、写入恒补 v、v 不匹配跳过 + warn(三裁决明细见 parseLine 注释)。
|
|
5634
|
-
* - stateFilePath
|
|
5067
|
+
* - stateFilePath:纯路径计算(<状态目录>/<runId>.jsonl),不建目录。状态目录 =
|
|
5068
|
+
* 构造注入的 stateDir 覆盖,或缺省 <dataRoot>/workflow-state(pi 宿主读侧装配点
|
|
5069
|
+
* 必须传 resolvePiWorkflowStateDir()——见 FileRunStoreOptions.stateDir 与
|
|
5070
|
+
* execution/workflow-state-root.ts 的同源布局论证)。
|
|
5635
5071
|
*
|
|
5636
5072
|
* 未 configureCore 即 save/loadAll 会抛 core_host_not_configured(dataRoot 端口
|
|
5637
5073
|
* 语义,host-services.ts §3.4)——宿主壳必须在初始化最早期注入。
|
|
5638
5074
|
*/
|
|
5639
5075
|
declare class FileRunStore implements RunStore {
|
|
5640
|
-
/** run
|
|
5641
|
-
* data-dir.ts
|
|
5076
|
+
/** run 状态目录绝对路径(显式覆盖优先——pi 宿主读侧装配点;缺省 dataRoot 每次现取
|
|
5077
|
+
* ——宿主覆盖配置即刻生效,对齐 data-dir.ts「不缓存路径防测试/宿主切换读到旧值」
|
|
5078
|
+
* 先例)。 */
|
|
5642
5079
|
private stateDir;
|
|
5080
|
+
/** 显式状态目录覆盖(构造注入;见 FileRunStoreOptions.stateDir)。 */
|
|
5081
|
+
private readonly stateDirOverride;
|
|
5643
5082
|
/** save 节流最小间隔(ms),0 = 禁用。 */
|
|
5644
5083
|
private readonly saveMinIntervalMs;
|
|
5645
5084
|
/**
|
|
@@ -5665,6 +5104,29 @@ declare class FileRunStore implements RunStore {
|
|
|
5665
5104
|
*/
|
|
5666
5105
|
save(run: WorkflowRun): Promise<void>;
|
|
5667
5106
|
loadAll(): Promise<WorkflowRun[]>;
|
|
5107
|
+
/**
|
|
5108
|
+
* [W4 sweep 判据,F2] 按 runId 同步查 run 状态(注册对账 sweep 的 workflow 收口
|
|
5109
|
+
* 判据)。同步形态:sweep 在 session_start 同步链内运行(runReconcileSweep 同步
|
|
5110
|
+
* 契约),不能 await loadAll——对单 runId 做同步文件读(对齐 sweep 自身的 sync fs
|
|
5111
|
+
* 读先例),逐行解析复用 parseLine(版本衔接 + 形状校验与 loadLatestValidLine
|
|
5112
|
+
* 单源,同步只读不触碰 lastSavedAt 节流记账)。
|
|
5113
|
+
*
|
|
5114
|
+
* 判定(宁挂账不失明——误注销活跃 run 是事故方向,判据保守侧取「不可判定」):
|
|
5115
|
+
* - state 文件不存在 → missing(设计判据「已归档/不存在视同终态」——run 从未
|
|
5116
|
+
* 落盘或已被清理,注册是死亡窗口残留);
|
|
5117
|
+
* - 末条有效快照 status = running → running(活跃,sweep 跳过);
|
|
5118
|
+
* - 末条有效快照 status ≠ running(done)→ terminal + reason(I2:done ⟹ reason
|
|
5119
|
+
* 有值;reason 作 pending unregister 的 status 语义源);
|
|
5120
|
+
* - 文件存在但全部行损坏(无有效快照)→ running(读不出 ≠ 不存在,不补注销)。
|
|
5121
|
+
*/
|
|
5122
|
+
findStateByIdSync(runId: string): {
|
|
5123
|
+
kind: "running";
|
|
5124
|
+
} | {
|
|
5125
|
+
kind: "terminal";
|
|
5126
|
+
reason: string | undefined;
|
|
5127
|
+
} | {
|
|
5128
|
+
kind: "missing";
|
|
5129
|
+
};
|
|
5668
5130
|
/** 单文件从尾向头取第一条有效快照行;整文件无有效行返回 undefined(warn)。 */
|
|
5669
5131
|
private loadLatestValidLine;
|
|
5670
5132
|
/**
|
|
@@ -5683,15 +5145,12 @@ declare class FileRunStore implements RunStore {
|
|
|
5683
5145
|
private parseLine;
|
|
5684
5146
|
/**
|
|
5685
5147
|
* 把 workflow-state 目录裁剪到上限个最新 state 文件(mtime 升序删最旧,C1)。
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
* - stat 全集取 mtime,allSettled 部分降级——单文件 stat 失败(并发删除
|
|
5693
|
-
* ENOENT 等)静默跳过该文件,不阻断本轮裁剪。
|
|
5694
|
-
*
|
|
5148
|
+
*
|
|
5149
|
+
* 主体委托导出单源 {@link pruneStateFilesBeyondCap}(retention 语义两宿主单源,
|
|
5150
|
+
* S4-A7;日志经 deps 注入本模块 logger + `[file-run-store]` tag,行为与收口前
|
|
5151
|
+
* 逐字一致)。磁盘裁剪不动内存 runs Map(内存侧淘汰归
|
|
5152
|
+
* lifecycle.evictDoneRunsBeyondCap,两域独立)。
|
|
5153
|
+
*
|
|
5695
5154
|
* 上限解析(envName 通道,OR-5 ⑥b 默认开;显式非法值 opt-out 对齐 pi 解析风格):
|
|
5696
5155
|
* - `envName` 提供 → env 通道:`process.env[envName]` 未设/空 → 按默认上限
|
|
5697
5156
|
* {@link DEFAULT_STATE_MAX_RUNS} 裁剪(**默认开**——OR-5 修复前的 opt-in
|
|
@@ -5701,14 +5160,11 @@ declare class FileRunStore implements RunStore {
|
|
|
5701
5160
|
* 宿主如需自管保留可设足够大的正数值);
|
|
5702
5161
|
* - `envName` 缺省 → 无 env 通道,直接按 `max` 参数裁剪(上限 = max,调用方
|
|
5703
5162
|
* 自管启用时机)。
|
|
5704
|
-
|
|
5705
|
-
|
|
5706
|
-
|
|
5707
|
-
|
|
5708
|
-
|
|
5709
|
-
* @param envName opt-in 开关 + 上限覆盖 env 变量名(可选;pi 先例
|
|
5710
|
-
* `XYZ_SUBAGENT_STATE_MAX_RUNS`)
|
|
5711
|
-
*/
|
|
5163
|
+
*
|
|
5164
|
+
* @param max 上限(envName 缺省时生效;env 通道启用时被 env 值覆盖)
|
|
5165
|
+
* @param envName opt-in 开关 + 上限覆盖 env 变量名(可选;pi 先例
|
|
5166
|
+
* `XYZ_SUBAGENT_STATE_MAX_RUNS`)
|
|
5167
|
+
*/
|
|
5712
5168
|
pruneStateFilesBeyondCap(max: number, envName?: string): Promise<void>;
|
|
5713
5169
|
}
|
|
5714
5170
|
|
|
@@ -6317,8 +5773,8 @@ declare function boundedPrettySerialize(value: unknown, budget: number): string;
|
|
|
6317
5773
|
* @zhushanwen/subagent-core — 公共 API barrel(D5 定稿 + post-convergence B-2 扩面)
|
|
6318
5774
|
*
|
|
6319
5775
|
* 公共 API 面 = 本文件导出 + package.json exports 的语义子入口
|
|
6320
|
-
* (./
|
|
6321
|
-
*
|
|
5776
|
+
* (./engine/paths、./engine/engine-discovery-scan、./relay-env——[W11/H3] 引擎
|
|
5777
|
+
* 子入口 ./engines/zcode/* 已随内建引擎删除)+ ./workflows/* 资产子入口。exports 面即 semver 契约(D5):收窄不放宽——
|
|
6322
5778
|
* 新增导出走 minor,本文件刻意不使用 `export *`,逐名列出以使 diff 可审。
|
|
6323
5779
|
* 内部实现细节(error-recovery / execute-agent-call / worker-script-builder 等
|
|
6324
5780
|
* engine 编排件)不经 barrel 导出;host-surface 扩面(zsw 回接 U0,2026-08-30)
|
|
@@ -6335,6 +5791,6 @@ declare function boundedPrettySerialize(value: unknown, budget: number): string;
|
|
|
6335
5791
|
* docs/design/subagent-core-sink-design.md(sink 下沉收口扩面,2026-08-31);
|
|
6336
5792
|
* 宿主接入示例见包 README(§3.4 core_host_not_configured 恢复指引的落点)。
|
|
6337
5793
|
*/
|
|
6338
|
-
declare const CORE_PACKAGE_VERSION = "0.
|
|
5794
|
+
declare const CORE_PACKAGE_VERSION = "0.7.0";
|
|
6339
5795
|
|
|
6340
|
-
export { AGENT_REF_EXT, AgentCall, AgentCallOpts, type AgentEntry,
|
|
5796
|
+
export { AGENT_REF_EXT, AgentCall, AgentCallOpts, type AgentEntry, AgentEventLogEntry, type AgentProfile, AgentRegistry, AgentResult, type AgentRunner, type ArgKeySet, type ArgMetaOptions, type ArgMetaWarning, type AtomicTmpRef, type AtomicWriteFileOptions, type AtomicWriteOptions, BG_MESSAGE, BgResponse, Budget, CORE_PACKAGE_VERSION, type CachedWorkflowMeta, type CancelHandlerInput, type CancelHandlerResult, CancelResponse, type ChangeListener, type CleanupStaleTmpOptions, type CleanupStaleTmpResult, type CleanupWorktreeOptions, type CloseHandlerInput, type CloseHandlerResult, CloseResponse, ClosedReason, type CollectWorktreePatchOptions, type ConcurrencyPool, type CreateConcurrencyPoolOptions, type D8CompatZcodeEngineDeps, DEFAULT_LIST_LIMIT, DEFAULT_PROVIDER_ID, DEFAULT_SAVE_MIN_INTERVAL_MS, DEFAULT_STATE_MAX_RUNS, DEFAULT_WORKFLOW_SAVED_DIR, DEFAULT_WORKFLOW_TMP_DIR, DialogGlobalQueue, type DiscoveredResource, DiscoveryRoot, DisplayItem, DoneReason, EnginePort, type EngineRouteOptions, type EngineRouteResult, type EngineRouting, type EngineRoutingInput, type EngineRoutingSource, ExecutionMode, ExecutionOutcome, ExecutionRecord, ExecutionStatus, ExecutionTraceNode, ExternalState, FORK_FROM_DEFAULT_PROMPT, FileRunStore, type FinalizeRunOptions, type ForkFromHandlerInput, type ForkFromHandlerResult, ForkFromResponse, type GenerateWorkflowScriptOptions, type GenerateWorkflowScriptResult, GitRunError, type GlobalConfigReadResult, IDENTITY_CUSTOM_TYPE, INDEX_FILENAME, type InvalidAgentRefMessageOptions, type LauncherDeps, type LifecycleDeps, type LintFinding, type LintResult, type ListFormatOptions, type ListHandlerInput, type ListHandlerResult, ListResponse, type ListWorktreePorcelainOptions, MAX_LIST_LIMIT, MAX_RETAINED_DONE_RUNS, MAX_TIMER_DELAY_MS, type MessageHandlerInput, type MessageHandlerResult, MessageResponse, ModelConfigService, type ModelConfigServiceInit, type ModelEntry, ModelInfo, type ModelListFormatOptions, type ModelReasoningInfo, NOTIFY_CONTRACT, type NormalizeWorkflowRefOptions, type NormalizedArgs, type NormalizedWorkflowRef, type NotifyDomainPorts, type NotifyLedgerHost, type PatchBaselineAnchor, type PruneStateDeps, type QueuePolicy, RecordStore, type RecordStorePi, type RecoverCrashedRunsHooks, type RecoverCrashedRunsResult, type ResourceKind, type ResourceSource, type RunSnapshot, type RunSpec, type RunState, RunStatus, type RunStore, SAFE_ID_RE, SNAPSHOT_VERSION, SUBAGENT_RECORD_CUSTOM_TYPE, type ScanConfig, type StartHandlerInput, type StartHandlerResult, type StatusFilter, type SubagentIdentityData, SubagentListItem, SubagentRecord, type SubagentRecordEntryData, SubagentService, type SubagentServiceInit, SubagentStream, SubprocessAgentRunner, THINKING_ORDER, Trace, WORKFLOW_REF_EXT, WORKFLOW_REF_RESERVED_NAMES, type WorkerHandlers, type WorkerHost, WorkerHostImpl, WorkerLogEntry, type WorkflowDirOptions, type WorkflowEntry, type WorkflowMeta, type WorkflowRefInvalidReason, WorkflowRun, type WorkflowRunMeta, type WorkflowRunResult, type WorkflowRunSummary, type WorkflowScanConfig, WorkflowScript, type WorkflowScriptRegistry, WorkflowScriptRegistryImpl, type WorkflowSource, WorktreeManager, type WorktreePatchResult, ZCODE_FALLBACK_DEFAULT_MODEL, type ZcodeEngineDeps, abortRun, argKeysFromMeta, assertSafeId, atomicTmpPathFor, bestEffort, bindNotifyLedgerHost, boundedPrettySerialize, buildEngineModelsPromptAppend, buildSubagentEngineSection, cancelHandler, cleanupStaleTmpFiles, cleanupWorktree, clearSkillPathCache, closeHandler, closeOutInFlightCalls, collectWorktreePatch, computeElapsedSeconds, configureNotifyDomain, countAllToolCalls, createConcurrencyPool, createSubagentService, createUiRequestHandlerForMode, createZcodeEngine, deleteWorkflow, deriveOutcome, discoverAgents, discoverResources, discoverWorkflows, displayAgentName, endedMessageGuard, escapeXml, evictDoneRunsBeyondCap, executeNestedWorkflow, finalizeRun, findFlattenedArgKeys, findWorkspaceRoot, forkFromHandler, formatAgentList, formatModelList, formatWorkflowList, fromRunSnapshot, generateWorkflowScript, getAllToolCalls, getBoundNotifyLedger, getCachedFileContent, getCachedParsed, getModelConfigService, getOrCreateChannelRegistry, getSubagentService, getWorkflow, getWorkflowByPath, gitRun, hasApiKey, invalidAgentRefMessage, invalidateCache, isProcessAlive, isResumable, isSafeId, isScriptRunning, isTreeDirty, killAllSpawnedChildren, killRecordChildWithEscalation, lintScript, listHandler, listStaleTmpFiles, listWorktreePorcelain, loadWorkflowScriptByPath, loadWorkflows, makeSerializeFailedResult, mapExternalState, maxTurnsToWatchdogMs, maybeCleanupExpiredSessionFiles, messageHandler, normalizeArgsByMeta, normalizeRef, normalizeWorkflowRef, notifyGateAllowsDelivery, parseAgentProfile, parseAtomicTmpPath, parseEngineHandle, parseResourceMeta, parseResourceMetaDetailed, postBudgetUpdate, projectLiveProgress, projectOutcome, pruneStateFilesBeyondCap, readGlobalConfig, readSubagentHistoryMessages, recordToListItem, recoverCrashedRuns, registerNativeSessionReader, registerZcodeEngine, renderXmlSection, resetRebuildFailureInjectionForTest, routeEngine, runAndWait, runSummary, runWorkflow, saveWorkflow, scheduleTimeBudget, setEngineDiscoveryRescanOptions, setModelConfigService, setSubagentService, sortByCodepoint, splitZcodeModelRef, startHandler, summarizeDescription, syncEnginesFile, terminateRunningRuns, toRunSnapshot, toSubagentRecordEntry, wrapForkFromPrompt, writeAtomicFile, writeAtomicFileSync };
|