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