clawvault 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/README.md +422 -141
  2. package/bin/clawvault.js +10 -2
  3. package/bin/command-registration.test.js +3 -1
  4. package/bin/command-runtime.js +9 -1
  5. package/bin/register-core-commands.js +23 -28
  6. package/bin/register-maintenance-commands.js +39 -3
  7. package/bin/register-query-commands.js +58 -29
  8. package/bin/register-tailscale-commands.js +106 -0
  9. package/bin/register-task-commands.js +18 -1
  10. package/bin/register-task-commands.test.js +16 -0
  11. package/bin/register-vault-operations-commands.js +29 -1
  12. package/bin/register-workgraph-commands.js +1368 -0
  13. package/dashboard/lib/graph-diff.js +104 -0
  14. package/dashboard/lib/graph-diff.test.js +75 -0
  15. package/dashboard/lib/vault-parser.js +556 -0
  16. package/dashboard/lib/vault-parser.test.js +254 -0
  17. package/dashboard/public/app.js +796 -0
  18. package/dashboard/public/index.html +52 -0
  19. package/dashboard/public/styles.css +221 -0
  20. package/dashboard/server.js +374 -0
  21. package/dist/{chunk-F2JEUD4J.js → chunk-23YDQ3QU.js} +6 -8
  22. package/dist/{chunk-C7OK5WKP.js → chunk-2JQ3O2YL.js} +4 -4
  23. package/dist/{chunk-VR5NE7PZ.js → chunk-2RAZ4ZFE.js} +1 -1
  24. package/dist/chunk-2ZDO52B4.js +52 -0
  25. package/dist/{chunk-ZZA73MFY.js → chunk-33DOSHTA.js} +176 -36
  26. package/dist/chunk-33VSQP4J.js +37 -0
  27. package/dist/chunk-4BQTQMJP.js +93 -0
  28. package/dist/{chunk-GUKMRGM7.js → chunk-4OXMU5S2.js} +1 -1
  29. package/dist/{chunk-62YTUT6J.js → chunk-4PY655YM.js} +15 -3
  30. package/dist/chunk-6FH3IULF.js +352 -0
  31. package/dist/{chunk-3NSBOUT3.js → chunk-77Q5CSPJ.js} +404 -80
  32. package/dist/{chunk-4VQTUVH7.js → chunk-7YZWHM36.js} +52 -26
  33. package/dist/chunk-BSJ6RIT7.js +447 -0
  34. package/dist/chunk-BUEW6IIK.js +364 -0
  35. package/dist/{chunk-LI4O6NVK.js → chunk-CLJTREDS.js} +74 -14
  36. package/dist/chunk-EK6S23ZB.js +469 -0
  37. package/dist/{chunk-LNJA2UGL.js → chunk-ESFLMDRB.js} +9 -86
  38. package/dist/{chunk-H34S76MB.js → chunk-ESVS6K2B.js} +6 -6
  39. package/dist/{chunk-WAZ3NLWL.js → chunk-F55HGNU4.js} +0 -47
  40. package/dist/{chunk-QK3UCXWL.js → chunk-FHFUXL6G.js} +2 -2
  41. package/dist/{chunk-H62BP7RI.js → chunk-GAOWA7GR.js} +212 -46
  42. package/dist/chunk-GGA32J2R.js +784 -0
  43. package/dist/chunk-GNJL4YGR.js +79 -0
  44. package/dist/chunk-IVRIKYFE.js +520 -0
  45. package/dist/chunk-MDIH26GC.js +183 -0
  46. package/dist/{chunk-LYHGEHXG.js → chunk-MFAWT5O5.js} +0 -1
  47. package/dist/chunk-MM6QGW3P.js +207 -0
  48. package/dist/{chunk-P5EPF6MB.js → chunk-MW5C6ZQA.js} +110 -13
  49. package/dist/chunk-NCKFNBHJ.js +257 -0
  50. package/dist/{chunk-QBLMXKF2.js → chunk-OIWVQYQF.js} +1 -1
  51. package/dist/{chunk-42MXU7A6.js → chunk-P62WHA27.js} +58 -47
  52. package/dist/chunk-PBACDKKP.js +66 -0
  53. package/dist/{chunk-VGLOTGAS.js → chunk-QSHD36LH.js} +2 -2
  54. package/dist/{chunk-OZ7RIXTO.js → chunk-QSRRMEYM.js} +2 -2
  55. package/dist/chunk-QVEERJSP.js +152 -0
  56. package/dist/{chunk-N2AXRYLC.js → chunk-QWQ3TIKS.js} +1 -1
  57. package/dist/{chunk-3DHXQHYG.js → chunk-R2MIW5G7.js} +1 -1
  58. package/dist/{chunk-SJSFRIYS.js → chunk-SLXOR3CC.js} +2 -2
  59. package/dist/chunk-SS4B7P7V.js +99 -0
  60. package/dist/{chunk-JY6FYXIT.js → chunk-STCQGCEQ.js} +6 -11
  61. package/dist/chunk-TIGW564L.js +628 -0
  62. package/dist/chunk-U4O6C46S.js +154 -0
  63. package/dist/{chunk-ITPEXLHA.js → chunk-URXDAUVH.js} +24 -5
  64. package/dist/chunk-VSL7KY3M.js +189 -0
  65. package/dist/{chunk-U55BGUAU.js → chunk-W4SPAEE7.js} +6 -6
  66. package/dist/chunk-WMGIIABP.js +15 -0
  67. package/dist/{chunk-33UGEQRT.js → chunk-X3SPPUFG.js} +151 -64
  68. package/dist/chunk-Y6VJKXGL.js +373 -0
  69. package/dist/{chunk-3WRJEKN4.js → chunk-ZN54U2OZ.js} +123 -10
  70. package/dist/cli/index.js +34 -24
  71. package/dist/commands/archive.js +3 -3
  72. package/dist/commands/backlog.js +3 -3
  73. package/dist/commands/blocked.js +3 -3
  74. package/dist/commands/canvas.d.ts +15 -0
  75. package/dist/commands/canvas.js +200 -0
  76. package/dist/commands/checkpoint.js +2 -2
  77. package/dist/commands/compat.js +2 -2
  78. package/dist/commands/context.js +8 -6
  79. package/dist/commands/doctor.d.ts +11 -7
  80. package/dist/commands/doctor.js +18 -16
  81. package/dist/commands/embed.js +5 -6
  82. package/dist/commands/entities.js +2 -2
  83. package/dist/commands/graph.js +4 -4
  84. package/dist/commands/inject.d.ts +1 -1
  85. package/dist/commands/inject.js +5 -6
  86. package/dist/commands/kanban.js +4 -4
  87. package/dist/commands/link.js +5 -5
  88. package/dist/commands/migrate-observations.js +4 -4
  89. package/dist/commands/observe.d.ts +0 -1
  90. package/dist/commands/observe.js +14 -13
  91. package/dist/commands/project.js +5 -5
  92. package/dist/commands/rebuild-embeddings.d.ts +21 -0
  93. package/dist/commands/rebuild-embeddings.js +91 -0
  94. package/dist/commands/rebuild.js +12 -11
  95. package/dist/commands/recover.js +3 -3
  96. package/dist/commands/reflect.js +6 -7
  97. package/dist/commands/repair-session.js +1 -1
  98. package/dist/commands/replay.js +14 -14
  99. package/dist/commands/session-recap.js +1 -1
  100. package/dist/commands/setup.d.ts +2 -89
  101. package/dist/commands/setup.js +3 -21
  102. package/dist/commands/shell-init.js +1 -1
  103. package/dist/commands/sleep.d.ts +1 -1
  104. package/dist/commands/sleep.js +20 -19
  105. package/dist/commands/status.d.ts +2 -0
  106. package/dist/commands/status.js +57 -35
  107. package/dist/commands/sync-bd.d.ts +10 -0
  108. package/dist/commands/sync-bd.js +10 -0
  109. package/dist/commands/tailscale.d.ts +52 -0
  110. package/dist/commands/tailscale.js +26 -0
  111. package/dist/commands/task.js +4 -4
  112. package/dist/commands/template.js +2 -2
  113. package/dist/commands/wake.d.ts +1 -1
  114. package/dist/commands/wake.js +11 -10
  115. package/dist/commands/workgraph.d.ts +124 -0
  116. package/dist/commands/workgraph.js +38 -0
  117. package/dist/index.d.ts +341 -191
  118. package/dist/index.js +446 -116
  119. package/dist/{inject-Bzi5E-By.d.ts → inject-DYUrDqQO.d.ts} +3 -3
  120. package/dist/ledger-B7g7jhqG.d.ts +44 -0
  121. package/dist/lib/auto-linker.js +2 -2
  122. package/dist/lib/canvas-layout.d.ts +115 -0
  123. package/dist/lib/canvas-layout.js +35 -0
  124. package/dist/lib/config.d.ts +27 -3
  125. package/dist/lib/config.js +4 -2
  126. package/dist/lib/entity-index.js +1 -1
  127. package/dist/lib/project-utils.js +4 -4
  128. package/dist/lib/session-repair.js +1 -1
  129. package/dist/lib/session-utils.js +1 -1
  130. package/dist/lib/tailscale.d.ts +225 -0
  131. package/dist/lib/tailscale.js +50 -0
  132. package/dist/lib/task-utils.js +3 -3
  133. package/dist/lib/template-engine.js +1 -1
  134. package/dist/lib/webdav.d.ts +109 -0
  135. package/dist/lib/webdav.js +35 -0
  136. package/dist/onnxruntime_binding-5QEF3SUC.node +0 -0
  137. package/dist/onnxruntime_binding-BKPKNEGC.node +0 -0
  138. package/dist/onnxruntime_binding-FMOXGIUT.node +0 -0
  139. package/dist/onnxruntime_binding-OI2KMXC5.node +0 -0
  140. package/dist/onnxruntime_binding-UX44MLAZ.node +0 -0
  141. package/dist/onnxruntime_binding-Y2W7N7WY.node +0 -0
  142. package/dist/openclaw-plugin.d.ts +8 -0
  143. package/dist/openclaw-plugin.js +14 -0
  144. package/dist/registry-BR4326o0.d.ts +30 -0
  145. package/dist/store-CA-6sKCJ.d.ts +34 -0
  146. package/dist/thread-B9LhXNU0.d.ts +41 -0
  147. package/dist/transformers.node-A2ZRORSQ.js +46775 -0
  148. package/dist/{types-Y2_Um2Ls.d.ts → types-BbWJoC1c.d.ts} +1 -44
  149. package/dist/workgraph/index.d.ts +5 -0
  150. package/dist/workgraph/index.js +23 -0
  151. package/dist/workgraph/ledger.d.ts +2 -0
  152. package/dist/workgraph/ledger.js +25 -0
  153. package/dist/workgraph/registry.d.ts +2 -0
  154. package/dist/workgraph/registry.js +19 -0
  155. package/dist/workgraph/store.d.ts +2 -0
  156. package/dist/workgraph/store.js +25 -0
  157. package/dist/workgraph/thread.d.ts +2 -0
  158. package/dist/workgraph/thread.js +25 -0
  159. package/dist/workgraph/types.d.ts +54 -0
  160. package/dist/workgraph/types.js +7 -0
  161. package/hooks/clawvault/HOOK.md +113 -0
  162. package/hooks/clawvault/handler.js +1561 -0
  163. package/hooks/clawvault/handler.test.js +510 -0
  164. package/hooks/clawvault/openclaw.plugin.json +72 -0
  165. package/openclaw.plugin.json +65 -38
  166. package/package.json +25 -22
  167. package/dist/chunk-3RG5ZIWI.js +0 -10
  168. package/dist/chunk-3ZIH425O.js +0 -871
  169. package/dist/chunk-6U6MK36V.js +0 -205
  170. package/dist/chunk-CMB7UL7C.js +0 -327
  171. package/dist/chunk-D2H45LON.js +0 -1074
  172. package/dist/chunk-E7MFQB6D.js +0 -163
  173. package/dist/chunk-GQSLDZTS.js +0 -560
  174. package/dist/chunk-MFM6K7PU.js +0 -374
  175. package/dist/chunk-MXSSG3QU.js +0 -42
  176. package/dist/chunk-OCGVIN3L.js +0 -88
  177. package/dist/chunk-PAH27GSN.js +0 -108
  178. package/dist/chunk-YCUNCH2I.js +0 -78
  179. package/dist/cli/index.cjs +0 -8584
  180. package/dist/cli/index.d.cts +0 -5
  181. package/dist/commands/archive.cjs +0 -287
  182. package/dist/commands/archive.d.cts +0 -11
  183. package/dist/commands/backlog.cjs +0 -721
  184. package/dist/commands/backlog.d.cts +0 -53
  185. package/dist/commands/blocked.cjs +0 -204
  186. package/dist/commands/blocked.d.cts +0 -26
  187. package/dist/commands/checkpoint.cjs +0 -244
  188. package/dist/commands/checkpoint.d.cts +0 -41
  189. package/dist/commands/compat.cjs +0 -294
  190. package/dist/commands/compat.d.cts +0 -28
  191. package/dist/commands/context.cjs +0 -2990
  192. package/dist/commands/context.d.cts +0 -2
  193. package/dist/commands/doctor.cjs +0 -2986
  194. package/dist/commands/doctor.d.cts +0 -21
  195. package/dist/commands/embed.cjs +0 -232
  196. package/dist/commands/embed.d.cts +0 -17
  197. package/dist/commands/entities.cjs +0 -141
  198. package/dist/commands/entities.d.cts +0 -7
  199. package/dist/commands/graph.cjs +0 -501
  200. package/dist/commands/graph.d.cts +0 -21
  201. package/dist/commands/inject.cjs +0 -1636
  202. package/dist/commands/inject.d.cts +0 -2
  203. package/dist/commands/kanban.cjs +0 -884
  204. package/dist/commands/kanban.d.cts +0 -63
  205. package/dist/commands/link.cjs +0 -965
  206. package/dist/commands/link.d.cts +0 -11
  207. package/dist/commands/migrate-observations.cjs +0 -362
  208. package/dist/commands/migrate-observations.d.cts +0 -19
  209. package/dist/commands/observe.cjs +0 -4099
  210. package/dist/commands/observe.d.cts +0 -23
  211. package/dist/commands/project.cjs +0 -1341
  212. package/dist/commands/project.d.cts +0 -85
  213. package/dist/commands/rebuild.cjs +0 -3136
  214. package/dist/commands/rebuild.d.cts +0 -11
  215. package/dist/commands/recover.cjs +0 -361
  216. package/dist/commands/recover.d.cts +0 -38
  217. package/dist/commands/reflect.cjs +0 -1008
  218. package/dist/commands/reflect.d.cts +0 -11
  219. package/dist/commands/repair-session.cjs +0 -457
  220. package/dist/commands/repair-session.d.cts +0 -38
  221. package/dist/commands/replay.cjs +0 -4103
  222. package/dist/commands/replay.d.cts +0 -16
  223. package/dist/commands/session-recap.cjs +0 -353
  224. package/dist/commands/session-recap.d.cts +0 -27
  225. package/dist/commands/setup.cjs +0 -1278
  226. package/dist/commands/setup.d.cts +0 -99
  227. package/dist/commands/shell-init.cjs +0 -75
  228. package/dist/commands/shell-init.d.cts +0 -7
  229. package/dist/commands/sleep.cjs +0 -6029
  230. package/dist/commands/sleep.d.cts +0 -36
  231. package/dist/commands/status.cjs +0 -2737
  232. package/dist/commands/status.d.cts +0 -52
  233. package/dist/commands/task.cjs +0 -1236
  234. package/dist/commands/task.d.cts +0 -97
  235. package/dist/commands/template.cjs +0 -457
  236. package/dist/commands/template.d.cts +0 -36
  237. package/dist/commands/wake.cjs +0 -2627
  238. package/dist/commands/wake.d.cts +0 -22
  239. package/dist/context-BUGaWpyL.d.cts +0 -46
  240. package/dist/index.cjs +0 -12373
  241. package/dist/index.d.cts +0 -854
  242. package/dist/inject-Bzi5E-By.d.cts +0 -137
  243. package/dist/lib/auto-linker.cjs +0 -176
  244. package/dist/lib/auto-linker.d.cts +0 -26
  245. package/dist/lib/config.cjs +0 -78
  246. package/dist/lib/config.d.cts +0 -11
  247. package/dist/lib/entity-index.cjs +0 -84
  248. package/dist/lib/entity-index.d.cts +0 -26
  249. package/dist/lib/project-utils.cjs +0 -864
  250. package/dist/lib/project-utils.d.cts +0 -97
  251. package/dist/lib/session-repair.cjs +0 -239
  252. package/dist/lib/session-repair.d.cts +0 -110
  253. package/dist/lib/session-utils.cjs +0 -209
  254. package/dist/lib/session-utils.d.cts +0 -63
  255. package/dist/lib/task-utils.cjs +0 -1137
  256. package/dist/lib/task-utils.d.cts +0 -208
  257. package/dist/lib/template-engine.cjs +0 -47
  258. package/dist/lib/template-engine.d.cts +0 -11
  259. package/dist/plugin/index.cjs +0 -1907
  260. package/dist/plugin/index.d.cts +0 -36
  261. package/dist/plugin/index.d.ts +0 -36
  262. package/dist/plugin/index.js +0 -572
  263. package/dist/plugin/inject.cjs +0 -356
  264. package/dist/plugin/inject.d.cts +0 -54
  265. package/dist/plugin/inject.d.ts +0 -54
  266. package/dist/plugin/inject.js +0 -17
  267. package/dist/plugin/observe.cjs +0 -631
  268. package/dist/plugin/observe.d.cts +0 -39
  269. package/dist/plugin/observe.d.ts +0 -39
  270. package/dist/plugin/observe.js +0 -18
  271. package/dist/plugin/templates.cjs +0 -593
  272. package/dist/plugin/templates.d.cts +0 -52
  273. package/dist/plugin/templates.d.ts +0 -52
  274. package/dist/plugin/templates.js +0 -25
  275. package/dist/plugin/types.cjs +0 -18
  276. package/dist/plugin/types.d.cts +0 -209
  277. package/dist/plugin/types.d.ts +0 -209
  278. package/dist/plugin/types.js +0 -0
  279. package/dist/plugin/vault.cjs +0 -927
  280. package/dist/plugin/vault.d.cts +0 -68
  281. package/dist/plugin/vault.d.ts +0 -68
  282. package/dist/plugin/vault.js +0 -22
  283. package/dist/types-Y2_Um2Ls.d.cts +0 -205
  284. package/templates/memory-event.md +0 -67
  285. package/templates/party.md +0 -63
  286. package/templates/primitive-registry.yaml +0 -551
  287. package/templates/run.md +0 -68
  288. package/templates/trigger.md +0 -68
  289. package/templates/workspace.md +0 -50
@@ -1,11 +0,0 @@
1
- import { Command } from 'commander';
2
-
3
- interface ReflectCommandOptions {
4
- vaultPath?: string;
5
- days?: number;
6
- dryRun?: boolean;
7
- }
8
- declare function reflectCommand(options: ReflectCommandOptions): Promise<void>;
9
- declare function registerReflectCommand(program: Command): void;
10
-
11
- export { type ReflectCommandOptions, reflectCommand, registerReflectCommand };
@@ -1,457 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/commands/repair-session.ts
31
- var repair_session_exports = {};
32
- __export(repair_session_exports, {
33
- formatRepairResult: () => formatRepairResult,
34
- listAgentSessions: () => listAgentSessions,
35
- repairSessionCommand: () => repairSessionCommand,
36
- resolveSession: () => resolveSession
37
- });
38
- module.exports = __toCommonJS(repair_session_exports);
39
- var fs3 = __toESM(require("fs"), 1);
40
-
41
- // src/lib/session-utils.ts
42
- var fs = __toESM(require("fs"), 1);
43
- var path = __toESM(require("path"), 1);
44
- var os = __toESM(require("os"), 1);
45
- function validateEnvPath(envValue) {
46
- if (!envValue) return null;
47
- const trimmed = envValue.trim();
48
- if (!trimmed) return null;
49
- const resolved = path.resolve(trimmed);
50
- if (!path.isAbsolute(resolved)) return null;
51
- return resolved;
52
- }
53
- function getOpenClawDir() {
54
- const customHome = validateEnvPath(process.env.OPENCLAW_HOME);
55
- if (customHome) {
56
- return customHome;
57
- }
58
- return path.join(os.homedir(), ".openclaw");
59
- }
60
- function getOpenClawAgentsDir() {
61
- const stateDir = validateEnvPath(process.env.OPENCLAW_STATE_DIR);
62
- if (stateDir) {
63
- return path.join(stateDir, "agents");
64
- }
65
- return path.join(getOpenClawDir(), "agents");
66
- }
67
- function getSessionsDir(agentId) {
68
- return path.join(getOpenClawAgentsDir(), agentId, "sessions");
69
- }
70
- function getSessionsJsonPath(agentId) {
71
- return path.join(getSessionsDir(agentId), "sessions.json");
72
- }
73
- function getSessionFilePath(agentId, sessionId) {
74
- return path.join(getSessionsDir(agentId), `${sessionId}.jsonl`);
75
- }
76
- function listAgents() {
77
- const agentsDir = getOpenClawAgentsDir();
78
- try {
79
- if (!fs.existsSync(agentsDir)) {
80
- return [];
81
- }
82
- const stat = fs.statSync(agentsDir);
83
- if (!stat.isDirectory()) {
84
- return [];
85
- }
86
- return fs.readdirSync(agentsDir).filter((name) => {
87
- try {
88
- const sessionsDir = getSessionsDir(name);
89
- return fs.existsSync(sessionsDir) && fs.statSync(sessionsDir).isDirectory();
90
- } catch {
91
- return false;
92
- }
93
- });
94
- } catch {
95
- return [];
96
- }
97
- }
98
- function loadSessionsStore(agentId) {
99
- const sessionsJsonPath = getSessionsJsonPath(agentId);
100
- if (!fs.existsSync(sessionsJsonPath)) {
101
- return null;
102
- }
103
- try {
104
- const content = fs.readFileSync(sessionsJsonPath, "utf-8");
105
- return JSON.parse(content);
106
- } catch {
107
- return null;
108
- }
109
- }
110
- function findMainSession(agentId) {
111
- const store = loadSessionsStore(agentId);
112
- if (!store) return null;
113
- const mainKey = `agent:${agentId}:main`;
114
- const entry = store[mainKey];
115
- if (entry?.sessionId) {
116
- const filePath = getSessionFilePath(agentId, entry.sessionId);
117
- if (fs.existsSync(filePath)) {
118
- return {
119
- sessionId: entry.sessionId,
120
- sessionKey: mainKey,
121
- agentId,
122
- filePath,
123
- updatedAt: entry.updatedAt
124
- };
125
- }
126
- }
127
- return null;
128
- }
129
- function findSessionById(agentId, sessionId) {
130
- const filePath = getSessionFilePath(agentId, sessionId);
131
- if (!fs.existsSync(filePath)) {
132
- return null;
133
- }
134
- const store = loadSessionsStore(agentId);
135
- let sessionKey;
136
- let updatedAt;
137
- if (store) {
138
- for (const [key, entry] of Object.entries(store)) {
139
- if (entry.sessionId === sessionId) {
140
- sessionKey = key;
141
- updatedAt = entry.updatedAt;
142
- break;
143
- }
144
- }
145
- }
146
- return {
147
- sessionId,
148
- sessionKey: sessionKey || `agent:${agentId}:unknown`,
149
- agentId,
150
- filePath,
151
- updatedAt
152
- };
153
- }
154
-
155
- // src/lib/session-repair.ts
156
- var fs2 = __toESM(require("fs"), 1);
157
- function parseTranscript(filePath) {
158
- const content = fs2.readFileSync(filePath, "utf-8");
159
- const lines = content.split("\n").filter((line) => line.trim());
160
- const entries = [];
161
- for (let i = 0; i < lines.length; i++) {
162
- const raw = lines[i];
163
- try {
164
- const entry = JSON.parse(raw);
165
- entries.push({ line: i + 1, entry, raw });
166
- } catch {
167
- console.warn(`Warning: Could not parse line ${i + 1}`);
168
- }
169
- }
170
- return entries;
171
- }
172
- function extractToolUses(entries) {
173
- const toolUses = /* @__PURE__ */ new Map();
174
- for (const { line, entry } of entries) {
175
- if (entry.type !== "message") continue;
176
- if (entry.message?.role !== "assistant") continue;
177
- const isAborted = entry.message.stopReason === "aborted";
178
- const content = entry.message.content || [];
179
- for (const block of content) {
180
- if (block.type === "toolCall" || block.type === "tool_use" || block.type === "functionCall") {
181
- if (block.id) {
182
- const isPartial = !!block.partialJson;
183
- toolUses.set(block.id, {
184
- id: block.id,
185
- lineNumber: line,
186
- entryId: entry.id,
187
- isAborted: isAborted || isPartial,
188
- isPartial,
189
- name: block.name
190
- });
191
- }
192
- }
193
- }
194
- }
195
- return toolUses;
196
- }
197
- function findCorruptedEntries(entries, toolUses) {
198
- const corrupted = [];
199
- const entriesToRemove = /* @__PURE__ */ new Set();
200
- for (const [toolId, info] of toolUses) {
201
- if (info.isAborted) {
202
- corrupted.push({
203
- lineNumber: info.lineNumber,
204
- entryId: info.entryId,
205
- type: "aborted_tool_use",
206
- toolUseId: toolId,
207
- description: `Aborted tool_use${info.name ? ` (${info.name})` : ""} with id: ${toolId}`
208
- });
209
- entriesToRemove.add(info.entryId);
210
- }
211
- }
212
- for (const { line, entry } of entries) {
213
- if (entry.type !== "message") continue;
214
- if (entry.message?.role !== "toolResult") continue;
215
- const content = entry.message.content || [];
216
- let toolCallId;
217
- const msg = entry.message;
218
- toolCallId = msg.toolCallId || msg.toolUseId;
219
- if (!toolCallId) {
220
- for (const block of content) {
221
- if (block.toolCallId || block.toolUseId) {
222
- toolCallId = block.toolCallId || block.toolUseId;
223
- break;
224
- }
225
- }
226
- }
227
- if (!toolCallId) continue;
228
- const toolUse = toolUses.get(toolCallId);
229
- if (!toolUse || toolUse.isAborted) {
230
- corrupted.push({
231
- lineNumber: line,
232
- entryId: entry.id,
233
- type: "orphaned_tool_result",
234
- toolUseId: toolCallId,
235
- description: toolUse ? `Orphaned tool_result references aborted tool_use: ${toolCallId}` : `Orphaned tool_result references non-existent tool_use: ${toolCallId}`
236
- });
237
- entriesToRemove.add(entry.id);
238
- }
239
- }
240
- return { corrupted, entriesToRemove };
241
- }
242
- function computeParentRelinks(entries, entriesToRemove) {
243
- const relinks = [];
244
- const entryParents = /* @__PURE__ */ new Map();
245
- for (const { entry } of entries) {
246
- entryParents.set(entry.id, entry.parentId);
247
- }
248
- for (const { line, entry } of entries) {
249
- if (entriesToRemove.has(entry.id)) continue;
250
- if (!entry.parentId) continue;
251
- if (!entriesToRemove.has(entry.parentId)) continue;
252
- let newParentId = entry.parentId;
253
- while (newParentId && entriesToRemove.has(newParentId)) {
254
- newParentId = entryParents.get(newParentId) || null;
255
- }
256
- if (newParentId !== entry.parentId) {
257
- relinks.push({
258
- lineNumber: line,
259
- entryId: entry.id,
260
- oldParentId: entry.parentId,
261
- newParentId: newParentId || "null"
262
- });
263
- }
264
- }
265
- return relinks;
266
- }
267
- function analyzeSession(filePath) {
268
- const entries = parseTranscript(filePath);
269
- const sessionEntry = entries.find((e) => e.entry.type === "session");
270
- const sessionId = sessionEntry?.entry.id || "unknown";
271
- const toolUses = extractToolUses(entries);
272
- const { corrupted, entriesToRemove } = findCorruptedEntries(entries, toolUses);
273
- const parentRelinks = computeParentRelinks(entries, entriesToRemove);
274
- return {
275
- sessionId,
276
- totalLines: entries.length,
277
- corruptedEntries: corrupted,
278
- parentRelinks,
279
- removedCount: entriesToRemove.size,
280
- relinkedCount: parentRelinks.length,
281
- repaired: false
282
- };
283
- }
284
- function repairSession(filePath, options = {}) {
285
- const { backup = true, dryRun = false } = options;
286
- const entries = parseTranscript(filePath);
287
- const sessionEntry = entries.find((e) => e.entry.type === "session");
288
- const sessionId = sessionEntry?.entry.id || "unknown";
289
- const toolUses = extractToolUses(entries);
290
- const { corrupted, entriesToRemove } = findCorruptedEntries(entries, toolUses);
291
- const parentRelinks = computeParentRelinks(entries, entriesToRemove);
292
- if (corrupted.length === 0) {
293
- return {
294
- sessionId,
295
- totalLines: entries.length,
296
- corruptedEntries: [],
297
- parentRelinks: [],
298
- removedCount: 0,
299
- relinkedCount: 0,
300
- repaired: false
301
- };
302
- }
303
- if (dryRun) {
304
- return {
305
- sessionId,
306
- totalLines: entries.length,
307
- corruptedEntries: corrupted,
308
- parentRelinks,
309
- removedCount: entriesToRemove.size,
310
- relinkedCount: parentRelinks.length,
311
- repaired: false
312
- };
313
- }
314
- let backupPath;
315
- if (backup) {
316
- const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "").replace("T", "-").slice(0, 15);
317
- backupPath = `${filePath}.backup-${timestamp}`;
318
- fs2.copyFileSync(filePath, backupPath);
319
- }
320
- const relinkMap = /* @__PURE__ */ new Map();
321
- for (const relink of parentRelinks) {
322
- relinkMap.set(relink.entryId, relink.newParentId === "null" ? null : relink.newParentId);
323
- }
324
- const repairedLines = [];
325
- for (const { entry, raw } of entries) {
326
- if (entriesToRemove.has(entry.id)) continue;
327
- if (relinkMap.has(entry.id)) {
328
- const newEntry = { ...entry, parentId: relinkMap.get(entry.id) };
329
- repairedLines.push(JSON.stringify(newEntry));
330
- } else {
331
- repairedLines.push(raw);
332
- }
333
- }
334
- fs2.writeFileSync(filePath, repairedLines.join("\n") + "\n");
335
- return {
336
- sessionId,
337
- totalLines: entries.length,
338
- corruptedEntries: corrupted,
339
- parentRelinks,
340
- removedCount: entriesToRemove.size,
341
- relinkedCount: parentRelinks.length,
342
- backupPath,
343
- repaired: true
344
- };
345
- }
346
-
347
- // src/commands/repair-session.ts
348
- function resolveSession(options) {
349
- const { sessionId, agentId } = options;
350
- if (sessionId && agentId) {
351
- return findSessionById(agentId, sessionId);
352
- }
353
- if (sessionId) {
354
- const agents = listAgents();
355
- for (const agent of agents) {
356
- const session = findSessionById(agent, sessionId);
357
- if (session) return session;
358
- }
359
- return null;
360
- }
361
- if (agentId) {
362
- return findMainSession(agentId);
363
- }
364
- const defaultAgent = process.env.OPENCLAW_AGENT_ID || "clawdious";
365
- return findMainSession(defaultAgent);
366
- }
367
- function formatRepairResult(result, options = {}) {
368
- const { dryRun = false } = options;
369
- const lines = [];
370
- lines.push(`Analyzing session: ${result.sessionId}`);
371
- lines.push("");
372
- if (result.corruptedEntries.length === 0) {
373
- lines.push("\u2705 No corruption detected. Session is clean.");
374
- return lines.join("\n");
375
- }
376
- if (dryRun) {
377
- lines.push(`Found ${result.corruptedEntries.length} corrupted entries:`);
378
- } else {
379
- lines.push(`Found and fixed ${result.corruptedEntries.length} corrupted entries:`);
380
- }
381
- for (const entry of result.corruptedEntries) {
382
- const prefix = entry.type === "aborted_tool_use" ? "Aborted tool_use" : "Orphaned tool_result";
383
- lines.push(` - Line ${entry.lineNumber}: ${prefix} (id: ${entry.toolUseId})`);
384
- }
385
- if (result.parentRelinks.length > 0) {
386
- lines.push("");
387
- if (dryRun) {
388
- lines.push(`Would relink ${result.parentRelinks.length} parent reference(s):`);
389
- } else {
390
- lines.push(`Relinked ${result.parentRelinks.length} parent reference(s):`);
391
- }
392
- for (const relink of result.parentRelinks.slice(0, 5)) {
393
- lines.push(` - Line ${relink.lineNumber}: parentId ${relink.oldParentId.slice(0, 8)}\u2026 \u2192 ${relink.newParentId === "null" ? "null" : relink.newParentId.slice(0, 8)}\u2026`);
394
- }
395
- if (result.parentRelinks.length > 5) {
396
- lines.push(` ... and ${result.parentRelinks.length - 5} more`);
397
- }
398
- }
399
- lines.push("");
400
- if (dryRun) {
401
- lines.push(`Would remove ${result.removedCount} entries, relink ${result.relinkedCount} parent references.`);
402
- } else {
403
- lines.push(`\u2705 Session repaired: removed ${result.removedCount} entries, relinked ${result.relinkedCount} parent references`);
404
- if (result.backupPath) {
405
- const backupName = result.backupPath.split("/").pop();
406
- lines.push(`Backup saved: ${backupName}`);
407
- }
408
- }
409
- return lines.join("\n");
410
- }
411
- async function repairSessionCommand(options) {
412
- const { backup = true, dryRun = false } = options;
413
- const session = resolveSession(options);
414
- if (!session) {
415
- throw new Error(
416
- options.sessionId ? `Session not found: ${options.sessionId}` : options.agentId ? `No main session found for agent: ${options.agentId}` : "No session found. Specify --session or --agent."
417
- );
418
- }
419
- if (!fs3.existsSync(session.filePath)) {
420
- throw new Error(`Session file not found: ${session.filePath}`);
421
- }
422
- if (dryRun) {
423
- return analyzeSession(session.filePath);
424
- }
425
- return repairSession(session.filePath, { backup, dryRun: false });
426
- }
427
- function listAgentSessions(agentId) {
428
- const agents = agentId ? [agentId] : listAgents();
429
- const lines = [];
430
- if (agents.length === 0) {
431
- return "No agents found in ~/.openclaw/agents/";
432
- }
433
- for (const agent of agents) {
434
- const mainSession = findMainSession(agent);
435
- if (mainSession) {
436
- lines.push(`${agent}:`);
437
- lines.push(` Main session: ${mainSession.sessionId}`);
438
- lines.push(` File: ${mainSession.filePath}`);
439
- if (mainSession.updatedAt) {
440
- const date = new Date(mainSession.updatedAt);
441
- lines.push(` Updated: ${date.toISOString()}`);
442
- }
443
- lines.push("");
444
- }
445
- }
446
- if (lines.length === 0) {
447
- return agentId ? `No sessions found for agent: ${agentId}` : "No sessions found.";
448
- }
449
- return lines.join("\n");
450
- }
451
- // Annotate the CommonJS export names for ESM import in node:
452
- 0 && (module.exports = {
453
- formatRepairResult,
454
- listAgentSessions,
455
- repairSessionCommand,
456
- resolveSession
457
- });
@@ -1,38 +0,0 @@
1
- import { SessionInfo } from '../lib/session-utils.cjs';
2
- import { RepairResult } from '../lib/session-repair.cjs';
3
-
4
- /**
5
- * repair-session command - Repair corrupted OpenClaw session transcripts
6
- *
7
- * Fixes issues like:
8
- * - Aborted tool calls with partial JSON
9
- * - Orphaned tool_result messages referencing non-existent tool_use IDs
10
- * - Broken parent chain references
11
- */
12
-
13
- interface RepairSessionOptions {
14
- sessionId?: string;
15
- agentId?: string;
16
- backup?: boolean;
17
- dryRun?: boolean;
18
- }
19
- /**
20
- * Resolve the session to repair
21
- */
22
- declare function resolveSession(options: RepairSessionOptions): SessionInfo | null;
23
- /**
24
- * Format repair result for CLI output
25
- */
26
- declare function formatRepairResult(result: RepairResult, options?: {
27
- dryRun?: boolean;
28
- }): string;
29
- /**
30
- * Main repair-session command handler
31
- */
32
- declare function repairSessionCommand(options: RepairSessionOptions): Promise<RepairResult>;
33
- /**
34
- * List available sessions for an agent (for --list flag)
35
- */
36
- declare function listAgentSessions(agentId?: string): string;
37
-
38
- export { type RepairSessionOptions, formatRepairResult, listAgentSessions, repairSessionCommand, resolveSession };