clawvault 3.1.0 → 3.2.1

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 (273) 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 +451 -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-C7OK5WKP.js → chunk-2JQ3O2YL.js} +4 -4
  22. package/dist/{chunk-VR5NE7PZ.js → chunk-2RAZ4ZFE.js} +1 -1
  23. package/dist/{chunk-F2JEUD4J.js → chunk-4ITRXIVT.js} +5 -7
  24. package/dist/{chunk-GUKMRGM7.js → chunk-4OXMU5S2.js} +1 -1
  25. package/dist/chunk-5PJ4STIC.js +465 -0
  26. package/dist/{chunk-62YTUT6J.js → chunk-AZYOKJYC.js} +2 -2
  27. package/dist/chunk-BSJ6RIT7.js +447 -0
  28. package/dist/chunk-ECRZL5XR.js +50 -0
  29. package/dist/chunk-ERNE2FZ5.js +189 -0
  30. package/dist/{chunk-WAZ3NLWL.js → chunk-F55HGNU4.js} +0 -47
  31. package/dist/{chunk-VGLOTGAS.js → chunk-FAKNOB7Y.js} +2 -2
  32. package/dist/{chunk-QK3UCXWL.js → chunk-FHFUXL6G.js} +2 -2
  33. package/dist/chunk-GNJL4YGR.js +79 -0
  34. package/dist/chunk-HR4KN6S2.js +152 -0
  35. package/dist/{chunk-OZ7RIXTO.js → chunk-IIOU45CK.js} +1 -1
  36. package/dist/chunk-IJBFGPCS.js +33 -0
  37. package/dist/chunk-IVRIKYFE.js +520 -0
  38. package/dist/chunk-K7PNYS45.js +93 -0
  39. package/dist/chunk-MDIH26GC.js +183 -0
  40. package/dist/{chunk-LYHGEHXG.js → chunk-MFAWT5O5.js} +0 -1
  41. package/dist/{chunk-H34S76MB.js → chunk-MNPUYCHQ.js} +6 -6
  42. package/dist/chunk-NTOPJI7W.js +207 -0
  43. package/dist/{chunk-QBLMXKF2.js → chunk-OIWVQYQF.js} +1 -1
  44. package/dist/chunk-PG56HX5T.js +154 -0
  45. package/dist/{chunk-LNJA2UGL.js → chunk-PI4WMLMG.js} +7 -84
  46. package/dist/chunk-QMHPQYUV.js +363 -0
  47. package/dist/{chunk-H62BP7RI.js → chunk-QPDDIHXE.js} +209 -43
  48. package/dist/{chunk-N2AXRYLC.js → chunk-QWQ3TIKS.js} +1 -1
  49. package/dist/{chunk-3DHXQHYG.js → chunk-R2MIW5G7.js} +1 -1
  50. package/dist/{chunk-SJSFRIYS.js → chunk-S5OJEGFG.js} +2 -2
  51. package/dist/chunk-SS4B7P7V.js +99 -0
  52. package/dist/chunk-TIGW564L.js +628 -0
  53. package/dist/chunk-U67V476Y.js +35 -0
  54. package/dist/{chunk-JY6FYXIT.js → chunk-UCQAOZHW.js} +6 -11
  55. package/dist/{chunk-ITPEXLHA.js → chunk-URXDAUVH.js} +24 -5
  56. package/dist/chunk-WIOLLGAD.js +190 -0
  57. package/dist/{chunk-3WRJEKN4.js → chunk-WJVWINEM.js} +72 -8
  58. package/dist/chunk-WMGIIABP.js +15 -0
  59. package/dist/{chunk-33UGEQRT.js → chunk-X3SPPUFG.js} +151 -64
  60. package/dist/{chunk-3NSBOUT3.js → chunk-Y3TIJEBP.js} +314 -79
  61. package/dist/chunk-Y6VJKXGL.js +373 -0
  62. package/dist/{chunk-LI4O6NVK.js → chunk-YDWHS4LJ.js} +49 -9
  63. package/dist/{chunk-U55BGUAU.js → chunk-YNIPYN4F.js} +5 -5
  64. package/dist/chunk-YXQCA6B7.js +226 -0
  65. package/dist/cli/index.js +26 -22
  66. package/dist/commands/archive.js +3 -3
  67. package/dist/commands/backlog.js +3 -3
  68. package/dist/commands/blocked.js +3 -3
  69. package/dist/commands/canvas.d.ts +15 -0
  70. package/dist/commands/canvas.js +200 -0
  71. package/dist/commands/checkpoint.js +2 -2
  72. package/dist/commands/compat.js +2 -2
  73. package/dist/commands/context.js +7 -5
  74. package/dist/commands/doctor.d.ts +11 -7
  75. package/dist/commands/doctor.js +16 -14
  76. package/dist/commands/embed.js +5 -6
  77. package/dist/commands/entities.js +2 -2
  78. package/dist/commands/graph.js +3 -3
  79. package/dist/commands/inject.d.ts +1 -1
  80. package/dist/commands/inject.js +4 -5
  81. package/dist/commands/kanban.js +4 -4
  82. package/dist/commands/link.js +2 -2
  83. package/dist/commands/migrate-observations.js +4 -4
  84. package/dist/commands/observe.d.ts +0 -1
  85. package/dist/commands/observe.js +13 -12
  86. package/dist/commands/project.js +5 -5
  87. package/dist/commands/rebuild-embeddings.d.ts +21 -0
  88. package/dist/commands/rebuild-embeddings.js +91 -0
  89. package/dist/commands/rebuild.js +12 -11
  90. package/dist/commands/recover.js +3 -3
  91. package/dist/commands/reflect.js +6 -7
  92. package/dist/commands/repair-session.js +1 -1
  93. package/dist/commands/replay.js +14 -14
  94. package/dist/commands/session-recap.js +1 -1
  95. package/dist/commands/setup.d.ts +2 -89
  96. package/dist/commands/setup.js +3 -21
  97. package/dist/commands/shell-init.js +1 -1
  98. package/dist/commands/sleep.d.ts +1 -1
  99. package/dist/commands/sleep.js +18 -17
  100. package/dist/commands/status.d.ts +2 -0
  101. package/dist/commands/status.js +40 -30
  102. package/dist/commands/sync-bd.d.ts +10 -0
  103. package/dist/commands/sync-bd.js +10 -0
  104. package/dist/commands/tailscale.d.ts +52 -0
  105. package/dist/commands/tailscale.js +26 -0
  106. package/dist/commands/task.js +4 -4
  107. package/dist/commands/template.js +2 -2
  108. package/dist/commands/wake.d.ts +1 -1
  109. package/dist/commands/wake.js +11 -10
  110. package/dist/index.d.ts +334 -191
  111. package/dist/index.js +432 -108
  112. package/dist/{inject-Bzi5E-By.d.ts → inject-DYUrDqQO.d.ts} +3 -3
  113. package/dist/ledger-B7g7jhqG.d.ts +44 -0
  114. package/dist/lib/auto-linker.js +1 -1
  115. package/dist/lib/canvas-layout.d.ts +115 -0
  116. package/dist/lib/canvas-layout.js +35 -0
  117. package/dist/lib/config.d.ts +27 -3
  118. package/dist/lib/config.js +4 -2
  119. package/dist/lib/entity-index.js +1 -1
  120. package/dist/lib/project-utils.js +4 -4
  121. package/dist/lib/session-repair.js +1 -1
  122. package/dist/lib/session-utils.js +1 -1
  123. package/dist/lib/tailscale.d.ts +225 -0
  124. package/dist/lib/tailscale.js +50 -0
  125. package/dist/lib/task-utils.js +3 -3
  126. package/dist/lib/template-engine.js +1 -1
  127. package/dist/lib/webdav.d.ts +109 -0
  128. package/dist/lib/webdav.js +35 -0
  129. package/dist/plugin/index.d.ts +344 -28
  130. package/dist/plugin/index.js +3919 -227
  131. package/dist/registry-BR4326o0.d.ts +30 -0
  132. package/dist/store-CA-6sKCJ.d.ts +34 -0
  133. package/dist/thread-B9LhXNU0.d.ts +41 -0
  134. package/dist/{types-Y2_Um2Ls.d.ts → types-BbWJoC1c.d.ts} +1 -44
  135. package/dist/workgraph/index.d.ts +5 -0
  136. package/dist/workgraph/index.js +23 -0
  137. package/dist/workgraph/ledger.d.ts +2 -0
  138. package/dist/workgraph/ledger.js +25 -0
  139. package/dist/workgraph/registry.d.ts +2 -0
  140. package/dist/workgraph/registry.js +19 -0
  141. package/dist/workgraph/store.d.ts +2 -0
  142. package/dist/workgraph/store.js +25 -0
  143. package/dist/workgraph/thread.d.ts +2 -0
  144. package/dist/workgraph/thread.js +25 -0
  145. package/dist/workgraph/types.d.ts +54 -0
  146. package/dist/workgraph/types.js +7 -0
  147. package/hooks/clawvault/HOOK.md +113 -0
  148. package/hooks/clawvault/handler.js +1559 -0
  149. package/hooks/clawvault/handler.test.js +510 -0
  150. package/hooks/clawvault/openclaw.plugin.json +72 -0
  151. package/openclaw.plugin.json +235 -30
  152. package/package.json +20 -20
  153. package/dist/chunk-3RG5ZIWI.js +0 -10
  154. package/dist/chunk-3ZIH425O.js +0 -871
  155. package/dist/chunk-6U6MK36V.js +0 -205
  156. package/dist/chunk-CMB7UL7C.js +0 -327
  157. package/dist/chunk-D2H45LON.js +0 -1074
  158. package/dist/chunk-E7MFQB6D.js +0 -163
  159. package/dist/chunk-GQSLDZTS.js +0 -560
  160. package/dist/chunk-MFM6K7PU.js +0 -374
  161. package/dist/chunk-MXSSG3QU.js +0 -42
  162. package/dist/chunk-OCGVIN3L.js +0 -88
  163. package/dist/chunk-PAH27GSN.js +0 -108
  164. package/dist/chunk-YCUNCH2I.js +0 -78
  165. package/dist/cli/index.cjs +0 -8584
  166. package/dist/cli/index.d.cts +0 -5
  167. package/dist/commands/archive.cjs +0 -287
  168. package/dist/commands/archive.d.cts +0 -11
  169. package/dist/commands/backlog.cjs +0 -721
  170. package/dist/commands/backlog.d.cts +0 -53
  171. package/dist/commands/blocked.cjs +0 -204
  172. package/dist/commands/blocked.d.cts +0 -26
  173. package/dist/commands/checkpoint.cjs +0 -244
  174. package/dist/commands/checkpoint.d.cts +0 -41
  175. package/dist/commands/compat.cjs +0 -294
  176. package/dist/commands/compat.d.cts +0 -28
  177. package/dist/commands/context.cjs +0 -2990
  178. package/dist/commands/context.d.cts +0 -2
  179. package/dist/commands/doctor.cjs +0 -2986
  180. package/dist/commands/doctor.d.cts +0 -21
  181. package/dist/commands/embed.cjs +0 -232
  182. package/dist/commands/embed.d.cts +0 -17
  183. package/dist/commands/entities.cjs +0 -141
  184. package/dist/commands/entities.d.cts +0 -7
  185. package/dist/commands/graph.cjs +0 -501
  186. package/dist/commands/graph.d.cts +0 -21
  187. package/dist/commands/inject.cjs +0 -1636
  188. package/dist/commands/inject.d.cts +0 -2
  189. package/dist/commands/kanban.cjs +0 -884
  190. package/dist/commands/kanban.d.cts +0 -63
  191. package/dist/commands/link.cjs +0 -965
  192. package/dist/commands/link.d.cts +0 -11
  193. package/dist/commands/migrate-observations.cjs +0 -362
  194. package/dist/commands/migrate-observations.d.cts +0 -19
  195. package/dist/commands/observe.cjs +0 -4099
  196. package/dist/commands/observe.d.cts +0 -23
  197. package/dist/commands/project.cjs +0 -1341
  198. package/dist/commands/project.d.cts +0 -85
  199. package/dist/commands/rebuild.cjs +0 -3136
  200. package/dist/commands/rebuild.d.cts +0 -11
  201. package/dist/commands/recover.cjs +0 -361
  202. package/dist/commands/recover.d.cts +0 -38
  203. package/dist/commands/reflect.cjs +0 -1008
  204. package/dist/commands/reflect.d.cts +0 -11
  205. package/dist/commands/repair-session.cjs +0 -457
  206. package/dist/commands/repair-session.d.cts +0 -38
  207. package/dist/commands/replay.cjs +0 -4103
  208. package/dist/commands/replay.d.cts +0 -16
  209. package/dist/commands/session-recap.cjs +0 -353
  210. package/dist/commands/session-recap.d.cts +0 -27
  211. package/dist/commands/setup.cjs +0 -1278
  212. package/dist/commands/setup.d.cts +0 -99
  213. package/dist/commands/shell-init.cjs +0 -75
  214. package/dist/commands/shell-init.d.cts +0 -7
  215. package/dist/commands/sleep.cjs +0 -6029
  216. package/dist/commands/sleep.d.cts +0 -36
  217. package/dist/commands/status.cjs +0 -2737
  218. package/dist/commands/status.d.cts +0 -52
  219. package/dist/commands/task.cjs +0 -1236
  220. package/dist/commands/task.d.cts +0 -97
  221. package/dist/commands/template.cjs +0 -457
  222. package/dist/commands/template.d.cts +0 -36
  223. package/dist/commands/wake.cjs +0 -2627
  224. package/dist/commands/wake.d.cts +0 -22
  225. package/dist/context-BUGaWpyL.d.cts +0 -46
  226. package/dist/index.cjs +0 -12373
  227. package/dist/index.d.cts +0 -854
  228. package/dist/inject-Bzi5E-By.d.cts +0 -137
  229. package/dist/lib/auto-linker.cjs +0 -176
  230. package/dist/lib/auto-linker.d.cts +0 -26
  231. package/dist/lib/config.cjs +0 -78
  232. package/dist/lib/config.d.cts +0 -11
  233. package/dist/lib/entity-index.cjs +0 -84
  234. package/dist/lib/entity-index.d.cts +0 -26
  235. package/dist/lib/project-utils.cjs +0 -864
  236. package/dist/lib/project-utils.d.cts +0 -97
  237. package/dist/lib/session-repair.cjs +0 -239
  238. package/dist/lib/session-repair.d.cts +0 -110
  239. package/dist/lib/session-utils.cjs +0 -209
  240. package/dist/lib/session-utils.d.cts +0 -63
  241. package/dist/lib/task-utils.cjs +0 -1137
  242. package/dist/lib/task-utils.d.cts +0 -208
  243. package/dist/lib/template-engine.cjs +0 -47
  244. package/dist/lib/template-engine.d.cts +0 -11
  245. package/dist/plugin/index.cjs +0 -1907
  246. package/dist/plugin/index.d.cts +0 -36
  247. package/dist/plugin/inject.cjs +0 -356
  248. package/dist/plugin/inject.d.cts +0 -54
  249. package/dist/plugin/inject.d.ts +0 -54
  250. package/dist/plugin/inject.js +0 -17
  251. package/dist/plugin/observe.cjs +0 -631
  252. package/dist/plugin/observe.d.cts +0 -39
  253. package/dist/plugin/observe.d.ts +0 -39
  254. package/dist/plugin/observe.js +0 -18
  255. package/dist/plugin/templates.cjs +0 -593
  256. package/dist/plugin/templates.d.cts +0 -52
  257. package/dist/plugin/templates.d.ts +0 -52
  258. package/dist/plugin/templates.js +0 -25
  259. package/dist/plugin/types.cjs +0 -18
  260. package/dist/plugin/types.d.cts +0 -209
  261. package/dist/plugin/types.d.ts +0 -209
  262. package/dist/plugin/types.js +0 -0
  263. package/dist/plugin/vault.cjs +0 -927
  264. package/dist/plugin/vault.d.cts +0 -68
  265. package/dist/plugin/vault.d.ts +0 -68
  266. package/dist/plugin/vault.js +0 -22
  267. package/dist/types-Y2_Um2Ls.d.cts +0 -205
  268. package/templates/memory-event.md +0 -67
  269. package/templates/party.md +0 -63
  270. package/templates/primitive-registry.yaml +0 -551
  271. package/templates/run.md +0 -68
  272. package/templates/trigger.md +0 -68
  273. 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
- };