@zhushanwen/subagent-core 0.2.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 +114 -0
- package/dist/chunk-3VOERJPJ.js +22 -0
- package/dist/chunk-A4IVZWVX.js +31 -0
- package/dist/execution/engine/engines/zcode/constants.cjs +54 -0
- package/dist/execution/engine/engines/zcode/constants.d.cts +31 -0
- package/dist/execution/engine/engines/zcode/constants.d.ts +31 -0
- package/dist/execution/engine/engines/zcode/constants.js +22 -0
- package/dist/execution/engine/engines/zcode/reader.cjs +276 -0
- package/dist/execution/engine/engines/zcode/reader.d.cts +20 -0
- package/dist/execution/engine/engines/zcode/reader.d.ts +20 -0
- package/dist/execution/engine/engines/zcode/reader.js +239 -0
- package/dist/execution/engine/paths.cjs +55 -0
- package/dist/execution/engine/paths.d.cts +8 -0
- package/dist/execution/engine/paths.d.ts +8 -0
- package/dist/execution/engine/paths.js +26 -0
- package/dist/execution/relay-env.cjs +62 -0
- package/dist/execution/relay-env.d.cts +33 -0
- package/dist/execution/relay-env.d.ts +33 -0
- package/dist/execution/relay-env.js +20 -0
- package/dist/index.cjs +1852 -0
- package/dist/index.d.cts +1184 -0
- package/dist/index.d.ts +1184 -0
- package/dist/index.js +1810 -0
- package/dist/types-BxyAidGf.d.cts +875 -0
- package/dist/types-BxyAidGf.d.ts +875 -0
- package/package.json +99 -0
- package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +142 -0
- package/src/__tests__/append-system-prompt-assembly.test.ts +242 -0
- package/src/__tests__/builtin-workflows-structure.test.ts +180 -0
- package/src/__tests__/derive-closed-display-parity.test.ts +93 -0
- package/src/__tests__/fr4-get-state-handshake.test.ts +125 -0
- package/src/__tests__/fr8-orphan-recovery.test.ts +259 -0
- package/src/__tests__/m2-append-content-probe.test.ts +73 -0
- package/src/__tests__/manifest-store.test.ts +368 -0
- package/src/__tests__/record-store-cache.test.ts +335 -0
- package/src/__tests__/record-store-index.test.ts +560 -0
- package/src/__tests__/record-store-last-line.test.ts +129 -0
- package/src/__tests__/review-fix-loop-script.test.ts +288 -0
- package/src/__tests__/review-fix-loop-utils.test.ts +2377 -0
- package/src/__tests__/robustness-low-batch1.test.ts +286 -0
- package/src/__tests__/robustness-medium-batch1.test.ts +69 -0
- package/src/__tests__/robustness-medium-batch2.test.ts +65 -0
- package/src/__tests__/robustness-medium-batch3.test.ts +30 -0
- package/src/__tests__/robustness-medium-batch4.test.ts +358 -0
- package/src/__tests__/session-runner.test.ts +69 -0
- package/src/__tests__/smoke.test.ts +9 -0
- package/src/__tests__/stream-sink.test.ts +203 -0
- package/src/core/__tests__/host-services.test.ts +144 -0
- package/src/core/__tests__/logger.test.ts +78 -0
- package/src/core/__tests__/notify-ports.test.ts +104 -0
- package/src/core/host-services.ts +97 -0
- package/src/core/logger.ts +47 -0
- package/src/core/notify-ports.ts +126 -0
- package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +53 -0
- package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +1 -0
- package/src/execution/__tests__/agent-result-mapper.test.ts +150 -0
- package/src/execution/__tests__/alive-store.test.ts +147 -0
- package/src/execution/__tests__/ask-user-transit-e2e.test.ts +490 -0
- package/src/execution/__tests__/channel-registry-handshake.test.ts +242 -0
- package/src/execution/__tests__/chat-engine-routing.test.ts +610 -0
- package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +190 -0
- package/src/execution/__tests__/concurrency-pool.test.ts +250 -0
- package/src/execution/__tests__/config.test.ts +302 -0
- package/src/execution/__tests__/delivery-methods.test.ts +424 -0
- package/src/execution/__tests__/dialog-queue.test.ts +299 -0
- package/src/execution/__tests__/epipe-fallback.test.ts +241 -0
- package/src/execution/__tests__/execute-and-await-worktree.test.ts +243 -0
- package/src/execution/__tests__/execute-nesting.test.ts +323 -0
- package/src/execution/__tests__/execute-options-mapper.test.ts +200 -0
- package/src/execution/__tests__/execution-record.test.ts +1394 -0
- package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +171 -0
- package/src/execution/__tests__/finalize-record.test.ts +367 -0
- package/src/execution/__tests__/finalized-marker.test.ts +104 -0
- package/src/execution/__tests__/format-schema-instruction.test.ts +169 -0
- package/src/execution/__tests__/gc-timer.test.ts +184 -0
- package/src/execution/__tests__/get-record-for-action-restart.test.ts +254 -0
- package/src/execution/__tests__/helpers/mock-extension-api.ts +30 -0
- package/src/execution/__tests__/helpers/spawn-mock.ts +242 -0
- package/src/execution/__tests__/host-mode.test.ts +87 -0
- package/src/execution/__tests__/lifecycle-manager-lock.test.ts +211 -0
- package/src/execution/__tests__/lifecycle-manager.test.ts +383 -0
- package/src/execution/__tests__/lifecycle-predicates.test.ts +116 -0
- package/src/execution/__tests__/manifest-parentid.test.ts +117 -0
- package/src/execution/__tests__/model-resolver.test.ts +465 -0
- package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +287 -0
- package/src/execution/__tests__/nested-visibility.test.ts +325 -0
- package/src/execution/__tests__/output-collector.test.ts +358 -0
- package/src/execution/__tests__/path-encoding.test.ts +104 -0
- package/src/execution/__tests__/pi-invocation.test.ts +134 -0
- package/src/execution/__tests__/record-store.test.ts +1057 -0
- package/src/execution/__tests__/records-cwd-isolation.test.ts +91 -0
- package/src/execution/__tests__/recursive-visibility-baseline.test.ts +339 -0
- package/src/execution/__tests__/recursive-visibility-env.test.ts +273 -0
- package/src/execution/__tests__/relay-env.test.ts +42 -0
- package/src/execution/__tests__/resource-policy.test.ts +109 -0
- package/src/execution/__tests__/rpc-mode.test.ts +89 -0
- package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +267 -0
- package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +253 -0
- package/src/execution/__tests__/run-spawn-edges.test.ts +687 -0
- package/src/execution/__tests__/run-spawn-integration.test.ts +933 -0
- package/src/execution/__tests__/run-spawn-resume.test.ts +322 -0
- package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +196 -0
- package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +199 -0
- package/src/execution/__tests__/session-context-resolver.test.ts +167 -0
- package/src/execution/__tests__/session-file-gc.test.ts +293 -0
- package/src/execution/__tests__/session-reconstructor.test.ts +379 -0
- package/src/execution/__tests__/session-runner-epipe.test.ts +178 -0
- package/src/execution/__tests__/session-runner-schema-env.test.ts +350 -0
- package/src/execution/__tests__/spawn-args.test.ts +445 -0
- package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +189 -0
- package/src/execution/__tests__/spawn-event-adapter.test.ts +167 -0
- package/src/execution/__tests__/spawn-worktree-guidance.test.ts +207 -0
- package/src/execution/__tests__/spawned-children.test.ts +92 -0
- package/src/execution/__tests__/start-sync-model-guard.test.ts +150 -0
- package/src/execution/__tests__/stdin-writer.test.ts +462 -0
- package/src/execution/__tests__/stream-sink-retirement.test.ts +261 -0
- package/src/execution/__tests__/subagent-service-abort.test.ts +60 -0
- package/src/execution/__tests__/subagent-service-message-close.test.ts +629 -0
- package/src/execution/__tests__/subagent-service-parent-guard.test.ts +180 -0
- package/src/execution/__tests__/subagent-service.test.ts +788 -0
- package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +310 -0
- package/src/execution/__tests__/subprocess-agent-runner.test.ts +612 -0
- package/src/execution/__tests__/temp-prompt.test.ts +53 -0
- package/src/execution/__tests__/timeout-integration.test.ts +615 -0
- package/src/execution/__tests__/tombstone-store.test.ts +73 -0
- package/src/execution/__tests__/turn-limiter-semantics.test.ts +194 -0
- package/src/execution/__tests__/turn-limiter.test.ts +65 -0
- package/src/execution/__tests__/ui-channels.test.ts +187 -0
- package/src/execution/__tests__/ui-interaction-model.test.ts +67 -0
- package/src/execution/__tests__/ui-request-handler-factory.test.ts +369 -0
- package/src/execution/__tests__/ui-request-handler.test.ts +204 -0
- package/src/execution/__tests__/ui-request-observability.test.ts +113 -0
- package/src/execution/__tests__/ui-request-queue.test.ts +133 -0
- package/src/execution/__tests__/worktree-manager.test.ts +633 -0
- package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +229 -0
- package/src/execution/__tests__/worktree-reconcile.integration.test.ts +181 -0
- package/src/execution/__tests__/worktree-registry.test.ts +199 -0
- package/src/execution/agent-registry.ts +199 -0
- package/src/execution/agent-result-mapper.ts +90 -0
- package/src/execution/alive-store.ts +119 -0
- package/src/execution/argv-mirror.ts +113 -0
- package/src/execution/best-effort.ts +38 -0
- package/src/execution/channel-registry-access.ts +144 -0
- package/src/execution/concurrency-pool.ts +116 -0
- package/src/execution/config.ts +165 -0
- package/src/execution/dialog-queue.ts +330 -0
- package/src/execution/engine/__tests__/common/data-dir.test.ts +78 -0
- package/src/execution/engine/__tests__/common/errors.test.ts +132 -0
- package/src/execution/engine/__tests__/common/event-journal.test.ts +177 -0
- package/src/execution/engine/__tests__/common/kill-chain.test.ts +192 -0
- package/src/execution/engine/__tests__/common/nesting-guard.test.ts +81 -0
- package/src/execution/engine/__tests__/common/persona-router.test.ts +123 -0
- package/src/execution/engine/__tests__/common/pool-manager.test.ts +154 -0
- package/src/execution/engine/__tests__/common/schema-emulation.test.ts +128 -0
- package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +28 -0
- package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +141 -0
- package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +109 -0
- package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +101 -0
- package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +77 -0
- package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +104 -0
- package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +201 -0
- package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +76 -0
- package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +79 -0
- package/src/execution/engine/__tests__/engine-discovery.test.ts +87 -0
- package/src/execution/engine/__tests__/model-prompt.test.ts +197 -0
- package/src/execution/engine/__tests__/paths.test.ts +39 -0
- package/src/execution/engine/__tests__/registry.test.ts +120 -0
- package/src/execution/engine/__tests__/routing.test.ts +231 -0
- package/src/execution/engine/common/data-dir.ts +66 -0
- package/src/execution/engine/common/errors.ts +183 -0
- package/src/execution/engine/common/event-journal.ts +254 -0
- package/src/execution/engine/common/journal-replay.ts +62 -0
- package/src/execution/engine/common/kill-chain.ts +221 -0
- package/src/execution/engine/common/nesting-guard.ts +50 -0
- package/src/execution/engine/common/persona-router.ts +108 -0
- package/src/execution/engine/common/pool-manager.ts +226 -0
- package/src/execution/engine/common/schema-emulation.ts +189 -0
- package/src/execution/engine/common/session-view-projection.ts +51 -0
- package/src/execution/engine/engine-discovery.ts +65 -0
- package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +469 -0
- package/src/execution/engine/engines/pi/__tests__/reader.test.ts +155 -0
- package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +164 -0
- package/src/execution/engine/engines/pi/pi-engine.ts +415 -0
- package/src/execution/engine/engines/pi/reader.ts +48 -0
- package/src/execution/engine/engines/pi/registration.ts +35 -0
- package/src/execution/engine/engines/pi/task-spec-mapper.ts +100 -0
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +39 -0
- package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +150 -0
- package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +246 -0
- package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +228 -0
- package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +210 -0
- package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +71 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +127 -0
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +580 -0
- package/src/execution/engine/engines/zcode/constants.ts +43 -0
- package/src/execution/engine/engines/zcode/golden-sample.ts +39 -0
- package/src/execution/engine/engines/zcode/launcher.ts +161 -0
- package/src/execution/engine/engines/zcode/parser.ts +436 -0
- package/src/execution/engine/engines/zcode/preparer.ts +363 -0
- package/src/execution/engine/engines/zcode/reader.ts +381 -0
- package/src/execution/engine/engines/zcode/registration.ts +37 -0
- package/src/execution/engine/engines/zcode/zcode-engine.ts +658 -0
- package/src/execution/engine/host-task-spec.ts +47 -0
- package/src/execution/engine/model-prompt.ts +158 -0
- package/src/execution/engine/paths.ts +42 -0
- package/src/execution/engine/port.ts +153 -0
- package/src/execution/engine/registry.ts +133 -0
- package/src/execution/engine/routing.ts +218 -0
- package/src/execution/engine/types.ts +309 -0
- package/src/execution/execute-options-mapper.ts +115 -0
- package/src/execution/execution-record.ts +984 -0
- package/src/execution/finalize-record.ts +254 -0
- package/src/execution/finalized-marker.ts +70 -0
- package/src/execution/get-state-handshake.ts +104 -0
- package/src/execution/host-mode.ts +56 -0
- package/src/execution/idle-gc.ts +47 -0
- package/src/execution/lifecycle-manager.ts +513 -0
- package/src/execution/lifecycle-predicates.ts +65 -0
- package/src/execution/manifest-store.ts +256 -0
- package/src/execution/model-config-service.ts +250 -0
- package/src/execution/model-resolver.ts +248 -0
- package/src/execution/notifier.ts +372 -0
- package/src/execution/notify-ledger.ts +580 -0
- package/src/execution/output-collector.ts +228 -0
- package/src/execution/path-encoding.ts +60 -0
- package/src/execution/pi-invocation.ts +120 -0
- package/src/execution/record-entry.ts +132 -0
- package/src/execution/record-store.ts +1265 -0
- package/src/execution/relay-env.ts +37 -0
- package/src/execution/session-context-resolver.ts +64 -0
- package/src/execution/session-file-gc.ts +120 -0
- package/src/execution/session-pending.ts +170 -0
- package/src/execution/session-reconstructor.ts +678 -0
- package/src/execution/session-runner.ts +1789 -0
- package/src/execution/sessions-index.ts +304 -0
- package/src/execution/spawn-event-adapter.ts +363 -0
- package/src/execution/stdin-writer.ts +198 -0
- package/src/execution/stream-sink.ts +126 -0
- package/src/execution/subagent-service.ts +2268 -0
- package/src/execution/subprocess-agent-runner.ts +317 -0
- package/src/execution/temp-prompt.ts +62 -0
- package/src/execution/tombstone-store.ts +72 -0
- package/src/execution/turn-limiter.ts +102 -0
- package/src/execution/types.ts +1023 -0
- package/src/execution/ui-channels.ts +216 -0
- package/src/execution/ui-interaction-model.ts +48 -0
- package/src/execution/ui-request-handler-factory.ts +243 -0
- package/src/execution/ui-request-observability.ts +81 -0
- package/src/execution/ui-request-queue.ts +184 -0
- package/src/execution/worktree-manager.ts +688 -0
- package/src/execution/worktree-registry.ts +279 -0
- package/src/index.ts +87 -0
- package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +349 -0
- package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +202 -0
- package/src/orchestration/__tests__/agent-call-stream.test.ts +152 -0
- package/src/orchestration/__tests__/args-validator.test.ts +143 -0
- package/src/orchestration/__tests__/config-loader.test.ts +503 -0
- package/src/orchestration/__tests__/error-recovery-handlers.test.ts +809 -0
- package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +404 -0
- package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +56 -0
- package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +166 -0
- package/src/orchestration/__tests__/execute-agent-call.test.ts +451 -0
- package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +600 -0
- package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +96 -0
- package/src/orchestration/__tests__/lifecycle.test.ts +659 -0
- package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +95 -0
- package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +183 -0
- package/src/orchestration/__tests__/script-lint.test.ts +831 -0
- package/src/orchestration/__tests__/skill-discovery.test.ts +210 -0
- package/src/orchestration/__tests__/test-mocks.ts +197 -0
- package/src/orchestration/__tests__/worker-exit-without-result.test.ts +368 -0
- package/src/orchestration/__tests__/worker-host.test.ts +120 -0
- package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +164 -0
- package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +563 -0
- package/src/orchestration/__tests__/worker-script-builder.test.ts +309 -0
- package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +129 -0
- package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +317 -0
- package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +110 -0
- package/src/orchestration/agent-opts-resolver.ts +174 -0
- package/src/orchestration/args-validator.ts +127 -0
- package/src/orchestration/config-loader.ts +316 -0
- package/src/orchestration/error-recovery.ts +1018 -0
- package/src/orchestration/execute-agent-call.ts +256 -0
- package/src/orchestration/launcher.ts +455 -0
- package/src/orchestration/lifecycle.ts +399 -0
- package/src/orchestration/models/__tests__/budget.test.ts +307 -0
- package/src/orchestration/models/agent-call.ts +83 -0
- package/src/orchestration/models/budget.ts +118 -0
- package/src/orchestration/models/ports.ts +164 -0
- package/src/orchestration/models/run-runtime.ts +104 -0
- package/src/orchestration/models/run-spec.ts +83 -0
- package/src/orchestration/models/run-state.ts +44 -0
- package/src/orchestration/models/trace.ts +183 -0
- package/src/orchestration/models/types.ts +301 -0
- package/src/orchestration/models/workflow-run.ts +254 -0
- package/src/orchestration/models/workflow-script-registry.ts +35 -0
- package/src/orchestration/models/workflow-script.ts +117 -0
- package/src/orchestration/script-lint.ts +766 -0
- package/src/orchestration/skill-discovery.ts +135 -0
- package/src/orchestration/worker-handle.ts +115 -0
- package/src/orchestration/worker-host.ts +98 -0
- package/src/orchestration/worker-script-builder.ts +421 -0
- package/src/orchestration/workflow-files.ts +85 -0
- package/src/orchestration/workflow-script-registry-impl.ts +133 -0
- package/src/shared/__tests__/agent-ref.test.ts +34 -0
- package/src/shared/__tests__/meta-parser.test.ts +304 -0
- package/src/shared/__tests__/model-ref.test.ts +306 -0
- package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +288 -0
- package/src/shared/__tests__/resource-discovery.test.ts +749 -0
- package/src/shared/__tests__/resource-meta.test.ts +51 -0
- package/src/shared/__tests__/schema-jsonify.test.ts +81 -0
- package/src/shared/__tests__/timer-delay.test.ts +61 -0
- package/src/shared/agent-event.ts +13 -0
- package/src/shared/agent-ref.ts +57 -0
- package/src/shared/meta-parser.ts +261 -0
- package/src/shared/model-ref.ts +286 -0
- package/src/shared/resource-discovery.ts +835 -0
- package/src/shared/resource-meta.ts +65 -0
- package/src/shared/schema-env.ts +44 -0
- package/src/shared/schema-jsonify.ts +58 -0
- package/src/shared/timer-delay.ts +54 -0
- package/src/shared/xml-injection.ts +35 -0
- package/workflows/README.md +81 -0
- package/workflows/_shared/agent-refs.cjs +40 -0
- package/workflows/chain.js +137 -0
- package/workflows/map-reduce.js +180 -0
- package/workflows/parallel.js +154 -0
- package/workflows/review-fix-loop-utils.cjs +1542 -0
- package/workflows/review-fix-loop.js +1605 -0
- package/workflows/scatter-gather.js +184 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,1184 @@
|
|
|
1
|
+
import { ChildProcess } from 'node:child_process';
|
|
2
|
+
import { E as EngineCapabilities, P as ProbeReport, A as AgentTaskSpec, a as AgentEvent, b as EngineHandle, c as AgentOutcome, I as InteractAction, d as InteractResult, S as SessionView, e as AgentUsage, f as AgentCallOpts, g as AgentResult, h as ExecutionTraceNode, T as TracePatch, R as RunStatus, D as DoneReason, W as WorkerLogEntry } from './types-BxyAidGf.js';
|
|
3
|
+
export { i as EngineHandleData, j as PersonaSpec, k as ReplayedTurn } from './types-BxyAidGf.js';
|
|
4
|
+
import { Worker } from 'node:worker_threads';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 模型信息(registry 返回元素 / ctx.model 鸭子类型兼容)。
|
|
8
|
+
* ctx.model(SDK Model<Api>)是此类型的超集,运行时直接当 ModelInfo 用。
|
|
9
|
+
*/
|
|
10
|
+
interface ModelInfo {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
reasoning: boolean;
|
|
15
|
+
thinkingLevelMap?: Record<string, unknown>;
|
|
16
|
+
contextWindow?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** 日志级别。对齐 @zhushanwen/pi-extension-logger 的 LogLevel(三值,无 info)。 */
|
|
20
|
+
type LogLevel = "debug" | "warn" | "error";
|
|
21
|
+
/** core logger 接口。与 pi-extension-logger 的 ExtensionLogger 结构兼容——
|
|
22
|
+
* u0-log 批次替换是纯 import 源替换,调用面(方法名/参数序)逐文件等价。 */
|
|
23
|
+
interface CoreLogger {
|
|
24
|
+
debug(msg: string, data?: unknown): void;
|
|
25
|
+
warn(msg: string, data?: unknown): void;
|
|
26
|
+
error(msg: string, data?: unknown): void;
|
|
27
|
+
}
|
|
28
|
+
declare function getLogger(component: string): CoreLogger;
|
|
29
|
+
|
|
30
|
+
/** 发现根条目:dir 为扫描根路径;source 是宿主提供的语义标签(遮蔽报告透传用)。
|
|
31
|
+
* source 不枚举封闭集——core 只透传不解释(宿主如 pi 壳用 user-pi/npm/npm-dev)。 */
|
|
32
|
+
interface DiscoveryRoot {
|
|
33
|
+
dir: string;
|
|
34
|
+
source: string;
|
|
35
|
+
}
|
|
36
|
+
interface HostServices {
|
|
37
|
+
/** 数据根目录:引擎隔离池 / journal / record 派生存放的锚点。
|
|
38
|
+
* pi 壳返回 getAgentDir()(独立 pi 用户 journal 不漂目录);zsw 壳返回 zsw 数据根。 */
|
|
39
|
+
dataRoot(): string;
|
|
40
|
+
/** 结构化日志:对齐现 getLogger 调用面(level/component/message/data)。缺省 sink 按级分化:
|
|
41
|
+
* warn/error 走 console、debug no-op(对齐 pi-extension-logger 语义,见 NULL_HOST.log)。 */
|
|
42
|
+
log(level: LogLevel, component: string, message: string, data?: unknown): void;
|
|
43
|
+
/** agent/skill/workflow 资源发现根(可选端口,缺席 = 调用方降级)。宿主只提供根列表
|
|
44
|
+
* (按优先级低→高);扫描 / 同名遮蔽(last-writer-wins)/ 遮蔽报告语义归 core 统一。 */
|
|
45
|
+
discoveryRoots?(): {
|
|
46
|
+
agents?: DiscoveryRoot[];
|
|
47
|
+
skills?: DiscoveryRoot[];
|
|
48
|
+
workflows?: DiscoveryRoot[];
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** core 缺省数据根(~/.subagent-core,homedir 推导——禁止写死绝对路径,排查规则)。
|
|
52
|
+
* 供无自有数据根的轻宿主显式采用;core 自身不静默兜底到该值。 */
|
|
53
|
+
declare const DEFAULT_DATA_ROOT: string;
|
|
54
|
+
declare function configureCore(host: HostServices): void;
|
|
55
|
+
|
|
56
|
+
/** 投递意图(与 session-delivery 的 DeliveryIntent 字面量一致)。 */
|
|
57
|
+
type DeliveryIntent = "interrupt-at-turn-boundary" | "after-run";
|
|
58
|
+
/** 文本 payload。 */
|
|
59
|
+
interface DeliveryTextPayload {
|
|
60
|
+
kind: "text";
|
|
61
|
+
content: string;
|
|
62
|
+
}
|
|
63
|
+
/** custom message payload(extension 通路)。 */
|
|
64
|
+
interface DeliveryCustomPayload {
|
|
65
|
+
kind: "custom";
|
|
66
|
+
customType: string;
|
|
67
|
+
content: string;
|
|
68
|
+
display: boolean;
|
|
69
|
+
details?: unknown;
|
|
70
|
+
}
|
|
71
|
+
/** 判别联合 payload(envelope / payload 分离)。 */
|
|
72
|
+
type DeliveryPayload = DeliveryTextPayload | DeliveryCustomPayload;
|
|
73
|
+
/** 投递消息 envelope。 */
|
|
74
|
+
interface DeliveryMessage {
|
|
75
|
+
payload: DeliveryPayload;
|
|
76
|
+
/** 缺省回落工厂 options.intent。 */
|
|
77
|
+
intent?: DeliveryIntent;
|
|
78
|
+
/** 去重 key(工厂开 dedupe 时必填)。 */
|
|
79
|
+
dedupeKey?: string;
|
|
80
|
+
}
|
|
81
|
+
/** port.send 的受理回执(U2 扩展位;void = 受理未知,按成功处理)。 */
|
|
82
|
+
interface DeliverySendReceipt {
|
|
83
|
+
accepted: boolean;
|
|
84
|
+
reason?: string;
|
|
85
|
+
}
|
|
86
|
+
/** 投递端口:内核与外部世界的唯一接口(notifier 装配,intent→宿主参数翻译在适配器内)。 */
|
|
87
|
+
interface DeliveryPort {
|
|
88
|
+
/** 本通路支持的 payload kind(不支持的 kind 由工厂 fail-fast)。 */
|
|
89
|
+
supportedPayloads: readonly DeliveryPayload["kind"][];
|
|
90
|
+
/** 主 agent 是否空闲(gate 投递时机)。 */
|
|
91
|
+
isIdle(): boolean;
|
|
92
|
+
/** 是否有排队中的消息。 */
|
|
93
|
+
hasPendingMessages(): boolean;
|
|
94
|
+
/** 投递消息。返回受理回执或 void(扩展位——旧实现返回 void 兼容)。 */
|
|
95
|
+
send(msg: DeliveryMessage, intent: DeliveryIntent): void | DeliverySendReceipt | Promise<void | DeliverySendReceipt>;
|
|
96
|
+
/** agent_settled 边沿订阅。缺省时工厂退化退避轮询;返回退订函数。 */
|
|
97
|
+
subscribeSettled?(cb: () => void): () => void;
|
|
98
|
+
}
|
|
99
|
+
/** 投递工厂 options(notifier 实际消费的字段集;其余策略字段未入端口面)。 */
|
|
100
|
+
interface DeliveryConfig {
|
|
101
|
+
intent?: DeliveryIntent;
|
|
102
|
+
busyPolicy?: "retry-force" | "park";
|
|
103
|
+
/** 合批窗口(ms):0 = 关;>0 = 滑动窗口合批。 */
|
|
104
|
+
mergeWindowMs?: number;
|
|
105
|
+
/** 合批依赖谓词(禁止用 isIdle 代替——D4 must-fix 语义)。 */
|
|
106
|
+
mergeHoldActive?: () => boolean;
|
|
107
|
+
backoff?: {
|
|
108
|
+
ms: number;
|
|
109
|
+
max: number;
|
|
110
|
+
};
|
|
111
|
+
dedupe?: {
|
|
112
|
+
maxKeys: number;
|
|
113
|
+
};
|
|
114
|
+
/** 投递失败警告出口(U4:装配方接 logger 使警告落日志盘而非 stderr)。 */
|
|
115
|
+
warn?: (msg: string, err?: unknown) => void;
|
|
116
|
+
}
|
|
117
|
+
/** 投递句柄(notifier 消费面:send / flush / dispose——诊断面 depth 等不入端口)。 */
|
|
118
|
+
interface DeliveryHandle {
|
|
119
|
+
/** 唯一常规入口(合批窗口 + 空闲零延迟立即投)。 */
|
|
120
|
+
send(msg: DeliveryMessage, opts?: {
|
|
121
|
+
merge?: boolean;
|
|
122
|
+
}): void;
|
|
123
|
+
/** 强制投递尝试(shutdown flush 等)。 */
|
|
124
|
+
flush(): void;
|
|
125
|
+
/** 销毁(清队列 + 清 timer + 退订)。 */
|
|
126
|
+
dispose(): void;
|
|
127
|
+
}
|
|
128
|
+
interface NotifyDomainPorts {
|
|
129
|
+
/** pending 活跃计数(pi 会话 entries 中 register − unregister 差集的数值)。
|
|
130
|
+
* 契约为 number 而非 pi 侧 CountActiveResult:core 消费面只读 count,契约面最窄;
|
|
131
|
+
* pi 壳注入时拆 `countActiveFromEntries(entries).count`。 */
|
|
132
|
+
countActiveFromEntries?(entries: unknown[]): number;
|
|
133
|
+
/** 投递内核工厂。签名与 @xyz-agent/session-delivery 的 createDelivery 结构兼容,
|
|
134
|
+
* pi 壳直传其本体即可。缺席 = 消费方降级直发。 */
|
|
135
|
+
createDelivery?(port: DeliveryPort, options?: DeliveryConfig): DeliveryHandle;
|
|
136
|
+
}
|
|
137
|
+
declare function configureNotifyDomain(ports: NotifyDomainPorts): void;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* subagent text_delta streaming sink。
|
|
141
|
+
*
|
|
142
|
+
* background subagent 执行期间,session-runner 的 agentEvent 出口把每个 text_delta
|
|
143
|
+
* 传到 SubagentStream.onDelta。本模块做 100ms 时间窗合并后,通过 StreamSink.setWidget
|
|
144
|
+
* 转发到 RPC stdout(经 ctx.ui.setWidget → extension_ui_request 通道)。
|
|
145
|
+
*
|
|
146
|
+
* SubagentStream 是一个生命周期对象——内聚 buffer/timer 状态 + onDelta/dispose 方法。
|
|
147
|
+
* 调用方(subagent-service)创建后只需在 text_delta 时调 onDelta、终态时调 dispose,
|
|
148
|
+
* 不需要拆散 push/clear 两个函数跨层透传。
|
|
149
|
+
*
|
|
150
|
+
* 设计要点:
|
|
151
|
+
* - leading edge:第一个 delta 立即 flush(前端尽快看到开始)
|
|
152
|
+
* - trailing edge:后续 delta 追加 buffer,timer 到期后 flush
|
|
153
|
+
* - 每次 flush 把 buffer 的累积文本 split("\n") 截尾 MAX_WIDGET_LINES 行传给 setWidget
|
|
154
|
+
* - dispose 清除 widget + 清 timer
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
/** UI streaming sink 的最小接口(ctx.ui.setWidget 的 duck-typed 子集)。
|
|
158
|
+
*
|
|
159
|
+
* 当前只有一个 adapter(index.ts session_start 包装 ctx.ui.setWidget)。
|
|
160
|
+
* 保留接口而非裸函数类型,因为 StreamSink 的语义是「UI sink 契约」——
|
|
161
|
+
* 测试 mock 和未来可能的第二 sink(如写文件)都走此契约。 */
|
|
162
|
+
interface StreamSink {
|
|
163
|
+
setWidget(key: string, lines: string[] | undefined): void;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* subagent text_delta streaming 生命周期对象。
|
|
167
|
+
*
|
|
168
|
+
* 创建后:
|
|
169
|
+
* - `onDelta(delta)`:session-runner 每次 text_delta 调
|
|
170
|
+
* - `dispose()`:subagent 终态时调,清除 widget + 清 timer
|
|
171
|
+
*
|
|
172
|
+
* buffer/timer 状态全部内聚在此对象,调用方不需要关心合并逻辑。
|
|
173
|
+
*/
|
|
174
|
+
declare class SubagentStream {
|
|
175
|
+
private readonly widgetKey;
|
|
176
|
+
private readonly sink;
|
|
177
|
+
private buffer;
|
|
178
|
+
private timer;
|
|
179
|
+
private hasFlushed;
|
|
180
|
+
private disposed;
|
|
181
|
+
constructor(recordId: string, sink: StreamSink);
|
|
182
|
+
/** 接收一个 text_delta 增量。空串静默丢弃(不消耗 leading edge)。 */
|
|
183
|
+
onDelta(delta: string): void;
|
|
184
|
+
/** 终态清理:清除 widget + 清 timer(幂等)。 */
|
|
185
|
+
dispose(): void;
|
|
186
|
+
private flush;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* run 的运行期上下文。任务声明(AgentTaskSpec)与运行期句柄分离——signal/ctxModel/
|
|
191
|
+
* onComplete 从 ExecuteOptions 移出(设计 §3.3.5 删字段去向),因为它们是宿主注入的
|
|
192
|
+
* 运行期对象,不属于跨引擎持久化的任务声明。
|
|
193
|
+
*
|
|
194
|
+
* 常驻进程友好(D1):onEvent 回调式(而非迭代器式)+ AbortSignal——引擎内部换常驻
|
|
195
|
+
* server 实现(未来 driver host)时接口不动。
|
|
196
|
+
*/
|
|
197
|
+
interface RunContext {
|
|
198
|
+
/** = record.id(bg-N-xxx / run-N)——journal 文件名与池引用计数 key(P2 消费)。 */
|
|
199
|
+
taskId: string;
|
|
200
|
+
/** D5 隔离池(宿主分配,设计 §3.3.9;pi 无池化恒 'shared')。 */
|
|
201
|
+
poolKey: string;
|
|
202
|
+
/** abort 分级入口(D1:引擎原生中断 → 公共杀链兜底)。 */
|
|
203
|
+
signal?: AbortSignal;
|
|
204
|
+
/** 事件流出口(host 消费后统一落 journal,D6 第②级)。 */
|
|
205
|
+
onEvent?: (event: AgentEvent) => void;
|
|
206
|
+
/** model 解析第三层兼底(现有 D-008 语义不变)。 */
|
|
207
|
+
ctxModel?: ModelInfo;
|
|
208
|
+
/**
|
|
209
|
+
* text_delta streaming 通道(宿主侧 UI widget)。与 onEvent 平行的 text_delta 出口:
|
|
210
|
+
* background 路径 onEvent=undefined 但流式仍需送达(双通道互斥设计,见 session-runner
|
|
211
|
+
* agentEvent 出口注释)。pi 回填期承载 AgentRunner port 的 stream 透传(行为零变化),
|
|
212
|
+
* 语义上是宿主设施而非引擎专有——未来引擎的 text_delta 同样可走此通道。
|
|
213
|
+
*/
|
|
214
|
+
stream?: SubagentStream;
|
|
215
|
+
/**
|
|
216
|
+
* [P1 pi 回填透传] 调用方已持有的 schema 激活预编码值(AgentCallOpts.schemaEnv 直传
|
|
217
|
+
* 形态)。生产路径中 resolveAgentOpts 恒耦合产出 schema+schemaEnv(值 = JSON.stringify
|
|
218
|
+
* (schema)),引擎从 task.schema 派生即可逐字节等值;解耦形态(有 schemaEnv 无
|
|
219
|
+
* schema)生产不可达、仅见于直构调用,派生无源——本字段是其唯一透交通道。
|
|
220
|
+
* 引擎在 task.schema 存在时忽略此值(派生优先,设计 §3.3.5 删字段去向)。
|
|
221
|
+
*/
|
|
222
|
+
schemaEnv?: string;
|
|
223
|
+
/**
|
|
224
|
+
* [P4 D9①] 引擎 fallback 留痕(probe 失败路由回默认引擎)。路由层(routing.ts)
|
|
225
|
+
* 产出,引擎投影到 outcome.engineFallback(zcode 等无 record 通路的引擎以此留痕;
|
|
226
|
+
* pi 引擎另经 ExecuteOptions 投影进 record)。
|
|
227
|
+
*/
|
|
228
|
+
engineFallback?: {
|
|
229
|
+
from: string;
|
|
230
|
+
reason: string;
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* [P4 对齐点③] 引擎声明实际隔离池 key(journal 落盘路径权威)。宿主创建 journal
|
|
234
|
+
* writer 时只能用缺省占位 poolKey(pi 恒 'shared'),非池化稳定的引擎(zcode 按
|
|
235
|
+
* provider+model 池化)在 prepare 期确定 poolKey 后回调本方法重定向 writer——
|
|
236
|
+
* 保证 journal 落盘路径与 handle.poolKey 同源(单一权威,不再两边推导)。
|
|
237
|
+
* 契约:必须在首个事件 emit 之前调用(zcode coarse 事件在终态后合成,天然满足;
|
|
238
|
+
* 未来流式引擎需在事件出口前调用)。
|
|
239
|
+
*/
|
|
240
|
+
onPoolResolved?: (poolKey: string) => void;
|
|
241
|
+
/**
|
|
242
|
+
* [U0 D10] 引擎 spawn 的子进程句柄注册钩子(宿主终止链记账)。引擎在 spawn 成功后
|
|
243
|
+
* 同步回调(与 pi runSpawn 的 spawnedChildren.set 同构时机);宿主据此把 child 注册进
|
|
244
|
+
* session-runner 的 spawnedChildren Map(cancel SIGTERM / dispose 收割兜底 / killAll
|
|
245
|
+
* 全量清理对非 pi 引擎 record 生效)。close/error 后由宿主按句守卫移除。可选:引擎
|
|
246
|
+
* 内部不 spawn 进程(如未来常驻 driver host 实现)时不调用,宿主记账自然为空。
|
|
247
|
+
*/
|
|
248
|
+
onChildSpawned?: (child: ChildProcess) => void;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* run 的返回:终态 + 可持久化 handle。
|
|
252
|
+
*
|
|
253
|
+
* handle 语义(设计 §3.3.5 run 错误语义三条):prepare 期错误(credential_missing /
|
|
254
|
+
* model_not_available / prompt_too_large)在进程创建前 reject、不产生 handle;运行中
|
|
255
|
+
* 失败不 reject——合成 error outcome + 正常 handle 返回(record 必须收尾);abort 走
|
|
256
|
+
* 完杀链后同前(exitCode=null + error 含杀链标记)。
|
|
257
|
+
*/
|
|
258
|
+
interface EngineRunResult {
|
|
259
|
+
handle: EngineHandle;
|
|
260
|
+
outcome: AgentOutcome;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* subagent 执行引擎的唯一契约点(D1)。实现方:PiEngine(回填)/ ZcodeEngine(P3)/
|
|
264
|
+
* 未来各引擎适配器。上层(工具面/workflow 引擎/GUI)只消费中立类型,不感知引擎。
|
|
265
|
+
*
|
|
266
|
+
* 贯穿纪律(设计 §3.3.1):宿主编排——引擎只当单 agent 执行器,六家原生多 agent 机制
|
|
267
|
+
* 一律禁用不依赖。
|
|
268
|
+
*/
|
|
269
|
+
interface EnginePort {
|
|
270
|
+
/** 注册表 key('pi' | 'zcode' | ...)。 */
|
|
271
|
+
readonly id: string;
|
|
272
|
+
/** D3(同步无副作用——调用前拒绝的判据)。 */
|
|
273
|
+
capabilities(): EngineCapabilities;
|
|
274
|
+
/** D7(factory 初始化 + 版本变化检测触发;opts.force 跳过缓存强探)。 */
|
|
275
|
+
probe(opts?: {
|
|
276
|
+
force?: boolean;
|
|
277
|
+
}): Promise<ProbeReport>;
|
|
278
|
+
/** D1 主语义:fire-to-completion。 */
|
|
279
|
+
run(task: AgentTaskSpec, ctx: RunContext): Promise<EngineRunResult>;
|
|
280
|
+
/**
|
|
281
|
+
* D1 可选面:交互控制面。pi 首期原生实现(现有 chatMode 行为直通);不支持
|
|
282
|
+
* conversation 的引擎返回 engine_capability_unsupported(同步拒绝、不创建进程)。
|
|
283
|
+
*/
|
|
284
|
+
interact(handle: EngineHandle, action: InteractAction): Promise<InteractResult>;
|
|
285
|
+
/** D6 三级降级链:①引擎原生读取 → ②宿主 event journal(P2)→ ③outcome-only。 */
|
|
286
|
+
read(handle: EngineHandle): Promise<SessionView>;
|
|
287
|
+
/**
|
|
288
|
+
* [U7] 可选面:模型可发现性——引擎自带 provider/model 体系时(如 zcode 的 v2 桌面
|
|
289
|
+
* 登录态),列出当前环境实际可用的模型清单(带凭据校验),供 system prompt 引擎段
|
|
290
|
+
* 与 GUI 引擎选择器消费。省略/返回 null = 「与主 agent 模型体系一致」(pi 的语义:
|
|
291
|
+
* system prompt 已有 <available_provider_models> 段,无需引擎再列)。
|
|
292
|
+
* engine-neutral:未来引擎(AcpEngine 等)实现本方法即自动获得注入与展示,宿主
|
|
293
|
+
* 侧零改动。
|
|
294
|
+
*/
|
|
295
|
+
listModels?(): Array<{
|
|
296
|
+
id: string;
|
|
297
|
+
name?: string;
|
|
298
|
+
}> | null;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** 三层路由的输入(各层值由调用方装配;undefined = 该层不指定)。 */
|
|
302
|
+
interface EngineRoutingInput {
|
|
303
|
+
/** 第一层:调用参数 engine(workflow step 级 / AgentCallOpts.engine)。 */
|
|
304
|
+
callEngine?: string;
|
|
305
|
+
/** 第二层:agent .md frontmatter engine(解析期已对注册表校验)。 */
|
|
306
|
+
agentEngine?: string;
|
|
307
|
+
/** 第三层:全局默认引擎(config.json defaultEngine;缺省 'pi')。 */
|
|
308
|
+
globalDefaultEngine?: string;
|
|
309
|
+
}
|
|
310
|
+
/** 生效层标记(守卫 a 的判据:'call' = 显式指定,probe 失败不兜底)。 */
|
|
311
|
+
type EngineRoutingSource = "call" | "frontmatter" | "default";
|
|
312
|
+
interface EngineRouting {
|
|
313
|
+
engineId: string;
|
|
314
|
+
source: EngineRoutingSource;
|
|
315
|
+
}
|
|
316
|
+
/** routeEngine 的参数(probe/getEngine 注入——测试可 mock,SAR 提供生产实现)。 */
|
|
317
|
+
interface EngineRouteOptions {
|
|
318
|
+
routing: EngineRoutingInput;
|
|
319
|
+
/**
|
|
320
|
+
* 显式 model(守卫 c 判据:model 与引擎 provider 体系绑定,D9②)。短名 model 的
|
|
321
|
+
* provider 缺省决策在 zcode preparer 的 defaultProviderForShortName——显式默认引擎
|
|
322
|
+
* 模型配置(config.json per-engine model)引入时,两处须同步让位配置值优先
|
|
323
|
+
* (对齐点⑦,详见 preparer.ts 该函数注释)。
|
|
324
|
+
*/
|
|
325
|
+
taskModel?: string;
|
|
326
|
+
/** engineRouting.strict(config.json):true = 一切 probe 失败直接报错。 */
|
|
327
|
+
strict: boolean;
|
|
328
|
+
/** 探针执行体(返回 ProbeReport;引擎实例内部有缓存语义)。 */
|
|
329
|
+
probe: (engineId: string) => Promise<ProbeReport>;
|
|
330
|
+
/** 引擎获取(缺省 registry.getEngine;测试/SAR 可注入)。 */
|
|
331
|
+
getEngineFn?: (engineId: string) => EnginePort;
|
|
332
|
+
/** 注册表存在性检查(缺省 registry.hasEngine)。 */
|
|
333
|
+
hasEngineFn?: (engineId: string) => boolean;
|
|
334
|
+
/** 注册表清单(缺省 registry.listEngines——engine_not_found 文案的数据源)。 */
|
|
335
|
+
listEnginesFn?: () => string[];
|
|
336
|
+
}
|
|
337
|
+
interface EngineRouteResult {
|
|
338
|
+
engine: EnginePort;
|
|
339
|
+
/** 实际执行引擎 id(fallback 后可能 ≠ 请求值)。 */
|
|
340
|
+
engineId: string;
|
|
341
|
+
/** 路由决策时的请求引擎 id(fallback 留痕的 from 值)。 */
|
|
342
|
+
requestedEngineId: string;
|
|
343
|
+
/** 生效层(守卫 a 判据的留痕)。 */
|
|
344
|
+
source: EngineRoutingSource;
|
|
345
|
+
/** fallback 留痕(record/outcome 投影,GUI 警告条数据源)。无 fallback 缺省。 */
|
|
346
|
+
engineFallback?: {
|
|
347
|
+
from: string;
|
|
348
|
+
reason: string;
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* 路由 + 探针 + fallback 编排(SAR run 入口调用)。
|
|
353
|
+
*
|
|
354
|
+
* 失败形态(全部抛结构化错误,调用方转 AgentResult.error):
|
|
355
|
+
* - 未注册 id(调用参数层漏网):EngineNotFoundError(engine_not_found)
|
|
356
|
+
* - strict 或守卫命中:EngineError(engine_probe_failed)
|
|
357
|
+
* - 守卫 c(显式 model + 将换引擎):EngineError(model_not_available)
|
|
358
|
+
*/
|
|
359
|
+
declare function routeEngine(opts: EngineRouteOptions): Promise<EngineRouteResult>;
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Workflow Extension — Worker Handle
|
|
363
|
+
*
|
|
364
|
+
* node:worker_threads.Worker 的线程句柄封装。技术资源,Infra 层具体类(D-12)。
|
|
365
|
+
* RunRuntime 直接持有,不经 interface(§domain-models 9)。
|
|
366
|
+
*
|
|
367
|
+
* 核心职责:竞态防护(G-025)。
|
|
368
|
+
*
|
|
369
|
+
* 背景:一个 run 可经历多个 WorkerHandle(终止/重试各换一个)。
|
|
370
|
+
* 需防止「terminate(old) → start(new) → old exit fires」竞态——
|
|
371
|
+
* WorkerHandle 把守卫内化:terminate 后 isCurrent=false,
|
|
372
|
+
* 已终止 handle 的 onMessage/onError/onExit 回调自动 no-op(无需调用方比对引用)。
|
|
373
|
+
*
|
|
374
|
+
* 层归属:Infra(D-12)。仅依赖 node:worker_threads(Node 原生)。
|
|
375
|
+
*/
|
|
376
|
+
|
|
377
|
+
/** Worker → Main 业务消息回调。 */
|
|
378
|
+
type WorkerMessageHandler = (raw: unknown) => void;
|
|
379
|
+
/** Worker 线程 uncaught error 回调。 */
|
|
380
|
+
type WorkerErrorHandler = (err: Error) => void;
|
|
381
|
+
/** Worker 线程 exit 回调(code=0 正常退出,非 0 崩溃)。 */
|
|
382
|
+
type WorkerExitHandler = (code: number) => void;
|
|
383
|
+
declare class WorkerHandle {
|
|
384
|
+
private readonly worker;
|
|
385
|
+
/**
|
|
386
|
+
* 竞态守卫。true = 此 handle 仍是当前活动 handle;false = 已 terminate,
|
|
387
|
+
* 后续事件(已终止 worker 延迟触发的 message/error/exit)必须忽略。
|
|
388
|
+
*
|
|
389
|
+
* 终止后置 false 并永不回升(幂等语义)。新 handle 由调用方(WorkerHost)
|
|
390
|
+
* 重新创建,已终止 handle 留在内存里直到 GC,但其回调全部 no-op。
|
|
391
|
+
*/
|
|
392
|
+
private current;
|
|
393
|
+
constructor(worker: Worker);
|
|
394
|
+
/** 此 handle 是否仍是当前活动 handle(terminate 后 false,G-025)。 */
|
|
395
|
+
get isCurrent(): boolean;
|
|
396
|
+
/** 底层 Worker(WorkerHost/RunRuntime 偶尔需要直接访问,如 ref/href)。 */
|
|
397
|
+
get raw(): Worker;
|
|
398
|
+
/**
|
|
399
|
+
* 向 worker 发送消息。terminate 后 no-op(已终止 handle 的 postMessage 无意义)。
|
|
400
|
+
*/
|
|
401
|
+
postMessage(msg: unknown): void;
|
|
402
|
+
/**
|
|
403
|
+
* 终止 worker 线程。幂等——重复调用安全,第二次起 no-op。
|
|
404
|
+
* 置 isCurrent=false 后再 await worker.terminate,确保并发 exit 事件
|
|
405
|
+
* 在 terminate resolve 之前到达时也被守卫拦下。
|
|
406
|
+
*/
|
|
407
|
+
terminate(): Promise<void>;
|
|
408
|
+
/**
|
|
409
|
+
* 绑定 message 回调。仅当 isCurrent 时触发——已终止 handle 的事件被吞掉。
|
|
410
|
+
* 返回 this 便于链式 onMessage(...).onError(...).onExit(...)。
|
|
411
|
+
*/
|
|
412
|
+
onMessage(handler: WorkerMessageHandler): this;
|
|
413
|
+
/**
|
|
414
|
+
* 绑定 error 回调。仅当 isCurrent 时触发。
|
|
415
|
+
*/
|
|
416
|
+
onError(handler: WorkerErrorHandler): this;
|
|
417
|
+
/**
|
|
418
|
+
* 绑定 exit 回调。仅当 isCurrent 时触发——这是 G-025 的关键守卫:
|
|
419
|
+
* terminate(old) → startWorker(new) → old exit 触发时,old handle.current
|
|
420
|
+
* 已为 false,回调 no-op,不会误删 new worker。
|
|
421
|
+
*/
|
|
422
|
+
onExit(handler: WorkerExitHandler): this;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Workflow Extension — Budget 值对象
|
|
427
|
+
*
|
|
428
|
+
* Token / cost 预算值对象(D-12)。纯数据 + 不变式守卫,无副作用。
|
|
429
|
+
*
|
|
430
|
+
* maxTokens===0 视为不限制(守卫,避免首个 agent 完成误判 budget_limited)。
|
|
431
|
+
* (预算语义对齐 2026-08:soft-limit 常量(500 调用数预警)与 90% 阈值预警方法
|
|
432
|
+
* 已删——全库无生产消费方,仅测试锁定。)
|
|
433
|
+
*
|
|
434
|
+
* 层归属:Engine。
|
|
435
|
+
*
|
|
436
|
+
* 参考:domain-models.md §4(字段/不变式/操作)。
|
|
437
|
+
*/
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Budget 值对象。
|
|
441
|
+
*
|
|
442
|
+
* 不变式(domain-models.md §4):
|
|
443
|
+
* - maxTokens > 0 守卫:maxTokens===0 或 undefined 视为不限制
|
|
444
|
+
* - maxCost > 0 守卫:同上
|
|
445
|
+
* - consume 只累加,不减;isExceeded 只读
|
|
446
|
+
* - 无回调字段——所有副作用由调用方在 consume 后查询决定
|
|
447
|
+
*/
|
|
448
|
+
declare class Budget {
|
|
449
|
+
readonly maxTokens?: number;
|
|
450
|
+
readonly maxCost?: number;
|
|
451
|
+
readonly maxTimeMs?: number;
|
|
452
|
+
usedTokens: number;
|
|
453
|
+
usedCost: number;
|
|
454
|
+
/** 总调用计数(持久化/诊断用;execute-agent-call 每次 dispatch 后 increment)。 */
|
|
455
|
+
totalCallCount: number;
|
|
456
|
+
constructor(opts?: {
|
|
457
|
+
maxTokens?: number;
|
|
458
|
+
maxCost?: number;
|
|
459
|
+
maxTimeMs?: number;
|
|
460
|
+
usedTokens?: number;
|
|
461
|
+
usedCost?: number;
|
|
462
|
+
totalCallCount?: number;
|
|
463
|
+
});
|
|
464
|
+
/**
|
|
465
|
+
* 累加一次 agent 调用的 usage(加权口径)。
|
|
466
|
+
*
|
|
467
|
+
* 四项 token 按各自权重(INPUT/CACHE_READ/CACHE_WRITE/OUTPUT_WEIGHT)折算后求和,
|
|
468
|
+
* 而非原始 token 数直接相加。retry 间的真实消耗如实记录,避免预算被低估。
|
|
469
|
+
* 详见上方权重常量的口径说明。
|
|
470
|
+
*/
|
|
471
|
+
consume(usage: AgentUsage): void;
|
|
472
|
+
/** 累加调用计数(每次 agent dispatch 后调用;持久化快照同步)。 */
|
|
473
|
+
incrementCallCount(): void;
|
|
474
|
+
/**
|
|
475
|
+
* 是否超 token / cost 预算(FR-3)。
|
|
476
|
+
*
|
|
477
|
+
* maxTokens===0 或 undefined 视为不限制(守卫);
|
|
478
|
+
* maxCost===0 或 undefined 视为不限制。
|
|
479
|
+
* 时间预算(maxTimeMs)不由本方法判断——它是 wall-clock 约束,需参照 startedAt,
|
|
480
|
+
* 由 lifecycle 层的 scheduleTimeBudget(runWorkflow 内 setTimeout)
|
|
481
|
+
* 独立调度,到期 abortRun(doneReason="time_limited")。
|
|
482
|
+
*/
|
|
483
|
+
isExceeded(): boolean;
|
|
484
|
+
/**
|
|
485
|
+
* 剩余 token 预算。maxTokens 未设或 ≤0 时返回 undefined(视为不限制)。
|
|
486
|
+
*
|
|
487
|
+
* 嵌套 workflow() 调用时由 executeNestedWorkflow 消费:子 run 的 budgetTokens
|
|
488
|
+
* 继承父 run 的剩余预算,实现父子预算隔离下的总量约束。
|
|
489
|
+
*/
|
|
490
|
+
remaining(): number | undefined;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Workflow Extension — RunSpec 值对象
|
|
495
|
+
*
|
|
496
|
+
* 单次 workflow run 的不可变规格(domain-models.md §2)。
|
|
497
|
+
*
|
|
498
|
+
* 设计:
|
|
499
|
+
* - 全部字段 readonly——run 一旦创建,规格不可改(状态变化走 RunState)
|
|
500
|
+
* - scriptSource 是已 strip `export const meta` 的可执行源(WorkflowScript.toExecutable)
|
|
501
|
+
* - budgetTokens/budgetTimeMs 是上限(可选,未设 = 不限制)
|
|
502
|
+
*
|
|
503
|
+
* 层归属:Engine。
|
|
504
|
+
*
|
|
505
|
+
* 参考:domain-models.md §2。
|
|
506
|
+
*/
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* RunSpec——一次 workflow run 的不可变输入规格。
|
|
510
|
+
*
|
|
511
|
+
* 作为 RunStore 持久化的一部分(WorkflowRun.spec),崩溃恢复重水合后
|
|
512
|
+
* 需要 scriptSource/args 重建 worker(G3-001)。
|
|
513
|
+
*/
|
|
514
|
+
interface RunSpec {
|
|
515
|
+
/** 已 strip export 的可执行源(WorkflowScript.toExecutable 产物)。 */
|
|
516
|
+
readonly scriptSource: string;
|
|
517
|
+
/**
|
|
518
|
+
* 参数契约(JSON Schema draft-07,来自 script.meta.parameters 整对象透传,m3 DM2)。
|
|
519
|
+
*
|
|
520
|
+
* undefined = 不校验(安全退化——漏拷 parameters 退化是「不校验」非「校验错」)。
|
|
521
|
+
* 由调用方(actionRun/runAndWait/executeNestedWorkflow)从 script.meta.parameters 拷贝。
|
|
522
|
+
* lifecycle.runWorkflow 首行经 validateRunArgs 校验 spec.args(coerceTypes 原地规范化
|
|
523
|
+
* args 对象内容,字段引用不变;worker 启动与崩溃重建共用同一对象)。
|
|
524
|
+
*/
|
|
525
|
+
readonly parameters?: Record<string, unknown>;
|
|
526
|
+
/** 调用方传入的参数(worker 内通过 $ARGS 访问)。 */
|
|
527
|
+
readonly args: Record<string, unknown>;
|
|
528
|
+
/**
|
|
529
|
+
* Run 级 model override(Option B:经 workerData → worker global $MODEL → agent() fallback)。
|
|
530
|
+
*
|
|
531
|
+
* undefined = 继承主 agent 模型(零配置默认)。设置时该 run 内所有 agent() 调用默认继承
|
|
532
|
+
* (除非 per-call 显式指定 model)。注意:不 merge 进 args(对称单路径注入),
|
|
533
|
+
* 而是经 worker-script-builder 注入为 $MODEL worker global。
|
|
534
|
+
*/
|
|
535
|
+
readonly model?: string;
|
|
536
|
+
/**
|
|
537
|
+
* Run 级 thinkingLevel override(Option B:经 workerData → worker global $THINKING_LEVEL)。
|
|
538
|
+
*
|
|
539
|
+
* undefined = 继承主 agent thinkingLevel。取值范围由 THINKING_ORDER SSOT 派生(含 max)。
|
|
540
|
+
*/
|
|
541
|
+
readonly thinkingLevel?: string;
|
|
542
|
+
/** Token 预算上限(未设或 0 = 不限制,见 Budget 守卫)。 */
|
|
543
|
+
readonly budgetTokens?: number;
|
|
544
|
+
/** 时间预算上限(ms,wall-clock,由 lifecycle.scheduleTimeBudget 调度)。 */
|
|
545
|
+
readonly budgetTimeMs?: number;
|
|
546
|
+
/**
|
|
547
|
+
* 父 Budget 共享引用(嵌套 workflow() 时由 executeNestedWorkflow 传入)。
|
|
548
|
+
*
|
|
549
|
+
* 设置时 lifecycle.runWorkflow 直接复用此 Budget 实例,而非 new 一个独立 Budget——
|
|
550
|
+
* 子 run 的 consume 直接反映到父 Budget,消除并行嵌套下的超支窗口(F-7 方案 B)。
|
|
551
|
+
* 顶层 run 无此字段(budgetTokens 走独立 Budget 构造)。
|
|
552
|
+
*/
|
|
553
|
+
readonly budgetRef?: Budget;
|
|
554
|
+
/** 脚本名(meta.name 或文件名 stem)。 */
|
|
555
|
+
readonly scriptName: string;
|
|
556
|
+
/**
|
|
557
|
+
* Run 级简短标签(≤20 字符),区别于 scriptName(脚本身份名)。
|
|
558
|
+
* 区分同脚本的不同 run 实例(如 'migrate-users-batch1' vs 'migrate-users-batch2')。
|
|
559
|
+
* 旧持久化 run 缺失时为 undefined,渲染时回落 scriptName。
|
|
560
|
+
*/
|
|
561
|
+
readonly slug?: string;
|
|
562
|
+
/** 脚本文件绝对路径(用于诊断/日志)。 */
|
|
563
|
+
readonly scriptPath: string;
|
|
564
|
+
/** 人类可读描述(meta.description)。 */
|
|
565
|
+
readonly description?: string;
|
|
566
|
+
/**
|
|
567
|
+
* 父 workflow 调用链(嵌套 workflow() 时自动填充,循环检测用)。
|
|
568
|
+
*
|
|
569
|
+
* 顶层 run 无此字段。子 run 的 chain = [...parentChain, parentScriptName]。
|
|
570
|
+
* executeNestedWorkflow 检查目标 name 是否已在 chain 中,防止 A→B→A 死循环。
|
|
571
|
+
*/
|
|
572
|
+
readonly parentWorkflowChain?: readonly string[];
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Workflow Extension — Run Runtime
|
|
577
|
+
*
|
|
578
|
+
* 聚合内运行时资源(仅 status==="running" 时存在)。技术资源聚合,
|
|
579
|
+
* Engine 层类型,持 WorkerHandle 具体类(D-12 不造 interface)。
|
|
580
|
+
*
|
|
581
|
+
* 职责:封装一次 running-segment 的所有技术资源(worker 线程 +
|
|
582
|
+
* abort controller),统一 release 入口(AC-2:单 release 替代多 boolean flag)。
|
|
583
|
+
* (旧并发门闩 gate 抽象已删——no-op,实际并发由 SubagentService ConcurrencyPool 管理;
|
|
584
|
+
* 原 withSlot 的 pre-abort 检查内联到 error-recovery dispatchAgentCall。)
|
|
585
|
+
*
|
|
586
|
+
* 一次性生命周期(G3-001):runtime 释放后不再复用——AbortController 一次性
|
|
587
|
+
* 语义决定 controller 无法跨释放复用,所以整个 RunRuntime 重建。唯一注入路径:
|
|
588
|
+
* assignRuntime(runWorkflow 创建)与 replaceRuntime(error-recovery 崩溃重试)。
|
|
589
|
+
*
|
|
590
|
+
* 参考:domain-models.md §10、clarification.md G3-001。
|
|
591
|
+
*/
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* release mode 枚举——调用方表达意图。
|
|
595
|
+
*
|
|
596
|
+
* 一次性生命周期后唯一语义:terminal(终局释放,worker + controller 全释放,
|
|
597
|
+
* runtime 即被调用方丢弃)。原 "pause" 值已随 pause/resume 生命周期删除(F8)
|
|
598
|
+
* ——release 后不存在「保留待恢复」的中间形态。
|
|
599
|
+
*/
|
|
600
|
+
type ReleaseMode = "terminal";
|
|
601
|
+
declare class RunRuntime {
|
|
602
|
+
/** Worker 线程句柄。 */
|
|
603
|
+
readonly worker: WorkerHandle;
|
|
604
|
+
/** per-running-segment AbortController(一次性,无法复用——G3-001)。 */
|
|
605
|
+
readonly controller: AbortController;
|
|
606
|
+
/** Run 级墙钟时间预算计时器(spec.budgetTimeMs > 0 时由 lifecycle 调度,
|
|
607
|
+
* 到期 abortRun time_limited)。release 时清理,避免 abort/replaceRuntime
|
|
608
|
+
* 后孤儿计时器仍触发(rebuildRuntime 会重排一个全新的计时器,旧的不应残留)。 */
|
|
609
|
+
readonly timeBudgetTimer?: ReturnType<typeof setTimeout>;
|
|
610
|
+
/**
|
|
611
|
+
* 本 runtime 代际是否已收到 worker 的终态消息(return / error)。
|
|
612
|
+
*
|
|
613
|
+
* [F1] worker exit(0) 且本标记为 false = worker 静默退出、未交付任何终态——最常见根因
|
|
614
|
+
* 是 execute() 返回值不可克隆,worker 侧 _safePost 吞掉 DataCloneError 后 return 消息
|
|
615
|
+
* 根本没发出。旧实现 handleWorkerExit 对 code===0 no-op → run 永久 running、runAndWait
|
|
616
|
+
* 悬挂。handleWorkerExit 据此判定转 done,failed。
|
|
617
|
+
*
|
|
618
|
+
* 按代际归零:字段挂在 RunRuntime(每代际 new 一个实例)而非 run.meta——script-error
|
|
619
|
+
* 重试退避窗口内(error 消息已收到、run 仍 running、旧 worker exit(0))必须 no-op 等
|
|
620
|
+
* rebuild;若挂 meta 则 rebuild 后新 worker 再静默退出时会被旧标记误放行,重新悬挂。
|
|
621
|
+
*
|
|
622
|
+
* 写点:① handleWorkerMessage 的 return/error 分支(WorkerHandle.isCurrent 守卫保证
|
|
623
|
+
* 消息必来自当前代际);② handleWorkerError 进入处理前([R4-F1] 同代际幂等守卫——
|
|
624
|
+
* worker 崩溃时 error + exit(1) 双事件各派发一次 handleWorkerError,第一个事件标记
|
|
625
|
+
* 本代际已处理,第二个事件命中标志跳过,消除单次崩溃计数 +2 / 双 rebuild 交错)。
|
|
626
|
+
* rebuildRuntime 构造新 RunRuntime 自然重置。
|
|
627
|
+
*/
|
|
628
|
+
receivedTerminalMessage: boolean;
|
|
629
|
+
/** 防止 release 重复执行(幂等)。 */
|
|
630
|
+
private released;
|
|
631
|
+
constructor(worker: WorkerHandle, controller: AbortController, timeBudgetTimer?: ReturnType<typeof setTimeout>);
|
|
632
|
+
/**
|
|
633
|
+
* 释放所有资源:terminate worker + abort controller。
|
|
634
|
+
*
|
|
635
|
+
* 幂等——重复调用安全(第二次起 no-op,released flag 守卫)。
|
|
636
|
+
* 调用后此 RunRuntime 应被调用方丢弃(WorkflowRun.runtime = undefined),
|
|
637
|
+
* 崩溃重试时由 replaceRuntime 注入新实例(G3-001)。
|
|
638
|
+
*
|
|
639
|
+
* worker.terminate 本身幂等,controller.abort 本身幂等
|
|
640
|
+
* (重复 abort 无副作用),但 released flag 让本方法语义更明确:
|
|
641
|
+
* 「释放过一次的 runtime 不再释放第二次」。
|
|
642
|
+
*
|
|
643
|
+
* @param mode terminal —— 终局释放(唯一值,保留参数为调用方语义显式化)
|
|
644
|
+
*/
|
|
645
|
+
release(_mode: ReleaseMode): void;
|
|
646
|
+
/** 是否已 release(测试 + 诊断用)。 */
|
|
647
|
+
get isReleased(): boolean;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Workflow Extension — AgentCall 实体
|
|
652
|
+
*
|
|
653
|
+
* 单次 agent 调用的数据 + 不变式守卫(D-12)。纯数据,无 execute 上帝方法——
|
|
654
|
+
* 执行编排(重试+预算+stale 检测)在 execute-agent-call.ts 的 free function。
|
|
655
|
+
*
|
|
656
|
+
* - 状态机:pending → running → done(不可逆)
|
|
657
|
+
* - markRunning 进入 running 并 attempts++(每次 retry 前调用)
|
|
658
|
+
* - markDone(result) 进入 done 并记录结果
|
|
659
|
+
* - traceNode 持有引用,但 AgentCall 不直接改其字段——trace 同步由
|
|
660
|
+
* Trace.update 负责(D-10 单一来源),AgentCall 只持有引用供 executeAgentCall 读取
|
|
661
|
+
*
|
|
662
|
+
* 层归属:Engine。
|
|
663
|
+
*
|
|
664
|
+
* 参考:domain-models.md §5(字段/不变式/设计决策)。
|
|
665
|
+
*/
|
|
666
|
+
|
|
667
|
+
/** AgentCall 生命周期状态。pending→running→done,不可逆。 */
|
|
668
|
+
type AgentCallStatus = "pending" | "running" | "done";
|
|
669
|
+
/**
|
|
670
|
+
* AgentCall 实体(在 RunState.calls Map 内)。
|
|
671
|
+
*
|
|
672
|
+
* 不变式:
|
|
673
|
+
* - status 转换严格 pending→running→done,反向抛错
|
|
674
|
+
* - done 时 result 必须已设置(markDone(result) 前置保证)
|
|
675
|
+
* - attempts 反映 dispatch 次数(markRunning 累加,含首次)
|
|
676
|
+
* - **无 execute 方法**(D-12:执行编排由 Engine executeAgentCall 函数承担)
|
|
677
|
+
*/
|
|
678
|
+
declare class AgentCall {
|
|
679
|
+
readonly id: number;
|
|
680
|
+
readonly opts: AgentCallOpts;
|
|
681
|
+
status: AgentCallStatus;
|
|
682
|
+
attempts: number;
|
|
683
|
+
result?: AgentResult;
|
|
684
|
+
/** Pi subprocess session ID(uuidv7,G-017 归此)。 */
|
|
685
|
+
sessionId?: string;
|
|
686
|
+
/** Session JSONL 绝对路径(finalizeCall 后从 result.sessionFile 填入,对齐 sessionId 模式)。 */
|
|
687
|
+
sessionFile?: string;
|
|
688
|
+
/** 与 Trace 共享的节点引用(D-10 单源)。AgentCall 不直接改其字段。 */
|
|
689
|
+
readonly traceNode: ExecutionTraceNode;
|
|
690
|
+
constructor(id: number, opts: AgentCallOpts, traceNode: ExecutionTraceNode);
|
|
691
|
+
/**
|
|
692
|
+
* 标记进入 running 状态(dispatch 前)。attempts++(含首次)。
|
|
693
|
+
* @throws 若已 done(不可重启)
|
|
694
|
+
*/
|
|
695
|
+
markRunning(): void;
|
|
696
|
+
/**
|
|
697
|
+
* 标记完成(成功或失败均调用——result.error 区分)。
|
|
698
|
+
* @throws 若当前非 running(pending 不能直接跳 done,必须先 markRunning)
|
|
699
|
+
*/
|
|
700
|
+
markDone(result: AgentResult): void;
|
|
701
|
+
/** 记录 pi subprocess session ID(dispatch 成功后)。 */
|
|
702
|
+
setSessionId(sessionId: string): void;
|
|
703
|
+
/** 记录 session JSONL 绝对路径(finalizeCall 后,对齐 setSessionId 模式)。 */
|
|
704
|
+
setSessionFile(sessionFile: string): void;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Workflow Extension — Trace 值对象
|
|
709
|
+
*
|
|
710
|
+
* 执行追踪事件流(D-10 单一来源)。纯 append-only + 单字段 update。
|
|
711
|
+
*
|
|
712
|
+
* 设计:
|
|
713
|
+
* - trace 节点存储 + 变更逻辑收敛为值对象(外部不能直接打洞 nodes 数组)。
|
|
714
|
+
* - update 只改单个 node 的 status/result/error/completedAt/sessionId(TracePatch)。
|
|
715
|
+
* - callId 不存在时 update no-op(防御性,避免 race 下抛错)。
|
|
716
|
+
* - 持久化(appendEntry)与事件通知(emit)不在本值对象内——它们由 engine 函数
|
|
717
|
+
* 在调用 update 前后负责(值对象只管数据形状,不管 IO)。
|
|
718
|
+
*
|
|
719
|
+
* 层归属:Engine。
|
|
720
|
+
*
|
|
721
|
+
* 参考:domain-models.md §6(字段/不变式)。
|
|
722
|
+
*/
|
|
723
|
+
|
|
724
|
+
/**
|
|
725
|
+
* Trace 值对象(事件流,唯一来源 D-10)。
|
|
726
|
+
*
|
|
727
|
+
* 不变式:
|
|
728
|
+
* - nodes 只增不改索引顺序(append-only)
|
|
729
|
+
* - update 只改单个 node 的 status/result/error/completedAt/sessionId
|
|
730
|
+
* - byIndex 与 nodes 恒一致(每个 append/remove 同步维护,无惰性重建);
|
|
731
|
+
* Map 值与数组元素引用共享(非拷贝),nodes 仍是持久化与 TUI 投影 SSOT
|
|
732
|
+
* - 不含 verifyStrategy(G-020 删除,不迁移)
|
|
733
|
+
*/
|
|
734
|
+
declare class Trace {
|
|
735
|
+
private readonly nodes;
|
|
736
|
+
/** stepIndex 倒排索引(查询加速 O(1);值与 nodes 元素引用共享)。 */
|
|
737
|
+
private readonly byIndex;
|
|
738
|
+
/**
|
|
739
|
+
* 从已有节点数组重建 Trace(用于 RunStore 反序列化重水合)。
|
|
740
|
+
*
|
|
741
|
+
* 防御性拷贝——传入数组不被持有,外部 mutation 不影响 Trace。
|
|
742
|
+
* 不验证节点顺序/唯一性(调用方保证快照来源可信)。
|
|
743
|
+
* 不做裁剪——落盘快照已是 write 路径裁剪后形态,旧版本未裁剪长
|
|
744
|
+
* content 重水合保持原样(read 路径无二次信息损失)。
|
|
745
|
+
* 重水合后 call.traceNode(来自快照 calls[].traceNode,
|
|
746
|
+
* jsonl-run-store.ts:156 直接传入)与 Trace.nodes 副本非同引用——
|
|
747
|
+
* D-10 引用共享仅 live append 路径成立。
|
|
748
|
+
*/
|
|
749
|
+
static fromArray(nodes: readonly ExecutionTraceNode[]): Trace;
|
|
750
|
+
/**
|
|
751
|
+
* Append a trace node(append-only,不改已有节点)。
|
|
752
|
+
*
|
|
753
|
+
* 入口裁剪:超长 result.content 先 mutate 入参节点的 result 字段,
|
|
754
|
+
* 再 push 原节点引用(禁止 push 副本——保持 AgentCall.traceNode 与
|
|
755
|
+
* Trace.nodes 共享同一引用的 D-10 不变式)。
|
|
756
|
+
*/
|
|
757
|
+
append(node: ExecutionTraceNode): void;
|
|
758
|
+
/**
|
|
759
|
+
* Update a trace node by stepIndex (callId) with a partial patch.
|
|
760
|
+
*
|
|
761
|
+
* 只改 patch 中提供的字段(status/result/error/completedAt/sessionId)。
|
|
762
|
+
* stepIndex 不存在时 no-op(防御性——agent 完成/失败回调可能晚于 run 终止到达)。
|
|
763
|
+
*/
|
|
764
|
+
update(stepIndex: number, patch: TracePatch): void;
|
|
765
|
+
/**
|
|
766
|
+
* 查找指定 stepIndex 的节点(byIndex O(1),trace 中 stepIndex 应唯一)。
|
|
767
|
+
*
|
|
768
|
+
* 语义差异声明(旧线性扫 first-match → Map last-wins):仅在破坏
|
|
769
|
+
* stepIndex 唯一性的违规使用下可见,两组场景——
|
|
770
|
+
* 1. 重复 append 同 stepIndex 且未 remove:返回最后一个节点(last-wins;
|
|
771
|
+
* 旧线性扫 first-match 会返回第一个)。
|
|
772
|
+
* 2. 重复 append 后 removeByStepIndex:remove 的 findIndex 命中首个旧节点
|
|
773
|
+
* splice,而 byIndex.delete 把整个 stepIndex 键删掉——nodes 残留第二个
|
|
774
|
+
* 节点成为孤儿(find/update 不可达,length/toArray 仍可见)。
|
|
775
|
+
* 合法路径无差异:唯一性由 discard 先 remove 再 append 保证(W1TC12 锚定)。
|
|
776
|
+
*/
|
|
777
|
+
private findByStepIndex;
|
|
778
|
+
/** 按节点引用删除(仅用于测试或 run 重建场景;正常运行不调用)。 */
|
|
779
|
+
find(stepIndex: number): ExecutionTraceNode | undefined;
|
|
780
|
+
/**
|
|
781
|
+
* 按 stepIndex 移除节点(崩溃重建清理在飞 call 用)。
|
|
782
|
+
*
|
|
783
|
+
* 正常运行不调用(append-only 不变式)。仅 error-recovery 的 discardInFlightCalls
|
|
784
|
+
* (rebuildRuntime 内,F2)清理被旧 runtime abort 的在飞 call 时用——移除其 trace
|
|
785
|
+
* 节点,让重跑重发 agent-call 时 append 全新节点走全新执行路径(避免 stale
|
|
786
|
+
* "running" 节点残留 + trace.update 命中旧节点导致新节点 orphan)。
|
|
787
|
+
* stepIndex 不存在时 no-op(防御性)。
|
|
788
|
+
*/
|
|
789
|
+
removeByStepIndex(stepIndex: number): void;
|
|
790
|
+
/**
|
|
791
|
+
* readonly 视图——返回内部 nodes 数组引用(仅类型级 readonly,运行时无
|
|
792
|
+
* 防御)。消费方禁止结构化 mutate(push/splice/重排/覆盖元素):byIndex
|
|
793
|
+
* 引入后外部结构化 mutate 会使 nodes 与倒排索引 desync。字段级变更走 update()。
|
|
794
|
+
*/
|
|
795
|
+
toArray(): readonly ExecutionTraceNode[];
|
|
796
|
+
/** 当前节点数。 */
|
|
797
|
+
get length(): number;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
/**
|
|
801
|
+
* Workflow Extension — RunState 值对象
|
|
802
|
+
*
|
|
803
|
+
* 单次 workflow run 的可持久化状态(domain-models.md §3)。
|
|
804
|
+
*
|
|
805
|
+
* 设计:
|
|
806
|
+
* - status/reason/budget/calls/trace/errorLogs 是可变字段(运行中持续更新)
|
|
807
|
+
* - error/scriptResult 仅终态有值(done 时)
|
|
808
|
+
* - 与 RunSpec 的区别:RunSpec 不可变(输入),RunState 可变(执行快照)
|
|
809
|
+
*
|
|
810
|
+
* 层归属:Engine。
|
|
811
|
+
*
|
|
812
|
+
* 参考:domain-models.md §3。
|
|
813
|
+
*/
|
|
814
|
+
|
|
815
|
+
/**
|
|
816
|
+
* RunState——一次 run 的可持久化执行状态。
|
|
817
|
+
*
|
|
818
|
+
* 持久化由 RunStore.save(WorkflowRun) 触发(WorkflowRun 持 RunState)。
|
|
819
|
+
* 跨进程重启时 RunState 从 JSONL 重水合(callCache 保留,worker 由崩溃恢复重建)。
|
|
820
|
+
*/
|
|
821
|
+
interface RunState {
|
|
822
|
+
/** 当前状态(running/done)。 */
|
|
823
|
+
status: RunStatus;
|
|
824
|
+
/** 终态原因(done 时必有)。 */
|
|
825
|
+
reason?: DoneReason;
|
|
826
|
+
/** Token/cost 预算(含 usedTokens/usedCost 累积)。 */
|
|
827
|
+
budget: Budget;
|
|
828
|
+
/** 按 callId 索引的 agent 调用集合(含 result,跨 runtime 重建存活——callCache replay)。 */
|
|
829
|
+
calls: Map<number, AgentCall>;
|
|
830
|
+
/** 执行追踪事件流(唯一来源 D-10)。 */
|
|
831
|
+
trace: Trace;
|
|
832
|
+
/** Worker console.* 捕获条目(run 级诊断,仅展示在 TUI widget)。 */
|
|
833
|
+
errorLogs: WorkerLogEntry[];
|
|
834
|
+
/** done && reason !== completed 时可有(失败/中止/预算超限的原因)。 */
|
|
835
|
+
error?: string;
|
|
836
|
+
/** done && reason === completed 时有(脚本 execute 返回值)。 */
|
|
837
|
+
scriptResult?: unknown;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* Workflow Extension — WorkflowRun
|
|
842
|
+
*
|
|
843
|
+
* 单次 workflow run 的聚合根。封装状态机 + runtime 生命周期 + 不变式守卫。
|
|
844
|
+
* 架构核心——所有字段变更通过方法(transition/assignRuntime/releaseRuntime/
|
|
845
|
+
* replaceRuntime),engine 模块不直接打洞(AC-3)。
|
|
846
|
+
*
|
|
847
|
+
* 层归属:Engine。依赖 RunRuntime(具体类,D-12 允许)+ RunSpec/RunState + 类型。
|
|
848
|
+
*
|
|
849
|
+
* 关键不变式(必须全测):
|
|
850
|
+
* I1: state.status === "running" ⟺ runtime !== undefined
|
|
851
|
+
* I2: state.status === "done" ⟹ state.reason !== undefined
|
|
852
|
+
*
|
|
853
|
+
* 状态机(一次性生命周期,2 态):
|
|
854
|
+
* 构造(status="running",I1 构造期跳过——runtime 由 assignRuntime 注入)
|
|
855
|
+
* running ──transition("done", reason)──→ done (releaseRuntime + completedAt)
|
|
856
|
+
* done ──(no out edges, zombie)
|
|
857
|
+
*
|
|
858
|
+
* 「创建即 running」与 I1 的协调(F4):构造瞬间 running 而 runtime 尚未注入,
|
|
859
|
+
* I1 在构造期跳过(仅查 I2),完整校验由 assignRuntime/transition/replaceRuntime
|
|
860
|
+
* 末尾的 validateInvariants 维持;构造到 assignRuntime 的 I1 窗口由调用方
|
|
861
|
+
* (lifecycle.runWorkflow 在 assignRuntime 之后才 runs.set)保证对外不可见。
|
|
862
|
+
*
|
|
863
|
+
* worker-error-retry(G5-001 + G6-001):
|
|
864
|
+
* - replaceRuntime(newRt): 前置 status==="running"(G6-001),原子释放前一个 runtime
|
|
865
|
+
* + 绑定新 runtime,全程保持不变式 I1(中间不经过 runtime===undefined 的可见状态)。
|
|
866
|
+
*
|
|
867
|
+
* 参考:domain-models.md §1(聚合根定义)、clarification.md G3-001/G5-001/G6-001。
|
|
868
|
+
*/
|
|
869
|
+
|
|
870
|
+
/**
|
|
871
|
+
* 聚合根级 meta(非 RunState 的一部分,不随 trace 持久化到 worker JSONL)。
|
|
872
|
+
*
|
|
873
|
+
* workerErrorCount/scriptErrorCount 跨 runtime 存活(C.5:error-recovery 重试计数载体),
|
|
874
|
+
* 因为 retry 会 replaceRuntime,但计数是 run 级而非 runtime 级。
|
|
875
|
+
*/
|
|
876
|
+
interface WorkflowRunMeta {
|
|
877
|
+
/** ISO 时间戳,run 创建/启动时刻。 */
|
|
878
|
+
startedAt: string;
|
|
879
|
+
/** ISO 时间戳,transition("done") 时设置。 */
|
|
880
|
+
completedAt?: string;
|
|
881
|
+
/** Worker 线程错误计数(C.5:跨 runtime 存活,重试计数载体)。 */
|
|
882
|
+
workerErrorCount?: number;
|
|
883
|
+
/** 脚本错误计数(C.5:跨 runtime 存活)。 */
|
|
884
|
+
scriptErrorCount?: number;
|
|
885
|
+
}
|
|
886
|
+
declare class WorkflowRun {
|
|
887
|
+
readonly runId: string;
|
|
888
|
+
readonly spec: RunSpec;
|
|
889
|
+
state: RunState;
|
|
890
|
+
runtime?: RunRuntime;
|
|
891
|
+
meta: WorkflowRunMeta;
|
|
892
|
+
/**
|
|
893
|
+
* 创建聚合根。初始状态 "running"(一次性生命周期:run 从创建起即在执行,
|
|
894
|
+
* runtime 由紧随其后的 assignRuntime 注入)。也可传入 done 状态用于重水合
|
|
895
|
+
* 已完成的 run(loadAll 后的只读聚合)。
|
|
896
|
+
*
|
|
897
|
+
* 不变式 I1 构造期跳过——「创建即 running」要求构造瞬间 runtime===undefined
|
|
898
|
+
* 合法(runtime 必须由 assignRuntime 注入,构造函数无从持有);重水合的
|
|
899
|
+
* running 快照同样无 worker。I1 的运行时校验在 assignRuntime/transition/
|
|
900
|
+
* replaceRuntime 末尾的 validateInvariants 处生效。
|
|
901
|
+
*/
|
|
902
|
+
constructor(runId: string, spec: RunSpec, state: RunState, meta: WorkflowRunMeta);
|
|
903
|
+
/**
|
|
904
|
+
* 从持久化快照重水合聚合根。与构造函数同语义(构造期跳过 I1——持久化的
|
|
905
|
+
* running 状态没有 worker,进程被杀后 worker 不可能还活着)。保留独立工厂
|
|
906
|
+
* 标注重水合意图;调用方(D-4 kill-9 恢复)负责在 session_start 时把残留
|
|
907
|
+
* running 转 done,failed,恢复 I1。
|
|
908
|
+
*
|
|
909
|
+
* @throws I2 违反(done 快照缺 reason 仍是 bug,不可跳过)
|
|
910
|
+
*/
|
|
911
|
+
static reconstruct(runId: string, spec: RunSpec, state: RunState, meta: WorkflowRunMeta): WorkflowRun;
|
|
912
|
+
/**
|
|
913
|
+
* 校验不变式 I1 + I2。违反抛错(聚合根自我保护,fail-fast)。
|
|
914
|
+
* 在每个 mutation 方法末尾调用(防御式编程 + 测试可断言)。
|
|
915
|
+
*/
|
|
916
|
+
private validateInvariants;
|
|
917
|
+
/**
|
|
918
|
+
* 仅校验不变式 I2(done ⟹ reason)。构造期用——「创建即 running」与重水合的
|
|
919
|
+
* running 快照都无 runtime(I1 构造期跳过),但 I2 必须保证(done 缺 reason 是真 bug)。
|
|
920
|
+
*/
|
|
921
|
+
private validateInvariantI2;
|
|
922
|
+
/**
|
|
923
|
+
* 状态机转换。合法转换:running→done。
|
|
924
|
+
*
|
|
925
|
+
* running 的进入不走 transition——构造即 running,replaceRuntime 保持 running。
|
|
926
|
+
* 调用 transition("running") 抛错,防止绕过 runtime 注入直接改状态。
|
|
927
|
+
*
|
|
928
|
+
* 副作用:
|
|
929
|
+
* - →done: releaseRuntime + 设 state.reason + meta.completedAt
|
|
930
|
+
*
|
|
931
|
+
* @param target 目标状态(不允许 "running"——runtime 注入只走 assignRuntime/replaceRuntime)
|
|
932
|
+
* @param reason →done 时必填(done ⟹ reason,不变式 I2)
|
|
933
|
+
* @throws 非法转换 / done 缺 reason / target==="running"
|
|
934
|
+
*/
|
|
935
|
+
transition(target: RunStatus, reason?: DoneReason): void;
|
|
936
|
+
/**
|
|
937
|
+
* 绑定 runtime(run 创建后注入执行资源)。
|
|
938
|
+
*
|
|
939
|
+
* 前置:status==="running" && runtime===undefined(runWorkflow 创建路径——
|
|
940
|
+
* 构造即 running 但 runtime 延迟到此处注入)。
|
|
941
|
+
* 原子地:设 runtime 后末尾 validateInvariants,恢复构造期跳过的 I1
|
|
942
|
+
* (running ⟺ runtime!==undefined)。
|
|
943
|
+
*
|
|
944
|
+
* @throws runtime 已定义 / status 不是 "running"(done 僵尸不可复活)
|
|
945
|
+
*/
|
|
946
|
+
assignRuntime(rt: RunRuntime): void;
|
|
947
|
+
/**
|
|
948
|
+
* 解绑 runtime(done 时由 transition 调用,也可独立调用)。
|
|
949
|
+
*
|
|
950
|
+
* 前置:无(runtime===undefined 时 no-op,幂等)。
|
|
951
|
+
* 副作用:调 runtime.release("terminal") 释放 worker/controller,置 runtime=undefined。
|
|
952
|
+
*/
|
|
953
|
+
releaseRuntime(): void;
|
|
954
|
+
/**
|
|
955
|
+
* 原地替换 runtime(G5-001:worker-error-retry)。
|
|
956
|
+
*
|
|
957
|
+
* 前置:status==="running"(G6-001:终态 run 拒绝重建)。
|
|
958
|
+
* 原子地:释放旧 runtime(worker.terminate + abort)+ 绑定新 runtime,
|
|
959
|
+
* 全程 status 保持 "running",不变式 I1 不违反(中间无 runtime===undefined 可见态)。
|
|
960
|
+
*
|
|
961
|
+
* 与 release+assign 的区别:replaceRuntime 不改 status,中间同步完成,
|
|
962
|
+
* 外部观察不到违反不变式的瞬间。
|
|
963
|
+
*
|
|
964
|
+
* @throws status!=="running"
|
|
965
|
+
*/
|
|
966
|
+
replaceRuntime(rt: RunRuntime): void;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
/**
|
|
970
|
+
* Workflow Extension — Engine Ports + 编排层共享类型
|
|
971
|
+
*
|
|
972
|
+
* 3 个注入 Port(AgentRunner / RunStore / WorkerHost)——Engine 定义、Infra 实现,
|
|
973
|
+
* 是真需要 mock 测试的依赖(子进程/文件系统/线程)。
|
|
974
|
+
*
|
|
975
|
+
* 编排层共享类型(WorkerHandlers / LifecycleDeps)——打破 lifecycle ↔
|
|
976
|
+
* error-recovery 循环依赖:2 个 engine 函数文件各自独立,共用同一组
|
|
977
|
+
* 依赖签名(D-12)。
|
|
978
|
+
*
|
|
979
|
+
* 层归属:Engine。零 infra 依赖(AC-1)。
|
|
980
|
+
*/
|
|
981
|
+
|
|
982
|
+
/**
|
|
983
|
+
* Agent 子进程执行 port。Infra 实现:SubprocessAgentRunner。
|
|
984
|
+
*
|
|
985
|
+
* run 执行单次 agent 调用(委托 SubagentService.executeAndAwait),返回结构化结果。
|
|
986
|
+
* signal 用于 abort 传播。
|
|
987
|
+
*
|
|
988
|
+
* onEvent(可选):强类型 AgentEvent 回调,供调用方实时更新 live record 供 TUI 展示进度。
|
|
989
|
+
* 不传则不回调(向后兼容;现有调用点不传不受影响)。
|
|
990
|
+
*
|
|
991
|
+
* D-005: onEvent 签名从 raw Record<string,unknown> 升级为 AgentEvent——委托后不再有
|
|
992
|
+
* raw JSONL 中间层(executeAndAwait 直接出 AgentEvent,session-runner handleSdkEvent 出口)。
|
|
993
|
+
*/
|
|
994
|
+
interface AgentRunner {
|
|
995
|
+
run(opts: AgentCallOpts, signal: AbortSignal, onEvent?: (event: AgentEvent) => void, stream?: SubagentStream): Promise<AgentResult>;
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
998
|
+
* WorkflowRun 持久化 port。Infra 实现:JsonlRunStore。
|
|
999
|
+
*
|
|
1000
|
+
* save 在每次状态变更后持久化整个 WorkflowRun(聚合根);
|
|
1001
|
+
* loadAll 在 session_start 时重水合(D-5:JSONL 不向后兼容旧 session,旧格式返回空)。
|
|
1002
|
+
* stateFilePath 返回 run 状态文件的绝对路径(供 overlay/GUI 暴露给用户)。
|
|
1003
|
+
*/
|
|
1004
|
+
interface RunStore {
|
|
1005
|
+
save(run: WorkflowRun): Promise<void>;
|
|
1006
|
+
loadAll(): Promise<WorkflowRun[]>;
|
|
1007
|
+
/** 返回 run 状态快照文件的绝对路径:<sessionDir>/workflow-state/<runId>.jsonl */
|
|
1008
|
+
stateFilePath(runId: string): string;
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Worker 线程启动 port。Infra 实现:WorkerHostImpl。
|
|
1012
|
+
*
|
|
1013
|
+
* start 创建一个 Worker thread 运行 workflow 脚本,返回 WorkerHandle。
|
|
1014
|
+
* handlers 绑定 message/error/exit 回调(见 WorkerHandlers)。
|
|
1015
|
+
*/
|
|
1016
|
+
interface WorkerHost {
|
|
1017
|
+
start(spec: RunSpec, args: Record<string, unknown>, handlers: WorkerHandlers): WorkerHandle;
|
|
1018
|
+
}
|
|
1019
|
+
/**
|
|
1020
|
+
* Worker 线程事件回调集合——WorkerHost.start 的入参,由 lifecycle
|
|
1021
|
+
* 构造并注入。2 个 engine 文件(lifecycle / error-recovery)共用此签名,
|
|
1022
|
+
* 避免各自定义形状不一致的 handler bag(打破循环依赖)。
|
|
1023
|
+
*
|
|
1024
|
+
* 所有回调返回 Promise——允许 engine 层在回调内做 await persistState 等异步操作。
|
|
1025
|
+
*/
|
|
1026
|
+
interface WorkerHandlers {
|
|
1027
|
+
/** Worker → Main 的业务消息(agent-call / return / error / log)。 */
|
|
1028
|
+
onMessage(raw: unknown): Promise<void>;
|
|
1029
|
+
/** Worker 线程 uncaught error。 */
|
|
1030
|
+
onError(err: Error): Promise<void>;
|
|
1031
|
+
/** Worker 线程 exit(含 code,用于区分正常退出 vs 崩溃)。handle 用于竞态防护 G-025。 */
|
|
1032
|
+
onExit(code: number, handle: WorkerHandle): Promise<void>;
|
|
1033
|
+
}
|
|
1034
|
+
/**
|
|
1035
|
+
* lifecycle / error-recovery 2 个 engine 函数文件的共同依赖 bag。
|
|
1036
|
+
*
|
|
1037
|
+
* 取代旧 4 个 Context factory(errorHandlerContext / agentCallContext /
|
|
1038
|
+
* budgetCallbacks / 旧 terminate bag,AC-2 目标)。函数签名 `(deps: LifecycleDeps, ...)`
|
|
1039
|
+
* 让每个 free function 自包含依赖,无需 God Facade 中介。
|
|
1040
|
+
*
|
|
1041
|
+
* - store: 持久化(RunStore port)
|
|
1042
|
+
* - workerHost: 启动 worker(WorkerHost port)
|
|
1043
|
+
* - runner: 执行 agent(AgentRunner port)
|
|
1044
|
+
* - runs: 内存中的活动 run 聚合根索引(runId → WorkflowRun),替代旧 6 张并行 map
|
|
1045
|
+
* - onRunDone?: run 到达 done 终态时的回调(C-4 修复,可选)。由 Interface 层
|
|
1046
|
+
* factory 注入(notifyDone —— 唤醒 parent agent 消费结果)。Engine 层不依赖
|
|
1047
|
+
* Pi SDK,通过 callback 把完成信号外推到 Interface 层。所有 transition("done", ...)
|
|
1048
|
+
* 路径(handleReturn / handleWorkerError / handleScriptError / abortRun /
|
|
1049
|
+
* dispatchAgentCall budget 终止)调完 transition + save 后触发本回调。
|
|
1050
|
+
*/
|
|
1051
|
+
interface LifecycleDeps {
|
|
1052
|
+
store: RunStore;
|
|
1053
|
+
workerHost: WorkerHost;
|
|
1054
|
+
runner: AgentRunner;
|
|
1055
|
+
runs: Map<string, WorkflowRun>;
|
|
1056
|
+
/** run 到达 done 终态时的回调(C-4 修复,可选)。Interface 层注入 notifyDone。 */
|
|
1057
|
+
onRunDone?: (run: WorkflowRun) => void;
|
|
1058
|
+
/**
|
|
1059
|
+
* 跨扩展事件总线(pending-notifications register/unregister 信号灯)。
|
|
1060
|
+
*
|
|
1061
|
+
* runWorkflow 启动时 emit pending:register;所有 transition("done") 路径 emit
|
|
1062
|
+
* pending:unregister。两处均通过本端口(Engine 不直接依赖 Pi SDK)。可选——
|
|
1063
|
+
* 无 pending-notifications 扩展时 no-op(向后兼容)。
|
|
1064
|
+
*/
|
|
1065
|
+
eventBus?: {
|
|
1066
|
+
emit(channel: string, data: unknown): void;
|
|
1067
|
+
};
|
|
1068
|
+
/**
|
|
1069
|
+
* 调试日志端口(Engine 不直接依赖 Pi SDK)。Interface 层注入实现。
|
|
1070
|
+
* 关键路径记录 run 启动、保存、pending 注册/注销,便于排查异步操作状态。
|
|
1071
|
+
*/
|
|
1072
|
+
log?: (level: "debug" | "info" | "warn" | "error", component: string, message: string, data?: unknown) => void;
|
|
1073
|
+
/**
|
|
1074
|
+
* D-12 regression fix (round-2 #2):rebuildRuntime 重新调度 run 级墙钟预算计时器。
|
|
1075
|
+
*
|
|
1076
|
+
* worker/script 错误重试走 replaceRuntime,旧 RunRuntime 的 release 会 clearTimeout
|
|
1077
|
+
* 旧计时器(run-runtime.release)。新 runtime 必须重排 scheduleTimeBudget,否则带
|
|
1078
|
+
* budgetTimeMs 的 run 命中一次错误重试后时间预算静默失效(直到下次 pause/resume 才重排)。
|
|
1079
|
+
* 由 Interface 层 factory 注入——闭包捕获 deps,内部调 lifecycle.scheduleTimeBudget。
|
|
1080
|
+
*
|
|
1081
|
+
* 可选——旧测试 deps 不注入时 rebuildRuntime 不重排计时器(兼容,不影响无时间预算的 run)。
|
|
1082
|
+
*/
|
|
1083
|
+
scheduleTimeBudget?: (runId: string, budgetTimeMs: number) => ReturnType<typeof setTimeout> | undefined;
|
|
1084
|
+
/**
|
|
1085
|
+
* workflow() 嵌套调用回调(可选)。Worker 脚本内调 workflow(name, args) 时触发。
|
|
1086
|
+
*
|
|
1087
|
+
* 由 Interface 层 makeDeps 注入(闭包捕获 registry + deps)。Engine 层的
|
|
1088
|
+
* error-recovery.handleWorkerMessage 收到 workflow-call 消息后调本回调,
|
|
1089
|
+
* 拿到子 workflow 执行结果后 postMessage(workflow-result) 回 worker。
|
|
1090
|
+
*
|
|
1091
|
+
* 不注入时 workflow() 返回 error result(向后兼容,不影响非嵌套场景)。
|
|
1092
|
+
*/
|
|
1093
|
+
onWorkflowCall?: (name: string, args: Record<string, unknown>, parentRun: WorkflowRun) => Promise<unknown>;
|
|
1094
|
+
/**
|
|
1095
|
+
* UI streaming sink(ctx.ui.setWidget),workflow agent call 创建 SubagentStream 用。
|
|
1096
|
+
*
|
|
1097
|
+
* 由 Interface 层 makeDeps 注入(从 SubagentService.getStreamSink() 取)。
|
|
1098
|
+
* dispatchAgentCall 用它创建 SubagentStream(widgetKey=subagent-stream-<runId>-<stepIndex>),
|
|
1099
|
+
* 使 workflow agent call 的 text_delta 走与 background subagent 相同的 streaming 链路。
|
|
1100
|
+
* 可选——无 UI 模式(TUI/RPC 无 setWidget)时为 undefined,dispatchAgentCall 不创建 stream。
|
|
1101
|
+
*/
|
|
1102
|
+
streamSink?: StreamSink;
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
/**
|
|
1106
|
+
* Workflow Extension — lifecycle
|
|
1107
|
+
*
|
|
1108
|
+
* Workflow run 生命周期 free functions(D-12)。
|
|
1109
|
+
*
|
|
1110
|
+
* 5 个导出函数:
|
|
1111
|
+
* - runWorkflow(spec, deps, signal?) → Promise<runId>
|
|
1112
|
+
* - abortRun(runId, deps, reason?, doneReason?) → Promise<void>(done no-op)
|
|
1113
|
+
* - terminateRunningRuns(deps, reason) → Promise<void>(session 切换/关闭终止)
|
|
1114
|
+
* - evictDoneRunsBeyondCap(runs, keepDone) → number(done run 内存淘汰)
|
|
1115
|
+
* - scheduleTimeBudget(runId, deps, budgetTimeMs) → timer(C.7 时间预算)
|
|
1116
|
+
*
|
|
1117
|
+
* 私有 makeHandlers(run, deps) → WorkerHandlers:
|
|
1118
|
+
* - onMessage → handleWorkerMessage(run, raw, deps, handlers)
|
|
1119
|
+
* - onError → handleWorkerError(run, err, deps, handlers) + workerErrorCount++
|
|
1120
|
+
* - onExit(code, handle) → handleWorkerExit(run, code, handle, deps, handlers)
|
|
1121
|
+
* (G-025:handle.isCurrent 检查内化在 handleWorkerExit 内)
|
|
1122
|
+
*
|
|
1123
|
+
* **A4 原子性**:abort/terminate 内部 transition 先 releaseRuntime(cleanup before
|
|
1124
|
+
* mutate),失败时 status 不变。transition("done") 在 WorkflowRun.transition 内已实现
|
|
1125
|
+
* 「releaseRuntime → 改 status」原子顺序。
|
|
1126
|
+
*
|
|
1127
|
+
* **G3-001**(run 一次性生命周期):AbortController 一次性无法复用,runtime 释放后
|
|
1128
|
+
* 只有两类重建——rebuildRuntime(error-recovery,崩溃重试路径,run 保持 running、
|
|
1129
|
+
* replaceRuntime 原子换新)与 abort/terminate 的终态释放(transition("done") 内
|
|
1130
|
+
* releaseRuntime,run 不再恢复)。
|
|
1131
|
+
* (旧并发门闩 gate 抽象已删——no-op 无生产语义,实际并发由 SubagentService
|
|
1132
|
+
* ConcurrencyPool 管理;原 D-13 maxConcurrency=4 无消费方。)
|
|
1133
|
+
*
|
|
1134
|
+
* 层归属:Engine。依赖 LifecycleDeps + WorkerHost via port +
|
|
1135
|
+
* WorkflowRun + handleWorker* 函数。
|
|
1136
|
+
*
|
|
1137
|
+
* 参考:domain-models.md §1(聚合根状态机)。
|
|
1138
|
+
*/
|
|
1139
|
+
|
|
1140
|
+
/**
|
|
1141
|
+
* 启动一个 workflow run。
|
|
1142
|
+
*
|
|
1143
|
+
* 流程:创建 WorkflowRun(running,I1 构造期跳过)+ makeHandlers + 构建 RunRuntime
|
|
1144
|
+
* (worker+gate+controller)+ assignRuntime(注入 runtime,恢复 I1)+ 注册到
|
|
1145
|
+
* deps.runs + store.save。
|
|
1146
|
+
*
|
|
1147
|
+
* @param spec RunSpec(scriptSource 只读;args 会被原地注入 _runId——rfl C2 契约,
|
|
1148
|
+
* worker 启动与崩溃重建共用同一 args 对象)
|
|
1149
|
+
* @param deps LifecycleDeps(store/workerHost/runner/runs)
|
|
1150
|
+
* @param signal 外部 abort signal(可选;abort 时调 abortRun)
|
|
1151
|
+
* @returns runId(wf-<timestamp>-<random>)
|
|
1152
|
+
* @throws signal 已 abort(pre-abort fail fast)
|
|
1153
|
+
*/
|
|
1154
|
+
declare function runWorkflow(spec: RunSpec, deps: LifecycleDeps, signal?: AbortSignal): Promise<string>;
|
|
1155
|
+
/**
|
|
1156
|
+
* 中止 workflow(running)。
|
|
1157
|
+
*
|
|
1158
|
+
* **done 状态 no-op**:已终态的 run 不重复 abort。
|
|
1159
|
+
* **A4 原子性**:transition("done", doneReason) 内部先 releaseRuntime。
|
|
1160
|
+
*
|
|
1161
|
+
* @param runId
|
|
1162
|
+
* @param deps
|
|
1163
|
+
* @param reason 可选中止原因(存 run.state.error)
|
|
1164
|
+
* @param doneReason 终态原因(默认 "aborted";超时场景传 "time_limited",C.7)
|
|
1165
|
+
* @throws runId 不存在
|
|
1166
|
+
*/
|
|
1167
|
+
declare function abortRun(runId: string, deps: LifecycleDeps, reason?: string, doneReason?: DoneReason): Promise<void>;
|
|
1168
|
+
|
|
1169
|
+
/**
|
|
1170
|
+
* @zhushanwen/subagent-core — 公共 API barrel(D5 定稿)
|
|
1171
|
+
*
|
|
1172
|
+
* 公共 API 面 = 本文件导出 + package.json exports 的语义子入口
|
|
1173
|
+
* (./engines/zcode/reader、./engines/zcode/constants、./engine/paths、./relay-env)
|
|
1174
|
+
* + ./workflows/* 资产子入口。exports 面即 semver 契约(D5):收窄不放宽——
|
|
1175
|
+
* 新增导出走 minor,本文件刻意不使用 `export *`,逐名列出以使 diff 可审。
|
|
1176
|
+
* 内部实现细节(registry / error-recovery / execution 编排件等)不经 barrel 导出,
|
|
1177
|
+
* 仓内壳侧深路径消费(`./*` -> src 通配)不受本文件约束。
|
|
1178
|
+
*
|
|
1179
|
+
* 设计权威源:docs/design/subagent-core-package-extraction.md §3.3 D5;
|
|
1180
|
+
* 宿主接入示例见包 README(§3.4 core_host_not_configured 恢复指引的落点)。
|
|
1181
|
+
*/
|
|
1182
|
+
declare const CORE_PACKAGE_VERSION = "0.2.0";
|
|
1183
|
+
|
|
1184
|
+
export { AgentEvent, AgentOutcome, AgentTaskSpec, CORE_PACKAGE_VERSION, type CoreLogger, DEFAULT_DATA_ROOT, type DiscoveryRoot, EngineCapabilities, EngineHandle, type EnginePort, type EngineRouteOptions, type EngineRouteResult, type EngineRouting, type EngineRoutingInput, type EngineRoutingSource, type EngineRunResult, type HostServices, InteractAction, InteractResult, type LifecycleDeps, type LogLevel, type ModelInfo, type NotifyDomainPorts, ProbeReport, type RunContext, type RunSpec, SessionView, SubagentStream, abortRun, configureCore, configureNotifyDomain, getLogger, routeEngine, runWorkflow };
|