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,374 +0,0 @@
1
- import {
2
- classifyText,
3
- generateFrontmatter,
4
- getSchema,
5
- serializeFrontmatter,
6
- validateFrontmatter
7
- } from "./chunk-GQSLDZTS.js";
8
- import {
9
- __require
10
- } from "./chunk-3RG5ZIWI.js";
11
-
12
- // src/plugin/vault.ts
13
- import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from "fs";
14
- import { join } from "path";
15
- function writeVaultFile(vaultPath, options) {
16
- const errors = [];
17
- const primitiveType = options.primitiveType ?? classifyText(options.content ?? options.title ?? "").primitiveType;
18
- const schema = getSchema(primitiveType);
19
- const frontmatter = generateFrontmatter(primitiveType, {
20
- title: options.title,
21
- extraFields: options.extraFields,
22
- source: options.source,
23
- sessionId: options.sessionId
24
- });
25
- const validation = validateFrontmatter(primitiveType, frontmatter);
26
- if (!validation.valid) {
27
- errors.push(...validation.errors);
28
- }
29
- const directory = options.directory ?? getDefaultDirectory(vaultPath, primitiveType);
30
- if (!existsSync(directory)) {
31
- mkdirSync(directory, { recursive: true });
32
- }
33
- const filename = options.filename ?? generateFilename(primitiveType, options.title, frontmatter);
34
- const filePath = join(directory, filename);
35
- const fileExists = existsSync(filePath);
36
- if (fileExists && !options.overwrite) {
37
- return updateVaultFile(filePath, frontmatter, options.content, primitiveType, errors);
38
- }
39
- const fileContent = buildFileContent(frontmatter, options.content, schema);
40
- try {
41
- writeFileSync(filePath, fileContent, "utf-8");
42
- return {
43
- success: errors.length === 0,
44
- path: filePath,
45
- primitiveType,
46
- errors,
47
- created: true,
48
- updated: false
49
- };
50
- } catch (err) {
51
- errors.push(`Failed to write file: ${String(err)}`);
52
- return {
53
- success: false,
54
- path: filePath,
55
- primitiveType,
56
- errors,
57
- created: false,
58
- updated: false
59
- };
60
- }
61
- }
62
- function updateVaultFile(filePath, newFrontmatter, newContent, primitiveType, errors) {
63
- try {
64
- const existingContent = readFileSync(filePath, "utf-8");
65
- const parsed = parseExistingFile(existingContent);
66
- if (!parsed) {
67
- errors.push("Failed to parse existing file");
68
- return {
69
- success: false,
70
- path: filePath,
71
- primitiveType,
72
- errors,
73
- created: false,
74
- updated: false
75
- };
76
- }
77
- const mergedFrontmatter = {
78
- ...parsed.frontmatter,
79
- ...newFrontmatter,
80
- updated: (/* @__PURE__ */ new Date()).toISOString()
81
- };
82
- if (parsed.frontmatter.created) {
83
- mergedFrontmatter.created = parsed.frontmatter.created;
84
- }
85
- const content = newContent ?? parsed.body;
86
- const schema = getSchema(primitiveType);
87
- const fileContent = buildFileContent(mergedFrontmatter, content, schema);
88
- writeFileSync(filePath, fileContent, "utf-8");
89
- return {
90
- success: errors.length === 0,
91
- path: filePath,
92
- primitiveType,
93
- errors,
94
- created: false,
95
- updated: true
96
- };
97
- } catch (err) {
98
- errors.push(`Failed to update file: ${String(err)}`);
99
- return {
100
- success: false,
101
- path: filePath,
102
- primitiveType,
103
- errors,
104
- created: false,
105
- updated: false
106
- };
107
- }
108
- }
109
- function parseExistingFile(content) {
110
- const match = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
111
- if (!match) return null;
112
- try {
113
- const frontmatter = parseSimpleYaml(match[1]);
114
- return { frontmatter, body: match[2] };
115
- } catch {
116
- return null;
117
- }
118
- }
119
- function parseSimpleYaml(yaml) {
120
- const result = {};
121
- const lines = yaml.split("\n");
122
- for (const line of lines) {
123
- if (!line.trim() || line.trim().startsWith("#")) continue;
124
- const colonIndex = line.indexOf(":");
125
- if (colonIndex === -1) continue;
126
- const key = line.slice(0, colonIndex).trim();
127
- const valueStr = line.slice(colonIndex + 1).trim();
128
- if (valueStr === "" || valueStr.startsWith("|") || valueStr.startsWith(">")) continue;
129
- result[key] = parseYamlValue(valueStr);
130
- }
131
- return result;
132
- }
133
- function parseYamlValue(value) {
134
- if (value === "" || value === "null" || value === "~") return null;
135
- if (value === "true") return true;
136
- if (value === "false") return false;
137
- if (/^-?\d+$/.test(value)) return parseInt(value, 10);
138
- if (/^-?\d+\.\d+$/.test(value)) return parseFloat(value);
139
- if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
140
- return value.slice(1, -1);
141
- }
142
- return value;
143
- }
144
- function getDefaultDirectory(vaultPath, primitiveType) {
145
- const directoryMap = {
146
- task: "tasks",
147
- project: "projects",
148
- decision: "decisions",
149
- person: "people",
150
- lesson: "lessons",
151
- trigger: "triggers",
152
- run: "runs",
153
- checkpoint: "checkpoints",
154
- handoff: "handoffs",
155
- "daily-note": "daily",
156
- daily: "daily",
157
- party: "parties",
158
- workspace: "workspaces",
159
- memory_event: "memory"
160
- };
161
- const subdir = directoryMap[primitiveType] ?? "notes";
162
- return join(vaultPath, subdir);
163
- }
164
- function generateFilename(primitiveType, title, frontmatter) {
165
- const now = /* @__PURE__ */ new Date();
166
- const dateStr = now.toISOString().split("T")[0];
167
- const timeStr = now.toISOString().slice(11, 19).replace(/:/g, "");
168
- if (title) {
169
- const slug = slugify(title);
170
- return `${dateStr}-${slug}.md`;
171
- }
172
- switch (primitiveType) {
173
- case "daily-note":
174
- case "daily":
175
- return `${dateStr}.md`;
176
- case "memory_event":
177
- return `${dateStr}-${timeStr}.md`;
178
- case "run":
179
- return `run-${dateStr}-${timeStr}.md`;
180
- case "checkpoint":
181
- return `checkpoint-${dateStr}-${timeStr}.md`;
182
- case "handoff":
183
- return `handoff-${dateStr}-${timeStr}.md`;
184
- default:
185
- return `${primitiveType}-${dateStr}-${timeStr}.md`;
186
- }
187
- }
188
- function slugify(text) {
189
- return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 50);
190
- }
191
- function buildFileContent(frontmatter, content, schema) {
192
- const parts = [];
193
- parts.push(serializeFrontmatter(frontmatter));
194
- parts.push("");
195
- const title = frontmatter.title || frontmatter.summary;
196
- if (title) {
197
- parts.push(`# ${title}`);
198
- parts.push("");
199
- }
200
- if (content) {
201
- parts.push(content);
202
- } else if (schema?.bodyTemplate) {
203
- let body = schema.bodyTemplate;
204
- body = body.replace(/\{\{title\}\}/g, String(title || "Untitled"));
205
- body = body.replace(/\{\{date\}\}/g, (/* @__PURE__ */ new Date()).toISOString().split("T")[0]);
206
- body = body.replace(/\{\{datetime\}\}/g, (/* @__PURE__ */ new Date()).toISOString());
207
- body = body.replace(/\{\{links_line\}\}/g, "");
208
- body = body.replace(/\{\{content\}\}/g, "");
209
- parts.push(body.trim());
210
- }
211
- return parts.join("\n");
212
- }
213
- function writeObservation(vaultPath, observation, options = {}) {
214
- return writeVaultFile(vaultPath, {
215
- primitiveType: observation.primitiveType,
216
- title: observation.text.slice(0, 80),
217
- content: observation.text,
218
- extraFields: {
219
- type: observation.primitiveType === "memory_event" ? observation.category : observation.primitiveType,
220
- confidence: observation.confidence,
221
- tags: observation.tags,
222
- observed_at: observation.extractedAt.toISOString()
223
- },
224
- source: options.source ?? "openclaw",
225
- sessionId: options.sessionId
226
- });
227
- }
228
- function writeObservations(vaultPath, observations, options = {}) {
229
- return observations.map((obs) => writeObservation(vaultPath, obs, options));
230
- }
231
- function appendToLedger(vaultPath, entry) {
232
- const dateStr = entry.timestamp.toISOString().slice(0, 10);
233
- const ledgerDir = join(vaultPath, "ledger");
234
- if (!existsSync(ledgerDir)) {
235
- mkdirSync(ledgerDir, { recursive: true });
236
- }
237
- const ledgerFile = join(ledgerDir, `${dateStr}.md`);
238
- const timeStr = entry.timestamp.toISOString().slice(11, 19);
239
- const parts = [`[${timeStr}]`];
240
- if (entry.category) parts.push(`[${entry.category}]`);
241
- if (entry.actor) parts.push(`(${entry.actor})`);
242
- parts.push(entry.content);
243
- const line = `
244
- - ${parts.join(" ")}`;
245
- if (!existsSync(ledgerFile)) {
246
- const frontmatter = serializeFrontmatter({
247
- type: "ledger",
248
- date: dateStr,
249
- created: entry.timestamp.toISOString()
250
- });
251
- writeFileSync(ledgerFile, `${frontmatter}
252
-
253
- # Observation Ledger \u2014 ${dateStr}
254
- ${line}`, "utf-8");
255
- } else {
256
- appendFileSync(ledgerFile, line, "utf-8");
257
- }
258
- }
259
- function appendObservationToLedger(vaultPath, observation, actor) {
260
- appendToLedger(vaultPath, {
261
- timestamp: observation.extractedAt,
262
- category: observation.category,
263
- actor,
264
- content: observation.text,
265
- primitiveType: observation.primitiveType,
266
- tags: observation.tags
267
- });
268
- }
269
- function batchWriteObservations(vaultPath, observations, options = {}) {
270
- const results = [];
271
- let successful = 0;
272
- let failed = 0;
273
- const writeLedger = options.writeLedger ?? true;
274
- const writeFiles = options.writeFiles ?? false;
275
- for (const observation of observations) {
276
- if (writeLedger) {
277
- try {
278
- appendObservationToLedger(vaultPath, observation, options.actor);
279
- } catch {
280
- }
281
- }
282
- if (writeFiles) {
283
- const result = writeObservation(vaultPath, observation, {
284
- source: options.source,
285
- sessionId: options.sessionId
286
- });
287
- results.push(result);
288
- if (result.success) {
289
- successful++;
290
- } else {
291
- failed++;
292
- }
293
- } else {
294
- successful++;
295
- results.push({
296
- success: true,
297
- path: join(vaultPath, "ledger", `${observation.extractedAt.toISOString().slice(0, 10)}.md`),
298
- primitiveType: observation.primitiveType,
299
- errors: [],
300
- created: false,
301
- updated: true
302
- });
303
- }
304
- }
305
- return {
306
- total: observations.length,
307
- successful,
308
- failed,
309
- results
310
- };
311
- }
312
- function ensureVaultStructure(vaultPath) {
313
- const directories = [
314
- "tasks",
315
- "projects",
316
- "decisions",
317
- "people",
318
- "lessons",
319
- "memory",
320
- "ledger",
321
- "daily"
322
- ];
323
- for (const dir of directories) {
324
- const fullPath = join(vaultPath, dir);
325
- if (!existsSync(fullPath)) {
326
- mkdirSync(fullPath, { recursive: true });
327
- }
328
- }
329
- }
330
- function getVaultStats(vaultPath) {
331
- const directories = [];
332
- const primitiveTypes = {};
333
- let fileCount = 0;
334
- const { readdirSync, statSync } = __require("fs");
335
- function scanDir(dir, depth = 0) {
336
- if (depth > 2) return;
337
- try {
338
- const entries = readdirSync(dir, { withFileTypes: true });
339
- for (const entry of entries) {
340
- if (entry.name.startsWith(".") || entry.name.startsWith("_")) continue;
341
- const fullPath = join(dir, entry.name);
342
- if (entry.isDirectory()) {
343
- directories.push(fullPath.replace(vaultPath + "/", ""));
344
- scanDir(fullPath, depth + 1);
345
- } else if (entry.name.endsWith(".md")) {
346
- fileCount++;
347
- try {
348
- const content = readFileSync(fullPath, "utf-8");
349
- const match = content.match(/^---\n[\s\S]*?type:\s*(\S+)/);
350
- if (match) {
351
- const type = match[1];
352
- primitiveTypes[type] = (primitiveTypes[type] ?? 0) + 1;
353
- }
354
- } catch {
355
- }
356
- }
357
- }
358
- } catch {
359
- }
360
- }
361
- scanDir(vaultPath);
362
- return { directories, fileCount, primitiveTypes };
363
- }
364
-
365
- export {
366
- writeVaultFile,
367
- writeObservation,
368
- writeObservations,
369
- appendToLedger,
370
- appendObservationToLedger,
371
- batchWriteObservations,
372
- ensureVaultStructure,
373
- getVaultStats
374
- };
@@ -1,42 +0,0 @@
1
- // src/lib/config.ts
2
- import * as fs from "fs";
3
- import * as path from "path";
4
- function getVaultPath() {
5
- const vaultPath = process.env.CLAWVAULT_PATH;
6
- if (!vaultPath) {
7
- throw new Error("CLAWVAULT_PATH environment variable not set");
8
- }
9
- return path.resolve(vaultPath);
10
- }
11
- function findNearestVaultPath(startPath = process.cwd()) {
12
- let current = path.resolve(startPath);
13
- while (true) {
14
- if (fs.existsSync(path.join(current, ".clawvault.json"))) {
15
- return current;
16
- }
17
- const parent = path.dirname(current);
18
- if (parent === current) {
19
- return null;
20
- }
21
- current = parent;
22
- }
23
- }
24
- function resolveVaultPath(options = {}) {
25
- if (options.explicitPath) {
26
- return path.resolve(options.explicitPath);
27
- }
28
- if (process.env.CLAWVAULT_PATH) {
29
- return path.resolve(process.env.CLAWVAULT_PATH);
30
- }
31
- const discovered = findNearestVaultPath(options.cwd ?? process.cwd());
32
- if (discovered) {
33
- return discovered;
34
- }
35
- throw new Error("No vault path found. Set CLAWVAULT_PATH, use --vault, or run inside a vault.");
36
- }
37
-
38
- export {
39
- getVaultPath,
40
- findNearestVaultPath,
41
- resolveVaultPath
42
- };
@@ -1,88 +0,0 @@
1
- import {
2
- resolveVaultPath
3
- } from "./chunk-MXSSG3QU.js";
4
- import {
5
- QmdUnavailableError,
6
- hasQmd,
7
- qmdEmbed
8
- } from "./chunk-D2H45LON.js";
9
-
10
- // src/lib/vault-qmd-config.ts
11
- import * as fs from "fs";
12
- import * as path from "path";
13
- var CONFIG_FILE = ".clawvault.json";
14
- function readTrimmedString(value) {
15
- if (typeof value !== "string") return void 0;
16
- const trimmed = value.trim();
17
- return trimmed.length > 0 ? trimmed : void 0;
18
- }
19
- function loadVaultQmdConfig(vaultPath) {
20
- const resolvedVaultPath = path.resolve(vaultPath);
21
- const fallbackName = path.basename(resolvedVaultPath);
22
- const fallbackRoot = resolvedVaultPath;
23
- const configPath = path.join(resolvedVaultPath, CONFIG_FILE);
24
- if (!fs.existsSync(configPath)) {
25
- return {
26
- vaultPath: resolvedVaultPath,
27
- qmdCollection: fallbackName,
28
- qmdRoot: fallbackRoot
29
- };
30
- }
31
- try {
32
- const raw = JSON.parse(fs.readFileSync(configPath, "utf-8"));
33
- const configuredName = readTrimmedString(raw.name) ?? fallbackName;
34
- const qmdCollection = readTrimmedString(raw.qmdCollection) ?? configuredName;
35
- const rawRoot = readTrimmedString(raw.qmdRoot) ?? fallbackRoot;
36
- const qmdRoot = path.isAbsolute(rawRoot) ? path.resolve(rawRoot) : path.resolve(resolvedVaultPath, rawRoot);
37
- return {
38
- vaultPath: resolvedVaultPath,
39
- qmdCollection,
40
- qmdRoot
41
- };
42
- } catch {
43
- return {
44
- vaultPath: resolvedVaultPath,
45
- qmdCollection: fallbackName,
46
- qmdRoot: fallbackRoot
47
- };
48
- }
49
- }
50
-
51
- // src/commands/embed.ts
52
- async function embedCommand(options = {}) {
53
- if (!hasQmd()) {
54
- throw new QmdUnavailableError();
55
- }
56
- const vaultPath = resolveVaultPath({ explicitPath: options.vaultPath });
57
- const qmdConfig = loadVaultQmdConfig(vaultPath);
58
- const startedAt = (/* @__PURE__ */ new Date()).toISOString();
59
- if (!options.quiet) {
60
- console.log(
61
- `Embedding pending documents for collection "${qmdConfig.qmdCollection}" (root: ${qmdConfig.qmdRoot})...`
62
- );
63
- }
64
- qmdEmbed(qmdConfig.qmdCollection);
65
- const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
66
- if (!options.quiet) {
67
- console.log(`\u2713 Embedding complete for "${qmdConfig.qmdCollection}"`);
68
- }
69
- return {
70
- vaultPath,
71
- qmdCollection: qmdConfig.qmdCollection,
72
- qmdRoot: qmdConfig.qmdRoot,
73
- startedAt,
74
- finishedAt
75
- };
76
- }
77
- function registerEmbedCommand(program) {
78
- program.command("embed").description("Run qmd embedding for pending vault documents").option("-v, --vault <path>", "Vault path").action(async (rawOptions) => {
79
- await embedCommand({
80
- vaultPath: rawOptions.vault
81
- });
82
- });
83
- }
84
-
85
- export {
86
- embedCommand,
87
- registerEmbedCommand
88
- };
@@ -1,108 +0,0 @@
1
- // src/lib/claude-credentials.ts
2
- import { execFileSync } from "child_process";
3
- import { existsSync, readFileSync, writeFileSync } from "fs";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
- var CLAUDE_CODE_SERVICE = "Claude Code-credentials";
7
- var CLAUDE_CODE_ACCOUNT = "Claude Code";
8
- var OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
9
- var TOKEN_REFRESH_URL = "https://console.anthropic.com/v1/oauth/token";
10
- var EXPIRY_BUFFER_MS = 5 * 60 * 1e3;
11
- function readClaudeCliCredentials(opts) {
12
- if (process.platform === "darwin") {
13
- try {
14
- const raw = execFileSync(
15
- "security",
16
- ["find-generic-password", "-s", CLAUDE_CODE_SERVICE, "-w"],
17
- { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }
18
- ).trim();
19
- const parsed = parseCredentialsJson(raw);
20
- if (parsed) return parsed;
21
- } catch {
22
- }
23
- }
24
- const home = opts?.homeDir ?? homedir();
25
- const credFile = join(home, ".claude", ".credentials.json");
26
- if (!existsSync(credFile)) {
27
- return null;
28
- }
29
- try {
30
- const raw = readFileSync(credFile, "utf8");
31
- return parseCredentialsJson(raw);
32
- } catch {
33
- return null;
34
- }
35
- }
36
- function parseCredentialsJson(raw) {
37
- try {
38
- const parsed = JSON.parse(raw);
39
- const oauth = parsed.claudeAiOauth;
40
- if (oauth && typeof oauth.accessToken === "string" && typeof oauth.refreshToken === "string" && typeof oauth.expiresAt === "number") {
41
- return {
42
- accessToken: oauth.accessToken,
43
- refreshToken: oauth.refreshToken,
44
- expiresAt: oauth.expiresAt
45
- };
46
- }
47
- } catch {
48
- }
49
- return null;
50
- }
51
- async function refreshClaudeOAuthToken(refreshToken, fetchImpl) {
52
- const f = fetchImpl ?? fetch;
53
- const response = await f(TOKEN_REFRESH_URL, {
54
- method: "POST",
55
- headers: { "content-type": "application/json" },
56
- body: JSON.stringify({
57
- grant_type: "refresh_token",
58
- client_id: OAUTH_CLIENT_ID,
59
- refresh_token: refreshToken
60
- })
61
- });
62
- if (!response.ok) {
63
- throw new Error(`OAuth token refresh failed (${response.status})`);
64
- }
65
- const data = await response.json();
66
- return {
67
- accessToken: data.access_token,
68
- refreshToken: data.refresh_token,
69
- expiresAt: Date.now() + data.expires_in * 1e3
70
- };
71
- }
72
- function writeClaudeCliCredentials(cred, opts) {
73
- const payload = JSON.stringify({ claudeAiOauth: cred });
74
- if (process.platform === "darwin") {
75
- try {
76
- execFileSync(
77
- "security",
78
- ["add-generic-password", "-U", "-s", CLAUDE_CODE_SERVICE, "-a", CLAUDE_CODE_ACCOUNT, "-w", payload],
79
- { stdio: "ignore" }
80
- );
81
- return;
82
- } catch {
83
- }
84
- }
85
- const home = opts?.homeDir ?? homedir();
86
- const credFile = join(home, ".claude", ".credentials.json");
87
- writeFileSync(credFile, payload, "utf8");
88
- }
89
- async function resolveClaudeOAuthToken(opts) {
90
- const cred = readClaudeCliCredentials(opts);
91
- if (!cred) {
92
- return null;
93
- }
94
- if (cred.expiresAt < Date.now() + EXPIRY_BUFFER_MS) {
95
- try {
96
- const refreshed = await refreshClaudeOAuthToken(cred.refreshToken, opts?.fetchImpl);
97
- writeClaudeCliCredentials(refreshed, opts);
98
- return refreshed.accessToken;
99
- } catch {
100
- return cred.accessToken;
101
- }
102
- }
103
- return cred.accessToken;
104
- }
105
-
106
- export {
107
- resolveClaudeOAuthToken
108
- };
@@ -1,78 +0,0 @@
1
- import {
2
- registerObserveCommand
3
- } from "./chunk-F2JEUD4J.js";
4
- import {
5
- registerReflectCommand
6
- } from "./chunk-SJSFRIYS.js";
7
- import {
8
- registerEmbedCommand
9
- } from "./chunk-OCGVIN3L.js";
10
- import {
11
- registerInjectCommand
12
- } from "./chunk-U55BGUAU.js";
13
- import {
14
- resolveVaultPath
15
- } from "./chunk-MXSSG3QU.js";
16
- import {
17
- registerContextCommand
18
- } from "./chunk-3WRJEKN4.js";
19
- import {
20
- reweave
21
- } from "./chunk-D2H45LON.js";
22
-
23
- // src/commands/reweave.ts
24
- async function reweaveCommand(options) {
25
- const vaultPath = resolveVaultPath({ explicitPath: options.vaultPath });
26
- const result = reweave({
27
- vaultPath,
28
- since: options.since,
29
- dryRun: options.dryRun,
30
- similarityThreshold: options.threshold
31
- });
32
- console.log(`Reweave: scanned ${result.filesScanned} files, checked ${result.observationsChecked} observations`);
33
- if (result.supersessions.length === 0) {
34
- console.log("No knowledge updates detected.");
35
- return;
36
- }
37
- console.log(`
38
- Found ${result.supersessions.length} supersession(s):`);
39
- for (const s of result.supersessions) {
40
- console.log(`
41
- OLD [${s.oldObservation.date}] ${s.oldObservation.content.slice(0, 80)}`);
42
- console.log(` NEW [${s.newObservation.date}] ${s.newObservation.content.slice(0, 80)}`);
43
- console.log(` Reason: ${s.reason}`);
44
- }
45
- if (result.dryRun) {
46
- console.log("\n(dry run \u2014 no files modified)");
47
- } else {
48
- console.log(`
49
- ${result.supersessions.length} observation(s) marked as superseded.`);
50
- }
51
- }
52
- function registerReweaveCommand(program) {
53
- program.command("reweave").description("Backward memory consolidation \u2014 detect and mark superseded observations").option("--since <date>", "Only check observations since this date (YYYY-MM-DD)").option("--dry-run", "Show what would be superseded without writing").option("--threshold <n>", "Entity similarity threshold (0-1, default 0.3)", "0.3").option("-v, --vault <path>", "Vault path").action(async (rawOptions) => {
54
- await reweaveCommand({
55
- vaultPath: rawOptions.vault,
56
- since: rawOptions.since,
57
- dryRun: rawOptions.dryRun,
58
- threshold: parseFloat(rawOptions.threshold)
59
- });
60
- });
61
- }
62
-
63
- // src/cli/index.ts
64
- function registerCliCommands(program) {
65
- registerContextCommand(program);
66
- registerInjectCommand(program);
67
- registerObserveCommand(program);
68
- registerReflectCommand(program);
69
- registerEmbedCommand(program);
70
- registerReweaveCommand(program);
71
- return program;
72
- }
73
-
74
- export {
75
- reweaveCommand,
76
- registerReweaveCommand,
77
- registerCliCommands
78
- };