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
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
// src/lib/search.ts
|
|
2
|
+
import { execFileSync, spawnSync } from "child_process";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
var QMD_INSTALL_URL = "https://github.com/tobi/qmd";
|
|
6
|
+
var QMD_INSTALL_COMMAND = "bun install -g github:tobi/qmd";
|
|
7
|
+
var QMD_INDEX_ENV_VAR = "CLAWVAULT_QMD_INDEX";
|
|
8
|
+
var QMD_ERROR_MESSAGES = {
|
|
9
|
+
NOT_INSTALLED: {
|
|
10
|
+
code: "NOT_INSTALLED",
|
|
11
|
+
message: "qmd is not installed",
|
|
12
|
+
hint: `Install qmd to enable ClawVault search and indexing:
|
|
13
|
+
${QMD_INSTALL_COMMAND}
|
|
14
|
+
|
|
15
|
+
For more information: ${QMD_INSTALL_URL}`
|
|
16
|
+
},
|
|
17
|
+
NOT_CONFIGURED: {
|
|
18
|
+
code: "NOT_CONFIGURED",
|
|
19
|
+
message: "qmd collection is not configured",
|
|
20
|
+
hint: "Run `clawvault doctor` to diagnose configuration issues, or `clawvault migrate` to fix common setup problems."
|
|
21
|
+
},
|
|
22
|
+
COLLECTION_NOT_FOUND: {
|
|
23
|
+
code: "COLLECTION_NOT_FOUND",
|
|
24
|
+
message: "qmd collection not found",
|
|
25
|
+
hint: "The configured qmd collection does not exist. Run `clawvault migrate` to recreate it, or `qmd collection add <name> <path>` manually."
|
|
26
|
+
},
|
|
27
|
+
EXECUTION_FAILED: {
|
|
28
|
+
code: "EXECUTION_FAILED",
|
|
29
|
+
message: "qmd command failed",
|
|
30
|
+
hint: "Run `clawvault doctor` to diagnose qmd issues."
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
var QmdUnavailableError = class extends Error {
|
|
34
|
+
code;
|
|
35
|
+
hint;
|
|
36
|
+
constructor(code = "NOT_INSTALLED", additionalContext) {
|
|
37
|
+
const details = QMD_ERROR_MESSAGES[code];
|
|
38
|
+
const fullMessage = additionalContext ? `${details.message}: ${additionalContext}` : details.message;
|
|
39
|
+
super(fullMessage);
|
|
40
|
+
this.name = "QmdUnavailableError";
|
|
41
|
+
this.code = code;
|
|
42
|
+
this.hint = details.hint;
|
|
43
|
+
}
|
|
44
|
+
toUserMessage() {
|
|
45
|
+
return `Error: ${this.message}
|
|
46
|
+
|
|
47
|
+
${this.hint}`;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function getQmdErrorDetails(code) {
|
|
51
|
+
return QMD_ERROR_MESSAGES[code];
|
|
52
|
+
}
|
|
53
|
+
var QmdConfigurationError = class extends Error {
|
|
54
|
+
constructor(message, hint) {
|
|
55
|
+
super(message);
|
|
56
|
+
this.hint = hint;
|
|
57
|
+
this.name = "QmdConfigurationError";
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
function ensureJsonArgs(args) {
|
|
61
|
+
return args.includes("--json") ? args : [...args, "--json"];
|
|
62
|
+
}
|
|
63
|
+
function resolveQmdIndexName(indexName) {
|
|
64
|
+
const explicit = indexName?.trim();
|
|
65
|
+
if (explicit) {
|
|
66
|
+
return explicit;
|
|
67
|
+
}
|
|
68
|
+
const fromEnv = process.env[QMD_INDEX_ENV_VAR]?.trim();
|
|
69
|
+
return fromEnv || void 0;
|
|
70
|
+
}
|
|
71
|
+
function withQmdIndexArgs(args, indexName) {
|
|
72
|
+
if (args.includes("--index")) {
|
|
73
|
+
return [...args];
|
|
74
|
+
}
|
|
75
|
+
const resolvedIndexName = resolveQmdIndexName(indexName);
|
|
76
|
+
if (!resolvedIndexName) {
|
|
77
|
+
return [...args];
|
|
78
|
+
}
|
|
79
|
+
return ["--index", resolvedIndexName, ...args];
|
|
80
|
+
}
|
|
81
|
+
function tryParseJson(raw) {
|
|
82
|
+
try {
|
|
83
|
+
return JSON.parse(raw);
|
|
84
|
+
} catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function extractJsonPayload(raw) {
|
|
89
|
+
const start = raw.search(/[\[{]/);
|
|
90
|
+
if (start === -1) return null;
|
|
91
|
+
const end = Math.max(raw.lastIndexOf("]"), raw.lastIndexOf("}"));
|
|
92
|
+
if (end <= start) return null;
|
|
93
|
+
return raw.slice(start, end + 1);
|
|
94
|
+
}
|
|
95
|
+
function stripQmdNoise(raw) {
|
|
96
|
+
return raw.split("\n").filter((line) => {
|
|
97
|
+
const t = line.trim();
|
|
98
|
+
if (!t) return true;
|
|
99
|
+
if (t.startsWith("[node-llama-cpp]")) return false;
|
|
100
|
+
if (t.startsWith("Expanding query")) return false;
|
|
101
|
+
if (t.startsWith("Searching ") && t.endsWith("queries...")) return false;
|
|
102
|
+
if (/^[├└─│]/.test(t)) return false;
|
|
103
|
+
return true;
|
|
104
|
+
}).join("\n");
|
|
105
|
+
}
|
|
106
|
+
function parseQmdOutput(raw) {
|
|
107
|
+
const trimmed = stripQmdNoise(raw).trim();
|
|
108
|
+
if (!trimmed) return [];
|
|
109
|
+
const direct = tryParseJson(trimmed);
|
|
110
|
+
const extracted = direct ? null : extractJsonPayload(trimmed);
|
|
111
|
+
const parsed = direct ?? (extracted ? tryParseJson(extracted) : null);
|
|
112
|
+
if (!parsed) {
|
|
113
|
+
throw new Error("qmd returned non-JSON output. Ensure qmd supports --json.");
|
|
114
|
+
}
|
|
115
|
+
if (Array.isArray(parsed)) {
|
|
116
|
+
return parsed;
|
|
117
|
+
}
|
|
118
|
+
if (parsed && typeof parsed === "object") {
|
|
119
|
+
const candidate = parsed.results ?? parsed.items ?? parsed.data;
|
|
120
|
+
if (Array.isArray(candidate)) {
|
|
121
|
+
return candidate;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw new Error("qmd returned an unexpected JSON shape.");
|
|
125
|
+
}
|
|
126
|
+
function ensureQmdAvailable() {
|
|
127
|
+
if (!hasQmd()) {
|
|
128
|
+
throw new QmdUnavailableError("NOT_INSTALLED");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function detectQmdError(output, args) {
|
|
132
|
+
const lowerOutput = output.toLowerCase();
|
|
133
|
+
if (lowerOutput.includes("missing required arguments") || lowerOutput.includes("unknown option")) {
|
|
134
|
+
return new QmdConfigurationError(
|
|
135
|
+
'qmd does not support the search command with the expected arguments. This may indicate an incompatible qmd version or a different tool named "qmd".',
|
|
136
|
+
`Ensure you have the correct qmd installed: ${QMD_INSTALL_COMMAND}`
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
if (lowerOutput.includes("collection not found") || lowerOutput.includes("no collection")) {
|
|
140
|
+
const collectionArg = args.findIndex((a) => a === "-c");
|
|
141
|
+
const collectionName = collectionArg >= 0 && args[collectionArg + 1] ? args[collectionArg + 1] : "unknown";
|
|
142
|
+
return new QmdConfigurationError(
|
|
143
|
+
`qmd collection "${collectionName}" not found.`,
|
|
144
|
+
'Run `qmd update -c <collection>` to create the collection, or check your vault\'s .clawvault.json "name" field.'
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (lowerOutput.includes("no index") || lowerOutput.includes("index not found")) {
|
|
148
|
+
return new QmdConfigurationError(
|
|
149
|
+
"qmd index not found. The vault may not be indexed yet.",
|
|
150
|
+
"Run `clawvault rebuild` or `qmd update` to build the search index."
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
if (lowerOutput.includes("embedding") && (lowerOutput.includes("not found") || lowerOutput.includes("missing"))) {
|
|
154
|
+
return new QmdConfigurationError(
|
|
155
|
+
"qmd embeddings not found. Vector search requires embeddings to be generated.",
|
|
156
|
+
"Run `clawvault embed` or `qmd embed` to generate embeddings for semantic search."
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
function execQmd(args, indexName) {
|
|
162
|
+
ensureQmdAvailable();
|
|
163
|
+
const finalArgs = withQmdIndexArgs(ensureJsonArgs(args), indexName);
|
|
164
|
+
try {
|
|
165
|
+
const result = execFileSync("qmd", finalArgs, {
|
|
166
|
+
encoding: "utf-8",
|
|
167
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
168
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
169
|
+
// 10MB
|
|
170
|
+
shell: process.platform === "win32"
|
|
171
|
+
});
|
|
172
|
+
return parseQmdOutput(result);
|
|
173
|
+
} catch (err) {
|
|
174
|
+
if (err?.code === "ENOENT") {
|
|
175
|
+
throw new QmdUnavailableError("NOT_INSTALLED");
|
|
176
|
+
}
|
|
177
|
+
if (err?.status === 1 && err?.stdout) {
|
|
178
|
+
return parseQmdOutput(err.stdout);
|
|
179
|
+
}
|
|
180
|
+
const output = [err?.stdout, err?.stderr].filter(Boolean).join("\n");
|
|
181
|
+
const detectedError = detectQmdError(output, finalArgs);
|
|
182
|
+
if (detectedError) {
|
|
183
|
+
throw detectedError;
|
|
184
|
+
}
|
|
185
|
+
if (output) {
|
|
186
|
+
try {
|
|
187
|
+
return parseQmdOutput(output);
|
|
188
|
+
} catch {
|
|
189
|
+
}
|
|
190
|
+
if (output.includes("collection not found") || output.includes("no such collection")) {
|
|
191
|
+
throw new QmdUnavailableError("COLLECTION_NOT_FOUND", output.trim());
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const errorDetail = err?.message || "unknown error";
|
|
195
|
+
throw new QmdUnavailableError("EXECUTION_FAILED", errorDetail);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function hasQmd() {
|
|
199
|
+
const result = spawnSync("qmd", ["--version"], { stdio: "ignore", shell: process.platform === "win32" });
|
|
200
|
+
return !result.error && (result.status === 0 || result.status === 1);
|
|
201
|
+
}
|
|
202
|
+
function qmdUpdate(collection, indexName) {
|
|
203
|
+
ensureQmdAvailable();
|
|
204
|
+
const args = ["update"];
|
|
205
|
+
if (collection) {
|
|
206
|
+
args.push("-c", collection);
|
|
207
|
+
}
|
|
208
|
+
execFileSync("qmd", withQmdIndexArgs(args, indexName), { stdio: "inherit", shell: process.platform === "win32" });
|
|
209
|
+
}
|
|
210
|
+
function qmdEmbed(collection, indexName) {
|
|
211
|
+
ensureQmdAvailable();
|
|
212
|
+
const args = ["embed"];
|
|
213
|
+
if (collection) {
|
|
214
|
+
args.push("-c", collection);
|
|
215
|
+
}
|
|
216
|
+
execFileSync("qmd", withQmdIndexArgs(args, indexName), { stdio: "inherit", shell: process.platform === "win32" });
|
|
217
|
+
}
|
|
218
|
+
var SearchEngine = class {
|
|
219
|
+
documents = /* @__PURE__ */ new Map();
|
|
220
|
+
collection = "";
|
|
221
|
+
vaultPath = "";
|
|
222
|
+
collectionRoot = "";
|
|
223
|
+
qmdIndexName;
|
|
224
|
+
/**
|
|
225
|
+
* Set the collection name (usually vault name)
|
|
226
|
+
*/
|
|
227
|
+
setCollection(name) {
|
|
228
|
+
this.collection = name;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get the current collection name
|
|
232
|
+
*/
|
|
233
|
+
getCollection() {
|
|
234
|
+
return this.collection;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Set the vault path for file resolution
|
|
238
|
+
*/
|
|
239
|
+
setVaultPath(vaultPath) {
|
|
240
|
+
this.vaultPath = vaultPath;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Set the collection root for qmd:// URI resolution
|
|
244
|
+
*/
|
|
245
|
+
setCollectionRoot(root) {
|
|
246
|
+
this.collectionRoot = path.resolve(root);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Set qmd index name (defaults to qmd global default when omitted)
|
|
250
|
+
*/
|
|
251
|
+
setIndexName(indexName) {
|
|
252
|
+
this.qmdIndexName = indexName;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Add or update a document in the local cache
|
|
256
|
+
* Note: qmd indexing happens via qmd update command
|
|
257
|
+
*/
|
|
258
|
+
addDocument(doc) {
|
|
259
|
+
this.documents.set(doc.id, doc);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Remove a document from the local cache
|
|
263
|
+
*/
|
|
264
|
+
removeDocument(id) {
|
|
265
|
+
this.documents.delete(id);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* No-op for qmd - indexing is managed externally
|
|
269
|
+
*/
|
|
270
|
+
rebuildIDF() {
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* BM25 search via qmd
|
|
274
|
+
*/
|
|
275
|
+
search(query, options = {}) {
|
|
276
|
+
return this.runQmdQuery("search", query, options);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Vector/semantic search via qmd vsearch
|
|
280
|
+
*/
|
|
281
|
+
vsearch(query, options = {}) {
|
|
282
|
+
return this.runQmdQuery("vsearch", query, options);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Combined search with query expansion (qmd query command)
|
|
286
|
+
*/
|
|
287
|
+
query(query, options = {}) {
|
|
288
|
+
return this.runQmdQuery("query", query, options);
|
|
289
|
+
}
|
|
290
|
+
runQmdQuery(command, query, options) {
|
|
291
|
+
const {
|
|
292
|
+
limit = 10,
|
|
293
|
+
minScore = 0,
|
|
294
|
+
category,
|
|
295
|
+
tags,
|
|
296
|
+
fullContent = false,
|
|
297
|
+
temporalBoost = false
|
|
298
|
+
} = options;
|
|
299
|
+
if (!query.trim()) return [];
|
|
300
|
+
const args = [
|
|
301
|
+
command,
|
|
302
|
+
query,
|
|
303
|
+
"-n",
|
|
304
|
+
String(limit * 2),
|
|
305
|
+
"--json"
|
|
306
|
+
];
|
|
307
|
+
if (this.collection) {
|
|
308
|
+
args.push("-c", this.collection);
|
|
309
|
+
}
|
|
310
|
+
const qmdResults = execQmd(args, this.qmdIndexName);
|
|
311
|
+
return this.convertResults(qmdResults, {
|
|
312
|
+
limit,
|
|
313
|
+
minScore,
|
|
314
|
+
category,
|
|
315
|
+
tags,
|
|
316
|
+
fullContent,
|
|
317
|
+
temporalBoost
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Convert qmd results to ClawVault SearchResult format
|
|
322
|
+
*/
|
|
323
|
+
convertResults(qmdResults, options) {
|
|
324
|
+
const { limit = 10, minScore = 0, category, tags, fullContent = false, temporalBoost = false } = options;
|
|
325
|
+
const results = [];
|
|
326
|
+
const maxScore = qmdResults[0]?.score || 1;
|
|
327
|
+
for (const qr of qmdResults) {
|
|
328
|
+
const filePath = this.qmdUriToPath(qr.file);
|
|
329
|
+
const relativePath = this.vaultPath ? path.relative(this.vaultPath, filePath) : filePath;
|
|
330
|
+
const normalizedRelativePath = relativePath.replace(/\\/g, "/");
|
|
331
|
+
if (normalizedRelativePath.startsWith("ledger/archive/") || normalizedRelativePath.includes("/ledger/archive/")) {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
const docId = normalizedRelativePath.replace(/\.md$/, "");
|
|
335
|
+
let doc = this.documents.get(docId) ?? this.documents.get(docId.split("/").join(path.sep));
|
|
336
|
+
const modifiedAt = this.resolveModifiedAt(doc, filePath);
|
|
337
|
+
const parts = normalizedRelativePath.split("/");
|
|
338
|
+
const docCategory = parts.length > 1 ? parts[0] : "root";
|
|
339
|
+
if (category && docCategory !== category) continue;
|
|
340
|
+
if (tags && tags.length > 0 && doc) {
|
|
341
|
+
const docTags = new Set(doc.tags);
|
|
342
|
+
if (!tags.some((t) => docTags.has(t))) continue;
|
|
343
|
+
}
|
|
344
|
+
const normalizedScore = maxScore > 0 ? qr.score / maxScore : 0;
|
|
345
|
+
const finalScore = temporalBoost ? normalizedScore * this.getRecencyFactor(modifiedAt) : normalizedScore;
|
|
346
|
+
if (finalScore < minScore) continue;
|
|
347
|
+
if (!doc) {
|
|
348
|
+
doc = {
|
|
349
|
+
id: docId,
|
|
350
|
+
path: filePath,
|
|
351
|
+
category: docCategory,
|
|
352
|
+
title: qr.title || path.basename(relativePath, ".md"),
|
|
353
|
+
content: "",
|
|
354
|
+
// Content loaded separately if needed
|
|
355
|
+
frontmatter: {},
|
|
356
|
+
links: [],
|
|
357
|
+
tags: [],
|
|
358
|
+
modified: modifiedAt
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
results.push({
|
|
362
|
+
document: fullContent ? doc : { ...doc, content: "" },
|
|
363
|
+
score: finalScore,
|
|
364
|
+
snippet: this.cleanSnippet(qr.snippet),
|
|
365
|
+
matchedTerms: []
|
|
366
|
+
// qmd doesn't provide this
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return results.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
370
|
+
}
|
|
371
|
+
resolveModifiedAt(doc, filePath) {
|
|
372
|
+
if (doc) return doc.modified;
|
|
373
|
+
try {
|
|
374
|
+
return fs.statSync(filePath).mtime;
|
|
375
|
+
} catch {
|
|
376
|
+
return /* @__PURE__ */ new Date(0);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
getRecencyFactor(modifiedAt) {
|
|
380
|
+
const ageMs = Math.max(0, Date.now() - modifiedAt.getTime());
|
|
381
|
+
const ageDays = ageMs / (24 * 60 * 60 * 1e3);
|
|
382
|
+
if (ageDays < 1) return 1;
|
|
383
|
+
if (ageDays <= 7) return 0.9;
|
|
384
|
+
return 0.7;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Convert qmd:// URI to file path
|
|
388
|
+
*/
|
|
389
|
+
qmdUriToPath(uri) {
|
|
390
|
+
if (uri.startsWith("qmd://")) {
|
|
391
|
+
const withoutScheme = uri.slice(6);
|
|
392
|
+
const slashIndex = withoutScheme.indexOf("/");
|
|
393
|
+
if (slashIndex > -1) {
|
|
394
|
+
const relativePath = withoutScheme.slice(slashIndex + 1);
|
|
395
|
+
const root = this.collectionRoot || this.vaultPath;
|
|
396
|
+
if (root) {
|
|
397
|
+
return path.join(root, relativePath);
|
|
398
|
+
}
|
|
399
|
+
return relativePath;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return uri;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Clean up qmd snippet format
|
|
406
|
+
*/
|
|
407
|
+
cleanSnippet(snippet) {
|
|
408
|
+
if (!snippet) return "";
|
|
409
|
+
return snippet.replace(/@@ [-+]?\d+,?\d* @@ \([^)]+\)/g, "").trim().split("\n").slice(0, 3).join("\n").slice(0, 300);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Get all cached documents
|
|
413
|
+
*/
|
|
414
|
+
getAllDocuments() {
|
|
415
|
+
return [...this.documents.values()];
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Get document count
|
|
419
|
+
*/
|
|
420
|
+
get size() {
|
|
421
|
+
return this.documents.size;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Clear the local document cache
|
|
425
|
+
*/
|
|
426
|
+
clear() {
|
|
427
|
+
this.documents.clear();
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Export documents for persistence
|
|
431
|
+
*/
|
|
432
|
+
export() {
|
|
433
|
+
return {
|
|
434
|
+
documents: [...this.documents.values()]
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Import from persisted data
|
|
439
|
+
*/
|
|
440
|
+
import(data) {
|
|
441
|
+
this.clear();
|
|
442
|
+
for (const doc of data.documents) {
|
|
443
|
+
this.addDocument(doc);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
function extractWikiLinks(content) {
|
|
448
|
+
const matches = content.match(/\[\[([^\]]+)\]\]/g) || [];
|
|
449
|
+
return matches.map((m) => m.slice(2, -2).toLowerCase());
|
|
450
|
+
}
|
|
451
|
+
function extractTags(content) {
|
|
452
|
+
const matches = content.match(/#[\w-]+/g) || [];
|
|
453
|
+
return [...new Set(matches.map((m) => m.slice(1).toLowerCase()))];
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export {
|
|
457
|
+
QMD_INSTALL_URL,
|
|
458
|
+
QMD_INSTALL_COMMAND,
|
|
459
|
+
QmdUnavailableError,
|
|
460
|
+
getQmdErrorDetails,
|
|
461
|
+
QmdConfigurationError,
|
|
462
|
+
withQmdIndexArgs,
|
|
463
|
+
hasQmd,
|
|
464
|
+
qmdUpdate,
|
|
465
|
+
qmdEmbed,
|
|
466
|
+
SearchEngine,
|
|
467
|
+
extractWikiLinks,
|
|
468
|
+
extractTags
|
|
469
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Observer
|
|
3
|
-
} from "./chunk-3NSBOUT3.js";
|
|
4
1
|
import {
|
|
5
2
|
getSessionsDir
|
|
6
3
|
} from "./chunk-HRLWZGMA.js";
|
|
4
|
+
import {
|
|
5
|
+
Observer
|
|
6
|
+
} from "./chunk-77Q5CSPJ.js";
|
|
7
7
|
|
|
8
8
|
// src/observer/active-session-observer.ts
|
|
9
9
|
import * as fs from "fs";
|
|
@@ -18,11 +18,6 @@ var AGENT_ID_RE = /^[a-zA-Z0-9_-]{1,100}$/;
|
|
|
18
18
|
var SESSION_ID_RE = /^[a-zA-Z0-9._-]{1,200}$/;
|
|
19
19
|
var CURSOR_FILE_NAME = "observe-cursors.json";
|
|
20
20
|
var STALE_CURSOR_THRESHOLD_MS = 12 * 60 * 60 * 1e3;
|
|
21
|
-
function formatBytes(bytes) {
|
|
22
|
-
if (bytes >= ONE_MIB) return `${(bytes / ONE_MIB).toFixed(1)}MB`;
|
|
23
|
-
if (bytes >= ONE_KIB) return `${Math.round(bytes / ONE_KIB)}KB`;
|
|
24
|
-
return `${bytes}B`;
|
|
25
|
-
}
|
|
26
21
|
function isFiniteNonNegative(value) {
|
|
27
22
|
return typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
28
23
|
}
|
|
@@ -158,12 +153,7 @@ function getObserverStaleness(vaultPath, options = {}) {
|
|
|
158
153
|
if (!sessionStat.isFile()) {
|
|
159
154
|
continue;
|
|
160
155
|
}
|
|
161
|
-
|
|
162
|
-
if (newBytes <= 0) {
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
const processThreshold = getScaledObservationThresholdBytes(sessionStat.size);
|
|
166
|
-
if (newBytes < processThreshold) {
|
|
156
|
+
if (cursor.lastFileSize >= sessionStat.size) {
|
|
167
157
|
continue;
|
|
168
158
|
}
|
|
169
159
|
staleCount += 1;
|
|
@@ -191,32 +181,8 @@ function loadSessionIndex(sessionsDir) {
|
|
|
191
181
|
return {};
|
|
192
182
|
}
|
|
193
183
|
}
|
|
194
|
-
function findMostRecentResetFile(sessionsDir, sessionId) {
|
|
195
|
-
const prefix = `${sessionId}.jsonl.reset.`;
|
|
196
|
-
try {
|
|
197
|
-
const files = fs.readdirSync(sessionsDir).filter((f) => f.startsWith(prefix)).sort().reverse();
|
|
198
|
-
return files.length > 0 ? path.join(sessionsDir, files[0]) : null;
|
|
199
|
-
} catch {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
184
|
function resolveTranscriptPath(sessionsDir, sessionId) {
|
|
204
|
-
|
|
205
|
-
try {
|
|
206
|
-
const stat = fs.statSync(mainPath);
|
|
207
|
-
if (stat.size < 100) {
|
|
208
|
-
const resetFile = findMostRecentResetFile(sessionsDir, sessionId);
|
|
209
|
-
if (resetFile) {
|
|
210
|
-
return resetFile;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
} catch {
|
|
214
|
-
const resetFile = findMostRecentResetFile(sessionsDir, sessionId);
|
|
215
|
-
if (resetFile) {
|
|
216
|
-
return resetFile;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return mainPath;
|
|
185
|
+
return path.join(sessionsDir, `${sessionId}.jsonl`);
|
|
220
186
|
}
|
|
221
187
|
function discoverSessionDescriptors(sessionsDir, fallbackAgentId) {
|
|
222
188
|
const descriptors = [];
|
|
@@ -293,21 +259,6 @@ function normalizeRole(role) {
|
|
|
293
259
|
}
|
|
294
260
|
return role.trim().toLowerCase();
|
|
295
261
|
}
|
|
296
|
-
function summarizeContentArray(content) {
|
|
297
|
-
const parts = [];
|
|
298
|
-
for (const block of content) {
|
|
299
|
-
if (!block || typeof block !== "object") continue;
|
|
300
|
-
const b = block;
|
|
301
|
-
if (b.type === "text" && typeof b.text === "string") {
|
|
302
|
-
const text = normalizeWhitespace(b.text);
|
|
303
|
-
if (text) parts.push(text);
|
|
304
|
-
} else if (b.type === "toolCall") {
|
|
305
|
-
const toolName = typeof b.name === "string" ? b.name : "tool";
|
|
306
|
-
parts.push(`[tool: ${toolName}]`);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
return parts.join(" ");
|
|
310
|
-
}
|
|
311
262
|
function parseOpenClawJsonLine(line) {
|
|
312
263
|
if (!line.trim()) {
|
|
313
264
|
return "";
|
|
@@ -324,38 +275,14 @@ function parseOpenClawJsonLine(line) {
|
|
|
324
275
|
const entry = parsed;
|
|
325
276
|
if ("role" in entry && "content" in entry) {
|
|
326
277
|
const role = normalizeRole(entry.role);
|
|
327
|
-
|
|
328
|
-
if (role === "toolresult") {
|
|
329
|
-
const output = extractContentText(entry.content);
|
|
330
|
-
const preview = output.slice(0, 80) || "ok";
|
|
331
|
-
return `[tool_result \u2192 ${preview}]`;
|
|
332
|
-
}
|
|
333
|
-
const raw = entry.content;
|
|
334
|
-
let content;
|
|
335
|
-
if (Array.isArray(raw)) {
|
|
336
|
-
content = summarizeContentArray(raw);
|
|
337
|
-
} else {
|
|
338
|
-
content = extractContentText(raw);
|
|
339
|
-
}
|
|
278
|
+
const content = extractContentText(entry.content);
|
|
340
279
|
if (!content) return "";
|
|
341
280
|
return role ? `${role}: ${content}` : content;
|
|
342
281
|
}
|
|
343
282
|
if (entry.type === "message" && entry.message && typeof entry.message === "object") {
|
|
344
283
|
const message = entry.message;
|
|
345
284
|
const role = normalizeRole(message.role);
|
|
346
|
-
|
|
347
|
-
if (role === "toolresult") {
|
|
348
|
-
const output = extractContentText(message.content);
|
|
349
|
-
const preview = output.slice(0, 80) || "ok";
|
|
350
|
-
return `[tool_result \u2192 ${preview}]`;
|
|
351
|
-
}
|
|
352
|
-
const raw = message.content;
|
|
353
|
-
let content;
|
|
354
|
-
if (Array.isArray(raw)) {
|
|
355
|
-
content = summarizeContentArray(raw);
|
|
356
|
-
} else {
|
|
357
|
-
content = extractContentText(raw);
|
|
358
|
-
}
|
|
285
|
+
const content = extractContentText(message.content);
|
|
359
286
|
if (!content) return "";
|
|
360
287
|
return role ? `${role}: ${content}` : content;
|
|
361
288
|
}
|
|
@@ -518,9 +445,7 @@ async function observeActiveSessions(options, dependencies = {}) {
|
|
|
518
445
|
const now = dependencies.now ?? (() => /* @__PURE__ */ new Date());
|
|
519
446
|
const cursors = loadObserveCursorStore(vaultPath);
|
|
520
447
|
const descriptors = discoverSessionDescriptors(sessionsDir, agentId);
|
|
521
|
-
const
|
|
522
|
-
allCandidates.sort((a, b) => b.newBytes - a.newBytes);
|
|
523
|
-
const candidates = options.maxSessions != null && options.maxSessions > 0 ? allCandidates.slice(0, options.maxSessions) : allCandidates;
|
|
448
|
+
const candidates = selectCandidates(descriptors, cursors, options.minNewBytes);
|
|
524
449
|
if (dryRun || candidates.length === 0) {
|
|
525
450
|
return {
|
|
526
451
|
agentId,
|
|
@@ -550,9 +475,7 @@ async function observeActiveSessions(options, dependencies = {}) {
|
|
|
550
475
|
let observedNewBytes = 0;
|
|
551
476
|
const routedCounts = {};
|
|
552
477
|
const failedSessions = [];
|
|
553
|
-
for (
|
|
554
|
-
const candidate = candidates[i];
|
|
555
|
-
console.log(`[observer] processing session ${i + 1}/${candidates.length}: ${candidate.sessionKey} (${formatBytes(candidate.newBytes)} new)`);
|
|
478
|
+
for (const candidate of candidates) {
|
|
556
479
|
try {
|
|
557
480
|
const observer = observerFactory(vaultPath, observerOptions);
|
|
558
481
|
const { messages, nextOffset } = await readIncrementalMessages(candidate.filePath, candidate.startOffset);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeObservationContent,
|
|
3
|
+
parseObservationMarkdown
|
|
4
|
+
} from "./chunk-FHFUXL6G.js";
|
|
1
5
|
import {
|
|
2
6
|
requestLlmCompletion,
|
|
3
7
|
resolveLlmProvider
|
|
4
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-NCKFNBHJ.js";
|
|
5
9
|
import {
|
|
6
10
|
archiveObservations
|
|
7
11
|
} from "./chunk-MQUJNOHK.js";
|
|
8
|
-
import {
|
|
9
|
-
normalizeObservationContent,
|
|
10
|
-
parseObservationMarkdown
|
|
11
|
-
} from "./chunk-QK3UCXWL.js";
|
|
12
12
|
import {
|
|
13
13
|
formatIsoWeekKey,
|
|
14
14
|
getIsoWeek,
|
|
@@ -213,7 +213,7 @@ function promoteWeekRecords(records) {
|
|
|
213
213
|
return promoted;
|
|
214
214
|
}
|
|
215
215
|
async function maybeGenerateLlmReflection(weekKey, sections) {
|
|
216
|
-
const provider =
|
|
216
|
+
const provider = resolveLlmProvider();
|
|
217
217
|
if (!provider) {
|
|
218
218
|
return null;
|
|
219
219
|
}
|