clawvault 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +422 -141
- package/bin/clawvault.js +10 -2
- package/bin/command-registration.test.js +3 -1
- package/bin/command-runtime.js +9 -1
- package/bin/register-core-commands.js +23 -28
- package/bin/register-maintenance-commands.js +39 -3
- package/bin/register-query-commands.js +58 -29
- package/bin/register-tailscale-commands.js +106 -0
- package/bin/register-task-commands.js +18 -1
- package/bin/register-task-commands.test.js +16 -0
- package/bin/register-vault-operations-commands.js +29 -1
- package/bin/register-workgraph-commands.js +1368 -0
- package/dashboard/lib/graph-diff.js +104 -0
- package/dashboard/lib/graph-diff.test.js +75 -0
- package/dashboard/lib/vault-parser.js +556 -0
- package/dashboard/lib/vault-parser.test.js +254 -0
- package/dashboard/public/app.js +796 -0
- package/dashboard/public/index.html +52 -0
- package/dashboard/public/styles.css +221 -0
- package/dashboard/server.js +374 -0
- package/dist/{chunk-F2JEUD4J.js → chunk-23YDQ3QU.js} +6 -8
- package/dist/{chunk-C7OK5WKP.js → chunk-2JQ3O2YL.js} +4 -4
- package/dist/{chunk-VR5NE7PZ.js → chunk-2RAZ4ZFE.js} +1 -1
- package/dist/chunk-2ZDO52B4.js +52 -0
- package/dist/{chunk-ZZA73MFY.js → chunk-33DOSHTA.js} +176 -36
- package/dist/chunk-33VSQP4J.js +37 -0
- package/dist/chunk-4BQTQMJP.js +93 -0
- package/dist/{chunk-GUKMRGM7.js → chunk-4OXMU5S2.js} +1 -1
- package/dist/{chunk-62YTUT6J.js → chunk-4PY655YM.js} +15 -3
- package/dist/chunk-6FH3IULF.js +352 -0
- package/dist/{chunk-3NSBOUT3.js → chunk-77Q5CSPJ.js} +404 -80
- package/dist/{chunk-4VQTUVH7.js → chunk-7YZWHM36.js} +52 -26
- package/dist/chunk-BSJ6RIT7.js +447 -0
- package/dist/chunk-BUEW6IIK.js +364 -0
- package/dist/{chunk-LI4O6NVK.js → chunk-CLJTREDS.js} +74 -14
- package/dist/chunk-EK6S23ZB.js +469 -0
- package/dist/{chunk-LNJA2UGL.js → chunk-ESFLMDRB.js} +9 -86
- package/dist/{chunk-H34S76MB.js → chunk-ESVS6K2B.js} +6 -6
- package/dist/{chunk-WAZ3NLWL.js → chunk-F55HGNU4.js} +0 -47
- package/dist/{chunk-QK3UCXWL.js → chunk-FHFUXL6G.js} +2 -2
- package/dist/{chunk-H62BP7RI.js → chunk-GAOWA7GR.js} +212 -46
- package/dist/chunk-GGA32J2R.js +784 -0
- package/dist/chunk-GNJL4YGR.js +79 -0
- package/dist/chunk-IVRIKYFE.js +520 -0
- package/dist/chunk-MDIH26GC.js +183 -0
- package/dist/{chunk-LYHGEHXG.js → chunk-MFAWT5O5.js} +0 -1
- package/dist/chunk-MM6QGW3P.js +207 -0
- package/dist/{chunk-P5EPF6MB.js → chunk-MW5C6ZQA.js} +110 -13
- package/dist/chunk-NCKFNBHJ.js +257 -0
- package/dist/{chunk-QBLMXKF2.js → chunk-OIWVQYQF.js} +1 -1
- package/dist/{chunk-42MXU7A6.js → chunk-P62WHA27.js} +58 -47
- package/dist/chunk-PBACDKKP.js +66 -0
- package/dist/{chunk-VGLOTGAS.js → chunk-QSHD36LH.js} +2 -2
- package/dist/{chunk-OZ7RIXTO.js → chunk-QSRRMEYM.js} +2 -2
- package/dist/chunk-QVEERJSP.js +152 -0
- package/dist/{chunk-N2AXRYLC.js → chunk-QWQ3TIKS.js} +1 -1
- package/dist/{chunk-3DHXQHYG.js → chunk-R2MIW5G7.js} +1 -1
- package/dist/{chunk-SJSFRIYS.js → chunk-SLXOR3CC.js} +2 -2
- package/dist/chunk-SS4B7P7V.js +99 -0
- package/dist/{chunk-JY6FYXIT.js → chunk-STCQGCEQ.js} +6 -11
- package/dist/chunk-TIGW564L.js +628 -0
- package/dist/chunk-U4O6C46S.js +154 -0
- package/dist/{chunk-ITPEXLHA.js → chunk-URXDAUVH.js} +24 -5
- package/dist/chunk-VSL7KY3M.js +189 -0
- package/dist/{chunk-U55BGUAU.js → chunk-W4SPAEE7.js} +6 -6
- package/dist/chunk-WMGIIABP.js +15 -0
- package/dist/{chunk-33UGEQRT.js → chunk-X3SPPUFG.js} +151 -64
- package/dist/chunk-Y6VJKXGL.js +373 -0
- package/dist/{chunk-3WRJEKN4.js → chunk-ZN54U2OZ.js} +123 -10
- package/dist/cli/index.js +34 -24
- package/dist/commands/archive.js +3 -3
- package/dist/commands/backlog.js +3 -3
- package/dist/commands/blocked.js +3 -3
- package/dist/commands/canvas.d.ts +15 -0
- package/dist/commands/canvas.js +200 -0
- package/dist/commands/checkpoint.js +2 -2
- package/dist/commands/compat.js +2 -2
- package/dist/commands/context.js +8 -6
- package/dist/commands/doctor.d.ts +11 -7
- package/dist/commands/doctor.js +18 -16
- package/dist/commands/embed.js +5 -6
- package/dist/commands/entities.js +2 -2
- package/dist/commands/graph.js +4 -4
- package/dist/commands/inject.d.ts +1 -1
- package/dist/commands/inject.js +5 -6
- package/dist/commands/kanban.js +4 -4
- package/dist/commands/link.js +5 -5
- package/dist/commands/migrate-observations.js +4 -4
- package/dist/commands/observe.d.ts +0 -1
- package/dist/commands/observe.js +14 -13
- package/dist/commands/project.js +5 -5
- package/dist/commands/rebuild-embeddings.d.ts +21 -0
- package/dist/commands/rebuild-embeddings.js +91 -0
- package/dist/commands/rebuild.js +12 -11
- package/dist/commands/recover.js +3 -3
- package/dist/commands/reflect.js +6 -7
- package/dist/commands/repair-session.js +1 -1
- package/dist/commands/replay.js +14 -14
- package/dist/commands/session-recap.js +1 -1
- package/dist/commands/setup.d.ts +2 -89
- package/dist/commands/setup.js +3 -21
- package/dist/commands/shell-init.js +1 -1
- package/dist/commands/sleep.d.ts +1 -1
- package/dist/commands/sleep.js +20 -19
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +57 -35
- package/dist/commands/sync-bd.d.ts +10 -0
- package/dist/commands/sync-bd.js +10 -0
- package/dist/commands/tailscale.d.ts +52 -0
- package/dist/commands/tailscale.js +26 -0
- package/dist/commands/task.js +4 -4
- package/dist/commands/template.js +2 -2
- package/dist/commands/wake.d.ts +1 -1
- package/dist/commands/wake.js +11 -10
- package/dist/commands/workgraph.d.ts +124 -0
- package/dist/commands/workgraph.js +38 -0
- package/dist/index.d.ts +341 -191
- package/dist/index.js +446 -116
- package/dist/{inject-Bzi5E-By.d.ts → inject-DYUrDqQO.d.ts} +3 -3
- package/dist/ledger-B7g7jhqG.d.ts +44 -0
- package/dist/lib/auto-linker.js +2 -2
- package/dist/lib/canvas-layout.d.ts +115 -0
- package/dist/lib/canvas-layout.js +35 -0
- package/dist/lib/config.d.ts +27 -3
- package/dist/lib/config.js +4 -2
- package/dist/lib/entity-index.js +1 -1
- package/dist/lib/project-utils.js +4 -4
- package/dist/lib/session-repair.js +1 -1
- package/dist/lib/session-utils.js +1 -1
- package/dist/lib/tailscale.d.ts +225 -0
- package/dist/lib/tailscale.js +50 -0
- package/dist/lib/task-utils.js +3 -3
- package/dist/lib/template-engine.js +1 -1
- package/dist/lib/webdav.d.ts +109 -0
- package/dist/lib/webdav.js +35 -0
- package/dist/onnxruntime_binding-5QEF3SUC.node +0 -0
- package/dist/onnxruntime_binding-BKPKNEGC.node +0 -0
- package/dist/onnxruntime_binding-FMOXGIUT.node +0 -0
- package/dist/onnxruntime_binding-OI2KMXC5.node +0 -0
- package/dist/onnxruntime_binding-UX44MLAZ.node +0 -0
- package/dist/onnxruntime_binding-Y2W7N7WY.node +0 -0
- package/dist/openclaw-plugin.d.ts +8 -0
- package/dist/openclaw-plugin.js +14 -0
- package/dist/registry-BR4326o0.d.ts +30 -0
- package/dist/store-CA-6sKCJ.d.ts +34 -0
- package/dist/thread-B9LhXNU0.d.ts +41 -0
- package/dist/transformers.node-A2ZRORSQ.js +46775 -0
- package/dist/{types-Y2_Um2Ls.d.ts → types-BbWJoC1c.d.ts} +1 -44
- package/dist/workgraph/index.d.ts +5 -0
- package/dist/workgraph/index.js +23 -0
- package/dist/workgraph/ledger.d.ts +2 -0
- package/dist/workgraph/ledger.js +25 -0
- package/dist/workgraph/registry.d.ts +2 -0
- package/dist/workgraph/registry.js +19 -0
- package/dist/workgraph/store.d.ts +2 -0
- package/dist/workgraph/store.js +25 -0
- package/dist/workgraph/thread.d.ts +2 -0
- package/dist/workgraph/thread.js +25 -0
- package/dist/workgraph/types.d.ts +54 -0
- package/dist/workgraph/types.js +7 -0
- package/hooks/clawvault/HOOK.md +113 -0
- package/hooks/clawvault/handler.js +1561 -0
- package/hooks/clawvault/handler.test.js +510 -0
- package/hooks/clawvault/openclaw.plugin.json +72 -0
- package/openclaw.plugin.json +65 -38
- package/package.json +25 -22
- package/dist/chunk-3RG5ZIWI.js +0 -10
- package/dist/chunk-3ZIH425O.js +0 -871
- package/dist/chunk-6U6MK36V.js +0 -205
- package/dist/chunk-CMB7UL7C.js +0 -327
- package/dist/chunk-D2H45LON.js +0 -1074
- package/dist/chunk-E7MFQB6D.js +0 -163
- package/dist/chunk-GQSLDZTS.js +0 -560
- package/dist/chunk-MFM6K7PU.js +0 -374
- package/dist/chunk-MXSSG3QU.js +0 -42
- package/dist/chunk-OCGVIN3L.js +0 -88
- package/dist/chunk-PAH27GSN.js +0 -108
- package/dist/chunk-YCUNCH2I.js +0 -78
- package/dist/cli/index.cjs +0 -8584
- package/dist/cli/index.d.cts +0 -5
- package/dist/commands/archive.cjs +0 -287
- package/dist/commands/archive.d.cts +0 -11
- package/dist/commands/backlog.cjs +0 -721
- package/dist/commands/backlog.d.cts +0 -53
- package/dist/commands/blocked.cjs +0 -204
- package/dist/commands/blocked.d.cts +0 -26
- package/dist/commands/checkpoint.cjs +0 -244
- package/dist/commands/checkpoint.d.cts +0 -41
- package/dist/commands/compat.cjs +0 -294
- package/dist/commands/compat.d.cts +0 -28
- package/dist/commands/context.cjs +0 -2990
- package/dist/commands/context.d.cts +0 -2
- package/dist/commands/doctor.cjs +0 -2986
- package/dist/commands/doctor.d.cts +0 -21
- package/dist/commands/embed.cjs +0 -232
- package/dist/commands/embed.d.cts +0 -17
- package/dist/commands/entities.cjs +0 -141
- package/dist/commands/entities.d.cts +0 -7
- package/dist/commands/graph.cjs +0 -501
- package/dist/commands/graph.d.cts +0 -21
- package/dist/commands/inject.cjs +0 -1636
- package/dist/commands/inject.d.cts +0 -2
- package/dist/commands/kanban.cjs +0 -884
- package/dist/commands/kanban.d.cts +0 -63
- package/dist/commands/link.cjs +0 -965
- package/dist/commands/link.d.cts +0 -11
- package/dist/commands/migrate-observations.cjs +0 -362
- package/dist/commands/migrate-observations.d.cts +0 -19
- package/dist/commands/observe.cjs +0 -4099
- package/dist/commands/observe.d.cts +0 -23
- package/dist/commands/project.cjs +0 -1341
- package/dist/commands/project.d.cts +0 -85
- package/dist/commands/rebuild.cjs +0 -3136
- package/dist/commands/rebuild.d.cts +0 -11
- package/dist/commands/recover.cjs +0 -361
- package/dist/commands/recover.d.cts +0 -38
- package/dist/commands/reflect.cjs +0 -1008
- package/dist/commands/reflect.d.cts +0 -11
- package/dist/commands/repair-session.cjs +0 -457
- package/dist/commands/repair-session.d.cts +0 -38
- package/dist/commands/replay.cjs +0 -4103
- package/dist/commands/replay.d.cts +0 -16
- package/dist/commands/session-recap.cjs +0 -353
- package/dist/commands/session-recap.d.cts +0 -27
- package/dist/commands/setup.cjs +0 -1278
- package/dist/commands/setup.d.cts +0 -99
- package/dist/commands/shell-init.cjs +0 -75
- package/dist/commands/shell-init.d.cts +0 -7
- package/dist/commands/sleep.cjs +0 -6029
- package/dist/commands/sleep.d.cts +0 -36
- package/dist/commands/status.cjs +0 -2737
- package/dist/commands/status.d.cts +0 -52
- package/dist/commands/task.cjs +0 -1236
- package/dist/commands/task.d.cts +0 -97
- package/dist/commands/template.cjs +0 -457
- package/dist/commands/template.d.cts +0 -36
- package/dist/commands/wake.cjs +0 -2627
- package/dist/commands/wake.d.cts +0 -22
- package/dist/context-BUGaWpyL.d.cts +0 -46
- package/dist/index.cjs +0 -12373
- package/dist/index.d.cts +0 -854
- package/dist/inject-Bzi5E-By.d.cts +0 -137
- package/dist/lib/auto-linker.cjs +0 -176
- package/dist/lib/auto-linker.d.cts +0 -26
- package/dist/lib/config.cjs +0 -78
- package/dist/lib/config.d.cts +0 -11
- package/dist/lib/entity-index.cjs +0 -84
- package/dist/lib/entity-index.d.cts +0 -26
- package/dist/lib/project-utils.cjs +0 -864
- package/dist/lib/project-utils.d.cts +0 -97
- package/dist/lib/session-repair.cjs +0 -239
- package/dist/lib/session-repair.d.cts +0 -110
- package/dist/lib/session-utils.cjs +0 -209
- package/dist/lib/session-utils.d.cts +0 -63
- package/dist/lib/task-utils.cjs +0 -1137
- package/dist/lib/task-utils.d.cts +0 -208
- package/dist/lib/template-engine.cjs +0 -47
- package/dist/lib/template-engine.d.cts +0 -11
- package/dist/plugin/index.cjs +0 -1907
- package/dist/plugin/index.d.cts +0 -36
- package/dist/plugin/index.d.ts +0 -36
- package/dist/plugin/index.js +0 -572
- package/dist/plugin/inject.cjs +0 -356
- package/dist/plugin/inject.d.cts +0 -54
- package/dist/plugin/inject.d.ts +0 -54
- package/dist/plugin/inject.js +0 -17
- package/dist/plugin/observe.cjs +0 -631
- package/dist/plugin/observe.d.cts +0 -39
- package/dist/plugin/observe.d.ts +0 -39
- package/dist/plugin/observe.js +0 -18
- package/dist/plugin/templates.cjs +0 -593
- package/dist/plugin/templates.d.cts +0 -52
- package/dist/plugin/templates.d.ts +0 -52
- package/dist/plugin/templates.js +0 -25
- package/dist/plugin/types.cjs +0 -18
- package/dist/plugin/types.d.cts +0 -209
- package/dist/plugin/types.d.ts +0 -209
- package/dist/plugin/types.js +0 -0
- package/dist/plugin/vault.cjs +0 -927
- package/dist/plugin/vault.d.cts +0 -68
- package/dist/plugin/vault.d.ts +0 -68
- package/dist/plugin/vault.js +0 -22
- package/dist/types-Y2_Um2Ls.d.cts +0 -205
- package/templates/memory-event.md +0 -67
- package/templates/party.md +0 -63
- package/templates/primitive-registry.yaml +0 -551
- package/templates/run.md +0 -68
- package/templates/trigger.md +0 -68
- 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
|
+
};
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__export
|
|
3
|
+
} from "./chunk-2ZDO52B4.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,12 +4,100 @@ import * as path from "path";
|
|
|
4
4
|
var JSONL_SAMPLE_LIMIT = 20;
|
|
5
5
|
var MARKDOWN_SIGNAL_RE = /^(#{1,6}\s|[-*+]\s|>\s)/;
|
|
6
6
|
var MARKDOWN_INLINE_RE = /(\[[^\]]+\]\([^)]+\)|[*_`~])/;
|
|
7
|
+
var BASE64_DATA_URI_RE = /\bdata:[^;\s]+;base64,[A-Za-z0-9+/=]{24,}\b/gi;
|
|
8
|
+
var LONG_BASE64_TOKEN_RE = /\b[A-Za-z0-9+/]{80,}={0,2}\b/g;
|
|
9
|
+
var STRUCTURED_NOISE_MARKER_RE = /\b(?:tool[_-]?result|tool[_-]?use|toolcallid|tooluseid|function[_-]?(?:call|result)|stdout|stderr|exitcode|recordedat|trace(?:_|-)?id|parent(?:_|-)?id|session(?:_|-)?id|metadata|base64|mime(?:type)?)\b/i;
|
|
10
|
+
var NOISY_PREFIX_RE = /^(?:metadata|system metadata|session metadata)\s*:/i;
|
|
11
|
+
function normalizeToken(value) {
|
|
12
|
+
return value.trim().toLowerCase().replace(/[\s_-]+/g, "");
|
|
13
|
+
}
|
|
7
14
|
function normalizeText(value) {
|
|
8
15
|
return value.replace(/\s+/g, " ").trim();
|
|
9
16
|
}
|
|
17
|
+
function shouldDropRole(role) {
|
|
18
|
+
const normalized = normalizeToken(role);
|
|
19
|
+
if (!normalized) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (normalized === "system" || normalized === "developer" || normalized === "metadata") {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return normalized.startsWith("tool");
|
|
26
|
+
}
|
|
27
|
+
function isConversationRolePrefix(role) {
|
|
28
|
+
const normalized = normalizeToken(role);
|
|
29
|
+
if (!normalized) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (normalized === "user" || normalized === "assistant" || normalized === "system") {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (normalized === "developer" || normalized === "metadata") {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return normalized.startsWith("tool");
|
|
39
|
+
}
|
|
40
|
+
function isNoisyBlockType(value) {
|
|
41
|
+
if (typeof value !== "string") {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const normalized = normalizeToken(value);
|
|
45
|
+
if (!normalized || normalized === "text" || normalized === "markdown") {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return normalized.includes("tool") || normalized.includes("functioncall") || normalized.includes("functionresult") || normalized.includes("thinking") || normalized.includes("reason") || normalized.includes("metadata");
|
|
49
|
+
}
|
|
50
|
+
function stripNoisyData(value) {
|
|
51
|
+
return normalizeText(
|
|
52
|
+
value.replace(BASE64_DATA_URI_RE, " ").replace(LONG_BASE64_TOKEN_RE, " ")
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function isLikelyStructuredNoise(value) {
|
|
56
|
+
const trimmed = value.trim();
|
|
57
|
+
if (!trimmed) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
if (NOISY_PREFIX_RE.test(trimmed)) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const looksStructured = trimmed.startsWith("{") || trimmed.startsWith("[");
|
|
64
|
+
if (looksStructured && STRUCTURED_NOISE_MARKER_RE.test(trimmed) && trimmed.length >= 40) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
function sanitizeExtractedText(value) {
|
|
70
|
+
const stripped = stripNoisyData(value);
|
|
71
|
+
if (!stripped) {
|
|
72
|
+
return "";
|
|
73
|
+
}
|
|
74
|
+
if (isLikelyStructuredNoise(stripped)) {
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
return stripped;
|
|
78
|
+
}
|
|
79
|
+
function sanitizeParsedMessage(message) {
|
|
80
|
+
const normalized = normalizeText(message);
|
|
81
|
+
if (!normalized) {
|
|
82
|
+
return "";
|
|
83
|
+
}
|
|
84
|
+
const roleMatch = /^([a-z][a-z0-9_-]{1,31})\s*:\s*(.+)$/i.exec(normalized);
|
|
85
|
+
if (roleMatch && isConversationRolePrefix(roleMatch[1])) {
|
|
86
|
+
const role = normalizeRole(roleMatch[1]);
|
|
87
|
+
if (shouldDropRole(role)) {
|
|
88
|
+
return "";
|
|
89
|
+
}
|
|
90
|
+
const content = sanitizeExtractedText(roleMatch[2]);
|
|
91
|
+
if (!content) {
|
|
92
|
+
return "";
|
|
93
|
+
}
|
|
94
|
+
return role ? `${role}: ${content}` : content;
|
|
95
|
+
}
|
|
96
|
+
return sanitizeExtractedText(normalized);
|
|
97
|
+
}
|
|
10
98
|
function extractText(value) {
|
|
11
99
|
if (typeof value === "string") {
|
|
12
|
-
return
|
|
100
|
+
return sanitizeExtractedText(value);
|
|
13
101
|
}
|
|
14
102
|
if (Array.isArray(value)) {
|
|
15
103
|
const parts = [];
|
|
@@ -25,11 +113,17 @@ function extractText(value) {
|
|
|
25
113
|
return "";
|
|
26
114
|
}
|
|
27
115
|
const record = value;
|
|
116
|
+
if (isNoisyBlockType(record.type)) {
|
|
117
|
+
return "";
|
|
118
|
+
}
|
|
28
119
|
if (typeof record.text === "string") {
|
|
29
|
-
return
|
|
120
|
+
return sanitizeExtractedText(record.text);
|
|
30
121
|
}
|
|
31
122
|
if (typeof record.content === "string") {
|
|
32
|
-
return
|
|
123
|
+
return sanitizeExtractedText(record.content);
|
|
124
|
+
}
|
|
125
|
+
if (record.content !== void 0) {
|
|
126
|
+
return extractText(record.content);
|
|
33
127
|
}
|
|
34
128
|
return "";
|
|
35
129
|
}
|
|
@@ -69,16 +163,18 @@ function parseJsonLine(line) {
|
|
|
69
163
|
const entry = parsed;
|
|
70
164
|
if ("role" in entry && "content" in entry) {
|
|
71
165
|
const role = normalizeRole(entry.role);
|
|
166
|
+
if (shouldDropRole(role)) return "";
|
|
72
167
|
const content = extractText(entry.content);
|
|
73
168
|
if (!content) return "";
|
|
74
|
-
return role ? `${role}: ${content}` : content;
|
|
169
|
+
return sanitizeParsedMessage(role ? `${role}: ${content}` : content);
|
|
75
170
|
}
|
|
76
171
|
if (entry.type === "message" && entry.message && typeof entry.message === "object") {
|
|
77
172
|
const message = entry.message;
|
|
78
173
|
const role = normalizeRole(message.role);
|
|
174
|
+
if (shouldDropRole(role)) return "";
|
|
79
175
|
const content = extractText(message.content);
|
|
80
176
|
if (!content) return "";
|
|
81
|
-
return role ? `${role}: ${content}` : content;
|
|
177
|
+
return sanitizeParsedMessage(role ? `${role}: ${content}` : content);
|
|
82
178
|
}
|
|
83
179
|
return "";
|
|
84
180
|
}
|
|
@@ -119,17 +215,21 @@ function parseMarkdown(raw) {
|
|
|
119
215
|
if (roleMatch) {
|
|
120
216
|
const role = normalizeRole(roleMatch[1]);
|
|
121
217
|
const content = normalizeText(roleMatch[2]);
|
|
122
|
-
|
|
123
|
-
|
|
218
|
+
const parsed2 = sanitizeParsedMessage(`${role}: ${content}`);
|
|
219
|
+
if (parsed2) {
|
|
220
|
+
messages.push(parsed2);
|
|
124
221
|
}
|
|
125
222
|
continue;
|
|
126
223
|
}
|
|
127
|
-
|
|
224
|
+
const parsed = sanitizeParsedMessage(joined);
|
|
225
|
+
if (parsed) {
|
|
226
|
+
messages.push(parsed);
|
|
227
|
+
}
|
|
128
228
|
}
|
|
129
229
|
return messages;
|
|
130
230
|
}
|
|
131
231
|
function parsePlainText(raw) {
|
|
132
|
-
return raw.split(/\r?\n/).map((line) =>
|
|
232
|
+
return raw.split(/\r?\n/).map((line) => sanitizeParsedMessage(line)).filter(Boolean);
|
|
133
233
|
}
|
|
134
234
|
function detectSessionFormat(raw, filePath) {
|
|
135
235
|
const nonEmptyLines = raw.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
@@ -163,10 +263,7 @@ function parseSessionFile(filePath) {
|
|
|
163
263
|
const raw = fs.readFileSync(resolved, "utf-8");
|
|
164
264
|
const format = detectSessionFormat(raw, resolved);
|
|
165
265
|
if (format === "jsonl") {
|
|
166
|
-
|
|
167
|
-
if (parsed.length > 0) {
|
|
168
|
-
return parsed;
|
|
169
|
-
}
|
|
266
|
+
return parseJsonLines(raw);
|
|
170
267
|
}
|
|
171
268
|
if (format === "markdown") {
|
|
172
269
|
const parsed = parseMarkdown(raw);
|