@caupulican/pi-adaptative 0.85.4 → 0.85.8
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/CHANGELOG.md +31 -0
- package/dist/bun/cli.d.ts +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +6 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +7 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -2
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +2 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.js +2 -2
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/billing-failover-controller.d.ts +2 -2
- package/dist/core/billing-failover-controller.d.ts.map +1 -1
- package/dist/core/billing-failover-controller.js +1 -1
- package/dist/core/billing-failover-controller.js.map +1 -1
- package/dist/core/compaction-controller.d.ts +8 -2
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +73 -3
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/compaction-support.d.ts +2 -2
- package/dist/core/compaction-support.d.ts.map +1 -1
- package/dist/core/compaction-support.js +9 -1
- package/dist/core/compaction-support.js.map +1 -1
- package/dist/core/context/artifact-retrieval.d.ts +1 -1
- package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
- package/dist/core/context/artifact-retrieval.js +1 -1
- package/dist/core/context/artifact-retrieval.js.map +1 -1
- package/dist/core/context/context-artifacts.d.ts +6 -6
- package/dist/core/context/context-artifacts.d.ts.map +1 -1
- package/dist/core/context/context-artifacts.js +151 -63
- package/dist/core/context/context-artifacts.js.map +1 -1
- package/dist/core/context/context-composition.js +1 -1
- package/dist/core/context/context-composition.js.map +1 -1
- package/dist/core/context/context-store-retention.d.ts.map +1 -1
- package/dist/core/context/context-store-retention.js +5 -2
- package/dist/core/context/context-store-retention.js.map +1 -1
- package/dist/core/context/file-store-memory-provider.js +1 -1
- package/dist/core/context/file-store-memory-provider.js.map +1 -1
- package/dist/core/context/tool-output-packer.d.ts +1 -1
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js +1 -1
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +7 -5
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/context-pipeline.d.ts +2 -2
- package/dist/core/context-pipeline.d.ts.map +1 -1
- package/dist/core/context-pipeline.js +8 -4
- package/dist/core/context-pipeline.js.map +1 -1
- package/dist/core/cost/cost-summary.d.ts +1 -1
- package/dist/core/cost/cost-summary.d.ts.map +1 -1
- package/dist/core/cost/cost-summary.js +1 -1
- package/dist/core/cost/cost-summary.js.map +1 -1
- package/dist/core/cost/daily-usage.d.ts +1 -1
- package/dist/core/cost/daily-usage.d.ts.map +1 -1
- package/dist/core/cost/daily-usage.js +2 -2
- package/dist/core/cost/daily-usage.js.map +1 -1
- package/dist/core/cost/session-usage.d.ts +1 -1
- package/dist/core/cost/session-usage.d.ts.map +1 -1
- package/dist/core/cost/session-usage.js +1 -1
- package/dist/core/cost/session-usage.js.map +1 -1
- package/dist/core/delegation/worker-actions.js +1 -1
- package/dist/core/delegation/worker-actions.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +3 -2
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-conversation-store.d.ts +2 -1
- package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
- package/dist/core/delegation/worker-conversation-store.js +3 -2
- package/dist/core/delegation/worker-conversation-store.js.map +1 -1
- package/dist/core/extensions/builtin.d.ts +2 -2
- package/dist/core/extensions/builtin.d.ts.map +1 -1
- package/dist/core/extensions/builtin.js +2 -2
- package/dist/core/extensions/builtin.js.map +1 -1
- package/dist/core/extensions/bundled-virtual-modules.d.ts +2 -0
- package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/bundled-virtual-modules.js +129 -0
- package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
- package/dist/core/extensions/factory-runtime.d.ts +22 -0
- package/dist/core/extensions/factory-runtime.d.ts.map +1 -0
- package/dist/core/extensions/factory-runtime.js +334 -0
- package/dist/core/extensions/factory-runtime.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/lifecycle.d.ts +13 -0
- package/dist/core/extensions/lifecycle.d.ts.map +1 -0
- package/dist/core/extensions/lifecycle.js +52 -0
- package/dist/core/extensions/lifecycle.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +3 -24
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -531
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts +51 -0
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/virtual-modules.js +59 -0
- package/dist/core/extensions/virtual-modules.js.map +1 -0
- package/dist/core/foreground-recovery-controller.d.ts +2 -1
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
- package/dist/core/foreground-recovery-controller.js +3 -3
- package/dist/core/foreground-recovery-controller.js.map +1 -1
- package/dist/core/goal-loop-controller.js +1 -1
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts +1 -1
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
- package/dist/core/goals/compact-goal-context.js +1 -1
- package/dist/core/goals/compact-goal-context.js.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +1 -1
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +1 -1
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +1 -1
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/providers/user-memory-archive.js +1 -1
- package/dist/core/memory/providers/user-memory-archive.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-router-controller.js +1 -1
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-selection-controller.js +1 -1
- package/dist/core/model-selection-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts +1 -1
- package/dist/core/model-tool-protocol.d.ts.map +1 -1
- package/dist/core/model-tool-protocol.js +1 -1
- package/dist/core/model-tool-protocol.js.map +1 -1
- package/dist/core/models/llamacpp-runtime.d.ts +7 -0
- package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
- package/dist/core/models/llamacpp-runtime.js +8 -3
- package/dist/core/models/llamacpp-runtime.js.map +1 -1
- package/dist/core/models/local-runtime.js +1 -1
- package/dist/core/models/local-runtime.js.map +1 -1
- package/dist/core/orchestration/model-binding.d.ts +1 -1
- package/dist/core/orchestration/model-binding.d.ts.map +1 -1
- package/dist/core/orchestration/model-binding.js +1 -1
- package/dist/core/orchestration/model-binding.js.map +1 -1
- package/dist/core/orchestration/task-profile-writer.js +1 -1
- package/dist/core/orchestration/task-profile-writer.js.map +1 -1
- package/dist/core/process-matrix/runtime.d.ts +15 -1
- package/dist/core/process-matrix/runtime.d.ts.map +1 -1
- package/dist/core/process-matrix/runtime.js +55 -34
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +4 -3
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +2 -2
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/research/model-fitness-controller.js +1 -1
- package/dist/core/research/model-fitness-controller.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts +2 -2
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +1 -1
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +10 -19
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +8 -70
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +13 -3
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/scout-controller.d.ts +1 -1
- package/dist/core/scout-controller.d.ts.map +1 -1
- package/dist/core/scout-controller.js +1 -1
- package/dist/core/scout-controller.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/security/context-threat-scanner.d.ts +14 -0
- package/dist/core/security/context-threat-scanner.d.ts.map +1 -0
- package/dist/core/security/context-threat-scanner.js +71 -0
- package/dist/core/security/context-threat-scanner.js.map +1 -0
- package/dist/core/session-supervision-runtime.d.ts +4 -1
- package/dist/core/session-supervision-runtime.d.ts.map +1 -1
- package/dist/core/session-supervision-runtime.js +49 -11
- package/dist/core/session-supervision-runtime.js.map +1 -1
- package/dist/core/settings-manager.js +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tool-recovery-logger.js +1 -1
- package/dist/core/tool-recovery-logger.js.map +1 -1
- package/dist/core/tools/artifact-retrieve.js +1 -1
- package/dist/core/tools/artifact-retrieve.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -4
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/extensionify-runtime.d.ts +44 -0
- package/dist/core/tools/extensionify-runtime.d.ts.map +1 -0
- package/dist/core/tools/extensionify-runtime.js +115 -0
- package/dist/core/tools/extensionify-runtime.js.map +1 -0
- package/dist/core/tools/extensionify.d.ts +9 -30
- package/dist/core/tools/extensionify.d.ts.map +1 -1
- package/dist/core/tools/extensionify.js +10 -140
- package/dist/core/tools/extensionify.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/index.d.ts +2 -4
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +7 -43
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/search-command-guard.d.ts +8 -0
- package/dist/core/tools/search-command-guard.d.ts.map +1 -1
- package/dist/core/tools/search-command-guard.js +54 -0
- package/dist/core/tools/search-command-guard.js.map +1 -1
- package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
- package/dist/core/tools/shell-contract-router.js +9 -4
- package/dist/core/tools/shell-contract-router.js.map +1 -1
- package/dist/core/tools/shell-session.d.ts.map +1 -1
- package/dist/core/tools/shell-session.js +6 -4
- package/dist/core/tools/shell-session.js.map +1 -1
- package/dist/core/tools/tool-definition-factory.d.ts +32 -0
- package/dist/core/tools/tool-definition-factory.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-factory.js +55 -0
- package/dist/core/tools/tool-definition-factory.js.map +1 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +79 -32
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +24 -18
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +1 -1
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.js +1 -1
- package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/child-process.js +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +7 -5
|
@@ -25,7 +25,19 @@
|
|
|
25
25
|
import type { AgentIdentityContract } from "../orchestration/contracts.ts";
|
|
26
26
|
import type { ResolvedProcessMatrixSettings } from "../settings-manager.ts";
|
|
27
27
|
import type { ResumablePayload } from "./codes.ts";
|
|
28
|
+
import { listEntries, readEntry, removeEntryIfUnchanged, writeEntry, writeEntryIfUnchanged, writeEntryIfUnchangedSync } from "./store.ts";
|
|
28
29
|
export { getOrchestrationAgentId, getParentPid, getParentSessionId, getProcessTaskRef, PI_ORCHESTRATION_AGENT_ID_ENV, PI_PARENT_PID_ENV, PI_PARENT_SESSION_ENV, PI_TASK_REF_ENV, } from "../process-identity.ts";
|
|
30
|
+
/** Storage boundary for the process-matrix coordinator. Runtime state transitions depend on this
|
|
31
|
+
* port, while the filesystem adapter remains the single production implementation. */
|
|
32
|
+
export interface ProcessMatrixStorePort {
|
|
33
|
+
listEntries: typeof listEntries;
|
|
34
|
+
readEntry: typeof readEntry;
|
|
35
|
+
removeEntryIfUnchanged: typeof removeEntryIfUnchanged;
|
|
36
|
+
writeEntry: typeof writeEntry;
|
|
37
|
+
writeEntryIfUnchanged: typeof writeEntryIfUnchanged;
|
|
38
|
+
writeEntryIfUnchangedSync: typeof writeEntryIfUnchangedSync;
|
|
39
|
+
}
|
|
40
|
+
export declare const localProcessMatrixStore: ProcessMatrixStorePort;
|
|
29
41
|
export interface ProcessMatrixRuntimeConfig {
|
|
30
42
|
agentDir: string;
|
|
31
43
|
/** Canonical logical identity for this process and any exact-session resume. */
|
|
@@ -43,7 +55,7 @@ export interface ProcessMatrixRuntimeConfig {
|
|
|
43
55
|
promptConfirm: (message: string) => Promise<boolean>;
|
|
44
56
|
/** Cooperative self-exit -- called by a worker once wound down (grace expiry or a
|
|
45
57
|
* master-granted cleanup directive). Never called for the master's own lifecycle. */
|
|
46
|
-
requestExit: () => void
|
|
58
|
+
requestExit: () => Promise<void>;
|
|
47
59
|
/** Stable goal/task identity. Automatic recovery requires an exact match. */
|
|
48
60
|
taskRef?: string;
|
|
49
61
|
taskSummary?: string;
|
|
@@ -52,6 +64,8 @@ export interface ProcessMatrixRuntimeConfig {
|
|
|
52
64
|
/** Starts a replacement OS process for a dead resumable worker. Completion is an event-driven
|
|
53
65
|
* terminal signal; worker product remains in its persisted session/artifacts. */
|
|
54
66
|
resumeWorker?: (payload: ResumablePayload) => Promise<ResumeWorkerLaunchOutcome>;
|
|
67
|
+
/** Injectable only at the storage boundary; defaults to the atomic local filesystem adapter. */
|
|
68
|
+
store?: ProcessMatrixStorePort;
|
|
55
69
|
}
|
|
56
70
|
export type ResumeWorkerLaunchOutcome = {
|
|
57
71
|
started: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/process-matrix/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAE5E,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/process-matrix/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAE5E,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAEN,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,yBAAyB,EACzB,MAAM,YAAY,CAAC;AAgBpB,OAAO,EACN,uBAAuB,EACvB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,6BAA6B,EAC7B,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GACf,MAAM,wBAAwB,CAAC;AAEhC;sFACsF;AACtF,MAAM,WAAW,sBAAsB;IACtC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,yBAAyB,EAAE,OAAO,yBAAyB,CAAC;CAC5D;AAED,eAAO,MAAM,uBAAuB,EAAE,sBAOpC,CAAC;AAEH,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,qBAAqB,CAAC;IAC7B,qFAAqF;IACrF,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,6BAA6B,CAAC;IACxC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,4FAA4F;IAC5F,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,wDAAwD;IACxD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,yFAAyF;IACzF,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD;yFACqF;IACrF,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;qFACiF;IACjF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjF,gGAAgG;IAChG,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,MAAM,yBAAyB,GAClC;IACA,OAAO,EAAE,IAAI,CAAC;IACd,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC3E,GACD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,0BAA0B;IAC1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC7B;AAGD,eAAO,MAAM,qCAAqC,QAAwB,CAAC;AAwB3E;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC9C,MAAM,EAAE,0BAA0B,GAChC,OAAO,CAAC,0BAA0B,CAAC,CAerC"}
|
|
@@ -29,8 +29,19 @@ import { getBoundWorktreeLaneKey } from "../worktree-sync/runtime.js";
|
|
|
29
29
|
import { buildEntryId, listEntries, readEntry, removeEntryIfUnchanged, writeEntry, writeEntryIfUnchanged, writeEntryIfUnchangedSync, } from "./store.js";
|
|
30
30
|
import { applyAdoption, applyHeartbeat, beginWindDown, buildMasterEntry, buildWorkerEntry, detectOrphanedWorkers, markClosed, markResumable, markTerminal, markTerminalNotificationDelivered, pollWorkerDirective, reconcileMatrix, } from "./supervisor.js";
|
|
31
31
|
export { getOrchestrationAgentId, getParentPid, getParentSessionId, getProcessTaskRef, PI_ORCHESTRATION_AGENT_ID_ENV, PI_PARENT_PID_ENV, PI_PARENT_SESSION_ENV, PI_TASK_REF_ENV, } from "../process-identity.js";
|
|
32
|
+
export const localProcessMatrixStore = Object.freeze({
|
|
33
|
+
listEntries,
|
|
34
|
+
readEntry,
|
|
35
|
+
removeEntryIfUnchanged,
|
|
36
|
+
writeEntry,
|
|
37
|
+
writeEntryIfUnchanged,
|
|
38
|
+
writeEntryIfUnchangedSync,
|
|
39
|
+
});
|
|
32
40
|
const NOOP_HANDLE = { stop: () => { } };
|
|
33
41
|
export const PROCESS_MATRIX_RESUMABLE_RETENTION_MS = 30 * 24 * 60 * 60_000;
|
|
42
|
+
function resolveProcessMatrixStore(config) {
|
|
43
|
+
return config.store ?? localProcessMatrixStore;
|
|
44
|
+
}
|
|
34
45
|
function describeError(error) {
|
|
35
46
|
return error instanceof Error ? error.message : String(error);
|
|
36
47
|
}
|
|
@@ -74,6 +85,7 @@ export async function startProcessMatrixRuntime(config) {
|
|
|
74
85
|
// Master branch
|
|
75
86
|
// ---------------------------------------------------------------------------
|
|
76
87
|
async function startMasterBranch(config, now) {
|
|
88
|
+
const store = resolveProcessMatrixStore(config);
|
|
77
89
|
let entry = buildMasterEntry({
|
|
78
90
|
agent: config.agent,
|
|
79
91
|
pid: process.pid,
|
|
@@ -81,7 +93,7 @@ async function startMasterBranch(config, now) {
|
|
|
81
93
|
now: nowIso(now),
|
|
82
94
|
});
|
|
83
95
|
try {
|
|
84
|
-
await writeEntry(config.agentDir, entry);
|
|
96
|
+
await store.writeEntry(config.agentDir, entry);
|
|
85
97
|
}
|
|
86
98
|
catch (error) {
|
|
87
99
|
config.onDiagnostic?.(`process-matrix: failed to register master entry: ${describeError(error)}`);
|
|
@@ -95,7 +107,8 @@ async function startMasterBranch(config, now) {
|
|
|
95
107
|
return;
|
|
96
108
|
const expected = entry;
|
|
97
109
|
const next = applyHeartbeat(expected, nowIso(now));
|
|
98
|
-
heartbeatTask =
|
|
110
|
+
heartbeatTask = store
|
|
111
|
+
.writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)
|
|
99
112
|
.then((written) => {
|
|
100
113
|
if (written) {
|
|
101
114
|
entry = next;
|
|
@@ -122,7 +135,7 @@ async function startMasterBranch(config, now) {
|
|
|
122
135
|
return;
|
|
123
136
|
try {
|
|
124
137
|
const closed = markClosed(entry, nowIso(now));
|
|
125
|
-
if (writeEntryIfUnchangedSync(config.agentDir, entry, closed))
|
|
138
|
+
if (store.writeEntryIfUnchangedSync(config.agentDir, entry, closed))
|
|
126
139
|
entry = closed;
|
|
127
140
|
}
|
|
128
141
|
catch {
|
|
@@ -144,7 +157,7 @@ async function startMasterBranch(config, now) {
|
|
|
144
157
|
await heartbeatTask;
|
|
145
158
|
if (ownsEntry) {
|
|
146
159
|
const closed = markClosed(entry, nowIso(now));
|
|
147
|
-
if (await writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, closed))
|
|
160
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, closed))
|
|
148
161
|
entry = closed;
|
|
149
162
|
}
|
|
150
163
|
await maintenance;
|
|
@@ -152,9 +165,10 @@ async function startMasterBranch(config, now) {
|
|
|
152
165
|
};
|
|
153
166
|
}
|
|
154
167
|
async function reconcileAndRunOrphanScan(config, now, signal) {
|
|
168
|
+
const store = resolveProcessMatrixStore(config);
|
|
155
169
|
let entries;
|
|
156
170
|
try {
|
|
157
|
-
entries = await listEntries(config.agentDir);
|
|
171
|
+
entries = await store.listEntries(config.agentDir);
|
|
158
172
|
}
|
|
159
173
|
catch (error) {
|
|
160
174
|
config.onDiagnostic?.(`process-matrix: reconciliation failed to list entries: ${describeError(error)}`);
|
|
@@ -172,13 +186,13 @@ async function reconcileAndRunOrphanScan(config, now, signal) {
|
|
|
172
186
|
const [prunedOutcomes, recoveredOutcomes] = await Promise.all([
|
|
173
187
|
Promise.all(reconciled.prunedEntryIds.map((entryId) => {
|
|
174
188
|
const original = originalByEntryId.get(entryId);
|
|
175
|
-
return original ? removeEntryIfUnchanged(config.agentDir, original) : false;
|
|
189
|
+
return original ? store.removeEntryIfUnchanged(config.agentDir, original) : false;
|
|
176
190
|
})),
|
|
177
191
|
Promise.all(reconciled.kept
|
|
178
192
|
.filter((entry) => recoveredEntryIdSet.has(entry.entryId))
|
|
179
193
|
.map((entry) => {
|
|
180
194
|
const original = originalByEntryId.get(entry.entryId);
|
|
181
|
-
return original ? writeEntryIfUnchanged(config.agentDir, entry.entryId, original, entry) : false;
|
|
195
|
+
return original ? store.writeEntryIfUnchanged(config.agentDir, entry.entryId, original, entry) : false;
|
|
182
196
|
})),
|
|
183
197
|
]);
|
|
184
198
|
if (signal.aborted)
|
|
@@ -191,13 +205,14 @@ async function reconcileAndRunOrphanScan(config, now, signal) {
|
|
|
191
205
|
if (prunedCount > 0) {
|
|
192
206
|
config.onDiagnostic?.(`process-matrix: pruned ${prunedCount} terminal or expired entr${prunedCount === 1 ? "y" : "ies"}`);
|
|
193
207
|
}
|
|
194
|
-
const currentEntries = await listEntries(config.agentDir);
|
|
208
|
+
const currentEntries = await store.listEntries(config.agentDir);
|
|
195
209
|
await deliverTerminalNotifications(config, currentEntries, now, signal);
|
|
196
210
|
if (signal.aborted)
|
|
197
211
|
return;
|
|
198
212
|
await runOrphanScan(config, currentEntries, now, signal);
|
|
199
213
|
}
|
|
200
214
|
async function deliverTerminalNotifications(config, entries, now, signal) {
|
|
215
|
+
const store = resolveProcessMatrixStore(config);
|
|
201
216
|
for (const entry of entries) {
|
|
202
217
|
if (signal.aborted ||
|
|
203
218
|
entry.status !== "closed" ||
|
|
@@ -216,7 +231,7 @@ async function deliverTerminalNotifications(config, entries, now, signal) {
|
|
|
216
231
|
}
|
|
217
232
|
try {
|
|
218
233
|
const delivered = markTerminalNotificationDelivered(entry, nowIso(now));
|
|
219
|
-
if (!(await writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, delivered))) {
|
|
234
|
+
if (!(await store.writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, delivered))) {
|
|
220
235
|
config.onDiagnostic?.(`process-matrix: terminal handoff changed before acknowledgement for ${entry.entryId}`);
|
|
221
236
|
}
|
|
222
237
|
}
|
|
@@ -230,6 +245,7 @@ function formatTerminalNotification(entry) {
|
|
|
230
245
|
return `process-matrix: resumed agent ${entry.agent.agentId} reached a terminal process state (code ${terminal?.code ?? "none"}, signal ${terminal?.signal ?? "none"}). Inspect its persisted result before continuing.`;
|
|
231
246
|
}
|
|
232
247
|
async function runOrphanScan(config, entries, now, signal) {
|
|
248
|
+
const store = resolveProcessMatrixStore(config);
|
|
233
249
|
const orphans = detectOrphanedWorkers(entries, {
|
|
234
250
|
isPidAlive: config.isProcessAlive,
|
|
235
251
|
ownSessionId: config.agent.resumeContext.sessionId,
|
|
@@ -279,7 +295,7 @@ async function runOrphanScan(config, entries, now, signal) {
|
|
|
279
295
|
continue;
|
|
280
296
|
const windingDown = beginWindDown(orphan, "user_cleanup", nowIso(now));
|
|
281
297
|
try {
|
|
282
|
-
if (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, windingDown))) {
|
|
298
|
+
if (!(await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, windingDown))) {
|
|
283
299
|
config.onDiagnostic?.(`process-matrix: cleanup skipped because ${orphan.entryId} changed`);
|
|
284
300
|
}
|
|
285
301
|
}
|
|
@@ -306,6 +322,7 @@ function reportOwnerGatedOrphan(config, orphan, reason) {
|
|
|
306
322
|
config.onDiagnostic?.(`process-matrix: found owner-gated orphan ${orphan.entryId} (${reason}; report-only, non-interactive; nothing written, nothing killed)`);
|
|
307
323
|
}
|
|
308
324
|
async function adoptLiveOrphan(config, orphan, signal) {
|
|
325
|
+
const store = resolveProcessMatrixStore(config);
|
|
309
326
|
if (signal.aborted)
|
|
310
327
|
return;
|
|
311
328
|
const adopted = applyAdoption(orphan, {
|
|
@@ -313,16 +330,17 @@ async function adoptLiveOrphan(config, orphan, signal) {
|
|
|
313
330
|
parentSessionId: config.agent.resumeContext.sessionId,
|
|
314
331
|
});
|
|
315
332
|
try {
|
|
316
|
-
if (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, adopted)))
|
|
333
|
+
if (!(await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, adopted)))
|
|
317
334
|
return;
|
|
318
335
|
if (signal.aborted)
|
|
319
|
-
await writeEntryIfUnchanged(config.agentDir, orphan.entryId, adopted, orphan);
|
|
336
|
+
await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, adopted, orphan);
|
|
320
337
|
}
|
|
321
338
|
catch (error) {
|
|
322
339
|
config.onDiagnostic?.(`process-matrix: failed to write adoption for ${orphan.entryId}: ${describeError(error)}`);
|
|
323
340
|
}
|
|
324
341
|
}
|
|
325
342
|
async function resumeDeadOrphan(config, orphan, signal) {
|
|
343
|
+
const store = resolveProcessMatrixStore(config);
|
|
326
344
|
if (signal.aborted)
|
|
327
345
|
return;
|
|
328
346
|
const payload = orphan.resumable;
|
|
@@ -336,15 +354,15 @@ async function resumeDeadOrphan(config, orphan, signal) {
|
|
|
336
354
|
});
|
|
337
355
|
let launched;
|
|
338
356
|
try {
|
|
339
|
-
if (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, claimed)))
|
|
357
|
+
if (!(await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, claimed)))
|
|
340
358
|
return;
|
|
341
359
|
if (signal.aborted) {
|
|
342
|
-
await writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);
|
|
360
|
+
await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);
|
|
343
361
|
return;
|
|
344
362
|
}
|
|
345
363
|
const launchOutcome = await config.resumeWorker(payload);
|
|
346
364
|
if (!launchOutcome.started) {
|
|
347
|
-
await writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);
|
|
365
|
+
await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);
|
|
348
366
|
config.onDiagnostic?.(`process-matrix: failed to resume ${orphan.entryId}: ${launchOutcome.reason}`);
|
|
349
367
|
return;
|
|
350
368
|
}
|
|
@@ -352,7 +370,7 @@ async function resumeDeadOrphan(config, orphan, signal) {
|
|
|
352
370
|
}
|
|
353
371
|
catch (error) {
|
|
354
372
|
try {
|
|
355
|
-
await writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);
|
|
373
|
+
await store.writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);
|
|
356
374
|
}
|
|
357
375
|
catch {
|
|
358
376
|
// The original resumable record remains the intended recovery state.
|
|
@@ -366,7 +384,7 @@ async function resumeDeadOrphan(config, orphan, signal) {
|
|
|
366
384
|
// Bridge the interval before the replacement can self-register. Without its real PID here, a
|
|
367
385
|
// restarted master can mistake this live replacement for the original dead process and spawn
|
|
368
386
|
// a duplicate.
|
|
369
|
-
await writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, launchedEntry);
|
|
387
|
+
await store.writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, launchedEntry);
|
|
370
388
|
}
|
|
371
389
|
catch (error) {
|
|
372
390
|
config.onDiagnostic?.(`process-matrix: failed to record resumed worker pid for ${orphan.entryId}: ${describeError(error)}`);
|
|
@@ -380,19 +398,20 @@ async function resumeDeadOrphan(config, orphan, signal) {
|
|
|
380
398
|
});
|
|
381
399
|
}
|
|
382
400
|
async function persistResumedWorkerTerminal(config, claimed, preLaunchClaim, result, lifetime) {
|
|
401
|
+
const store = resolveProcessMatrixStore(config);
|
|
383
402
|
try {
|
|
384
403
|
const observedAt = new Date().toISOString();
|
|
385
404
|
const terminal = markTerminal(claimed, result, observedAt);
|
|
386
|
-
if (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, terminal)) {
|
|
405
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, terminal)) {
|
|
387
406
|
if (lifetime.aborted)
|
|
388
407
|
return;
|
|
389
408
|
await notifyResumedWorkerTerminal(config, terminal, lifetime);
|
|
390
409
|
return;
|
|
391
410
|
}
|
|
392
|
-
const selfRegistered = await readEntry(config.agentDir, claimed.entryId);
|
|
411
|
+
const selfRegistered = await store.readEntry(config.agentDir, claimed.entryId);
|
|
393
412
|
if (selfRegistered?.pid === claimed.pid) {
|
|
394
413
|
const registeredTerminal = markTerminal(selfRegistered, result, observedAt);
|
|
395
|
-
if (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, selfRegistered, registeredTerminal)) {
|
|
414
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, claimed.entryId, selfRegistered, registeredTerminal)) {
|
|
396
415
|
if (lifetime.aborted)
|
|
397
416
|
return;
|
|
398
417
|
await notifyResumedWorkerTerminal(config, registeredTerminal, lifetime);
|
|
@@ -403,13 +422,13 @@ async function persistResumedWorkerTerminal(config, claimed, preLaunchClaim, res
|
|
|
403
422
|
// untouched pre-launch claim proves no newer process has taken this logical entry. Upgrade it
|
|
404
423
|
// to the actual exited process before persisting its terminal handoff.
|
|
405
424
|
const fallbackTerminal = markTerminal({ ...preLaunchClaim, pid: claimed.pid }, result, observedAt);
|
|
406
|
-
if (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, preLaunchClaim, fallbackTerminal)) {
|
|
425
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, claimed.entryId, preLaunchClaim, fallbackTerminal)) {
|
|
407
426
|
if (lifetime.aborted)
|
|
408
427
|
return;
|
|
409
428
|
await notifyResumedWorkerTerminal(config, fallbackTerminal, lifetime);
|
|
410
429
|
return;
|
|
411
430
|
}
|
|
412
|
-
if (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, undefined, terminal)) {
|
|
431
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, claimed.entryId, undefined, terminal)) {
|
|
413
432
|
if (lifetime.aborted)
|
|
414
433
|
return;
|
|
415
434
|
await notifyResumedWorkerTerminal(config, terminal, lifetime);
|
|
@@ -422,6 +441,7 @@ async function persistResumedWorkerTerminal(config, claimed, preLaunchClaim, res
|
|
|
422
441
|
}
|
|
423
442
|
}
|
|
424
443
|
async function notifyResumedWorkerTerminal(config, terminal, lifetime) {
|
|
444
|
+
const store = resolveProcessMatrixStore(config);
|
|
425
445
|
if (lifetime.aborted)
|
|
426
446
|
return;
|
|
427
447
|
try {
|
|
@@ -429,7 +449,7 @@ async function notifyResumedWorkerTerminal(config, terminal, lifetime) {
|
|
|
429
449
|
if (lifetime.aborted)
|
|
430
450
|
return;
|
|
431
451
|
const delivered = markTerminalNotificationDelivered(terminal, new Date().toISOString());
|
|
432
|
-
if (!(await writeEntryIfUnchanged(config.agentDir, terminal.entryId, terminal, delivered))) {
|
|
452
|
+
if (!(await store.writeEntryIfUnchanged(config.agentDir, terminal.entryId, terminal, delivered))) {
|
|
433
453
|
config.onDiagnostic?.(`process-matrix: terminal handoff changed before acknowledgement for ${terminal.entryId}`);
|
|
434
454
|
}
|
|
435
455
|
}
|
|
@@ -441,6 +461,7 @@ async function notifyResumedWorkerTerminal(config, terminal, lifetime) {
|
|
|
441
461
|
// Worker branch
|
|
442
462
|
// ---------------------------------------------------------------------------
|
|
443
463
|
async function startWorkerBranch(config, initialParentPid, now) {
|
|
464
|
+
const store = resolveProcessMatrixStore(config);
|
|
444
465
|
const parentSessionId = getParentSessionId();
|
|
445
466
|
const taskRef = (getProcessTaskRef() ?? config.taskRef)?.trim().slice(0, 512) || undefined;
|
|
446
467
|
const taskSummary = config.taskSummary?.trim().slice(0, 2_000) || undefined;
|
|
@@ -460,7 +481,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
460
481
|
...(taskSummary !== undefined ? { taskSummary } : {}),
|
|
461
482
|
});
|
|
462
483
|
try {
|
|
463
|
-
await writeEntry(config.agentDir, entry);
|
|
484
|
+
await store.writeEntry(config.agentDir, entry);
|
|
464
485
|
}
|
|
465
486
|
catch (error) {
|
|
466
487
|
config.onDiagnostic?.(`process-matrix: failed to register worker entry: ${describeError(error)}`);
|
|
@@ -478,7 +499,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
478
499
|
return;
|
|
479
500
|
try {
|
|
480
501
|
const terminal = markTerminal(entry, { code, signal: null }, nowIso(now));
|
|
481
|
-
if (writeEntryIfUnchangedSync(config.agentDir, entry, terminal))
|
|
502
|
+
if (store.writeEntryIfUnchangedSync(config.agentDir, entry, terminal))
|
|
482
503
|
entry = terminal;
|
|
483
504
|
}
|
|
484
505
|
catch {
|
|
@@ -501,11 +522,11 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
501
522
|
const expected = entry;
|
|
502
523
|
const terminal = markTerminal(expected, { code: null, signal: null }, nowIso(now));
|
|
503
524
|
try {
|
|
504
|
-
if (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, terminal)) {
|
|
525
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, terminal)) {
|
|
505
526
|
entry = terminal;
|
|
506
527
|
break;
|
|
507
528
|
}
|
|
508
|
-
const current = await readEntry(config.agentDir, expected.entryId);
|
|
529
|
+
const current = await store.readEntry(config.agentDir, expected.entryId);
|
|
509
530
|
if (current?.pid !== process.pid || current.startedAt !== generationStartedAt) {
|
|
510
531
|
config.onDiagnostic?.("process-matrix: worker entry ownership moved to a newer process generation");
|
|
511
532
|
break;
|
|
@@ -526,11 +547,11 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
526
547
|
};
|
|
527
548
|
const persist = async (expected, next, failureContext) => {
|
|
528
549
|
try {
|
|
529
|
-
if (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)) {
|
|
550
|
+
if (await store.writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)) {
|
|
530
551
|
entry = next;
|
|
531
552
|
return true;
|
|
532
553
|
}
|
|
533
|
-
const current = await readEntry(config.agentDir, expected.entryId);
|
|
554
|
+
const current = await store.readEntry(config.agentDir, expected.entryId);
|
|
534
555
|
if (current?.pid === process.pid)
|
|
535
556
|
entry = current;
|
|
536
557
|
else {
|
|
@@ -553,7 +574,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
553
574
|
preserveResumableOnExit = false;
|
|
554
575
|
emitRuntimeNotice(config, "process-matrix: the parent session requested a cooperative cleanup. Winding down.");
|
|
555
576
|
await stop();
|
|
556
|
-
config.requestExit();
|
|
577
|
+
await config.requestExit();
|
|
557
578
|
};
|
|
558
579
|
const startHealthyWatch = () => {
|
|
559
580
|
timer = setInterval(() => {
|
|
@@ -572,7 +593,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
572
593
|
// PID to a durable identity and proves that that exact session is still heartbeating.
|
|
573
594
|
if (!currentParentSessionId || !config.isProcessAlive(currentParentPid))
|
|
574
595
|
return false;
|
|
575
|
-
const parent = await readEntry(config.agentDir, buildEntryId("master", currentParentSessionId));
|
|
596
|
+
const parent = await store.readEntry(config.agentDir, buildEntryId("master", currentParentSessionId));
|
|
576
597
|
if (!parent || parent.role !== "master" || parent.agent.resumeContext.sessionId !== currentParentSessionId)
|
|
577
598
|
return false;
|
|
578
599
|
if (parent.pid !== currentParentPid || parent.status !== "running")
|
|
@@ -589,7 +610,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
589
610
|
return;
|
|
590
611
|
}
|
|
591
612
|
// Still healthy: also poll for a master-initiated cooperative-cleanup directive.
|
|
592
|
-
const fresh = await readEntry(config.agentDir, entry.entryId);
|
|
613
|
+
const fresh = await store.readEntry(config.agentDir, entry.entryId);
|
|
593
614
|
if (!fresh)
|
|
594
615
|
return;
|
|
595
616
|
const directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });
|
|
@@ -630,7 +651,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
630
651
|
const graceTick = async (graceDeadline) => {
|
|
631
652
|
if (stopped)
|
|
632
653
|
return;
|
|
633
|
-
const fresh = await readEntry(config.agentDir, entry.entryId);
|
|
654
|
+
const fresh = await store.readEntry(config.agentDir, entry.entryId);
|
|
634
655
|
if (fresh) {
|
|
635
656
|
const directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });
|
|
636
657
|
if (directive.code === "adopt" && fresh.parentSessionId) {
|
|
@@ -656,7 +677,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
|
|
|
656
677
|
}
|
|
657
678
|
if (now() >= graceDeadline) {
|
|
658
679
|
await stop();
|
|
659
|
-
config.requestExit();
|
|
680
|
+
await config.requestExit();
|
|
660
681
|
}
|
|
661
682
|
};
|
|
662
683
|
startHealthyWatch();
|