@goondocks/myco 0.21.0 → 0.21.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 (157) hide show
  1. package/bin/myco-run +68 -7
  2. package/dist/{agent-eval-RJSQI5S2.js → agent-eval-2MQKTXX3.js} +7 -6
  3. package/dist/{agent-eval-RJSQI5S2.js.map → agent-eval-2MQKTXX3.js.map} +1 -1
  4. package/dist/{agent-run-2JSYFOKU.js → agent-run-XJBTSVJR.js} +5 -5
  5. package/dist/{agent-tasks-APFJIM2T.js → agent-tasks-7MWBZOC7.js} +5 -5
  6. package/dist/{chunk-75Z7UKDY.js → chunk-4D22KTXY.js} +2 -2
  7. package/dist/{chunk-P66DLD6G.js → chunk-6FBLL7MD.js} +8 -2
  8. package/dist/chunk-6FBLL7MD.js.map +1 -0
  9. package/dist/{chunk-JZS6GZ6T.js → chunk-AUIXX33A.js} +10 -3
  10. package/dist/chunk-AUIXX33A.js.map +1 -0
  11. package/dist/{chunk-F3OEQYLS.js → chunk-DBBO6FHE.js} +33 -30
  12. package/dist/{chunk-F3OEQYLS.js.map → chunk-DBBO6FHE.js.map} +1 -1
  13. package/dist/{chunk-CESKJD44.js → chunk-DMPCC7V6.js} +19 -11
  14. package/dist/chunk-DMPCC7V6.js.map +1 -0
  15. package/dist/{chunk-RL5R4CQU.js → chunk-DTWUHHFI.js} +39 -2
  16. package/dist/{chunk-RL5R4CQU.js.map → chunk-DTWUHHFI.js.map} +1 -1
  17. package/dist/{chunk-XL75KZGI.js → chunk-EKZG2MCD.js} +7 -3
  18. package/dist/chunk-EKZG2MCD.js.map +1 -0
  19. package/dist/{chunk-NGH7U6A3.js → chunk-HCT7RMM2.js} +487 -98
  20. package/dist/chunk-HCT7RMM2.js.map +1 -0
  21. package/dist/{chunk-G6QIBNZM.js → chunk-IMW5TJ3O.js} +7 -6
  22. package/dist/chunk-IMW5TJ3O.js.map +1 -0
  23. package/dist/chunk-LQIPXVDH.js +17 -0
  24. package/dist/chunk-LQIPXVDH.js.map +1 -0
  25. package/dist/{chunk-5ZG4RMUH.js → chunk-N2DGFACQ.js} +2 -2
  26. package/dist/{chunk-VHNRMM4O.js → chunk-OTQH5KZW.js} +87 -37
  27. package/dist/chunk-OTQH5KZW.js.map +1 -0
  28. package/dist/{chunk-6LB7XELY.js → chunk-QATYARI5.js} +15 -13
  29. package/dist/chunk-QATYARI5.js.map +1 -0
  30. package/dist/{chunk-LVIY7P35.js → chunk-QLLBJEM7.js} +5 -1
  31. package/dist/chunk-QLLBJEM7.js.map +1 -0
  32. package/dist/{chunk-DJ3IHNYO.js → chunk-TFRUDNLI.js} +2 -2
  33. package/dist/{chunk-R2JIJBCL.js → chunk-TMAXWERS.js} +87 -4
  34. package/dist/chunk-TMAXWERS.js.map +1 -0
  35. package/dist/chunk-TSM6VESW.js +25 -0
  36. package/dist/chunk-TSM6VESW.js.map +1 -0
  37. package/dist/{chunk-ILJPRYES.js → chunk-USVFEWYL.js} +2 -2
  38. package/dist/{chunk-JR54LTPP.js → chunk-W5L5IHP5.js} +3 -3
  39. package/dist/{chunk-BUTL6IFS.js → chunk-Z55WGA2J.js} +2 -2
  40. package/dist/{chunk-NGROSFOH.js → chunk-Z66IT5KL.js} +14 -9
  41. package/dist/chunk-Z66IT5KL.js.map +1 -0
  42. package/dist/{cli-LNYSTDQM.js → cli-DDHTHU2J.js} +37 -37
  43. package/dist/{client-NWE4TCNO.js → client-PQU53UQU.js} +5 -3
  44. package/dist/{detect-PXNM6TA7.js → detect-7NUD5B5R.js} +2 -2
  45. package/dist/{doctor-TI7EZ3RW.js → doctor-QK6KFY6H.js} +6 -6
  46. package/dist/{executor-F2YU7HXJ.js → executor-FJCMNSXM.js} +11 -10
  47. package/dist/{init-KG3TYVGE.js → init-GQPD6HHX.js} +9 -9
  48. package/dist/{installer-UMH7OJ5A.js → installer-N4UTEACX.js} +2 -2
  49. package/dist/{loader-NAVVZK63.js → loader-UDNUMEDA.js} +3 -2
  50. package/dist/{main-5PRQNEEE.js → main-4HKTZFIM.js} +469 -187
  51. package/dist/main-4HKTZFIM.js.map +1 -0
  52. package/dist/{open-5A27BCSB.js → open-3P3DDAOA.js} +5 -5
  53. package/dist/{post-compact-USAODKPQ.js → post-compact-QA5LME2J.js} +7 -7
  54. package/dist/{post-tool-use-GMMSYBII.js → post-tool-use-QRZMPNYL.js} +6 -6
  55. package/dist/{post-tool-use-failure-NZVSL2PO.js → post-tool-use-failure-XNHIKBZG.js} +7 -7
  56. package/dist/{pre-compact-LZ57DLUS.js → pre-compact-HDV6X5QM.js} +7 -7
  57. package/dist/{registry-M2Z5QBWH.js → registry-F3THYC5M.js} +4 -3
  58. package/dist/{remove-T3KE6C5N.js → remove-USQDLGTJ.js} +7 -7
  59. package/dist/{restart-YWDEVZUJ.js → restart-FQLZE2TW.js} +6 -6
  60. package/dist/{search-GKFDGELR.js → search-5COKV6TD.js} +6 -6
  61. package/dist/{server-AHUR6CWF.js → server-KRMBRW4T.js} +23 -7
  62. package/dist/{server-AHUR6CWF.js.map → server-KRMBRW4T.js.map} +1 -1
  63. package/dist/{session-2ZEPLWW6.js → session-NJCUW3OX.js} +5 -5
  64. package/dist/{session-end-LWJYQAXX.js → session-end-XD27GRYF.js} +6 -6
  65. package/dist/{session-start-WTA6GCOQ.js → session-start-RDTXUSYL.js} +11 -11
  66. package/dist/{setup-llm-E7UU5IO7.js → setup-llm-FYPPJI6W.js} +5 -5
  67. package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +63 -41
  68. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +178 -22
  69. package/dist/src/agent/definitions/tasks/skill-generate.yaml +20 -6
  70. package/dist/src/agent/definitions/tasks/vault-evolve.yaml +65 -55
  71. package/dist/src/cli.js +1 -1
  72. package/dist/src/daemon/main.js +1 -1
  73. package/dist/src/hooks/post-tool-use.js +1 -1
  74. package/dist/src/hooks/session-end.js +1 -1
  75. package/dist/src/hooks/session-start.js +1 -1
  76. package/dist/src/hooks/stop.js +1 -1
  77. package/dist/src/hooks/user-prompt-submit.js +1 -1
  78. package/dist/src/mcp/server.js +1 -1
  79. package/dist/src/symbionts/manifests/opencode.yaml +7 -0
  80. package/dist/src/symbionts/templates/agents-starter.md +1 -1
  81. package/dist/src/symbionts/templates/opencode/plugin.ts +41 -1
  82. package/dist/src/symbionts/templates/pi/plugin.ts +12 -1
  83. package/dist/{stats-DFG6S23S.js → stats-JCLZLA5G.js} +6 -6
  84. package/dist/{stop-WRBTXEVT.js → stop-B7XCXEM5.js} +6 -6
  85. package/dist/{stop-failure-32MGIG2Q.js → stop-failure-R6QZCUOZ.js} +7 -7
  86. package/dist/{subagent-start-VFGHQFVL.js → subagent-start-N7A622F3.js} +7 -7
  87. package/dist/{subagent-stop-663FXG3P.js → subagent-stop-SVOG5MZJ.js} +7 -7
  88. package/dist/{task-completed-ZCQYEFMZ.js → task-completed-3DL5LJXF.js} +7 -7
  89. package/dist/{team-JTI5CDUO.js → team-VJ3M263F.js} +3 -3
  90. package/dist/ui/assets/{index-DGf1h-Ha.js → index-O1kNWlWM.js} +119 -119
  91. package/dist/ui/assets/index-z2Jm8i4A.css +1 -0
  92. package/dist/ui/index.html +2 -2
  93. package/dist/{update-3NBQTG32.js → update-TVXAUJMZ.js} +45 -11
  94. package/dist/update-TVXAUJMZ.js.map +1 -0
  95. package/dist/{user-prompt-submit-ME2TBKOS.js → user-prompt-submit-KYO2VGLB.js} +10 -9
  96. package/dist/user-prompt-submit-KYO2VGLB.js.map +1 -0
  97. package/dist/{version-GQAFBBPX.js → version-LDFEALUJ.js} +2 -2
  98. package/package.json +1 -1
  99. package/skills/myco-rules/SKILL.md +94 -0
  100. package/skills/{rules → myco-rules}/references/rules-bad-example.md +1 -1
  101. package/skills/{rules → myco-rules}/references/rules-good-example.md +1 -1
  102. package/dist/chunk-6LB7XELY.js.map +0 -1
  103. package/dist/chunk-CESKJD44.js.map +0 -1
  104. package/dist/chunk-CUDIZJY7.js +0 -36
  105. package/dist/chunk-CUDIZJY7.js.map +0 -1
  106. package/dist/chunk-G6QIBNZM.js.map +0 -1
  107. package/dist/chunk-JZS6GZ6T.js.map +0 -1
  108. package/dist/chunk-LVIY7P35.js.map +0 -1
  109. package/dist/chunk-NGH7U6A3.js.map +0 -1
  110. package/dist/chunk-NGROSFOH.js.map +0 -1
  111. package/dist/chunk-P66DLD6G.js.map +0 -1
  112. package/dist/chunk-R2JIJBCL.js.map +0 -1
  113. package/dist/chunk-VHNRMM4O.js.map +0 -1
  114. package/dist/chunk-XL75KZGI.js.map +0 -1
  115. package/dist/main-5PRQNEEE.js.map +0 -1
  116. package/dist/ui/assets/index-_OP4ifzH.css +0 -1
  117. package/dist/update-3NBQTG32.js.map +0 -1
  118. package/dist/user-prompt-submit-ME2TBKOS.js.map +0 -1
  119. package/skills/myco-curate/SKILL.md +0 -86
  120. package/skills/rules/SKILL.md +0 -214
  121. /package/dist/{agent-run-2JSYFOKU.js.map → agent-run-XJBTSVJR.js.map} +0 -0
  122. /package/dist/{agent-tasks-APFJIM2T.js.map → agent-tasks-7MWBZOC7.js.map} +0 -0
  123. /package/dist/{chunk-75Z7UKDY.js.map → chunk-4D22KTXY.js.map} +0 -0
  124. /package/dist/{chunk-5ZG4RMUH.js.map → chunk-N2DGFACQ.js.map} +0 -0
  125. /package/dist/{chunk-DJ3IHNYO.js.map → chunk-TFRUDNLI.js.map} +0 -0
  126. /package/dist/{chunk-ILJPRYES.js.map → chunk-USVFEWYL.js.map} +0 -0
  127. /package/dist/{chunk-JR54LTPP.js.map → chunk-W5L5IHP5.js.map} +0 -0
  128. /package/dist/{chunk-BUTL6IFS.js.map → chunk-Z55WGA2J.js.map} +0 -0
  129. /package/dist/{cli-LNYSTDQM.js.map → cli-DDHTHU2J.js.map} +0 -0
  130. /package/dist/{client-NWE4TCNO.js.map → client-PQU53UQU.js.map} +0 -0
  131. /package/dist/{detect-PXNM6TA7.js.map → detect-7NUD5B5R.js.map} +0 -0
  132. /package/dist/{doctor-TI7EZ3RW.js.map → doctor-QK6KFY6H.js.map} +0 -0
  133. /package/dist/{executor-F2YU7HXJ.js.map → executor-FJCMNSXM.js.map} +0 -0
  134. /package/dist/{init-KG3TYVGE.js.map → init-GQPD6HHX.js.map} +0 -0
  135. /package/dist/{installer-UMH7OJ5A.js.map → installer-N4UTEACX.js.map} +0 -0
  136. /package/dist/{loader-NAVVZK63.js.map → loader-UDNUMEDA.js.map} +0 -0
  137. /package/dist/{open-5A27BCSB.js.map → open-3P3DDAOA.js.map} +0 -0
  138. /package/dist/{post-compact-USAODKPQ.js.map → post-compact-QA5LME2J.js.map} +0 -0
  139. /package/dist/{post-tool-use-GMMSYBII.js.map → post-tool-use-QRZMPNYL.js.map} +0 -0
  140. /package/dist/{post-tool-use-failure-NZVSL2PO.js.map → post-tool-use-failure-XNHIKBZG.js.map} +0 -0
  141. /package/dist/{pre-compact-LZ57DLUS.js.map → pre-compact-HDV6X5QM.js.map} +0 -0
  142. /package/dist/{registry-M2Z5QBWH.js.map → registry-F3THYC5M.js.map} +0 -0
  143. /package/dist/{remove-T3KE6C5N.js.map → remove-USQDLGTJ.js.map} +0 -0
  144. /package/dist/{restart-YWDEVZUJ.js.map → restart-FQLZE2TW.js.map} +0 -0
  145. /package/dist/{search-GKFDGELR.js.map → search-5COKV6TD.js.map} +0 -0
  146. /package/dist/{session-2ZEPLWW6.js.map → session-NJCUW3OX.js.map} +0 -0
  147. /package/dist/{session-end-LWJYQAXX.js.map → session-end-XD27GRYF.js.map} +0 -0
  148. /package/dist/{session-start-WTA6GCOQ.js.map → session-start-RDTXUSYL.js.map} +0 -0
  149. /package/dist/{setup-llm-E7UU5IO7.js.map → setup-llm-FYPPJI6W.js.map} +0 -0
  150. /package/dist/{stats-DFG6S23S.js.map → stats-JCLZLA5G.js.map} +0 -0
  151. /package/dist/{stop-WRBTXEVT.js.map → stop-B7XCXEM5.js.map} +0 -0
  152. /package/dist/{stop-failure-32MGIG2Q.js.map → stop-failure-R6QZCUOZ.js.map} +0 -0
  153. /package/dist/{subagent-start-VFGHQFVL.js.map → subagent-start-N7A622F3.js.map} +0 -0
  154. /package/dist/{subagent-stop-663FXG3P.js.map → subagent-stop-SVOG5MZJ.js.map} +0 -0
  155. /package/dist/{task-completed-ZCQYEFMZ.js.map → task-completed-3DL5LJXF.js.map} +0 -0
  156. /package/dist/{team-JTI5CDUO.js.map → team-VJ3M263F.js.map} +0 -0
  157. /package/dist/{version-GQAFBBPX.js.map → version-LDFEALUJ.js.map} +0 -0
@@ -18,7 +18,7 @@ import {
18
18
  getEmbeddingQueueDepth,
19
19
  getUnembedded,
20
20
  markEmbedded
21
- } from "./chunk-75Z7UKDY.js";
21
+ } from "./chunk-4D22KTXY.js";
22
22
  import {
23
23
  deleteSecrets,
24
24
  getTeamPackageVersion,
@@ -27,7 +27,7 @@ import {
27
27
  readSecrets,
28
28
  resolveVaultConfigPath,
29
29
  writeSecret
30
- } from "./chunk-R2JIJBCL.js";
30
+ } from "./chunk-TMAXWERS.js";
31
31
  import {
32
32
  DEFAULT_OPENAI_URL,
33
33
  DEFAULT_OPENROUTER_URL,
@@ -63,6 +63,7 @@ import {
63
63
  getSkillRecordByName,
64
64
  getSkillSurveyEligibility,
65
65
  hasConfiguredProvider,
66
+ hasSemanticSearchFilters,
66
67
  incrementActivityCount,
67
68
  incrementSkillUsageCount,
68
69
  inferLocalOpenAIBackendKind,
@@ -82,6 +83,7 @@ import {
82
83
  listWriteIntents,
83
84
  markAllRead,
84
85
  markRunningRunsInterrupted,
86
+ matchesSemanticSearchFilters,
85
87
  notify,
86
88
  populateBatchResponses,
87
89
  register,
@@ -90,28 +92,31 @@ import {
90
92
  tryParseJson,
91
93
  updateCandidate,
92
94
  updateNotificationStatus
93
- } from "./chunk-NGH7U6A3.js";
95
+ } from "./chunk-HCT7RMM2.js";
94
96
  import {
95
- errorMessage,
96
97
  parseCheckpointState,
97
98
  runDurationMs
98
- } from "./chunk-6LB7XELY.js";
99
+ } from "./chunk-QATYARI5.js";
99
100
  import {
100
101
  fullTextSearch,
101
- hydrateSearchResults
102
- } from "./chunk-LVIY7P35.js";
102
+ hydrateSearchResults,
103
+ sanitizeFtsQuery
104
+ } from "./chunk-QLLBJEM7.js";
103
105
  import {
104
106
  copyTaskToUser,
105
107
  deleteUserTask,
106
108
  loadAllTasks,
107
109
  validateTaskName,
108
110
  writeUserTask
109
- } from "./chunk-ILJPRYES.js";
111
+ } from "./chunk-USVFEWYL.js";
110
112
  import {
111
113
  registerAgent,
112
114
  resolveDefinitionsDir,
113
115
  taskFromParsed
114
- } from "./chunk-JZS6GZ6T.js";
116
+ } from "./chunk-AUIXX33A.js";
117
+ import {
118
+ errorMessage
119
+ } from "./chunk-LQIPXVDH.js";
115
120
  import {
116
121
  listTurnsByRun
117
122
  } from "./chunk-FCJ5JV54.js";
@@ -135,11 +140,11 @@ import {
135
140
  cleanStaleBuffers,
136
141
  listBufferSessionIds
137
142
  } from "./chunk-V7XG6V6C.js";
138
- import "./chunk-JR54LTPP.js";
143
+ import "./chunk-W5L5IHP5.js";
139
144
  import "./chunk-SAKJMNSR.js";
140
145
  import {
141
146
  SymbiontInstaller
142
- } from "./chunk-VHNRMM4O.js";
147
+ } from "./chunk-OTQH5KZW.js";
143
148
  import {
144
149
  checkLocalProvider
145
150
  } from "./chunk-TKAJ3JVF.js";
@@ -150,7 +155,7 @@ import {
150
155
  import {
151
156
  composeSessionStartContext,
152
157
  shouldInjectSessionStartDigest
153
- } from "./chunk-DJ3IHNYO.js";
158
+ } from "./chunk-TFRUDNLI.js";
154
159
  import {
155
160
  buildCortexInstructionsInput,
156
161
  countSpores,
@@ -170,7 +175,7 @@ import {
170
175
  shouldInjectCortex,
171
176
  updateSporeStatus,
172
177
  upsertPlan
173
- } from "./chunk-F3OEQYLS.js";
178
+ } from "./chunk-DBBO6FHE.js";
174
179
  import {
175
180
  backfillUnsynced,
176
181
  closeSession,
@@ -199,10 +204,10 @@ import {
199
204
  import {
200
205
  evaluateSessionCaptureRules,
201
206
  readTranscriptMeta
202
- } from "./chunk-XL75KZGI.js";
207
+ } from "./chunk-EKZG2MCD.js";
203
208
  import {
204
209
  PLAN_STATUSES
205
- } from "./chunk-CESKJD44.js";
210
+ } from "./chunk-DMPCC7V6.js";
206
211
  import {
207
212
  EMBEDDING_DIMENSIONS,
208
213
  REST_SETTABLE_STATUSES,
@@ -215,7 +220,7 @@ import {
215
220
  createSchema,
216
221
  humanizePlanToken,
217
222
  normalizePlanSourcePath
218
- } from "./chunk-RL5R4CQU.js";
223
+ } from "./chunk-DTWUHHFI.js";
219
224
  import {
220
225
  CONFIG_FILENAME,
221
226
  MycoConfigSchema,
@@ -244,14 +249,14 @@ import {
244
249
  } from "./chunk-ZXZPJJN3.js";
245
250
  import {
246
251
  resolveCliEntryPath
247
- } from "./chunk-P66DLD6G.js";
252
+ } from "./chunk-6FBLL7MD.js";
248
253
  import {
249
254
  getPluginVersion
250
- } from "./chunk-BUTL6IFS.js";
255
+ } from "./chunk-Z55WGA2J.js";
251
256
  import {
252
257
  loadManifests,
253
258
  resolvePackageRoot
254
- } from "./chunk-NGROSFOH.js";
259
+ } from "./chunk-Z66IT5KL.js";
255
260
  import {
256
261
  findPackageRoot
257
262
  } from "./chunk-LPUQPDC2.js";
@@ -2712,6 +2717,13 @@ var TeamSyncClient = class _TeamSyncClient {
2712
2717
  const params = new URLSearchParams({ q: query });
2713
2718
  if (options.limit) params.set("limit", String(options.limit));
2714
2719
  if (options.tables) params.set("tables", options.tables.join(","));
2720
+ if (options.status) params.set("status", options.status);
2721
+ if (options.observation_type) params.set("observation_type", options.observation_type);
2722
+ if (options.since !== void 0) params.set("since", String(options.since));
2723
+ if (options.until !== void 0) params.set("until", String(options.until));
2724
+ if (options.session_id) params.set("session_id", options.session_id);
2725
+ if (options.source_path) params.set("source_path", options.source_path);
2726
+ if (options.name) params.set("name", options.name);
2715
2727
  const res = await this.fetchFn(`${this.workerUrl}/search?${params}`, {
2716
2728
  method: "GET",
2717
2729
  headers: this.headers(),
@@ -2896,16 +2908,33 @@ function createTeamHandlers(deps) {
2896
2908
  try {
2897
2909
  pendingCount = countPending();
2898
2910
  deadLetterCount = countDeadLettered();
2899
- } catch {
2911
+ } catch (err) {
2912
+ const detail = errorMessage(err);
2913
+ logger.warn("team-sync.outbox.count-failed", "team-outbox counts unavailable", { error: detail });
2900
2914
  }
2901
2915
  let collectiveStatus = null;
2916
+ let teamConfig = null;
2902
2917
  if (client && config.team.enabled) {
2903
2918
  try {
2904
2919
  collectiveStatus = await client.getCollectiveStatus();
2905
- } catch {
2920
+ } catch (err) {
2921
+ const detail = errorMessage(err);
2922
+ logger.warn("team-sync.collective.status-failed", "Collective status unavailable", { error: detail });
2906
2923
  collectiveStatus = null;
2907
2924
  }
2925
+ try {
2926
+ teamConfig = await client.getConfig();
2927
+ } catch (err) {
2928
+ const detail = errorMessage(err);
2929
+ logger.warn("team-sync.config.status-failed", "Team config unavailable", { error: detail });
2930
+ teamConfig = null;
2931
+ }
2908
2932
  }
2933
+ const remoteConfig = teamConfig?.config ?? {};
2934
+ const vectorReindexLastRun = typeof remoteConfig.vector_reindex_last_run_at === "string" ? Number(remoteConfig.vector_reindex_last_run_at) : null;
2935
+ const vectorReindexLastProcessed = typeof remoteConfig.vector_reindex_last_processed === "string" ? Number(remoteConfig.vector_reindex_last_processed) : null;
2936
+ const vectorReindexLastReindexed = typeof remoteConfig.vector_reindex_last_reindexed === "string" ? Number(remoteConfig.vector_reindex_last_reindexed) : null;
2937
+ const vectorReindexLastDeleted = typeof remoteConfig.vector_reindex_last_deleted === "string" ? Number(remoteConfig.vector_reindex_last_deleted) : null;
2909
2938
  return {
2910
2939
  body: {
2911
2940
  enabled: config.team.enabled,
@@ -2929,6 +2958,13 @@ function createTeamHandlers(deps) {
2929
2958
  collective_last_heartbeat: collectiveStatus?.last_heartbeat ?? null,
2930
2959
  collective_capabilities: collectiveStatus?.capabilities ?? [],
2931
2960
  collective_settings: collectiveStatus?.settings ?? {},
2961
+ vector_reindex_status: typeof remoteConfig.vector_reindex_status === "string" ? remoteConfig.vector_reindex_status : null,
2962
+ vector_reindex_last_table: typeof remoteConfig.vector_reindex_last_table === "string" ? remoteConfig.vector_reindex_last_table : null,
2963
+ vector_reindex_last_error: typeof remoteConfig.vector_reindex_last_error === "string" && remoteConfig.vector_reindex_last_error.length > 0 ? remoteConfig.vector_reindex_last_error : null,
2964
+ vector_reindex_last_run_at: Number.isFinite(vectorReindexLastRun) ? vectorReindexLastRun : null,
2965
+ vector_reindex_last_processed: Number.isFinite(vectorReindexLastProcessed) ? vectorReindexLastProcessed : null,
2966
+ vector_reindex_last_reindexed: Number.isFinite(vectorReindexLastReindexed) ? vectorReindexLastReindexed : null,
2967
+ vector_reindex_last_deleted: Number.isFinite(vectorReindexLastDeleted) ? vectorReindexLastDeleted : null,
2932
2968
  schema_version: SCHEMA_VERSION,
2933
2969
  sync_protocol_version: SYNC_PROTOCOL_VERSION,
2934
2970
  mcp_token: client?.getMcpToken() ?? null,
@@ -2945,7 +2981,7 @@ function createTeamHandlers(deps) {
2945
2981
  return { body: { retried: count } };
2946
2982
  }
2947
2983
  async function handleUpgradeWorker(_req) {
2948
- const { upgradeWorker } = await import("./team-JTI5CDUO.js");
2984
+ const { upgradeWorker } = await import("./team-VJ3M263F.js");
2949
2985
  logger.info("team-sync.upgrade.start", "Starting worker upgrade");
2950
2986
  const result = upgradeWorker(vaultDir);
2951
2987
  if (!result.success) {
@@ -2983,7 +3019,7 @@ function createTeamHandlers(deps) {
2983
3019
  logger.info("team-sync.mcp-token.rotated", "MCP access token rotated");
2984
3020
  return { body: { token } };
2985
3021
  } catch (err) {
2986
- const message = err instanceof Error ? err.message : String(err);
3022
+ const message = errorMessage(err);
2987
3023
  logger.error("team-sync.mcp-token.rotate-failed", "MCP token rotation failed", { error: message });
2988
3024
  return {
2989
3025
  status: 500,
@@ -3024,7 +3060,19 @@ function createCollectiveHandlers(deps) {
3024
3060
  const project = req.query.project;
3025
3061
  const limit = req.query.limit ? Number(req.query.limit) : void 0;
3026
3062
  return {
3027
- body: await client.collectiveQuery("collective_search", { query, project, limit })
3063
+ body: await client.collectiveQuery("collective_search", {
3064
+ query,
3065
+ project,
3066
+ limit,
3067
+ types: req.query.types ? req.query.types.split(",").map((value) => value.trim()).filter(Boolean) : void 0,
3068
+ status: req.query.status || void 0,
3069
+ observation_type: req.query.observation_type || void 0,
3070
+ since: req.query.since ? Number(req.query.since) : void 0,
3071
+ until: req.query.until ? Number(req.query.until) : void 0,
3072
+ session_id: req.query.session_id || void 0,
3073
+ source_path: req.query.source_path || void 0,
3074
+ name: req.query.name || void 0
3075
+ })
3028
3076
  };
3029
3077
  } catch (error) {
3030
3078
  return {
@@ -3337,7 +3385,7 @@ function createSkillRecordDeleteHandler(deps) {
3337
3385
  logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill directory", { name: record.name, error: String(err) });
3338
3386
  }
3339
3387
  try {
3340
- const { syncSkillSymlinks } = await import("./installer-UMH7OJ5A.js");
3388
+ const { syncSkillSymlinks } = await import("./installer-N4UTEACX.js");
3341
3389
  syncSkillSymlinks(projectRoot, record.name, { remove: true });
3342
3390
  } catch (err) {
3343
3391
  logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill symlinks", { name: record.name, error: String(err) });
@@ -3618,7 +3666,7 @@ async function fetchRemoteProviderModels(provider, _baseUrl, timeoutMs = REMOTE_
3618
3666
  const modelIds = (data.data ?? []).map((entry) => entry.id).filter((id) => typeof id === "string" && id.length > 0);
3619
3667
  return filterLlmModels(modelIds);
3620
3668
  }
3621
- async function handleGetModels(req) {
3669
+ async function handleGetModels(req, logger) {
3622
3670
  const provider = req.query.provider;
3623
3671
  const type = req.query.type;
3624
3672
  const localBackend = req.query.local_backend;
@@ -3626,6 +3674,7 @@ async function handleGetModels(req) {
3626
3674
  return { status: 400, body: { error: "provider query parameter required" } };
3627
3675
  }
3628
3676
  let models = [];
3677
+ let fetchError;
3629
3678
  try {
3630
3679
  const localBackendKind = inferLocalOpenAIBackendKind({
3631
3680
  type: provider === "lm-studio" ? "lmstudio" : provider,
@@ -3640,14 +3689,22 @@ async function handleGetModels(req) {
3640
3689
  } else if (provider === "openai" || provider === "openrouter") {
3641
3690
  models = await fetchRemoteProviderModels(provider, void 0, MODEL_LIST_TIMEOUT_MS);
3642
3691
  }
3643
- } catch {
3692
+ } catch (err) {
3693
+ fetchError = errorMessage(err);
3694
+ logger?.warn(`models.${provider}.list-unavailable`, `${provider} model list unavailable`, { error: fetchError });
3644
3695
  }
3645
3696
  if (type === "embedding") {
3646
3697
  models = filterEmbeddingModels(models);
3647
3698
  } else if (type === "llm") {
3648
3699
  models = filterLlmModels(models);
3649
3700
  }
3650
- return { body: { provider, models } };
3701
+ return {
3702
+ body: {
3703
+ provider,
3704
+ models,
3705
+ ...fetchError ? { error: fetchError } : {}
3706
+ }
3707
+ };
3651
3708
  }
3652
3709
 
3653
3710
  // src/daemon/api/stats.ts
@@ -3900,11 +3957,12 @@ async function triggerTitleSummary(sessionId, deps) {
3900
3957
  if (config.agent.summary_batch_interval <= 0) return;
3901
3958
  if (config.agent.event_tasks_enabled === false) return;
3902
3959
  try {
3903
- const { runAgent: runAgent2 } = await import("./executor-F2YU7HXJ.js");
3960
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
3904
3961
  runAgent2(vaultDir, {
3905
3962
  task: "title-summary",
3906
3963
  instruction: `Process session ${sessionId} only`,
3907
- embeddingManager
3964
+ embeddingManager,
3965
+ logger
3908
3966
  }).catch((err) => {
3909
3967
  logger.warn(LOG_KINDS.AGENT_ERROR, "Title-summary task failed", {
3910
3968
  session_id: sessionId,
@@ -4441,15 +4499,48 @@ function createSearchHandler(deps) {
4441
4499
  const type = req.query.type;
4442
4500
  const limit = Number(req.query.limit) || SEARCH_RESULTS_DEFAULT_LIMIT;
4443
4501
  const namespace = req.query.namespace;
4502
+ const metadataFilters = {
4503
+ ...req.query.status ? { status: req.query.status } : {},
4504
+ ...req.query.session_id ? { session_id: req.query.session_id } : {},
4505
+ ...req.query.observation_type ? { observation_type: req.query.observation_type } : {},
4506
+ ...req.query.since ? { created_at_gte: Number(req.query.since) } : {},
4507
+ ...req.query.until ? { created_at_lte: Number(req.query.until) } : {}
4508
+ };
4509
+ const vectorFilters = hasSemanticSearchFilters(metadataFilters) ? metadataFilters : void 0;
4510
+ const sanitized = sanitizeFtsQuery(query);
4444
4511
  if (mode === "fts") {
4445
- const results = fullTextSearch(query, { type, limit });
4446
- return { body: { mode: "fts", results } };
4512
+ try {
4513
+ const results = fullTextSearch(sanitized, { type, limit });
4514
+ return { body: { mode: "fts", results } };
4515
+ } catch (err) {
4516
+ return {
4517
+ status: 500,
4518
+ body: {
4519
+ error: "fts_query_failed",
4520
+ message: errorMessage(err),
4521
+ query,
4522
+ sanitized_query: sanitized !== query ? sanitized : void 0
4523
+ }
4524
+ };
4525
+ }
4447
4526
  }
4448
4527
  const queryVector = await deps.embeddingManager.embedQuery(query);
4449
4528
  if (queryVector === null) {
4450
4529
  if (mode === "auto") {
4451
- const results = fullTextSearch(query, { type, limit });
4452
- return { body: { mode: "fts", results, fallback: true } };
4530
+ try {
4531
+ const results = fullTextSearch(sanitized, { type, limit });
4532
+ return { body: { mode: "fts", results, fallback: true } };
4533
+ } catch (err) {
4534
+ return {
4535
+ status: 500,
4536
+ body: {
4537
+ error: "fts_fallback_failed",
4538
+ message: errorMessage(err),
4539
+ query,
4540
+ sanitized_query: sanitized !== query ? sanitized : void 0
4541
+ }
4542
+ };
4543
+ }
4453
4544
  }
4454
4545
  return { body: { mode: "semantic", results: [], provider_unavailable: true } };
4455
4546
  }
@@ -4457,9 +4548,11 @@ function createSearchHandler(deps) {
4457
4548
  const vectorResults = deps.embeddingManager.searchVectors(queryVector, {
4458
4549
  namespace: searchNamespace,
4459
4550
  limit,
4460
- threshold: SEARCH_SIMILARITY_THRESHOLD
4551
+ threshold: SEARCH_SIMILARITY_THRESHOLD,
4552
+ filters: vectorFilters
4461
4553
  });
4462
- const localResults = hydrateSearchResults(vectorResults).map((r) => ({
4554
+ const filteredVectorResults = vectorFilters ? vectorResults.filter((result) => matchesSemanticSearchFilters(result.metadata, metadataFilters)) : vectorResults;
4555
+ const localResults = hydrateSearchResults(filteredVectorResults).map((r) => ({
4463
4556
  ...r,
4464
4557
  source: "local"
4465
4558
  }));
@@ -4467,7 +4560,15 @@ function createSearchHandler(deps) {
4467
4560
  let teamResults = [];
4468
4561
  if (teamClient) {
4469
4562
  try {
4470
- const teamResponse = await teamClient.search(query, { limit });
4563
+ const teamResponse = await teamClient.search(query, {
4564
+ limit,
4565
+ tables: searchNamespace ? [searchNamespace] : void 0,
4566
+ status: req.query.status || void 0,
4567
+ observation_type: req.query.observation_type || void 0,
4568
+ since: req.query.since ? Number(req.query.since) : void 0,
4569
+ until: req.query.until ? Number(req.query.until) : void 0,
4570
+ session_id: req.query.session_id || void 0
4571
+ });
4471
4572
  teamResults = teamResponse.results.map((r) => ({
4472
4573
  ...r,
4473
4574
  source: `${TEAM_SOURCE_PREFIX}${r.machine_id}`
@@ -4476,7 +4577,11 @@ function createSearchHandler(deps) {
4476
4577
  }
4477
4578
  }
4478
4579
  const dedupedTeam = deps.machineId ? teamResults.filter((r) => r.machine_id !== deps.machineId) : teamResults;
4479
- const merged = [...localResults, ...dedupedTeam].sort((a, b) => (b.score ?? 0) - (a.score ?? 0)).slice(0, limit);
4580
+ const filteredTeam = vectorFilters ? dedupedTeam.filter((r) => matchesSemanticSearchFilters(
4581
+ r.metadata,
4582
+ metadataFilters
4583
+ )) : dedupedTeam;
4584
+ const merged = [...localResults, ...filteredTeam].sort((a, b) => (b.score ?? 0) - (a.score ?? 0)).slice(0, limit);
4480
4585
  return { body: { mode: "semantic", results: merged } };
4481
4586
  };
4482
4587
  }
@@ -4604,7 +4709,8 @@ ${goal.trim()}`,
4604
4709
  task: CORTEX_PROMPT_BUILDER_TASK,
4605
4710
  agentId: DEFAULT_AGENT_ID,
4606
4711
  instruction: builderInstruction,
4607
- embeddingManager: deps.embeddingManager
4712
+ embeddingManager: deps.embeddingManager,
4713
+ logger: deps.logger
4608
4714
  });
4609
4715
  const runId = getLatestRunId(DEFAULT_AGENT_ID, CORTEX_PROMPT_BUILDER_TASK);
4610
4716
  const tracked = resultPromise.catch((err) => {
@@ -4642,7 +4748,7 @@ function getCortexPromptResult(runId) {
4642
4748
  }
4643
4749
  async function triggerCortexInstructions(deps) {
4644
4750
  const { vaultDir, embeddingManager, liveConfig, logger, getTeamClient } = deps;
4645
- const loadExecutor = deps.loadExecutor ?? (() => import("./executor-F2YU7HXJ.js"));
4751
+ const loadExecutor = deps.loadExecutor ?? (() => import("./executor-FJCMNSXM.js"));
4646
4752
  const config = liveConfig.current;
4647
4753
  if (config.agent.event_tasks_enabled === false) {
4648
4754
  return { started: false, reason: "event-tasks-disabled" };
@@ -4868,7 +4974,10 @@ function createPromptContextHandler(deps) {
4868
4974
  const vectorResults = embeddingManager.searchVectors(queryVector, {
4869
4975
  namespace: "spores",
4870
4976
  limit: maxSpores * PROMPT_VECTOR_OVER_FETCH,
4871
- threshold: PROMPT_CONTEXT_MIN_SIMILARITY
4977
+ threshold: PROMPT_CONTEXT_MIN_SIMILARITY,
4978
+ filters: {
4979
+ status: "active"
4980
+ }
4872
4981
  });
4873
4982
  logger.debug(LOG_KINDS.CONTEXT_SEARCH, "Prompt vector search completed", {
4874
4983
  session_id,
@@ -5030,6 +5139,68 @@ async function handleGetFeed(req) {
5030
5139
  // src/daemon/api/embedding.ts
5031
5140
  var EMBEDDING_STATUS_IDLE = "idle";
5032
5141
  var EMBEDDING_STATUS_PENDING = "pending";
5142
+ var FOREGROUND_EMBEDDING_BATCH_SIZE = 50;
5143
+ var FOREGROUND_RECONCILE_MAX_PASSES = 25;
5144
+ var FOREGROUND_REEMBED_MAX_PASSES = 25;
5145
+ function readQueueDepthSafely() {
5146
+ try {
5147
+ return getEmbeddingQueueDepth().queue_depth;
5148
+ } catch {
5149
+ return 0;
5150
+ }
5151
+ }
5152
+ async function drainForegroundReconcile(manager) {
5153
+ const startedAt = Date.now();
5154
+ let embedded = 0;
5155
+ let stale_reembedded = 0;
5156
+ let orphans_cleaned = 0;
5157
+ let passes = 0;
5158
+ for (; passes < FOREGROUND_RECONCILE_MAX_PASSES; passes++) {
5159
+ const result = await manager.reconcile(FOREGROUND_EMBEDDING_BATCH_SIZE);
5160
+ embedded += result.embedded;
5161
+ stale_reembedded += result.stale_reembedded;
5162
+ orphans_cleaned += result.orphans_cleaned;
5163
+ const queueDepth = readQueueDepthSafely();
5164
+ if (queueDepth === 0) {
5165
+ return {
5166
+ embedded,
5167
+ stale_reembedded,
5168
+ orphans_cleaned,
5169
+ duration_ms: Date.now() - startedAt,
5170
+ passes: passes + 1,
5171
+ remaining_queue_depth: 0
5172
+ };
5173
+ }
5174
+ if (result.embedded === 0 && result.stale_reembedded === 0 && result.orphans_cleaned === 0) {
5175
+ return {
5176
+ embedded,
5177
+ stale_reembedded,
5178
+ orphans_cleaned,
5179
+ duration_ms: Date.now() - startedAt,
5180
+ passes: passes + 1,
5181
+ remaining_queue_depth: queueDepth
5182
+ };
5183
+ }
5184
+ }
5185
+ return {
5186
+ embedded,
5187
+ stale_reembedded,
5188
+ orphans_cleaned,
5189
+ duration_ms: Date.now() - startedAt,
5190
+ passes,
5191
+ remaining_queue_depth: readQueueDepthSafely()
5192
+ };
5193
+ }
5194
+ async function drainForegroundReembedStale(manager) {
5195
+ let reembedded = 0;
5196
+ let passes = 0;
5197
+ for (; passes < FOREGROUND_REEMBED_MAX_PASSES; passes++) {
5198
+ const result = await manager.reembedStale(FOREGROUND_EMBEDDING_BATCH_SIZE);
5199
+ reembedded += result.reembedded;
5200
+ if (result.reembedded === 0) break;
5201
+ }
5202
+ return { reembedded, passes };
5203
+ }
5033
5204
  async function handleGetEmbeddingStatus(vaultDir) {
5034
5205
  const config = loadMergedConfig(vaultDir);
5035
5206
  const { queue_depth, embedded_count } = getEmbeddingQueueDepth();
@@ -5048,21 +5219,28 @@ function handleEmbeddingDetails(manager) {
5048
5219
  const details = manager.getDetails();
5049
5220
  return { body: details };
5050
5221
  }
5051
- function handleEmbeddingRebuild(manager) {
5222
+ async function handleEmbeddingRebuild(manager) {
5052
5223
  const result = manager.rebuildAll();
5053
- return { body: result };
5224
+ const drained = await drainForegroundReconcile(manager);
5225
+ return {
5226
+ body: {
5227
+ ...result,
5228
+ ...drained,
5229
+ batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE
5230
+ }
5231
+ };
5054
5232
  }
5055
5233
  async function handleEmbeddingReconcile(manager) {
5056
- const result = await manager.reconcile(EMBEDDING_BATCH_SIZE);
5057
- return { body: result };
5234
+ const result = await manager.reconcile(FOREGROUND_EMBEDDING_BATCH_SIZE);
5235
+ return { body: { ...result, batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE } };
5058
5236
  }
5059
5237
  function handleEmbeddingCleanOrphans(manager) {
5060
5238
  const result = manager.cleanOrphans();
5061
5239
  return { body: result };
5062
5240
  }
5063
5241
  async function handleEmbeddingReembedStale(manager) {
5064
- const result = await manager.reembedStale(EMBEDDING_BATCH_SIZE);
5065
- return { body: result };
5242
+ const result = await drainForegroundReembedStale(manager);
5243
+ return { body: { ...result, batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE } };
5066
5244
  }
5067
5245
 
5068
5246
  // src/daemon/database/types.ts
@@ -5114,7 +5292,33 @@ async function handleDatabaseIntegrityCheck(manager) {
5114
5292
 
5115
5293
  // src/daemon/embedding/manager.ts
5116
5294
  import { createHash as createHash3 } from "crypto";
5295
+
5296
+ // src/intelligence/batch.ts
5297
+ async function batchExecute(items, fn, options) {
5298
+ const { concurrency, onProgress } = options;
5299
+ let succeeded = 0;
5300
+ let failed = 0;
5301
+ const results = [];
5302
+ for (let i = 0; i < items.length; i += concurrency) {
5303
+ const batch = items.slice(i, i + concurrency);
5304
+ const settled = await Promise.allSettled(batch.map(fn));
5305
+ for (const result of settled) {
5306
+ if (result.status === "fulfilled") {
5307
+ succeeded++;
5308
+ results.push({ status: "fulfilled", value: result.value });
5309
+ } else {
5310
+ failed++;
5311
+ results.push({ status: "rejected", reason: result.reason?.message ?? String(result.reason) });
5312
+ }
5313
+ }
5314
+ onProgress?.(succeeded + failed, items.length);
5315
+ }
5316
+ return { succeeded, failed, results };
5317
+ }
5318
+
5319
+ // src/daemon/embedding/manager.ts
5117
5320
  var ACTIVE_STATUS = "active";
5321
+ var EMBEDDING_MANAGER_CONCURRENCY = 2;
5118
5322
  var EmbeddingManager = class {
5119
5323
  constructor(vectorStore, embeddingProvider, recordSource, logger) {
5120
5324
  this.vectorStore = vectorStore;
@@ -5128,6 +5332,43 @@ var EmbeddingManager = class {
5128
5332
  contentHash(text) {
5129
5333
  return createHash3(CONTENT_HASH_ALGORITHM).update(text).digest("hex");
5130
5334
  }
5335
+ totalPendingCount() {
5336
+ return EMBEDDABLE_TABLES.reduce(
5337
+ (sum, namespace) => sum + this.recordSource.getPendingCount(namespace),
5338
+ 0
5339
+ );
5340
+ }
5341
+ async embedRecords(namespace, records, options) {
5342
+ if (records.length === 0) return { processed: 0, unavailable: false };
5343
+ const result = await batchExecute(
5344
+ records,
5345
+ async (record) => {
5346
+ const embedding = await this.embeddingProvider.embed(record.text);
5347
+ if (embedding === null) return { unavailable: true };
5348
+ this.vectorStore.upsert(namespace, record.id, embedding, {
5349
+ model: this.embeddingProvider.model,
5350
+ provider: this.embeddingProvider.providerName,
5351
+ dimensions: this.embeddingProvider.dimensions,
5352
+ content_hash: this.contentHash(record.text),
5353
+ embedded_at: epochSeconds(),
5354
+ domain_metadata: record.metadata
5355
+ });
5356
+ if (options.markEmbedded) {
5357
+ this.recordSource.markEmbedded(namespace, record.id);
5358
+ }
5359
+ return { unavailable: false };
5360
+ },
5361
+ { concurrency: EMBEDDING_MANAGER_CONCURRENCY }
5362
+ );
5363
+ let processed = 0;
5364
+ let unavailable = false;
5365
+ for (const entry of result.results) {
5366
+ if (entry.status !== "fulfilled") continue;
5367
+ if (entry.value.unavailable) unavailable = true;
5368
+ else processed++;
5369
+ }
5370
+ return { processed, unavailable };
5371
+ }
5131
5372
  // -------------------------------------------------------------------------
5132
5373
  // Write-path event handlers
5133
5374
  // -------------------------------------------------------------------------
@@ -5222,12 +5463,30 @@ var EmbeddingManager = class {
5222
5463
  const currentModel = this.embeddingProvider.model;
5223
5464
  for (const namespace of EMBEDDABLE_TABLES) {
5224
5465
  const rows = this.recordSource.getEmbeddableRows(namespace, batchSize);
5225
- for (const row of rows) {
5226
- const embedding = await this.embeddingProvider.embed(row.text);
5227
- if (embedding === null) {
5228
- this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during reconcile, returning partial progress", {
5466
+ const embeddedBatch = await this.embedRecords(namespace, rows, { markEmbedded: true });
5467
+ embedded += embeddedBatch.processed;
5468
+ if (embeddedBatch.unavailable) {
5469
+ this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during reconcile, returning partial progress", {
5470
+ namespace,
5471
+ embedded
5472
+ });
5473
+ return {
5474
+ embedded,
5475
+ stale_reembedded,
5476
+ orphans_cleaned,
5477
+ duration_ms: Date.now() - start
5478
+ };
5479
+ }
5480
+ const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
5481
+ if (staleIds.length > 0) {
5482
+ const records = this.recordSource.getRecordContent(namespace, staleIds);
5483
+ const foundIds = new Set(records.map((r) => r.id));
5484
+ const staleBatch = await this.embedRecords(namespace, records, { markEmbedded: false });
5485
+ stale_reembedded += staleBatch.processed;
5486
+ if (staleBatch.unavailable) {
5487
+ this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during stale re-embed, returning partial progress", {
5229
5488
  namespace,
5230
- embedded
5489
+ stale_reembedded
5231
5490
  });
5232
5491
  return {
5233
5492
  embedded,
@@ -5236,46 +5495,6 @@ var EmbeddingManager = class {
5236
5495
  duration_ms: Date.now() - start
5237
5496
  };
5238
5497
  }
5239
- const hash = this.contentHash(row.text);
5240
- this.vectorStore.upsert(namespace, row.id, embedding, {
5241
- model: currentModel,
5242
- provider: this.embeddingProvider.providerName,
5243
- dimensions: this.embeddingProvider.dimensions,
5244
- content_hash: hash,
5245
- embedded_at: epochSeconds(),
5246
- domain_metadata: row.metadata
5247
- });
5248
- this.recordSource.markEmbedded(namespace, row.id);
5249
- embedded++;
5250
- }
5251
- const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
5252
- if (staleIds.length > 0) {
5253
- const records = this.recordSource.getRecordContent(namespace, staleIds);
5254
- const foundIds = new Set(records.map((r) => r.id));
5255
- for (const record of records) {
5256
- const embedding = await this.embeddingProvider.embed(record.text);
5257
- if (embedding === null) {
5258
- this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during stale re-embed, returning partial progress", {
5259
- namespace,
5260
- stale_reembedded
5261
- });
5262
- return {
5263
- embedded,
5264
- stale_reembedded,
5265
- orphans_cleaned,
5266
- duration_ms: Date.now() - start
5267
- };
5268
- }
5269
- this.vectorStore.upsert(namespace, record.id, embedding, {
5270
- model: currentModel,
5271
- provider: this.embeddingProvider.providerName,
5272
- dimensions: this.embeddingProvider.dimensions,
5273
- content_hash: this.contentHash(record.text),
5274
- embedded_at: epochSeconds(),
5275
- domain_metadata: record.metadata
5276
- });
5277
- stale_reembedded++;
5278
- }
5279
5498
  for (const staleId of staleIds) {
5280
5499
  if (!foundIds.has(staleId)) {
5281
5500
  this.vectorStore.remove(namespace, staleId);
@@ -5291,12 +5510,18 @@ var EmbeddingManager = class {
5291
5510
  }
5292
5511
  const duration_ms = Date.now() - start;
5293
5512
  if (embedded > 0 || stale_reembedded > 0 || orphans_cleaned > 0) {
5294
- this.logger.info(LOG_KINDS.EMBEDDING_RECONCILE, "Reconcile cycle completed", {
5295
- embedded,
5296
- stale_reembedded,
5297
- orphans_cleaned,
5298
- duration_ms
5299
- });
5513
+ this.logger.info(
5514
+ LOG_KINDS.EMBEDDING_RECONCILE,
5515
+ `Reconcile cycle completed: ${embedded} embedded, ${stale_reembedded} stale re-embedded, ${orphans_cleaned} orphan vectors cleaned in ${duration_ms}ms (batch=${batchSize}, concurrency=${EMBEDDING_MANAGER_CONCURRENCY})`,
5516
+ {
5517
+ batch_size: batchSize,
5518
+ concurrency: EMBEDDING_MANAGER_CONCURRENCY,
5519
+ embedded,
5520
+ stale_reembedded,
5521
+ orphans_cleaned,
5522
+ duration_ms
5523
+ }
5524
+ );
5300
5525
  }
5301
5526
  return { embedded, stale_reembedded, orphans_cleaned, duration_ms };
5302
5527
  }
@@ -5320,7 +5545,12 @@ var EmbeddingManager = class {
5320
5545
  rebuildAll() {
5321
5546
  const { cleared } = this.vectorStore.clear();
5322
5547
  this.recordSource.clearAllEmbedded();
5323
- this.logger.info(LOG_KINDS.EMBEDDING_REBUILD, "Rebuild started", { cleared });
5548
+ const pending = this.totalPendingCount();
5549
+ this.logger.info(
5550
+ LOG_KINDS.EMBEDDING_REBUILD,
5551
+ `Rebuild started: cleared ${cleared} vectors, ${pending} records pending re-embed`,
5552
+ { cleared, pending, concurrency: EMBEDDING_MANAGER_CONCURRENCY }
5553
+ );
5324
5554
  return { queued: cleared };
5325
5555
  }
5326
5556
  /**
@@ -5333,25 +5563,14 @@ var EmbeddingManager = class {
5333
5563
  const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
5334
5564
  if (staleIds.length === 0) continue;
5335
5565
  const records = this.recordSource.getRecordContent(namespace, staleIds);
5336
- for (const record of records) {
5337
- const embedding = await this.embeddingProvider.embed(record.text);
5338
- if (embedding === null) {
5339
- this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during re-embed", {
5340
- namespace,
5341
- reembedded
5342
- });
5343
- return { reembedded };
5344
- }
5345
- const hash = this.contentHash(record.text);
5346
- this.vectorStore.upsert(namespace, record.id, embedding, {
5347
- model: currentModel,
5348
- provider: this.embeddingProvider.providerName,
5349
- dimensions: this.embeddingProvider.dimensions,
5350
- content_hash: hash,
5351
- embedded_at: epochSeconds(),
5352
- domain_metadata: record.metadata
5566
+ const staleBatch = await this.embedRecords(namespace, records, { markEmbedded: false });
5567
+ reembedded += staleBatch.processed;
5568
+ if (staleBatch.unavailable) {
5569
+ this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during re-embed", {
5570
+ namespace,
5571
+ reembedded
5353
5572
  });
5354
- reembedded++;
5573
+ return { reembedded };
5355
5574
  }
5356
5575
  }
5357
5576
  return { reembedded };
@@ -5436,6 +5655,21 @@ var DEFAULT_META_MODEL = "unknown";
5436
5655
  var DEFAULT_META_PROVIDER = "unknown";
5437
5656
  var DEFAULT_META_CONTENT_HASH = "";
5438
5657
  var FILTERABLE_COLUMNS = /* @__PURE__ */ new Set(["model", "provider", "namespace"]);
5658
+ var FILTERABLE_DOMAIN_METADATA_KEYS = /* @__PURE__ */ new Set([
5659
+ "status",
5660
+ "session_id",
5661
+ "observation_type",
5662
+ "project_root",
5663
+ "name",
5664
+ "source_path",
5665
+ "created_at"
5666
+ ]);
5667
+ var FILTER_SUFFIX_TO_OPERATOR = {
5668
+ _gte: ">=",
5669
+ _lte: "<=",
5670
+ _gt: ">",
5671
+ _lt: "<"
5672
+ };
5439
5673
  function cosineDistanceToSimilarity(distance) {
5440
5674
  return 1 - distance;
5441
5675
  }
@@ -5739,6 +5973,20 @@ var SqliteVecVectorStore = class {
5739
5973
  if (FILTERABLE_COLUMNS.has(key)) {
5740
5974
  conditions.push(`em.${key} = ?`);
5741
5975
  params.push(value);
5976
+ continue;
5977
+ }
5978
+ let metadataKey = key;
5979
+ let operator = "=";
5980
+ for (const [suffix, sqlOperator] of Object.entries(FILTER_SUFFIX_TO_OPERATOR)) {
5981
+ if (key.endsWith(suffix)) {
5982
+ metadataKey = key.slice(0, -suffix.length);
5983
+ operator = sqlOperator;
5984
+ break;
5985
+ }
5986
+ }
5987
+ if (FILTERABLE_DOMAIN_METADATA_KEYS.has(metadataKey)) {
5988
+ conditions.push(`json_extract(em.domain_metadata, '$.${metadataKey}') ${operator} ?`);
5989
+ params.push(value);
5742
5990
  }
5743
5991
  }
5744
5992
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
@@ -5826,14 +6074,16 @@ var EmbeddingProviderAdapter = class {
5826
6074
  var ACTIVE_STATUS2 = "active";
5827
6075
  function sessionMetadata(row) {
5828
6076
  return {
5829
- ...row.project_root != null ? { project_root: row.project_root } : {}
6077
+ ...row.project_root != null ? { project_root: row.project_root } : {},
6078
+ ...row.created_at != null ? { created_at: row.created_at } : {}
5830
6079
  };
5831
6080
  }
5832
6081
  function sporeMetadata(row) {
5833
6082
  return {
5834
6083
  ...row.status != null ? { status: row.status } : {},
5835
6084
  ...row.session_id != null ? { session_id: row.session_id } : {},
5836
- ...row.observation_type != null ? { observation_type: row.observation_type } : {}
6085
+ ...row.observation_type != null ? { observation_type: row.observation_type } : {},
6086
+ ...row.created_at != null ? { created_at: row.created_at } : {}
5837
6087
  };
5838
6088
  }
5839
6089
  function emptyMetadata() {
@@ -5842,13 +6092,15 @@ function emptyMetadata() {
5842
6092
  function planMetadata(row) {
5843
6093
  return {
5844
6094
  ...row.session_id != null ? { session_id: row.session_id } : {},
5845
- ...row.source_path != null ? { source_path: row.source_path } : {}
6095
+ ...row.source_path != null ? { source_path: row.source_path } : {},
6096
+ ...row.created_at != null ? { created_at: row.created_at } : {}
5846
6097
  };
5847
6098
  }
5848
6099
  function skillRecordMetadata(row) {
5849
6100
  return {
5850
6101
  ...row.status != null ? { status: row.status } : {},
5851
- ...row.name != null ? { name: row.name } : {}
6102
+ ...row.name != null ? { name: row.name } : {},
6103
+ ...row.created_at != null ? { created_at: row.created_at } : {}
5852
6104
  };
5853
6105
  }
5854
6106
  function metadataFor(namespace, row) {
@@ -6693,10 +6945,10 @@ var ANTHROPIC_MODELS_CACHE_TTL_MS = 10 * 60 * 1e3;
6693
6945
  var anthropicModelsCache = null;
6694
6946
  var HTTP_OK2 = 200;
6695
6947
  var HTTP_BAD_REQUEST2 = 400;
6696
- async function handleGetProviders() {
6948
+ async function handleGetProviders(logger) {
6697
6949
  const detectionPlan = [
6698
6950
  {
6699
- detect: () => detectAnthropic(),
6951
+ detect: () => detectAnthropic(logger),
6700
6952
  fallback: { type: "anthropic", runtime: "claude-sdk", available: false, models: [] }
6701
6953
  },
6702
6954
  {
@@ -6708,11 +6960,11 @@ async function handleGetProviders() {
6708
6960
  fallback: { type: "lmstudio", runtime: "claude-sdk", available: false, baseUrl: LmStudioBackend.DEFAULT_BASE_URL, models: [] }
6709
6961
  },
6710
6962
  {
6711
- detect: () => detectRemoteProviderInfo("openai", DEFAULT_OPENAI_URL),
6963
+ detect: () => detectRemoteProviderInfo("openai", DEFAULT_OPENAI_URL, logger),
6712
6964
  fallback: { type: "openai", runtime: "openai-agents", available: false, authConfigured: false, baseUrl: DEFAULT_OPENAI_URL, models: [] }
6713
6965
  },
6714
6966
  {
6715
- detect: () => detectRemoteProviderInfo("openrouter", DEFAULT_OPENROUTER_URL),
6967
+ detect: () => detectRemoteProviderInfo("openrouter", DEFAULT_OPENROUTER_URL, logger),
6716
6968
  fallback: { type: "openrouter", runtime: "openai-agents", available: false, authConfigured: false, baseUrl: DEFAULT_OPENROUTER_URL, models: [] }
6717
6969
  },
6718
6970
  {
@@ -6771,7 +7023,10 @@ async function handleTestProvider(req) {
6771
7023
  result = testAnthropic();
6772
7024
  }
6773
7025
  } catch (err) {
6774
- result = { ok: false, error: String(err) };
7026
+ result = {
7027
+ ok: false,
7028
+ error: errorMessage(err)
7029
+ };
6775
7030
  }
6776
7031
  if (result.ok) {
6777
7032
  result.latency_ms = Math.round(performance.now() - start);
@@ -6790,7 +7045,7 @@ async function detectLocalProviderInfo(type, defaultBaseUrl) {
6790
7045
  models
6791
7046
  };
6792
7047
  }
6793
- async function detectAnthropic() {
7048
+ async function detectAnthropic(logger) {
6794
7049
  const now = Date.now();
6795
7050
  if (anthropicModelsCache && now - anthropicModelsCache.ts < ANTHROPIC_MODELS_CACHE_TTL_MS) {
6796
7051
  return { type: "anthropic", runtime: "claude-sdk", available: true, models: anthropicModelsCache.models };
@@ -6806,12 +7061,14 @@ async function detectAnthropic() {
6806
7061
  if (liveModels.length > 0) {
6807
7062
  models = liveModels;
6808
7063
  }
6809
- } catch {
7064
+ } catch (err) {
7065
+ const detail = errorMessage(err);
7066
+ logger?.warn("providers.anthropic.models-unavailable", "Anthropic model list unavailable", { error: detail });
6810
7067
  }
6811
7068
  anthropicModelsCache = { ts: now, models };
6812
7069
  return { type: "anthropic", runtime: "claude-sdk", available: true, models };
6813
7070
  }
6814
- async function detectRemoteProviderInfo(type, baseUrl) {
7071
+ async function detectRemoteProviderInfo(type, baseUrl, logger) {
6815
7072
  const authConfigured = Boolean(getRemoteProviderApiKey(type));
6816
7073
  let models = [];
6817
7074
  let available = false;
@@ -6819,8 +7076,10 @@ async function detectRemoteProviderInfo(type, baseUrl) {
6819
7076
  try {
6820
7077
  models = await fetchRemoteProviderModels(type, void 0, ANTHROPIC_MODELS_TIMEOUT_MS);
6821
7078
  available = true;
6822
- } catch {
7079
+ } catch (err) {
6823
7080
  available = false;
7081
+ const detail = errorMessage(err);
7082
+ logger?.warn(`providers.${type}.models-unavailable`, `${type} model list unavailable`, { error: detail });
6824
7083
  }
6825
7084
  }
6826
7085
  return {
@@ -7009,7 +7268,7 @@ async function registerScheduledTasks(powerManager, deps) {
7009
7268
  if (!lastEnabled) {
7010
7269
  logger.info(LOG_KINDS.AGENT_RUN, "Scheduled agent tasks disabled (agent.scheduled_tasks_enabled: false) \u2014 jobs registered but will no-op until enabled");
7011
7270
  }
7012
- const { loadAllTasks: loadAllTasks2 } = await import("./registry-M2Z5QBWH.js");
7271
+ const { loadAllTasks: loadAllTasks2 } = await import("./registry-F3THYC5M.js");
7013
7272
  const allTasks = Array.from(loadAllTasks2(definitionsDir, vaultDir).values());
7014
7273
  const taskAgentMap = /* @__PURE__ */ new Map();
7015
7274
  for (const task of allTasks) {
@@ -7045,7 +7304,7 @@ async function registerScheduledTasks(powerManager, deps) {
7045
7304
  lastEnabled = enabled;
7046
7305
  }
7047
7306
  if (!enabled) return;
7048
- const { runAgent: runAgent2 } = await import("./executor-F2YU7HXJ.js");
7307
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
7049
7308
  const resumableRun = getLatestResumableRunForTask(DEFAULT_AGENT_ID, taskName);
7050
7309
  if (resumableRun) {
7051
7310
  const resumed = await runAgent2(vaultDir, {
@@ -7053,7 +7312,8 @@ async function registerScheduledTasks(powerManager, deps) {
7053
7312
  task: taskName,
7054
7313
  resumeRunId: resumableRun.id,
7055
7314
  resumeMode: "scheduled",
7056
- embeddingManager
7315
+ embeddingManager,
7316
+ logger
7057
7317
  });
7058
7318
  logger.info(LOG_KINDS.AGENT_RUN, `Scheduled task ${taskName} resumed`, {
7059
7319
  status: resumed.status,
@@ -7084,7 +7344,8 @@ async function registerScheduledTasks(powerManager, deps) {
7084
7344
  task: taskName,
7085
7345
  instruction: built?.instruction,
7086
7346
  runContext: built?.context,
7087
- embeddingManager
7347
+ embeddingManager,
7348
+ logger
7088
7349
  });
7089
7350
  logger.info(LOG_KINDS.AGENT_RUN, `Scheduled task ${taskName} completed`, {
7090
7351
  status: result.status,
@@ -7405,7 +7666,8 @@ function createMcpProxyHandlers(deps) {
7405
7666
  });
7406
7667
  embeddingManager.onContentWritten("spores", spore.id, content, {
7407
7668
  status: "active",
7408
- observation_type: observationType
7669
+ observation_type: observationType,
7670
+ created_at: now
7409
7671
  }).catch(() => {
7410
7672
  });
7411
7673
  return {
@@ -7482,7 +7744,8 @@ function createMcpProxyHandlers(deps) {
7482
7744
  })();
7483
7745
  embeddingManager.onContentWritten("spores", wisdom.id, consolidated_content, {
7484
7746
  status: "active",
7485
- observation_type
7747
+ observation_type,
7748
+ created_at: now
7486
7749
  }).catch(() => {
7487
7750
  });
7488
7751
  for (const sourceId of sourcesSuperseded) {
@@ -7873,7 +8136,7 @@ function isPlainObject(value) {
7873
8136
  }
7874
8137
 
7875
8138
  // src/daemon/api/run-serializer.ts
7876
- function buildPhaseCheckpointSummary(checkpointsRaw) {
8139
+ function buildPhaseCheckpointSummary(checkpointsRaw, logger) {
7877
8140
  if (!checkpointsRaw) return [];
7878
8141
  try {
7879
8142
  const parsed = JSON.parse(checkpointsRaw);
@@ -7885,7 +8148,9 @@ function buildPhaseCheckpointSummary(checkpointsRaw) {
7885
8148
  ...phase.costUsd !== void 0 ? { costUsd: phase.costUsd } : {},
7886
8149
  ...phase.costSource !== void 0 ? { costSource: phase.costSource } : {}
7887
8150
  }));
7888
- } catch {
8151
+ } catch (err) {
8152
+ const detail = errorMessage(err);
8153
+ logger?.warn("run-serializer.checkpoints-parse-failed", "checkpoints JSON parse failed", { error: detail });
7889
8154
  return [];
7890
8155
  }
7891
8156
  }
@@ -7905,7 +8170,8 @@ function serializeRun(run, opts = {}) {
7905
8170
  includeResumeFields = true,
7906
8171
  includePhaseCheckpoints = true,
7907
8172
  writeIntents,
7908
- duration_ms
8173
+ duration_ms,
8174
+ logger
7909
8175
  } = opts;
7910
8176
  const base = {
7911
8177
  id: run.id,
@@ -7944,7 +8210,7 @@ function serializeRun(run, opts = {}) {
7944
8210
  resumed_at: run.resumed_at,
7945
8211
  checkpoints: run.checkpoints
7946
8212
  } : {},
7947
- ...includePhaseCheckpoints ? { phase_checkpoints: buildPhaseCheckpointSummary(run.checkpoints) } : {},
8213
+ ...includePhaseCheckpoints ? { phase_checkpoints: buildPhaseCheckpointSummary(run.checkpoints, logger) } : {},
7948
8214
  ...writeIntents !== void 0 && writeIntents !== null ? { write_intents: writeIntents } : {},
7949
8215
  ...duration_ms !== void 0 ? { duration_ms } : {}
7950
8216
  };
@@ -8033,7 +8299,7 @@ function createAgentRunHandlers(deps) {
8033
8299
  };
8034
8300
  }
8035
8301
  }
8036
- const { runAgent: runAgent2 } = await import("./executor-F2YU7HXJ.js");
8302
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
8037
8303
  const resultPromise = runAgent2(vaultDir, {
8038
8304
  task,
8039
8305
  instruction,
@@ -8042,7 +8308,8 @@ function createAgentRunHandlers(deps) {
8042
8308
  runContext,
8043
8309
  dryRun,
8044
8310
  evaluationId,
8045
- executionOverrides
8311
+ executionOverrides,
8312
+ logger
8046
8313
  });
8047
8314
  const effectiveAgentId = agentId ?? "myco-agent";
8048
8315
  const runId = getLatestRunId(effectiveAgentId, task);
@@ -8094,7 +8361,7 @@ function createAgentRunHandlers(deps) {
8094
8361
  const filterOpts = { agent_id: agentId, status, task, search };
8095
8362
  const runs = listRuns({ ...filterOpts, limit, offset });
8096
8363
  const total = countRuns(filterOpts);
8097
- return { body: { runs: runs.map((run) => serializeRun(run)), total, offset, limit } };
8364
+ return { body: { runs: runs.map((run) => serializeRun(run, { logger })), total, offset, limit } };
8098
8365
  }
8099
8366
  async function handleGetRun(req) {
8100
8367
  const run = getRun(req.params.id);
@@ -8107,7 +8374,8 @@ function createAgentRunHandlers(deps) {
8107
8374
  body: {
8108
8375
  run: serializeRun(run, {
8109
8376
  writeIntents: { total, by_tool: byTool },
8110
- duration_ms: runDurationMs(run)
8377
+ duration_ms: runDurationMs(run),
8378
+ logger
8111
8379
  })
8112
8380
  }
8113
8381
  };
@@ -8121,14 +8389,15 @@ function createAgentRunHandlers(deps) {
8121
8389
  return { status: 400, body: { error: "Run is not resumable" } };
8122
8390
  }
8123
8391
  const { mode } = ResumeRunBody.parse(req.body ?? {});
8124
- const { runAgent: runAgent2 } = await import("./executor-F2YU7HXJ.js");
8392
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
8125
8393
  const resultPromise = runAgent2(vaultDir, {
8126
8394
  agentId: run.agent_id,
8127
8395
  task: run.task ?? void 0,
8128
8396
  instruction: run.instruction ?? void 0,
8129
8397
  resumeRunId: run.id,
8130
8398
  resumeMode: mode ?? "manual",
8131
- embeddingManager
8399
+ embeddingManager,
8400
+ logger
8132
8401
  });
8133
8402
  resultPromise.then((result) => {
8134
8403
  logger.info(LOG_KINDS.AGENT_RUN, "Agent run resumed", {
@@ -8351,7 +8620,7 @@ function createAgentEvaluationHandlers(deps) {
8351
8620
  });
8352
8621
  const dryRun = body.matrix.dryRun ?? false;
8353
8622
  void (async () => {
8354
- const { runAgent: runAgent2 } = await import("./executor-F2YU7HXJ.js");
8623
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
8355
8624
  let anyCompleted = false;
8356
8625
  let transitionedToRunning = false;
8357
8626
  const sharedPhases = body.matrix.phases;
@@ -8361,6 +8630,7 @@ function createAgentEvaluationHandlers(deps) {
8361
8630
  evaluationId: evalId,
8362
8631
  dryRun,
8363
8632
  embeddingManager,
8633
+ logger,
8364
8634
  executionOverrides: {
8365
8635
  ...cell.runtime ? { runtime: cell.runtime } : {},
8366
8636
  ...cell.reasoningLevel ? { reasoningLevel: cell.reasoningLevel } : {},
@@ -9776,7 +10046,8 @@ function createStopProcessor(deps) {
9776
10046
  }
9777
10047
  }
9778
10048
  const existingSessionMeta = registry.getSession(sessionId);
9779
- if (!hookTranscriptPath && !existingSessionMeta) {
10049
+ const dbSession = existingSessionMeta ? void 0 : getSession(sessionId);
10050
+ if (!hookTranscriptPath && !existingSessionMeta && !dbSession) {
9780
10051
  logger.info(LOG_KINDS.HOOKS_STOP, "Stop ignored \u2014 ephemeral sub-invocation", {
9781
10052
  session_id: sessionId
9782
10053
  });
@@ -9784,7 +10055,7 @@ function createStopProcessor(deps) {
9784
10055
  }
9785
10056
  if (!existingSessionMeta) {
9786
10057
  registry.register(sessionId, { started_at: (/* @__PURE__ */ new Date()).toISOString() });
9787
- logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from stop event", { session_id: sessionId });
10058
+ logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, dbSession ? "Rehydrated registry from DB on stop event" : "Auto-registered session from stop event", { session_id: sessionId });
9788
10059
  }
9789
10060
  const sessionMeta = existingSessionMeta ?? registry.getSession(sessionId);
9790
10061
  logger.info(LOG_KINDS.HOOKS_STOP, "Stop received", {
@@ -9878,44 +10149,55 @@ function createEventDispatcher(deps) {
9878
10149
  };
9879
10150
  logger.debug(LOG_KINDS.HOOKS_EVENT, "Event received", { type: event.type, session_id: event.session_id });
9880
10151
  if (!registry.getSession(event.session_id)) {
9881
- const cached = droppedSessions.get(event.session_id);
9882
- const hasTranscriptNow = typeof event.transcript_path === "string" && event.transcript_path.length > 0;
9883
- const shouldReevaluate = cached && !cached.hadTranscriptMeta && hasTranscriptNow;
9884
- if (cached && !shouldReevaluate) {
9885
- const reason = cached.reason ?? "rule";
9886
- logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event for previously-dropped session", {
10152
+ const existingRow = getSession(event.session_id);
10153
+ if (existingRow) {
10154
+ registry.register(event.session_id, { started_at: event.timestamp });
10155
+ logger.info(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Rehydrated registry from DB", {
9887
10156
  session_id: event.session_id,
9888
- type: event.type,
9889
- reason
10157
+ agent: existingRow.agent,
10158
+ type: event.type
9890
10159
  });
9891
- return { body: { ok: true, ignored: reason } };
9892
- }
9893
- if (shouldReevaluate) {
9894
- droppedSessions.delete(event.session_id);
9895
- }
9896
- const { decision, hadTranscriptMeta } = evaluateAutoRegistration(event);
9897
- if (decision.action === "drop") {
9898
- rememberDropped(event.session_id, decision.reason, hadTranscriptMeta);
9899
- logger.info(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event that failed session capture rules", {
9900
- session_id: event.session_id,
9901
- type: event.type,
9902
- reason: decision.reason ?? "rule"
10160
+ reconcileSession(event.session_id);
10161
+ } else {
10162
+ const cached = droppedSessions.get(event.session_id);
10163
+ const hasTranscriptNow = typeof event.transcript_path === "string" && event.transcript_path.length > 0;
10164
+ const shouldReevaluate = cached && !cached.hadTranscriptMeta && hasTranscriptNow;
10165
+ if (cached && !shouldReevaluate) {
10166
+ const reason = cached.reason ?? "rule";
10167
+ logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event for previously-dropped session", {
10168
+ session_id: event.session_id,
10169
+ type: event.type,
10170
+ reason
10171
+ });
10172
+ return { body: { ok: true, ignored: reason } };
10173
+ }
10174
+ if (shouldReevaluate) {
10175
+ droppedSessions.delete(event.session_id);
10176
+ }
10177
+ const { decision, hadTranscriptMeta } = evaluateAutoRegistration(event);
10178
+ if (decision.action === "drop") {
10179
+ rememberDropped(event.session_id, decision.reason, hadTranscriptMeta);
10180
+ logger.info(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event that failed session capture rules", {
10181
+ session_id: event.session_id,
10182
+ type: event.type,
10183
+ reason: decision.reason ?? "rule"
10184
+ });
10185
+ return { body: { ok: true, ignored: decision.reason ?? "rule" } };
10186
+ }
10187
+ registry.register(event.session_id, { started_at: event.timestamp });
10188
+ logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from event", { session_id: event.session_id });
10189
+ const now = epochSeconds();
10190
+ const startedEpoch = Math.floor(new Date(event.timestamp).getTime() / 1e3);
10191
+ upsertSession({
10192
+ id: event.session_id,
10193
+ agent: event.agent ?? DEFAULT_SYMBIONT_NAME,
10194
+ status: "active",
10195
+ started_at: startedEpoch,
10196
+ created_at: now,
10197
+ machine_id: machineId
9903
10198
  });
9904
- return { body: { ok: true, ignored: decision.reason ?? "rule" } };
10199
+ reconcileSession(event.session_id);
9905
10200
  }
9906
- registry.register(event.session_id, { started_at: event.timestamp });
9907
- logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from event", { session_id: event.session_id });
9908
- const now = epochSeconds();
9909
- const startedEpoch = Math.floor(new Date(event.timestamp).getTime() / 1e3);
9910
- upsertSession({
9911
- id: event.session_id,
9912
- agent: event.agent ?? DEFAULT_SYMBIONT_NAME,
9913
- status: "active",
9914
- started_at: startedEpoch,
9915
- created_at: now,
9916
- machine_id: machineId
9917
- });
9918
- reconcileSession(event.session_id);
9919
10201
  }
9920
10202
  if (!sessionBuffers.has(event.session_id)) {
9921
10203
  const bufferDir = path23.join(vaultDir, "buffer");
@@ -10352,7 +10634,7 @@ async function main() {
10352
10634
  const databaseManager = new DatabaseMaintenanceManager(vaultDbPath(vaultDir), vaultDir, logger);
10353
10635
  let definitionsDir;
10354
10636
  try {
10355
- const { registerBuiltInAgentsAndTasks, resolveDefinitionsDir: resolveDefinitionsDir2 } = await import("./loader-NAVVZK63.js");
10637
+ const { registerBuiltInAgentsAndTasks, resolveDefinitionsDir: resolveDefinitionsDir2 } = await import("./loader-UDNUMEDA.js");
10356
10638
  definitionsDir = resolveDefinitionsDir2();
10357
10639
  await registerBuiltInAgentsAndTasks(definitionsDir, vaultDir);
10358
10640
  logger.info(LOG_KINDS.AGENT_TASK, "Built-in agents and tasks registered");
@@ -10584,7 +10866,7 @@ async function main() {
10584
10866
  server.registerRoute("GET", "/api/logs/stream", handleLogStream);
10585
10867
  server.registerRoute("GET", "/api/logs/:id", handleLogDetail);
10586
10868
  server.registerRoute("POST", "/api/log", createLogIngestionHandler(logger));
10587
- server.registerRoute("GET", "/api/models", async (req) => handleGetModels(req));
10869
+ server.registerRoute("GET", "/api/models", async (req) => handleGetModels(req, logger));
10588
10870
  server.registerRoute("POST", "/api/restart", async (req) => handleRestart({ vaultDir, progressTracker }, req.body));
10589
10871
  const updateProjectRoot = path24.dirname(vaultDir);
10590
10872
  const updateHandlers = createUpdateHandlers({
@@ -10690,7 +10972,7 @@ async function main() {
10690
10972
  }
10691
10973
  return result;
10692
10974
  });
10693
- server.registerRoute("GET", "/api/providers", async () => handleGetProviders());
10975
+ server.registerRoute("GET", "/api/providers", async () => handleGetProviders(logger));
10694
10976
  server.registerRoute("POST", "/api/providers/test", async (req) => handleTestProvider(req));
10695
10977
  server.registerRoute("GET", "/api/providers/secrets", async () => handleGetProviderSecrets(vaultDir));
10696
10978
  server.registerRoute("PUT", "/api/providers/secrets/:provider", async (req) => handlePutProviderSecret(vaultDir, req));
@@ -10855,4 +11137,4 @@ export {
10855
11137
  handleUserPrompt,
10856
11138
  main
10857
11139
  };
10858
- //# sourceMappingURL=main-5PRQNEEE.js.map
11140
+ //# sourceMappingURL=main-4HKTZFIM.js.map