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.
Files changed (232) hide show
  1. package/bin/command-registration.test.js +1 -3
  2. package/bin/register-core-commands.js +30 -23
  3. package/bin/register-maintenance-commands.js +3 -20
  4. package/bin/register-query-commands.js +23 -0
  5. package/bin/register-task-commands.js +1 -18
  6. package/bin/register-task-commands.test.js +0 -16
  7. package/bin/register-vault-operations-commands.js +1 -29
  8. package/dist/chunk-2TM7DLOL.js +895 -0
  9. package/dist/{chunk-QVMXF7FY.js → chunk-3D6BCTP6.js} +39 -1
  10. package/dist/{chunk-R2MIW5G7.js → chunk-3DHXQHYG.js} +1 -1
  11. package/dist/{chunk-Q2J5YTUF.js → chunk-3NSBOUT3.js} +73 -36
  12. package/dist/chunk-3RG5ZIWI.js +10 -0
  13. package/dist/{chunk-AZYOKJYC.js → chunk-62YTUT6J.js} +2 -2
  14. package/dist/chunk-6U6MK36V.js +205 -0
  15. package/dist/{chunk-4QYGFWRM.js → chunk-7R7O6STJ.js} +4 -4
  16. package/dist/{chunk-VXEOHTSL.js → chunk-C7OK5WKP.js} +4 -4
  17. package/dist/chunk-CMB7UL7C.js +327 -0
  18. package/dist/{chunk-HIHOUSXS.js → chunk-E7MFQB6D.js} +59 -18
  19. package/dist/{chunk-ME37YNW3.js → chunk-F2JEUD4J.js} +6 -4
  20. package/dist/chunk-GAJV4IGR.js +82 -0
  21. package/dist/chunk-GQSLDZTS.js +560 -0
  22. package/dist/{chunk-4OXMU5S2.js → chunk-GUKMRGM7.js} +1 -1
  23. package/dist/{chunk-T76H47ZS.js → chunk-H34S76MB.js} +6 -6
  24. package/dist/{chunk-R6SXNSFD.js → chunk-JY6FYXIT.js} +10 -5
  25. package/dist/chunk-K234IDRJ.js +1073 -0
  26. package/dist/{chunk-IEVLHNLU.js → chunk-LNJA2UGL.js} +86 -9
  27. package/dist/{chunk-MFAWT5O5.js → chunk-LYHGEHXG.js} +1 -0
  28. package/dist/chunk-MFM6K7PU.js +374 -0
  29. package/dist/{chunk-QWQ3TIKS.js → chunk-N2AXRYLC.js} +1 -1
  30. package/dist/chunk-PAH27GSN.js +108 -0
  31. package/dist/{chunk-OIWVQYQF.js → chunk-QBLMXKF2.js} +1 -1
  32. package/dist/{chunk-FHFUXL6G.js → chunk-QK3UCXWL.js} +2 -2
  33. package/dist/{chunk-3BTHWPMB.js → chunk-SJSFRIYS.js} +1 -1
  34. package/dist/{chunk-4VRIMU4O.js → chunk-U55BGUAU.js} +2 -2
  35. package/dist/{chunk-PBEE567J.js → chunk-VGLOTGAS.js} +1 -1
  36. package/dist/{chunk-F55HGNU4.js → chunk-WAZ3NLWL.js} +47 -0
  37. package/dist/{chunk-KL4NAOMO.js → chunk-WGRQ6HDV.js} +1 -1
  38. package/dist/{chunk-UEOUADMO.js → chunk-YKTA5JOJ.js} +13 -10
  39. package/dist/{chunk-XAVB4GB4.js → chunk-ZVVFWOLW.js} +4 -4
  40. package/dist/cli/index.cjs +10033 -0
  41. package/dist/cli/index.d.cts +5 -0
  42. package/dist/cli/index.js +20 -18
  43. package/dist/commands/archive.cjs +287 -0
  44. package/dist/commands/archive.d.cts +11 -0
  45. package/dist/commands/archive.js +1 -0
  46. package/dist/commands/backlog.cjs +721 -0
  47. package/dist/commands/backlog.d.cts +53 -0
  48. package/dist/commands/backlog.js +3 -2
  49. package/dist/commands/blocked.cjs +204 -0
  50. package/dist/commands/blocked.d.cts +26 -0
  51. package/dist/commands/blocked.js +3 -2
  52. package/dist/commands/checkpoint.cjs +244 -0
  53. package/dist/commands/checkpoint.d.cts +41 -0
  54. package/dist/commands/checkpoint.js +2 -1
  55. package/dist/commands/compat.cjs +369 -0
  56. package/dist/commands/compat.d.cts +28 -0
  57. package/dist/commands/compat.js +2 -1
  58. package/dist/commands/context.cjs +2989 -0
  59. package/dist/commands/context.d.cts +2 -0
  60. package/dist/commands/context.js +5 -4
  61. package/dist/commands/doctor.cjs +3062 -0
  62. package/dist/commands/doctor.d.cts +21 -0
  63. package/dist/commands/doctor.d.ts +6 -1
  64. package/dist/commands/doctor.js +13 -11
  65. package/dist/commands/embed.cjs +232 -0
  66. package/dist/commands/embed.d.cts +17 -0
  67. package/dist/commands/embed.js +5 -2
  68. package/dist/commands/entities.cjs +141 -0
  69. package/dist/commands/entities.d.cts +7 -0
  70. package/dist/commands/entities.js +1 -0
  71. package/dist/commands/graph.cjs +501 -0
  72. package/dist/commands/graph.d.cts +21 -0
  73. package/dist/commands/graph.js +1 -0
  74. package/dist/commands/inject.cjs +1636 -0
  75. package/dist/commands/inject.d.cts +2 -0
  76. package/dist/commands/inject.d.ts +1 -1
  77. package/dist/commands/inject.js +4 -2
  78. package/dist/commands/kanban.cjs +884 -0
  79. package/dist/commands/kanban.d.cts +63 -0
  80. package/dist/commands/kanban.js +4 -3
  81. package/dist/commands/link.cjs +965 -0
  82. package/dist/commands/link.d.cts +11 -0
  83. package/dist/commands/link.js +1 -0
  84. package/dist/commands/migrate-observations.cjs +362 -0
  85. package/dist/commands/migrate-observations.d.cts +19 -0
  86. package/dist/commands/migrate-observations.js +3 -2
  87. package/dist/commands/observe.cjs +4099 -0
  88. package/dist/commands/observe.d.cts +23 -0
  89. package/dist/commands/observe.d.ts +1 -0
  90. package/dist/commands/observe.js +11 -9
  91. package/dist/commands/project.cjs +1341 -0
  92. package/dist/commands/project.d.cts +85 -0
  93. package/dist/commands/project.js +5 -4
  94. package/dist/commands/rebuild.cjs +3136 -0
  95. package/dist/commands/rebuild.d.cts +11 -0
  96. package/dist/commands/rebuild.js +10 -8
  97. package/dist/commands/recover.cjs +361 -0
  98. package/dist/commands/recover.d.cts +38 -0
  99. package/dist/commands/recover.js +3 -2
  100. package/dist/commands/reflect.cjs +1008 -0
  101. package/dist/commands/reflect.d.cts +11 -0
  102. package/dist/commands/reflect.js +6 -4
  103. package/dist/commands/repair-session.cjs +457 -0
  104. package/dist/commands/repair-session.d.cts +38 -0
  105. package/dist/commands/repair-session.js +1 -0
  106. package/dist/commands/replay.cjs +4103 -0
  107. package/dist/commands/replay.d.cts +16 -0
  108. package/dist/commands/replay.js +12 -10
  109. package/dist/commands/session-recap.cjs +353 -0
  110. package/dist/commands/session-recap.d.cts +27 -0
  111. package/dist/commands/session-recap.js +1 -0
  112. package/dist/commands/setup.cjs +1302 -0
  113. package/dist/commands/setup.d.cts +100 -0
  114. package/dist/commands/setup.d.ts +90 -2
  115. package/dist/commands/setup.js +21 -2
  116. package/dist/commands/shell-init.cjs +75 -0
  117. package/dist/commands/shell-init.d.cts +7 -0
  118. package/dist/commands/shell-init.js +2 -0
  119. package/dist/commands/sleep.cjs +6028 -0
  120. package/dist/commands/sleep.d.cts +36 -0
  121. package/dist/commands/sleep.d.ts +1 -1
  122. package/dist/commands/sleep.js +17 -15
  123. package/dist/commands/status.cjs +2736 -0
  124. package/dist/commands/status.d.cts +52 -0
  125. package/dist/commands/status.js +12 -10
  126. package/dist/commands/tailscale.cjs +1532 -0
  127. package/dist/commands/tailscale.d.cts +52 -0
  128. package/dist/commands/tailscale.js +1 -0
  129. package/dist/commands/task.cjs +1236 -0
  130. package/dist/commands/task.d.cts +97 -0
  131. package/dist/commands/task.js +4 -3
  132. package/dist/commands/template.cjs +457 -0
  133. package/dist/commands/template.d.cts +36 -0
  134. package/dist/commands/template.js +2 -1
  135. package/dist/commands/wake.cjs +2626 -0
  136. package/dist/commands/wake.d.cts +22 -0
  137. package/dist/commands/wake.d.ts +1 -1
  138. package/dist/commands/wake.js +10 -9
  139. package/dist/context-BUGaWpyL.d.cts +46 -0
  140. package/dist/index.cjs +14001 -0
  141. package/dist/index.d.cts +858 -0
  142. package/dist/index.d.ts +192 -7
  143. package/dist/index.js +101 -75
  144. package/dist/{inject-x65KXWPk.d.ts → inject-Bzi5E-By.d.cts} +1 -1
  145. package/dist/inject-Bzi5E-By.d.ts +137 -0
  146. package/dist/lib/auto-linker.cjs +176 -0
  147. package/dist/lib/auto-linker.d.cts +26 -0
  148. package/dist/lib/auto-linker.js +1 -0
  149. package/dist/lib/canvas-layout.cjs +136 -0
  150. package/dist/lib/canvas-layout.d.cts +31 -0
  151. package/dist/lib/canvas-layout.d.ts +16 -100
  152. package/dist/lib/canvas-layout.js +78 -20
  153. package/dist/lib/config.cjs +78 -0
  154. package/dist/lib/config.d.cts +11 -0
  155. package/dist/lib/config.js +1 -0
  156. package/dist/lib/entity-index.cjs +84 -0
  157. package/dist/lib/entity-index.d.cts +26 -0
  158. package/dist/lib/entity-index.js +1 -0
  159. package/dist/lib/project-utils.cjs +864 -0
  160. package/dist/lib/project-utils.d.cts +97 -0
  161. package/dist/lib/project-utils.js +4 -3
  162. package/dist/lib/session-repair.cjs +239 -0
  163. package/dist/lib/session-repair.d.cts +110 -0
  164. package/dist/lib/session-repair.js +1 -0
  165. package/dist/lib/session-utils.cjs +209 -0
  166. package/dist/lib/session-utils.d.cts +63 -0
  167. package/dist/lib/session-utils.js +1 -0
  168. package/dist/lib/tailscale.cjs +1183 -0
  169. package/dist/lib/tailscale.d.cts +225 -0
  170. package/dist/lib/tailscale.js +1 -0
  171. package/dist/lib/task-utils.cjs +1137 -0
  172. package/dist/lib/task-utils.d.cts +208 -0
  173. package/dist/lib/task-utils.js +3 -2
  174. package/dist/lib/template-engine.cjs +47 -0
  175. package/dist/lib/template-engine.d.cts +11 -0
  176. package/dist/lib/template-engine.js +1 -0
  177. package/dist/lib/webdav.cjs +568 -0
  178. package/dist/lib/webdav.d.cts +109 -0
  179. package/dist/lib/webdav.js +1 -0
  180. package/dist/plugin/index.cjs +1907 -0
  181. package/dist/plugin/index.d.cts +36 -0
  182. package/dist/plugin/index.d.ts +36 -0
  183. package/dist/plugin/index.js +572 -0
  184. package/dist/plugin/inject.cjs +356 -0
  185. package/dist/plugin/inject.d.cts +54 -0
  186. package/dist/plugin/inject.d.ts +54 -0
  187. package/dist/plugin/inject.js +17 -0
  188. package/dist/plugin/observe.cjs +631 -0
  189. package/dist/plugin/observe.d.cts +39 -0
  190. package/dist/plugin/observe.d.ts +39 -0
  191. package/dist/plugin/observe.js +18 -0
  192. package/dist/plugin/templates.cjs +593 -0
  193. package/dist/plugin/templates.d.cts +52 -0
  194. package/dist/plugin/templates.d.ts +52 -0
  195. package/dist/plugin/templates.js +25 -0
  196. package/dist/plugin/types.cjs +18 -0
  197. package/dist/plugin/types.d.cts +209 -0
  198. package/dist/plugin/types.d.ts +209 -0
  199. package/dist/plugin/types.js +0 -0
  200. package/dist/plugin/vault.cjs +927 -0
  201. package/dist/plugin/vault.d.cts +68 -0
  202. package/dist/plugin/vault.d.ts +68 -0
  203. package/dist/plugin/vault.js +22 -0
  204. package/dist/{types-C74wgGL1.d.ts → types-Y2_Um2Ls.d.cts} +44 -1
  205. package/dist/types-Y2_Um2Ls.d.ts +205 -0
  206. package/hooks/clawvault/handler.js +70 -7
  207. package/hooks/clawvault/handler.test.js +91 -0
  208. package/openclaw.plugin.json +56 -0
  209. package/package.json +16 -6
  210. package/templates/memory-event.md +67 -0
  211. package/templates/party.md +63 -0
  212. package/templates/primitive-registry.yaml +551 -0
  213. package/templates/run.md +68 -0
  214. package/templates/trigger.md +68 -0
  215. package/templates/workspace.md +50 -0
  216. package/dashboard/lib/graph-diff.js +0 -104
  217. package/dashboard/lib/graph-diff.test.js +0 -75
  218. package/dashboard/lib/vault-parser.js +0 -556
  219. package/dashboard/lib/vault-parser.test.js +0 -254
  220. package/dashboard/public/app.js +0 -796
  221. package/dashboard/public/index.html +0 -52
  222. package/dashboard/public/styles.css +0 -221
  223. package/dashboard/server.js +0 -374
  224. package/dist/chunk-MAKNAHAW.js +0 -375
  225. package/dist/chunk-MDIH26GC.js +0 -183
  226. package/dist/chunk-MGDEINGP.js +0 -99
  227. package/dist/chunk-RVYA52PY.js +0 -363
  228. package/dist/chunk-TLGBDTYT.js +0 -33
  229. package/dist/commands/canvas.d.ts +0 -15
  230. package/dist/commands/canvas.js +0 -199
  231. package/dist/commands/sync-bd.d.ts +0 -10
  232. 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
- const packageRaw = readOptionalFile(resolveProjectFile("package.json", options.baseDir));
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",
@@ -8,7 +8,7 @@ import {
8
8
  queryTransitions,
9
9
  readTask,
10
10
  updateTask
11
- } from "./chunk-QWQ3TIKS.js";
11
+ } from "./chunk-N2AXRYLC.js";
12
12
 
13
13
  // src/commands/task.ts
14
14
  function taskAdd(vaultPath, title, options = {}) {
@@ -1,6 +1,21 @@
1
1
  import {
2
2
  listProjects
3
- } from "./chunk-AZYOKJYC.js";
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-FHFUXL6G.js";
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-3-5-haiku-latest",
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
- provider: "anthropic",
146
- model: allowConfiguredModel ? this.resolveModel("anthropic") : DEFAULT_PROVIDER_MODELS.anthropic,
147
- apiKey: anthropicApiKey
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
- "content-type": "application/json",
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-QWQ3TIKS.js";
4
+ } from "./chunk-N2AXRYLC.js";
5
5
  import {
6
6
  loadSchemaTemplateDefinition,
7
7
  renderDocumentFromTemplate
8
- } from "./chunk-MFAWT5O5.js";
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-MAKNAHAW.js";
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-FHFUXL6G.js";
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";