clawvault 3.0.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 (291) hide show
  1. package/README.md +352 -20
  2. package/bin/clawvault.js +8 -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 -10
  6. package/bin/register-maintenance-commands.js +39 -3
  7. package/bin/register-query-commands.js +58 -29
  8. package/bin/register-task-commands.js +18 -1
  9. package/bin/register-task-commands.test.js +16 -0
  10. package/bin/register-vault-operations-commands.js +29 -1
  11. package/bin/register-workgraph-commands.js +1368 -0
  12. package/dashboard/lib/graph-diff.js +104 -0
  13. package/dashboard/lib/graph-diff.test.js +75 -0
  14. package/dashboard/lib/vault-parser.js +556 -0
  15. package/dashboard/lib/vault-parser.test.js +254 -0
  16. package/dashboard/public/app.js +796 -0
  17. package/dashboard/public/index.html +52 -0
  18. package/dashboard/public/styles.css +221 -0
  19. package/dashboard/server.js +374 -0
  20. package/dist/{chunk-F2JEUD4J.js → chunk-23YDQ3QU.js} +6 -8
  21. package/dist/{chunk-C7OK5WKP.js → chunk-2JQ3O2YL.js} +4 -4
  22. package/dist/{chunk-VR5NE7PZ.js → chunk-2RAZ4ZFE.js} +1 -1
  23. package/dist/chunk-2ZDO52B4.js +52 -0
  24. package/dist/{chunk-ZZA73MFY.js → chunk-33DOSHTA.js} +176 -36
  25. package/dist/chunk-33VSQP4J.js +37 -0
  26. package/dist/chunk-4BQTQMJP.js +93 -0
  27. package/dist/{chunk-GUKMRGM7.js → chunk-4OXMU5S2.js} +1 -1
  28. package/dist/{chunk-62YTUT6J.js → chunk-4PY655YM.js} +15 -3
  29. package/dist/chunk-6FH3IULF.js +352 -0
  30. package/dist/{chunk-3NSBOUT3.js → chunk-77Q5CSPJ.js} +404 -80
  31. package/dist/{chunk-4VQTUVH7.js → chunk-7YZWHM36.js} +52 -26
  32. package/dist/chunk-BSJ6RIT7.js +447 -0
  33. package/dist/chunk-BUEW6IIK.js +364 -0
  34. package/dist/{chunk-WGRQ6HDV.js → chunk-CLJTREDS.js} +74 -14
  35. package/dist/chunk-EK6S23ZB.js +469 -0
  36. package/dist/{chunk-LNJA2UGL.js → chunk-ESFLMDRB.js} +9 -86
  37. package/dist/{chunk-H34S76MB.js → chunk-ESVS6K2B.js} +6 -6
  38. package/dist/{chunk-WAZ3NLWL.js → chunk-F55HGNU4.js} +0 -47
  39. package/dist/{chunk-QK3UCXWL.js → chunk-FHFUXL6G.js} +2 -2
  40. package/dist/{chunk-YKTA5JOJ.js → chunk-GAOWA7GR.js} +212 -46
  41. package/dist/chunk-GGA32J2R.js +784 -0
  42. package/dist/chunk-GNJL4YGR.js +79 -0
  43. package/dist/chunk-MDIH26GC.js +183 -0
  44. package/dist/{chunk-LYHGEHXG.js → chunk-MFAWT5O5.js} +0 -1
  45. package/dist/chunk-MM6QGW3P.js +207 -0
  46. package/dist/{chunk-P5EPF6MB.js → chunk-MW5C6ZQA.js} +110 -13
  47. package/dist/chunk-NCKFNBHJ.js +257 -0
  48. package/dist/{chunk-QBLMXKF2.js → chunk-OIWVQYQF.js} +1 -1
  49. package/dist/{chunk-42MXU7A6.js → chunk-P62WHA27.js} +58 -47
  50. package/dist/chunk-PBACDKKP.js +66 -0
  51. package/dist/{chunk-VGLOTGAS.js → chunk-QSHD36LH.js} +2 -2
  52. package/dist/{chunk-OZ7RIXTO.js → chunk-QSRRMEYM.js} +2 -2
  53. package/dist/chunk-QVEERJSP.js +152 -0
  54. package/dist/{chunk-N2AXRYLC.js → chunk-QWQ3TIKS.js} +1 -1
  55. package/dist/{chunk-3DHXQHYG.js → chunk-R2MIW5G7.js} +1 -1
  56. package/dist/{chunk-SJSFRIYS.js → chunk-SLXOR3CC.js} +2 -2
  57. package/dist/chunk-SS4B7P7V.js +99 -0
  58. package/dist/{chunk-JY6FYXIT.js → chunk-STCQGCEQ.js} +6 -11
  59. package/dist/chunk-U4O6C46S.js +154 -0
  60. package/dist/{chunk-ITPEXLHA.js → chunk-URXDAUVH.js} +24 -5
  61. package/dist/chunk-VSL7KY3M.js +189 -0
  62. package/dist/{chunk-U55BGUAU.js → chunk-W4SPAEE7.js} +6 -6
  63. package/dist/chunk-WMGIIABP.js +15 -0
  64. package/dist/{chunk-3D6BCTP6.js → chunk-X3SPPUFG.js} +51 -39
  65. package/dist/{chunk-THRJVD4L.js → chunk-Y6VJKXGL.js} +1 -1
  66. package/dist/{chunk-ZVVFWOLW.js → chunk-ZN54U2OZ.js} +123 -10
  67. package/dist/cli/index.js +32 -25
  68. package/dist/commands/archive.js +3 -3
  69. package/dist/commands/backlog.js +3 -3
  70. package/dist/commands/blocked.js +3 -3
  71. package/dist/commands/canvas.d.ts +15 -0
  72. package/dist/commands/canvas.js +200 -0
  73. package/dist/commands/checkpoint.js +2 -2
  74. package/dist/commands/compat.js +2 -2
  75. package/dist/commands/context.js +8 -6
  76. package/dist/commands/doctor.d.ts +11 -7
  77. package/dist/commands/doctor.js +18 -16
  78. package/dist/commands/embed.js +5 -6
  79. package/dist/commands/entities.js +2 -2
  80. package/dist/commands/graph.js +4 -4
  81. package/dist/commands/inject.d.ts +1 -1
  82. package/dist/commands/inject.js +5 -6
  83. package/dist/commands/kanban.js +4 -4
  84. package/dist/commands/link.js +5 -5
  85. package/dist/commands/migrate-observations.js +4 -4
  86. package/dist/commands/observe.d.ts +0 -1
  87. package/dist/commands/observe.js +14 -13
  88. package/dist/commands/project.js +5 -5
  89. package/dist/commands/rebuild-embeddings.d.ts +21 -0
  90. package/dist/commands/rebuild-embeddings.js +91 -0
  91. package/dist/commands/rebuild.js +12 -11
  92. package/dist/commands/recover.js +3 -3
  93. package/dist/commands/reflect.js +6 -7
  94. package/dist/commands/repair-session.js +1 -1
  95. package/dist/commands/replay.js +14 -14
  96. package/dist/commands/session-recap.js +1 -1
  97. package/dist/commands/setup.d.ts +2 -90
  98. package/dist/commands/setup.js +3 -21
  99. package/dist/commands/shell-init.js +1 -1
  100. package/dist/commands/sleep.d.ts +1 -1
  101. package/dist/commands/sleep.js +20 -19
  102. package/dist/commands/status.d.ts +2 -0
  103. package/dist/commands/status.js +57 -35
  104. package/dist/commands/sync-bd.d.ts +10 -0
  105. package/dist/commands/sync-bd.js +10 -0
  106. package/dist/commands/tailscale.js +3 -3
  107. package/dist/commands/task.js +4 -4
  108. package/dist/commands/template.js +2 -2
  109. package/dist/commands/wake.d.ts +1 -1
  110. package/dist/commands/wake.js +11 -10
  111. package/dist/commands/workgraph.d.ts +124 -0
  112. package/dist/commands/workgraph.js +38 -0
  113. package/dist/index.d.ts +337 -191
  114. package/dist/index.js +387 -118
  115. package/dist/{inject-Bzi5E-By.d.cts → inject-DYUrDqQO.d.ts} +3 -3
  116. package/dist/ledger-B7g7jhqG.d.ts +44 -0
  117. package/dist/lib/auto-linker.js +2 -2
  118. package/dist/lib/canvas-layout.d.ts +100 -16
  119. package/dist/lib/canvas-layout.js +21 -78
  120. package/dist/lib/config.d.ts +27 -3
  121. package/dist/lib/config.js +4 -2
  122. package/dist/lib/entity-index.js +1 -1
  123. package/dist/lib/project-utils.js +4 -4
  124. package/dist/lib/session-repair.js +1 -1
  125. package/dist/lib/session-utils.js +1 -1
  126. package/dist/lib/tailscale.js +1 -1
  127. package/dist/lib/task-utils.js +3 -3
  128. package/dist/lib/template-engine.js +1 -1
  129. package/dist/lib/webdav.js +1 -1
  130. package/dist/onnxruntime_binding-5QEF3SUC.node +0 -0
  131. package/dist/onnxruntime_binding-BKPKNEGC.node +0 -0
  132. package/dist/onnxruntime_binding-FMOXGIUT.node +0 -0
  133. package/dist/onnxruntime_binding-OI2KMXC5.node +0 -0
  134. package/dist/onnxruntime_binding-UX44MLAZ.node +0 -0
  135. package/dist/onnxruntime_binding-Y2W7N7WY.node +0 -0
  136. package/dist/openclaw-plugin.d.ts +8 -0
  137. package/dist/openclaw-plugin.js +14 -0
  138. package/dist/registry-BR4326o0.d.ts +30 -0
  139. package/dist/store-CA-6sKCJ.d.ts +34 -0
  140. package/dist/thread-B9LhXNU0.d.ts +41 -0
  141. package/dist/transformers.node-A2ZRORSQ.js +46775 -0
  142. package/dist/{types-Y2_Um2Ls.d.cts → types-BbWJoC1c.d.ts} +1 -44
  143. package/dist/workgraph/index.d.ts +5 -0
  144. package/dist/workgraph/index.js +23 -0
  145. package/dist/workgraph/ledger.d.ts +2 -0
  146. package/dist/workgraph/ledger.js +25 -0
  147. package/dist/workgraph/registry.d.ts +2 -0
  148. package/dist/workgraph/registry.js +19 -0
  149. package/dist/workgraph/store.d.ts +2 -0
  150. package/dist/workgraph/store.js +25 -0
  151. package/dist/workgraph/thread.d.ts +2 -0
  152. package/dist/workgraph/thread.js +25 -0
  153. package/dist/workgraph/types.d.ts +54 -0
  154. package/dist/workgraph/types.js +7 -0
  155. package/hooks/clawvault/HOOK.md +34 -4
  156. package/hooks/clawvault/handler.js +760 -78
  157. package/hooks/clawvault/handler.test.js +235 -79
  158. package/hooks/clawvault/openclaw.plugin.json +72 -0
  159. package/openclaw.plugin.json +65 -38
  160. package/package.json +15 -18
  161. package/dist/chunk-3RG5ZIWI.js +0 -10
  162. package/dist/chunk-6U6MK36V.js +0 -205
  163. package/dist/chunk-7R7O6STJ.js +0 -88
  164. package/dist/chunk-CMB7UL7C.js +0 -327
  165. package/dist/chunk-DEFFDRVP.js +0 -938
  166. package/dist/chunk-E7MFQB6D.js +0 -163
  167. package/dist/chunk-GAJV4IGR.js +0 -82
  168. package/dist/chunk-GQSLDZTS.js +0 -560
  169. package/dist/chunk-K234IDRJ.js +0 -1073
  170. package/dist/chunk-MFM6K7PU.js +0 -374
  171. package/dist/chunk-MXSSG3QU.js +0 -42
  172. package/dist/chunk-PAH27GSN.js +0 -108
  173. package/dist/cli/index.cjs +0 -10033
  174. package/dist/cli/index.d.cts +0 -5
  175. package/dist/commands/archive.cjs +0 -287
  176. package/dist/commands/archive.d.cts +0 -11
  177. package/dist/commands/backlog.cjs +0 -721
  178. package/dist/commands/backlog.d.cts +0 -53
  179. package/dist/commands/blocked.cjs +0 -204
  180. package/dist/commands/blocked.d.cts +0 -26
  181. package/dist/commands/checkpoint.cjs +0 -244
  182. package/dist/commands/checkpoint.d.cts +0 -41
  183. package/dist/commands/compat.cjs +0 -369
  184. package/dist/commands/compat.d.cts +0 -28
  185. package/dist/commands/context.cjs +0 -2989
  186. package/dist/commands/context.d.cts +0 -2
  187. package/dist/commands/doctor.cjs +0 -3062
  188. package/dist/commands/doctor.d.cts +0 -21
  189. package/dist/commands/embed.cjs +0 -232
  190. package/dist/commands/embed.d.cts +0 -17
  191. package/dist/commands/entities.cjs +0 -141
  192. package/dist/commands/entities.d.cts +0 -7
  193. package/dist/commands/graph.cjs +0 -501
  194. package/dist/commands/graph.d.cts +0 -21
  195. package/dist/commands/inject.cjs +0 -1636
  196. package/dist/commands/inject.d.cts +0 -2
  197. package/dist/commands/kanban.cjs +0 -884
  198. package/dist/commands/kanban.d.cts +0 -63
  199. package/dist/commands/link.cjs +0 -965
  200. package/dist/commands/link.d.cts +0 -11
  201. package/dist/commands/migrate-observations.cjs +0 -362
  202. package/dist/commands/migrate-observations.d.cts +0 -19
  203. package/dist/commands/observe.cjs +0 -4099
  204. package/dist/commands/observe.d.cts +0 -23
  205. package/dist/commands/project.cjs +0 -1341
  206. package/dist/commands/project.d.cts +0 -85
  207. package/dist/commands/rebuild.cjs +0 -3136
  208. package/dist/commands/rebuild.d.cts +0 -11
  209. package/dist/commands/recover.cjs +0 -361
  210. package/dist/commands/recover.d.cts +0 -38
  211. package/dist/commands/reflect.cjs +0 -1008
  212. package/dist/commands/reflect.d.cts +0 -11
  213. package/dist/commands/repair-session.cjs +0 -457
  214. package/dist/commands/repair-session.d.cts +0 -38
  215. package/dist/commands/replay.cjs +0 -4103
  216. package/dist/commands/replay.d.cts +0 -16
  217. package/dist/commands/session-recap.cjs +0 -353
  218. package/dist/commands/session-recap.d.cts +0 -27
  219. package/dist/commands/setup.cjs +0 -1345
  220. package/dist/commands/setup.d.cts +0 -100
  221. package/dist/commands/shell-init.cjs +0 -75
  222. package/dist/commands/shell-init.d.cts +0 -7
  223. package/dist/commands/sleep.cjs +0 -6028
  224. package/dist/commands/sleep.d.cts +0 -36
  225. package/dist/commands/status.cjs +0 -2736
  226. package/dist/commands/status.d.cts +0 -52
  227. package/dist/commands/tailscale.cjs +0 -1532
  228. package/dist/commands/tailscale.d.cts +0 -52
  229. package/dist/commands/task.cjs +0 -1236
  230. package/dist/commands/task.d.cts +0 -97
  231. package/dist/commands/template.cjs +0 -457
  232. package/dist/commands/template.d.cts +0 -36
  233. package/dist/commands/wake.cjs +0 -2626
  234. package/dist/commands/wake.d.cts +0 -22
  235. package/dist/context-BUGaWpyL.d.cts +0 -46
  236. package/dist/index.cjs +0 -14526
  237. package/dist/index.d.cts +0 -858
  238. package/dist/inject-Bzi5E-By.d.ts +0 -137
  239. package/dist/lib/auto-linker.cjs +0 -176
  240. package/dist/lib/auto-linker.d.cts +0 -26
  241. package/dist/lib/canvas-layout.cjs +0 -136
  242. package/dist/lib/canvas-layout.d.cts +0 -31
  243. package/dist/lib/config.cjs +0 -78
  244. package/dist/lib/config.d.cts +0 -11
  245. package/dist/lib/entity-index.cjs +0 -84
  246. package/dist/lib/entity-index.d.cts +0 -26
  247. package/dist/lib/project-utils.cjs +0 -864
  248. package/dist/lib/project-utils.d.cts +0 -97
  249. package/dist/lib/session-repair.cjs +0 -239
  250. package/dist/lib/session-repair.d.cts +0 -110
  251. package/dist/lib/session-utils.cjs +0 -209
  252. package/dist/lib/session-utils.d.cts +0 -63
  253. package/dist/lib/tailscale.cjs +0 -1183
  254. package/dist/lib/tailscale.d.cts +0 -225
  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/lib/webdav.cjs +0 -568
  260. package/dist/lib/webdav.d.cts +0 -109
  261. package/dist/plugin/index.cjs +0 -1907
  262. package/dist/plugin/index.d.cts +0 -36
  263. package/dist/plugin/index.d.ts +0 -36
  264. package/dist/plugin/index.js +0 -572
  265. package/dist/plugin/inject.cjs +0 -356
  266. package/dist/plugin/inject.d.cts +0 -54
  267. package/dist/plugin/inject.d.ts +0 -54
  268. package/dist/plugin/inject.js +0 -17
  269. package/dist/plugin/observe.cjs +0 -631
  270. package/dist/plugin/observe.d.cts +0 -39
  271. package/dist/plugin/observe.d.ts +0 -39
  272. package/dist/plugin/observe.js +0 -18
  273. package/dist/plugin/templates.cjs +0 -593
  274. package/dist/plugin/templates.d.cts +0 -52
  275. package/dist/plugin/templates.d.ts +0 -52
  276. package/dist/plugin/templates.js +0 -25
  277. package/dist/plugin/types.cjs +0 -18
  278. package/dist/plugin/types.d.cts +0 -209
  279. package/dist/plugin/types.d.ts +0 -209
  280. package/dist/plugin/types.js +0 -0
  281. package/dist/plugin/vault.cjs +0 -927
  282. package/dist/plugin/vault.d.cts +0 -68
  283. package/dist/plugin/vault.d.ts +0 -68
  284. package/dist/plugin/vault.js +0 -22
  285. package/dist/types-Y2_Um2Ls.d.ts +0 -205
  286. package/templates/memory-event.md +0 -67
  287. package/templates/party.md +0 -63
  288. package/templates/primitive-registry.yaml +0 -551
  289. package/templates/run.md +0 -68
  290. package/templates/trigger.md +0 -68
  291. 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,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
- };