claude-memory-layer 1.0.23 → 1.0.24

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 (51) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/README.md +2 -0
  3. package/dist/cli/index.js +85 -17
  4. package/dist/cli/index.js.map +2 -2
  5. package/dist/core/index.js +28 -5
  6. package/dist/core/index.js.map +2 -2
  7. package/dist/hooks/post-tool-use.js +115 -18
  8. package/dist/hooks/post-tool-use.js.map +2 -2
  9. package/dist/hooks/semantic-daemon.js +7337 -0
  10. package/dist/hooks/semantic-daemon.js.map +7 -0
  11. package/dist/hooks/session-end.js +69 -16
  12. package/dist/hooks/session-end.js.map +2 -2
  13. package/dist/hooks/session-start.js +154 -24
  14. package/dist/hooks/session-start.js.map +4 -4
  15. package/dist/hooks/stop.js +99 -18
  16. package/dist/hooks/stop.js.map +2 -2
  17. package/dist/hooks/user-prompt-submit.js +289 -102
  18. package/dist/hooks/user-prompt-submit.js.map +4 -4
  19. package/dist/server/api/index.js +69 -16
  20. package/dist/server/api/index.js.map +2 -2
  21. package/dist/server/index.js +69 -16
  22. package/dist/server/index.js.map +2 -2
  23. package/dist/services/memory-service.js +69 -16
  24. package/dist/services/memory-service.js.map +2 -2
  25. package/dist/ui/app.js +48 -1
  26. package/dist/ui/index.html +11 -3
  27. package/memory/_index.md +1 -0
  28. package/memory/agent_response/uncategorized/2026-03-04.md +1098 -1
  29. package/memory/session_summary/uncategorized/2026-03-04.md +31 -0
  30. package/memory/tool_observation/uncategorized/2026-03-04.md +733 -1
  31. package/memory/user_prompt/uncategorized/2026-03-04.md +371 -1
  32. package/package.json +1 -1
  33. package/scripts/build.ts +2 -1
  34. package/specs/selective-tool-observation/context.md +100 -0
  35. package/specs/selective-tool-observation/plan.md +158 -0
  36. package/specs/selective-tool-observation/spec.md +127 -0
  37. package/src/cli/index.ts +1 -0
  38. package/src/core/embedder.ts +13 -4
  39. package/src/core/sqlite-event-store.ts +16 -0
  40. package/src/core/turn-state.ts +48 -0
  41. package/src/core/types.ts +1 -0
  42. package/src/hooks/post-tool-use.ts +47 -2
  43. package/src/hooks/semantic-daemon-client.ts +208 -0
  44. package/src/hooks/semantic-daemon.ts +276 -0
  45. package/src/hooks/session-start.ts +7 -0
  46. package/src/hooks/stop.ts +19 -4
  47. package/src/hooks/user-prompt-submit.ts +48 -40
  48. package/src/services/memory-service.ts +59 -16
  49. package/src/services/session-history-importer.ts +18 -0
  50. package/src/ui/app.js +48 -1
  51. package/src/ui/index.html +11 -3
@@ -124,6 +124,7 @@ var ConfigSchema = z.object({
124
124
  toolObservation: z.object({
125
125
  enabled: z.boolean().default(true),
126
126
  excludedTools: z.array(z.string()).default(["TodoWrite", "TodoRead"]),
127
+ minOutputLength: z.number().default(100),
127
128
  maxOutputLength: z.number().default(1e4),
128
129
  maxOutputLines: z.number().default(100),
129
130
  storeOnlyOnSuccess: z.boolean().default(false)
@@ -2418,6 +2419,21 @@ var SQLiteEventStore = class {
2418
2419
  [id, eventId, sessionId, score, query.slice(0, 100)]
2419
2420
  );
2420
2421
  }
2422
+ /**
2423
+ * Get session IDs that have unevaluated retrievals (measured_at IS NULL).
2424
+ * Excludes the current session. Used to backfill sessions that ended without Stop hook.
2425
+ */
2426
+ async getUnevaluatedSessions(currentSessionId, limit = 5) {
2427
+ await this.initialize();
2428
+ const rows = sqliteAll(
2429
+ this.db,
2430
+ `SELECT DISTINCT session_id FROM memory_helpfulness
2431
+ WHERE measured_at IS NULL AND session_id != ?
2432
+ ORDER BY created_at DESC LIMIT ?`,
2433
+ [currentSessionId, limit]
2434
+ );
2435
+ return rows.map((r) => r.session_id);
2436
+ }
2421
2437
  /**
2422
2438
  * Evaluate helpfulness for all retrievals in a session
2423
2439
  * Called at session end - uses behavioral signals to compute score
@@ -3997,7 +4013,7 @@ var VectorStore = class {
3997
4013
 
3998
4014
  // src/core/embedder.ts
3999
4015
  import { pipeline } from "@huggingface/transformers";
4000
- var Embedder = class {
4016
+ var Embedder = class _Embedder {
4001
4017
  pipeline = null;
4002
4018
  modelName;
4003
4019
  activeModelName;
@@ -4028,6 +4044,11 @@ var Embedder = class {
4028
4044
  this.initialized = true;
4029
4045
  }
4030
4046
  }
4047
+ // ~4 chars per token; 512 tokens * 4 = 2048, use 2000 to be safe
4048
+ static MAX_CHARS = 2e3;
4049
+ truncate(text) {
4050
+ return text.length > _Embedder.MAX_CHARS ? text.slice(0, _Embedder.MAX_CHARS) : text;
4051
+ }
4031
4052
  /**
4032
4053
  * Generate embedding for a single text
4033
4054
  */
@@ -4036,10 +4057,11 @@ var Embedder = class {
4036
4057
  if (!this.pipeline) {
4037
4058
  throw new Error("Embedding pipeline not initialized");
4038
4059
  }
4039
- const output = await this.pipeline(text, {
4060
+ const output = await this.pipeline(this.truncate(text), {
4040
4061
  pooling: "mean",
4041
4062
  normalize: true,
4042
- truncation: true
4063
+ truncation: true,
4064
+ max_length: 512
4043
4065
  });
4044
4066
  const vector = Array.from(output.data);
4045
4067
  return {
@@ -4061,10 +4083,11 @@ var Embedder = class {
4061
4083
  for (let i = 0; i < texts.length; i += batchSize) {
4062
4084
  const batch = texts.slice(i, i + batchSize);
4063
4085
  for (const text of batch) {
4064
- const output = await this.pipeline(text, {
4086
+ const output = await this.pipeline(this.truncate(text), {
4065
4087
  pooling: "mean",
4066
4088
  normalize: true,
4067
- truncation: true
4089
+ truncation: true,
4090
+ max_length: 512
4068
4091
  });
4069
4092
  const vector = Array.from(output.data);
4070
4093
  results.push({