@goondocks/myco 0.6.4 → 0.6.5

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 (88) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/dist/{chunk-YIQLYIHW.js → chunk-4B5RO2YV.js} +4 -4
  4. package/dist/{chunk-7WHF2OIZ.js → chunk-4DYD4HHG.js} +25 -7
  5. package/dist/chunk-4DYD4HHG.js.map +1 -0
  6. package/dist/{chunk-NLUE6CYG.js → chunk-54WVLTKD.js} +3 -3
  7. package/dist/{chunk-NL6WQO56.js → chunk-5LMRZDH3.js} +2 -2
  8. package/dist/{chunk-O6PERU7U.js → chunk-AHZN4Z34.js} +2 -2
  9. package/dist/{chunk-J4D4CROB.js → chunk-DYDBF5W6.js} +5 -1
  10. package/dist/chunk-DYDBF5W6.js.map +1 -0
  11. package/dist/{chunk-Z74SDEKE.js → chunk-F7GAYVWF.js} +2 -2
  12. package/dist/{chunk-H7PRCVGQ.js → chunk-F7PGDD2X.js} +2 -2
  13. package/dist/{chunk-2ZIBCEYO.js → chunk-LEK6DEAE.js} +3 -3
  14. package/dist/{chunk-QLUE3BUL.js → chunk-O6TBHGVO.js} +9 -2
  15. package/dist/chunk-O6TBHGVO.js.map +1 -0
  16. package/dist/{chunk-FPRXMJLT.js → chunk-OEGZ5YTJ.js} +2 -2
  17. package/dist/{chunk-4XVKZ3WA.js → chunk-TK7A4RX7.js} +10 -3
  18. package/dist/chunk-TK7A4RX7.js.map +1 -0
  19. package/dist/{chunk-UP4P4OAA.js → chunk-V6BJVYNH.js} +2 -2
  20. package/dist/{chunk-QN4W3JUA.js → chunk-XH34FX4C.js} +2 -2
  21. package/dist/{chunk-YTFXA4RX.js → chunk-YRIIBPJD.js} +3 -3
  22. package/dist/{cli-IHILSS6N.js → cli-OJYHLO4Y.js} +20 -20
  23. package/dist/{client-AGFNR2S4.js → client-SS3C5MF6.js} +5 -5
  24. package/dist/{curate-3D4GHKJH.js → curate-4CKEMOPV.js} +6 -6
  25. package/dist/{detect-providers-XEP4QA3R.js → detect-providers-LFIVJYQO.js} +3 -3
  26. package/dist/{digest-7HLJXL77.js → digest-ZLARHLLY.js} +8 -8
  27. package/dist/{init-ARQ53JOR.js → init-3LVKVQ4L.js} +5 -5
  28. package/dist/{logs-IENORIYR.js → logs-6CWVP574.js} +3 -3
  29. package/dist/{main-6AGPIMH2.js → main-RB727YRP.js} +149 -28
  30. package/dist/main-RB727YRP.js.map +1 -0
  31. package/dist/{rebuild-Q2ACEB6F.js → rebuild-QWVVCBCZ.js} +6 -6
  32. package/dist/{reprocess-CDEFGQOV.js → reprocess-YG3WLUI2.js} +8 -8
  33. package/dist/{restart-XCMILOL5.js → restart-UIP7US4U.js} +6 -6
  34. package/dist/{search-7W25SKCB.js → search-BQLBW5CS.js} +4 -4
  35. package/dist/{server-6UDN35QN.js → server-43KSJ65Q.js} +77 -29
  36. package/dist/{server-6UDN35QN.js.map → server-43KSJ65Q.js.map} +1 -1
  37. package/dist/{session-start-K6IGAC7H.js → session-start-6SHGT2AW.js} +6 -6
  38. package/dist/{setup-digest-X5PN27F4.js → setup-digest-X735EZSD.js} +5 -5
  39. package/dist/{setup-llm-S5OHQJXK.js → setup-llm-QBSTQO7N.js} +5 -5
  40. package/dist/src/cli.js +4 -4
  41. package/dist/src/daemon/main.js +4 -4
  42. package/dist/src/hooks/post-tool-use.js +5 -5
  43. package/dist/src/hooks/session-end.js +5 -5
  44. package/dist/src/hooks/session-start.js +4 -4
  45. package/dist/src/hooks/stop.js +5 -5
  46. package/dist/src/hooks/user-prompt-submit.js +5 -5
  47. package/dist/src/mcp/server.js +4 -4
  48. package/dist/{stats-TTSDXGJV.js → stats-QBLIEFWL.js} +6 -6
  49. package/dist/ui/assets/index-CjWGVHhF.css +1 -0
  50. package/dist/ui/assets/{index-CMSMi4Jb.js → index-Cq-H7wgE.js} +20 -20
  51. package/dist/ui/index.html +2 -2
  52. package/dist/{verify-TOWQHPBX.js → verify-X272WGBD.js} +4 -4
  53. package/dist/{version-36RVCQA6.js → version-XE4GYTBV.js} +4 -4
  54. package/package.json +1 -1
  55. package/dist/chunk-4XVKZ3WA.js.map +0 -1
  56. package/dist/chunk-7WHF2OIZ.js.map +0 -1
  57. package/dist/chunk-J4D4CROB.js.map +0 -1
  58. package/dist/chunk-QLUE3BUL.js.map +0 -1
  59. package/dist/main-6AGPIMH2.js.map +0 -1
  60. package/dist/ui/assets/index-08wKT7wS.css +0 -1
  61. /package/dist/{chunk-YIQLYIHW.js.map → chunk-4B5RO2YV.js.map} +0 -0
  62. /package/dist/{chunk-NLUE6CYG.js.map → chunk-54WVLTKD.js.map} +0 -0
  63. /package/dist/{chunk-NL6WQO56.js.map → chunk-5LMRZDH3.js.map} +0 -0
  64. /package/dist/{chunk-O6PERU7U.js.map → chunk-AHZN4Z34.js.map} +0 -0
  65. /package/dist/{chunk-Z74SDEKE.js.map → chunk-F7GAYVWF.js.map} +0 -0
  66. /package/dist/{chunk-H7PRCVGQ.js.map → chunk-F7PGDD2X.js.map} +0 -0
  67. /package/dist/{chunk-2ZIBCEYO.js.map → chunk-LEK6DEAE.js.map} +0 -0
  68. /package/dist/{chunk-FPRXMJLT.js.map → chunk-OEGZ5YTJ.js.map} +0 -0
  69. /package/dist/{chunk-UP4P4OAA.js.map → chunk-V6BJVYNH.js.map} +0 -0
  70. /package/dist/{chunk-QN4W3JUA.js.map → chunk-XH34FX4C.js.map} +0 -0
  71. /package/dist/{chunk-YTFXA4RX.js.map → chunk-YRIIBPJD.js.map} +0 -0
  72. /package/dist/{cli-IHILSS6N.js.map → cli-OJYHLO4Y.js.map} +0 -0
  73. /package/dist/{client-AGFNR2S4.js.map → client-SS3C5MF6.js.map} +0 -0
  74. /package/dist/{curate-3D4GHKJH.js.map → curate-4CKEMOPV.js.map} +0 -0
  75. /package/dist/{detect-providers-XEP4QA3R.js.map → detect-providers-LFIVJYQO.js.map} +0 -0
  76. /package/dist/{digest-7HLJXL77.js.map → digest-ZLARHLLY.js.map} +0 -0
  77. /package/dist/{init-ARQ53JOR.js.map → init-3LVKVQ4L.js.map} +0 -0
  78. /package/dist/{logs-IENORIYR.js.map → logs-6CWVP574.js.map} +0 -0
  79. /package/dist/{rebuild-Q2ACEB6F.js.map → rebuild-QWVVCBCZ.js.map} +0 -0
  80. /package/dist/{reprocess-CDEFGQOV.js.map → reprocess-YG3WLUI2.js.map} +0 -0
  81. /package/dist/{restart-XCMILOL5.js.map → restart-UIP7US4U.js.map} +0 -0
  82. /package/dist/{search-7W25SKCB.js.map → search-BQLBW5CS.js.map} +0 -0
  83. /package/dist/{session-start-K6IGAC7H.js.map → session-start-6SHGT2AW.js.map} +0 -0
  84. /package/dist/{setup-digest-X5PN27F4.js.map → setup-digest-X735EZSD.js.map} +0 -0
  85. /package/dist/{setup-llm-S5OHQJXK.js.map → setup-llm-QBSTQO7N.js.map} +0 -0
  86. /package/dist/{stats-TTSDXGJV.js.map → stats-QBLIEFWL.js.map} +0 -0
  87. /package/dist/{verify-TOWQHPBX.js.map → verify-X272WGBD.js.map} +0 -0
  88. /package/dist/{version-36RVCQA6.js.map → version-XE4GYTBV.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  gatherStats
4
- } from "./chunk-NL6WQO56.js";
4
+ } from "./chunk-5LMRZDH3.js";
5
5
  import {
6
6
  BufferProcessor,
7
7
  DigestEngine,
@@ -16,14 +16,14 @@ import {
16
16
  runReprocess,
17
17
  updateTitleAndSummary,
18
18
  writeObservationNotes
19
- } from "./chunk-4XVKZ3WA.js";
19
+ } from "./chunk-TK7A4RX7.js";
20
20
  import {
21
21
  consolidateSpores,
22
22
  handleMycoContext
23
- } from "./chunk-2ZIBCEYO.js";
23
+ } from "./chunk-LEK6DEAE.js";
24
24
  import {
25
25
  DaemonLogger
26
- } from "./chunk-QLUE3BUL.js";
26
+ } from "./chunk-O6TBHGVO.js";
27
27
  import {
28
28
  VectorIndex
29
29
  } from "./chunk-4RMSHZE4.js";
@@ -45,14 +45,14 @@ import {
45
45
  sessionWikilink,
46
46
  stripReasoningTokens,
47
47
  walkMarkdownFiles
48
- } from "./chunk-UP4P4OAA.js";
48
+ } from "./chunk-V6BJVYNH.js";
49
49
  import {
50
50
  generateEmbedding
51
51
  } from "./chunk-RGVBGTD6.js";
52
52
  import {
53
53
  createEmbeddingProvider,
54
54
  createLlmProvider
55
- } from "./chunk-NLUE6CYG.js";
55
+ } from "./chunk-54WVLTKD.js";
56
56
  import {
57
57
  stripFrontmatter
58
58
  } from "./chunk-GENQ5QGP.js";
@@ -62,12 +62,12 @@ import {
62
62
  import {
63
63
  MycoIndex
64
64
  } from "./chunk-TWSTAVLO.js";
65
- import "./chunk-YTFXA4RX.js";
65
+ import "./chunk-YRIIBPJD.js";
66
66
  import "./chunk-SAKJMNSR.js";
67
67
  import {
68
68
  LmStudioBackend,
69
69
  OllamaBackend
70
- } from "./chunk-7WHF2OIZ.js";
70
+ } from "./chunk-4DYD4HHG.js";
71
71
  import {
72
72
  CONFIG_FILENAME,
73
73
  loadConfig,
@@ -83,13 +83,13 @@ import {
83
83
  } from "./chunk-HIN3UVOG.js";
84
84
  import {
85
85
  getPluginVersion
86
- } from "./chunk-QN4W3JUA.js";
86
+ } from "./chunk-XH34FX4C.js";
87
87
  import {
88
88
  AgentRegistry,
89
89
  claudeCodeAdapter,
90
90
  createPerProjectAdapter,
91
91
  extensionForMimeType
92
- } from "./chunk-Z74SDEKE.js";
92
+ } from "./chunk-F7GAYVWF.js";
93
93
  import {
94
94
  CONSOLIDATION_MAX_TOKENS,
95
95
  CONSOLIDATION_MIN_CLUSTER_SIZE,
@@ -103,6 +103,8 @@ import {
103
103
  ITEM_STAGE_MAP,
104
104
  LINEAGE_RECENT_SESSIONS_LIMIT,
105
105
  LLM_REASONING_MODE,
106
+ LOG_MESSAGE_PREVIEW_CHARS,
107
+ LOG_PROMPT_PREVIEW_CHARS,
106
108
  MAX_SLUG_LENGTH,
107
109
  MS_PER_DAY,
108
110
  PIPELINE_BACKOFF_MULTIPLIER,
@@ -120,7 +122,7 @@ import {
120
122
  STAGE_PROVIDER_MAP,
121
123
  STALE_BUFFER_MAX_AGE_MS,
122
124
  estimateTokens
123
- } from "./chunk-J4D4CROB.js";
125
+ } from "./chunk-DYDBF5W6.js";
124
126
  import {
125
127
  __toESM
126
128
  } from "./chunk-PZUWP5VK.js";
@@ -2555,6 +2557,10 @@ var ConsolidationEngine = class {
2555
2557
  continue;
2556
2558
  }
2557
2559
  clustersFound++;
2560
+ this.log("debug", "Consolidation groups formed", {
2561
+ group_count: clustersFound,
2562
+ total_notes: cluster.length
2563
+ });
2558
2564
  const candidatesText = formatNotesForPrompt(cluster);
2559
2565
  const prompt = template.replace("{{count}}", String(cluster.length)).replace("{{observation_type}}", observationType ?? "unknown").replace("{{candidates}}", candidatesText).replace("{{maxTokens}}", String(this.maxTokens));
2560
2566
  let responseText;
@@ -2629,10 +2635,11 @@ var ConsolidationEngine = class {
2629
2635
  );
2630
2636
  consolidated++;
2631
2637
  sporesSuperseded += consolidateResult.sources_archived;
2632
- this.log("info", "ConsolidationEngine: consolidated cluster", {
2638
+ this.log("info", "Notes consolidated", {
2633
2639
  wisdomId: consolidateResult.wisdom_id,
2634
2640
  sourcesArchived: consolidateResult.sources_archived,
2635
- clusterSize: cluster.length
2641
+ clusterSize: cluster.length,
2642
+ similarity: vectorResults[0]?.similarity ?? 0
2636
2643
  });
2637
2644
  } catch (err) {
2638
2645
  this.log("warn", "ConsolidationEngine: consolidateSpores failed", {
@@ -2642,6 +2649,9 @@ var ConsolidationEngine = class {
2642
2649
  }
2643
2650
  cluster.forEach((n) => processedIds.add(n.id));
2644
2651
  }
2652
+ if (clustersFound === 0) {
2653
+ this.log("debug", "Consolidation: no groups above threshold");
2654
+ }
2645
2655
  const passTimestamp = (/* @__PURE__ */ new Date()).toISOString();
2646
2656
  const durationMs = Date.now() - startTime;
2647
2657
  const passResult = {
@@ -2899,10 +2909,11 @@ async function handleGetLogs(ringBuffer, query) {
2899
2909
  const since = query.since || null;
2900
2910
  const level = query.level;
2901
2911
  const limit = query.limit ? parseInt(query.limit, 10) : void 0;
2902
- const result = ringBuffer.since(since, { level, limit: isNaN(limit) ? void 0 : limit });
2912
+ const component = query.category || void 0;
2913
+ const result = ringBuffer.since(since, { level, component, limit: isNaN(limit) ? void 0 : limit });
2903
2914
  const entries = result.entries.map((entry) => {
2904
- const { component, ...rest } = entry;
2905
- return { ...rest, category: component };
2915
+ const { component: component2, ...rest } = entry;
2916
+ return { ...rest, category: component2 };
2906
2917
  });
2907
2918
  return {
2908
2919
  body: {
@@ -3119,6 +3130,13 @@ async function handleDigest(deps, body) {
3119
3130
  tiers: result.tiersGenerated,
3120
3131
  duration: result.durationMs
3121
3132
  });
3133
+ } else if (options?.full && deps.onForceDigest) {
3134
+ deps.onForceDigest();
3135
+ deps.progressTracker.update(token, {
3136
+ status: "completed",
3137
+ percent: PROGRESS_COMPLETE,
3138
+ message: "Full cycle queued \u2014 items reset to pending"
3139
+ });
3122
3140
  } else {
3123
3141
  deps.progressTracker.update(token, {
3124
3142
  status: "completed",
@@ -4790,6 +4808,12 @@ async function main() {
4790
4808
  level: config.daemon.log_level,
4791
4809
  maxSize: config.daemon.max_log_size
4792
4810
  });
4811
+ logger.info("daemon", "Config loaded", {
4812
+ vault: vaultDir,
4813
+ digest_enabled: config.digest.enabled,
4814
+ intelligence_provider: config.intelligence.llm.provider,
4815
+ embedding_provider: config.intelligence.embedding.provider
4816
+ });
4793
4817
  let uiDir = null;
4794
4818
  {
4795
4819
  let dir = path11.dirname(new URL(import.meta.url).pathname);
@@ -4904,6 +4928,10 @@ ${updatedBody}`, "utf-8");
4904
4928
  observations: written.length,
4905
4929
  title
4906
4930
  });
4931
+ logger.debug("pipeline", "Extraction detail", {
4932
+ session_id: itemId,
4933
+ types: written.map((n) => n.observation.type)
4934
+ });
4907
4935
  return {
4908
4936
  observations: written.length,
4909
4937
  observation_ids: written.map((n) => n.id),
@@ -4943,6 +4971,7 @@ ${body}`.trim();
4943
4971
  logger.debug("pipeline", "No embeddable content, skipping", { id: itemId, type: itemType });
4944
4972
  return;
4945
4973
  }
4974
+ const embeddingStart = Date.now();
4946
4975
  const result = await generateEmbedding(
4947
4976
  embeddingProvider,
4948
4977
  embeddableText.slice(0, EMBEDDING_INPUT_LIMIT)
@@ -4962,7 +4991,8 @@ ${body}`.trim();
4962
4991
  logger.info("pipeline", "Embedding stored", {
4963
4992
  id: itemId,
4964
4993
  type: itemType,
4965
- dimensions: result.dimensions
4994
+ dimensions: result.dimensions,
4995
+ duration_ms: Date.now() - embeddingStart
4966
4996
  });
4967
4997
  return {
4968
4998
  model: result.model,
@@ -5013,6 +5043,7 @@ ${body}`.trim();
5013
5043
  const sessionBuffers = /* @__PURE__ */ new Map();
5014
5044
  const sessionFilePaths = /* @__PURE__ */ new Map();
5015
5045
  const capturedArtifactPaths = /* @__PURE__ */ new Map();
5046
+ let startupCleanedCount = 0;
5016
5047
  if (fs8.existsSync(bufferDir)) {
5017
5048
  const cutoff = Date.now() - STALE_BUFFER_MAX_AGE_MS;
5018
5049
  for (const file of fs8.readdirSync(bufferDir)) {
@@ -5020,10 +5051,16 @@ ${body}`.trim();
5020
5051
  const stat4 = fs8.statSync(filePath);
5021
5052
  if (stat4.mtimeMs < cutoff) {
5022
5053
  fs8.unlinkSync(filePath);
5054
+ startupCleanedCount++;
5023
5055
  logger.debug("daemon", "Cleaned stale buffer", { file });
5024
5056
  }
5025
5057
  }
5026
5058
  }
5059
+ if (startupCleanedCount > 0) {
5060
+ logger.info("daemon", "Buffer cleanup complete", {
5061
+ stale_removed: startupCleanedCount
5062
+ });
5063
+ }
5027
5064
  const needsMigrationReindex = index.query({ type: "memory" }).length > 0;
5028
5065
  const migrated = migrateSporeFiles(vaultDir);
5029
5066
  if (migrated > 0) {
@@ -5088,6 +5125,7 @@ ${content}`,
5088
5125
  };
5089
5126
  const digestLlm = config.digest.intelligence.model || config.digest.intelligence.provider ? createLlmProvider(digestLlmConfig) : llmProvider;
5090
5127
  let metabolism = null;
5128
+ let triggerForceDigest;
5091
5129
  if (config.digest.enabled) {
5092
5130
  logger.debug("digest", "Digest LLM config", digestLlmConfig);
5093
5131
  logger.debug("digest", `Using ${digestLlm.name} provider for digest`);
@@ -5113,6 +5151,9 @@ ${content}`,
5113
5151
  metabolism = new Metabolism(config.digest.metabolism);
5114
5152
  let digestReady = true;
5115
5153
  let forceDigest = false;
5154
+ triggerForceDigest = () => {
5155
+ forceDigest = true;
5156
+ };
5116
5157
  metabolism.start(async () => {
5117
5158
  digestReady = true;
5118
5159
  });
@@ -5225,7 +5266,7 @@ ${content}`,
5225
5266
  logger.debug("lineage", "Heuristic detection failed", { error: err.message });
5226
5267
  }
5227
5268
  metabolism?.activate();
5228
- logger.info("lifecycle", "Session registered", { session_id, branch });
5269
+ logger.info("lifecycle", "Session registered", { session_id, branch, started_at: started_at ?? null });
5229
5270
  return { body: { ok: true, sessions: registry.sessions } };
5230
5271
  });
5231
5272
  server.registerRoute("POST", "/sessions/unregister", async (req) => {
@@ -5257,6 +5298,15 @@ ${content}`,
5257
5298
  const validated = EventBody.parse(req.body);
5258
5299
  const event = { ...validated, timestamp: validated.timestamp ?? (/* @__PURE__ */ new Date()).toISOString() };
5259
5300
  logger.debug("hooks", "Event received", { type: event.type, session_id: event.session_id });
5301
+ if (validated.type === "user_prompt") {
5302
+ const v = validated;
5303
+ const promptText = String(v.prompt ?? "");
5304
+ logger.info("hooks", "User prompt received", {
5305
+ session_id: validated.session_id,
5306
+ prompt_preview: promptText.slice(0, LOG_PROMPT_PREVIEW_CHARS),
5307
+ prompt_length: promptText.length
5308
+ });
5309
+ }
5260
5310
  if (!registry.getSession(event.session_id)) {
5261
5311
  registry.register(event.session_id, { started_at: event.timestamp });
5262
5312
  logger.debug("lifecycle", "Auto-registered session from event", { session_id: event.session_id });
@@ -5268,6 +5318,10 @@ ${content}`,
5268
5318
  batchManager.addEvent(event);
5269
5319
  if (validated.type === "tool_use") {
5270
5320
  const v = validated;
5321
+ logger.debug("hooks", "Tool use event", {
5322
+ session_id: validated.session_id,
5323
+ tool_name: String(v.tool_name ?? "")
5324
+ });
5271
5325
  planWatcher.checkToolEvent({ tool_name: String(v.tool_name ?? ""), tool_input: v.tool_input, session_id: validated.session_id });
5272
5326
  const toolName = String(v.tool_name ?? "");
5273
5327
  if (toolName === "Write" || toolName === "Edit") {
@@ -5290,7 +5344,16 @@ ${content}`,
5290
5344
  logger.debug("lifecycle", "Auto-registered session from stop event", { session_id: sessionId });
5291
5345
  }
5292
5346
  const sessionMeta = registry.getSession(sessionId);
5293
- logger.info("hooks", "Stop received", { session_id: sessionId, has_transcript_path: !!hookTranscriptPath, has_response: !!lastAssistantMessage });
5347
+ logger.info("hooks", "Stop received", {
5348
+ session_id: sessionId,
5349
+ has_transcript_path: !!hookTranscriptPath,
5350
+ has_response: !!lastAssistantMessage
5351
+ });
5352
+ logger.debug("hooks", "Stop event detail", {
5353
+ session_id: sessionId,
5354
+ transcript_path: hookTranscriptPath ?? null,
5355
+ last_message_preview: lastAssistantMessage?.slice(0, LOG_MESSAGE_PREVIEW_CHARS) ?? null
5356
+ });
5294
5357
  const run = () => processStopEvent(sessionId, user, sessionMeta, hookTranscriptPath, lastAssistantMessage).catch((err) => {
5295
5358
  logger.error("processor", "Stop processing failed", { session_id: sessionId, error: err.message });
5296
5359
  });
@@ -5360,6 +5423,12 @@ ${content}`,
5360
5423
  }
5361
5424
  }
5362
5425
  enrichTurnsWithToolMetadata(allTurns, bufferEvents);
5426
+ const imageCount = allTurns.reduce((sum, t) => sum + (t.images?.length ?? 0), 0);
5427
+ logger.debug("processor", "Transcript parsed", {
5428
+ session_id: sessionId,
5429
+ turn_count: allTurns.length,
5430
+ image_count: imageCount
5431
+ });
5363
5432
  const ended = (/* @__PURE__ */ new Date()).toISOString();
5364
5433
  let started = allTurns.length > 0 && allTurns[0].timestamp ? allTurns[0].timestamp : ended;
5365
5434
  const sessionsDir = path11.join(vaultDir, "sessions");
@@ -5484,7 +5553,7 @@ ${content}`,
5484
5553
  });
5485
5554
  const parentId = lineageGraph.getParent(sessionId);
5486
5555
  const parentLink = parentId ? lineageGraph.getLinks().find((l) => l.child === sessionId) : void 0;
5487
- vault.writeSession({
5556
+ const notePath = vault.writeSession({
5488
5557
  id: sessionId,
5489
5558
  user,
5490
5559
  started,
@@ -5497,6 +5566,11 @@ ${content}`,
5497
5566
  transcript_path: hookTranscriptPath,
5498
5567
  summary
5499
5568
  });
5569
+ logger.debug("processor", "Session note written", {
5570
+ session_id: sessionId,
5571
+ path: notePath,
5572
+ content_length: summary.length
5573
+ });
5500
5574
  if (existingExtractionFields) {
5501
5575
  vault.updateNoteFrontmatter(relativePath, existingExtractionFields);
5502
5576
  }
@@ -5517,16 +5591,23 @@ ${content}`,
5517
5591
  if (branch) meta.push(`
5518
5592
  Branch:: \`${branch}\``);
5519
5593
  meta.push(`Session:: \`${session_id}\``);
5520
- logger.debug("context", `Injecting digest extract (tier ${result.tier})`, { session_id, fallback: result.fallback });
5594
+ logger.info("context", "Session context injected", {
5595
+ session_id,
5596
+ source: "digest",
5597
+ tier: result.tier,
5598
+ fallback: result.fallback
5599
+ });
5521
5600
  return { body: { text: meta.join("\n\n"), source: "digest", tier: result.tier } };
5522
5601
  }
5523
5602
  }
5524
5603
  const parts = [];
5604
+ const layerCounts = { plans: 0, parent_session: false, branch: !!branch };
5525
5605
  const plans = index.query({ type: "plan" });
5526
5606
  const activePlans = plans.filter((p) => {
5527
5607
  const status = p.frontmatter.status;
5528
5608
  return status === "active" || status === "in_progress";
5529
5609
  });
5610
+ layerCounts.plans = activePlans.length;
5530
5611
  if (activePlans.length > 0) {
5531
5612
  const planLines = activePlans.slice(0, SESSION_CONTEXT_MAX_PLANS).map((p) => {
5532
5613
  const status = p.frontmatter.status;
@@ -5535,11 +5616,13 @@ Branch:: \`${branch}\``);
5535
5616
  parts.push(`### Active Plans
5536
5617
  ${planLines.join("\n")}`);
5537
5618
  }
5619
+ let parentId;
5538
5620
  if (session_id) {
5539
- const parentId = lineageGraph.getParent(session_id);
5621
+ parentId = lineageGraph.getParent(session_id);
5540
5622
  if (parentId) {
5541
5623
  const parentNotes = index.queryByIds([sessionNoteId(parentId)]);
5542
5624
  if (parentNotes.length > 0) {
5625
+ layerCounts.parent_session = true;
5543
5626
  const parent = parentNotes[0];
5544
5627
  parts.push(`### Previous Session
5545
5628
  - **${parent.title}**: ${parent.content.slice(0, CONTEXT_SESSION_PREVIEW_CHARS)} \`[${parent.id}]\``);
@@ -5551,6 +5634,17 @@ ${planLines.join("\n")}`);
5551
5634
  }
5552
5635
  parts.push(`Session:: \`${session_id}\``);
5553
5636
  if (parts.length > 0) {
5637
+ logger.info("context", "Session context injected", {
5638
+ session_id,
5639
+ source: "layers",
5640
+ ...layerCounts,
5641
+ parts: parts.length
5642
+ });
5643
+ logger.debug("context", "Session context layer detail", {
5644
+ session_id,
5645
+ plan_titles: activePlans.slice(0, 5).map((p) => p.title),
5646
+ parent_id: parentId ?? null
5647
+ });
5554
5648
  return { body: { text: parts.join("\n\n") } };
5555
5649
  }
5556
5650
  return { body: { text: "" } };
@@ -5568,6 +5662,7 @@ ${planLines.join("\n")}`);
5568
5662
  if (!prompt || prompt.length < PROMPT_CONTEXT_MIN_LENGTH || !vectorIndex) {
5569
5663
  return { body: { text: "" } };
5570
5664
  }
5665
+ const searchStart = Date.now();
5571
5666
  try {
5572
5667
  const emb = await generateEmbedding(embeddingProvider, prompt.slice(0, EMBEDDING_INPUT_LIMIT));
5573
5668
  const results = vectorIndex.search(emb.embedding, {
@@ -5575,7 +5670,14 @@ ${planLines.join("\n")}`);
5575
5670
  type: "spore",
5576
5671
  relativeThreshold: PROMPT_CONTEXT_MIN_SIMILARITY
5577
5672
  });
5578
- if (results.length === 0) return { body: { text: "" } };
5673
+ if (results.length === 0) {
5674
+ logger.debug("context", "No matching spores for prompt", {
5675
+ session_id,
5676
+ prompt_preview: prompt.slice(0, LOG_PROMPT_PREVIEW_CHARS),
5677
+ search_duration_ms: Date.now() - searchStart
5678
+ });
5679
+ return { body: { text: "" } };
5680
+ }
5579
5681
  const noteMap = new Map(
5580
5682
  index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
5581
5683
  );
@@ -5591,10 +5693,18 @@ ${planLines.join("\n")}`);
5591
5693
  if (lines.length === 0) return { body: { text: "" } };
5592
5694
  const injected = `**Relevant spores for this task:**
5593
5695
  ${lines.join("\n")}`;
5594
- logger.debug("context", "Prompt context injected", {
5696
+ logger.info("context", "Prompt context injected", {
5595
5697
  session_id,
5596
5698
  spores: lines.length,
5597
- prompt_preview: prompt.slice(0, 50)
5699
+ prompt_preview: prompt.slice(0, LOG_PROMPT_PREVIEW_CHARS)
5700
+ });
5701
+ logger.debug("context", "Prompt context spore details", {
5702
+ session_id,
5703
+ spore_ids: results.map((r) => r.id),
5704
+ similarities: results.map((r) => r.similarity.toFixed(3)),
5705
+ prompt_length: prompt.length,
5706
+ context_chars: injected.length,
5707
+ search_duration_ms: Date.now() - searchStart
5598
5708
  });
5599
5709
  return { body: { text: injected } };
5600
5710
  } catch (err) {
@@ -5622,6 +5732,17 @@ ${lines.join("\n")}`;
5622
5732
  metabolism
5623
5733
  }));
5624
5734
  server.registerRoute("GET", "/api/logs", async (req) => handleGetLogs(logger.getRingBuffer(), req.query));
5735
+ const ExternalLogBody = external_exports.object({
5736
+ level: external_exports.enum(["debug", "info", "warn", "error"]),
5737
+ component: external_exports.string(),
5738
+ message: external_exports.string(),
5739
+ data: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
5740
+ });
5741
+ server.registerRoute("POST", "/api/log", async (req) => {
5742
+ const { level, component, message, data } = ExternalLogBody.parse(req.body);
5743
+ logger.log(level, component, message, data);
5744
+ return { body: { ok: true } };
5745
+ });
5625
5746
  server.registerRoute("GET", "/api/models", async (req) => handleGetModels(req));
5626
5747
  server.registerRoute("POST", "/api/restart", async (req) => handleRestart({ vaultDir, progressTracker }, req.body));
5627
5748
  server.registerRoute("GET", "/api/progress/:token", async (req) => handleGetProgress(progressTracker, req.params.token));
@@ -5635,9 +5756,9 @@ ${lines.join("\n")}`;
5635
5756
  embeddingProvider,
5636
5757
  progressTracker,
5637
5758
  pipeline,
5759
+ onForceDigest: triggerForceDigest,
5638
5760
  log: (level, message, data) => {
5639
- const fn = logger[level];
5640
- if (typeof fn === "function") fn.call(logger, "operations", message, data);
5761
+ logger.log(level, "operations", message, data);
5641
5762
  }
5642
5763
  };
5643
5764
  server.registerRoute("POST", "/api/rebuild", async () => handleRebuild(operationDeps));
@@ -5712,4 +5833,4 @@ export {
5712
5833
  chokidar/index.js:
5713
5834
  (*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) *)
5714
5835
  */
5715
- //# sourceMappingURL=main-6AGPIMH2.js.map
5836
+ //# sourceMappingURL=main-RB727YRP.js.map