pulseed 0.4.6 → 0.4.7
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 +4 -0
- package/dist/adapters/agents/openclaw-acp.d.ts +32 -0
- package/dist/adapters/agents/openclaw-acp.d.ts.map +1 -0
- package/dist/adapters/agents/openclaw-acp.js +212 -0
- package/dist/adapters/agents/openclaw-acp.js.map +1 -0
- package/dist/adapters/datasources/openclaw-datasource.d.ts +33 -0
- package/dist/adapters/datasources/openclaw-datasource.d.ts.map +1 -0
- package/dist/adapters/datasources/openclaw-datasource.js +176 -0
- package/dist/adapters/datasources/openclaw-datasource.js.map +1 -0
- package/dist/base/state/state-lock.d.ts +3 -1
- package/dist/base/state/state-lock.d.ts.map +1 -1
- package/dist/base/state/state-lock.js +52 -10
- package/dist/base/state/state-lock.js.map +1 -1
- package/dist/base/state/state-manager-goal-write.d.ts +4 -0
- package/dist/base/state/state-manager-goal-write.d.ts.map +1 -1
- package/dist/base/state/state-manager-goal-write.js +45 -3
- package/dist/base/state/state-manager-goal-write.js.map +1 -1
- package/dist/base/state/state-manager-wal.d.ts.map +1 -1
- package/dist/base/state/state-manager-wal.js +12 -0
- package/dist/base/state/state-manager-wal.js.map +1 -1
- package/dist/base/state/state-manager.d.ts +1 -1
- package/dist/base/state/state-manager.d.ts.map +1 -1
- package/dist/base/state/state-manager.js +129 -88
- package/dist/base/state/state-manager.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/interface/chat/chat-event-state.d.ts.map +1 -1
- package/dist/interface/chat/chat-event-state.js +12 -24
- package/dist/interface/chat/chat-event-state.js.map +1 -1
- package/dist/interface/chat/chat-events.d.ts +9 -1
- package/dist/interface/chat/chat-events.d.ts.map +1 -1
- package/dist/interface/chat/chat-runner.d.ts +19 -0
- package/dist/interface/chat/chat-runner.d.ts.map +1 -1
- package/dist/interface/chat/chat-runner.js +101 -5
- package/dist/interface/chat/chat-runner.js.map +1 -1
- package/dist/interface/chat/cross-platform-session.d.ts.map +1 -1
- package/dist/interface/chat/cross-platform-session.js +36 -0
- package/dist/interface/chat/cross-platform-session.js.map +1 -1
- package/dist/interface/cli/commands/chat.d.ts.map +1 -1
- package/dist/interface/cli/commands/chat.js +9 -0
- package/dist/interface/cli/commands/chat.js.map +1 -1
- package/dist/interface/cli/commands/daemon.d.ts.map +1 -1
- package/dist/interface/cli/commands/daemon.js +14 -0
- package/dist/interface/cli/commands/daemon.js.map +1 -1
- package/dist/interface/cli/commands/doctor.d.ts +3 -0
- package/dist/interface/cli/commands/doctor.d.ts.map +1 -1
- package/dist/interface/cli/commands/doctor.js +136 -1
- package/dist/interface/cli/commands/doctor.js.map +1 -1
- package/dist/interface/cli/commands/setup/import/apply.d.ts +3 -0
- package/dist/interface/cli/commands/setup/import/apply.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/apply.js +140 -0
- package/dist/interface/cli/commands/setup/import/apply.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/constants.d.ts +5 -0
- package/dist/interface/cli/commands/setup/import/constants.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/constants.js +19 -0
- package/dist/interface/cli/commands/setup/import/constants.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/discovery.d.ts +3 -0
- package/dist/interface/cli/commands/setup/import/discovery.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/discovery.js +140 -0
- package/dist/interface/cli/commands/setup/import/discovery.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/flow.d.ts +5 -0
- package/dist/interface/cli/commands/setup/import/flow.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/flow.js +138 -0
- package/dist/interface/cli/commands/setup/import/flow.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/fs-utils.d.ts +9 -0
- package/dist/interface/cli/commands/setup/import/fs-utils.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/fs-utils.js +83 -0
- package/dist/interface/cli/commands/setup/import/fs-utils.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/mcp.d.ts +4 -0
- package/dist/interface/cli/commands/setup/import/mcp.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/mcp.js +71 -0
- package/dist/interface/cli/commands/setup/import/mcp.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/parse.d.ts +7 -0
- package/dist/interface/cli/commands/setup/import/parse.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/parse.js +40 -0
- package/dist/interface/cli/commands/setup/import/parse.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/provider.d.ts +4 -0
- package/dist/interface/cli/commands/setup/import/provider.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/provider.js +142 -0
- package/dist/interface/cli/commands/setup/import/provider.js.map +1 -0
- package/dist/interface/cli/commands/setup/import/types.d.ts +53 -0
- package/dist/interface/cli/commands/setup/import/types.d.ts.map +1 -0
- package/dist/interface/cli/commands/setup/import/types.js +2 -0
- package/dist/interface/cli/commands/setup/import/types.js.map +1 -0
- package/dist/interface/cli/commands/setup/steps-adapter.d.ts +1 -1
- package/dist/interface/cli/commands/setup/steps-adapter.d.ts.map +1 -1
- package/dist/interface/cli/commands/setup/steps-adapter.js +32 -5
- package/dist/interface/cli/commands/setup/steps-adapter.js.map +1 -1
- package/dist/interface/cli/commands/setup/steps-identity.d.ts +2 -2
- package/dist/interface/cli/commands/setup/steps-identity.d.ts.map +1 -1
- package/dist/interface/cli/commands/setup/steps-identity.js +10 -4
- package/dist/interface/cli/commands/setup/steps-identity.js.map +1 -1
- package/dist/interface/cli/commands/setup/steps-provider.d.ts +4 -4
- package/dist/interface/cli/commands/setup/steps-provider.d.ts.map +1 -1
- package/dist/interface/cli/commands/setup/steps-provider.js +58 -10
- package/dist/interface/cli/commands/setup/steps-provider.js.map +1 -1
- package/dist/interface/cli/commands/setup/steps-runtime.d.ts.map +1 -1
- package/dist/interface/cli/commands/setup/steps-runtime.js +2 -3
- package/dist/interface/cli/commands/setup/steps-runtime.js.map +1 -1
- package/dist/interface/cli/commands/setup-wizard.d.ts.map +1 -1
- package/dist/interface/cli/commands/setup-wizard.js +309 -62
- package/dist/interface/cli/commands/setup-wizard.js.map +1 -1
- package/dist/interface/cli/setup.d.ts.map +1 -1
- package/dist/interface/cli/setup.js +1 -1
- package/dist/interface/cli/setup.js.map +1 -1
- package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.d.ts +1 -0
- package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.d.ts.map +1 -1
- package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.js +91 -1
- package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.js.map +1 -1
- package/dist/orchestrator/execution/pipeline-executor.d.ts +1 -0
- package/dist/orchestrator/execution/pipeline-executor.d.ts.map +1 -1
- package/dist/orchestrator/execution/pipeline-executor.js +39 -8
- package/dist/orchestrator/execution/pipeline-executor.js.map +1 -1
- package/dist/orchestrator/execution/result-reconciler.d.ts.map +1 -1
- package/dist/orchestrator/execution/result-reconciler.js +79 -54
- package/dist/orchestrator/execution/result-reconciler.js.map +1 -1
- package/dist/orchestrator/execution/task/task-execution-helpers.d.ts +2 -1
- package/dist/orchestrator/execution/task/task-execution-helpers.d.ts.map +1 -1
- package/dist/orchestrator/execution/task/task-execution-helpers.js +11 -1
- package/dist/orchestrator/execution/task/task-execution-helpers.js.map +1 -1
- package/dist/orchestrator/execution/task/task-lifecycle.d.ts +1 -1
- package/dist/orchestrator/execution/task/task-lifecycle.d.ts.map +1 -1
- package/dist/orchestrator/execution/task/task-lifecycle.js +33 -0
- package/dist/orchestrator/execution/task/task-lifecycle.js.map +1 -1
- package/dist/orchestrator/goal/goal-dependency-graph.d.ts.map +1 -1
- package/dist/orchestrator/goal/goal-dependency-graph.js +20 -8
- package/dist/orchestrator/goal/goal-dependency-graph.js.map +1 -1
- package/dist/orchestrator/goal/goal-refiner.d.ts +3 -5
- package/dist/orchestrator/goal/goal-refiner.d.ts.map +1 -1
- package/dist/orchestrator/goal/goal-refiner.js +3 -5
- package/dist/orchestrator/goal/goal-refiner.js.map +1 -1
- package/dist/orchestrator/knowledge/memory/memory-lifecycle.d.ts +2 -0
- package/dist/orchestrator/knowledge/memory/memory-lifecycle.d.ts.map +1 -0
- package/dist/orchestrator/knowledge/memory/memory-lifecycle.js +2 -0
- package/dist/orchestrator/knowledge/memory/memory-lifecycle.js.map +1 -0
- package/dist/orchestrator/strategy/cross-goal-portfolio.d.ts.map +1 -1
- package/dist/orchestrator/strategy/cross-goal-portfolio.js +20 -12
- package/dist/orchestrator/strategy/cross-goal-portfolio.js.map +1 -1
- package/dist/orchestrator/strategy/portfolio-manager.d.ts.map +1 -1
- package/dist/orchestrator/strategy/portfolio-manager.js +8 -4
- package/dist/orchestrator/strategy/portfolio-manager.js.map +1 -1
- package/dist/orchestrator/strategy/strategy-manager-base.d.ts.map +1 -1
- package/dist/orchestrator/strategy/strategy-manager-base.js +29 -24
- package/dist/orchestrator/strategy/strategy-manager-base.js.map +1 -1
- package/dist/platform/dream/dream-soil-sync.d.ts +2 -0
- package/dist/platform/dream/dream-soil-sync.d.ts.map +1 -1
- package/dist/platform/dream/dream-soil-sync.js +19 -0
- package/dist/platform/dream/dream-soil-sync.js.map +1 -1
- package/dist/platform/drive/satisficing-judge.d.ts.map +1 -1
- package/dist/platform/drive/satisficing-judge.js +20 -6
- package/dist/platform/drive/satisficing-judge.js.map +1 -1
- package/dist/platform/knowledge/knowledge-manager-lint.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-manager-lint.js +4 -3
- package/dist/platform/knowledge/knowledge-manager-lint.js.map +1 -1
- package/dist/platform/knowledge/knowledge-manager.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-manager.js +2 -1
- package/dist/platform/knowledge/knowledge-manager.js.map +1 -1
- package/dist/platform/knowledge/knowledge-search.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-search.js +15 -3
- package/dist/platform/knowledge/knowledge-search.js.map +1 -1
- package/dist/platform/knowledge/learning/learning-cross-goal.d.ts.map +1 -1
- package/dist/platform/knowledge/learning/learning-cross-goal.js +9 -5
- package/dist/platform/knowledge/learning/learning-cross-goal.js.map +1 -1
- package/dist/platform/observation/observation-apply.d.ts.map +1 -1
- package/dist/platform/observation/observation-apply.js +93 -99
- package/dist/platform/observation/observation-apply.js.map +1 -1
- package/dist/platform/soil/compiled-memory-projections.d.ts +12 -0
- package/dist/platform/soil/compiled-memory-projections.d.ts.map +1 -0
- package/dist/platform/soil/compiled-memory-projections.js +238 -0
- package/dist/platform/soil/compiled-memory-projections.js.map +1 -0
- package/dist/platform/soil/content-projections.d.ts +3 -7
- package/dist/platform/soil/content-projections.d.ts.map +1 -1
- package/dist/platform/soil/content-projections.js +67 -105
- package/dist/platform/soil/content-projections.js.map +1 -1
- package/dist/platform/soil/context-compiler.d.ts +34 -0
- package/dist/platform/soil/context-compiler.d.ts.map +1 -0
- package/dist/platform/soil/context-compiler.js +298 -0
- package/dist/platform/soil/context-compiler.js.map +1 -0
- package/dist/platform/soil/context-evaluation.d.ts +63 -0
- package/dist/platform/soil/context-evaluation.d.ts.map +1 -0
- package/dist/platform/soil/context-evaluation.js +90 -0
- package/dist/platform/soil/context-evaluation.js.map +1 -0
- package/dist/platform/soil/contracts.d.ts +269 -30
- package/dist/platform/soil/contracts.d.ts.map +1 -1
- package/dist/platform/soil/contracts.js +87 -0
- package/dist/platform/soil/contracts.js.map +1 -1
- package/dist/platform/soil/doctor.d.ts +5 -1
- package/dist/platform/soil/doctor.d.ts.map +1 -1
- package/dist/platform/soil/doctor.js +94 -1
- package/dist/platform/soil/doctor.js.map +1 -1
- package/dist/platform/soil/feedback-store.d.ts +10 -0
- package/dist/platform/soil/feedback-store.d.ts.map +1 -0
- package/dist/platform/soil/feedback-store.js +38 -0
- package/dist/platform/soil/feedback-store.js.map +1 -0
- package/dist/platform/soil/health.d.ts +35 -0
- package/dist/platform/soil/health.d.ts.map +1 -0
- package/dist/platform/soil/health.js +126 -0
- package/dist/platform/soil/health.js.map +1 -0
- package/dist/platform/soil/index-store.d.ts.map +1 -1
- package/dist/platform/soil/index-store.js +10 -1
- package/dist/platform/soil/index-store.js.map +1 -1
- package/dist/platform/soil/index.d.ts +4 -0
- package/dist/platform/soil/index.d.ts.map +1 -1
- package/dist/platform/soil/index.js +4 -0
- package/dist/platform/soil/index.js.map +1 -1
- package/dist/platform/soil/projection-support.d.ts +48 -0
- package/dist/platform/soil/projection-support.d.ts.map +1 -0
- package/dist/platform/soil/projection-support.js +107 -0
- package/dist/platform/soil/projection-support.js.map +1 -0
- package/dist/platform/soil/runtime-rebuild.d.ts.map +1 -1
- package/dist/platform/soil/runtime-rebuild.js +1 -2
- package/dist/platform/soil/runtime-rebuild.js.map +1 -1
- package/dist/platform/soil/sqlite-repository.d.ts.map +1 -1
- package/dist/platform/soil/sqlite-repository.js +51 -15
- package/dist/platform/soil/sqlite-repository.js.map +1 -1
- package/dist/runtime/command-dispatcher.d.ts +2 -0
- package/dist/runtime/command-dispatcher.d.ts.map +1 -1
- package/dist/runtime/command-dispatcher.js +11 -0
- package/dist/runtime/command-dispatcher.js.map +1 -1
- package/dist/runtime/control/daemon-runtime-control-executor.d.ts +13 -0
- package/dist/runtime/control/daemon-runtime-control-executor.d.ts.map +1 -0
- package/dist/runtime/control/daemon-runtime-control-executor.js +46 -0
- package/dist/runtime/control/daemon-runtime-control-executor.js.map +1 -0
- package/dist/runtime/control/index.d.ts +7 -0
- package/dist/runtime/control/index.d.ts.map +1 -0
- package/dist/runtime/control/index.js +4 -0
- package/dist/runtime/control/index.js.map +1 -0
- package/dist/runtime/control/runtime-control-intent.d.ts +7 -0
- package/dist/runtime/control/runtime-control-intent.d.ts.map +1 -0
- package/dist/runtime/control/runtime-control-intent.js +31 -0
- package/dist/runtime/control/runtime-control-intent.js.map +1 -0
- package/dist/runtime/control/runtime-control-service.d.ts +44 -0
- package/dist/runtime/control/runtime-control-service.d.ts.map +1 -0
- package/dist/runtime/control/runtime-control-service.js +143 -0
- package/dist/runtime/control/runtime-control-service.js.map +1 -0
- package/dist/runtime/daemon/client.d.ts +4 -0
- package/dist/runtime/daemon/client.d.ts.map +1 -1
- package/dist/runtime/daemon/client.js +9 -5
- package/dist/runtime/daemon/client.js.map +1 -1
- package/dist/runtime/daemon/runner.d.ts +2 -0
- package/dist/runtime/daemon/runner.d.ts.map +1 -1
- package/dist/runtime/daemon/runner.js +72 -1
- package/dist/runtime/daemon/runner.js.map +1 -1
- package/dist/runtime/event/server.d.ts +1 -0
- package/dist/runtime/event/server.d.ts.map +1 -1
- package/dist/runtime/event/server.js +36 -0
- package/dist/runtime/event/server.js.map +1 -1
- package/dist/runtime/store/index.d.ts +3 -0
- package/dist/runtime/store/index.d.ts.map +1 -1
- package/dist/runtime/store/index.js +2 -0
- package/dist/runtime/store/index.js.map +1 -1
- package/dist/runtime/store/runtime-operation-schemas.d.ts +213 -0
- package/dist/runtime/store/runtime-operation-schemas.d.ts.map +1 -0
- package/dist/runtime/store/runtime-operation-schemas.js +62 -0
- package/dist/runtime/store/runtime-operation-schemas.js.map +1 -0
- package/dist/runtime/store/runtime-operation-store.d.ts +17 -0
- package/dist/runtime/store/runtime-operation-store.d.ts.map +1 -0
- package/dist/runtime/store/runtime-operation-store.js +57 -0
- package/dist/runtime/store/runtime-operation-store.js.map +1 -0
- package/dist/runtime/store/runtime-schemas.d.ts +2 -2
- package/dist/runtime/types/daemon.d.ts +3 -0
- package/dist/runtime/types/daemon.d.ts.map +1 -1
- package/dist/runtime/types/daemon.js +1 -0
- package/dist/runtime/types/daemon.js.map +1 -1
- package/dist/tools/execution/RunAdapterTool/RunAdapterTool.d.ts.map +1 -1
- package/dist/tools/execution/RunAdapterTool/RunAdapterTool.js +20 -0
- package/dist/tools/execution/RunAdapterTool/RunAdapterTool.js.map +1 -1
- package/dist/tools/execution/SoilDoctorTool/prompt.d.ts +1 -1
- package/dist/tools/execution/SoilDoctorTool/prompt.d.ts.map +1 -1
- package/dist/tools/execution/SoilDoctorTool/prompt.js +1 -1
- package/dist/tools/execution/SoilDoctorTool/prompt.js.map +1 -1
- package/dist/tools/system/EnvTool/EnvTool.d.ts +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,6 +43,10 @@ PulSeed uses two layers:
|
|
|
43
43
|
|
|
44
44
|
State, reports, schedules, and local memory live under `~/.pulseed/`.
|
|
45
45
|
|
|
46
|
+
Security boundary: PulSeed uses approval gates and verification around delegated work,
|
|
47
|
+
but it does not provide OS-level sandboxing for agent subprocesses. For high-risk or
|
|
48
|
+
untrusted goals, run PulSeed inside a container or VM. See [Security](SECURITY.md).
|
|
49
|
+
|
|
46
50
|
## Main Command
|
|
47
51
|
|
|
48
52
|
```bash
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { IAdapter, AgentTask, AgentResult } from "../../orchestrator/execution/adapter-layer.js";
|
|
2
|
+
export interface OpenClawACPConfig {
|
|
3
|
+
/** Path to the openclaw executable. Default: "openclaw" */
|
|
4
|
+
cliPath?: string;
|
|
5
|
+
/** OpenClaw profile to use. Default: "default" */
|
|
6
|
+
profile?: string;
|
|
7
|
+
/** Model override passed to OpenClaw (optional). */
|
|
8
|
+
model?: string;
|
|
9
|
+
/** Working directory for the child process (optional). */
|
|
10
|
+
workDir?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class OpenClawACPAdapter implements IAdapter {
|
|
13
|
+
readonly adapterType = "openclaw_acp";
|
|
14
|
+
readonly capabilities: readonly ["execute_code", "read_files", "write_files", "run_commands", "browse_web", "search"];
|
|
15
|
+
private readonly cliPath;
|
|
16
|
+
private readonly profile;
|
|
17
|
+
private readonly model;
|
|
18
|
+
private readonly workDir;
|
|
19
|
+
private child;
|
|
20
|
+
private sessionKey;
|
|
21
|
+
private requestId;
|
|
22
|
+
constructor(config?: OpenClawACPConfig);
|
|
23
|
+
execute(task: AgentTask): Promise<AgentResult>;
|
|
24
|
+
private spawnProcess;
|
|
25
|
+
/**
|
|
26
|
+
* Write a JSON-RPC request to stdin and wait for the matching response from stdout.
|
|
27
|
+
* Responses are newline-delimited JSON. Skips lines that do not parse or belong to
|
|
28
|
+
* a different request ID.
|
|
29
|
+
*/
|
|
30
|
+
private sendRequest;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=openclaw-acp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-acp.d.ts","sourceRoot":"","sources":["../../../src/adapters/agents/openclaw-acp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AA8BtG,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,QAAQ,CAAC,WAAW,kBAAkB;IACtC,QAAQ,CAAC,YAAY,iGAOV;IAEX,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,GAAE,iBAAsB;IASpC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAyGpD,OAAO,CAAC,YAAY;IAmBpB;;;;OAIG;IACH,OAAO,CAAC,WAAW;CA2EpB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// ─── OpenClawACPAdapter ───
|
|
2
|
+
//
|
|
3
|
+
// IAdapter implementation that drives OpenClaw via the ACP (Agent Communication Protocol).
|
|
4
|
+
// OpenClaw is started as a stdio child process (`openclaw acp`). Messages are exchanged
|
|
5
|
+
// as newline-delimited JSON-RPC 2.0 over stdin/stdout.
|
|
6
|
+
import { spawn } from "node:child_process";
|
|
7
|
+
// ─── Adapter ───
|
|
8
|
+
export class OpenClawACPAdapter {
|
|
9
|
+
adapterType = "openclaw_acp";
|
|
10
|
+
capabilities = [
|
|
11
|
+
"execute_code",
|
|
12
|
+
"read_files",
|
|
13
|
+
"write_files",
|
|
14
|
+
"run_commands",
|
|
15
|
+
"browse_web",
|
|
16
|
+
"search",
|
|
17
|
+
];
|
|
18
|
+
cliPath;
|
|
19
|
+
profile;
|
|
20
|
+
model;
|
|
21
|
+
workDir;
|
|
22
|
+
child = null;
|
|
23
|
+
sessionKey;
|
|
24
|
+
requestId = 0;
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
this.cliPath = config.cliPath ?? "openclaw";
|
|
27
|
+
this.profile = config.profile ?? "default";
|
|
28
|
+
this.model = config.model;
|
|
29
|
+
this.workDir = config.workDir;
|
|
30
|
+
}
|
|
31
|
+
// ─── IAdapter.execute ───
|
|
32
|
+
async execute(task) {
|
|
33
|
+
const startedAt = Date.now();
|
|
34
|
+
// Ensure the child process is running
|
|
35
|
+
if (!this.child || this.child.exitCode !== null) {
|
|
36
|
+
try {
|
|
37
|
+
this.child = this.spawnProcess();
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const elapsed = Date.now() - startedAt;
|
|
41
|
+
const errMessage = err instanceof Error ? err.message : String(err);
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
output: "",
|
|
45
|
+
error: errMessage,
|
|
46
|
+
exit_code: null,
|
|
47
|
+
elapsed_ms: elapsed,
|
|
48
|
+
stopped_reason: "error",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const requestId = ++this.requestId;
|
|
53
|
+
const request = {
|
|
54
|
+
jsonrpc: "2.0",
|
|
55
|
+
id: requestId,
|
|
56
|
+
method: "message/send",
|
|
57
|
+
params: {
|
|
58
|
+
message: task.prompt,
|
|
59
|
+
...(this.sessionKey ? { sessionKey: this.sessionKey } : {}),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
// Setup timeout via AbortController
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
const timeoutHandle = setTimeout(() => controller.abort(), task.timeout_ms);
|
|
65
|
+
try {
|
|
66
|
+
const response = await this.sendRequest(request, controller.signal);
|
|
67
|
+
clearTimeout(timeoutHandle);
|
|
68
|
+
if (response.error) {
|
|
69
|
+
const elapsed = Date.now() - startedAt;
|
|
70
|
+
return {
|
|
71
|
+
success: false,
|
|
72
|
+
output: "",
|
|
73
|
+
error: `ACP error ${response.error.code}: ${response.error.message}`,
|
|
74
|
+
exit_code: null,
|
|
75
|
+
elapsed_ms: elapsed,
|
|
76
|
+
stopped_reason: "error",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (!response.result) {
|
|
80
|
+
const elapsed = Date.now() - startedAt;
|
|
81
|
+
return {
|
|
82
|
+
success: false,
|
|
83
|
+
output: "",
|
|
84
|
+
error: "ACP response missing result",
|
|
85
|
+
exit_code: null,
|
|
86
|
+
elapsed_ms: elapsed,
|
|
87
|
+
stopped_reason: "error",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Persist the session key for subsequent requests
|
|
91
|
+
this.sessionKey = response.result.sessionKey;
|
|
92
|
+
const elapsed = Date.now() - startedAt;
|
|
93
|
+
return {
|
|
94
|
+
success: true,
|
|
95
|
+
output: response.result.content,
|
|
96
|
+
error: null,
|
|
97
|
+
exit_code: null,
|
|
98
|
+
elapsed_ms: elapsed,
|
|
99
|
+
stopped_reason: "completed",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
clearTimeout(timeoutHandle);
|
|
104
|
+
const elapsed = Date.now() - startedAt;
|
|
105
|
+
const errMessage = err instanceof Error ? err.message : String(err);
|
|
106
|
+
if (controller.signal.aborted) {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
output: "",
|
|
110
|
+
error: `Timed out after ${task.timeout_ms}ms`,
|
|
111
|
+
exit_code: null,
|
|
112
|
+
elapsed_ms: elapsed,
|
|
113
|
+
stopped_reason: "timeout",
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
success: false,
|
|
118
|
+
output: "",
|
|
119
|
+
error: errMessage,
|
|
120
|
+
exit_code: null,
|
|
121
|
+
elapsed_ms: elapsed,
|
|
122
|
+
stopped_reason: "error",
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ─── Private helpers ───
|
|
127
|
+
spawnProcess() {
|
|
128
|
+
const args = ["acp", "--profile", this.profile];
|
|
129
|
+
if (this.model) {
|
|
130
|
+
args.push("--model", this.model);
|
|
131
|
+
}
|
|
132
|
+
const child = spawn(this.cliPath, args, {
|
|
133
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
134
|
+
...(this.workDir !== undefined ? { cwd: this.workDir } : {}),
|
|
135
|
+
});
|
|
136
|
+
// Suppress EPIPE: the spawned process may close stdin before we write
|
|
137
|
+
child.stdin?.on("error", (err) => {
|
|
138
|
+
if (err.code !== "EPIPE")
|
|
139
|
+
throw err;
|
|
140
|
+
});
|
|
141
|
+
return child;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Write a JSON-RPC request to stdin and wait for the matching response from stdout.
|
|
145
|
+
* Responses are newline-delimited JSON. Skips lines that do not parse or belong to
|
|
146
|
+
* a different request ID.
|
|
147
|
+
*/
|
|
148
|
+
sendRequest(request, signal) {
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
if (!this.child) {
|
|
151
|
+
reject(new Error("Child process not available"));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const child = this.child;
|
|
155
|
+
let buffer = "";
|
|
156
|
+
let settled = false;
|
|
157
|
+
const cleanup = () => {
|
|
158
|
+
child.stdout?.removeListener("data", onData);
|
|
159
|
+
child.removeListener("error", onError);
|
|
160
|
+
child.removeListener("close", onClose);
|
|
161
|
+
};
|
|
162
|
+
const settle = (fn) => {
|
|
163
|
+
if (settled)
|
|
164
|
+
return;
|
|
165
|
+
settled = true;
|
|
166
|
+
cleanup();
|
|
167
|
+
fn();
|
|
168
|
+
};
|
|
169
|
+
const onData = (chunk) => {
|
|
170
|
+
buffer += chunk.toString("utf8");
|
|
171
|
+
const lines = buffer.split("\n");
|
|
172
|
+
// Keep incomplete last line in buffer
|
|
173
|
+
buffer = lines.pop() ?? "";
|
|
174
|
+
for (const line of lines) {
|
|
175
|
+
const trimmed = line.trim();
|
|
176
|
+
if (!trimmed)
|
|
177
|
+
continue;
|
|
178
|
+
let parsed;
|
|
179
|
+
try {
|
|
180
|
+
parsed = JSON.parse(trimmed);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Skip non-JSON lines (e.g., startup messages)
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const resp = parsed;
|
|
187
|
+
if (resp.id === request.id) {
|
|
188
|
+
settle(() => resolve(resp));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
const onError = (err) => {
|
|
194
|
+
settle(() => reject(err));
|
|
195
|
+
};
|
|
196
|
+
const onClose = () => {
|
|
197
|
+
settle(() => reject(new Error("OpenClaw process closed unexpectedly")));
|
|
198
|
+
};
|
|
199
|
+
// Abort handling
|
|
200
|
+
signal.addEventListener("abort", () => {
|
|
201
|
+
settle(() => reject(new Error("Aborted")));
|
|
202
|
+
});
|
|
203
|
+
child.stdout?.on("data", onData);
|
|
204
|
+
child.on("error", onError);
|
|
205
|
+
child.on("close", onClose);
|
|
206
|
+
// Send the request
|
|
207
|
+
const line = JSON.stringify(request) + "\n";
|
|
208
|
+
child.stdin?.write(line, "utf8");
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=openclaw-acp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-acp.js","sourceRoot":"","sources":["../../../src/adapters/agents/openclaw-acp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IDataSourceAdapter } from "../../platform/observation/data-source-adapter.js";
|
|
2
|
+
import type { DataSourceType, DataSourceConfig, DataSourceQuery, DataSourceResult } from "../../base/types/data-source.js";
|
|
3
|
+
export interface OpenClawDataSourceConfig {
|
|
4
|
+
sessionDir?: string;
|
|
5
|
+
dimensionMapping?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare class OpenClawDataSourceAdapter implements IDataSourceAdapter {
|
|
8
|
+
readonly sourceType: DataSourceType;
|
|
9
|
+
readonly config: DataSourceConfig;
|
|
10
|
+
private readonly sessionDir;
|
|
11
|
+
constructor(config: DataSourceConfig, opts?: OpenClawDataSourceConfig);
|
|
12
|
+
get sourceId(): string;
|
|
13
|
+
connect(): Promise<void>;
|
|
14
|
+
disconnect(): Promise<void>;
|
|
15
|
+
healthCheck(): Promise<boolean>;
|
|
16
|
+
getSupportedDimensions(): string[];
|
|
17
|
+
query(params: DataSourceQuery): Promise<DataSourceResult>;
|
|
18
|
+
/**
|
|
19
|
+
* List all JSONL files in the session directory.
|
|
20
|
+
* Returns empty array if directory does not exist.
|
|
21
|
+
*/
|
|
22
|
+
private listSessionFiles;
|
|
23
|
+
/**
|
|
24
|
+
* Parse events from a JSONL file, skipping malformed lines.
|
|
25
|
+
*/
|
|
26
|
+
private parseFile;
|
|
27
|
+
/**
|
|
28
|
+
* Aggregate stats across all session files.
|
|
29
|
+
* Only parses files needed for the requested dimension.
|
|
30
|
+
*/
|
|
31
|
+
private aggregate;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=openclaw-datasource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-datasource.d.ts","sourceRoot":"","sources":["../../../src/adapters/datasources/openclaw-datasource.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAC5F,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AAWzC,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAaD,qBAAa,yBAA0B,YAAW,kBAAkB;IAClE,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAY;IAC/C,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,gBAAgB,EAAE,IAAI,GAAE,wBAA6B;IAOzE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAUrC,sBAAsB,IAAI,MAAM,EAAE;IAI5B,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsC/D;;;OAGG;YACW,gBAAgB;IAc9B;;OAEG;YACW,SAAS;IAwBvB;;;OAGG;YACW,SAAS;CAgDxB"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// ─── OpenClawDataSourceAdapter ───
|
|
2
|
+
//
|
|
3
|
+
// IDataSourceAdapter implementation that reads OpenClaw session logs to observe
|
|
4
|
+
// goal progress dimensions.
|
|
5
|
+
//
|
|
6
|
+
// Session logs are JSONL files under ~/.openclaw/sessions/ (configurable).
|
|
7
|
+
// Each line is a JSON event with a "type" field.
|
|
8
|
+
//
|
|
9
|
+
// Supported dimension_name values:
|
|
10
|
+
// "session_count" — number of JSONL session files found
|
|
11
|
+
// "last_session_status" — status string from the last event of the most recent file
|
|
12
|
+
// "total_messages" — total message events across all sessions
|
|
13
|
+
// "tool_call_count" — total tool_call events across all sessions
|
|
14
|
+
// "error_count" — total error events across all sessions
|
|
15
|
+
//
|
|
16
|
+
// dimension_mapping is supported: keys map query dimension names to internal ones.
|
|
17
|
+
import * as fsp from "node:fs/promises";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import * as os from "node:os";
|
|
20
|
+
// Known dimensions this adapter supports
|
|
21
|
+
const KNOWN_DIMENSIONS = new Set([
|
|
22
|
+
"session_count",
|
|
23
|
+
"last_session_status",
|
|
24
|
+
"total_messages",
|
|
25
|
+
"tool_call_count",
|
|
26
|
+
"error_count",
|
|
27
|
+
]);
|
|
28
|
+
// ─── Adapter ───
|
|
29
|
+
export class OpenClawDataSourceAdapter {
|
|
30
|
+
sourceType = "custom";
|
|
31
|
+
config;
|
|
32
|
+
sessionDir;
|
|
33
|
+
constructor(config, opts = {}) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.sessionDir =
|
|
36
|
+
opts.sessionDir ??
|
|
37
|
+
(config.connection.path || path.join(os.homedir(), ".openclaw", "sessions"));
|
|
38
|
+
}
|
|
39
|
+
get sourceId() {
|
|
40
|
+
return this.config.id;
|
|
41
|
+
}
|
|
42
|
+
async connect() {
|
|
43
|
+
// no persistent connection — directory checked at query time
|
|
44
|
+
}
|
|
45
|
+
async disconnect() {
|
|
46
|
+
// no-op
|
|
47
|
+
}
|
|
48
|
+
async healthCheck() {
|
|
49
|
+
try {
|
|
50
|
+
await fsp.access(this.sessionDir);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Directory missing is not fatal — we return zero values instead
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
getSupportedDimensions() {
|
|
59
|
+
return Array.from(KNOWN_DIMENSIONS);
|
|
60
|
+
}
|
|
61
|
+
async query(params) {
|
|
62
|
+
// Resolve dimension via mapping
|
|
63
|
+
const dimMapping = this.config.dimension_mapping ?? {};
|
|
64
|
+
const rawDim = params.expression ?? params.dimension_name;
|
|
65
|
+
const dimension = dimMapping[rawDim] ?? rawDim;
|
|
66
|
+
if (!KNOWN_DIMENSIONS.has(dimension)) {
|
|
67
|
+
return {
|
|
68
|
+
value: null,
|
|
69
|
+
raw: null,
|
|
70
|
+
timestamp: new Date().toISOString(),
|
|
71
|
+
source_id: this.sourceId,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Read session files
|
|
75
|
+
const files = await this.listSessionFiles();
|
|
76
|
+
// Aggregate
|
|
77
|
+
const stats = await this.aggregate(files, dimension);
|
|
78
|
+
const value = dimension === "last_session_status"
|
|
79
|
+
? (stats.lastSessionStatus ?? null)
|
|
80
|
+
: stats[dimension];
|
|
81
|
+
return {
|
|
82
|
+
value,
|
|
83
|
+
raw: { session_files: files.length, dimension, stats },
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
source_id: this.sourceId,
|
|
86
|
+
metadata: stats,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ─── Private helpers ───
|
|
90
|
+
/**
|
|
91
|
+
* List all JSONL files in the session directory.
|
|
92
|
+
* Returns empty array if directory does not exist.
|
|
93
|
+
*/
|
|
94
|
+
async listSessionFiles() {
|
|
95
|
+
let entries;
|
|
96
|
+
try {
|
|
97
|
+
entries = await fsp.readdir(this.sessionDir);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
return entries
|
|
103
|
+
.filter((f) => f.endsWith(".jsonl") || f.endsWith(".json"))
|
|
104
|
+
.map((f) => path.join(this.sessionDir, f))
|
|
105
|
+
.sort(); // stable order; last file = most recent
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Parse events from a JSONL file, skipping malformed lines.
|
|
109
|
+
*/
|
|
110
|
+
async parseFile(filePath) {
|
|
111
|
+
let content;
|
|
112
|
+
try {
|
|
113
|
+
content = await fsp.readFile(filePath, "utf-8");
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const events = [];
|
|
119
|
+
for (const line of content.split("\n")) {
|
|
120
|
+
const trimmed = line.trim();
|
|
121
|
+
if (!trimmed)
|
|
122
|
+
continue;
|
|
123
|
+
try {
|
|
124
|
+
const parsed = JSON.parse(trimmed);
|
|
125
|
+
if (typeof parsed === "object" && parsed !== null && "type" in parsed) {
|
|
126
|
+
events.push(parsed);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Skip malformed lines
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return events;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Aggregate stats across all session files.
|
|
137
|
+
* Only parses files needed for the requested dimension.
|
|
138
|
+
*/
|
|
139
|
+
async aggregate(files, dimension) {
|
|
140
|
+
const stats = {
|
|
141
|
+
session_count: files.length,
|
|
142
|
+
total_messages: 0,
|
|
143
|
+
tool_call_count: 0,
|
|
144
|
+
error_count: 0,
|
|
145
|
+
lastSessionStatus: null,
|
|
146
|
+
};
|
|
147
|
+
// If only session_count is needed, no file parsing required
|
|
148
|
+
if (dimension === "session_count")
|
|
149
|
+
return stats;
|
|
150
|
+
for (let i = 0; i < files.length; i++) {
|
|
151
|
+
const events = await this.parseFile(files[i]);
|
|
152
|
+
if (dimension === "total_messages" ||
|
|
153
|
+
dimension === "tool_call_count" ||
|
|
154
|
+
dimension === "error_count") {
|
|
155
|
+
for (const ev of events) {
|
|
156
|
+
if (ev.type === "message")
|
|
157
|
+
stats.total_messages++;
|
|
158
|
+
if (ev.type === "tool_call")
|
|
159
|
+
stats.tool_call_count++;
|
|
160
|
+
if (ev.type === "error")
|
|
161
|
+
stats.error_count++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// last_session_status: last event of the last file
|
|
165
|
+
if (dimension === "last_session_status" && i === files.length - 1) {
|
|
166
|
+
const lastEvent = events[events.length - 1];
|
|
167
|
+
if (lastEvent) {
|
|
168
|
+
stats.lastSessionStatus =
|
|
169
|
+
lastEvent.status ?? lastEvent.type ?? null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return stats;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=openclaw-datasource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-datasource.js","sourceRoot":"","sources":["../../../src/adapters/datasources/openclaw-datasource.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-goal advisory locking using lockfiles.
|
|
3
|
-
* Lock path: <baseDir>/goals/<goalId
|
|
3
|
+
* Lock path: <baseDir>/locks/goals/<goalId>.lock/
|
|
4
|
+
* Transition compatibility: also acquire <baseDir>/goals/<goalId>/.lock
|
|
5
|
+
* when the legacy goal directory already exists.
|
|
4
6
|
* Uses mkdir as atomic primitive (POSIX: EEXIST = lock held).
|
|
5
7
|
*/
|
|
6
8
|
export interface LockOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-lock.d.ts","sourceRoot":"","sources":["../../../src/base/state/state-lock.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"state-lock.d.ts","sourceRoot":"","sources":["../../../src/base/state/state-lock.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsHD,iFAAiF;AACjF,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF"}
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import * as fsp from "node:fs/promises";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
function lockPath(goalId, baseDir) {
|
|
4
|
+
return path.join(baseDir, "locks", "goals", `${goalId}.lock`);
|
|
5
|
+
}
|
|
6
|
+
function legacyLockPath(goalId, baseDir) {
|
|
4
7
|
return path.join(baseDir, "goals", goalId, ".lock");
|
|
5
8
|
}
|
|
6
9
|
function pidFilePath(lockDir) {
|
|
7
10
|
return path.join(lockDir, "pid");
|
|
8
11
|
}
|
|
12
|
+
async function pathExists(dir) {
|
|
13
|
+
try {
|
|
14
|
+
await fsp.access(dir);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (err.code === "ENOENT")
|
|
19
|
+
return false;
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
9
23
|
async function isProcessAlive(pid) {
|
|
10
24
|
try {
|
|
11
25
|
process.kill(pid, 0);
|
|
@@ -55,14 +69,13 @@ async function clearStaleLock(lockDir) {
|
|
|
55
69
|
// If we cannot read pid, leave the lock intact
|
|
56
70
|
}
|
|
57
71
|
}
|
|
58
|
-
|
|
59
|
-
export async function acquireLock(goalId, baseDir, opts) {
|
|
72
|
+
async function acquireLockDir(lockDir, label, opts, createParent = true) {
|
|
60
73
|
const maxRetries = opts?.maxRetries ?? 5;
|
|
61
74
|
const initialDelayMs = opts?.initialDelayMs ?? 50;
|
|
62
75
|
const maxTotalMs = opts?.maxTotalMs ?? 500;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
if (createParent) {
|
|
77
|
+
await fsp.mkdir(path.dirname(lockDir), { recursive: true });
|
|
78
|
+
}
|
|
66
79
|
const start = Date.now();
|
|
67
80
|
let delay = initialDelayMs;
|
|
68
81
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
@@ -70,16 +83,14 @@ export async function acquireLock(goalId, baseDir, opts) {
|
|
|
70
83
|
return;
|
|
71
84
|
}
|
|
72
85
|
if (Date.now() - start >= maxTotalMs) {
|
|
73
|
-
throw new Error(`acquireLock: timeout exceeded for
|
|
86
|
+
throw new Error(`acquireLock: timeout exceeded for "${label}" after ${maxTotalMs}ms`);
|
|
74
87
|
}
|
|
75
88
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
76
89
|
delay = Math.min(delay * 2, maxTotalMs);
|
|
77
90
|
}
|
|
78
|
-
throw new Error(`acquireLock: max retries exceeded for
|
|
91
|
+
throw new Error(`acquireLock: max retries exceeded for "${label}"`);
|
|
79
92
|
}
|
|
80
|
-
|
|
81
|
-
export async function releaseLock(goalId, baseDir) {
|
|
82
|
-
const lockDir = lockPath(goalId, baseDir);
|
|
93
|
+
async function releaseLockDir(lockDir) {
|
|
83
94
|
try {
|
|
84
95
|
await fsp.rm(lockDir, { recursive: true, force: true });
|
|
85
96
|
}
|
|
@@ -89,4 +100,35 @@ export async function releaseLock(goalId, baseDir) {
|
|
|
89
100
|
throw err;
|
|
90
101
|
}
|
|
91
102
|
}
|
|
103
|
+
async function shouldAcquireLegacyLock(goalId, baseDir) {
|
|
104
|
+
return pathExists(path.join(baseDir, "goals", goalId));
|
|
105
|
+
}
|
|
106
|
+
/** Acquire an advisory lock for the given goalId. Throws if timeout exceeded. */
|
|
107
|
+
export async function acquireLock(goalId, baseDir, opts) {
|
|
108
|
+
const legacyLockDir = legacyLockPath(goalId, baseDir);
|
|
109
|
+
const needsLegacyLock = await shouldAcquireLegacyLock(goalId, baseDir);
|
|
110
|
+
if (needsLegacyLock) {
|
|
111
|
+
try {
|
|
112
|
+
await acquireLockDir(legacyLockDir, `${goalId} legacy`, opts, false);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
if (err.code !== "ENOENT")
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const stableLockDir = lockPath(goalId, baseDir);
|
|
120
|
+
try {
|
|
121
|
+
await acquireLockDir(stableLockDir, goalId, opts);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (needsLegacyLock)
|
|
125
|
+
await releaseLockDir(legacyLockDir);
|
|
126
|
+
throw err;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Release the advisory lock for the given goalId. No-op if lock does not exist. */
|
|
130
|
+
export async function releaseLock(goalId, baseDir) {
|
|
131
|
+
await releaseLockDir(lockPath(goalId, baseDir));
|
|
132
|
+
await releaseLockDir(legacyLockPath(goalId, baseDir));
|
|
133
|
+
}
|
|
92
134
|
//# sourceMappingURL=state-lock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-lock.js","sourceRoot":"","sources":["../../../src/base/state/state-lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"state-lock.js","sourceRoot":"","sources":["../../../src/base/state/state-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,5 +18,9 @@ export declare class GoalWriteCoordinator {
|
|
|
18
18
|
goalDir(goalId: string): Promise<string>;
|
|
19
19
|
/** Wrap a goal write with lock + WAL + snapshot cycle. */
|
|
20
20
|
protectedWrite(goalId: string, op: string, data: unknown, writeFn: () => Promise<void>): Promise<void>;
|
|
21
|
+
/** Wrap a goal-scoped operation with lock + fence only (no WAL). */
|
|
22
|
+
protectedOperation(goalId: string, op: string, data: unknown, run: () => Promise<void>): Promise<void>;
|
|
23
|
+
/** Wrap a locked read-modify-write cycle with lock + WAL + snapshot cycle. */
|
|
24
|
+
protectedReadModifyWrite<TData>(goalId: string, op: string, buildData: () => Promise<TData>, writeFn: (data: TData) => Promise<void>): Promise<void>;
|
|
21
25
|
}
|
|
22
26
|
//# sourceMappingURL=state-manager-goal-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-manager-goal-write.d.ts","sourceRoot":"","sources":["../../../src/base/state/state-manager-goal-write.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAElF,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;gBAEtD,OAAO,EAAE,2BAA2B;IAMhD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI;IAI3D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9C,0DAA0D;IACpD,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"state-manager-goal-write.d.ts","sourceRoot":"","sources":["../../../src/base/state/state-manager-goal-write.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAElF,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;gBAEtD,OAAO,EAAE,2BAA2B;IAMhD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI;IAI3D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9C,0DAA0D;IACpD,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC;IA4BhB,oEAAoE;IAC9D,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC;IAUhB,8EAA8E;IACxE,wBAAwB,CAAC,KAAK,EAClC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;CA4BjB"}
|