clawvault 2.6.1 → 3.0.0-beta.2
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/bin/command-registration.test.js +1 -3
- package/bin/register-core-commands.js +30 -23
- package/bin/register-maintenance-commands.js +3 -20
- package/bin/register-query-commands.js +23 -0
- package/bin/register-task-commands.js +1 -18
- package/bin/register-task-commands.test.js +0 -16
- package/bin/register-vault-operations-commands.js +1 -29
- package/dist/chunk-2TM7DLOL.js +895 -0
- package/dist/{chunk-QVMXF7FY.js → chunk-3D6BCTP6.js} +39 -1
- package/dist/{chunk-R2MIW5G7.js → chunk-3DHXQHYG.js} +1 -1
- package/dist/{chunk-Q2J5YTUF.js → chunk-3NSBOUT3.js} +73 -36
- package/dist/chunk-3RG5ZIWI.js +10 -0
- package/dist/{chunk-AZYOKJYC.js → chunk-62YTUT6J.js} +2 -2
- package/dist/chunk-6U6MK36V.js +205 -0
- package/dist/{chunk-4QYGFWRM.js → chunk-7R7O6STJ.js} +4 -4
- package/dist/{chunk-VXEOHTSL.js → chunk-C7OK5WKP.js} +4 -4
- package/dist/chunk-CMB7UL7C.js +327 -0
- package/dist/{chunk-HIHOUSXS.js → chunk-E7MFQB6D.js} +59 -18
- package/dist/{chunk-ME37YNW3.js → chunk-F2JEUD4J.js} +6 -4
- package/dist/chunk-GAJV4IGR.js +82 -0
- package/dist/chunk-GQSLDZTS.js +560 -0
- package/dist/{chunk-4OXMU5S2.js → chunk-GUKMRGM7.js} +1 -1
- package/dist/{chunk-T76H47ZS.js → chunk-H34S76MB.js} +6 -6
- package/dist/{chunk-R6SXNSFD.js → chunk-JY6FYXIT.js} +10 -5
- package/dist/chunk-K234IDRJ.js +1073 -0
- package/dist/{chunk-IEVLHNLU.js → chunk-LNJA2UGL.js} +86 -9
- package/dist/{chunk-MFAWT5O5.js → chunk-LYHGEHXG.js} +1 -0
- package/dist/chunk-MFM6K7PU.js +374 -0
- package/dist/{chunk-QWQ3TIKS.js → chunk-N2AXRYLC.js} +1 -1
- package/dist/chunk-PAH27GSN.js +108 -0
- package/dist/{chunk-OIWVQYQF.js → chunk-QBLMXKF2.js} +1 -1
- package/dist/{chunk-FHFUXL6G.js → chunk-QK3UCXWL.js} +2 -2
- package/dist/{chunk-3BTHWPMB.js → chunk-SJSFRIYS.js} +1 -1
- package/dist/{chunk-4VRIMU4O.js → chunk-U55BGUAU.js} +2 -2
- package/dist/{chunk-PBEE567J.js → chunk-VGLOTGAS.js} +1 -1
- package/dist/{chunk-F55HGNU4.js → chunk-WAZ3NLWL.js} +47 -0
- package/dist/{chunk-KL4NAOMO.js → chunk-WGRQ6HDV.js} +1 -1
- package/dist/{chunk-UEOUADMO.js → chunk-YKTA5JOJ.js} +13 -10
- package/dist/{chunk-XAVB4GB4.js → chunk-ZVVFWOLW.js} +4 -4
- package/dist/cli/index.cjs +10033 -0
- package/dist/cli/index.d.cts +5 -0
- package/dist/cli/index.js +20 -18
- package/dist/commands/archive.cjs +287 -0
- package/dist/commands/archive.d.cts +11 -0
- package/dist/commands/archive.js +1 -0
- package/dist/commands/backlog.cjs +721 -0
- package/dist/commands/backlog.d.cts +53 -0
- package/dist/commands/backlog.js +3 -2
- package/dist/commands/blocked.cjs +204 -0
- package/dist/commands/blocked.d.cts +26 -0
- package/dist/commands/blocked.js +3 -2
- package/dist/commands/checkpoint.cjs +244 -0
- package/dist/commands/checkpoint.d.cts +41 -0
- package/dist/commands/checkpoint.js +2 -1
- package/dist/commands/compat.cjs +369 -0
- package/dist/commands/compat.d.cts +28 -0
- package/dist/commands/compat.js +2 -1
- package/dist/commands/context.cjs +2989 -0
- package/dist/commands/context.d.cts +2 -0
- package/dist/commands/context.js +5 -4
- package/dist/commands/doctor.cjs +3062 -0
- package/dist/commands/doctor.d.cts +21 -0
- package/dist/commands/doctor.d.ts +6 -1
- package/dist/commands/doctor.js +13 -11
- package/dist/commands/embed.cjs +232 -0
- package/dist/commands/embed.d.cts +17 -0
- package/dist/commands/embed.js +5 -2
- package/dist/commands/entities.cjs +141 -0
- package/dist/commands/entities.d.cts +7 -0
- package/dist/commands/entities.js +1 -0
- package/dist/commands/graph.cjs +501 -0
- package/dist/commands/graph.d.cts +21 -0
- package/dist/commands/graph.js +1 -0
- package/dist/commands/inject.cjs +1636 -0
- package/dist/commands/inject.d.cts +2 -0
- package/dist/commands/inject.d.ts +1 -1
- package/dist/commands/inject.js +4 -2
- package/dist/commands/kanban.cjs +884 -0
- package/dist/commands/kanban.d.cts +63 -0
- package/dist/commands/kanban.js +4 -3
- package/dist/commands/link.cjs +965 -0
- package/dist/commands/link.d.cts +11 -0
- package/dist/commands/link.js +1 -0
- package/dist/commands/migrate-observations.cjs +362 -0
- package/dist/commands/migrate-observations.d.cts +19 -0
- package/dist/commands/migrate-observations.js +3 -2
- package/dist/commands/observe.cjs +4099 -0
- package/dist/commands/observe.d.cts +23 -0
- package/dist/commands/observe.d.ts +1 -0
- package/dist/commands/observe.js +11 -9
- package/dist/commands/project.cjs +1341 -0
- package/dist/commands/project.d.cts +85 -0
- package/dist/commands/project.js +5 -4
- package/dist/commands/rebuild.cjs +3136 -0
- package/dist/commands/rebuild.d.cts +11 -0
- package/dist/commands/rebuild.js +10 -8
- package/dist/commands/recover.cjs +361 -0
- package/dist/commands/recover.d.cts +38 -0
- package/dist/commands/recover.js +3 -2
- package/dist/commands/reflect.cjs +1008 -0
- package/dist/commands/reflect.d.cts +11 -0
- package/dist/commands/reflect.js +6 -4
- package/dist/commands/repair-session.cjs +457 -0
- package/dist/commands/repair-session.d.cts +38 -0
- package/dist/commands/repair-session.js +1 -0
- package/dist/commands/replay.cjs +4103 -0
- package/dist/commands/replay.d.cts +16 -0
- package/dist/commands/replay.js +12 -10
- package/dist/commands/session-recap.cjs +353 -0
- package/dist/commands/session-recap.d.cts +27 -0
- package/dist/commands/session-recap.js +1 -0
- package/dist/commands/setup.cjs +1302 -0
- package/dist/commands/setup.d.cts +100 -0
- package/dist/commands/setup.d.ts +90 -2
- package/dist/commands/setup.js +21 -2
- package/dist/commands/shell-init.cjs +75 -0
- package/dist/commands/shell-init.d.cts +7 -0
- package/dist/commands/shell-init.js +2 -0
- package/dist/commands/sleep.cjs +6028 -0
- package/dist/commands/sleep.d.cts +36 -0
- package/dist/commands/sleep.d.ts +1 -1
- package/dist/commands/sleep.js +17 -15
- package/dist/commands/status.cjs +2736 -0
- package/dist/commands/status.d.cts +52 -0
- package/dist/commands/status.js +12 -10
- package/dist/commands/tailscale.cjs +1532 -0
- package/dist/commands/tailscale.d.cts +52 -0
- package/dist/commands/tailscale.js +1 -0
- package/dist/commands/task.cjs +1236 -0
- package/dist/commands/task.d.cts +97 -0
- package/dist/commands/task.js +4 -3
- package/dist/commands/template.cjs +457 -0
- package/dist/commands/template.d.cts +36 -0
- package/dist/commands/template.js +2 -1
- package/dist/commands/wake.cjs +2626 -0
- package/dist/commands/wake.d.cts +22 -0
- package/dist/commands/wake.d.ts +1 -1
- package/dist/commands/wake.js +10 -9
- package/dist/context-BUGaWpyL.d.cts +46 -0
- package/dist/index.cjs +14001 -0
- package/dist/index.d.cts +858 -0
- package/dist/index.d.ts +192 -7
- package/dist/index.js +101 -75
- package/dist/{inject-x65KXWPk.d.ts → inject-Bzi5E-By.d.cts} +1 -1
- package/dist/inject-Bzi5E-By.d.ts +137 -0
- package/dist/lib/auto-linker.cjs +176 -0
- package/dist/lib/auto-linker.d.cts +26 -0
- package/dist/lib/auto-linker.js +1 -0
- package/dist/lib/canvas-layout.cjs +136 -0
- package/dist/lib/canvas-layout.d.cts +31 -0
- package/dist/lib/canvas-layout.d.ts +16 -100
- package/dist/lib/canvas-layout.js +78 -20
- package/dist/lib/config.cjs +78 -0
- package/dist/lib/config.d.cts +11 -0
- package/dist/lib/config.js +1 -0
- package/dist/lib/entity-index.cjs +84 -0
- package/dist/lib/entity-index.d.cts +26 -0
- package/dist/lib/entity-index.js +1 -0
- package/dist/lib/project-utils.cjs +864 -0
- package/dist/lib/project-utils.d.cts +97 -0
- package/dist/lib/project-utils.js +4 -3
- package/dist/lib/session-repair.cjs +239 -0
- package/dist/lib/session-repair.d.cts +110 -0
- package/dist/lib/session-repair.js +1 -0
- package/dist/lib/session-utils.cjs +209 -0
- package/dist/lib/session-utils.d.cts +63 -0
- package/dist/lib/session-utils.js +1 -0
- package/dist/lib/tailscale.cjs +1183 -0
- package/dist/lib/tailscale.d.cts +225 -0
- package/dist/lib/tailscale.js +1 -0
- package/dist/lib/task-utils.cjs +1137 -0
- package/dist/lib/task-utils.d.cts +208 -0
- package/dist/lib/task-utils.js +3 -2
- package/dist/lib/template-engine.cjs +47 -0
- package/dist/lib/template-engine.d.cts +11 -0
- package/dist/lib/template-engine.js +1 -0
- package/dist/lib/webdav.cjs +568 -0
- package/dist/lib/webdav.d.cts +109 -0
- package/dist/lib/webdav.js +1 -0
- package/dist/plugin/index.cjs +1907 -0
- package/dist/plugin/index.d.cts +36 -0
- package/dist/plugin/index.d.ts +36 -0
- package/dist/plugin/index.js +572 -0
- package/dist/plugin/inject.cjs +356 -0
- package/dist/plugin/inject.d.cts +54 -0
- package/dist/plugin/inject.d.ts +54 -0
- package/dist/plugin/inject.js +17 -0
- package/dist/plugin/observe.cjs +631 -0
- package/dist/plugin/observe.d.cts +39 -0
- package/dist/plugin/observe.d.ts +39 -0
- package/dist/plugin/observe.js +18 -0
- package/dist/plugin/templates.cjs +593 -0
- package/dist/plugin/templates.d.cts +52 -0
- package/dist/plugin/templates.d.ts +52 -0
- package/dist/plugin/templates.js +25 -0
- package/dist/plugin/types.cjs +18 -0
- package/dist/plugin/types.d.cts +209 -0
- package/dist/plugin/types.d.ts +209 -0
- package/dist/plugin/types.js +0 -0
- package/dist/plugin/vault.cjs +927 -0
- package/dist/plugin/vault.d.cts +68 -0
- package/dist/plugin/vault.d.ts +68 -0
- package/dist/plugin/vault.js +22 -0
- package/dist/{types-C74wgGL1.d.ts → types-Y2_Um2Ls.d.cts} +44 -1
- package/dist/types-Y2_Um2Ls.d.ts +205 -0
- package/hooks/clawvault/handler.js +70 -7
- package/hooks/clawvault/handler.test.js +91 -0
- package/openclaw.plugin.json +56 -0
- package/package.json +16 -6
- package/templates/memory-event.md +67 -0
- package/templates/party.md +63 -0
- package/templates/primitive-registry.yaml +551 -0
- package/templates/run.md +68 -0
- package/templates/trigger.md +68 -0
- package/templates/workspace.md +50 -0
- package/dashboard/lib/graph-diff.js +0 -104
- package/dashboard/lib/graph-diff.test.js +0 -75
- package/dashboard/lib/vault-parser.js +0 -556
- package/dashboard/lib/vault-parser.test.js +0 -254
- package/dashboard/public/app.js +0 -796
- package/dashboard/public/index.html +0 -52
- package/dashboard/public/styles.css +0 -221
- package/dashboard/server.js +0 -374
- package/dist/chunk-MAKNAHAW.js +0 -375
- package/dist/chunk-MDIH26GC.js +0 -183
- package/dist/chunk-MGDEINGP.js +0 -99
- package/dist/chunk-RVYA52PY.js +0 -363
- package/dist/chunk-TLGBDTYT.js +0 -33
- package/dist/commands/canvas.d.ts +0 -15
- package/dist/commands/canvas.js +0 -199
- package/dist/commands/sync-bd.d.ts +0 -10
- package/dist/commands/sync-bd.js +0 -9
|
@@ -24,6 +24,19 @@ 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
|
+
}
|
|
27
40
|
function resolveProjectFile(relativePath, baseDir) {
|
|
28
41
|
if (baseDir) {
|
|
29
42
|
return path.resolve(baseDir, relativePath);
|
|
@@ -32,6 +45,20 @@ function resolveProjectFile(relativePath, baseDir) {
|
|
|
32
45
|
if (fs.existsSync(fromCwd)) {
|
|
33
46
|
return fromCwd;
|
|
34
47
|
}
|
|
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
|
+
}
|
|
35
62
|
return path.resolve(findPackageRoot(), relativePath);
|
|
36
63
|
}
|
|
37
64
|
function checkOpenClawCli() {
|
|
@@ -63,7 +90,18 @@ function checkOpenClawCli() {
|
|
|
63
90
|
return { label: "openclaw CLI available", status: "ok" };
|
|
64
91
|
}
|
|
65
92
|
function checkPackageHookRegistration(options) {
|
|
66
|
-
|
|
93
|
+
let packageRaw = readOptionalFile(resolveProjectFile("package.json", options.baseDir));
|
|
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
|
+
}
|
|
67
105
|
if (!packageRaw) {
|
|
68
106
|
return {
|
|
69
107
|
label: "package hook registration",
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
listProjects
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-62YTUT6J.js";
|
|
4
|
+
import {
|
|
5
|
+
listConfig,
|
|
6
|
+
listRouteRules,
|
|
7
|
+
matchRouteRule
|
|
8
|
+
} from "./chunk-ITPEXLHA.js";
|
|
9
|
+
import {
|
|
10
|
+
resolveClaudeOAuthToken
|
|
11
|
+
} from "./chunk-PAH27GSN.js";
|
|
12
|
+
import {
|
|
13
|
+
createBacklogItem,
|
|
14
|
+
listBacklogItems,
|
|
15
|
+
listTasks,
|
|
16
|
+
updateBacklogItem,
|
|
17
|
+
updateTask
|
|
18
|
+
} from "./chunk-N2AXRYLC.js";
|
|
4
19
|
import {
|
|
5
20
|
DATE_HEADING_RE,
|
|
6
21
|
inferObservationType,
|
|
@@ -9,12 +24,7 @@ import {
|
|
|
9
24
|
parseObservationMarkdown,
|
|
10
25
|
renderObservationMarkdown,
|
|
11
26
|
renderScoredObservationLine
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import {
|
|
14
|
-
listConfig,
|
|
15
|
-
listRouteRules,
|
|
16
|
-
matchRouteRule
|
|
17
|
-
} from "./chunk-ITPEXLHA.js";
|
|
27
|
+
} from "./chunk-QK3UCXWL.js";
|
|
18
28
|
import {
|
|
19
29
|
ensureLedgerStructure,
|
|
20
30
|
ensureParentDir,
|
|
@@ -23,19 +33,12 @@ import {
|
|
|
23
33
|
getRawTranscriptPath,
|
|
24
34
|
toDateKey
|
|
25
35
|
} from "./chunk-Z2XBWN7A.js";
|
|
26
|
-
import {
|
|
27
|
-
createBacklogItem,
|
|
28
|
-
listBacklogItems,
|
|
29
|
-
listTasks,
|
|
30
|
-
updateBacklogItem,
|
|
31
|
-
updateTask
|
|
32
|
-
} from "./chunk-QWQ3TIKS.js";
|
|
33
36
|
|
|
34
37
|
// src/observer/compressor.ts
|
|
35
38
|
var OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
36
39
|
var OLLAMA_BASE_URL = "http://localhost:11434/v1";
|
|
37
40
|
var DEFAULT_PROVIDER_MODELS = {
|
|
38
|
-
anthropic: "claude-
|
|
41
|
+
anthropic: "claude-haiku-4-5",
|
|
39
42
|
openai: "gpt-4o-mini",
|
|
40
43
|
gemini: "gemini-2.0-flash",
|
|
41
44
|
"openai-compatible": "gpt-4o-mini",
|
|
@@ -69,7 +72,7 @@ var Compressor = class {
|
|
|
69
72
|
return existingObservations.trim();
|
|
70
73
|
}
|
|
71
74
|
const prompt = this.buildPrompt(cleanedMessages, existingObservations);
|
|
72
|
-
const backend = this.resolveProvider();
|
|
75
|
+
const backend = await this.resolveProvider();
|
|
73
76
|
if (backend) {
|
|
74
77
|
try {
|
|
75
78
|
const llmOutput = backend.provider === "anthropic" ? await this.callAnthropic(prompt, backend) : backend.provider === "gemini" ? await this.callGemini(prompt, backend) : backend.provider === "openai" ? await this.callOpenAI(prompt, backend) : await this.callOpenAICompatible(prompt, backend);
|
|
@@ -83,16 +86,16 @@ var Compressor = class {
|
|
|
83
86
|
const fallback = this.fallbackCompression(cleanedMessages);
|
|
84
87
|
return this.mergeObservations(existingObservations, fallback);
|
|
85
88
|
}
|
|
86
|
-
resolveProvider() {
|
|
89
|
+
async resolveProvider() {
|
|
87
90
|
if (process.env.CLAWVAULT_NO_LLM) return null;
|
|
88
91
|
if (this.provider) {
|
|
89
92
|
const configured = this.resolveConfiguredProvider(this.provider);
|
|
90
93
|
if (configured) {
|
|
91
94
|
return configured;
|
|
92
95
|
}
|
|
93
|
-
return this.resolveProviderFromEnv(false);
|
|
96
|
+
return await this.resolveProviderFromEnv(false);
|
|
94
97
|
}
|
|
95
|
-
return this.resolveProviderFromEnv(true);
|
|
98
|
+
return await this.resolveProviderFromEnv(true);
|
|
96
99
|
}
|
|
97
100
|
resolveConfiguredProvider(provider) {
|
|
98
101
|
const model = this.resolveModel(provider);
|
|
@@ -138,14 +141,21 @@ var Compressor = class {
|
|
|
138
141
|
baseUrl: this.resolveBaseUrl(provider)
|
|
139
142
|
};
|
|
140
143
|
}
|
|
141
|
-
resolveProviderFromEnv(allowConfiguredModel) {
|
|
144
|
+
async resolveProviderFromEnv(allowConfiguredModel) {
|
|
145
|
+
const anthropicModel = allowConfiguredModel ? this.resolveModel("anthropic") : DEFAULT_PROVIDER_MODELS.anthropic;
|
|
146
|
+
const oauthEnvToken = this.readEnvValue("ANTHROPIC_OAUTH_TOKEN");
|
|
147
|
+
if (oauthEnvToken) {
|
|
148
|
+
return { provider: "anthropic", model: anthropicModel, apiKey: oauthEnvToken, isOAuth: true };
|
|
149
|
+
}
|
|
142
150
|
const anthropicApiKey = this.readEnvValue("ANTHROPIC_API_KEY");
|
|
143
151
|
if (anthropicApiKey) {
|
|
144
|
-
return {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
152
|
+
return { provider: "anthropic", model: anthropicModel, apiKey: anthropicApiKey };
|
|
153
|
+
}
|
|
154
|
+
if (this.readEnvValue("CLAWVAULT_CLAUDE_AUTH")) {
|
|
155
|
+
const oauthToken = await resolveClaudeOAuthToken();
|
|
156
|
+
if (oauthToken) {
|
|
157
|
+
return { provider: "anthropic", model: anthropicModel, apiKey: oauthToken, isOAuth: true };
|
|
158
|
+
}
|
|
149
159
|
}
|
|
150
160
|
const openAiApiKey = this.readEnvValue("OPENAI_API_KEY");
|
|
151
161
|
if (openAiApiKey) {
|
|
@@ -215,6 +225,17 @@ var Compressor = class {
|
|
|
215
225
|
"- Confidence c reflects extraction certainty, not importance.",
|
|
216
226
|
"- Preserve source tags when present (e.g., [main], [telegram-dm], [discord], [telegram-group]).",
|
|
217
227
|
"",
|
|
228
|
+
"PREFERENCE & PERSONAL CONTEXT EXTRACTION (critical for personalization):",
|
|
229
|
+
"- Emit [preference] for ANY personal detail that reveals tastes, habits, equipment, or context:",
|
|
230
|
+
' * Explicit: "I prefer X", "I like Y", "I always use Z"',
|
|
231
|
+
' * Ownership: "my Sony A7R IV", "I have a...", "I use...", "I own..."',
|
|
232
|
+
' * Habits/routines: "I usually...", "every morning I...", "I tend to..."',
|
|
233
|
+
" * Interests: topics the user is enthusiastic about, hobbies mentioned in passing",
|
|
234
|
+
" * Constraints: dietary restrictions, allergies, phobias, limitations",
|
|
235
|
+
` * Goals: "I'm trying to...", "I want to learn..."`,
|
|
236
|
+
"- These are HIGH VALUE observations (i >= 0.60) \u2014 they enable personalized responses.",
|
|
237
|
+
"- When in doubt between [preference] and [task], choose [preference] if it describes a lasting trait.",
|
|
238
|
+
"",
|
|
218
239
|
"TASK EXTRACTION (required):",
|
|
219
240
|
`- Emit [todo] for explicit TODO phrasing: "TODO:", "we need to", "don't forget", "remember to", "make sure to".`,
|
|
220
241
|
`- Emit [task] for commitments/action intent: "I'll", "I will", "let me", "going to", "plan to", "should".`,
|
|
@@ -293,19 +314,35 @@ var Compressor = class {
|
|
|
293
314
|
if (!backend.apiKey) {
|
|
294
315
|
return "";
|
|
295
316
|
}
|
|
317
|
+
const isOAuth = backend.isOAuth || backend.apiKey.includes("sk-ant-oat");
|
|
318
|
+
const headers = isOAuth ? {
|
|
319
|
+
"content-type": "application/json",
|
|
320
|
+
"authorization": `Bearer ${backend.apiKey}`,
|
|
321
|
+
"anthropic-version": "2023-06-01",
|
|
322
|
+
"anthropic-beta": "claude-code-20250219,oauth-2025-04-20",
|
|
323
|
+
"x-app": "cli",
|
|
324
|
+
"user-agent": "claude-cli/1.0.0 (external, cli)"
|
|
325
|
+
} : {
|
|
326
|
+
"content-type": "application/json",
|
|
327
|
+
"x-api-key": backend.apiKey,
|
|
328
|
+
"anthropic-version": "2023-06-01"
|
|
329
|
+
};
|
|
330
|
+
const body = isOAuth ? {
|
|
331
|
+
model: backend.model,
|
|
332
|
+
temperature: 0.1,
|
|
333
|
+
max_tokens: 1400,
|
|
334
|
+
system: [{ type: "text", text: "You are Claude Code, Anthropic's official CLI for Claude." }],
|
|
335
|
+
messages: [{ role: "user", content: prompt }]
|
|
336
|
+
} : {
|
|
337
|
+
model: backend.model,
|
|
338
|
+
temperature: 0.1,
|
|
339
|
+
max_tokens: 1400,
|
|
340
|
+
messages: [{ role: "user", content: prompt }]
|
|
341
|
+
};
|
|
296
342
|
const response = await this.fetchImpl("https://api.anthropic.com/v1/messages", {
|
|
297
343
|
method: "POST",
|
|
298
|
-
headers
|
|
299
|
-
|
|
300
|
-
"x-api-key": backend.apiKey,
|
|
301
|
-
"anthropic-version": "2023-06-01"
|
|
302
|
-
},
|
|
303
|
-
body: JSON.stringify({
|
|
304
|
-
model: backend.model,
|
|
305
|
-
temperature: 0.1,
|
|
306
|
-
max_tokens: 1400,
|
|
307
|
-
messages: [{ role: "user", content: prompt }]
|
|
308
|
-
})
|
|
344
|
+
headers,
|
|
345
|
+
body: JSON.stringify(body)
|
|
309
346
|
});
|
|
310
347
|
if (!response.ok) {
|
|
311
348
|
throw new Error(`Anthropic request failed (${response.status})`);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
__require
|
|
10
|
+
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
listTasks,
|
|
3
3
|
slugify
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-N2AXRYLC.js";
|
|
5
5
|
import {
|
|
6
6
|
loadSchemaTemplateDefinition,
|
|
7
7
|
renderDocumentFromTemplate
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-LYHGEHXG.js";
|
|
9
9
|
|
|
10
10
|
// src/lib/project-utils.ts
|
|
11
11
|
import * as fs from "fs";
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import {
|
|
2
|
+
classifyText
|
|
3
|
+
} from "./chunk-GQSLDZTS.js";
|
|
4
|
+
|
|
5
|
+
// src/plugin/observe.ts
|
|
6
|
+
function isObservable(text) {
|
|
7
|
+
if (!text || text.length < 20 || text.length > 5e3) return false;
|
|
8
|
+
if (text.includes("<relevant-memories>")) return false;
|
|
9
|
+
if (text.startsWith("[System")) return false;
|
|
10
|
+
if (text.includes("HEARTBEAT")) return false;
|
|
11
|
+
if (text.startsWith("NO_REPLY")) return false;
|
|
12
|
+
if (text.startsWith("{") && text.includes('"')) return false;
|
|
13
|
+
const markdownDensity = (text.match(/[#*`\-|>]/g) || []).length / text.length;
|
|
14
|
+
if (markdownDensity > 0.15) return false;
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
var OBSERVATION_PATTERNS = [
|
|
18
|
+
// Preferences
|
|
19
|
+
{ pattern: /\b(i prefer|i like|i hate|i love|i want|i need|i always|i never|don't like|dont like)\b/i, weight: 2 },
|
|
20
|
+
// Decisions
|
|
21
|
+
{ pattern: /\b(we decided|let's go with|we're going|i chose|we'll use|ship it|do it|go with)\b/i, weight: 2 },
|
|
22
|
+
// Facts about people/things
|
|
23
|
+
{ pattern: /\b(my .+ is|his .+ is|her .+ is|their .+ is|works at|lives in|born in)\b/i, weight: 1.5 },
|
|
24
|
+
// Contact info
|
|
25
|
+
{ pattern: /[\w.-]+@[\w.-]+\.\w+|\+\d{10,}/i, weight: 2 },
|
|
26
|
+
// Explicit memory request
|
|
27
|
+
{ pattern: /\b(remember|don't forget|keep in mind|note that|important:)\b/i, weight: 2.5 },
|
|
28
|
+
// Deadlines/dates
|
|
29
|
+
{ pattern: /\b(by tonight|by tomorrow|deadline|due date|by end of|ship by|ready by)\b/i, weight: 1.5 },
|
|
30
|
+
// Lessons learned
|
|
31
|
+
{ pattern: /\b(i learned|we learned|lesson|realized|discovered|found out)\b/i, weight: 1.5 },
|
|
32
|
+
// Tasks
|
|
33
|
+
{ pattern: /\b(need to|should|must|have to|todo|task)\b/i, weight: 1 },
|
|
34
|
+
// Projects
|
|
35
|
+
{ pattern: /\b(working on|building|developing|project|initiative)\b/i, weight: 1 }
|
|
36
|
+
];
|
|
37
|
+
function extractObservations(text) {
|
|
38
|
+
const observations = [];
|
|
39
|
+
const sentences = splitIntoSentences(text);
|
|
40
|
+
const now = /* @__PURE__ */ new Date();
|
|
41
|
+
for (const sentence of sentences) {
|
|
42
|
+
if (sentence.length < 15) continue;
|
|
43
|
+
let totalWeight = 0;
|
|
44
|
+
for (const { pattern, weight } of OBSERVATION_PATTERNS) {
|
|
45
|
+
if (pattern.test(sentence)) {
|
|
46
|
+
totalWeight += weight;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (totalWeight < 1) continue;
|
|
50
|
+
const classification = classifyText(sentence);
|
|
51
|
+
const category = deriveCategoryFromPrimitive(classification.primitiveType, sentence);
|
|
52
|
+
const tags = generateTags(classification, sentence);
|
|
53
|
+
observations.push({
|
|
54
|
+
text: sentence.trim(),
|
|
55
|
+
primitiveType: classification.primitiveType,
|
|
56
|
+
confidence: classification.confidence,
|
|
57
|
+
matchedKeywords: classification.matchedKeywords,
|
|
58
|
+
category,
|
|
59
|
+
tags,
|
|
60
|
+
extractedAt: now
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return observations;
|
|
64
|
+
}
|
|
65
|
+
function splitIntoSentences(text) {
|
|
66
|
+
const raw = text.split(/(?<=[.!?\n])\s+/);
|
|
67
|
+
const sentences = [];
|
|
68
|
+
for (const s of raw) {
|
|
69
|
+
const trimmed = s.trim();
|
|
70
|
+
if (trimmed.length > 0) {
|
|
71
|
+
sentences.push(trimmed);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return sentences;
|
|
75
|
+
}
|
|
76
|
+
function deriveCategoryFromPrimitive(primitiveType, text) {
|
|
77
|
+
const lower = text.toLowerCase();
|
|
78
|
+
if (primitiveType === "memory_event") {
|
|
79
|
+
if (/prefer|like|love|hate|want|need|always|never/i.test(lower)) {
|
|
80
|
+
return "preference";
|
|
81
|
+
}
|
|
82
|
+
if (/remember|don't forget|keep in mind|note that/i.test(lower)) {
|
|
83
|
+
return "note";
|
|
84
|
+
}
|
|
85
|
+
return "fact";
|
|
86
|
+
}
|
|
87
|
+
const categoryMap = {
|
|
88
|
+
person: "entity",
|
|
89
|
+
decision: "decision",
|
|
90
|
+
task: "task",
|
|
91
|
+
project: "project",
|
|
92
|
+
lesson: "lesson",
|
|
93
|
+
trigger: "automation",
|
|
94
|
+
run: "execution",
|
|
95
|
+
checkpoint: "checkpoint",
|
|
96
|
+
handoff: "handoff",
|
|
97
|
+
"daily-note": "daily",
|
|
98
|
+
daily: "daily",
|
|
99
|
+
party: "entity",
|
|
100
|
+
workspace: "workspace"
|
|
101
|
+
};
|
|
102
|
+
return categoryMap[primitiveType] ?? "fact";
|
|
103
|
+
}
|
|
104
|
+
function generateTags(classification, text) {
|
|
105
|
+
const tags = [classification.primitiveType];
|
|
106
|
+
const lower = text.toLowerCase();
|
|
107
|
+
if (/prefer|like|love/i.test(lower)) tags.push("positive");
|
|
108
|
+
if (/hate|dislike|don't like/i.test(lower)) tags.push("negative");
|
|
109
|
+
if (/deadline|due|by tomorrow|by tonight/i.test(lower)) tags.push("time-sensitive");
|
|
110
|
+
if (/important|critical|urgent/i.test(lower)) tags.push("high-priority");
|
|
111
|
+
if (/email|phone|contact/i.test(lower)) tags.push("contact-info");
|
|
112
|
+
if (/decided|chose|approved/i.test(lower)) tags.push("finalized");
|
|
113
|
+
if (/proposed|considering|might/i.test(lower)) tags.push("tentative");
|
|
114
|
+
return [...new Set(tags)];
|
|
115
|
+
}
|
|
116
|
+
function processMessageForObservations(content, options = {}) {
|
|
117
|
+
if (!isObservable(content)) {
|
|
118
|
+
return {
|
|
119
|
+
observations: [],
|
|
120
|
+
skipped: 1,
|
|
121
|
+
reason: "Content not observable"
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const observations = extractObservations(content);
|
|
125
|
+
const maxObservations = 5;
|
|
126
|
+
const limited = observations.slice(0, maxObservations);
|
|
127
|
+
const skipped = observations.length - limited.length;
|
|
128
|
+
return {
|
|
129
|
+
observations: limited,
|
|
130
|
+
skipped,
|
|
131
|
+
reason: skipped > 0 ? `Limited to ${maxObservations} observations` : void 0
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function detectCategory(text) {
|
|
135
|
+
const classification = classifyText(text);
|
|
136
|
+
return deriveCategoryFromPrimitive(classification.primitiveType, text);
|
|
137
|
+
}
|
|
138
|
+
function extractPreferences(text) {
|
|
139
|
+
const preferences = [];
|
|
140
|
+
const patterns = [
|
|
141
|
+
{ regex: /i (?:really )?(?:like|love|enjoy|prefer)\s+(.+?)(?:\.|,|$)/gi, sentiment: "positive" },
|
|
142
|
+
{ regex: /i (?:don't|do not|hate|dislike)\s+(.+?)(?:\.|,|$)/gi, sentiment: "negative" },
|
|
143
|
+
{ regex: /my favorite\s+(.+?)\s+is\s+(.+?)(?:\.|,|$)/gi, sentiment: "positive", hasCategory: true },
|
|
144
|
+
{ regex: /i prefer\s+(.+?)\s+over\s+(.+?)(?:\.|,|$)/gi, sentiment: "positive" }
|
|
145
|
+
];
|
|
146
|
+
for (const { regex, sentiment, hasCategory } of patterns) {
|
|
147
|
+
let match;
|
|
148
|
+
regex.lastIndex = 0;
|
|
149
|
+
while ((match = regex.exec(text)) !== null) {
|
|
150
|
+
if (hasCategory && match[2]) {
|
|
151
|
+
preferences.push({
|
|
152
|
+
category: normalizeCategory(match[1]),
|
|
153
|
+
item: match[2].trim(),
|
|
154
|
+
sentiment,
|
|
155
|
+
confidence: 0.8,
|
|
156
|
+
source: text.slice(0, 100)
|
|
157
|
+
});
|
|
158
|
+
} else if (match[1]) {
|
|
159
|
+
const item = match[1].trim();
|
|
160
|
+
preferences.push({
|
|
161
|
+
category: inferCategory(item),
|
|
162
|
+
item,
|
|
163
|
+
sentiment,
|
|
164
|
+
confidence: 0.7,
|
|
165
|
+
source: text.slice(0, 100)
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return preferences;
|
|
171
|
+
}
|
|
172
|
+
function normalizeCategory(category) {
|
|
173
|
+
return category.toLowerCase().trim().replace(/\s+/g, "_");
|
|
174
|
+
}
|
|
175
|
+
function inferCategory(item) {
|
|
176
|
+
const itemLower = item.toLowerCase();
|
|
177
|
+
const categoryKeywords = {
|
|
178
|
+
food: ["pizza", "coffee", "tea", "food", "restaurant", "cuisine", "dish", "meal", "drink"],
|
|
179
|
+
technology: ["programming", "code", "software", "app", "technology", "framework", "language", "tool"],
|
|
180
|
+
entertainment: ["movie", "music", "book", "game", "show", "series", "film", "song", "album"],
|
|
181
|
+
work: ["meeting", "project", "task", "deadline", "team", "client"],
|
|
182
|
+
communication: ["email", "slack", "chat", "call", "message"]
|
|
183
|
+
};
|
|
184
|
+
for (const [category, keywords] of Object.entries(categoryKeywords)) {
|
|
185
|
+
if (keywords.some((k) => itemLower.includes(k))) {
|
|
186
|
+
return category;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return "general";
|
|
190
|
+
}
|
|
191
|
+
function extractSearchTerms(input) {
|
|
192
|
+
const noise = /\b(hey|hi|hello|um|uh|like|just|so|well|you know|i mean|basically|actually|really|very|pretty|quite|how does it feel|how do you|can you|could you|would you|do you|what do you think|tell me about)\b/gi;
|
|
193
|
+
let cleaned = input.replace(noise, " ").replace(/\s+/g, " ").trim();
|
|
194
|
+
if (cleaned.length < 5) cleaned = input.trim();
|
|
195
|
+
return cleaned;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export {
|
|
199
|
+
isObservable,
|
|
200
|
+
extractObservations,
|
|
201
|
+
processMessageForObservations,
|
|
202
|
+
detectCategory,
|
|
203
|
+
extractPreferences,
|
|
204
|
+
extractSearchTerms
|
|
205
|
+
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveVaultPath
|
|
3
|
+
} from "./chunk-MXSSG3QU.js";
|
|
1
4
|
import {
|
|
2
5
|
QmdUnavailableError,
|
|
3
6
|
hasQmd,
|
|
4
7
|
qmdEmbed
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import {
|
|
7
|
-
resolveVaultPath
|
|
8
|
-
} from "./chunk-MXSSG3QU.js";
|
|
8
|
+
} from "./chunk-K234IDRJ.js";
|
|
9
9
|
|
|
10
10
|
// src/lib/vault-qmd-config.ts
|
|
11
11
|
import * as fs from "fs";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveVaultPath
|
|
3
|
+
} from "./chunk-MXSSG3QU.js";
|
|
1
4
|
import {
|
|
2
5
|
DATE_HEADING_RE,
|
|
3
6
|
parseObservationLine,
|
|
4
7
|
renderScoredObservationLine
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import {
|
|
7
|
-
resolveVaultPath
|
|
8
|
-
} from "./chunk-MXSSG3QU.js";
|
|
8
|
+
} from "./chunk-QK3UCXWL.js";
|
|
9
9
|
import {
|
|
10
10
|
listObservationFiles
|
|
11
11
|
} from "./chunk-Z2XBWN7A.js";
|