@goondocks/myco 0.21.1 → 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 (111) hide show
  1. package/dist/{agent-eval-YK2VP2S4.js → agent-eval-2MQKTXX3.js} +4 -4
  2. package/dist/{agent-run-GEJBD2YD.js → agent-run-XJBTSVJR.js} +4 -4
  3. package/dist/{agent-tasks-5XSRGTRX.js → agent-tasks-7MWBZOC7.js} +4 -4
  4. package/dist/{chunk-VRI56337.js → chunk-4D22KTXY.js} +2 -2
  5. package/dist/{chunk-KTTSXYEK.js → chunk-6FBLL7MD.js} +8 -2
  6. package/dist/chunk-6FBLL7MD.js.map +1 -0
  7. package/dist/{chunk-N7Z3LUEZ.js → chunk-DBBO6FHE.js} +2 -10
  8. package/dist/{chunk-N7Z3LUEZ.js.map → chunk-DBBO6FHE.js.map} +1 -1
  9. package/dist/{chunk-EEOJWLMP.js → chunk-DMPCC7V6.js} +15 -3
  10. package/dist/chunk-DMPCC7V6.js.map +1 -0
  11. package/dist/{chunk-XL75KZGI.js → chunk-EKZG2MCD.js} +7 -3
  12. package/dist/chunk-EKZG2MCD.js.map +1 -0
  13. package/dist/{chunk-X2IRGXGF.js → chunk-HCT7RMM2.js} +154 -24
  14. package/dist/chunk-HCT7RMM2.js.map +1 -0
  15. package/dist/{chunk-NFO7BRCO.js → chunk-IMW5TJ3O.js} +5 -4
  16. package/dist/chunk-IMW5TJ3O.js.map +1 -0
  17. package/dist/{chunk-OZ3FBAK5.js → chunk-TFRUDNLI.js} +2 -2
  18. package/dist/{chunk-6ALVMIB4.js → chunk-TMAXWERS.js} +85 -2
  19. package/dist/chunk-TMAXWERS.js.map +1 -0
  20. package/dist/{chunk-QDLVIW2O.js → chunk-W5L5IHP5.js} +2 -2
  21. package/dist/{chunk-ENZR5NG7.js → chunk-Z55WGA2J.js} +2 -2
  22. package/dist/{cli-HSLIG7EX.js → cli-DDHTHU2J.js} +35 -35
  23. package/dist/{client-Z43DNLJH.js → client-PQU53UQU.js} +5 -3
  24. package/dist/{doctor-HJCWHAU4.js → doctor-QK6KFY6H.js} +4 -4
  25. package/dist/{executor-DO6QFC6G.js → executor-FJCMNSXM.js} +5 -5
  26. package/dist/{init-4KVK7W2E.js → init-GQPD6HHX.js} +5 -5
  27. package/dist/{main-4J4QZZTZ.js → main-4HKTZFIM.js} +365 -142
  28. package/dist/main-4HKTZFIM.js.map +1 -0
  29. package/dist/{open-7TXJQM3H.js → open-3P3DDAOA.js} +4 -4
  30. package/dist/{post-compact-7AEFVCZS.js → post-compact-QA5LME2J.js} +4 -4
  31. package/dist/{post-tool-use-TZINWWDH.js → post-tool-use-QRZMPNYL.js} +3 -3
  32. package/dist/{post-tool-use-failure-TCFEU2GI.js → post-tool-use-failure-XNHIKBZG.js} +4 -4
  33. package/dist/{pre-compact-LO2VZCGR.js → pre-compact-HDV6X5QM.js} +4 -4
  34. package/dist/{remove-F77AAALE.js → remove-USQDLGTJ.js} +4 -4
  35. package/dist/{restart-UEFDPMLT.js → restart-FQLZE2TW.js} +5 -5
  36. package/dist/{search-NHNVUAQQ.js → search-5COKV6TD.js} +4 -4
  37. package/dist/{server-AZJSTQEK.js → server-KRMBRW4T.js} +22 -6
  38. package/dist/{server-AZJSTQEK.js.map → server-KRMBRW4T.js.map} +1 -1
  39. package/dist/{session-3HLC5KOD.js → session-NJCUW3OX.js} +4 -4
  40. package/dist/{session-end-FS46UARX.js → session-end-XD27GRYF.js} +3 -3
  41. package/dist/{session-start-46KPFV2H.js → session-start-RDTXUSYL.js} +7 -7
  42. package/dist/{setup-llm-JMWSNQ2C.js → setup-llm-FYPPJI6W.js} +4 -4
  43. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +4 -4
  44. package/dist/src/cli.js +1 -1
  45. package/dist/src/daemon/main.js +1 -1
  46. package/dist/src/hooks/post-tool-use.js +1 -1
  47. package/dist/src/hooks/session-end.js +1 -1
  48. package/dist/src/hooks/session-start.js +1 -1
  49. package/dist/src/hooks/stop.js +1 -1
  50. package/dist/src/hooks/user-prompt-submit.js +1 -1
  51. package/dist/src/mcp/server.js +1 -1
  52. package/dist/src/symbionts/templates/opencode/plugin.ts +41 -1
  53. package/dist/src/symbionts/templates/pi/plugin.ts +12 -1
  54. package/dist/{stats-MKMETHMA.js → stats-JCLZLA5G.js} +5 -5
  55. package/dist/{stop-OUEX6KA4.js → stop-B7XCXEM5.js} +3 -3
  56. package/dist/{stop-failure-2BWVNZEG.js → stop-failure-R6QZCUOZ.js} +4 -4
  57. package/dist/{subagent-start-J4VV6DEE.js → subagent-start-N7A622F3.js} +4 -4
  58. package/dist/{subagent-stop-JMLVEPIA.js → subagent-stop-SVOG5MZJ.js} +4 -4
  59. package/dist/{task-completed-65CHMMKA.js → task-completed-3DL5LJXF.js} +4 -4
  60. package/dist/{team-U2LDKIS4.js → team-VJ3M263F.js} +2 -2
  61. package/dist/ui/assets/{index-BUGor9dk.js → index-O1kNWlWM.js} +119 -119
  62. package/dist/ui/assets/index-z2Jm8i4A.css +1 -0
  63. package/dist/ui/index.html +2 -2
  64. package/dist/{update-ZSHVXWSQ.js → update-TVXAUJMZ.js} +42 -8
  65. package/dist/update-TVXAUJMZ.js.map +1 -0
  66. package/dist/{user-prompt-submit-APMO6FVU.js → user-prompt-submit-KYO2VGLB.js} +7 -6
  67. package/dist/user-prompt-submit-KYO2VGLB.js.map +1 -0
  68. package/dist/{version-TXPPS3L5.js → version-LDFEALUJ.js} +2 -2
  69. package/package.json +1 -1
  70. package/dist/chunk-6ALVMIB4.js.map +0 -1
  71. package/dist/chunk-EEOJWLMP.js.map +0 -1
  72. package/dist/chunk-KTTSXYEK.js.map +0 -1
  73. package/dist/chunk-NFO7BRCO.js.map +0 -1
  74. package/dist/chunk-X2IRGXGF.js.map +0 -1
  75. package/dist/chunk-XL75KZGI.js.map +0 -1
  76. package/dist/main-4J4QZZTZ.js.map +0 -1
  77. package/dist/ui/assets/index-_OP4ifzH.css +0 -1
  78. package/dist/update-ZSHVXWSQ.js.map +0 -1
  79. package/dist/user-prompt-submit-APMO6FVU.js.map +0 -1
  80. /package/dist/{agent-eval-YK2VP2S4.js.map → agent-eval-2MQKTXX3.js.map} +0 -0
  81. /package/dist/{agent-run-GEJBD2YD.js.map → agent-run-XJBTSVJR.js.map} +0 -0
  82. /package/dist/{agent-tasks-5XSRGTRX.js.map → agent-tasks-7MWBZOC7.js.map} +0 -0
  83. /package/dist/{chunk-VRI56337.js.map → chunk-4D22KTXY.js.map} +0 -0
  84. /package/dist/{chunk-OZ3FBAK5.js.map → chunk-TFRUDNLI.js.map} +0 -0
  85. /package/dist/{chunk-QDLVIW2O.js.map → chunk-W5L5IHP5.js.map} +0 -0
  86. /package/dist/{chunk-ENZR5NG7.js.map → chunk-Z55WGA2J.js.map} +0 -0
  87. /package/dist/{cli-HSLIG7EX.js.map → cli-DDHTHU2J.js.map} +0 -0
  88. /package/dist/{client-Z43DNLJH.js.map → client-PQU53UQU.js.map} +0 -0
  89. /package/dist/{doctor-HJCWHAU4.js.map → doctor-QK6KFY6H.js.map} +0 -0
  90. /package/dist/{executor-DO6QFC6G.js.map → executor-FJCMNSXM.js.map} +0 -0
  91. /package/dist/{init-4KVK7W2E.js.map → init-GQPD6HHX.js.map} +0 -0
  92. /package/dist/{open-7TXJQM3H.js.map → open-3P3DDAOA.js.map} +0 -0
  93. /package/dist/{post-compact-7AEFVCZS.js.map → post-compact-QA5LME2J.js.map} +0 -0
  94. /package/dist/{post-tool-use-TZINWWDH.js.map → post-tool-use-QRZMPNYL.js.map} +0 -0
  95. /package/dist/{post-tool-use-failure-TCFEU2GI.js.map → post-tool-use-failure-XNHIKBZG.js.map} +0 -0
  96. /package/dist/{pre-compact-LO2VZCGR.js.map → pre-compact-HDV6X5QM.js.map} +0 -0
  97. /package/dist/{remove-F77AAALE.js.map → remove-USQDLGTJ.js.map} +0 -0
  98. /package/dist/{restart-UEFDPMLT.js.map → restart-FQLZE2TW.js.map} +0 -0
  99. /package/dist/{search-NHNVUAQQ.js.map → search-5COKV6TD.js.map} +0 -0
  100. /package/dist/{session-3HLC5KOD.js.map → session-NJCUW3OX.js.map} +0 -0
  101. /package/dist/{session-end-FS46UARX.js.map → session-end-XD27GRYF.js.map} +0 -0
  102. /package/dist/{session-start-46KPFV2H.js.map → session-start-RDTXUSYL.js.map} +0 -0
  103. /package/dist/{setup-llm-JMWSNQ2C.js.map → setup-llm-FYPPJI6W.js.map} +0 -0
  104. /package/dist/{stats-MKMETHMA.js.map → stats-JCLZLA5G.js.map} +0 -0
  105. /package/dist/{stop-OUEX6KA4.js.map → stop-B7XCXEM5.js.map} +0 -0
  106. /package/dist/{stop-failure-2BWVNZEG.js.map → stop-failure-R6QZCUOZ.js.map} +0 -0
  107. /package/dist/{subagent-start-J4VV6DEE.js.map → subagent-start-N7A622F3.js.map} +0 -0
  108. /package/dist/{subagent-stop-JMLVEPIA.js.map → subagent-stop-SVOG5MZJ.js.map} +0 -0
  109. /package/dist/{task-completed-65CHMMKA.js.map → task-completed-3DL5LJXF.js.map} +0 -0
  110. /package/dist/{team-U2LDKIS4.js.map → team-VJ3M263F.js.map} +0 -0
  111. /package/dist/{version-TXPPS3L5.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-VRI56337.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-6ALVMIB4.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,7 +92,7 @@ import {
90
92
  tryParseJson,
91
93
  updateCandidate,
92
94
  updateNotificationStatus
93
- } from "./chunk-X2IRGXGF.js";
95
+ } from "./chunk-HCT7RMM2.js";
94
96
  import {
95
97
  parseCheckpointState,
96
98
  runDurationMs
@@ -138,7 +140,7 @@ import {
138
140
  cleanStaleBuffers,
139
141
  listBufferSessionIds
140
142
  } from "./chunk-V7XG6V6C.js";
141
- import "./chunk-QDLVIW2O.js";
143
+ import "./chunk-W5L5IHP5.js";
142
144
  import "./chunk-SAKJMNSR.js";
143
145
  import {
144
146
  SymbiontInstaller
@@ -153,7 +155,7 @@ import {
153
155
  import {
154
156
  composeSessionStartContext,
155
157
  shouldInjectSessionStartDigest
156
- } from "./chunk-OZ3FBAK5.js";
158
+ } from "./chunk-TFRUDNLI.js";
157
159
  import {
158
160
  buildCortexInstructionsInput,
159
161
  countSpores,
@@ -173,7 +175,7 @@ import {
173
175
  shouldInjectCortex,
174
176
  updateSporeStatus,
175
177
  upsertPlan
176
- } from "./chunk-N7Z3LUEZ.js";
178
+ } from "./chunk-DBBO6FHE.js";
177
179
  import {
178
180
  backfillUnsynced,
179
181
  closeSession,
@@ -202,10 +204,10 @@ import {
202
204
  import {
203
205
  evaluateSessionCaptureRules,
204
206
  readTranscriptMeta
205
- } from "./chunk-XL75KZGI.js";
207
+ } from "./chunk-EKZG2MCD.js";
206
208
  import {
207
209
  PLAN_STATUSES
208
- } from "./chunk-EEOJWLMP.js";
210
+ } from "./chunk-DMPCC7V6.js";
209
211
  import {
210
212
  EMBEDDING_DIMENSIONS,
211
213
  REST_SETTABLE_STATUSES,
@@ -247,10 +249,10 @@ import {
247
249
  } from "./chunk-ZXZPJJN3.js";
248
250
  import {
249
251
  resolveCliEntryPath
250
- } from "./chunk-KTTSXYEK.js";
252
+ } from "./chunk-6FBLL7MD.js";
251
253
  import {
252
254
  getPluginVersion
253
- } from "./chunk-ENZR5NG7.js";
255
+ } from "./chunk-Z55WGA2J.js";
254
256
  import {
255
257
  loadManifests,
256
258
  resolvePackageRoot
@@ -2715,6 +2717,13 @@ var TeamSyncClient = class _TeamSyncClient {
2715
2717
  const params = new URLSearchParams({ q: query });
2716
2718
  if (options.limit) params.set("limit", String(options.limit));
2717
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);
2718
2727
  const res = await this.fetchFn(`${this.workerUrl}/search?${params}`, {
2719
2728
  method: "GET",
2720
2729
  headers: this.headers(),
@@ -2904,6 +2913,7 @@ function createTeamHandlers(deps) {
2904
2913
  logger.warn("team-sync.outbox.count-failed", "team-outbox counts unavailable", { error: detail });
2905
2914
  }
2906
2915
  let collectiveStatus = null;
2916
+ let teamConfig = null;
2907
2917
  if (client && config.team.enabled) {
2908
2918
  try {
2909
2919
  collectiveStatus = await client.getCollectiveStatus();
@@ -2912,7 +2922,19 @@ function createTeamHandlers(deps) {
2912
2922
  logger.warn("team-sync.collective.status-failed", "Collective status unavailable", { error: detail });
2913
2923
  collectiveStatus = null;
2914
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
+ }
2915
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;
2916
2938
  return {
2917
2939
  body: {
2918
2940
  enabled: config.team.enabled,
@@ -2936,6 +2958,13 @@ function createTeamHandlers(deps) {
2936
2958
  collective_last_heartbeat: collectiveStatus?.last_heartbeat ?? null,
2937
2959
  collective_capabilities: collectiveStatus?.capabilities ?? [],
2938
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,
2939
2968
  schema_version: SCHEMA_VERSION,
2940
2969
  sync_protocol_version: SYNC_PROTOCOL_VERSION,
2941
2970
  mcp_token: client?.getMcpToken() ?? null,
@@ -2952,7 +2981,7 @@ function createTeamHandlers(deps) {
2952
2981
  return { body: { retried: count } };
2953
2982
  }
2954
2983
  async function handleUpgradeWorker(_req) {
2955
- const { upgradeWorker } = await import("./team-U2LDKIS4.js");
2984
+ const { upgradeWorker } = await import("./team-VJ3M263F.js");
2956
2985
  logger.info("team-sync.upgrade.start", "Starting worker upgrade");
2957
2986
  const result = upgradeWorker(vaultDir);
2958
2987
  if (!result.success) {
@@ -3031,7 +3060,19 @@ function createCollectiveHandlers(deps) {
3031
3060
  const project = req.query.project;
3032
3061
  const limit = req.query.limit ? Number(req.query.limit) : void 0;
3033
3062
  return {
3034
- 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
+ })
3035
3076
  };
3036
3077
  } catch (error) {
3037
3078
  return {
@@ -3916,7 +3957,7 @@ async function triggerTitleSummary(sessionId, deps) {
3916
3957
  if (config.agent.summary_batch_interval <= 0) return;
3917
3958
  if (config.agent.event_tasks_enabled === false) return;
3918
3959
  try {
3919
- const { runAgent: runAgent2 } = await import("./executor-DO6QFC6G.js");
3960
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
3920
3961
  runAgent2(vaultDir, {
3921
3962
  task: "title-summary",
3922
3963
  instruction: `Process session ${sessionId} only`,
@@ -4458,6 +4499,14 @@ function createSearchHandler(deps) {
4458
4499
  const type = req.query.type;
4459
4500
  const limit = Number(req.query.limit) || SEARCH_RESULTS_DEFAULT_LIMIT;
4460
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;
4461
4510
  const sanitized = sanitizeFtsQuery(query);
4462
4511
  if (mode === "fts") {
4463
4512
  try {
@@ -4499,9 +4548,11 @@ function createSearchHandler(deps) {
4499
4548
  const vectorResults = deps.embeddingManager.searchVectors(queryVector, {
4500
4549
  namespace: searchNamespace,
4501
4550
  limit,
4502
- threshold: SEARCH_SIMILARITY_THRESHOLD
4551
+ threshold: SEARCH_SIMILARITY_THRESHOLD,
4552
+ filters: vectorFilters
4503
4553
  });
4504
- 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) => ({
4505
4556
  ...r,
4506
4557
  source: "local"
4507
4558
  }));
@@ -4509,7 +4560,15 @@ function createSearchHandler(deps) {
4509
4560
  let teamResults = [];
4510
4561
  if (teamClient) {
4511
4562
  try {
4512
- 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
+ });
4513
4572
  teamResults = teamResponse.results.map((r) => ({
4514
4573
  ...r,
4515
4574
  source: `${TEAM_SOURCE_PREFIX}${r.machine_id}`
@@ -4518,7 +4577,11 @@ function createSearchHandler(deps) {
4518
4577
  }
4519
4578
  }
4520
4579
  const dedupedTeam = deps.machineId ? teamResults.filter((r) => r.machine_id !== deps.machineId) : teamResults;
4521
- 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);
4522
4585
  return { body: { mode: "semantic", results: merged } };
4523
4586
  };
4524
4587
  }
@@ -4685,7 +4748,7 @@ function getCortexPromptResult(runId) {
4685
4748
  }
4686
4749
  async function triggerCortexInstructions(deps) {
4687
4750
  const { vaultDir, embeddingManager, liveConfig, logger, getTeamClient } = deps;
4688
- const loadExecutor = deps.loadExecutor ?? (() => import("./executor-DO6QFC6G.js"));
4751
+ const loadExecutor = deps.loadExecutor ?? (() => import("./executor-FJCMNSXM.js"));
4689
4752
  const config = liveConfig.current;
4690
4753
  if (config.agent.event_tasks_enabled === false) {
4691
4754
  return { started: false, reason: "event-tasks-disabled" };
@@ -4911,7 +4974,10 @@ function createPromptContextHandler(deps) {
4911
4974
  const vectorResults = embeddingManager.searchVectors(queryVector, {
4912
4975
  namespace: "spores",
4913
4976
  limit: maxSpores * PROMPT_VECTOR_OVER_FETCH,
4914
- threshold: PROMPT_CONTEXT_MIN_SIMILARITY
4977
+ threshold: PROMPT_CONTEXT_MIN_SIMILARITY,
4978
+ filters: {
4979
+ status: "active"
4980
+ }
4915
4981
  });
4916
4982
  logger.debug(LOG_KINDS.CONTEXT_SEARCH, "Prompt vector search completed", {
4917
4983
  session_id,
@@ -5073,6 +5139,68 @@ async function handleGetFeed(req) {
5073
5139
  // src/daemon/api/embedding.ts
5074
5140
  var EMBEDDING_STATUS_IDLE = "idle";
5075
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
+ }
5076
5204
  async function handleGetEmbeddingStatus(vaultDir) {
5077
5205
  const config = loadMergedConfig(vaultDir);
5078
5206
  const { queue_depth, embedded_count } = getEmbeddingQueueDepth();
@@ -5091,21 +5219,28 @@ function handleEmbeddingDetails(manager) {
5091
5219
  const details = manager.getDetails();
5092
5220
  return { body: details };
5093
5221
  }
5094
- function handleEmbeddingRebuild(manager) {
5222
+ async function handleEmbeddingRebuild(manager) {
5095
5223
  const result = manager.rebuildAll();
5096
- 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
+ };
5097
5232
  }
5098
5233
  async function handleEmbeddingReconcile(manager) {
5099
- const result = await manager.reconcile(EMBEDDING_BATCH_SIZE);
5100
- return { body: result };
5234
+ const result = await manager.reconcile(FOREGROUND_EMBEDDING_BATCH_SIZE);
5235
+ return { body: { ...result, batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE } };
5101
5236
  }
5102
5237
  function handleEmbeddingCleanOrphans(manager) {
5103
5238
  const result = manager.cleanOrphans();
5104
5239
  return { body: result };
5105
5240
  }
5106
5241
  async function handleEmbeddingReembedStale(manager) {
5107
- const result = await manager.reembedStale(EMBEDDING_BATCH_SIZE);
5108
- return { body: result };
5242
+ const result = await drainForegroundReembedStale(manager);
5243
+ return { body: { ...result, batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE } };
5109
5244
  }
5110
5245
 
5111
5246
  // src/daemon/database/types.ts
@@ -5157,7 +5292,33 @@ async function handleDatabaseIntegrityCheck(manager) {
5157
5292
 
5158
5293
  // src/daemon/embedding/manager.ts
5159
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
5160
5320
  var ACTIVE_STATUS = "active";
5321
+ var EMBEDDING_MANAGER_CONCURRENCY = 2;
5161
5322
  var EmbeddingManager = class {
5162
5323
  constructor(vectorStore, embeddingProvider, recordSource, logger) {
5163
5324
  this.vectorStore = vectorStore;
@@ -5171,6 +5332,43 @@ var EmbeddingManager = class {
5171
5332
  contentHash(text) {
5172
5333
  return createHash3(CONTENT_HASH_ALGORITHM).update(text).digest("hex");
5173
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
+ }
5174
5372
  // -------------------------------------------------------------------------
5175
5373
  // Write-path event handlers
5176
5374
  // -------------------------------------------------------------------------
@@ -5265,12 +5463,30 @@ var EmbeddingManager = class {
5265
5463
  const currentModel = this.embeddingProvider.model;
5266
5464
  for (const namespace of EMBEDDABLE_TABLES) {
5267
5465
  const rows = this.recordSource.getEmbeddableRows(namespace, batchSize);
5268
- for (const row of rows) {
5269
- const embedding = await this.embeddingProvider.embed(row.text);
5270
- if (embedding === null) {
5271
- 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", {
5272
5488
  namespace,
5273
- embedded
5489
+ stale_reembedded
5274
5490
  });
5275
5491
  return {
5276
5492
  embedded,
@@ -5279,46 +5495,6 @@ var EmbeddingManager = class {
5279
5495
  duration_ms: Date.now() - start
5280
5496
  };
5281
5497
  }
5282
- const hash = this.contentHash(row.text);
5283
- this.vectorStore.upsert(namespace, row.id, embedding, {
5284
- model: currentModel,
5285
- provider: this.embeddingProvider.providerName,
5286
- dimensions: this.embeddingProvider.dimensions,
5287
- content_hash: hash,
5288
- embedded_at: epochSeconds(),
5289
- domain_metadata: row.metadata
5290
- });
5291
- this.recordSource.markEmbedded(namespace, row.id);
5292
- embedded++;
5293
- }
5294
- const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
5295
- if (staleIds.length > 0) {
5296
- const records = this.recordSource.getRecordContent(namespace, staleIds);
5297
- const foundIds = new Set(records.map((r) => r.id));
5298
- for (const record of records) {
5299
- const embedding = await this.embeddingProvider.embed(record.text);
5300
- if (embedding === null) {
5301
- this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during stale re-embed, returning partial progress", {
5302
- namespace,
5303
- stale_reembedded
5304
- });
5305
- return {
5306
- embedded,
5307
- stale_reembedded,
5308
- orphans_cleaned,
5309
- duration_ms: Date.now() - start
5310
- };
5311
- }
5312
- this.vectorStore.upsert(namespace, record.id, embedding, {
5313
- model: currentModel,
5314
- provider: this.embeddingProvider.providerName,
5315
- dimensions: this.embeddingProvider.dimensions,
5316
- content_hash: this.contentHash(record.text),
5317
- embedded_at: epochSeconds(),
5318
- domain_metadata: record.metadata
5319
- });
5320
- stale_reembedded++;
5321
- }
5322
5498
  for (const staleId of staleIds) {
5323
5499
  if (!foundIds.has(staleId)) {
5324
5500
  this.vectorStore.remove(namespace, staleId);
@@ -5334,12 +5510,18 @@ var EmbeddingManager = class {
5334
5510
  }
5335
5511
  const duration_ms = Date.now() - start;
5336
5512
  if (embedded > 0 || stale_reembedded > 0 || orphans_cleaned > 0) {
5337
- this.logger.info(LOG_KINDS.EMBEDDING_RECONCILE, "Reconcile cycle completed", {
5338
- embedded,
5339
- stale_reembedded,
5340
- orphans_cleaned,
5341
- duration_ms
5342
- });
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
+ );
5343
5525
  }
5344
5526
  return { embedded, stale_reembedded, orphans_cleaned, duration_ms };
5345
5527
  }
@@ -5363,7 +5545,12 @@ var EmbeddingManager = class {
5363
5545
  rebuildAll() {
5364
5546
  const { cleared } = this.vectorStore.clear();
5365
5547
  this.recordSource.clearAllEmbedded();
5366
- 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
+ );
5367
5554
  return { queued: cleared };
5368
5555
  }
5369
5556
  /**
@@ -5376,25 +5563,14 @@ var EmbeddingManager = class {
5376
5563
  const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
5377
5564
  if (staleIds.length === 0) continue;
5378
5565
  const records = this.recordSource.getRecordContent(namespace, staleIds);
5379
- for (const record of records) {
5380
- const embedding = await this.embeddingProvider.embed(record.text);
5381
- if (embedding === null) {
5382
- this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during re-embed", {
5383
- namespace,
5384
- reembedded
5385
- });
5386
- return { reembedded };
5387
- }
5388
- const hash = this.contentHash(record.text);
5389
- this.vectorStore.upsert(namespace, record.id, embedding, {
5390
- model: currentModel,
5391
- provider: this.embeddingProvider.providerName,
5392
- dimensions: this.embeddingProvider.dimensions,
5393
- content_hash: hash,
5394
- embedded_at: epochSeconds(),
5395
- 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
5396
5572
  });
5397
- reembedded++;
5573
+ return { reembedded };
5398
5574
  }
5399
5575
  }
5400
5576
  return { reembedded };
@@ -5479,6 +5655,21 @@ var DEFAULT_META_MODEL = "unknown";
5479
5655
  var DEFAULT_META_PROVIDER = "unknown";
5480
5656
  var DEFAULT_META_CONTENT_HASH = "";
5481
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
+ };
5482
5673
  function cosineDistanceToSimilarity(distance) {
5483
5674
  return 1 - distance;
5484
5675
  }
@@ -5782,6 +5973,20 @@ var SqliteVecVectorStore = class {
5782
5973
  if (FILTERABLE_COLUMNS.has(key)) {
5783
5974
  conditions.push(`em.${key} = ?`);
5784
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);
5785
5990
  }
5786
5991
  }
5787
5992
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
@@ -5869,14 +6074,16 @@ var EmbeddingProviderAdapter = class {
5869
6074
  var ACTIVE_STATUS2 = "active";
5870
6075
  function sessionMetadata(row) {
5871
6076
  return {
5872
- ...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 } : {}
5873
6079
  };
5874
6080
  }
5875
6081
  function sporeMetadata(row) {
5876
6082
  return {
5877
6083
  ...row.status != null ? { status: row.status } : {},
5878
6084
  ...row.session_id != null ? { session_id: row.session_id } : {},
5879
- ...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 } : {}
5880
6087
  };
5881
6088
  }
5882
6089
  function emptyMetadata() {
@@ -5885,13 +6092,15 @@ function emptyMetadata() {
5885
6092
  function planMetadata(row) {
5886
6093
  return {
5887
6094
  ...row.session_id != null ? { session_id: row.session_id } : {},
5888
- ...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 } : {}
5889
6097
  };
5890
6098
  }
5891
6099
  function skillRecordMetadata(row) {
5892
6100
  return {
5893
6101
  ...row.status != null ? { status: row.status } : {},
5894
- ...row.name != null ? { name: row.name } : {}
6102
+ ...row.name != null ? { name: row.name } : {},
6103
+ ...row.created_at != null ? { created_at: row.created_at } : {}
5895
6104
  };
5896
6105
  }
5897
6106
  function metadataFor(namespace, row) {
@@ -7095,7 +7304,7 @@ async function registerScheduledTasks(powerManager, deps) {
7095
7304
  lastEnabled = enabled;
7096
7305
  }
7097
7306
  if (!enabled) return;
7098
- const { runAgent: runAgent2 } = await import("./executor-DO6QFC6G.js");
7307
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
7099
7308
  const resumableRun = getLatestResumableRunForTask(DEFAULT_AGENT_ID, taskName);
7100
7309
  if (resumableRun) {
7101
7310
  const resumed = await runAgent2(vaultDir, {
@@ -7457,7 +7666,8 @@ function createMcpProxyHandlers(deps) {
7457
7666
  });
7458
7667
  embeddingManager.onContentWritten("spores", spore.id, content, {
7459
7668
  status: "active",
7460
- observation_type: observationType
7669
+ observation_type: observationType,
7670
+ created_at: now
7461
7671
  }).catch(() => {
7462
7672
  });
7463
7673
  return {
@@ -7534,7 +7744,8 @@ function createMcpProxyHandlers(deps) {
7534
7744
  })();
7535
7745
  embeddingManager.onContentWritten("spores", wisdom.id, consolidated_content, {
7536
7746
  status: "active",
7537
- observation_type
7747
+ observation_type,
7748
+ created_at: now
7538
7749
  }).catch(() => {
7539
7750
  });
7540
7751
  for (const sourceId of sourcesSuperseded) {
@@ -8088,7 +8299,7 @@ function createAgentRunHandlers(deps) {
8088
8299
  };
8089
8300
  }
8090
8301
  }
8091
- const { runAgent: runAgent2 } = await import("./executor-DO6QFC6G.js");
8302
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
8092
8303
  const resultPromise = runAgent2(vaultDir, {
8093
8304
  task,
8094
8305
  instruction,
@@ -8178,7 +8389,7 @@ function createAgentRunHandlers(deps) {
8178
8389
  return { status: 400, body: { error: "Run is not resumable" } };
8179
8390
  }
8180
8391
  const { mode } = ResumeRunBody.parse(req.body ?? {});
8181
- const { runAgent: runAgent2 } = await import("./executor-DO6QFC6G.js");
8392
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
8182
8393
  const resultPromise = runAgent2(vaultDir, {
8183
8394
  agentId: run.agent_id,
8184
8395
  task: run.task ?? void 0,
@@ -8409,7 +8620,7 @@ function createAgentEvaluationHandlers(deps) {
8409
8620
  });
8410
8621
  const dryRun = body.matrix.dryRun ?? false;
8411
8622
  void (async () => {
8412
- const { runAgent: runAgent2 } = await import("./executor-DO6QFC6G.js");
8623
+ const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
8413
8624
  let anyCompleted = false;
8414
8625
  let transitionedToRunning = false;
8415
8626
  const sharedPhases = body.matrix.phases;
@@ -9835,7 +10046,8 @@ function createStopProcessor(deps) {
9835
10046
  }
9836
10047
  }
9837
10048
  const existingSessionMeta = registry.getSession(sessionId);
9838
- if (!hookTranscriptPath && !existingSessionMeta) {
10049
+ const dbSession = existingSessionMeta ? void 0 : getSession(sessionId);
10050
+ if (!hookTranscriptPath && !existingSessionMeta && !dbSession) {
9839
10051
  logger.info(LOG_KINDS.HOOKS_STOP, "Stop ignored \u2014 ephemeral sub-invocation", {
9840
10052
  session_id: sessionId
9841
10053
  });
@@ -9843,7 +10055,7 @@ function createStopProcessor(deps) {
9843
10055
  }
9844
10056
  if (!existingSessionMeta) {
9845
10057
  registry.register(sessionId, { started_at: (/* @__PURE__ */ new Date()).toISOString() });
9846
- 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 });
9847
10059
  }
9848
10060
  const sessionMeta = existingSessionMeta ?? registry.getSession(sessionId);
9849
10061
  logger.info(LOG_KINDS.HOOKS_STOP, "Stop received", {
@@ -9937,44 +10149,55 @@ function createEventDispatcher(deps) {
9937
10149
  };
9938
10150
  logger.debug(LOG_KINDS.HOOKS_EVENT, "Event received", { type: event.type, session_id: event.session_id });
9939
10151
  if (!registry.getSession(event.session_id)) {
9940
- const cached = droppedSessions.get(event.session_id);
9941
- const hasTranscriptNow = typeof event.transcript_path === "string" && event.transcript_path.length > 0;
9942
- const shouldReevaluate = cached && !cached.hadTranscriptMeta && hasTranscriptNow;
9943
- if (cached && !shouldReevaluate) {
9944
- const reason = cached.reason ?? "rule";
9945
- 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", {
9946
10156
  session_id: event.session_id,
9947
- type: event.type,
9948
- reason
10157
+ agent: existingRow.agent,
10158
+ type: event.type
9949
10159
  });
9950
- return { body: { ok: true, ignored: reason } };
9951
- }
9952
- if (shouldReevaluate) {
9953
- droppedSessions.delete(event.session_id);
9954
- }
9955
- const { decision, hadTranscriptMeta } = evaluateAutoRegistration(event);
9956
- if (decision.action === "drop") {
9957
- rememberDropped(event.session_id, decision.reason, hadTranscriptMeta);
9958
- logger.info(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event that failed session capture rules", {
9959
- session_id: event.session_id,
9960
- type: event.type,
9961
- 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
9962
10198
  });
9963
- return { body: { ok: true, ignored: decision.reason ?? "rule" } };
10199
+ reconcileSession(event.session_id);
9964
10200
  }
9965
- registry.register(event.session_id, { started_at: event.timestamp });
9966
- logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from event", { session_id: event.session_id });
9967
- const now = epochSeconds();
9968
- const startedEpoch = Math.floor(new Date(event.timestamp).getTime() / 1e3);
9969
- upsertSession({
9970
- id: event.session_id,
9971
- agent: event.agent ?? DEFAULT_SYMBIONT_NAME,
9972
- status: "active",
9973
- started_at: startedEpoch,
9974
- created_at: now,
9975
- machine_id: machineId
9976
- });
9977
- reconcileSession(event.session_id);
9978
10201
  }
9979
10202
  if (!sessionBuffers.has(event.session_id)) {
9980
10203
  const bufferDir = path23.join(vaultDir, "buffer");
@@ -10914,4 +11137,4 @@ export {
10914
11137
  handleUserPrompt,
10915
11138
  main
10916
11139
  };
10917
- //# sourceMappingURL=main-4J4QZZTZ.js.map
11140
+ //# sourceMappingURL=main-4HKTZFIM.js.map