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
@@ -6,16 +6,21 @@ import {
6
6
  import * as fs from "fs";
7
7
  import * as path from "path";
8
8
  var CONFIG_FILE = ".clawvault.json";
9
- var OBSERVE_PROVIDERS = ["anthropic", "openai", "gemini"];
9
+ var OBSERVE_PROVIDERS = ["anthropic", "openai", "gemini", "xai", "openclaw"];
10
10
  var OBSERVER_COMPRESSION_PROVIDERS = [
11
11
  "anthropic",
12
12
  "openai",
13
13
  "gemini",
14
+ "xai",
14
15
  "openai-compatible",
15
- "ollama"
16
+ "ollama",
17
+ "openclaw",
18
+ "minimax",
19
+ "zai"
16
20
  ];
17
21
  var THEMES = ["neural", "minimal", "none"];
18
22
  var CONTEXT_PROFILES = ["default", "planning", "incident", "handoff", "auto"];
23
+ var FACT_EXTRACTION_MODES = ["off", "rule", "llm", "hybrid"];
19
24
  var SUPPORTED_CONFIG_KEYS = [
20
25
  "name",
21
26
  "categories",
@@ -26,6 +31,7 @@ var SUPPORTED_CONFIG_KEYS = [
26
31
  "observer.compression.model",
27
32
  "observer.compression.baseUrl",
28
33
  "observer.compression.apiKey",
34
+ "observer.factExtractionMode",
29
35
  "context.maxResults",
30
36
  "context.defaultProfile",
31
37
  "graph.maxHops",
@@ -36,6 +42,7 @@ var SUPPORTED_CONFIG_KEYS = [
36
42
  var DEFAULT_THEME = "none";
37
43
  var DEFAULT_OBSERVE_MODEL = "gemini-2.0-flash";
38
44
  var DEFAULT_OBSERVE_PROVIDER = "gemini";
45
+ var DEFAULT_FACT_EXTRACTION_MODE = "llm";
39
46
  var DEFAULT_CONTEXT_MAX_RESULTS = 5;
40
47
  var DEFAULT_CONTEXT_PROFILE = "default";
41
48
  var DEFAULT_GRAPH_MAX_HOPS = 2;
@@ -113,6 +120,9 @@ function isTheme(value) {
113
120
  function isContextProfile(value) {
114
121
  return typeof value === "string" && CONTEXT_PROFILES.includes(value);
115
122
  }
123
+ function isFactExtractionMode(value) {
124
+ return typeof value === "string" && FACT_EXTRACTION_MODES.includes(value);
125
+ }
116
126
  function normalizeRouteTarget(target) {
117
127
  const trimmed = target.trim().replace(/^\/+/, "").replace(/\/+$/, "");
118
128
  if (!trimmed) {
@@ -196,7 +206,8 @@ function withDefaults(vaultPath, config) {
196
206
  provider: DEFAULT_OBSERVE_PROVIDER
197
207
  },
198
208
  observer: {
199
- compression: {}
209
+ compression: {},
210
+ factExtractionMode: DEFAULT_FACT_EXTRACTION_MODE
200
211
  },
201
212
  context: {
202
213
  maxResults: DEFAULT_CONTEXT_MAX_RESULTS,
@@ -247,7 +258,8 @@ function withDefaults(vaultPath, config) {
247
258
  },
248
259
  observer: {
249
260
  ...observerRecord,
250
- compression: normalizedCompression
261
+ compression: normalizedCompression,
262
+ factExtractionMode: isFactExtractionMode(observerRecord.factExtractionMode) ? observerRecord.factExtractionMode : defaults.observer.factExtractionMode
251
263
  },
252
264
  context: {
253
265
  ...contextRecord,
@@ -335,6 +347,12 @@ function coerceManagedValue(key, value) {
335
347
  }
336
348
  return value.trim();
337
349
  }
350
+ if (key === "observer.factExtractionMode") {
351
+ if (!isFactExtractionMode(value)) {
352
+ throw new Error(`Config key "observer.factExtractionMode" must be one of: ${FACT_EXTRACTION_MODES.join(", ")}`);
353
+ }
354
+ return value;
355
+ }
338
356
  if (key === "context.maxResults") {
339
357
  const parsed = asPositiveInteger(value);
340
358
  if (parsed === null) {
@@ -424,7 +442,8 @@ function resetConfig(vaultPath) {
424
442
  const observerRecord = document.observer && typeof document.observer === "object" && !Array.isArray(document.observer) ? document.observer : {};
425
443
  document.observer = {
426
444
  ...observerRecord,
427
- compression: {}
445
+ compression: {},
446
+ factExtractionMode: DEFAULT_FACT_EXTRACTION_MODE
428
447
  };
429
448
  document.context = {
430
449
  maxResults: DEFAULT_CONTEXT_MAX_RESULTS,
@@ -0,0 +1,190 @@
1
+ // src/lib/qmd-collections.ts
2
+ import { execFileSync } from "child_process";
3
+ var COLLECTION_HEADER_RE = /^(\S+)\s+\(qmd:\/\/([^)]+)\)\s*$/;
4
+ var DETAIL_LINE_RE = /^\s+([A-Za-z][A-Za-z0-9 _-]*):\s*(.+)\s*$/;
5
+ function normalizeDetailKey(value) {
6
+ return value.trim().toLowerCase().replace(/[ -]+/g, "_");
7
+ }
8
+ function parseCount(raw) {
9
+ if (!raw) return void 0;
10
+ const match = raw.match(/-?\d[\d,]*/);
11
+ if (!match) return void 0;
12
+ const parsed = Number.parseInt(match[0].replace(/,/g, ""), 10);
13
+ return Number.isFinite(parsed) ? parsed : void 0;
14
+ }
15
+ function pickDetail(details, keys) {
16
+ for (const key of keys) {
17
+ const value = details[key];
18
+ if (typeof value === "string" && value.trim()) {
19
+ return value.trim();
20
+ }
21
+ }
22
+ return void 0;
23
+ }
24
+ function pickCount(details, keys) {
25
+ for (const key of keys) {
26
+ const parsed = parseCount(details[key]);
27
+ if (parsed !== void 0) {
28
+ return parsed;
29
+ }
30
+ }
31
+ return void 0;
32
+ }
33
+ function parseQmdCollectionList(raw) {
34
+ const collections = [];
35
+ let current = null;
36
+ for (const line of raw.split(/\r?\n/)) {
37
+ const headerMatch = line.match(COLLECTION_HEADER_RE);
38
+ if (headerMatch) {
39
+ current = {
40
+ name: headerMatch[1],
41
+ uri: headerMatch[2],
42
+ details: {}
43
+ };
44
+ collections.push(current);
45
+ continue;
46
+ }
47
+ if (!current) continue;
48
+ const detailMatch = line.match(DETAIL_LINE_RE);
49
+ if (!detailMatch) continue;
50
+ const key = normalizeDetailKey(detailMatch[1]);
51
+ current.details[key] = detailMatch[2].trim();
52
+ }
53
+ for (const collection of collections) {
54
+ const root = pickDetail(collection.details, ["root", "path", "directory"]);
55
+ if (root) {
56
+ collection.root = root;
57
+ }
58
+ collection.files = pickCount(collection.details, ["files", "documents", "docs"]);
59
+ collection.vectors = pickCount(collection.details, ["vectors", "embeddings", "vector_embeddings"]);
60
+ collection.pendingEmbeddings = pickCount(collection.details, [
61
+ "pending",
62
+ "pending_vectors",
63
+ "pending_embeddings",
64
+ "unembedded",
65
+ "without_embeddings"
66
+ ]);
67
+ if (collection.pendingEmbeddings === void 0 && collection.files !== void 0 && collection.vectors !== void 0) {
68
+ collection.pendingEmbeddings = Math.max(collection.files - collection.vectors, 0);
69
+ }
70
+ }
71
+ return collections;
72
+ }
73
+ function listQmdCollections() {
74
+ const output = execFileSync("qmd", ["collection", "list"], {
75
+ encoding: "utf-8"
76
+ });
77
+ return parseQmdCollectionList(output);
78
+ }
79
+ function removeQmdCollection(name) {
80
+ try {
81
+ execFileSync("qmd", ["collection", "remove", name], { stdio: "ignore" });
82
+ return;
83
+ } catch {
84
+ execFileSync("qmd", ["collection", "rm", name], { stdio: "ignore" });
85
+ }
86
+ }
87
+ function collectionExists(name) {
88
+ try {
89
+ const collections = listQmdCollections();
90
+ return collections.some((c) => c.name === name);
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
95
+ function findCollectionByRoot(rootPath) {
96
+ try {
97
+ const collections = listQmdCollections();
98
+ const normalizedRoot = rootPath.replace(/\/$/, "");
99
+ return collections.find((c) => {
100
+ if (!c.root) return false;
101
+ const normalizedCollectionRoot = c.root.replace(/\/$/, "");
102
+ return normalizedCollectionRoot === normalizedRoot;
103
+ });
104
+ } catch {
105
+ return void 0;
106
+ }
107
+ }
108
+ function getFirstCollection() {
109
+ try {
110
+ const collections = listQmdCollections();
111
+ return collections[0];
112
+ } catch {
113
+ return void 0;
114
+ }
115
+ }
116
+
117
+ // src/lib/vault-qmd-config.ts
118
+ import * as fs from "fs";
119
+ import * as path from "path";
120
+ var CONFIG_FILE = ".clawvault.json";
121
+ function readTrimmedString(value) {
122
+ if (typeof value !== "string") return void 0;
123
+ const trimmed = value.trim();
124
+ return trimmed.length > 0 ? trimmed : void 0;
125
+ }
126
+ function autoDetectCollection(vaultPath, fallbackName) {
127
+ const byRoot = findCollectionByRoot(vaultPath);
128
+ if (byRoot) {
129
+ return { collection: byRoot.name, autoDetected: true };
130
+ }
131
+ if (collectionExists(fallbackName)) {
132
+ return { collection: fallbackName, autoDetected: false };
133
+ }
134
+ const first = getFirstCollection();
135
+ if (first) {
136
+ return { collection: first.name, autoDetected: true };
137
+ }
138
+ return { collection: fallbackName, autoDetected: false };
139
+ }
140
+ function loadVaultQmdConfig(vaultPath) {
141
+ const resolvedVaultPath = path.resolve(vaultPath);
142
+ const fallbackName = path.basename(resolvedVaultPath);
143
+ const fallbackRoot = resolvedVaultPath;
144
+ const configPath = path.join(resolvedVaultPath, CONFIG_FILE);
145
+ if (!fs.existsSync(configPath)) {
146
+ const { collection, autoDetected } = autoDetectCollection(resolvedVaultPath, fallbackName);
147
+ return {
148
+ vaultPath: resolvedVaultPath,
149
+ qmdCollection: collection,
150
+ qmdRoot: fallbackRoot,
151
+ autoDetected
152
+ };
153
+ }
154
+ try {
155
+ const raw = JSON.parse(fs.readFileSync(configPath, "utf-8"));
156
+ const configuredName = readTrimmedString(raw.name) ?? fallbackName;
157
+ const configuredCollection = readTrimmedString(raw.qmdCollection);
158
+ const rawRoot = readTrimmedString(raw.qmdRoot) ?? fallbackRoot;
159
+ const qmdRoot = path.isAbsolute(rawRoot) ? path.resolve(rawRoot) : path.resolve(resolvedVaultPath, rawRoot);
160
+ if (configuredCollection && collectionExists(configuredCollection)) {
161
+ return {
162
+ vaultPath: resolvedVaultPath,
163
+ qmdCollection: configuredCollection,
164
+ qmdRoot
165
+ };
166
+ }
167
+ const { collection, autoDetected } = autoDetectCollection(qmdRoot, configuredCollection ?? configuredName);
168
+ return {
169
+ vaultPath: resolvedVaultPath,
170
+ qmdCollection: collection,
171
+ qmdRoot,
172
+ autoDetected
173
+ };
174
+ } catch {
175
+ const { collection, autoDetected } = autoDetectCollection(resolvedVaultPath, fallbackName);
176
+ return {
177
+ vaultPath: resolvedVaultPath,
178
+ qmdCollection: collection,
179
+ qmdRoot: fallbackRoot,
180
+ autoDetected
181
+ };
182
+ }
183
+ }
184
+
185
+ export {
186
+ parseQmdCollectionList,
187
+ listQmdCollections,
188
+ removeQmdCollection,
189
+ loadVaultQmdConfig
190
+ };
@@ -1,12 +1,15 @@
1
1
  import {
2
2
  ClawVault
3
- } from "./chunk-LI4O6NVK.js";
3
+ } from "./chunk-YDWHS4LJ.js";
4
4
  import {
5
- getMemoryGraph
6
- } from "./chunk-ZZA73MFY.js";
5
+ FactStore
6
+ } from "./chunk-BSJ6RIT7.js";
7
7
  import {
8
8
  parseObservationMarkdown
9
- } from "./chunk-QK3UCXWL.js";
9
+ } from "./chunk-FHFUXL6G.js";
10
+ import {
11
+ getMemoryGraph
12
+ } from "./chunk-ZZA73MFY.js";
10
13
  import {
11
14
  listObservationFiles
12
15
  } from "./chunk-Z2XBWN7A.js";
@@ -179,19 +182,19 @@ function formatContextMarkdown(task, entries) {
179
182
  }
180
183
  var PROFILE_ORDERING = {
181
184
  default: {
182
- order: ["structural", "daily", "search", "graph", "potential", "contextual"],
185
+ order: ["structural", "fact", "daily", "search", "graph", "potential", "contextual"],
183
186
  caps: {}
184
187
  },
185
188
  planning: {
186
- order: ["search", "graph", "structural", "potential", "daily", "contextual"],
189
+ order: ["fact", "search", "graph", "structural", "potential", "daily", "contextual"],
187
190
  caps: { observation: 12, graph: 12 }
188
191
  },
189
192
  incident: {
190
- order: ["structural", "search", "potential", "daily", "graph", "contextual"],
193
+ order: ["structural", "fact", "search", "potential", "daily", "graph", "contextual"],
191
194
  caps: { observation: 20, graph: 8 }
192
195
  },
193
196
  handoff: {
194
- order: ["daily", "structural", "potential", "search", "graph", "contextual"],
197
+ order: ["daily", "structural", "fact", "potential", "search", "graph", "contextual"],
195
198
  caps: { "daily-note": 2, observation: 15 }
196
199
  }
197
200
  };
@@ -369,6 +372,64 @@ function buildObservationContextItems(vaultPath, queryKeywords) {
369
372
  }
370
373
  return items;
371
374
  }
375
+ var PREFERENCE_PATTERNS = /\b(prefer|like|favorite|favourit|enjoy|habit|allergy|allergic|diet|dislike|want|love|hate|routine)\b/i;
376
+ var TEMPORAL_PATTERNS = /\b(yesterday|today|last\s+(?:week|month|year|monday|tuesday|wednesday|thursday|friday|saturday|sunday)|in\s+\d{4}|on\s+\w+\s+\d{1,2}|\d{4}-\d{2}-\d{2}|january|february|march|april|may|june|july|august|september|october|november|december)\b/i;
377
+ function isPreferenceQuery(query) {
378
+ return PREFERENCE_PATTERNS.test(query);
379
+ }
380
+ function isTemporalQuery(query) {
381
+ return TEMPORAL_PATTERNS.test(query);
382
+ }
383
+ function buildFactContextItems(vaultPath, query, _queryKeywords) {
384
+ const factStore = new FactStore(vaultPath);
385
+ try {
386
+ factStore.load();
387
+ } catch {
388
+ return [];
389
+ }
390
+ const stats = factStore.stats();
391
+ if (stats.activeFacts === 0) return [];
392
+ const items = [];
393
+ const preferenceQuery = isPreferenceQuery(query);
394
+ const temporalQuery = isTemporalQuery(query);
395
+ const matchingFacts = factStore.searchFacts(query);
396
+ if (preferenceQuery) {
397
+ const prefs = factStore.getPreferences();
398
+ for (const pref of prefs) {
399
+ if (!matchingFacts.find((f) => f.id === pref.id)) {
400
+ matchingFacts.push(pref);
401
+ }
402
+ }
403
+ }
404
+ for (const fact of matchingFacts.slice(0, 10)) {
405
+ const factText = `${fact.entity} ${fact.relation} ${fact.value}`;
406
+ let score = fact.confidence * 0.8;
407
+ if (preferenceQuery && fact.category === "preference") {
408
+ score *= 1.5;
409
+ }
410
+ if (temporalQuery && (fact.relation.includes("_on") || fact.relation.includes("date") || fact.relation.includes("time"))) {
411
+ score *= 1.3;
412
+ }
413
+ const entry = {
414
+ title: `Fact: ${fact.entity} \u2192 ${fact.relation}`,
415
+ path: fact.source,
416
+ category: fact.category,
417
+ score: Math.min(1, score),
418
+ snippet: factText,
419
+ modified: fact.validFrom,
420
+ age: formatRelativeAge(new Date(fact.validFrom)),
421
+ source: "observation",
422
+ // Use 'observation' since ContextSource doesn't include 'fact'
423
+ signals: ["fact_store", fact.category],
424
+ rationale: `Extracted fact (${fact.category}, confidence: ${fact.confidence.toFixed(2)})`
425
+ };
426
+ items.push({
427
+ priority: preferenceQuery && fact.category === "preference" ? 1 : 2,
428
+ entry
429
+ });
430
+ }
431
+ return items;
432
+ }
372
433
  function buildSearchContextItems(vault, results) {
373
434
  return results.map((result) => {
374
435
  const relativePath = path.relative(vault.getPath(), result.document.path).split(path.sep).join("/");
@@ -592,6 +653,7 @@ async function buildContext(task, options) {
592
653
  });
593
654
  const searchItems = buildSearchContextItems(vault, searchResults);
594
655
  const dailyItems = buildDailyContextItems(vault.getPath(), allDocuments);
656
+ const factItems = buildFactContextItems(vault.getPath(), normalizedTask, queryKeywords);
595
657
  const observationItems = includeObservations ? buildObservationContextItems(vault.getPath(), queryKeywords) : [];
596
658
  const graph = await getMemoryGraph(vault.getPath());
597
659
  const graphItems = buildGraphContextItems({
@@ -608,11 +670,13 @@ async function buildContext(task, options) {
608
670
  const contextualObservations = observationItems.filter((item) => item.priority === 5).sort(byScoreDesc);
609
671
  const sortedDailyItems = [...dailyItems].sort(byScoreDesc);
610
672
  const sortedSearchItems = [...searchItems].sort(byScoreDesc);
673
+ const sortedFactItems = [...factItems].sort(byScoreDesc);
611
674
  const sortedGraphItems = [...graphItems].sort(byScoreDesc);
612
675
  const grouped = {
613
676
  structural: structuralObservations,
614
677
  daily: sortedDailyItems,
615
678
  search: sortedSearchItems,
679
+ fact: sortedFactItems,
616
680
  graph: sortedGraphItems,
617
681
  potential: potentialObservations,
618
682
  contextual: contextualObservations
@@ -0,0 +1,15 @@
1
+ // src/workgraph/types.ts
2
+ var THREAD_STATUS_TRANSITIONS = {
3
+ open: ["active", "cancelled"],
4
+ active: ["blocked", "done", "cancelled", "open"],
5
+ // open = release
6
+ blocked: ["active", "cancelled"],
7
+ done: [],
8
+ // terminal
9
+ cancelled: ["open"]
10
+ // can be reopened
11
+ };
12
+
13
+ export {
14
+ THREAD_STATUS_TRANSITIONS
15
+ };