@goondocks/myco 0.19.0 → 0.19.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 (151) hide show
  1. package/dist/{agent-run-EADUYYAS.js → agent-run-4QUP3G4V.js} +7 -7
  2. package/dist/{agent-tasks-GC77JXQB.js → agent-tasks-NVOWYBLB.js} +7 -7
  3. package/dist/{chunk-MDEUXYJG.js → chunk-3C4LT4BW.js} +11 -6
  4. package/dist/chunk-3C4LT4BW.js.map +1 -0
  5. package/dist/{chunk-LLJMDXO2.js → chunk-3J6TUJSV.js} +3 -3
  6. package/dist/{chunk-2LN2BBKA.js → chunk-6DDRJQ4X.js} +2 -2
  7. package/dist/{chunk-YPWF322W.js → chunk-6ZDJXSEO.js} +3 -3
  8. package/dist/{chunk-2DF4OZ2D.js → chunk-7ONVLO43.js} +11 -6
  9. package/dist/chunk-7ONVLO43.js.map +1 -0
  10. package/dist/{chunk-INWD6AIQ.js → chunk-AULBWINA.js} +2 -2
  11. package/dist/{chunk-UW6DGPSV.js → chunk-D5X4MMKR.js} +3 -3
  12. package/dist/{chunk-2CKDAFSX.js → chunk-DDOPAV5O.js} +2 -2
  13. package/dist/{chunk-MVBCON4D.js → chunk-DURKJTVO.js} +2 -2
  14. package/dist/{chunk-REN37KYI.js → chunk-FGKCE5AE.js} +7 -2
  15. package/dist/chunk-FGKCE5AE.js.map +1 -0
  16. package/dist/{chunk-W4VHC2ES.js → chunk-I54KLC6H.js} +3 -1
  17. package/dist/{chunk-W4VHC2ES.js.map → chunk-I54KLC6H.js.map} +1 -1
  18. package/dist/{chunk-OZF5EURR.js → chunk-IXVAYN3P.js} +4 -4
  19. package/dist/{chunk-3TPD6HEF.js → chunk-KYH4V4ML.js} +3 -3
  20. package/dist/{team-N6TXS2PF.js → chunk-PLYWR5D7.js} +246 -61
  21. package/dist/chunk-PLYWR5D7.js.map +1 -0
  22. package/dist/{chunk-KSXTNYXO.js → chunk-PMT2LSTQ.js} +2 -2
  23. package/dist/{chunk-AELJ4PS5.js → chunk-Q4QD6LJT.js} +5 -5
  24. package/dist/{chunk-2OO3BRFK.js → chunk-Q6OEZM3S.js} +26 -2
  25. package/dist/chunk-Q6OEZM3S.js.map +1 -0
  26. package/dist/{chunk-CYBC2HZ3.js → chunk-QMTXVFA7.js} +3 -3
  27. package/dist/{chunk-RXROZBSK.js → chunk-THZKOZ4M.js} +419 -410
  28. package/dist/chunk-THZKOZ4M.js.map +1 -0
  29. package/dist/{chunk-E7NUADTQ.js → chunk-UUHLLQXO.js} +2 -1
  30. package/dist/{chunk-E7NUADTQ.js.map → chunk-UUHLLQXO.js.map} +1 -1
  31. package/dist/{chunk-SCI55NKY.js → chunk-VQF5E4ZX.js} +2 -2
  32. package/dist/{chunk-MS6FDV45.js → chunk-WKNAKQKA.js} +2 -2
  33. package/dist/{chunk-N77K772N.js → chunk-XMPCB2P2.js} +5 -5
  34. package/dist/chunk-XMPCB2P2.js.map +1 -0
  35. package/dist/{cli-X7CFP4YD.js → cli-GDHPLWS7.js} +41 -41
  36. package/dist/{client-YA33HUFY.js → client-UCELFVZF.js} +5 -5
  37. package/dist/{config-RFB2DJC6.js → config-2KQ45OC5.js} +4 -4
  38. package/dist/{detect-providers-2OQBU4VX.js → detect-providers-2EY55EHK.js} +5 -5
  39. package/dist/{doctor-FAH7N66M.js → doctor-7ATZHQIY.js} +11 -11
  40. package/dist/{executor-ICTRRUBY.js → executor-YO4RIKJQ.js} +55 -35
  41. package/dist/executor-YO4RIKJQ.js.map +1 -0
  42. package/dist/{init-PTJEOTJV.js → init-OK5QJISX.js} +12 -12
  43. package/dist/{llm-7D2OGDEK.js → llm-SWDDQQWY.js} +5 -5
  44. package/dist/{loader-VPE4RCIF.js → loader-AAZ6VUIA.js} +4 -4
  45. package/dist/{loader-O2JFO2UC.js → loader-JG5OBPB6.js} +4 -4
  46. package/dist/{logs-TMKNLSJY.js → logs-KNKPQE5A.js} +3 -3
  47. package/dist/{main-EIKBLOUL.js → main-XWJGDDMZ.js} +115 -72
  48. package/dist/main-XWJGDDMZ.js.map +1 -0
  49. package/dist/{open-2JCSOLZS.js → open-5WOOLDUZ.js} +7 -7
  50. package/dist/{post-compact-2HPPWPBI.js → post-compact-TLIJUMKZ.js} +7 -7
  51. package/dist/{post-tool-use-TWBBBABS.js → post-tool-use-TMYBAFL6.js} +6 -6
  52. package/dist/{post-tool-use-failure-LIJYR4KL.js → post-tool-use-failure-P7YHR3EO.js} +7 -7
  53. package/dist/{pre-compact-II2CMNTG.js → pre-compact-7RUNVXOE.js} +7 -7
  54. package/dist/{provider-check-KEQNQ6LO.js → provider-check-WCM3SDTM.js} +5 -5
  55. package/dist/{registry-X5FDGYXT.js → registry-OCM4WAPJ.js} +5 -5
  56. package/dist/{remove-L5MVYBOY.js → remove-ISEIHY5H.js} +8 -8
  57. package/dist/{resolution-events-MVIZMONR.js → resolution-events-PYLSI6QT.js} +5 -5
  58. package/dist/{restart-VIT3JBD6.js → restart-AK24G2ME.js} +8 -8
  59. package/dist/{search-O6BB5MTO.js → search-RVRUKLEH.js} +8 -8
  60. package/dist/{server-O3UPJVBR.js → server-GBWW5MBT.js} +5 -5
  61. package/dist/{session-5JV3DQIK.js → session-L7PGGZTO.js} +9 -9
  62. package/dist/{session-end-PZ2OXBGG.js → session-end-YURB7CFB.js} +6 -6
  63. package/dist/{session-start-FDGM56BX.js → session-start-4AMHWOBP.js} +11 -11
  64. package/dist/{setup-llm-MQK557BB.js → setup-llm-2UOSVGAY.js} +8 -8
  65. package/dist/src/agent/definitions/tasks/title-summary.yaml +9 -8
  66. package/dist/src/cli.js +1 -1
  67. package/dist/src/daemon/main.js +1 -1
  68. package/dist/src/hooks/post-tool-use.js +1 -1
  69. package/dist/src/hooks/session-end.js +1 -1
  70. package/dist/src/hooks/session-start.js +1 -1
  71. package/dist/src/hooks/stop.js +1 -1
  72. package/dist/src/hooks/user-prompt-submit.js +1 -1
  73. package/dist/src/mcp/server.js +1 -1
  74. package/dist/{stats-2STTARTC.js → stats-5IEO4KWT.js} +9 -9
  75. package/dist/{stop-WNKCMCGO.js → stop-KRR3EBB2.js} +6 -6
  76. package/dist/{stop-failure-6GTOBVTN.js → stop-failure-6RZAWIDM.js} +7 -7
  77. package/dist/{subagent-start-VJF5YKVX.js → subagent-start-R62O6YPW.js} +7 -7
  78. package/dist/{subagent-stop-UW6HMICY.js → subagent-stop-MP2YDF6D.js} +7 -7
  79. package/dist/{task-completed-U4Q3XXLX.js → task-completed-KCMJYZT7.js} +7 -7
  80. package/dist/team-M6TC4TFC.js +22 -0
  81. package/dist/ui/assets/{index-CHIm98OP.js → index-CwPuGRsJ.js} +102 -102
  82. package/dist/ui/index.html +1 -1
  83. package/dist/{update-ZYCOWKMD.js → update-L5JXTKPL.js} +8 -8
  84. package/dist/{user-prompt-submit-SOYL4OWF.js → user-prompt-submit-L6JNZ7QY.js} +6 -6
  85. package/dist/{verify-P37PQ4YM.js → verify-CJHF23QH.js} +6 -6
  86. package/dist/{version-XAWC277D.js → version-PFOYY6HT.js} +2 -2
  87. package/dist/version-PFOYY6HT.js.map +1 -0
  88. package/package.json +1 -1
  89. package/dist/chunk-2DF4OZ2D.js.map +0 -1
  90. package/dist/chunk-2OO3BRFK.js.map +0 -1
  91. package/dist/chunk-EM63ZFKA.js +0 -166
  92. package/dist/chunk-EM63ZFKA.js.map +0 -1
  93. package/dist/chunk-MDEUXYJG.js.map +0 -1
  94. package/dist/chunk-N77K772N.js.map +0 -1
  95. package/dist/chunk-REN37KYI.js.map +0 -1
  96. package/dist/chunk-RXROZBSK.js.map +0 -1
  97. package/dist/executor-ICTRRUBY.js.map +0 -1
  98. package/dist/main-EIKBLOUL.js.map +0 -1
  99. package/dist/team-N6TXS2PF.js.map +0 -1
  100. /package/dist/{agent-run-EADUYYAS.js.map → agent-run-4QUP3G4V.js.map} +0 -0
  101. /package/dist/{agent-tasks-GC77JXQB.js.map → agent-tasks-NVOWYBLB.js.map} +0 -0
  102. /package/dist/{chunk-LLJMDXO2.js.map → chunk-3J6TUJSV.js.map} +0 -0
  103. /package/dist/{chunk-2LN2BBKA.js.map → chunk-6DDRJQ4X.js.map} +0 -0
  104. /package/dist/{chunk-YPWF322W.js.map → chunk-6ZDJXSEO.js.map} +0 -0
  105. /package/dist/{chunk-INWD6AIQ.js.map → chunk-AULBWINA.js.map} +0 -0
  106. /package/dist/{chunk-UW6DGPSV.js.map → chunk-D5X4MMKR.js.map} +0 -0
  107. /package/dist/{chunk-2CKDAFSX.js.map → chunk-DDOPAV5O.js.map} +0 -0
  108. /package/dist/{chunk-MVBCON4D.js.map → chunk-DURKJTVO.js.map} +0 -0
  109. /package/dist/{chunk-OZF5EURR.js.map → chunk-IXVAYN3P.js.map} +0 -0
  110. /package/dist/{chunk-3TPD6HEF.js.map → chunk-KYH4V4ML.js.map} +0 -0
  111. /package/dist/{chunk-KSXTNYXO.js.map → chunk-PMT2LSTQ.js.map} +0 -0
  112. /package/dist/{chunk-AELJ4PS5.js.map → chunk-Q4QD6LJT.js.map} +0 -0
  113. /package/dist/{chunk-CYBC2HZ3.js.map → chunk-QMTXVFA7.js.map} +0 -0
  114. /package/dist/{chunk-SCI55NKY.js.map → chunk-VQF5E4ZX.js.map} +0 -0
  115. /package/dist/{chunk-MS6FDV45.js.map → chunk-WKNAKQKA.js.map} +0 -0
  116. /package/dist/{cli-X7CFP4YD.js.map → cli-GDHPLWS7.js.map} +0 -0
  117. /package/dist/{client-YA33HUFY.js.map → client-UCELFVZF.js.map} +0 -0
  118. /package/dist/{config-RFB2DJC6.js.map → config-2KQ45OC5.js.map} +0 -0
  119. /package/dist/{detect-providers-2OQBU4VX.js.map → detect-providers-2EY55EHK.js.map} +0 -0
  120. /package/dist/{doctor-FAH7N66M.js.map → doctor-7ATZHQIY.js.map} +0 -0
  121. /package/dist/{init-PTJEOTJV.js.map → init-OK5QJISX.js.map} +0 -0
  122. /package/dist/{llm-7D2OGDEK.js.map → llm-SWDDQQWY.js.map} +0 -0
  123. /package/dist/{loader-O2JFO2UC.js.map → loader-AAZ6VUIA.js.map} +0 -0
  124. /package/dist/{loader-VPE4RCIF.js.map → loader-JG5OBPB6.js.map} +0 -0
  125. /package/dist/{logs-TMKNLSJY.js.map → logs-KNKPQE5A.js.map} +0 -0
  126. /package/dist/{open-2JCSOLZS.js.map → open-5WOOLDUZ.js.map} +0 -0
  127. /package/dist/{post-compact-2HPPWPBI.js.map → post-compact-TLIJUMKZ.js.map} +0 -0
  128. /package/dist/{post-tool-use-TWBBBABS.js.map → post-tool-use-TMYBAFL6.js.map} +0 -0
  129. /package/dist/{post-tool-use-failure-LIJYR4KL.js.map → post-tool-use-failure-P7YHR3EO.js.map} +0 -0
  130. /package/dist/{pre-compact-II2CMNTG.js.map → pre-compact-7RUNVXOE.js.map} +0 -0
  131. /package/dist/{provider-check-KEQNQ6LO.js.map → provider-check-WCM3SDTM.js.map} +0 -0
  132. /package/dist/{registry-X5FDGYXT.js.map → registry-OCM4WAPJ.js.map} +0 -0
  133. /package/dist/{remove-L5MVYBOY.js.map → remove-ISEIHY5H.js.map} +0 -0
  134. /package/dist/{resolution-events-MVIZMONR.js.map → resolution-events-PYLSI6QT.js.map} +0 -0
  135. /package/dist/{restart-VIT3JBD6.js.map → restart-AK24G2ME.js.map} +0 -0
  136. /package/dist/{search-O6BB5MTO.js.map → search-RVRUKLEH.js.map} +0 -0
  137. /package/dist/{server-O3UPJVBR.js.map → server-GBWW5MBT.js.map} +0 -0
  138. /package/dist/{session-5JV3DQIK.js.map → session-L7PGGZTO.js.map} +0 -0
  139. /package/dist/{session-end-PZ2OXBGG.js.map → session-end-YURB7CFB.js.map} +0 -0
  140. /package/dist/{session-start-FDGM56BX.js.map → session-start-4AMHWOBP.js.map} +0 -0
  141. /package/dist/{setup-llm-MQK557BB.js.map → setup-llm-2UOSVGAY.js.map} +0 -0
  142. /package/dist/{stats-2STTARTC.js.map → stats-5IEO4KWT.js.map} +0 -0
  143. /package/dist/{stop-WNKCMCGO.js.map → stop-KRR3EBB2.js.map} +0 -0
  144. /package/dist/{stop-failure-6GTOBVTN.js.map → stop-failure-6RZAWIDM.js.map} +0 -0
  145. /package/dist/{subagent-start-VJF5YKVX.js.map → subagent-start-R62O6YPW.js.map} +0 -0
  146. /package/dist/{subagent-stop-UW6HMICY.js.map → subagent-stop-MP2YDF6D.js.map} +0 -0
  147. /package/dist/{task-completed-U4Q3XXLX.js.map → task-completed-KCMJYZT7.js.map} +0 -0
  148. /package/dist/{version-XAWC277D.js.map → team-M6TC4TFC.js.map} +0 -0
  149. /package/dist/{update-ZYCOWKMD.js.map → update-L5JXTKPL.js.map} +0 -0
  150. /package/dist/{user-prompt-submit-SOYL4OWF.js.map → user-prompt-submit-L6JNZ7QY.js.map} +0 -0
  151. /package/dist/{verify-P37PQ4YM.js.map → verify-CJHF23QH.js.map} +0 -0
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-N77K772N.js";
4
+ } from "./chunk-XMPCB2P2.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
6
  import "./chunk-WYOE4IAX.js";
7
- import "./chunk-KSXTNYXO.js";
7
+ import "./chunk-PMT2LSTQ.js";
8
8
  import "./chunk-MYX5NCRH.js";
9
- import "./chunk-CYBC2HZ3.js";
10
- import "./chunk-2CKDAFSX.js";
9
+ import "./chunk-QMTXVFA7.js";
10
+ import "./chunk-DDOPAV5O.js";
11
11
  import "./chunk-LPUQPDC2.js";
12
- import "./chunk-W4VHC2ES.js";
13
- import "./chunk-E7NUADTQ.js";
12
+ import "./chunk-I54KLC6H.js";
13
+ import "./chunk-UUHLLQXO.js";
14
14
  import "./chunk-PZUWP5VK.js";
15
15
 
16
16
  // src/cli/agent-run.ts
@@ -32,4 +32,4 @@ async function run(args, vaultDir) {
32
32
  export {
33
33
  run
34
34
  };
35
- //# sourceMappingURL=agent-run-EADUYYAS.js.map
35
+ //# sourceMappingURL=agent-run-4QUP3G4V.js.map
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-N77K772N.js";
4
+ } from "./chunk-XMPCB2P2.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
6
  import "./chunk-WYOE4IAX.js";
7
- import "./chunk-KSXTNYXO.js";
7
+ import "./chunk-PMT2LSTQ.js";
8
8
  import "./chunk-MYX5NCRH.js";
9
- import "./chunk-CYBC2HZ3.js";
10
- import "./chunk-2CKDAFSX.js";
9
+ import "./chunk-QMTXVFA7.js";
10
+ import "./chunk-DDOPAV5O.js";
11
11
  import "./chunk-LPUQPDC2.js";
12
- import "./chunk-W4VHC2ES.js";
13
- import "./chunk-E7NUADTQ.js";
12
+ import "./chunk-I54KLC6H.js";
13
+ import "./chunk-UUHLLQXO.js";
14
14
  import "./chunk-PZUWP5VK.js";
15
15
 
16
16
  // src/cli/agent-tasks.ts
@@ -178,4 +178,4 @@ async function run(args, vaultDir) {
178
178
  export {
179
179
  run
180
180
  };
181
- //# sourceMappingURL=agent-tasks-GC77JXQB.js.map
181
+ //# sourceMappingURL=agent-tasks-NVOWYBLB.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  SCHEDULABLE_POWER_STATES
4
- } from "./chunk-W4VHC2ES.js";
4
+ } from "./chunk-I54KLC6H.js";
5
5
  import {
6
6
  require_dist
7
7
  } from "./chunk-6LQIMRTC.js";
@@ -26,7 +26,14 @@ var EmbeddingProviderSchema = external_exports.object({
26
26
  var DaemonSchema = external_exports.object({
27
27
  port: external_exports.number().int().min(1024).max(65535).nullable().default(null),
28
28
  log_level: external_exports.enum(["debug", "info", "warn", "error"]).default("info"),
29
- log_retention_days: external_exports.number().int().min(1).max(365).default(30)
29
+ log_retention_days: external_exports.number().int().min(1).max(365).default(30),
30
+ /**
31
+ * Time without new prompts before an active session is auto-completed (ms).
32
+ * Intelligence tasks (full-intelligence, skill-survey, etc.) only process
33
+ * settled sessions, so this threshold directly controls how fresh their
34
+ * inputs are. Defaults to 1 hour.
35
+ */
36
+ stale_session_threshold_ms: external_exports.number().int().min(6e4).default(60 * 60 * 1e3)
30
37
  });
31
38
  var CaptureSchema = external_exports.object({
32
39
  transcript_paths: external_exports.array(external_exports.string()).default([]),
@@ -102,9 +109,7 @@ var TeamSchema = external_exports.object({
102
109
  /** Team identifier for sync grouping. */
103
110
  team_id: external_exports.string().optional(),
104
111
  /** Sync interval in minutes. */
105
- interval_minutes: external_exports.number().int().min(1).max(1440).default(15),
106
- /** Package version of the last deployed worker. Used to detect when an upgrade is needed. */
107
- deployed_worker_version: external_exports.string().optional()
112
+ interval_minutes: external_exports.number().int().min(1).max(1440).default(15)
108
113
  });
109
114
  var SkillsSchema = external_exports.object({
110
115
  /** Auto-generate candidates above this confidence score. */
@@ -430,4 +435,4 @@ export {
430
435
  getEnabledSymbiontNames,
431
436
  updateTeamConfig
432
437
  };
433
- //# sourceMappingURL=chunk-MDEUXYJG.js.map
438
+ //# sourceMappingURL=chunk-3C4LT4BW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/loader.ts","../src/config/schema.ts","../src/config/migrations.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { MycoConfigSchema, type MycoConfig, type BackupConfig, type TeamConfig } from './schema.js';\nimport { runMigrations, CURRENT_MIGRATION_VERSION } from './migrations.js';\n\nexport const CONFIG_FILENAME = 'myco.yaml';\n\nexport function loadConfig(vaultDir: string): MycoConfig {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n\n if (!fs.existsSync(configPath)) {\n throw new Error(`myco.yaml not found in ${vaultDir}`);\n }\n\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = YAML.parse(raw) as Record<string, unknown>;\n\n // Detect v1 config and guide migration\n if (parsed.version === 1 || (parsed.intelligence as Record<string, unknown>)?.backend) {\n throw new Error(\n 'Myco config uses v1 format. Run /myco:setup-llm to reconfigure for v2.',\n );\n }\n\n // --- v2 → v3 migration ---\n let v2Migrated = false;\n if (parsed.version === 2) {\n // Extract intelligence.embedding to top-level embedding\n const intel = parsed.intelligence as Record<string, unknown> | undefined;\n const embeddingConfig = intel?.embedding as Record<string, unknown> | undefined;\n if (embeddingConfig && !parsed.embedding) {\n // Map v2 'lm-studio' to v3 'openai-compatible' for embedding provider\n if (embeddingConfig.provider === 'lm-studio') {\n embeddingConfig.provider = 'openai-compatible';\n }\n parsed.embedding = embeddingConfig;\n }\n\n // Keep daemon.port and daemon.log_level, drop grace_period and max_log_size\n const daemon = parsed.daemon as Record<string, unknown> | undefined;\n if (daemon) {\n const { port, log_level } = daemon;\n parsed.daemon = { port: port ?? null, log_level: log_level ?? 'info' };\n }\n\n // Keep capture basics, drop token-related fields; migrate artifact_watch → plan_dirs\n const capture = parsed.capture as Record<string, unknown> | undefined;\n if (capture) {\n const { transcript_paths, artifact_watch, plan_dirs, artifact_extensions, buffer_max_events } = capture;\n parsed.capture = {\n transcript_paths,\n plan_dirs: plan_dirs ?? artifact_watch,\n artifact_extensions,\n buffer_max_events,\n };\n }\n\n // Drop removed top-level sections\n delete parsed.intelligence;\n delete parsed.context;\n delete parsed.team;\n delete parsed.digest;\n delete parsed.pipeline;\n\n // Set version to 3\n parsed.version = 3;\n v2Migrated = true;\n\n process.stderr.write('[myco migration] Migrated config from v2 to v3\\n');\n }\n\n // Run numbered migrations (for v3+ forward migrations)\n const migrationsRan = runMigrations(parsed, vaultDir, (msg) => {\n process.stderr.write(`[myco migration] ${msg}\\n`);\n });\n\n // Parse with Zod to fill in defaults for new config sections\n const config = MycoConfigSchema.parse(parsed);\n\n // Write back if v2→v3 migration ran, numbered migrations ran, or new defaults were added\n const needsWrite = v2Migrated\n || migrationsRan\n || (parsed.config_version as number ?? 0) < CURRENT_MIGRATION_VERSION\n || parsed.version !== config.version;\n\n if (needsWrite) {\n const fullConfig = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n fs.writeFileSync(configPath, YAML.stringify(fullConfig), 'utf-8');\n }\n\n return config;\n}\n\nexport function saveConfig(vaultDir: string, config: MycoConfig): void {\n // Validate before writing — OAK lesson: validate on write, not just read\n const validated = MycoConfigSchema.parse(config);\n\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n fs.mkdirSync(vaultDir, { recursive: true });\n fs.writeFileSync(configPath, YAML.stringify(validated), 'utf-8');\n}\n\nexport function updateConfig(\n vaultDir: string,\n fn: (config: MycoConfig) => MycoConfig,\n): MycoConfig {\n const current = loadConfig(vaultDir);\n const updated = fn(current);\n saveConfig(vaultDir, updated);\n return updated;\n}\n\nexport function updateBackupConfig(\n vaultDir: string,\n backup: Partial<BackupConfig>,\n): MycoConfig {\n return updateConfig(vaultDir, (config) => ({\n ...config,\n backup: { ...config.backup, ...backup },\n }));\n}\n\n/**\n * Extract the set of enabled symbiont names from config.\n * Returns null when the `symbionts` section is absent (pre-existing installs),\n * signalling callers to fall back to their own heuristic.\n */\nexport function getEnabledSymbiontNames(config: MycoConfig): Set<string> | null {\n if (!config.symbionts) return null;\n return new Set(\n Object.entries(config.symbionts)\n .filter(([, entry]) => entry.enabled)\n .map(([name]) => name),\n );\n}\n\nexport function updateTeamConfig(\n vaultDir: string,\n team: Partial<TeamConfig>,\n): MycoConfig {\n return updateConfig(vaultDir, (config) => ({\n ...config,\n team: { ...config.team, ...team },\n }));\n}\n","import { z } from 'zod';\nimport { SCHEDULABLE_POWER_STATES } from '@myco/constants.js';\n\nconst EmbeddingProviderSchema = z.object({\n provider: z.enum(['ollama', 'openai-compatible', 'openrouter', 'openai']).default('ollama'),\n model: z.string().default('bge-m3'),\n base_url: z.string().url().optional(),\n});\n\nconst DaemonSchema = z.object({\n port: z.number().int().min(1024).max(65535).nullable().default(null),\n log_level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n log_retention_days: z.number().int().min(1).max(365).default(30),\n /**\n * Time without new prompts before an active session is auto-completed (ms).\n * Intelligence tasks (full-intelligence, skill-survey, etc.) only process\n * settled sessions, so this threshold directly controls how fresh their\n * inputs are. Defaults to 1 hour.\n */\n stale_session_threshold_ms: z.number().int().min(60_000).default(60 * 60 * 1000),\n});\n\nconst CaptureSchema = z.object({\n transcript_paths: z.array(z.string()).default([]),\n plan_dirs: z.array(z.string()).default([]),\n artifact_extensions: z.array(z.string()).default(['.md']),\n buffer_max_events: z.number().int().positive().default(500),\n});\n\n/** Provider config shape used in both task-level and phase-level overrides. */\nconst ProviderOverrideSchema = z.object({\n type: z.enum(['anthropic', 'ollama', 'lmstudio']),\n base_url: z.string().optional(),\n model: z.string().optional(),\n /** Context window size for local models (Ollama num_ctx, LM Studio context_length). */\n context_length: z.number().int().positive().optional(),\n});\n\n/** Per-phase overrides within a task — keyed by phase name. */\nconst PhaseOverrideSchema = z.object({\n provider: ProviderOverrideSchema.optional(),\n model: z.string().optional(),\n maxTurns: z.number().int().positive().optional(),\n});\n\n/** Per-task schedule override — partial, merges with YAML defaults. */\nconst ScheduleOverrideSchema = z.object({\n enabled: z.boolean().optional(),\n intervalSeconds: z.number().int().positive().optional(),\n runIn: z.array(z.enum([...SCHEDULABLE_POWER_STATES])).optional(),\n preCondition: z.enum(['has-unprocessed-batches', 'has-active-skills', 'has-approved-candidates']).optional(),\n}).optional();\n\n/** Per-task config override — stored in myco.yaml under agent.tasks. */\nconst TaskProviderOverrideSchema = z.object({\n provider: ProviderOverrideSchema.optional(),\n model: z.string().optional(),\n maxTurns: z.number().int().positive().optional(),\n timeoutSeconds: z.number().int().positive().optional(),\n phases: z.record(z.string(), PhaseOverrideSchema).optional(),\n schedule: ScheduleOverrideSchema,\n /** Task-specific params — keys and types vary per task. */\n params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n});\n\nconst ContextSchema = z.object({\n /** Which digest tier to inject at session start. */\n digest_tier: z.number().int().default(5000),\n /** Enable semantic spore search on each user prompt. */\n prompt_search: z.boolean().default(true),\n /** Max spores to inject per prompt (0-10). */\n prompt_max_spores: z.number().int().min(0).max(10).default(3),\n});\n\nconst AgentSchema = z.object({\n /** Number of batches between event-driven summary triggers (0 to disable). */\n summary_batch_interval: z.number().int().min(0).default(5),\n /** Global toggle for PowerManager-scheduled agent tasks. */\n scheduled_tasks_enabled: z.boolean().default(true),\n /** Global toggle for event-driven agent tasks (title-summary). */\n event_tasks_enabled: z.boolean().default(true),\n /** Global default provider — applies to all tasks unless overridden per-task. */\n provider: ProviderOverrideSchema.optional(),\n /** Global default model — applies to all tasks unless overridden per-task. */\n model: z.string().optional(),\n /** Per-task overrides keyed by task name. */\n tasks: z.record(z.string(), TaskProviderOverrideSchema).optional(),\n});\n\nconst BackupSchema = z.object({\n /** Override directory for backup files. Supports ~ for home directory. When unset, defaults to .myco/backups. */\n dir: z.string().optional(),\n});\n\nconst MaintenanceSchema = z.object({\n /** Automatically run PRAGMA optimize on a schedule. */\n auto_optimize: z.boolean().default(true),\n /** How often to run auto-optimize, in hours (1–720). */\n auto_optimize_interval_hours: z.number().int().min(1).max(720).default(24),\n});\n\nconst TeamSchema = z.object({\n /** Whether team sync is enabled. */\n enabled: z.boolean().default(false),\n /** Cloudflare Worker URL for team sync. */\n worker_url: z.string().url().optional(),\n /** Team identifier for sync grouping. */\n team_id: z.string().optional(),\n /** Sync interval in minutes. */\n interval_minutes: z.number().int().min(1).max(1440).default(15),\n});\n\nconst SkillsSchema = z.object({\n /** Auto-generate candidates above this confidence score. */\n confidence_threshold: z.number().min(0).max(1).default(0.7),\n /** Flag unused skills after this many days. */\n usage_stale_days: z.number().int().positive().default(30),\n});\n\nconst NotificationsSchema = z.object({\n /** Master switch — disables all notifications when false. */\n enabled: z.boolean().default(true),\n /** Allow browser system notifications (Notification API). */\n system_notifications: z.boolean().default(false),\n /** Default display mode for new notification types. */\n default_mode: z.enum(['banner', 'summary']).default('banner'),\n /** Per-domain settings. Keys are domain names from the registry. */\n domains: z.record(z.string(), z.object({\n enabled: z.boolean().default(true),\n /** Override display mode for this domain. Omit to use global default_mode. */\n mode: z.enum(['banner', 'summary']).optional(),\n })).default({}),\n});\n\nconst SymbiontEntrySchema = z.object({\n enabled: z.boolean().default(true),\n});\n\nexport const MycoConfigSchema = z.preprocess(\n (raw: unknown) => {\n if (raw && typeof raw === 'object' && 'curation' in raw && !('agent' in raw)) {\n const { curation, ...rest } = raw as Record<string, unknown>;\n return { ...rest, agent: curation };\n }\n return raw;\n },\n z.object({\n version: z.literal(3),\n config_version: z.number().int().nonnegative().default(0),\n embedding: EmbeddingProviderSchema.default(() => EmbeddingProviderSchema.parse({})),\n daemon: DaemonSchema.default(() => DaemonSchema.parse({})),\n capture: CaptureSchema.default(() => CaptureSchema.parse({})),\n agent: AgentSchema.default(() => AgentSchema.parse({})),\n context: ContextSchema.default(() => ContextSchema.parse({})),\n backup: BackupSchema.default(() => BackupSchema.parse({})),\n maintenance: MaintenanceSchema.default(() => MaintenanceSchema.parse({})),\n team: TeamSchema.default(() => TeamSchema.parse({})),\n skills: SkillsSchema.default(() => SkillsSchema.parse({})),\n notifications: NotificationsSchema.default(() => NotificationsSchema.parse({})),\n symbionts: z.record(z.string(), SymbiontEntrySchema).optional(),\n }),\n);\n\nexport type MycoConfig = z.output<typeof MycoConfigSchema>;\nexport type EmbeddingProviderConfig = z.infer<typeof EmbeddingProviderSchema>;\nexport type TaskProviderOverride = z.infer<typeof TaskProviderOverrideSchema>;\nexport type PhaseOverride = z.infer<typeof PhaseOverrideSchema>;\nexport type ScheduleOverride = z.infer<typeof ScheduleOverrideSchema>;\nexport type ContextConfig = z.infer<typeof ContextSchema>;\nexport type BackupConfig = z.infer<typeof BackupSchema>;\nexport type TeamConfig = z.infer<typeof TeamSchema>;\nexport type SkillsConfig = z.infer<typeof SkillsSchema>;\nexport type NotificationsConfig = z.infer<typeof NotificationsSchema>;\nexport type SymbiontEntry = z.infer<typeof SymbiontEntrySchema>;\n","/**\n * Config and vault migrations — run once per version, tracked by config_version.\n *\n * Each migration has a version number, a name, and a function that receives\n * the raw parsed YAML doc and the vault directory. Migrations run in order\n * and are skipped if config_version is already past them.\n *\n * To add a new migration:\n * 1. Add an entry to MIGRATIONS with the next version number\n * 2. Write the migrate function — it receives the mutable doc and vaultDir\n * 3. The framework handles version tracking and writing the config back\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface Migration {\n version: number;\n name: string;\n migrate: (doc: Record<string, unknown>, vaultDir: string) => void;\n}\n\n/** Regex matching both quoted and unquoted YAML: type: memory, type: \"memory\", type: 'memory' */\nconst MEMORY_TYPE_PATTERN = /type:\\s*[\"']?memory[\"']?/g;\n\nexport const MIGRATIONS: Migration[] = [\n {\n version: 1,\n name: 'rename-memories-to-spores',\n migrate: (doc, vaultDir) => {\n // Config: rename context.layers.memories → context.layers.spores\n const context = doc.context as Record<string, unknown> | undefined;\n const layers = context?.layers as Record<string, unknown> | undefined;\n if (layers && 'memories' in layers && !('spores' in layers)) {\n layers.spores = layers.memories;\n delete layers.memories;\n }\n\n // Vault: rename memories/ directory → spores/\n const memoriesDir = path.join(vaultDir, 'memories');\n const sporesDir = path.join(vaultDir, 'spores');\n\n if (!fs.existsSync(memoriesDir)) return;\n\n if (fs.existsSync(sporesDir)) {\n // Both exist (interrupted migration) — merge remaining files\n const moveRemaining = (srcDir: string, destDir: string): void => {\n for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {\n const srcPath = path.join(srcDir, entry.name);\n const destPath = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n if (!fs.existsSync(destPath)) fs.mkdirSync(destPath, { recursive: true });\n moveRemaining(srcPath, destPath);\n } else if (!fs.existsSync(destPath)) {\n fs.renameSync(srcPath, destPath);\n }\n }\n };\n moveRemaining(memoriesDir, sporesDir);\n fs.rmSync(memoriesDir, { recursive: true, force: true });\n } else {\n fs.renameSync(memoriesDir, sporesDir);\n }\n\n // Update frontmatter type: memory → type: spore (handles quoted and unquoted)\n const walkUpdate = (dir: string): void => {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) { walkUpdate(fullPath); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(fullPath, 'utf-8');\n MEMORY_TYPE_PATTERN.lastIndex = 0;\n if (MEMORY_TYPE_PATTERN.test(content)) {\n MEMORY_TYPE_PATTERN.lastIndex = 0;\n fs.writeFileSync(fullPath, content.replace(MEMORY_TYPE_PATTERN, 'type: spore'));\n }\n }\n };\n walkUpdate(sporesDir);\n\n // Legacy: update wikilink references in Markdown files (pre-SQLite migration): [[memories/...]] → [[spores/...]]\n const walkLinks = (dir: string): void => {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) { walkLinks(fullPath); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(fullPath, 'utf-8');\n if (content.includes('memories/')) {\n fs.writeFileSync(fullPath, content.replace(/memories\\//g, 'spores/'));\n }\n }\n };\n walkLinks(vaultDir);\n },\n },\n {\n version: 2,\n name: 'consolidation-boolean-to-object',\n migrate: (doc) => {\n const digest = doc.digest as Record<string, unknown> | undefined;\n if (!digest) return;\n\n const consolidation = digest.consolidation;\n if (typeof consolidation === 'boolean') {\n digest.consolidation = { enabled: consolidation, max_tokens: 2048 };\n }\n },\n },\n {\n version: 3,\n name: 'schedule-to-task-level',\n migrate(doc: Record<string, unknown>, _vaultDir: string): void {\n const agent = (doc.agent ?? {}) as Record<string, unknown>;\n const skills = (doc.skills ?? {}) as Record<string, unknown>;\n const tasks = ((agent.tasks ?? {}) as Record<string, Record<string, unknown>>);\n\n /** Default interval for full-intelligence task (5 minutes). */\n const DEFAULT_INTELLIGENCE_INTERVAL_SECONDS = 300;\n\n const VALID_SCHEDULE_STATES = ['active', 'idle', 'sleep'] as const;\n\n // Migrate agent.auto_run + interval_seconds → full-intelligence schedule\n if ('auto_run' in agent || 'interval_seconds' in agent) {\n const fiTask = tasks['full-intelligence'] ?? {};\n fiTask.schedule = {\n enabled: agent.auto_run ?? true,\n intervalSeconds: agent.interval_seconds ?? DEFAULT_INTELLIGENCE_INTERVAL_SECONDS,\n };\n tasks['full-intelligence'] = fiTask;\n delete agent.auto_run;\n delete agent.interval_seconds;\n }\n\n // Migrate skills.auto_survey → skill-survey schedule\n if ('auto_survey' in skills) {\n const ssTask = tasks['skill-survey'] ?? {};\n ssTask.schedule = {\n enabled: skills.auto_survey ?? false,\n };\n tasks['skill-survey'] = ssTask;\n delete skills.auto_survey;\n }\n\n // Migrate skills.auto_evolve + evolve_cadence → skill-evolve schedule\n if ('auto_evolve' in skills || 'evolve_cadence' in skills) {\n const seTask = tasks['skill-evolve'] ?? {};\n const schedule: Record<string, unknown> = {\n enabled: skills.auto_evolve ?? false,\n };\n if ('evolve_cadence' in skills) {\n const cadence = String(skills.evolve_cadence);\n schedule.runIn = VALID_SCHEDULE_STATES.includes(cadence as typeof VALID_SCHEDULE_STATES[number])\n ? [cadence]\n : ['idle']; // fallback to safe default\n }\n seTask.schedule = schedule;\n tasks['skill-evolve'] = seTask;\n delete skills.auto_evolve;\n delete skills.evolve_cadence;\n }\n\n // Write back tasks if any were created\n if (Object.keys(tasks).length > 0) {\n agent.tasks = tasks;\n }\n doc.agent = agent;\n doc.skills = skills;\n },\n },\n {\n version: 4,\n name: 'rename-cloud-provider-to-anthropic',\n migrate(doc: Record<string, unknown>, _vaultDir: string): void {\n // Rename `provider.type: cloud` -> `provider.type: anthropic` everywhere\n // it appears in the agent config: global default, per-task, per-phase.\n const renameProvider = (provider: unknown): void => {\n if (\n provider &&\n typeof provider === 'object' &&\n (provider as Record<string, unknown>).type === 'cloud'\n ) {\n (provider as Record<string, unknown>).type = 'anthropic';\n }\n };\n\n const agent = doc.agent as Record<string, unknown> | undefined;\n if (!agent) return;\n\n // Global default provider\n renameProvider(agent.provider);\n\n // Per-task overrides\n const tasks = agent.tasks as Record<string, Record<string, unknown>> | undefined;\n if (tasks) {\n for (const taskConfig of Object.values(tasks)) {\n renameProvider(taskConfig.provider);\n\n // Per-phase overrides within a task\n const phases = taskConfig.phases as Record<string, Record<string, unknown>> | undefined;\n if (phases) {\n for (const phaseConfig of Object.values(phases)) {\n renameProvider(phaseConfig.provider);\n }\n }\n }\n }\n },\n },\n];\n\n/** Current migration version — the highest version in MIGRATIONS. */\nexport const CURRENT_MIGRATION_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;\n\n/**\n * Run all pending migrations on the raw config doc.\n * Returns true if any migrations ran (caller should reindex).\n */\nexport function runMigrations(\n doc: Record<string, unknown>,\n vaultDir: string,\n log?: (message: string) => void,\n): boolean {\n const currentVersion = (doc.config_version as number) ?? 0;\n let ran = false;\n\n for (const migration of MIGRATIONS) {\n if (migration.version <= currentVersion) continue;\n\n migration.migrate(doc, vaultDir);\n doc.config_version = migration.version;\n ran = true;\n }\n\n if (ran) {\n const from = currentVersion;\n const to = (doc.config_version as number) ?? 0;\n log?.(`Migrated config from v${from} to v${to}`);\n }\n\n return ran;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAEA,kBAAiB;AAFjB,OAAOA,SAAQ;AACf,OAAOC,WAAU;;;ACEjB,IAAM,0BAA0B,iBAAE,OAAO;AAAA,EACvC,UAAU,iBAAE,KAAK,CAAC,UAAU,qBAAqB,cAAc,QAAQ,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAC1F,OAAO,iBAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAClC,UAAU,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACtC,CAAC;AAED,IAAM,eAAe,iBAAE,OAAO;AAAA,EAC5B,MAAM,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACnE,WAAW,iBAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EACpE,oBAAoB,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/D,4BAA4B,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAM,EAAE,QAAQ,KAAK,KAAK,GAAI;AACjF,CAAC;AAED,IAAM,gBAAgB,iBAAE,OAAO;AAAA,EAC7B,kBAAkB,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAChD,WAAW,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,qBAAqB,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,EACxD,mBAAmB,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAG;AAC5D,CAAC;AAGD,IAAM,yBAAyB,iBAAE,OAAO;AAAA,EACtC,MAAM,iBAAE,KAAK,CAAC,aAAa,UAAU,UAAU,CAAC;AAAA,EAChD,UAAU,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,OAAO,iBAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE3B,gBAAgB,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACvD,CAAC;AAGD,IAAM,sBAAsB,iBAAE,OAAO;AAAA,EACnC,UAAU,uBAAuB,SAAS;AAAA,EAC1C,OAAO,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACjD,CAAC;AAGD,IAAM,yBAAyB,iBAAE,OAAO;AAAA,EACtC,SAAS,iBAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,iBAAiB,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACtD,OAAO,iBAAE,MAAM,iBAAE,KAAK,CAAC,GAAG,wBAAwB,CAAC,CAAC,EAAE,SAAS;AAAA,EAC/D,cAAc,iBAAE,KAAK,CAAC,2BAA2B,qBAAqB,yBAAyB,CAAC,EAAE,SAAS;AAC7G,CAAC,EAAE,SAAS;AAGZ,IAAM,6BAA6B,iBAAE,OAAO;AAAA,EAC1C,UAAU,uBAAuB,SAAS;AAAA,EAC1C,OAAO,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,gBAAgB,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACrD,QAAQ,iBAAE,OAAO,iBAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAAA,EAC3D,UAAU;AAAA;AAAA,EAEV,QAAQ,iBAAE,OAAO,iBAAE,OAAO,GAAG,iBAAE,MAAM,CAAC,iBAAE,OAAO,GAAG,iBAAE,OAAO,GAAG,iBAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS;AACxF,CAAC;AAED,IAAM,gBAAgB,iBAAE,OAAO;AAAA;AAAA,EAE7B,aAAa,iBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAI;AAAA;AAAA,EAE1C,eAAe,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEvC,mBAAmB,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAC9D,CAAC;AAED,IAAM,cAAc,iBAAE,OAAO;AAAA;AAAA,EAE3B,wBAAwB,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEzD,yBAAyB,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEjD,qBAAqB,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAE7C,UAAU,uBAAuB,SAAS;AAAA;AAAA,EAE1C,OAAO,iBAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE3B,OAAO,iBAAE,OAAO,iBAAE,OAAO,GAAG,0BAA0B,EAAE,SAAS;AACnE,CAAC;AAED,IAAM,eAAe,iBAAE,OAAO;AAAA;AAAA,EAE5B,KAAK,iBAAE,OAAO,EAAE,SAAS;AAC3B,CAAC;AAED,IAAM,oBAAoB,iBAAE,OAAO;AAAA;AAAA,EAEjC,eAAe,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEvC,8BAA8B,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAC3E,CAAC;AAED,IAAM,aAAa,iBAAE,OAAO;AAAA;AAAA,EAE1B,SAAS,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAElC,YAAY,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAEtC,SAAS,iBAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE7B,kBAAkB,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,QAAQ,EAAE;AAChE,CAAC;AAED,IAAM,eAAe,iBAAE,OAAO;AAAA;AAAA,EAE5B,sBAAsB,iBAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;AAAA;AAAA,EAE1D,kBAAkB,iBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;AAC1D,CAAC;AAED,IAAM,sBAAsB,iBAAE,OAAO;AAAA;AAAA,EAEnC,SAAS,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEjC,sBAAsB,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAE/C,cAAc,iBAAE,KAAK,CAAC,UAAU,SAAS,CAAC,EAAE,QAAQ,QAAQ;AAAA;AAAA,EAE5D,SAAS,iBAAE,OAAO,iBAAE,OAAO,GAAG,iBAAE,OAAO;AAAA,IACrC,SAAS,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,IAEjC,MAAM,iBAAE,KAAK,CAAC,UAAU,SAAS,CAAC,EAAE,SAAS;AAAA,EAC/C,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChB,CAAC;AAED,IAAM,sBAAsB,iBAAE,OAAO;AAAA,EACnC,SAAS,iBAAE,QAAQ,EAAE,QAAQ,IAAI;AACnC,CAAC;AAEM,IAAM,mBAAmB,iBAAE;AAAA,EAChC,CAAC,QAAiB;AAChB,QAAI,OAAO,OAAO,QAAQ,YAAY,cAAc,OAAO,EAAE,WAAW,MAAM;AAC5E,YAAM,EAAE,UAAU,GAAG,KAAK,IAAI;AAC9B,aAAO,EAAE,GAAG,MAAM,OAAO,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EACA,iBAAE,OAAO;AAAA,IACP,SAAS,iBAAE,QAAQ,CAAC;AAAA,IACpB,gBAAgB,iBAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;AAAA,IACxD,WAAW,wBAAwB,QAAQ,MAAM,wBAAwB,MAAM,CAAC,CAAC,CAAC;AAAA,IAClF,QAAQ,aAAa,QAAQ,MAAM,aAAa,MAAM,CAAC,CAAC,CAAC;AAAA,IACzD,SAAS,cAAc,QAAQ,MAAM,cAAc,MAAM,CAAC,CAAC,CAAC;AAAA,IAC5D,OAAO,YAAY,QAAQ,MAAM,YAAY,MAAM,CAAC,CAAC,CAAC;AAAA,IACtD,SAAS,cAAc,QAAQ,MAAM,cAAc,MAAM,CAAC,CAAC,CAAC;AAAA,IAC5D,QAAQ,aAAa,QAAQ,MAAM,aAAa,MAAM,CAAC,CAAC,CAAC;AAAA,IACzD,aAAa,kBAAkB,QAAQ,MAAM,kBAAkB,MAAM,CAAC,CAAC,CAAC;AAAA,IACxE,MAAM,WAAW,QAAQ,MAAM,WAAW,MAAM,CAAC,CAAC,CAAC;AAAA,IACnD,QAAQ,aAAa,QAAQ,MAAM,aAAa,MAAM,CAAC,CAAC,CAAC;AAAA,IACzD,eAAe,oBAAoB,QAAQ,MAAM,oBAAoB,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9E,WAAW,iBAAE,OAAO,iBAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAAA,EAChE,CAAC;AACH;;;ACpJA,OAAO,QAAQ;AACf,OAAO,UAAU;AASjB,IAAM,sBAAsB;AAErB,IAAM,aAA0B;AAAA,EACrC;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,KAAK,aAAa;AAE1B,YAAM,UAAU,IAAI;AACpB,YAAM,SAAS,SAAS;AACxB,UAAI,UAAU,cAAc,UAAU,EAAE,YAAY,SAAS;AAC3D,eAAO,SAAS,OAAO;AACvB,eAAO,OAAO;AAAA,MAChB;AAGA,YAAM,cAAc,KAAK,KAAK,UAAU,UAAU;AAClD,YAAM,YAAY,KAAK,KAAK,UAAU,QAAQ;AAE9C,UAAI,CAAC,GAAG,WAAW,WAAW,EAAG;AAEjC,UAAI,GAAG,WAAW,SAAS,GAAG;AAE5B,cAAM,gBAAgB,CAAC,QAAgB,YAA0B;AAC/D,qBAAW,SAAS,GAAG,YAAY,QAAQ,EAAE,eAAe,KAAK,CAAC,GAAG;AACnE,kBAAM,UAAU,KAAK,KAAK,QAAQ,MAAM,IAAI;AAC5C,kBAAM,WAAW,KAAK,KAAK,SAAS,MAAM,IAAI;AAC9C,gBAAI,MAAM,YAAY,GAAG;AACvB,kBAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACxE,4BAAc,SAAS,QAAQ;AAAA,YACjC,WAAW,CAAC,GAAG,WAAW,QAAQ,GAAG;AACnC,iBAAG,WAAW,SAAS,QAAQ;AAAA,YACjC;AAAA,UACF;AAAA,QACF;AACA,sBAAc,aAAa,SAAS;AACpC,WAAG,OAAO,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACzD,OAAO;AACL,WAAG,WAAW,aAAa,SAAS;AAAA,MACtC;AAGA,YAAM,aAAa,CAAC,QAAsB;AACxC,mBAAW,SAAS,GAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,gBAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,cAAI,MAAM,YAAY,GAAG;AAAE,uBAAW,QAAQ;AAAG;AAAA,UAAU;AAC3D,cAAI,CAAC,MAAM,KAAK,SAAS,KAAK,EAAG;AACjC,gBAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,8BAAoB,YAAY;AAChC,cAAI,oBAAoB,KAAK,OAAO,GAAG;AACrC,gCAAoB,YAAY;AAChC,eAAG,cAAc,UAAU,QAAQ,QAAQ,qBAAqB,aAAa,CAAC;AAAA,UAChF;AAAA,QACF;AAAA,MACF;AACA,iBAAW,SAAS;AAGpB,YAAM,YAAY,CAAC,QAAsB;AACvC,mBAAW,SAAS,GAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,gBAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,cAAI,MAAM,YAAY,GAAG;AAAE,sBAAU,QAAQ;AAAG;AAAA,UAAU;AAC1D,cAAI,CAAC,MAAM,KAAK,SAAS,KAAK,EAAG;AACjC,gBAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,cAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,eAAG,cAAc,UAAU,QAAQ,QAAQ,eAAe,SAAS,CAAC;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ;AAChB,YAAM,SAAS,IAAI;AACnB,UAAI,CAAC,OAAQ;AAEb,YAAM,gBAAgB,OAAO;AAC7B,UAAI,OAAO,kBAAkB,WAAW;AACtC,eAAO,gBAAgB,EAAE,SAAS,eAAe,YAAY,KAAK;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ,KAA8B,WAAyB;AAC7D,YAAM,QAAS,IAAI,SAAS,CAAC;AAC7B,YAAM,SAAU,IAAI,UAAU,CAAC;AAC/B,YAAM,QAAU,MAAM,SAAS,CAAC;AAGhC,YAAM,wCAAwC;AAE9C,YAAM,wBAAwB,CAAC,UAAU,QAAQ,OAAO;AAGxD,UAAI,cAAc,SAAS,sBAAsB,OAAO;AACtD,cAAM,SAAS,MAAM,mBAAmB,KAAK,CAAC;AAC9C,eAAO,WAAW;AAAA,UAChB,SAAS,MAAM,YAAY;AAAA,UAC3B,iBAAiB,MAAM,oBAAoB;AAAA,QAC7C;AACA,cAAM,mBAAmB,IAAI;AAC7B,eAAO,MAAM;AACb,eAAO,MAAM;AAAA,MACf;AAGA,UAAI,iBAAiB,QAAQ;AAC3B,cAAM,SAAS,MAAM,cAAc,KAAK,CAAC;AACzC,eAAO,WAAW;AAAA,UAChB,SAAS,OAAO,eAAe;AAAA,QACjC;AACA,cAAM,cAAc,IAAI;AACxB,eAAO,OAAO;AAAA,MAChB;AAGA,UAAI,iBAAiB,UAAU,oBAAoB,QAAQ;AACzD,cAAM,SAAS,MAAM,cAAc,KAAK,CAAC;AACzC,cAAM,WAAoC;AAAA,UACxC,SAAS,OAAO,eAAe;AAAA,QACjC;AACA,YAAI,oBAAoB,QAAQ;AAC9B,gBAAM,UAAU,OAAO,OAAO,cAAc;AAC5C,mBAAS,QAAQ,sBAAsB,SAAS,OAA+C,IAC3F,CAAC,OAAO,IACR,CAAC,MAAM;AAAA,QACb;AACA,eAAO,WAAW;AAClB,cAAM,cAAc,IAAI;AACxB,eAAO,OAAO;AACd,eAAO,OAAO;AAAA,MAChB;AAGA,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,cAAM,QAAQ;AAAA,MAChB;AACA,UAAI,QAAQ;AACZ,UAAI,SAAS;AAAA,IACf;AAAA,EACF;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ,KAA8B,WAAyB;AAG7D,YAAM,iBAAiB,CAAC,aAA4B;AAClD,YACE,YACA,OAAO,aAAa,YACnB,SAAqC,SAAS,SAC/C;AACA,UAAC,SAAqC,OAAO;AAAA,QAC/C;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI;AAClB,UAAI,CAAC,MAAO;AAGZ,qBAAe,MAAM,QAAQ;AAG7B,YAAM,QAAQ,MAAM;AACpB,UAAI,OAAO;AACT,mBAAW,cAAc,OAAO,OAAO,KAAK,GAAG;AAC7C,yBAAe,WAAW,QAAQ;AAGlC,gBAAM,SAAS,WAAW;AAC1B,cAAI,QAAQ;AACV,uBAAW,eAAe,OAAO,OAAO,MAAM,GAAG;AAC/C,6BAAe,YAAY,QAAQ;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,4BAA4B,WAAW,WAAW,SAAS,CAAC,GAAG,WAAW;AAMhF,SAAS,cACd,KACA,UACA,KACS;AACT,QAAM,iBAAkB,IAAI,kBAA6B;AACzD,MAAI,MAAM;AAEV,aAAW,aAAa,YAAY;AAClC,QAAI,UAAU,WAAW,eAAgB;AAEzC,cAAU,QAAQ,KAAK,QAAQ;AAC/B,QAAI,iBAAiB,UAAU;AAC/B,UAAM;AAAA,EACR;AAEA,MAAI,KAAK;AACP,UAAM,OAAO;AACb,UAAM,KAAM,IAAI,kBAA6B;AAC7C,UAAM,yBAAyB,IAAI,QAAQ,EAAE,EAAE;AAAA,EACjD;AAEA,SAAO;AACT;;;AF1OO,IAAM,kBAAkB;AAExB,SAAS,WAAW,UAA8B;AACvD,QAAM,aAAaC,MAAK,KAAK,UAAU,eAAe;AAEtD,MAAI,CAACC,IAAG,WAAW,UAAU,GAAG;AAC9B,UAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,EACtD;AAEA,QAAM,MAAMA,IAAG,aAAa,YAAY,OAAO;AAC/C,QAAM,SAAS,YAAAC,QAAK,MAAM,GAAG;AAG7B,MAAI,OAAO,YAAY,KAAM,OAAO,cAA0C,SAAS;AACrF,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa;AACjB,MAAI,OAAO,YAAY,GAAG;AAExB,UAAM,QAAQ,OAAO;AACrB,UAAM,kBAAkB,OAAO;AAC/B,QAAI,mBAAmB,CAAC,OAAO,WAAW;AAExC,UAAI,gBAAgB,aAAa,aAAa;AAC5C,wBAAgB,WAAW;AAAA,MAC7B;AACA,aAAO,YAAY;AAAA,IACrB;AAGA,UAAM,SAAS,OAAO;AACtB,QAAI,QAAQ;AACV,YAAM,EAAE,MAAM,UAAU,IAAI;AAC5B,aAAO,SAAS,EAAE,MAAM,QAAQ,MAAM,WAAW,aAAa,OAAO;AAAA,IACvE;AAGA,UAAM,UAAU,OAAO;AACvB,QAAI,SAAS;AACX,YAAM,EAAE,kBAAkB,gBAAgB,WAAW,qBAAqB,kBAAkB,IAAI;AAChG,aAAO,UAAU;AAAA,QACf;AAAA,QACA,WAAW,aAAa;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,WAAO,OAAO;AACd,WAAO,OAAO;AACd,WAAO,OAAO;AACd,WAAO,OAAO;AACd,WAAO,OAAO;AAGd,WAAO,UAAU;AACjB,iBAAa;AAEb,YAAQ,OAAO,MAAM,kDAAkD;AAAA,EACzE;AAGA,QAAM,gBAAgB,cAAc,QAAQ,UAAU,CAAC,QAAQ;AAC7D,YAAQ,OAAO,MAAM,oBAAoB,GAAG;AAAA,CAAI;AAAA,EAClD,CAAC;AAGD,QAAM,SAAS,iBAAiB,MAAM,MAAM;AAG5C,QAAM,aAAa,cACd,kBACC,OAAO,kBAA4B,KAAK,6BACzC,OAAO,YAAY,OAAO;AAE/B,MAAI,YAAY;AACd,UAAM,aAAa,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AACpD,IAAAD,IAAG,cAAc,YAAY,YAAAC,QAAK,UAAU,UAAU,GAAG,OAAO;AAAA,EAClE;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,UAAkB,QAA0B;AAErE,QAAM,YAAY,iBAAiB,MAAM,MAAM;AAE/C,QAAM,aAAaF,MAAK,KAAK,UAAU,eAAe;AACtD,EAAAC,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAC1C,EAAAA,IAAG,cAAc,YAAY,YAAAC,QAAK,UAAU,SAAS,GAAG,OAAO;AACjE;AAEO,SAAS,aACd,UACA,IACY;AACZ,QAAM,UAAU,WAAW,QAAQ;AACnC,QAAM,UAAU,GAAG,OAAO;AAC1B,aAAW,UAAU,OAAO;AAC5B,SAAO;AACT;AAEO,SAAS,mBACd,UACA,QACY;AACZ,SAAO,aAAa,UAAU,CAAC,YAAY;AAAA,IACzC,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,OAAO,QAAQ,GAAG,OAAO;AAAA,EACxC,EAAE;AACJ;AAOO,SAAS,wBAAwB,QAAwC;AAC9E,MAAI,CAAC,OAAO,UAAW,QAAO;AAC9B,SAAO,IAAI;AAAA,IACT,OAAO,QAAQ,OAAO,SAAS,EAC5B,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,EACnC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAAA,EACzB;AACF;AAEO,SAAS,iBACd,UACA,MACY;AACZ,SAAO,aAAa,UAAU,CAAC,YAAY;AAAA,IACzC,GAAG;AAAA,IACH,MAAM,EAAE,GAAG,OAAO,MAAM,GAAG,KAAK;AAAA,EAClC,EAAE;AACJ;","names":["fs","path","path","fs","YAML"]}
@@ -2,12 +2,12 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  LmStudioBackend,
4
4
  OllamaBackend
5
- } from "./chunk-KSXTNYXO.js";
5
+ } from "./chunk-PMT2LSTQ.js";
6
6
  import {
7
7
  EMBEDDING_REQUEST_TIMEOUT_MS,
8
8
  LLM_REQUEST_TIMEOUT_MS,
9
9
  PROVIDER_DETECT_TIMEOUT_MS
10
- } from "./chunk-W4VHC2ES.js";
10
+ } from "./chunk-I54KLC6H.js";
11
11
 
12
12
  // ../../node_modules/@anthropic-ai/sdk/internal/tslib.mjs
13
13
  function __classPrivateFieldSet(receiver, state, value, kind, f) {
@@ -5953,4 +5953,4 @@ export {
5953
5953
  createLlmProvider,
5954
5954
  createEmbeddingProvider
5955
5955
  };
5956
- //# sourceMappingURL=chunk-LLJMDXO2.js.map
5956
+ //# sourceMappingURL=chunk-3J6TUJSV.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  DEFAULT_MACHINE_ID,
4
4
  epochSeconds
5
- } from "./chunk-W4VHC2ES.js";
5
+ } from "./chunk-I54KLC6H.js";
6
6
 
7
7
  // src/db/schema-ddl.ts
8
8
  var SCHEMA_VERSION_TABLE = `
@@ -1055,4 +1055,4 @@ export {
1055
1055
  EMBEDDING_DIMENSIONS,
1056
1056
  createSchema
1057
1057
  };
1058
- //# sourceMappingURL=chunk-2LN2BBKA.js.map
1058
+ //# sourceMappingURL=chunk-6DDRJQ4X.js.map
@@ -2,10 +2,10 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  LmStudioBackend,
4
4
  OllamaBackend
5
- } from "./chunk-KSXTNYXO.js";
5
+ } from "./chunk-PMT2LSTQ.js";
6
6
  import {
7
7
  PROVIDER_DETECT_TIMEOUT_MS
8
- } from "./chunk-W4VHC2ES.js";
8
+ } from "./chunk-I54KLC6H.js";
9
9
 
10
10
  // src/intelligence/provider-check.ts
11
11
  async function checkLocalProvider(type, baseUrl) {
@@ -19,4 +19,4 @@ async function checkLocalProvider(type, baseUrl) {
19
19
  export {
20
20
  checkLocalProvider
21
21
  };
22
- //# sourceMappingURL=chunk-YPWF322W.js.map
22
+ //# sourceMappingURL=chunk-6ZDJXSEO.js.map
@@ -5,22 +5,24 @@ import {
5
5
  import {
6
6
  SEARCH_PREVIEW_CHARS,
7
7
  SEARCH_RESULTS_DEFAULT_LIMIT
8
- } from "./chunk-W4VHC2ES.js";
8
+ } from "./chunk-I54KLC6H.js";
9
9
 
10
10
  // src/db/queries/search.ts
11
11
  function fullTextSearch(query, options = {}) {
12
12
  const db = getDatabase();
13
13
  const limit = options.limit ?? SEARCH_RESULTS_DEFAULT_LIMIT;
14
14
  const typeFilter = options.type;
15
+ const excludeActive = options.includeActive === false;
15
16
  const results = [];
16
17
  if (typeFilter === void 0 || typeFilter === "prompt_batch") {
18
+ const activeGate = excludeActive ? ` AND EXISTS (SELECT 1 FROM sessions s WHERE s.id = pb.session_id AND s.status != 'active')` : "";
17
19
  const batchRows = db.prepare(
18
20
  `SELECT pb.id, pb.prompt_number, pb.session_id,
19
21
  substr(COALESCE(pb.user_prompt, '') || ' ' || COALESCE(pb.response_summary, ''), 1, ?) AS preview,
20
22
  fts.rank
21
23
  FROM prompt_batches_fts fts
22
24
  JOIN prompt_batches pb ON pb.id = fts.rowid
23
- WHERE prompt_batches_fts MATCH ?
25
+ WHERE prompt_batches_fts MATCH ?${activeGate}
24
26
  ORDER BY fts.rank
25
27
  LIMIT ?`
26
28
  ).all(SEARCH_PREVIEW_CHARS, query, limit);
@@ -36,12 +38,13 @@ function fullTextSearch(query, options = {}) {
36
38
  }
37
39
  }
38
40
  if (typeFilter === void 0 || typeFilter === "activity") {
41
+ const activeGate = excludeActive ? ` AND EXISTS (SELECT 1 FROM sessions s WHERE s.id = a.session_id AND s.status != 'active')` : "";
39
42
  const activityRows = db.prepare(
40
43
  `SELECT a.id, a.tool_name, a.tool_input, a.file_path, a.session_id,
41
44
  fts.rank
42
45
  FROM activities_fts fts
43
46
  JOIN activities a ON a.id = fts.rowid
44
- WHERE activities_fts MATCH ?
47
+ WHERE activities_fts MATCH ?${activeGate}
45
48
  ORDER BY fts.rank
46
49
  LIMIT ?`
47
50
  ).all(query, limit);
@@ -58,13 +61,14 @@ function fullTextSearch(query, options = {}) {
58
61
  }
59
62
  }
60
63
  if (typeFilter === void 0 || typeFilter === "spore") {
64
+ const activeGate = excludeActive ? ` AND (s.session_id IS NULL OR EXISTS (SELECT 1 FROM sessions ss WHERE ss.id = s.session_id AND ss.status != 'active'))` : "";
61
65
  const sporeRows = db.prepare(
62
66
  `SELECT s.id, s.observation_type, s.session_id,
63
67
  substr(COALESCE(s.content, ''), 1, ?) AS preview,
64
68
  fts.rank
65
69
  FROM spores_fts fts
66
70
  JOIN spores s ON s.rowid = fts.rowid
67
- WHERE spores_fts MATCH ?
71
+ WHERE spores_fts MATCH ?${activeGate}
68
72
  ORDER BY fts.rank
69
73
  LIMIT ?`
70
74
  ).all(SEARCH_PREVIEW_CHARS, query, limit);
@@ -80,13 +84,14 @@ function fullTextSearch(query, options = {}) {
80
84
  }
81
85
  }
82
86
  if (typeFilter === void 0 || typeFilter === "session") {
87
+ const activeGate = excludeActive ? ` AND s.status != 'active'` : "";
83
88
  const sessionRows = db.prepare(
84
89
  `SELECT s.id, s.title,
85
90
  substr(COALESCE(s.summary, s.title, ''), 1, ?) AS preview,
86
91
  fts.rank
87
92
  FROM sessions_fts fts
88
93
  JOIN sessions s ON s.rowid = fts.rowid
89
- WHERE sessions_fts MATCH ?
94
+ WHERE sessions_fts MATCH ?${activeGate}
90
95
  ORDER BY fts.rank
91
96
  LIMIT ?`
92
97
  ).all(SEARCH_PREVIEW_CHARS, query, limit);
@@ -223,4 +228,4 @@ export {
223
228
  fullTextSearch,
224
229
  hydrateSearchResults
225
230
  };
226
- //# sourceMappingURL=chunk-2DF4OZ2D.js.map
231
+ //# sourceMappingURL=chunk-7ONVLO43.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/queries/search.ts"],"sourcesContent":["/**\n * Full-text search using SQLite FTS5.\n *\n * Searches prompt_batches and activities via their FTS5 virtual tables.\n * Semantic search (vector similarity) is handled by the external VectorStore —\n * this module covers text-based retrieval only.\n *\n * All queries use parameterized placeholders throughout.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport {\n SEARCH_RESULTS_DEFAULT_LIMIT,\n SEARCH_PREVIEW_CHARS,\n} from '@myco/constants.js';\nimport type { VectorSearchResult } from '@myco/daemon/embedding/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** All result types that can appear in search results. */\nexport type SearchResultType =\n | 'session'\n | 'spore'\n | 'plan'\n | 'artifact'\n | 'prompt_batch'\n | 'activity'\n | 'skill';\n\n/** A single result returned from full-text or semantic search. */\nexport interface SearchResult {\n id: string;\n type: SearchResultType;\n title: string;\n preview: string;\n score: number;\n session_id?: string;\n}\n\n/** Options for fullTextSearch. */\nexport interface SearchOptions {\n /** Restrict results to a single type. */\n type?: string;\n /** Maximum number of results to return (default: SEARCH_RESULTS_DEFAULT_LIMIT). */\n limit?: number;\n /**\n * When explicitly `false`, hide results belonging to sessions still in\n * `status = 'active'` (and active sessions themselves). Intelligence-task\n * reads opt in to this; UI/CLI callers leave it unset.\n */\n includeActive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Full-text search across capture tables using SQLite FTS5.\n *\n * Searches prompt_batches (indexed on user_prompt) and activities (indexed\n * on tool_name, tool_input, file_path). The raw query string is passed\n * directly to FTS5 MATCH — callers should sanitize if needed.\n *\n * FTS5 `rank` values are negative (lower = better match). This function\n * converts them to positive scores via `Math.abs()` so higher = better\n * in the returned results.\n *\n * When `options.type` is specified, only the matching table branch is queried.\n *\n * @param query — search string (FTS5 MATCH syntax)\n * @param options — optional type filter and result limit\n * @returns SearchResult[] ordered by score DESC\n */\nexport function fullTextSearch(\n query: string,\n options: SearchOptions = {},\n): SearchResult[] {\n const db = getDatabase();\n const limit = options.limit ?? SEARCH_RESULTS_DEFAULT_LIMIT;\n const typeFilter = options.type;\n const excludeActive = options.includeActive === false;\n\n const results: SearchResult[] = [];\n\n // -- prompt_batches branch ------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'prompt_batch') {\n const activeGate = excludeActive\n ? ` AND EXISTS (SELECT 1 FROM sessions s WHERE s.id = pb.session_id AND s.status != 'active')`\n : '';\n const batchRows = db.prepare(\n `SELECT pb.id, pb.prompt_number, pb.session_id,\n substr(COALESCE(pb.user_prompt, '') || ' ' || COALESCE(pb.response_summary, ''), 1, ?) AS preview,\n fts.rank\n FROM prompt_batches_fts fts\n JOIN prompt_batches pb ON pb.id = fts.rowid\n WHERE prompt_batches_fts MATCH ?${activeGate}\n ORDER BY fts.rank\n LIMIT ?`\n ).all(SEARCH_PREVIEW_CHARS, query, limit) as Array<{\n id: number;\n prompt_number: number | null;\n session_id: string | null;\n preview: string;\n rank: number;\n }>;\n\n for (const row of batchRows) {\n results.push({\n id: String(row.id),\n type: 'prompt_batch',\n title: row.prompt_number != null\n ? `Batch #${row.prompt_number}`\n : `Batch ${row.id}`,\n preview: row.preview,\n score: Math.abs(row.rank),\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // -- activities branch ----------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'activity') {\n const activeGate = excludeActive\n ? ` AND EXISTS (SELECT 1 FROM sessions s WHERE s.id = a.session_id AND s.status != 'active')`\n : '';\n const activityRows = db.prepare(\n `SELECT a.id, a.tool_name, a.tool_input, a.file_path, a.session_id,\n fts.rank\n FROM activities_fts fts\n JOIN activities a ON a.id = fts.rowid\n WHERE activities_fts MATCH ?${activeGate}\n ORDER BY fts.rank\n LIMIT ?`\n ).all(query, limit) as Array<{\n id: number;\n tool_name: string;\n tool_input: string | null;\n file_path: string | null;\n session_id: string | null;\n rank: number;\n }>;\n\n for (const row of activityRows) {\n const preview = (row.tool_input ?? row.file_path ?? '').slice(0, SEARCH_PREVIEW_CHARS);\n results.push({\n id: String(row.id),\n type: 'activity',\n title: row.tool_name,\n preview,\n score: Math.abs(row.rank),\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // -- spores branch --------------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'spore') {\n // Spores may have a NULL session_id (agent-authored, no source session),\n // which are always kept; only spores attached to still-active sessions\n // are excluded when the gate is on.\n const activeGate = excludeActive\n ? ` AND (s.session_id IS NULL OR EXISTS (SELECT 1 FROM sessions ss WHERE ss.id = s.session_id AND ss.status != 'active'))`\n : '';\n const sporeRows = db.prepare(\n `SELECT s.id, s.observation_type, s.session_id,\n substr(COALESCE(s.content, ''), 1, ?) AS preview,\n fts.rank\n FROM spores_fts fts\n JOIN spores s ON s.rowid = fts.rowid\n WHERE spores_fts MATCH ?${activeGate}\n ORDER BY fts.rank\n LIMIT ?`\n ).all(SEARCH_PREVIEW_CHARS, query, limit) as Array<{\n id: string;\n observation_type: string;\n session_id: string | null;\n preview: string;\n rank: number;\n }>;\n\n for (const row of sporeRows) {\n results.push({\n id: String(row.id),\n type: 'spore',\n title: row.observation_type,\n preview: row.preview,\n score: Math.abs(row.rank),\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // -- sessions branch ------------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'session') {\n const activeGate = excludeActive ? ` AND s.status != 'active'` : '';\n const sessionRows = db.prepare(\n `SELECT s.id, s.title,\n substr(COALESCE(s.summary, s.title, ''), 1, ?) AS preview,\n fts.rank\n FROM sessions_fts fts\n JOIN sessions s ON s.rowid = fts.rowid\n WHERE sessions_fts MATCH ?${activeGate}\n ORDER BY fts.rank\n LIMIT ?`\n ).all(SEARCH_PREVIEW_CHARS, query, limit) as Array<{\n id: string;\n title: string | null;\n preview: string;\n rank: number;\n }>;\n\n for (const row of sessionRows) {\n results.push({\n id: String(row.id),\n type: 'session',\n title: row.title ?? `Session ${row.id.slice(-6)}`,\n preview: row.preview,\n score: Math.abs(row.rank),\n });\n }\n }\n\n // Sort combined results by score DESC and apply limit.\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, limit);\n}\n\n// ---------------------------------------------------------------------------\n// Hydration — convert VectorSearchResults into SearchResults\n// ---------------------------------------------------------------------------\n\n/** Row shape returned from sessions table for hydration. */\ninterface SessionRow {\n id: string;\n title: string | null;\n summary: string | null;\n session_id?: undefined;\n}\n\n/** Row shape returned from spores table for hydration. */\ninterface SporeRow {\n id: string;\n observation_type: string;\n content: string;\n session_id: string | null;\n}\n\n/** Row shape returned from plans table for hydration. */\ninterface PlanRow {\n id: string;\n title: string | null;\n content: string | null;\n session_id: string | null;\n}\n\n/** Row shape returned from artifacts table for hydration. */\ninterface ArtifactRow {\n id: string;\n title: string;\n content: string | null;\n}\n\n/**\n * Hydrate vector search results into SearchResults by fetching full records\n * from the record store.\n *\n * Groups results by namespace, queries each table for the relevant IDs, then\n * maps them into SearchResult format with titles and previews.\n */\nexport function hydrateSearchResults(\n vectorResults: VectorSearchResult[],\n): SearchResult[] {\n if (vectorResults.length === 0) return [];\n\n const db = getDatabase();\n const results: SearchResult[] = [];\n\n // Group result IDs by namespace\n const byNamespace = new Map<string, VectorSearchResult[]>();\n for (const vr of vectorResults) {\n const group = byNamespace.get(vr.namespace) ?? [];\n group.push(vr);\n byNamespace.set(vr.namespace, group);\n }\n\n // Use json_each so the statement text is stable and SQLite can cache the plan.\n const sessionStmt = db.prepare(\n `SELECT id, title, summary FROM sessions WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const sporeStmt = db.prepare(\n `SELECT id, observation_type, content, session_id FROM spores WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const planStmt = db.prepare(\n `SELECT id, title, content, session_id FROM plans WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const artifactStmt = db.prepare(\n `SELECT id, title, content FROM artifacts WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const skillStmt = db.prepare(\n `SELECT id, name, display_name, description FROM skill_records WHERE id IN (SELECT value FROM json_each(?))`,\n );\n\n // --- sessions ---\n const sessionResults = byNamespace.get('sessions');\n if (sessionResults && sessionResults.length > 0) {\n const ids = sessionResults.map((r) => r.id);\n const rows = sessionStmt.all(JSON.stringify(ids)) as SessionRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of sessionResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'session',\n title: row.title ?? `Session ${row.id.slice(-6)}`,\n preview: (row.summary ?? '').slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n });\n }\n }\n\n // --- spores ---\n const sporeResults = byNamespace.get('spores');\n if (sporeResults && sporeResults.length > 0) {\n const ids = sporeResults.map((r) => r.id);\n const rows = sporeStmt.all(JSON.stringify(ids)) as SporeRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of sporeResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'spore',\n title: row.observation_type,\n preview: row.content.slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // --- plans ---\n const planResults = byNamespace.get('plans');\n if (planResults && planResults.length > 0) {\n const ids = planResults.map((r) => r.id);\n const rows = planStmt.all(JSON.stringify(ids)) as PlanRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of planResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'plan',\n title: row.title ?? `Plan ${row.id.slice(-6)}`,\n preview: (row.content ?? '').slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // --- artifacts ---\n const artifactResults = byNamespace.get('artifacts');\n if (artifactResults && artifactResults.length > 0) {\n const ids = artifactResults.map((r) => r.id);\n const rows = artifactStmt.all(JSON.stringify(ids)) as ArtifactRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of artifactResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'artifact',\n title: row.title,\n preview: (row.content ?? '').slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n });\n }\n }\n\n // --- skill_records ---\n const skillResults = byNamespace.get('skill_records');\n if (skillResults && skillResults.length > 0) {\n const ids = skillResults.map((r) => r.id);\n const rows = skillStmt.all(JSON.stringify(ids)) as Array<{ id: string; name: string; display_name: string; description: string }>;\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of skillResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'skill',\n title: row.display_name || row.name,\n preview: row.description.slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n });\n }\n }\n\n // Preserve the original similarity-based ordering from vector search\n results.sort((a, b) => b.score - a.score);\n return results;\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-MYX5NCRH.js";
5
5
  import {
6
6
  DEFAULT_MACHINE_ID
7
- } from "./chunk-W4VHC2ES.js";
7
+ } from "./chunk-I54KLC6H.js";
8
8
 
9
9
  // src/daemon/team-context.ts
10
10
  var teamSyncEnabled = false;
@@ -224,4 +224,4 @@ export {
224
224
  markSourceRowsSynced,
225
225
  backfillUnsynced
226
226
  };
227
- //# sourceMappingURL=chunk-INWD6AIQ.js.map
227
+ //# sourceMappingURL=chunk-AULBWINA.js.map
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  normalizeHookInput,
7
7
  readStdin
8
- } from "./chunk-MS6FDV45.js";
8
+ } from "./chunk-WKNAKQKA.js";
9
9
  import {
10
10
  resolveVaultDir
11
11
  } from "./chunk-5ZT2Q6P5.js";
12
12
  import {
13
13
  DaemonClient
14
- } from "./chunk-CYBC2HZ3.js";
14
+ } from "./chunk-QMTXVFA7.js";
15
15
 
16
16
  // src/hooks/send-event.ts
17
17
  import fs from "fs";
@@ -39,4 +39,4 @@ async function sendEvent(hookName, buildEvent) {
39
39
  export {
40
40
  sendEvent
41
41
  };
42
- //# sourceMappingURL=chunk-UW6DGPSV.js.map
42
+ //# sourceMappingURL=chunk-D5X4MMKR.js.map
@@ -11,7 +11,7 @@ var cached;
11
11
  function getPluginVersion() {
12
12
  if (cached) return cached;
13
13
  if (true) {
14
- cached = "0.19.0";
14
+ cached = "0.19.2";
15
15
  return cached;
16
16
  }
17
17
  const root = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
@@ -32,4 +32,4 @@ function getPluginVersion() {
32
32
  export {
33
33
  getPluginVersion
34
34
  };
35
- //# sourceMappingURL=chunk-2CKDAFSX.js.map
35
+ //# sourceMappingURL=chunk-DDOPAV5O.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  kindToComponent
4
- } from "./chunk-E7NUADTQ.js";
4
+ } from "./chunk-UUHLLQXO.js";
5
5
 
6
6
  // src/daemon/logger.ts
7
7
  import fs from "fs";
@@ -113,4 +113,4 @@ export {
113
113
  LEVEL_ORDER,
114
114
  DaemonLogger
115
115
  };
116
- //# sourceMappingURL=chunk-MVBCON4D.js.map
116
+ //# sourceMappingURL=chunk-DURKJTVO.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  getTeamMachineId,
4
4
  syncRow
5
- } from "./chunk-INWD6AIQ.js";
5
+ } from "./chunk-AULBWINA.js";
6
6
  import {
7
7
  getDatabase
8
8
  } from "./chunk-MYX5NCRH.js";
@@ -128,6 +128,11 @@ function buildSporeWhere(options) {
128
128
  conditions.push("created_at > ?");
129
129
  params.push(options.since);
130
130
  }
131
+ if (options.includeActive === false && options.session_id === void 0) {
132
+ conditions.push(
133
+ `(session_id IS NULL OR EXISTS (SELECT 1 FROM sessions s WHERE s.id = spores.session_id AND s.status != 'active'))`
134
+ );
135
+ }
131
136
  return {
132
137
  where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
133
138
  params
@@ -187,4 +192,4 @@ export {
187
192
  listSporeIdsSince,
188
193
  updateSporeStatus
189
194
  };
190
- //# sourceMappingURL=chunk-REN37KYI.js.map
195
+ //# sourceMappingURL=chunk-FGKCE5AE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/queries/spores.ts"],"sourcesContent":["/**\n * Spore CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getTeamMachineId } from '@myco/daemon/team-context.js';\nimport { syncRow } from '@myco/db/queries/team-outbox.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of spores returned by listSpores when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default spore status for new spores. */\nconst DEFAULT_STATUS = 'active';\n\n/** Default importance score for new spores. */\nexport const DEFAULT_IMPORTANCE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a spore. */\nexport interface SporeInsert {\n id: string;\n agent_id: string;\n observation_type: string;\n content: string;\n created_at: number;\n session_id?: string | null;\n prompt_batch_id?: number | null;\n status?: string;\n context?: string | null;\n importance?: number;\n file_path?: string | null;\n tags?: string | null;\n content_hash?: string | null;\n properties?: string | null;\n updated_at?: number | null;\n machine_id?: string;\n}\n\n/** Row shape returned from spore queries (all columns). */\nexport interface SporeRow {\n id: string;\n agent_id: string;\n session_id: string | null;\n prompt_batch_id: number | null;\n observation_type: string;\n status: string;\n content: string;\n context: string | null;\n importance: number;\n file_path: string | null;\n tags: string | null;\n content_hash: string | null;\n properties: string | null;\n embedded: number;\n created_at: number;\n updated_at: number | null;\n machine_id: string;\n synced_at: number | null;\n}\n\n/** Filter options for `listSpores`. */\nexport interface ListSporesOptions {\n agent_id?: string;\n observation_type?: string;\n status?: string;\n session_id?: string;\n search?: string;\n /** Only return spores created after this epoch-seconds timestamp. */\n since?: number;\n limit?: number;\n offset?: number;\n /**\n * When explicitly `false`, exclude spores whose source session is still\n * `status = 'active'` — intelligence-task reads (agent tools, context\n * queries) should opt in to this. Defaults to permissive so UI listings\n * and prompt-time context injection keep seeing in-flight work. Explicit\n * `session_id` filters bypass this check: a direct lookup of one session's\n * spores is always permitted.\n */\n includeActive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst SPORE_COLUMNS = [\n 'id',\n 'agent_id',\n 'session_id',\n 'prompt_batch_id',\n 'observation_type',\n 'status',\n 'content',\n 'context',\n 'importance',\n 'file_path',\n 'tags',\n 'content_hash',\n 'properties',\n 'embedded',\n 'created_at',\n 'updated_at',\n 'machine_id',\n 'synced_at',\n] as const;\n\nconst SELECT_COLUMNS = SPORE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed SporeRow. */\nfunction toSporeRow(row: Record<string, unknown>): SporeRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n session_id: (row.session_id as string) ?? null,\n prompt_batch_id: (row.prompt_batch_id as number) ?? null,\n observation_type: row.observation_type as string,\n status: row.status as string,\n content: row.content as string,\n context: (row.context as string) ?? null,\n importance: row.importance as number,\n file_path: (row.file_path as string) ?? null,\n tags: (row.tags as string) ?? null,\n content_hash: (row.content_hash as string) ?? null,\n properties: (row.properties as string) ?? null,\n embedded: (row.embedded as number) ?? 0,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n machine_id: (row.machine_id as string) ?? 'local',\n synced_at: (row.synced_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new spore.\n *\n * Requires a valid `agent_id` (foreign key to agents table).\n */\nexport function insertSpore(data: SporeInsert): SporeRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO spores (\n id, agent_id, session_id, prompt_batch_id,\n observation_type, status, content, context,\n importance, file_path, tags, content_hash,\n properties, created_at, updated_at, machine_id\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.id,\n data.agent_id,\n data.session_id ?? null,\n data.prompt_batch_id ?? null,\n data.observation_type,\n data.status ?? DEFAULT_STATUS,\n data.content,\n data.context ?? null,\n data.importance ?? DEFAULT_IMPORTANCE,\n data.file_path ?? null,\n data.tags ?? null,\n data.content_hash ?? null,\n data.properties ?? null,\n data.created_at,\n data.updated_at ?? null,\n data.machine_id ?? getTeamMachineId(),\n );\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n\n/**\n * Retrieve a single spore by id.\n *\n * @returns the spore row, or null if not found.\n */\nexport function getSpore(id: string): SporeRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toSporeRow(row);\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\n/** Build WHERE clause and bound params from spore filter options. */\nfunction buildSporeWhere(\n options: Omit<ListSporesOptions, 'limit' | 'offset'>,\n): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n if (options.observation_type !== undefined) {\n conditions.push(`observation_type = ?`);\n params.push(options.observation_type);\n }\n if (options.status !== undefined) {\n conditions.push(`status = ?`);\n params.push(options.status);\n }\n if (options.session_id !== undefined) {\n conditions.push(`session_id = ?`);\n params.push(options.session_id);\n }\n if (options.search !== undefined && options.search.length > 0) {\n conditions.push(`(content LIKE ? OR observation_type LIKE ?)`);\n const pattern = `%${options.search}%`;\n params.push(pattern, pattern);\n }\n if (options.since !== undefined) {\n conditions.push('created_at > ?');\n params.push(options.since);\n }\n\n // Only exclude spores from in-flight sessions when the caller explicitly\n // asks for it (intelligence tasks). UI and hook-level context injection\n // leave this unset so they see everything. A direct session_id filter\n // bypasses the gate — that lookup is always permitted.\n if (options.includeActive === false && options.session_id === undefined) {\n conditions.push(\n `(session_id IS NULL OR EXISTS (SELECT 1 FROM sessions s WHERE s.id = spores.session_id AND s.status != 'active'))`,\n );\n }\n\n return {\n where: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n };\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\nexport function listSpores(\n options: ListSporesOptions = {},\n): SporeRow[] {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n const offset = options.offset ?? 0;\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM spores\n ${where}\n ORDER BY created_at DESC\n LIMIT ?\n OFFSET ?`,\n ).all(...params, limit, offset) as Record<string, unknown>[];\n\n return rows.map(toSporeRow);\n}\n\n/**\n * Count spores matching optional filters (for pagination totals).\n */\nexport function countSpores(\n options: Omit<ListSporesOptions, 'limit' | 'offset'> = {},\n): number {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores ${where}`,\n ).get(...params) as { count: number };\n\n return row.count;\n}\n\n/**\n * Count active spores created after a given timestamp.\n * Used by skill-evolve to detect new knowledge since last assessment.\n */\nexport function countSporesSince(sinceEpoch: number): number {\n const db = getDatabase();\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores WHERE created_at > ? AND status = 'active'`,\n ).get(sinceEpoch) as { count: number };\n return row.count;\n}\n\n/**\n * List active spore IDs created after a given timestamp, ordered newest first.\n */\nexport function listSporeIdsSince(sinceEpoch: number, limit = 20): string[] {\n const db = getDatabase();\n const rows = db.prepare(\n `SELECT id FROM spores WHERE created_at > ? AND status = 'active' ORDER BY created_at DESC LIMIT ?`,\n ).all(sinceEpoch, limit) as Array<{ id: string }>;\n return rows.map(r => r.id);\n}\n\n/**\n * Update the status and updated_at timestamp of a spore.\n *\n * @returns the updated row, or null if the spore does not exist.\n */\nexport function updateSporeStatus(\n id: string,\n status: string,\n updatedAt: number,\n): SporeRow | null {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE spores\n SET status = ?, updated_at = ?\n WHERE id = ?`,\n ).run(status, updatedAt, id);\n\n if (info.changes === 0) return null;\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n"],"mappings":"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","names":[]}
@@ -98,6 +98,7 @@ var TEAM_SOURCE_PREFIX = "team:";
98
98
  var TEAM_SEARCH_TIMEOUT_MS = 3e3;
99
99
  var TEAM_HEALTH_TIMEOUT_MS = 5e3;
100
100
  var TEAM_API_KEY_SECRET = "MYCO_TEAM_API_KEY";
101
+ var TEAM_MCP_TOKEN_SECRET = "MYCO_TEAM_MCP_TOKEN";
101
102
  var WRANGLER_COMMAND_TIMEOUT_MS = 6e4;
102
103
  var RESTART_RESPONSE_FLUSH_MS = 500;
103
104
 
@@ -184,7 +185,8 @@ export {
184
185
  TEAM_SEARCH_TIMEOUT_MS,
185
186
  TEAM_HEALTH_TIMEOUT_MS,
186
187
  TEAM_API_KEY_SECRET,
188
+ TEAM_MCP_TOKEN_SECRET,
187
189
  WRANGLER_COMMAND_TIMEOUT_MS,
188
190
  RESTART_RESPONSE_FLUSH_MS
189
191
  };
190
- //# sourceMappingURL=chunk-W4VHC2ES.js.map
192
+ //# sourceMappingURL=chunk-I54KLC6H.js.map