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.
Files changed (275) hide show
  1. package/README.md +4 -0
  2. package/dist/adapters/agents/openclaw-acp.d.ts +32 -0
  3. package/dist/adapters/agents/openclaw-acp.d.ts.map +1 -0
  4. package/dist/adapters/agents/openclaw-acp.js +212 -0
  5. package/dist/adapters/agents/openclaw-acp.js.map +1 -0
  6. package/dist/adapters/datasources/openclaw-datasource.d.ts +33 -0
  7. package/dist/adapters/datasources/openclaw-datasource.d.ts.map +1 -0
  8. package/dist/adapters/datasources/openclaw-datasource.js +176 -0
  9. package/dist/adapters/datasources/openclaw-datasource.js.map +1 -0
  10. package/dist/base/state/state-lock.d.ts +3 -1
  11. package/dist/base/state/state-lock.d.ts.map +1 -1
  12. package/dist/base/state/state-lock.js +52 -10
  13. package/dist/base/state/state-lock.js.map +1 -1
  14. package/dist/base/state/state-manager-goal-write.d.ts +4 -0
  15. package/dist/base/state/state-manager-goal-write.d.ts.map +1 -1
  16. package/dist/base/state/state-manager-goal-write.js +45 -3
  17. package/dist/base/state/state-manager-goal-write.js.map +1 -1
  18. package/dist/base/state/state-manager-wal.d.ts.map +1 -1
  19. package/dist/base/state/state-manager-wal.js +12 -0
  20. package/dist/base/state/state-manager-wal.js.map +1 -1
  21. package/dist/base/state/state-manager.d.ts +1 -1
  22. package/dist/base/state/state-manager.d.ts.map +1 -1
  23. package/dist/base/state/state-manager.js +129 -88
  24. package/dist/base/state/state-manager.js.map +1 -1
  25. package/dist/index.d.ts +6 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/interface/chat/chat-event-state.d.ts.map +1 -1
  30. package/dist/interface/chat/chat-event-state.js +12 -24
  31. package/dist/interface/chat/chat-event-state.js.map +1 -1
  32. package/dist/interface/chat/chat-events.d.ts +9 -1
  33. package/dist/interface/chat/chat-events.d.ts.map +1 -1
  34. package/dist/interface/chat/chat-runner.d.ts +19 -0
  35. package/dist/interface/chat/chat-runner.d.ts.map +1 -1
  36. package/dist/interface/chat/chat-runner.js +101 -5
  37. package/dist/interface/chat/chat-runner.js.map +1 -1
  38. package/dist/interface/chat/cross-platform-session.d.ts.map +1 -1
  39. package/dist/interface/chat/cross-platform-session.js +36 -0
  40. package/dist/interface/chat/cross-platform-session.js.map +1 -1
  41. package/dist/interface/cli/commands/chat.d.ts.map +1 -1
  42. package/dist/interface/cli/commands/chat.js +9 -0
  43. package/dist/interface/cli/commands/chat.js.map +1 -1
  44. package/dist/interface/cli/commands/daemon.d.ts.map +1 -1
  45. package/dist/interface/cli/commands/daemon.js +14 -0
  46. package/dist/interface/cli/commands/daemon.js.map +1 -1
  47. package/dist/interface/cli/commands/doctor.d.ts +3 -0
  48. package/dist/interface/cli/commands/doctor.d.ts.map +1 -1
  49. package/dist/interface/cli/commands/doctor.js +136 -1
  50. package/dist/interface/cli/commands/doctor.js.map +1 -1
  51. package/dist/interface/cli/commands/setup/import/apply.d.ts +3 -0
  52. package/dist/interface/cli/commands/setup/import/apply.d.ts.map +1 -0
  53. package/dist/interface/cli/commands/setup/import/apply.js +140 -0
  54. package/dist/interface/cli/commands/setup/import/apply.js.map +1 -0
  55. package/dist/interface/cli/commands/setup/import/constants.d.ts +5 -0
  56. package/dist/interface/cli/commands/setup/import/constants.d.ts.map +1 -0
  57. package/dist/interface/cli/commands/setup/import/constants.js +19 -0
  58. package/dist/interface/cli/commands/setup/import/constants.js.map +1 -0
  59. package/dist/interface/cli/commands/setup/import/discovery.d.ts +3 -0
  60. package/dist/interface/cli/commands/setup/import/discovery.d.ts.map +1 -0
  61. package/dist/interface/cli/commands/setup/import/discovery.js +140 -0
  62. package/dist/interface/cli/commands/setup/import/discovery.js.map +1 -0
  63. package/dist/interface/cli/commands/setup/import/flow.d.ts +5 -0
  64. package/dist/interface/cli/commands/setup/import/flow.d.ts.map +1 -0
  65. package/dist/interface/cli/commands/setup/import/flow.js +138 -0
  66. package/dist/interface/cli/commands/setup/import/flow.js.map +1 -0
  67. package/dist/interface/cli/commands/setup/import/fs-utils.d.ts +9 -0
  68. package/dist/interface/cli/commands/setup/import/fs-utils.d.ts.map +1 -0
  69. package/dist/interface/cli/commands/setup/import/fs-utils.js +83 -0
  70. package/dist/interface/cli/commands/setup/import/fs-utils.js.map +1 -0
  71. package/dist/interface/cli/commands/setup/import/mcp.d.ts +4 -0
  72. package/dist/interface/cli/commands/setup/import/mcp.d.ts.map +1 -0
  73. package/dist/interface/cli/commands/setup/import/mcp.js +71 -0
  74. package/dist/interface/cli/commands/setup/import/mcp.js.map +1 -0
  75. package/dist/interface/cli/commands/setup/import/parse.d.ts +7 -0
  76. package/dist/interface/cli/commands/setup/import/parse.d.ts.map +1 -0
  77. package/dist/interface/cli/commands/setup/import/parse.js +40 -0
  78. package/dist/interface/cli/commands/setup/import/parse.js.map +1 -0
  79. package/dist/interface/cli/commands/setup/import/provider.d.ts +4 -0
  80. package/dist/interface/cli/commands/setup/import/provider.d.ts.map +1 -0
  81. package/dist/interface/cli/commands/setup/import/provider.js +142 -0
  82. package/dist/interface/cli/commands/setup/import/provider.js.map +1 -0
  83. package/dist/interface/cli/commands/setup/import/types.d.ts +53 -0
  84. package/dist/interface/cli/commands/setup/import/types.d.ts.map +1 -0
  85. package/dist/interface/cli/commands/setup/import/types.js +2 -0
  86. package/dist/interface/cli/commands/setup/import/types.js.map +1 -0
  87. package/dist/interface/cli/commands/setup/steps-adapter.d.ts +1 -1
  88. package/dist/interface/cli/commands/setup/steps-adapter.d.ts.map +1 -1
  89. package/dist/interface/cli/commands/setup/steps-adapter.js +32 -5
  90. package/dist/interface/cli/commands/setup/steps-adapter.js.map +1 -1
  91. package/dist/interface/cli/commands/setup/steps-identity.d.ts +2 -2
  92. package/dist/interface/cli/commands/setup/steps-identity.d.ts.map +1 -1
  93. package/dist/interface/cli/commands/setup/steps-identity.js +10 -4
  94. package/dist/interface/cli/commands/setup/steps-identity.js.map +1 -1
  95. package/dist/interface/cli/commands/setup/steps-provider.d.ts +4 -4
  96. package/dist/interface/cli/commands/setup/steps-provider.d.ts.map +1 -1
  97. package/dist/interface/cli/commands/setup/steps-provider.js +58 -10
  98. package/dist/interface/cli/commands/setup/steps-provider.js.map +1 -1
  99. package/dist/interface/cli/commands/setup/steps-runtime.d.ts.map +1 -1
  100. package/dist/interface/cli/commands/setup/steps-runtime.js +2 -3
  101. package/dist/interface/cli/commands/setup/steps-runtime.js.map +1 -1
  102. package/dist/interface/cli/commands/setup-wizard.d.ts.map +1 -1
  103. package/dist/interface/cli/commands/setup-wizard.js +309 -62
  104. package/dist/interface/cli/commands/setup-wizard.js.map +1 -1
  105. package/dist/interface/cli/setup.d.ts.map +1 -1
  106. package/dist/interface/cli/setup.js +1 -1
  107. package/dist/interface/cli/setup.js.map +1 -1
  108. package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.d.ts +1 -0
  109. package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.d.ts.map +1 -1
  110. package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.js +91 -1
  111. package/dist/orchestrator/execution/agent-loop/agent-loop-session-state.js.map +1 -1
  112. package/dist/orchestrator/execution/pipeline-executor.d.ts +1 -0
  113. package/dist/orchestrator/execution/pipeline-executor.d.ts.map +1 -1
  114. package/dist/orchestrator/execution/pipeline-executor.js +39 -8
  115. package/dist/orchestrator/execution/pipeline-executor.js.map +1 -1
  116. package/dist/orchestrator/execution/result-reconciler.d.ts.map +1 -1
  117. package/dist/orchestrator/execution/result-reconciler.js +79 -54
  118. package/dist/orchestrator/execution/result-reconciler.js.map +1 -1
  119. package/dist/orchestrator/execution/task/task-execution-helpers.d.ts +2 -1
  120. package/dist/orchestrator/execution/task/task-execution-helpers.d.ts.map +1 -1
  121. package/dist/orchestrator/execution/task/task-execution-helpers.js +11 -1
  122. package/dist/orchestrator/execution/task/task-execution-helpers.js.map +1 -1
  123. package/dist/orchestrator/execution/task/task-lifecycle.d.ts +1 -1
  124. package/dist/orchestrator/execution/task/task-lifecycle.d.ts.map +1 -1
  125. package/dist/orchestrator/execution/task/task-lifecycle.js +33 -0
  126. package/dist/orchestrator/execution/task/task-lifecycle.js.map +1 -1
  127. package/dist/orchestrator/goal/goal-dependency-graph.d.ts.map +1 -1
  128. package/dist/orchestrator/goal/goal-dependency-graph.js +20 -8
  129. package/dist/orchestrator/goal/goal-dependency-graph.js.map +1 -1
  130. package/dist/orchestrator/goal/goal-refiner.d.ts +3 -5
  131. package/dist/orchestrator/goal/goal-refiner.d.ts.map +1 -1
  132. package/dist/orchestrator/goal/goal-refiner.js +3 -5
  133. package/dist/orchestrator/goal/goal-refiner.js.map +1 -1
  134. package/dist/orchestrator/knowledge/memory/memory-lifecycle.d.ts +2 -0
  135. package/dist/orchestrator/knowledge/memory/memory-lifecycle.d.ts.map +1 -0
  136. package/dist/orchestrator/knowledge/memory/memory-lifecycle.js +2 -0
  137. package/dist/orchestrator/knowledge/memory/memory-lifecycle.js.map +1 -0
  138. package/dist/orchestrator/strategy/cross-goal-portfolio.d.ts.map +1 -1
  139. package/dist/orchestrator/strategy/cross-goal-portfolio.js +20 -12
  140. package/dist/orchestrator/strategy/cross-goal-portfolio.js.map +1 -1
  141. package/dist/orchestrator/strategy/portfolio-manager.d.ts.map +1 -1
  142. package/dist/orchestrator/strategy/portfolio-manager.js +8 -4
  143. package/dist/orchestrator/strategy/portfolio-manager.js.map +1 -1
  144. package/dist/orchestrator/strategy/strategy-manager-base.d.ts.map +1 -1
  145. package/dist/orchestrator/strategy/strategy-manager-base.js +29 -24
  146. package/dist/orchestrator/strategy/strategy-manager-base.js.map +1 -1
  147. package/dist/platform/dream/dream-soil-sync.d.ts +2 -0
  148. package/dist/platform/dream/dream-soil-sync.d.ts.map +1 -1
  149. package/dist/platform/dream/dream-soil-sync.js +19 -0
  150. package/dist/platform/dream/dream-soil-sync.js.map +1 -1
  151. package/dist/platform/drive/satisficing-judge.d.ts.map +1 -1
  152. package/dist/platform/drive/satisficing-judge.js +20 -6
  153. package/dist/platform/drive/satisficing-judge.js.map +1 -1
  154. package/dist/platform/knowledge/knowledge-manager-lint.d.ts.map +1 -1
  155. package/dist/platform/knowledge/knowledge-manager-lint.js +4 -3
  156. package/dist/platform/knowledge/knowledge-manager-lint.js.map +1 -1
  157. package/dist/platform/knowledge/knowledge-manager.d.ts.map +1 -1
  158. package/dist/platform/knowledge/knowledge-manager.js +2 -1
  159. package/dist/platform/knowledge/knowledge-manager.js.map +1 -1
  160. package/dist/platform/knowledge/knowledge-search.d.ts.map +1 -1
  161. package/dist/platform/knowledge/knowledge-search.js +15 -3
  162. package/dist/platform/knowledge/knowledge-search.js.map +1 -1
  163. package/dist/platform/knowledge/learning/learning-cross-goal.d.ts.map +1 -1
  164. package/dist/platform/knowledge/learning/learning-cross-goal.js +9 -5
  165. package/dist/platform/knowledge/learning/learning-cross-goal.js.map +1 -1
  166. package/dist/platform/observation/observation-apply.d.ts.map +1 -1
  167. package/dist/platform/observation/observation-apply.js +93 -99
  168. package/dist/platform/observation/observation-apply.js.map +1 -1
  169. package/dist/platform/soil/compiled-memory-projections.d.ts +12 -0
  170. package/dist/platform/soil/compiled-memory-projections.d.ts.map +1 -0
  171. package/dist/platform/soil/compiled-memory-projections.js +238 -0
  172. package/dist/platform/soil/compiled-memory-projections.js.map +1 -0
  173. package/dist/platform/soil/content-projections.d.ts +3 -7
  174. package/dist/platform/soil/content-projections.d.ts.map +1 -1
  175. package/dist/platform/soil/content-projections.js +67 -105
  176. package/dist/platform/soil/content-projections.js.map +1 -1
  177. package/dist/platform/soil/context-compiler.d.ts +34 -0
  178. package/dist/platform/soil/context-compiler.d.ts.map +1 -0
  179. package/dist/platform/soil/context-compiler.js +298 -0
  180. package/dist/platform/soil/context-compiler.js.map +1 -0
  181. package/dist/platform/soil/context-evaluation.d.ts +63 -0
  182. package/dist/platform/soil/context-evaluation.d.ts.map +1 -0
  183. package/dist/platform/soil/context-evaluation.js +90 -0
  184. package/dist/platform/soil/context-evaluation.js.map +1 -0
  185. package/dist/platform/soil/contracts.d.ts +269 -30
  186. package/dist/platform/soil/contracts.d.ts.map +1 -1
  187. package/dist/platform/soil/contracts.js +87 -0
  188. package/dist/platform/soil/contracts.js.map +1 -1
  189. package/dist/platform/soil/doctor.d.ts +5 -1
  190. package/dist/platform/soil/doctor.d.ts.map +1 -1
  191. package/dist/platform/soil/doctor.js +94 -1
  192. package/dist/platform/soil/doctor.js.map +1 -1
  193. package/dist/platform/soil/feedback-store.d.ts +10 -0
  194. package/dist/platform/soil/feedback-store.d.ts.map +1 -0
  195. package/dist/platform/soil/feedback-store.js +38 -0
  196. package/dist/platform/soil/feedback-store.js.map +1 -0
  197. package/dist/platform/soil/health.d.ts +35 -0
  198. package/dist/platform/soil/health.d.ts.map +1 -0
  199. package/dist/platform/soil/health.js +126 -0
  200. package/dist/platform/soil/health.js.map +1 -0
  201. package/dist/platform/soil/index-store.d.ts.map +1 -1
  202. package/dist/platform/soil/index-store.js +10 -1
  203. package/dist/platform/soil/index-store.js.map +1 -1
  204. package/dist/platform/soil/index.d.ts +4 -0
  205. package/dist/platform/soil/index.d.ts.map +1 -1
  206. package/dist/platform/soil/index.js +4 -0
  207. package/dist/platform/soil/index.js.map +1 -1
  208. package/dist/platform/soil/projection-support.d.ts +48 -0
  209. package/dist/platform/soil/projection-support.d.ts.map +1 -0
  210. package/dist/platform/soil/projection-support.js +107 -0
  211. package/dist/platform/soil/projection-support.js.map +1 -0
  212. package/dist/platform/soil/runtime-rebuild.d.ts.map +1 -1
  213. package/dist/platform/soil/runtime-rebuild.js +1 -2
  214. package/dist/platform/soil/runtime-rebuild.js.map +1 -1
  215. package/dist/platform/soil/sqlite-repository.d.ts.map +1 -1
  216. package/dist/platform/soil/sqlite-repository.js +51 -15
  217. package/dist/platform/soil/sqlite-repository.js.map +1 -1
  218. package/dist/runtime/command-dispatcher.d.ts +2 -0
  219. package/dist/runtime/command-dispatcher.d.ts.map +1 -1
  220. package/dist/runtime/command-dispatcher.js +11 -0
  221. package/dist/runtime/command-dispatcher.js.map +1 -1
  222. package/dist/runtime/control/daemon-runtime-control-executor.d.ts +13 -0
  223. package/dist/runtime/control/daemon-runtime-control-executor.d.ts.map +1 -0
  224. package/dist/runtime/control/daemon-runtime-control-executor.js +46 -0
  225. package/dist/runtime/control/daemon-runtime-control-executor.js.map +1 -0
  226. package/dist/runtime/control/index.d.ts +7 -0
  227. package/dist/runtime/control/index.d.ts.map +1 -0
  228. package/dist/runtime/control/index.js +4 -0
  229. package/dist/runtime/control/index.js.map +1 -0
  230. package/dist/runtime/control/runtime-control-intent.d.ts +7 -0
  231. package/dist/runtime/control/runtime-control-intent.d.ts.map +1 -0
  232. package/dist/runtime/control/runtime-control-intent.js +31 -0
  233. package/dist/runtime/control/runtime-control-intent.js.map +1 -0
  234. package/dist/runtime/control/runtime-control-service.d.ts +44 -0
  235. package/dist/runtime/control/runtime-control-service.d.ts.map +1 -0
  236. package/dist/runtime/control/runtime-control-service.js +143 -0
  237. package/dist/runtime/control/runtime-control-service.js.map +1 -0
  238. package/dist/runtime/daemon/client.d.ts +4 -0
  239. package/dist/runtime/daemon/client.d.ts.map +1 -1
  240. package/dist/runtime/daemon/client.js +9 -5
  241. package/dist/runtime/daemon/client.js.map +1 -1
  242. package/dist/runtime/daemon/runner.d.ts +2 -0
  243. package/dist/runtime/daemon/runner.d.ts.map +1 -1
  244. package/dist/runtime/daemon/runner.js +72 -1
  245. package/dist/runtime/daemon/runner.js.map +1 -1
  246. package/dist/runtime/event/server.d.ts +1 -0
  247. package/dist/runtime/event/server.d.ts.map +1 -1
  248. package/dist/runtime/event/server.js +36 -0
  249. package/dist/runtime/event/server.js.map +1 -1
  250. package/dist/runtime/store/index.d.ts +3 -0
  251. package/dist/runtime/store/index.d.ts.map +1 -1
  252. package/dist/runtime/store/index.js +2 -0
  253. package/dist/runtime/store/index.js.map +1 -1
  254. package/dist/runtime/store/runtime-operation-schemas.d.ts +213 -0
  255. package/dist/runtime/store/runtime-operation-schemas.d.ts.map +1 -0
  256. package/dist/runtime/store/runtime-operation-schemas.js +62 -0
  257. package/dist/runtime/store/runtime-operation-schemas.js.map +1 -0
  258. package/dist/runtime/store/runtime-operation-store.d.ts +17 -0
  259. package/dist/runtime/store/runtime-operation-store.d.ts.map +1 -0
  260. package/dist/runtime/store/runtime-operation-store.js +57 -0
  261. package/dist/runtime/store/runtime-operation-store.js.map +1 -0
  262. package/dist/runtime/store/runtime-schemas.d.ts +2 -2
  263. package/dist/runtime/types/daemon.d.ts +3 -0
  264. package/dist/runtime/types/daemon.d.ts.map +1 -1
  265. package/dist/runtime/types/daemon.js +1 -0
  266. package/dist/runtime/types/daemon.js.map +1 -1
  267. package/dist/tools/execution/RunAdapterTool/RunAdapterTool.d.ts.map +1 -1
  268. package/dist/tools/execution/RunAdapterTool/RunAdapterTool.js +20 -0
  269. package/dist/tools/execution/RunAdapterTool/RunAdapterTool.js.map +1 -1
  270. package/dist/tools/execution/SoilDoctorTool/prompt.d.ts +1 -1
  271. package/dist/tools/execution/SoilDoctorTool/prompt.d.ts.map +1 -1
  272. package/dist/tools/execution/SoilDoctorTool/prompt.js +1 -1
  273. package/dist/tools/execution/SoilDoctorTool/prompt.js.map +1 -1
  274. package/dist/tools/system/EnvTool/EnvTool.d.ts +4 -4
  275. 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>/.lock/
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;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0DD,iFAAiF;AACjF,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhF"}
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
- /** Acquire an advisory lock for the given goalId. Throws if timeout exceeded. */
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
- const lockDir = lockPath(goalId, baseDir);
64
- // Ensure parent dir exists
65
- await fsp.mkdir(path.dirname(lockDir), { recursive: true });
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 goal "${goalId}" after ${maxTotalMs}ms`);
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 goal "${goalId}"`);
91
+ throw new Error(`acquireLock: max retries exceeded for "${label}"`);
79
92
  }
80
- /** Release the advisory lock for the given goalId. No-op if lock does not exist. */
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":"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"}
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;CA6BjB"}
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"}