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
@@ -0,0 +1,183 @@
1
+ // src/lib/canvas-layout.ts
2
+ import * as crypto from "crypto";
3
+ var CANVAS_COLORS = {
4
+ RED: "1",
5
+ // Critical, blocked
6
+ ORANGE: "2",
7
+ // High priority
8
+ YELLOW: "3",
9
+ // Medium priority
10
+ GREEN: "4",
11
+ // Done, success
12
+ CYAN: "5",
13
+ // Stats
14
+ PURPLE: "6"
15
+ // Knowledge graph
16
+ };
17
+ var LAYOUT = {
18
+ LEFT_COLUMN_X: 0,
19
+ LEFT_COLUMN_WIDTH: 500,
20
+ RIGHT_COLUMN_X: 550,
21
+ RIGHT_COLUMN_WIDTH: 450,
22
+ GROUP_PADDING: 20,
23
+ NODE_SPACING: 15,
24
+ GROUP_SPACING: 50,
25
+ DEFAULT_NODE_WIDTH: 280,
26
+ DEFAULT_NODE_HEIGHT: 80,
27
+ FILE_NODE_HEIGHT: 60,
28
+ SMALL_NODE_HEIGHT: 50,
29
+ GROUP_HEADER_HEIGHT: 40
30
+ };
31
+ function generateId() {
32
+ return crypto.randomBytes(8).toString("hex");
33
+ }
34
+ function createTextNode(x, y, width, height, text, color) {
35
+ const node = {
36
+ id: generateId(),
37
+ type: "text",
38
+ x,
39
+ y,
40
+ width,
41
+ height,
42
+ text
43
+ };
44
+ if (color) node.color = color;
45
+ return node;
46
+ }
47
+ function createFileNode(x, y, width, height, file, color) {
48
+ const node = {
49
+ id: generateId(),
50
+ type: "file",
51
+ x,
52
+ y,
53
+ width,
54
+ height,
55
+ file
56
+ };
57
+ if (color) node.color = color;
58
+ return node;
59
+ }
60
+ function createGroupNode(x, y, width, height, label, color) {
61
+ const node = {
62
+ id: generateId(),
63
+ type: "group",
64
+ x,
65
+ y,
66
+ width,
67
+ height,
68
+ label
69
+ };
70
+ if (color) node.color = color;
71
+ return node;
72
+ }
73
+ function createEdge(fromNode, fromSide, toNode, toSide, label, color) {
74
+ const edge = {
75
+ id: generateId(),
76
+ fromNode,
77
+ fromSide,
78
+ toNode,
79
+ toSide
80
+ };
81
+ if (label) edge.label = label;
82
+ if (color) edge.color = color;
83
+ return edge;
84
+ }
85
+ function stackNodesVertically(nodes, startX, startY, spacing = LAYOUT.NODE_SPACING) {
86
+ let currentY = startY;
87
+ const positionedNodes = [];
88
+ for (const node of nodes) {
89
+ positionedNodes.push({
90
+ ...node,
91
+ x: startX,
92
+ y: currentY
93
+ });
94
+ currentY += node.height + spacing;
95
+ }
96
+ return {
97
+ nodes: positionedNodes,
98
+ totalHeight: currentY - startY - spacing
99
+ };
100
+ }
101
+ function createGroupWithNodes(groupX, groupY, groupWidth, label, childNodes, color) {
102
+ const padding = LAYOUT.GROUP_PADDING;
103
+ const headerHeight = LAYOUT.GROUP_HEADER_HEIGHT;
104
+ const stacked = stackNodesVertically(
105
+ childNodes,
106
+ groupX + padding,
107
+ groupY + headerHeight + padding
108
+ );
109
+ const groupHeight = headerHeight + padding * 2 + stacked.totalHeight + LAYOUT.NODE_SPACING;
110
+ const group = createGroupNode(groupX, groupY, groupWidth, groupHeight, label, color);
111
+ return {
112
+ group,
113
+ nodes: stacked.nodes
114
+ };
115
+ }
116
+ function getPriorityColor(priority) {
117
+ switch (priority) {
118
+ case "critical":
119
+ return CANVAS_COLORS.RED;
120
+ case "high":
121
+ return CANVAS_COLORS.ORANGE;
122
+ case "medium":
123
+ return CANVAS_COLORS.YELLOW;
124
+ default:
125
+ return void 0;
126
+ }
127
+ }
128
+ function truncateText(text, maxChars) {
129
+ if (text.length <= maxChars) return text;
130
+ return text.slice(0, maxChars - 3) + "...";
131
+ }
132
+ function formatCanvasText(lines) {
133
+ return lines.join("\n");
134
+ }
135
+ function calculateColumnHeight(groups) {
136
+ let height = 0;
137
+ for (let i = 0; i < groups.length; i++) {
138
+ height += groups[i].group.height;
139
+ if (i < groups.length - 1) {
140
+ height += LAYOUT.GROUP_SPACING;
141
+ }
142
+ }
143
+ return height;
144
+ }
145
+ function positionGroupsVertically(groups, startY = 0) {
146
+ let currentY = startY;
147
+ const positioned = [];
148
+ for (const { group, nodes } of groups) {
149
+ const yOffset = currentY - group.y;
150
+ positioned.push({
151
+ group: { ...group, y: currentY },
152
+ nodes: nodes.map((n) => ({ ...n, y: n.y + yOffset }))
153
+ });
154
+ currentY += group.height + LAYOUT.GROUP_SPACING;
155
+ }
156
+ return positioned;
157
+ }
158
+ function flattenGroups(groups) {
159
+ const nodes = [];
160
+ for (const { group, nodes: childNodes } of groups) {
161
+ nodes.push(group);
162
+ nodes.push(...childNodes);
163
+ }
164
+ return nodes;
165
+ }
166
+
167
+ export {
168
+ CANVAS_COLORS,
169
+ LAYOUT,
170
+ generateId,
171
+ createTextNode,
172
+ createFileNode,
173
+ createGroupNode,
174
+ createEdge,
175
+ stackNodesVertically,
176
+ createGroupWithNodes,
177
+ getPriorityColor,
178
+ truncateText,
179
+ formatCanvasText,
180
+ calculateColumnHeight,
181
+ positionGroupsVertically,
182
+ flattenGroups
183
+ };
@@ -295,7 +295,6 @@ export {
295
295
  normalizeTemplateName,
296
296
  buildTemplateIndex,
297
297
  parseTemplateDefinition,
298
- loadTemplateDefinition,
299
298
  loadSchemaTemplateDefinition,
300
299
  listTemplateDefinitions,
301
300
  renderDocumentFromTemplate
@@ -1,14 +1,14 @@
1
+ import {
2
+ normalizeObservationContent,
3
+ parseObservationMarkdown
4
+ } from "./chunk-FHFUXL6G.js";
1
5
  import {
2
6
  requestLlmCompletion,
3
7
  resolveLlmProvider
4
- } from "./chunk-E7MFQB6D.js";
8
+ } from "./chunk-YXQCA6B7.js";
5
9
  import {
6
10
  archiveObservations
7
11
  } from "./chunk-MQUJNOHK.js";
8
- import {
9
- normalizeObservationContent,
10
- parseObservationMarkdown
11
- } from "./chunk-QK3UCXWL.js";
12
12
  import {
13
13
  formatIsoWeekKey,
14
14
  getIsoWeek,
@@ -213,7 +213,7 @@ function promoteWeekRecords(records) {
213
213
  return promoted;
214
214
  }
215
215
  async function maybeGenerateLlmReflection(weekKey, sections) {
216
- const provider = await resolveLlmProvider();
216
+ const provider = resolveLlmProvider();
217
217
  if (!provider) {
218
218
  return null;
219
219
  }
@@ -0,0 +1,207 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-U67V476Y.js";
4
+
5
+ // src/workgraph/registry.ts
6
+ var registry_exports = {};
7
+ __export(registry_exports, {
8
+ defineType: () => defineType,
9
+ extendType: () => extendType,
10
+ getType: () => getType,
11
+ listTypes: () => listTypes,
12
+ loadRegistry: () => loadRegistry,
13
+ registryPath: () => registryPath,
14
+ saveRegistry: () => saveRegistry
15
+ });
16
+ import fs from "fs";
17
+ import path from "path";
18
+ var REGISTRY_FILE = ".clawvault/registry.json";
19
+ var CURRENT_VERSION = 1;
20
+ var BUILT_IN_TYPES = [
21
+ {
22
+ name: "thread",
23
+ description: "A unit of coordinated work. The core workgraph node.",
24
+ directory: "threads",
25
+ builtIn: true,
26
+ createdAt: "2026-01-01T00:00:00.000Z",
27
+ createdBy: "system",
28
+ fields: {
29
+ title: { type: "string", required: true, description: "What this thread is about" },
30
+ goal: { type: "string", required: true, description: "What success looks like" },
31
+ status: { type: "string", required: true, default: "open", description: "open | active | blocked | done | cancelled" },
32
+ owner: { type: "string", description: "Agent that claimed this thread" },
33
+ priority: { type: "string", default: "medium", description: "urgent | high | medium | low" },
34
+ deps: { type: "list", default: [], description: "Wiki-link refs to threads this depends on" },
35
+ parent: { type: "ref", description: "Parent thread (if decomposed from a larger thread)" },
36
+ context_refs: { type: "list", default: [], description: "Wiki-link refs to vault docs that inform this work" },
37
+ tags: { type: "list", default: [], description: "Freeform tags" },
38
+ created: { type: "date", required: true },
39
+ updated: { type: "date", required: true }
40
+ }
41
+ },
42
+ {
43
+ name: "space",
44
+ description: "A workspace boundary that groups related threads and sets context.",
45
+ directory: "spaces",
46
+ builtIn: true,
47
+ createdAt: "2026-01-01T00:00:00.000Z",
48
+ createdBy: "system",
49
+ fields: {
50
+ title: { type: "string", required: true, description: "Space name" },
51
+ description: { type: "string", description: "What this space is for" },
52
+ members: { type: "list", default: [], description: "Agent names that participate" },
53
+ thread_refs: { type: "list", default: [], description: "Wiki-link refs to threads in this space" },
54
+ tags: { type: "list", default: [], description: "Freeform tags" },
55
+ created: { type: "date", required: true },
56
+ updated: { type: "date", required: true }
57
+ }
58
+ },
59
+ {
60
+ name: "decision",
61
+ description: "A recorded decision with reasoning and context.",
62
+ directory: "decisions",
63
+ builtIn: true,
64
+ createdAt: "2026-01-01T00:00:00.000Z",
65
+ createdBy: "system",
66
+ fields: {
67
+ title: { type: "string", required: true },
68
+ date: { type: "date", required: true },
69
+ status: { type: "string", default: "active", description: "active | superseded | reverted" },
70
+ context_refs: { type: "list", default: [], description: "What informed this decision" },
71
+ tags: { type: "list", default: [] }
72
+ }
73
+ },
74
+ {
75
+ name: "lesson",
76
+ description: "A captured insight or pattern learned from experience.",
77
+ directory: "lessons",
78
+ builtIn: true,
79
+ createdAt: "2026-01-01T00:00:00.000Z",
80
+ createdBy: "system",
81
+ fields: {
82
+ title: { type: "string", required: true },
83
+ date: { type: "date", required: true },
84
+ confidence: { type: "string", default: "medium", description: "high | medium | low" },
85
+ context_refs: { type: "list", default: [] },
86
+ tags: { type: "list", default: [] }
87
+ }
88
+ },
89
+ {
90
+ name: "fact",
91
+ description: "A structured piece of knowledge with optional temporal validity.",
92
+ directory: "facts",
93
+ builtIn: true,
94
+ createdAt: "2026-01-01T00:00:00.000Z",
95
+ createdBy: "system",
96
+ fields: {
97
+ subject: { type: "string", required: true },
98
+ predicate: { type: "string", required: true },
99
+ object: { type: "string", required: true },
100
+ confidence: { type: "number", default: 1 },
101
+ valid_from: { type: "date" },
102
+ valid_until: { type: "date" },
103
+ source: { type: "ref", description: "Where this fact came from" }
104
+ }
105
+ },
106
+ {
107
+ name: "agent",
108
+ description: "A registered participant in the workgraph.",
109
+ directory: "agents",
110
+ builtIn: true,
111
+ createdAt: "2026-01-01T00:00:00.000Z",
112
+ createdBy: "system",
113
+ fields: {
114
+ name: { type: "string", required: true },
115
+ role: { type: "string", description: "What this agent specializes in" },
116
+ capabilities: { type: "list", default: [], description: "What this agent can do" },
117
+ active_threads: { type: "list", default: [], description: "Threads currently claimed" },
118
+ last_seen: { type: "date" }
119
+ }
120
+ }
121
+ ];
122
+ function registryPath(vaultPath) {
123
+ return path.join(vaultPath, REGISTRY_FILE);
124
+ }
125
+ function loadRegistry(vaultPath) {
126
+ const rPath = registryPath(vaultPath);
127
+ if (fs.existsSync(rPath)) {
128
+ const raw = fs.readFileSync(rPath, "utf-8");
129
+ const registry = JSON.parse(raw);
130
+ return ensureBuiltIns(registry);
131
+ }
132
+ return seedRegistry();
133
+ }
134
+ function saveRegistry(vaultPath, registry) {
135
+ const rPath = registryPath(vaultPath);
136
+ const dir = path.dirname(rPath);
137
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
138
+ fs.writeFileSync(rPath, JSON.stringify(registry, null, 2) + "\n", "utf-8");
139
+ }
140
+ function defineType(vaultPath, name, description, fields, actor, directory) {
141
+ const registry = loadRegistry(vaultPath);
142
+ const safeName = name.toLowerCase().replace(/[^a-z0-9_-]/g, "-");
143
+ if (registry.types[safeName]?.builtIn) {
144
+ throw new Error(`Cannot redefine built-in type "${safeName}". You can extend it with new fields instead.`);
145
+ }
146
+ const now = (/* @__PURE__ */ new Date()).toISOString();
147
+ const typeDef = {
148
+ name: safeName,
149
+ description,
150
+ fields: {
151
+ title: { type: "string", required: true },
152
+ created: { type: "date", required: true },
153
+ updated: { type: "date", required: true },
154
+ tags: { type: "list", default: [] },
155
+ ...fields
156
+ },
157
+ directory: directory ?? `${safeName}s`,
158
+ builtIn: false,
159
+ createdAt: now,
160
+ createdBy: actor
161
+ };
162
+ registry.types[safeName] = typeDef;
163
+ saveRegistry(vaultPath, registry);
164
+ return typeDef;
165
+ }
166
+ function getType(vaultPath, name) {
167
+ const registry = loadRegistry(vaultPath);
168
+ return registry.types[name];
169
+ }
170
+ function listTypes(vaultPath) {
171
+ const registry = loadRegistry(vaultPath);
172
+ return Object.values(registry.types);
173
+ }
174
+ function extendType(vaultPath, name, newFields, actor) {
175
+ const registry = loadRegistry(vaultPath);
176
+ const existing = registry.types[name];
177
+ if (!existing) throw new Error(`Type "${name}" not found in registry.`);
178
+ existing.fields = { ...existing.fields, ...newFields };
179
+ saveRegistry(vaultPath, registry);
180
+ return existing;
181
+ }
182
+ function seedRegistry() {
183
+ const types = {};
184
+ for (const t of BUILT_IN_TYPES) {
185
+ types[t.name] = t;
186
+ }
187
+ return { version: CURRENT_VERSION, types };
188
+ }
189
+ function ensureBuiltIns(registry) {
190
+ for (const t of BUILT_IN_TYPES) {
191
+ if (!registry.types[t.name]) {
192
+ registry.types[t.name] = t;
193
+ }
194
+ }
195
+ return registry;
196
+ }
197
+
198
+ export {
199
+ registryPath,
200
+ loadRegistry,
201
+ saveRegistry,
202
+ defineType,
203
+ getType,
204
+ listTypes,
205
+ extendType,
206
+ registry_exports
207
+ };
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  checkDirtyDeath,
6
6
  clearDirtyFlag
7
- } from "./chunk-WAZ3NLWL.js";
7
+ } from "./chunk-F55HGNU4.js";
8
8
 
9
9
  // src/commands/recover.ts
10
10
  import * as fs from "fs";
@@ -0,0 +1,154 @@
1
+ // src/lib/hybrid-search.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ var embeddingPipeline = null;
5
+ var pipelineLoading = null;
6
+ async function getEmbeddingPipeline() {
7
+ if (embeddingPipeline) return embeddingPipeline;
8
+ if (pipelineLoading) return pipelineLoading;
9
+ pipelineLoading = (async () => {
10
+ const { pipeline } = await import("@huggingface/transformers");
11
+ embeddingPipeline = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2", {
12
+ dtype: "fp32"
13
+ });
14
+ return embeddingPipeline;
15
+ })();
16
+ return pipelineLoading;
17
+ }
18
+ async function embed(text) {
19
+ const pipe = await getEmbeddingPipeline();
20
+ const result = await pipe(text, { pooling: "mean", normalize: true });
21
+ return new Float32Array(result.data);
22
+ }
23
+ async function embedBatch(texts) {
24
+ const pipe = await getEmbeddingPipeline();
25
+ const results = [];
26
+ const batchSize = 32;
27
+ for (let i = 0; i < texts.length; i += batchSize) {
28
+ const batch = texts.slice(i, i + batchSize);
29
+ for (const text of batch) {
30
+ const result = await pipe(text, { pooling: "mean", normalize: true });
31
+ results.push(new Float32Array(result.data));
32
+ }
33
+ }
34
+ return results;
35
+ }
36
+ function cosineSimilarity(a, b) {
37
+ let dot = 0;
38
+ for (let i = 0; i < a.length; i++) {
39
+ dot += a[i] * b[i];
40
+ }
41
+ return dot;
42
+ }
43
+ var EmbeddingCache = class {
44
+ cachePath;
45
+ cache = /* @__PURE__ */ new Map();
46
+ dirty = false;
47
+ constructor(vaultPath) {
48
+ this.cachePath = path.join(vaultPath, ".clawvault", "embeddings.bin");
49
+ }
50
+ /**
51
+ * Load cache from disk
52
+ */
53
+ load() {
54
+ try {
55
+ if (!fs.existsSync(this.cachePath)) return;
56
+ const data = JSON.parse(fs.readFileSync(this.cachePath + ".json", "utf-8"));
57
+ for (const [key, arr] of Object.entries(data)) {
58
+ this.cache.set(key, new Float32Array(arr));
59
+ }
60
+ } catch {
61
+ }
62
+ }
63
+ /**
64
+ * Save cache to disk
65
+ */
66
+ save() {
67
+ if (!this.dirty) return;
68
+ const dir = path.dirname(this.cachePath);
69
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
70
+ const data = {};
71
+ for (const [key, arr] of this.cache.entries()) {
72
+ data[key] = Array.from(arr);
73
+ }
74
+ fs.writeFileSync(this.cachePath + ".json", JSON.stringify(data));
75
+ this.dirty = false;
76
+ }
77
+ get(key) {
78
+ return this.cache.get(key);
79
+ }
80
+ set(key, embedding) {
81
+ this.cache.set(key, embedding);
82
+ this.dirty = true;
83
+ }
84
+ has(key) {
85
+ return this.cache.has(key);
86
+ }
87
+ entries() {
88
+ return this.cache.entries();
89
+ }
90
+ get size() {
91
+ return this.cache.size;
92
+ }
93
+ };
94
+ function reciprocalRankFusion(list1, list2, k = 60) {
95
+ const scores = /* @__PURE__ */ new Map();
96
+ for (let rank = 0; rank < list1.length; rank++) {
97
+ const { id } = list1[rank];
98
+ scores.set(id, (scores.get(id) || 0) + 1 / (k + rank + 1));
99
+ }
100
+ for (let rank = 0; rank < list2.length; rank++) {
101
+ const { id } = list2[rank];
102
+ scores.set(id, (scores.get(id) || 0) + 1 / (k + rank + 1));
103
+ }
104
+ return Array.from(scores.entries()).map(([id, score]) => ({ id, score })).sort((a, b) => b.score - a.score);
105
+ }
106
+ async function semanticSearch(query, cache, topK = 20) {
107
+ const queryEmb = await embed(query);
108
+ const results = [];
109
+ for (const [id, docEmb] of cache.entries()) {
110
+ results.push({ id, score: cosineSimilarity(queryEmb, docEmb) });
111
+ }
112
+ results.sort((a, b) => b.score - a.score);
113
+ return results.slice(0, topK);
114
+ }
115
+ async function hybridSearch(query, bm25Results, cache, options = {}) {
116
+ const { topK = 20, rrfK = 60 } = options;
117
+ const bm25Ranked = bm25Results.map((r) => ({ id: r.document.path || r.document.id, score: r.score }));
118
+ const semanticRanked = await semanticSearch(query, cache, topK);
119
+ const fused = reciprocalRankFusion(bm25Ranked, semanticRanked, rrfK);
120
+ const bm25Map = new Map(bm25Results.map((r) => [r.document.path || r.document.id, r]));
121
+ return fused.slice(0, topK).map(({ id, score }) => {
122
+ const existing = bm25Map.get(id);
123
+ if (existing) {
124
+ return { ...existing, score };
125
+ }
126
+ const minimalDoc = {
127
+ id: id.replace(/\.md$/, ""),
128
+ path: id.endsWith(".md") ? id : id + ".md",
129
+ title: (id.split("/").pop() || id).replace(/\.md$/, ""),
130
+ content: "",
131
+ category: id.split("/")[0] || "root",
132
+ frontmatter: {},
133
+ links: [],
134
+ tags: [],
135
+ modified: /* @__PURE__ */ new Date()
136
+ };
137
+ return {
138
+ document: minimalDoc,
139
+ score,
140
+ snippet: "",
141
+ matchedTerms: []
142
+ };
143
+ });
144
+ }
145
+
146
+ export {
147
+ embed,
148
+ embedBatch,
149
+ cosineSimilarity,
150
+ EmbeddingCache,
151
+ reciprocalRankFusion,
152
+ semanticSearch,
153
+ hybridSearch
154
+ };