clawvault 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +352 -20
- package/bin/clawvault.js +8 -2
- package/bin/command-registration.test.js +3 -1
- package/bin/command-runtime.js +9 -1
- package/bin/register-core-commands.js +23 -10
- package/bin/register-maintenance-commands.js +39 -3
- package/bin/register-query-commands.js +58 -29
- 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-WGRQ6HDV.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-YKTA5JOJ.js → chunk-GAOWA7GR.js} +212 -46
- package/dist/chunk-GGA32J2R.js +784 -0
- package/dist/chunk-GNJL4YGR.js +79 -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-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-3D6BCTP6.js → chunk-X3SPPUFG.js} +51 -39
- package/dist/{chunk-THRJVD4L.js → chunk-Y6VJKXGL.js} +1 -1
- package/dist/{chunk-ZVVFWOLW.js → chunk-ZN54U2OZ.js} +123 -10
- package/dist/cli/index.js +32 -25
- 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 -90
- 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.js +3 -3
- 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 +337 -191
- package/dist/index.js +387 -118
- package/dist/{inject-Bzi5E-By.d.cts → 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 +100 -16
- package/dist/lib/canvas-layout.js +21 -78
- 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.js +1 -1
- package/dist/lib/task-utils.js +3 -3
- package/dist/lib/template-engine.js +1 -1
- package/dist/lib/webdav.js +1 -1
- 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.cts → 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 +34 -4
- package/hooks/clawvault/handler.js +760 -78
- package/hooks/clawvault/handler.test.js +235 -79
- package/hooks/clawvault/openclaw.plugin.json +72 -0
- package/openclaw.plugin.json +65 -38
- package/package.json +15 -18
- package/dist/chunk-3RG5ZIWI.js +0 -10
- package/dist/chunk-6U6MK36V.js +0 -205
- package/dist/chunk-7R7O6STJ.js +0 -88
- package/dist/chunk-CMB7UL7C.js +0 -327
- package/dist/chunk-DEFFDRVP.js +0 -938
- package/dist/chunk-E7MFQB6D.js +0 -163
- package/dist/chunk-GAJV4IGR.js +0 -82
- package/dist/chunk-GQSLDZTS.js +0 -560
- package/dist/chunk-K234IDRJ.js +0 -1073
- package/dist/chunk-MFM6K7PU.js +0 -374
- package/dist/chunk-MXSSG3QU.js +0 -42
- package/dist/chunk-PAH27GSN.js +0 -108
- package/dist/cli/index.cjs +0 -10033
- 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 -369
- package/dist/commands/compat.d.cts +0 -28
- package/dist/commands/context.cjs +0 -2989
- package/dist/commands/context.d.cts +0 -2
- package/dist/commands/doctor.cjs +0 -3062
- 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 -1345
- package/dist/commands/setup.d.cts +0 -100
- package/dist/commands/shell-init.cjs +0 -75
- package/dist/commands/shell-init.d.cts +0 -7
- package/dist/commands/sleep.cjs +0 -6028
- package/dist/commands/sleep.d.cts +0 -36
- package/dist/commands/status.cjs +0 -2736
- package/dist/commands/status.d.cts +0 -52
- package/dist/commands/tailscale.cjs +0 -1532
- package/dist/commands/tailscale.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 -2626
- package/dist/commands/wake.d.cts +0 -22
- package/dist/context-BUGaWpyL.d.cts +0 -46
- package/dist/index.cjs +0 -14526
- package/dist/index.d.cts +0 -858
- package/dist/inject-Bzi5E-By.d.ts +0 -137
- package/dist/lib/auto-linker.cjs +0 -176
- package/dist/lib/auto-linker.d.cts +0 -26
- package/dist/lib/canvas-layout.cjs +0 -136
- package/dist/lib/canvas-layout.d.cts +0 -31
- 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/tailscale.cjs +0 -1183
- package/dist/lib/tailscale.d.cts +0 -225
- 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/lib/webdav.cjs +0 -568
- package/dist/lib/webdav.d.cts +0 -109
- 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.ts +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
|
@@ -24,19 +24,6 @@ function findPackageRoot() {
|
|
|
24
24
|
}
|
|
25
25
|
return path.dirname(fileURLToPath(import.meta.url));
|
|
26
26
|
}
|
|
27
|
-
function resolveOpenClawHooksDir() {
|
|
28
|
-
const candidates = [
|
|
29
|
-
path.join(process.env.HOME || "", ".openclaw", "hooks", "clawvault"),
|
|
30
|
-
path.join(process.env.OPENCLAW_HOME || "", "hooks", "clawvault"),
|
|
31
|
-
path.join(process.env.OPENCLAW_STATE_DIR || "", "hooks", "clawvault")
|
|
32
|
-
].filter((p) => p && !p.startsWith(path.sep + "hooks"));
|
|
33
|
-
for (const candidate of candidates) {
|
|
34
|
-
if (fs.existsSync(candidate)) {
|
|
35
|
-
return candidate;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
27
|
function resolveProjectFile(relativePath, baseDir) {
|
|
41
28
|
if (baseDir) {
|
|
42
29
|
return path.resolve(baseDir, relativePath);
|
|
@@ -45,20 +32,6 @@ function resolveProjectFile(relativePath, baseDir) {
|
|
|
45
32
|
if (fs.existsSync(fromCwd)) {
|
|
46
33
|
return fromCwd;
|
|
47
34
|
}
|
|
48
|
-
if (relativePath.startsWith("hooks/clawvault/")) {
|
|
49
|
-
const hooksDir = resolveOpenClawHooksDir();
|
|
50
|
-
if (hooksDir) {
|
|
51
|
-
const hookRelative = relativePath.replace("hooks/clawvault/", "");
|
|
52
|
-
const fromHooks = path.resolve(hooksDir, hookRelative);
|
|
53
|
-
if (fs.existsSync(fromHooks)) {
|
|
54
|
-
return fromHooks;
|
|
55
|
-
}
|
|
56
|
-
const fromNestedHooks = path.resolve(hooksDir, "hooks", "clawvault", hookRelative);
|
|
57
|
-
if (fs.existsSync(fromNestedHooks)) {
|
|
58
|
-
return fromNestedHooks;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
35
|
return path.resolve(findPackageRoot(), relativePath);
|
|
63
36
|
}
|
|
64
37
|
function checkOpenClawCli() {
|
|
@@ -90,18 +63,7 @@ function checkOpenClawCli() {
|
|
|
90
63
|
return { label: "openclaw CLI available", status: "ok" };
|
|
91
64
|
}
|
|
92
65
|
function checkPackageHookRegistration(options) {
|
|
93
|
-
|
|
94
|
-
if (packageRaw && !options.baseDir) {
|
|
95
|
-
try {
|
|
96
|
-
const parsed = JSON.parse(packageRaw);
|
|
97
|
-
if (!parsed.openclaw?.hooks) {
|
|
98
|
-
const fallbackPath = path.resolve(findPackageRoot(), "package.json");
|
|
99
|
-
const fallbackRaw = readOptionalFile(fallbackPath);
|
|
100
|
-
if (fallbackRaw) packageRaw = fallbackRaw;
|
|
101
|
-
}
|
|
102
|
-
} catch {
|
|
103
|
-
}
|
|
104
|
-
}
|
|
66
|
+
const packageRaw = readOptionalFile(resolveProjectFile("package.json", options.baseDir));
|
|
105
67
|
if (!packageRaw) {
|
|
106
68
|
return {
|
|
107
69
|
label: "package hook registration",
|
|
@@ -233,6 +195,55 @@ function checkHookHandlerSafety(options) {
|
|
|
233
195
|
}
|
|
234
196
|
return { label: "hook handler safety", status: "ok" };
|
|
235
197
|
}
|
|
198
|
+
function checkPluginManifest(options) {
|
|
199
|
+
const manifestRaw = readOptionalFile(resolveProjectFile("hooks/clawvault/openclaw.plugin.json", options.baseDir));
|
|
200
|
+
if (!manifestRaw) {
|
|
201
|
+
return {
|
|
202
|
+
label: "plugin manifest",
|
|
203
|
+
status: "error",
|
|
204
|
+
detail: "hooks/clawvault/openclaw.plugin.json not found",
|
|
205
|
+
hint: "Add openclaw.plugin.json to hooks/clawvault/ for config schema registration."
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
const parsed = JSON.parse(manifestRaw);
|
|
210
|
+
if (!parsed.id || parsed.id !== "clawvault") {
|
|
211
|
+
return {
|
|
212
|
+
label: "plugin manifest",
|
|
213
|
+
status: "error",
|
|
214
|
+
detail: `Invalid plugin id: expected "clawvault", got "${parsed.id || "(missing)"}"`
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (!parsed.configSchema || typeof parsed.configSchema !== "object") {
|
|
218
|
+
return {
|
|
219
|
+
label: "plugin manifest",
|
|
220
|
+
status: "error",
|
|
221
|
+
detail: "Missing configSchema in plugin manifest",
|
|
222
|
+
hint: "Add configSchema to openclaw.plugin.json for config validation."
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
const hasVaultPath = Boolean(parsed.configSchema.properties?.vaultPath);
|
|
226
|
+
if (!hasVaultPath) {
|
|
227
|
+
return {
|
|
228
|
+
label: "plugin manifest",
|
|
229
|
+
status: "warn",
|
|
230
|
+
detail: "configSchema missing vaultPath property",
|
|
231
|
+
hint: "Add vaultPath to configSchema.properties for vault path configuration."
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
label: "plugin manifest",
|
|
236
|
+
status: "ok",
|
|
237
|
+
detail: `id: ${parsed.id}, configSchema defined`
|
|
238
|
+
};
|
|
239
|
+
} catch (err) {
|
|
240
|
+
return {
|
|
241
|
+
label: "plugin manifest",
|
|
242
|
+
status: "error",
|
|
243
|
+
detail: err?.message || "Unable to parse openclaw.plugin.json"
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
236
247
|
function checkSkillMetadata(options) {
|
|
237
248
|
const skillRaw = readOptionalFile(resolveProjectFile("SKILL.md", options.baseDir));
|
|
238
249
|
if (!skillRaw) {
|
|
@@ -274,6 +285,7 @@ function checkOpenClawCompatibility(options = {}) {
|
|
|
274
285
|
const checks = [
|
|
275
286
|
checkOpenClawCli(),
|
|
276
287
|
checkPackageHookRegistration(options),
|
|
288
|
+
checkPluginManifest(options),
|
|
277
289
|
checkHookManifest(options),
|
|
278
290
|
checkHookManifestRequirements(options),
|
|
279
291
|
checkHookHandlerSafety(options),
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ClawVault
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CLJTREDS.js";
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
} from "./chunk-
|
|
5
|
+
FactStore
|
|
6
|
+
} from "./chunk-BSJ6RIT7.js";
|
|
7
7
|
import {
|
|
8
8
|
parseObservationMarkdown
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-FHFUXL6G.js";
|
|
10
|
+
import {
|
|
11
|
+
getMemoryGraph
|
|
12
|
+
} from "./chunk-33DOSHTA.js";
|
|
10
13
|
import {
|
|
11
14
|
listObservationFiles
|
|
12
15
|
} from "./chunk-Z2XBWN7A.js";
|
|
@@ -141,7 +144,56 @@ var STOP_WORDS = /* @__PURE__ */ new Set([
|
|
|
141
144
|
"why",
|
|
142
145
|
"with",
|
|
143
146
|
"you",
|
|
144
|
-
"your"
|
|
147
|
+
"your",
|
|
148
|
+
"\u0438",
|
|
149
|
+
"\u0432",
|
|
150
|
+
"\u0432\u043E",
|
|
151
|
+
"\u043D\u0430",
|
|
152
|
+
"\u043F\u043E",
|
|
153
|
+
"\u0441",
|
|
154
|
+
"\u0441\u043E",
|
|
155
|
+
"\u043A",
|
|
156
|
+
"\u043A\u043E",
|
|
157
|
+
"\u0443",
|
|
158
|
+
"\u043E",
|
|
159
|
+
"\u043E\u0431",
|
|
160
|
+
"\u043E\u0442",
|
|
161
|
+
"\u0434\u043E",
|
|
162
|
+
"\u0437\u0430",
|
|
163
|
+
"\u0438\u0437",
|
|
164
|
+
"\u043F\u043E\u0434",
|
|
165
|
+
"\u043D\u0430\u0434",
|
|
166
|
+
"\u043D\u0435",
|
|
167
|
+
"\u043D\u043E",
|
|
168
|
+
"\u0430",
|
|
169
|
+
"\u0438\u043B\u0438",
|
|
170
|
+
"\u0447\u0442\u043E",
|
|
171
|
+
"\u043A\u0430\u043A",
|
|
172
|
+
"\u044D\u0442\u043E",
|
|
173
|
+
"\u0442\u043E",
|
|
174
|
+
"\u0436\u0435",
|
|
175
|
+
"\u043B\u0438",
|
|
176
|
+
"\u0434\u043B\u044F",
|
|
177
|
+
"\u043F\u0440\u0438",
|
|
178
|
+
"\u043F\u0440\u043E",
|
|
179
|
+
"\u043C\u044B",
|
|
180
|
+
"\u0432\u044B",
|
|
181
|
+
"\u043E\u043D\u0438",
|
|
182
|
+
"\u043E\u043D",
|
|
183
|
+
"\u043E\u043D\u0430",
|
|
184
|
+
"\u043E\u043D\u043E",
|
|
185
|
+
"\u044F",
|
|
186
|
+
"\u0442\u044B",
|
|
187
|
+
"\u043C\u043E\u0439",
|
|
188
|
+
"\u043C\u043E\u044F",
|
|
189
|
+
"\u043C\u043E\u0451",
|
|
190
|
+
"\u043C\u043E\u0438",
|
|
191
|
+
"\u0442\u0432\u043E\u0439",
|
|
192
|
+
"\u0442\u0432\u043E\u044F",
|
|
193
|
+
"\u0442\u0432\u043E\u0438",
|
|
194
|
+
"\u043D\u0430\u0448",
|
|
195
|
+
"\u043D\u0430\u0448\u0430",
|
|
196
|
+
"\u0438\u0445"
|
|
145
197
|
]);
|
|
146
198
|
function formatRelativeAge(date, now = Date.now()) {
|
|
147
199
|
const ageMs = Math.max(0, now - date.getTime());
|
|
@@ -179,24 +231,24 @@ function formatContextMarkdown(task, entries) {
|
|
|
179
231
|
}
|
|
180
232
|
var PROFILE_ORDERING = {
|
|
181
233
|
default: {
|
|
182
|
-
order: ["structural", "daily", "search", "graph", "potential", "contextual"],
|
|
234
|
+
order: ["structural", "fact", "daily", "search", "graph", "potential", "contextual"],
|
|
183
235
|
caps: {}
|
|
184
236
|
},
|
|
185
237
|
planning: {
|
|
186
|
-
order: ["search", "graph", "structural", "potential", "daily", "contextual"],
|
|
238
|
+
order: ["fact", "search", "graph", "structural", "potential", "daily", "contextual"],
|
|
187
239
|
caps: { observation: 12, graph: 12 }
|
|
188
240
|
},
|
|
189
241
|
incident: {
|
|
190
|
-
order: ["structural", "search", "potential", "daily", "graph", "contextual"],
|
|
242
|
+
order: ["structural", "fact", "search", "potential", "daily", "graph", "contextual"],
|
|
191
243
|
caps: { observation: 20, graph: 8 }
|
|
192
244
|
},
|
|
193
245
|
handoff: {
|
|
194
|
-
order: ["daily", "structural", "potential", "search", "graph", "contextual"],
|
|
246
|
+
order: ["daily", "structural", "fact", "potential", "search", "graph", "contextual"],
|
|
195
247
|
caps: { "daily-note": 2, observation: 15 }
|
|
196
248
|
}
|
|
197
249
|
};
|
|
198
250
|
function extractKeywords(text) {
|
|
199
|
-
const raw = text.toLowerCase().match(/[
|
|
251
|
+
const raw = text.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
200
252
|
const seen = /* @__PURE__ */ new Set();
|
|
201
253
|
const keywords = [];
|
|
202
254
|
for (const token of raw) {
|
|
@@ -369,6 +421,64 @@ function buildObservationContextItems(vaultPath, queryKeywords) {
|
|
|
369
421
|
}
|
|
370
422
|
return items;
|
|
371
423
|
}
|
|
424
|
+
var PREFERENCE_PATTERNS = /\b(prefer|like|favorite|favourit|enjoy|habit|allergy|allergic|diet|dislike|want|love|hate|routine)\b/i;
|
|
425
|
+
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;
|
|
426
|
+
function isPreferenceQuery(query) {
|
|
427
|
+
return PREFERENCE_PATTERNS.test(query);
|
|
428
|
+
}
|
|
429
|
+
function isTemporalQuery(query) {
|
|
430
|
+
return TEMPORAL_PATTERNS.test(query);
|
|
431
|
+
}
|
|
432
|
+
function buildFactContextItems(vaultPath, query, _queryKeywords) {
|
|
433
|
+
const factStore = new FactStore(vaultPath);
|
|
434
|
+
try {
|
|
435
|
+
factStore.load();
|
|
436
|
+
} catch {
|
|
437
|
+
return [];
|
|
438
|
+
}
|
|
439
|
+
const stats = factStore.stats();
|
|
440
|
+
if (stats.activeFacts === 0) return [];
|
|
441
|
+
const items = [];
|
|
442
|
+
const preferenceQuery = isPreferenceQuery(query);
|
|
443
|
+
const temporalQuery = isTemporalQuery(query);
|
|
444
|
+
const matchingFacts = factStore.searchFacts(query);
|
|
445
|
+
if (preferenceQuery) {
|
|
446
|
+
const prefs = factStore.getPreferences();
|
|
447
|
+
for (const pref of prefs) {
|
|
448
|
+
if (!matchingFacts.find((f) => f.id === pref.id)) {
|
|
449
|
+
matchingFacts.push(pref);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
for (const fact of matchingFacts.slice(0, 10)) {
|
|
454
|
+
const factText = `${fact.entity} ${fact.relation} ${fact.value}`;
|
|
455
|
+
let score = fact.confidence * 0.8;
|
|
456
|
+
if (preferenceQuery && fact.category === "preference") {
|
|
457
|
+
score *= 1.5;
|
|
458
|
+
}
|
|
459
|
+
if (temporalQuery && (fact.relation.includes("_on") || fact.relation.includes("date") || fact.relation.includes("time"))) {
|
|
460
|
+
score *= 1.3;
|
|
461
|
+
}
|
|
462
|
+
const entry = {
|
|
463
|
+
title: `Fact: ${fact.entity} \u2192 ${fact.relation}`,
|
|
464
|
+
path: fact.source,
|
|
465
|
+
category: fact.category,
|
|
466
|
+
score: Math.min(1, score),
|
|
467
|
+
snippet: factText,
|
|
468
|
+
modified: fact.validFrom,
|
|
469
|
+
age: formatRelativeAge(new Date(fact.validFrom)),
|
|
470
|
+
source: "observation",
|
|
471
|
+
// Use 'observation' since ContextSource doesn't include 'fact'
|
|
472
|
+
signals: ["fact_store", fact.category],
|
|
473
|
+
rationale: `Extracted fact (${fact.category}, confidence: ${fact.confidence.toFixed(2)})`
|
|
474
|
+
};
|
|
475
|
+
items.push({
|
|
476
|
+
priority: preferenceQuery && fact.category === "preference" ? 1 : 2,
|
|
477
|
+
entry
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
return items;
|
|
481
|
+
}
|
|
372
482
|
function buildSearchContextItems(vault, results) {
|
|
373
483
|
return results.map((result) => {
|
|
374
484
|
const relativePath = path.relative(vault.getPath(), result.document.path).split(path.sep).join("/");
|
|
@@ -592,6 +702,7 @@ async function buildContext(task, options) {
|
|
|
592
702
|
});
|
|
593
703
|
const searchItems = buildSearchContextItems(vault, searchResults);
|
|
594
704
|
const dailyItems = buildDailyContextItems(vault.getPath(), allDocuments);
|
|
705
|
+
const factItems = buildFactContextItems(vault.getPath(), normalizedTask, queryKeywords);
|
|
595
706
|
const observationItems = includeObservations ? buildObservationContextItems(vault.getPath(), queryKeywords) : [];
|
|
596
707
|
const graph = await getMemoryGraph(vault.getPath());
|
|
597
708
|
const graphItems = buildGraphContextItems({
|
|
@@ -608,11 +719,13 @@ async function buildContext(task, options) {
|
|
|
608
719
|
const contextualObservations = observationItems.filter((item) => item.priority === 5).sort(byScoreDesc);
|
|
609
720
|
const sortedDailyItems = [...dailyItems].sort(byScoreDesc);
|
|
610
721
|
const sortedSearchItems = [...searchItems].sort(byScoreDesc);
|
|
722
|
+
const sortedFactItems = [...factItems].sort(byScoreDesc);
|
|
611
723
|
const sortedGraphItems = [...graphItems].sort(byScoreDesc);
|
|
612
724
|
const grouped = {
|
|
613
725
|
structural: structuralObservations,
|
|
614
726
|
daily: sortedDailyItems,
|
|
615
727
|
search: sortedSearchItems,
|
|
728
|
+
fact: sortedFactItems,
|
|
616
729
|
graph: sortedGraphItems,
|
|
617
730
|
potential: potentialObservations,
|
|
618
731
|
contextual: contextualObservations
|
package/dist/cli/index.js
CHANGED
|
@@ -1,35 +1,42 @@
|
|
|
1
1
|
import {
|
|
2
2
|
registerCliCommands
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-33VSQP4J.js";
|
|
4
|
+
import "../chunk-Y6VJKXGL.js";
|
|
5
5
|
import "../chunk-TIGW564L.js";
|
|
6
6
|
import "../chunk-IVRIKYFE.js";
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-GGA32J2R.js";
|
|
8
|
+
import "../chunk-VSL7KY3M.js";
|
|
9
|
+
import "../chunk-QVEERJSP.js";
|
|
10
|
+
import "../chunk-4BQTQMJP.js";
|
|
11
|
+
import "../chunk-MM6QGW3P.js";
|
|
12
|
+
import "../chunk-WMGIIABP.js";
|
|
13
|
+
import "../chunk-23YDQ3QU.js";
|
|
14
|
+
import "../chunk-MW5C6ZQA.js";
|
|
15
|
+
import "../chunk-SLXOR3CC.js";
|
|
16
|
+
import "../chunk-ESVS6K2B.js";
|
|
17
|
+
import "../chunk-ZN54U2OZ.js";
|
|
18
|
+
import "../chunk-ESFLMDRB.js";
|
|
14
19
|
import "../chunk-HRLWZGMA.js";
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-WGRQ6HDV.js";
|
|
27
|
-
import "../chunk-K234IDRJ.js";
|
|
20
|
+
import "../chunk-77Q5CSPJ.js";
|
|
21
|
+
import "../chunk-4PY655YM.js";
|
|
22
|
+
import "../chunk-CLJTREDS.js";
|
|
23
|
+
import "../chunk-BSJ6RIT7.js";
|
|
24
|
+
import "../chunk-FHFUXL6G.js";
|
|
25
|
+
import "../chunk-PBACDKKP.js";
|
|
26
|
+
import "../chunk-6FH3IULF.js";
|
|
27
|
+
import "../chunk-EK6S23ZB.js";
|
|
28
|
+
import "../chunk-W4SPAEE7.js";
|
|
29
|
+
import "../chunk-URXDAUVH.js";
|
|
30
|
+
import "../chunk-NCKFNBHJ.js";
|
|
28
31
|
import "../chunk-2CDEETQN.js";
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
32
|
+
import "../chunk-MQUJNOHK.js";
|
|
33
|
+
import "../chunk-GNJL4YGR.js";
|
|
34
|
+
import "../chunk-33DOSHTA.js";
|
|
31
35
|
import "../chunk-Z2XBWN7A.js";
|
|
32
|
-
import "../chunk-
|
|
36
|
+
import "../chunk-QWQ3TIKS.js";
|
|
37
|
+
import "../chunk-MFAWT5O5.js";
|
|
38
|
+
import "../chunk-7766SIJP.js";
|
|
39
|
+
import "../chunk-2ZDO52B4.js";
|
|
33
40
|
export {
|
|
34
41
|
registerCliCommands
|
|
35
42
|
};
|
package/dist/commands/archive.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
archiveCommand,
|
|
3
3
|
registerArchiveCommand
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-2RAZ4ZFE.js";
|
|
5
5
|
import "../chunk-MQUJNOHK.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-GNJL4YGR.js";
|
|
7
7
|
import "../chunk-Z2XBWN7A.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-2ZDO52B4.js";
|
|
9
9
|
export {
|
|
10
10
|
archiveCommand,
|
|
11
11
|
registerArchiveCommand
|
package/dist/commands/backlog.js
CHANGED
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
createBacklogItem,
|
|
3
3
|
listBacklogItems,
|
|
4
4
|
promoteBacklogItem
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-QWQ3TIKS.js";
|
|
6
|
+
import "../chunk-MFAWT5O5.js";
|
|
7
7
|
import "../chunk-7766SIJP.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-2ZDO52B4.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/backlog.ts
|
|
11
11
|
function toDateStr(val) {
|
package/dist/commands/blocked.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getBlockedTasks
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-QWQ3TIKS.js";
|
|
4
|
+
import "../chunk-MFAWT5O5.js";
|
|
5
5
|
import "../chunk-7766SIJP.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-2ZDO52B4.js";
|
|
7
7
|
|
|
8
8
|
// src/commands/blocked.ts
|
|
9
9
|
function toDateStr(val) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Canvas } from '../lib/canvas-layout.js';
|
|
2
|
+
|
|
3
|
+
interface CanvasOptions {
|
|
4
|
+
output?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generate the vault status canvas.
|
|
8
|
+
*/
|
|
9
|
+
declare function generateCanvas(vaultPath: string): Canvas;
|
|
10
|
+
/**
|
|
11
|
+
* Canvas command handler for CLI.
|
|
12
|
+
*/
|
|
13
|
+
declare function canvasCommand(vaultPath: string, options?: CanvasOptions): Promise<void>;
|
|
14
|
+
|
|
15
|
+
export { type CanvasOptions, canvasCommand, generateCanvas };
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CANVAS_COLORS,
|
|
3
|
+
LAYOUT,
|
|
4
|
+
createGroupWithNodes,
|
|
5
|
+
createTextNode,
|
|
6
|
+
flattenGroups,
|
|
7
|
+
positionGroupsVertically,
|
|
8
|
+
truncateText
|
|
9
|
+
} from "../chunk-MDIH26GC.js";
|
|
10
|
+
import {
|
|
11
|
+
loadMemoryGraphIndex
|
|
12
|
+
} from "../chunk-33DOSHTA.js";
|
|
13
|
+
import {
|
|
14
|
+
listObservationFiles
|
|
15
|
+
} from "../chunk-Z2XBWN7A.js";
|
|
16
|
+
import {
|
|
17
|
+
listTasks
|
|
18
|
+
} from "../chunk-QWQ3TIKS.js";
|
|
19
|
+
import "../chunk-MFAWT5O5.js";
|
|
20
|
+
import "../chunk-7766SIJP.js";
|
|
21
|
+
import "../chunk-2ZDO52B4.js";
|
|
22
|
+
|
|
23
|
+
// src/commands/canvas.ts
|
|
24
|
+
import * as fs2 from "fs";
|
|
25
|
+
import * as path2 from "path";
|
|
26
|
+
|
|
27
|
+
// src/lib/canvas-default-template.ts
|
|
28
|
+
import * as fs from "fs";
|
|
29
|
+
import * as path from "path";
|
|
30
|
+
var STATUS_ORDER = ["in-progress", "open", "blocked", "done"];
|
|
31
|
+
var STATUS_LABELS = {
|
|
32
|
+
"in-progress": "In Progress",
|
|
33
|
+
open: "Open",
|
|
34
|
+
blocked: "Blocked",
|
|
35
|
+
done: "Done"
|
|
36
|
+
};
|
|
37
|
+
var STATUS_COLORS = {
|
|
38
|
+
"in-progress": CANVAS_COLORS.ORANGE,
|
|
39
|
+
open: void 0,
|
|
40
|
+
blocked: CANVAS_COLORS.RED,
|
|
41
|
+
done: CANVAS_COLORS.GREEN
|
|
42
|
+
};
|
|
43
|
+
function groupTasksByStatus(tasks) {
|
|
44
|
+
const grouped = {
|
|
45
|
+
open: [],
|
|
46
|
+
"in-progress": [],
|
|
47
|
+
blocked: [],
|
|
48
|
+
done: []
|
|
49
|
+
};
|
|
50
|
+
for (const task of tasks) {
|
|
51
|
+
grouped[task.frontmatter.status].push(task);
|
|
52
|
+
}
|
|
53
|
+
return grouped;
|
|
54
|
+
}
|
|
55
|
+
function readObservationTitle(filePath) {
|
|
56
|
+
try {
|
|
57
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
58
|
+
const headingMatch = content.match(/^#\s+(.+)$/m);
|
|
59
|
+
if (headingMatch?.[1]) {
|
|
60
|
+
return truncateText(headingMatch[1].trim(), 44);
|
|
61
|
+
}
|
|
62
|
+
const firstBodyLine = content.split(/\r?\n/).map((line) => line.trim()).find((line) => line.length > 0 && line !== "---" && !line.includes(":"));
|
|
63
|
+
return firstBodyLine ? truncateText(firstBodyLine, 44) : null;
|
|
64
|
+
} catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function buildTaskStatusGroup(tasks) {
|
|
69
|
+
const grouped = groupTasksByStatus(tasks);
|
|
70
|
+
const summaryLines = STATUS_ORDER.map((status) => `${STATUS_LABELS[status]}: ${grouped[status].length}`);
|
|
71
|
+
const childNodes = [
|
|
72
|
+
createTextNode(
|
|
73
|
+
0,
|
|
74
|
+
0,
|
|
75
|
+
LAYOUT.DEFAULT_NODE_WIDTH,
|
|
76
|
+
LAYOUT.SMALL_NODE_HEIGHT + 24,
|
|
77
|
+
`**Tasks by Status**
|
|
78
|
+
|
|
79
|
+
Total: ${tasks.length}
|
|
80
|
+
${summaryLines.join("\n")}`
|
|
81
|
+
)
|
|
82
|
+
];
|
|
83
|
+
for (const status of STATUS_ORDER) {
|
|
84
|
+
const bucket = grouped[status];
|
|
85
|
+
const lines = bucket.length === 0 ? ["- none"] : bucket.slice(0, 6).map((task) => `- ${truncateText(task.title, 42)}`);
|
|
86
|
+
if (bucket.length > 6) {
|
|
87
|
+
lines.push(`- ... and ${bucket.length - 6} more`);
|
|
88
|
+
}
|
|
89
|
+
childNodes.push(
|
|
90
|
+
createTextNode(
|
|
91
|
+
0,
|
|
92
|
+
0,
|
|
93
|
+
LAYOUT.DEFAULT_NODE_WIDTH,
|
|
94
|
+
LAYOUT.SMALL_NODE_HEIGHT + lines.length * 18,
|
|
95
|
+
`**${STATUS_LABELS[status]} (${bucket.length})**
|
|
96
|
+
|
|
97
|
+
${lines.join("\n")}`,
|
|
98
|
+
STATUS_COLORS[status]
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return createGroupWithNodes(
|
|
103
|
+
LAYOUT.LEFT_COLUMN_X,
|
|
104
|
+
0,
|
|
105
|
+
LAYOUT.LEFT_COLUMN_WIDTH,
|
|
106
|
+
"Vault Status",
|
|
107
|
+
childNodes,
|
|
108
|
+
CANVAS_COLORS.CYAN
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
function buildRecentObservationsGroup(vaultPath) {
|
|
112
|
+
const observations = listObservationFiles(vaultPath, { includeLegacy: true, includeArchive: false });
|
|
113
|
+
const recent = observations.slice(-8).reverse();
|
|
114
|
+
const lines = recent.length === 0 ? ["- none"] : recent.map((entry) => {
|
|
115
|
+
const title = readObservationTitle(entry.path);
|
|
116
|
+
return title ? `- ${entry.date}: ${title}` : `- ${entry.date}`;
|
|
117
|
+
});
|
|
118
|
+
const text = [
|
|
119
|
+
"**Recent Observations**",
|
|
120
|
+
"",
|
|
121
|
+
`Total days: ${observations.length}`,
|
|
122
|
+
"",
|
|
123
|
+
...lines
|
|
124
|
+
].join("\n");
|
|
125
|
+
return createGroupWithNodes(
|
|
126
|
+
LAYOUT.LEFT_COLUMN_X,
|
|
127
|
+
0,
|
|
128
|
+
LAYOUT.LEFT_COLUMN_WIDTH,
|
|
129
|
+
"Recent Observations",
|
|
130
|
+
[createTextNode(0, 0, LAYOUT.DEFAULT_NODE_WIDTH, LAYOUT.DEFAULT_NODE_HEIGHT + lines.length * 18, text)],
|
|
131
|
+
CANVAS_COLORS.CYAN
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
function buildGraphStatsGroup(vaultPath) {
|
|
135
|
+
const graph = loadMemoryGraphIndex(vaultPath)?.graph;
|
|
136
|
+
const textLines = ["**Graph Stats**", ""];
|
|
137
|
+
if (!graph) {
|
|
138
|
+
textLines.push("Graph index not found.");
|
|
139
|
+
textLines.push("Run `clawvault graph --build` to populate it.");
|
|
140
|
+
} else {
|
|
141
|
+
textLines.push(`Nodes: ${graph.stats.nodeCount}`);
|
|
142
|
+
textLines.push(`Edges: ${graph.stats.edgeCount}`);
|
|
143
|
+
textLines.push("");
|
|
144
|
+
textLines.push("Node types:");
|
|
145
|
+
const nodeTypeLines = Object.entries(graph.stats.nodeTypeCounts).sort((left, right) => right[1] - left[1]).slice(0, 6).map(([type, count]) => `- ${type}: ${count}`);
|
|
146
|
+
textLines.push(...nodeTypeLines.length > 0 ? nodeTypeLines : ["- none"]);
|
|
147
|
+
}
|
|
148
|
+
return createGroupWithNodes(
|
|
149
|
+
LAYOUT.LEFT_COLUMN_X,
|
|
150
|
+
0,
|
|
151
|
+
LAYOUT.LEFT_COLUMN_WIDTH,
|
|
152
|
+
"Graph Stats",
|
|
153
|
+
[
|
|
154
|
+
createTextNode(
|
|
155
|
+
0,
|
|
156
|
+
0,
|
|
157
|
+
LAYOUT.DEFAULT_NODE_WIDTH,
|
|
158
|
+
LAYOUT.DEFAULT_NODE_HEIGHT + (textLines.length - 1) * 16,
|
|
159
|
+
textLines.join("\n")
|
|
160
|
+
)
|
|
161
|
+
],
|
|
162
|
+
CANVAS_COLORS.PURPLE
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
function generateDefaultCanvas(vaultPath) {
|
|
166
|
+
const resolvedPath = path.resolve(vaultPath);
|
|
167
|
+
const tasks = listTasks(resolvedPath);
|
|
168
|
+
const groups = positionGroupsVertically([
|
|
169
|
+
buildTaskStatusGroup(tasks),
|
|
170
|
+
buildRecentObservationsGroup(resolvedPath),
|
|
171
|
+
buildGraphStatsGroup(resolvedPath)
|
|
172
|
+
]);
|
|
173
|
+
return {
|
|
174
|
+
nodes: flattenGroups(groups),
|
|
175
|
+
edges: []
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// src/lib/canvas-templates.ts
|
|
180
|
+
function generateCanvas(vaultPath) {
|
|
181
|
+
return generateDefaultCanvas(vaultPath);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// src/commands/canvas.ts
|
|
185
|
+
function generateCanvas2(vaultPath) {
|
|
186
|
+
return generateCanvas(path2.resolve(vaultPath));
|
|
187
|
+
}
|
|
188
|
+
async function canvasCommand(vaultPath, options = {}) {
|
|
189
|
+
const resolvedPath = path2.resolve(vaultPath);
|
|
190
|
+
const outputPath = options.output || path2.join(resolvedPath, "dashboard.canvas");
|
|
191
|
+
const canvas = generateCanvas(resolvedPath);
|
|
192
|
+
fs2.writeFileSync(outputPath, JSON.stringify(canvas, null, 2));
|
|
193
|
+
console.log(`\u2713 Generated canvas: ${outputPath}`);
|
|
194
|
+
console.log(` Nodes: ${canvas.nodes.length}`);
|
|
195
|
+
console.log(` Edges: ${canvas.edges.length}`);
|
|
196
|
+
}
|
|
197
|
+
export {
|
|
198
|
+
canvasCommand,
|
|
199
|
+
generateCanvas2 as generateCanvas
|
|
200
|
+
};
|
package/dist/commands/compat.js
CHANGED
|
@@ -2,8 +2,8 @@ import {
|
|
|
2
2
|
checkOpenClawCompatibility,
|
|
3
3
|
compatCommand,
|
|
4
4
|
compatibilityExitCode
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-X3SPPUFG.js";
|
|
6
|
+
import "../chunk-2ZDO52B4.js";
|
|
7
7
|
export {
|
|
8
8
|
checkOpenClawCompatibility,
|
|
9
9
|
compatCommand,
|