@goondocks/myco 0.18.0 → 0.18.1

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 (128) hide show
  1. package/dist/{agent-run-2NFYMQXW.js → agent-run-I4O2K2CK.js} +4 -4
  2. package/dist/{agent-tasks-MEIYLXGN.js → agent-tasks-UOW5BQIB.js} +4 -4
  3. package/dist/{chunk-JMOUFG6Y.js → chunk-44PZCAYS.js} +47 -5
  4. package/dist/chunk-44PZCAYS.js.map +1 -0
  5. package/dist/{chunk-JDI4DPWD.js → chunk-C3EGL5JX.js} +632 -145
  6. package/dist/chunk-C3EGL5JX.js.map +1 -0
  7. package/dist/{chunk-OW433Q4C.js → chunk-CURS2TNP.js} +44 -3
  8. package/dist/chunk-CURS2TNP.js.map +1 -0
  9. package/dist/{chunk-FABWUX5G.js → chunk-DPSLJ242.js} +16 -2
  10. package/dist/chunk-DPSLJ242.js.map +1 -0
  11. package/dist/{chunk-DLFDBKEV.js → chunk-LSP5HYOO.js} +17 -14
  12. package/dist/chunk-LSP5HYOO.js.map +1 -0
  13. package/dist/{chunk-VOCGURV7.js → chunk-N75GMQGA.js} +3 -3
  14. package/dist/{chunk-U7GJTVSX.js → chunk-RIDSOQDR.js} +20 -6
  15. package/dist/chunk-RIDSOQDR.js.map +1 -0
  16. package/dist/{chunk-KWTOCJLB.js → chunk-TCSVDQF5.js} +1128 -193
  17. package/dist/chunk-TCSVDQF5.js.map +1 -0
  18. package/dist/{chunk-55QEICRO.js → chunk-TLK46KKD.js} +2 -2
  19. package/dist/{chunk-NZI7WBZI.js → chunk-TOER6RNC.js} +21 -1
  20. package/dist/chunk-TOER6RNC.js.map +1 -0
  21. package/dist/{chunk-7OYXB2NM.js → chunk-TZAXQKO6.js} +5 -1
  22. package/dist/chunk-TZAXQKO6.js.map +1 -0
  23. package/dist/{chunk-EO2RQW4S.js → chunk-W7WENJ6F.js} +2 -2
  24. package/dist/{chunk-BUIR3JWM.js → chunk-XWOQL4XN.js} +2 -2
  25. package/dist/{chunk-PFWIPRF6.js → chunk-YZPI2Y3E.js} +2 -2
  26. package/dist/{cli-IIMBALPV.js → cli-D3TJYJ2U.js} +35 -35
  27. package/dist/{client-VZCUISHZ.js → client-4LLEXLVK.js} +3 -3
  28. package/dist/{detect-GEM3NVK6.js → detect-SZ2KDUF4.js} +2 -2
  29. package/dist/{doctor-QYD34X7Q.js → doctor-KCTXPX5D.js} +6 -6
  30. package/dist/{executor-NSPRTH4M.js → executor-UYIZC3L5.js} +83 -275
  31. package/dist/executor-UYIZC3L5.js.map +1 -0
  32. package/dist/{init-WYYL44KZ.js → init-QFNBKKDC.js} +7 -7
  33. package/dist/{llm-KEDHK3TQ.js → llm-SMA5ZEAW.js} +2 -2
  34. package/dist/{main-6PY3ITQ5.js → main-5THODR77.js} +427 -196
  35. package/dist/main-5THODR77.js.map +1 -0
  36. package/dist/{open-HRFMJDQX.js → open-7737CSPN.js} +4 -4
  37. package/dist/{post-compact-HT24YMAN.js → post-compact-2TJ5FPZH.js} +6 -6
  38. package/dist/{post-tool-use-DENRI5WB.js → post-tool-use-FRTSICC3.js} +5 -5
  39. package/dist/{post-tool-use-failure-A6SNJX42.js → post-tool-use-failure-KYO2NCNB.js} +6 -6
  40. package/dist/{pre-compact-3Q4BALCL.js → pre-compact-J6GCJEJR.js} +6 -6
  41. package/dist/{remove-YB5A6HY2.js → remove-3WZZC7AX.js} +5 -5
  42. package/dist/{restart-RGDVHELZ.js → restart-HUHEFOXU.js} +5 -5
  43. package/dist/{search-WOHT3G55.js → search-ZGN3LDXG.js} +5 -5
  44. package/dist/{server-6SUNYDV7.js → server-PTXLVVEE.js} +3 -3
  45. package/dist/{session-W3SKRFRV.js → session-7VV3IQMO.js} +5 -5
  46. package/dist/{session-end-OUTY7AFF.js → session-end-SMU55UCM.js} +5 -5
  47. package/dist/{session-start-5MB3LFOA.js → session-start-NIMWEOIZ.js} +16 -11
  48. package/dist/{session-start-5MB3LFOA.js.map → session-start-NIMWEOIZ.js.map} +1 -1
  49. package/dist/{setup-llm-ZMYGIQX5.js → setup-llm-7S3VPAPN.js} +4 -4
  50. package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
  51. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +10 -0
  52. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +163 -49
  53. package/dist/src/agent/definitions/tasks/skill-generate.yaml +44 -27
  54. package/dist/src/agent/definitions/tasks/skill-survey.yaml +132 -138
  55. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
  56. package/dist/src/cli.js +1 -1
  57. package/dist/src/daemon/main.js +1 -1
  58. package/dist/src/hooks/post-tool-use.js +1 -1
  59. package/dist/src/hooks/session-end.js +1 -1
  60. package/dist/src/hooks/session-start.js +1 -1
  61. package/dist/src/hooks/stop.js +1 -1
  62. package/dist/src/hooks/user-prompt-submit.js +1 -1
  63. package/dist/src/mcp/server.js +1 -1
  64. package/dist/src/symbionts/manifests/codex.yaml +45 -7
  65. package/dist/src/worker/src/index.ts +8 -2
  66. package/dist/src/worker/src/schema.ts +2 -0
  67. package/dist/{stats-DGI6B3HX.js → stats-GEOQ2DFF.js} +5 -5
  68. package/dist/{stop-YGHODSP7.js → stop-7AKYBJJ2.js} +5 -5
  69. package/dist/{stop-failure-7IJTPJ6W.js → stop-failure-NLE2EURG.js} +6 -6
  70. package/dist/{subagent-start-ZBQ5PJB5.js → subagent-start-LBNZF2TG.js} +6 -6
  71. package/dist/{subagent-stop-N2TDQU2D.js → subagent-stop-B2Z5GYAB.js} +6 -6
  72. package/dist/{task-completed-BDLMRSBB.js → task-completed-PO5TETJ7.js} +6 -6
  73. package/dist/{team-2ZFGTSIN.js → team-DPNP2RN7.js} +3 -3
  74. package/dist/ui/assets/{index-DtT9_nlT.js → index-CiI1fwas.js} +2 -2
  75. package/dist/ui/index.html +1 -1
  76. package/dist/{update-STLAN7LR.js → update-WBWB5URU.js} +5 -5
  77. package/dist/{user-prompt-submit-4IBFUYQ3.js → user-prompt-submit-IZJC3NV7.js} +11 -8
  78. package/dist/user-prompt-submit-IZJC3NV7.js.map +1 -0
  79. package/dist/{verify-EJYPO7QA.js → verify-FNSP62I3.js} +2 -2
  80. package/dist/{version-YPBIKH77.js → version-QEVU66NT.js} +2 -2
  81. package/package.json +7 -7
  82. package/dist/chunk-7OYXB2NM.js.map +0 -1
  83. package/dist/chunk-DLFDBKEV.js.map +0 -1
  84. package/dist/chunk-FABWUX5G.js.map +0 -1
  85. package/dist/chunk-JDI4DPWD.js.map +0 -1
  86. package/dist/chunk-JMOUFG6Y.js.map +0 -1
  87. package/dist/chunk-KWTOCJLB.js.map +0 -1
  88. package/dist/chunk-NZI7WBZI.js.map +0 -1
  89. package/dist/chunk-OW433Q4C.js.map +0 -1
  90. package/dist/chunk-U7GJTVSX.js.map +0 -1
  91. package/dist/executor-NSPRTH4M.js.map +0 -1
  92. package/dist/main-6PY3ITQ5.js.map +0 -1
  93. package/dist/user-prompt-submit-4IBFUYQ3.js.map +0 -1
  94. /package/dist/{agent-run-2NFYMQXW.js.map → agent-run-I4O2K2CK.js.map} +0 -0
  95. /package/dist/{agent-tasks-MEIYLXGN.js.map → agent-tasks-UOW5BQIB.js.map} +0 -0
  96. /package/dist/{chunk-VOCGURV7.js.map → chunk-N75GMQGA.js.map} +0 -0
  97. /package/dist/{chunk-55QEICRO.js.map → chunk-TLK46KKD.js.map} +0 -0
  98. /package/dist/{chunk-EO2RQW4S.js.map → chunk-W7WENJ6F.js.map} +0 -0
  99. /package/dist/{chunk-BUIR3JWM.js.map → chunk-XWOQL4XN.js.map} +0 -0
  100. /package/dist/{chunk-PFWIPRF6.js.map → chunk-YZPI2Y3E.js.map} +0 -0
  101. /package/dist/{cli-IIMBALPV.js.map → cli-D3TJYJ2U.js.map} +0 -0
  102. /package/dist/{client-VZCUISHZ.js.map → client-4LLEXLVK.js.map} +0 -0
  103. /package/dist/{detect-GEM3NVK6.js.map → detect-SZ2KDUF4.js.map} +0 -0
  104. /package/dist/{doctor-QYD34X7Q.js.map → doctor-KCTXPX5D.js.map} +0 -0
  105. /package/dist/{init-WYYL44KZ.js.map → init-QFNBKKDC.js.map} +0 -0
  106. /package/dist/{llm-KEDHK3TQ.js.map → llm-SMA5ZEAW.js.map} +0 -0
  107. /package/dist/{open-HRFMJDQX.js.map → open-7737CSPN.js.map} +0 -0
  108. /package/dist/{post-compact-HT24YMAN.js.map → post-compact-2TJ5FPZH.js.map} +0 -0
  109. /package/dist/{post-tool-use-DENRI5WB.js.map → post-tool-use-FRTSICC3.js.map} +0 -0
  110. /package/dist/{post-tool-use-failure-A6SNJX42.js.map → post-tool-use-failure-KYO2NCNB.js.map} +0 -0
  111. /package/dist/{pre-compact-3Q4BALCL.js.map → pre-compact-J6GCJEJR.js.map} +0 -0
  112. /package/dist/{remove-YB5A6HY2.js.map → remove-3WZZC7AX.js.map} +0 -0
  113. /package/dist/{restart-RGDVHELZ.js.map → restart-HUHEFOXU.js.map} +0 -0
  114. /package/dist/{search-WOHT3G55.js.map → search-ZGN3LDXG.js.map} +0 -0
  115. /package/dist/{server-6SUNYDV7.js.map → server-PTXLVVEE.js.map} +0 -0
  116. /package/dist/{session-W3SKRFRV.js.map → session-7VV3IQMO.js.map} +0 -0
  117. /package/dist/{session-end-OUTY7AFF.js.map → session-end-SMU55UCM.js.map} +0 -0
  118. /package/dist/{setup-llm-ZMYGIQX5.js.map → setup-llm-7S3VPAPN.js.map} +0 -0
  119. /package/dist/{stats-DGI6B3HX.js.map → stats-GEOQ2DFF.js.map} +0 -0
  120. /package/dist/{stop-YGHODSP7.js.map → stop-7AKYBJJ2.js.map} +0 -0
  121. /package/dist/{stop-failure-7IJTPJ6W.js.map → stop-failure-NLE2EURG.js.map} +0 -0
  122. /package/dist/{subagent-start-ZBQ5PJB5.js.map → subagent-start-LBNZF2TG.js.map} +0 -0
  123. /package/dist/{subagent-stop-N2TDQU2D.js.map → subagent-stop-B2Z5GYAB.js.map} +0 -0
  124. /package/dist/{task-completed-BDLMRSBB.js.map → task-completed-PO5TETJ7.js.map} +0 -0
  125. /package/dist/{team-2ZFGTSIN.js.map → team-DPNP2RN7.js.map} +0 -0
  126. /package/dist/{update-STLAN7LR.js.map → update-WBWB5URU.js.map} +0 -0
  127. /package/dist/{verify-EJYPO7QA.js.map → verify-FNSP62I3.js.map} +0 -0
  128. /package/dist/{version-YPBIKH77.js.map → version-QEVU66NT.js.map} +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-MYX5NCRH.js";
14
14
  import {
15
15
  DaemonClient
16
- } from "./chunk-BUIR3JWM.js";
16
+ } from "./chunk-XWOQL4XN.js";
17
17
 
18
18
  // src/cli/shared.ts
19
19
  import fs from "fs";
@@ -120,4 +120,4 @@ export {
120
120
  VAULT_GITIGNORE,
121
121
  registerSymbionts
122
122
  };
123
- //# sourceMappingURL=chunk-55QEICRO.js.map
123
+ //# sourceMappingURL=chunk-TLK46KKD.js.map
@@ -125,6 +125,9 @@ function hydrateSearchResults(vectorResults) {
125
125
  const artifactStmt = db.prepare(
126
126
  `SELECT id, title, content FROM artifacts WHERE id IN (SELECT value FROM json_each(?))`
127
127
  );
128
+ const skillStmt = db.prepare(
129
+ `SELECT id, name, display_name, description FROM skill_records WHERE id IN (SELECT value FROM json_each(?))`
130
+ );
128
131
  const sessionResults = byNamespace.get("sessions");
129
132
  if (sessionResults && sessionResults.length > 0) {
130
133
  const ids = sessionResults.map((r) => r.id);
@@ -195,6 +198,23 @@ function hydrateSearchResults(vectorResults) {
195
198
  });
196
199
  }
197
200
  }
201
+ const skillResults = byNamespace.get("skill_records");
202
+ if (skillResults && skillResults.length > 0) {
203
+ const ids = skillResults.map((r) => r.id);
204
+ const rows = skillStmt.all(JSON.stringify(ids));
205
+ const rowMap = new Map(rows.map((r) => [r.id, r]));
206
+ for (const vr of skillResults) {
207
+ const row = rowMap.get(vr.id);
208
+ if (!row) continue;
209
+ results.push({
210
+ id: row.id,
211
+ type: "skill",
212
+ title: row.display_name || row.name,
213
+ preview: row.description.slice(0, SEARCH_PREVIEW_CHARS),
214
+ score: vr.similarity
215
+ });
216
+ }
217
+ }
198
218
  results.sort((a, b) => b.score - a.score);
199
219
  return results;
200
220
  }
@@ -203,4 +223,4 @@ export {
203
223
  fullTextSearch,
204
224
  hydrateSearchResults
205
225
  };
206
- //# sourceMappingURL=chunk-NZI7WBZI.js.map
226
+ //# sourceMappingURL=chunk-TOER6RNC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/queries/search.ts"],"sourcesContent":["/**\n * Full-text search using SQLite FTS5.\n *\n * Searches prompt_batches and activities via their FTS5 virtual tables.\n * Semantic search (vector similarity) is handled by the external VectorStore —\n * this module covers text-based retrieval only.\n *\n * All queries use parameterized placeholders throughout.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport {\n SEARCH_RESULTS_DEFAULT_LIMIT,\n SEARCH_PREVIEW_CHARS,\n} from '@myco/constants.js';\nimport type { VectorSearchResult } from '@myco/daemon/embedding/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** All result types that can appear in search results. */\nexport type SearchResultType =\n | 'session'\n | 'spore'\n | 'plan'\n | 'artifact'\n | 'prompt_batch'\n | 'activity'\n | 'skill';\n\n/** A single result returned from full-text or semantic search. */\nexport interface SearchResult {\n id: string;\n type: SearchResultType;\n title: string;\n preview: string;\n score: number;\n session_id?: string;\n}\n\n/** Options for fullTextSearch. */\nexport interface SearchOptions {\n /** Restrict results to a single type. */\n type?: string;\n /** Maximum number of results to return (default: SEARCH_RESULTS_DEFAULT_LIMIT). */\n limit?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Full-text search across capture tables using SQLite FTS5.\n *\n * Searches prompt_batches (indexed on user_prompt) and activities (indexed\n * on tool_name, tool_input, file_path). The raw query string is passed\n * directly to FTS5 MATCH — callers should sanitize if needed.\n *\n * FTS5 `rank` values are negative (lower = better match). This function\n * converts them to positive scores via `Math.abs()` so higher = better\n * in the returned results.\n *\n * When `options.type` is specified, only the matching table branch is queried.\n *\n * @param query — search string (FTS5 MATCH syntax)\n * @param options — optional type filter and result limit\n * @returns SearchResult[] ordered by score DESC\n */\nexport function fullTextSearch(\n query: string,\n options: SearchOptions = {},\n): SearchResult[] {\n const db = getDatabase();\n const limit = options.limit ?? SEARCH_RESULTS_DEFAULT_LIMIT;\n const typeFilter = options.type;\n\n const results: SearchResult[] = [];\n\n // -- prompt_batches branch ------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'prompt_batch') {\n const batchRows = db.prepare(\n `SELECT pb.id, pb.prompt_number, pb.session_id,\n substr(COALESCE(pb.user_prompt, '') || ' ' || COALESCE(pb.response_summary, ''), 1, ?) AS preview,\n fts.rank\n FROM prompt_batches_fts fts\n JOIN prompt_batches pb ON pb.id = fts.rowid\n WHERE prompt_batches_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`\n ).all(SEARCH_PREVIEW_CHARS, query, limit) as Array<{\n id: number;\n prompt_number: number | null;\n session_id: string | null;\n preview: string;\n rank: number;\n }>;\n\n for (const row of batchRows) {\n results.push({\n id: String(row.id),\n type: 'prompt_batch',\n title: row.prompt_number != null\n ? `Batch #${row.prompt_number}`\n : `Batch ${row.id}`,\n preview: row.preview,\n score: Math.abs(row.rank),\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // -- activities branch ----------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'activity') {\n const activityRows = db.prepare(\n `SELECT a.id, a.tool_name, a.tool_input, a.file_path, a.session_id,\n fts.rank\n FROM activities_fts fts\n JOIN activities a ON a.id = fts.rowid\n WHERE activities_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`\n ).all(query, limit) as Array<{\n id: number;\n tool_name: string;\n tool_input: string | null;\n file_path: string | null;\n session_id: string | null;\n rank: number;\n }>;\n\n for (const row of activityRows) {\n const preview = (row.tool_input ?? row.file_path ?? '').slice(0, SEARCH_PREVIEW_CHARS);\n results.push({\n id: String(row.id),\n type: 'activity',\n title: row.tool_name,\n preview,\n score: Math.abs(row.rank),\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // -- spores branch --------------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'spore') {\n const sporeRows = db.prepare(\n `SELECT s.id, s.observation_type, s.session_id,\n substr(COALESCE(s.content, ''), 1, ?) AS preview,\n fts.rank\n FROM spores_fts fts\n JOIN spores s ON s.rowid = fts.rowid\n WHERE spores_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`\n ).all(SEARCH_PREVIEW_CHARS, query, limit) as Array<{\n id: string;\n observation_type: string;\n session_id: string | null;\n preview: string;\n rank: number;\n }>;\n\n for (const row of sporeRows) {\n results.push({\n id: String(row.id),\n type: 'spore',\n title: row.observation_type,\n preview: row.preview,\n score: Math.abs(row.rank),\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // -- sessions branch ------------------------------------------------------\n if (typeFilter === undefined || typeFilter === 'session') {\n const sessionRows = db.prepare(\n `SELECT s.id, s.title,\n substr(COALESCE(s.summary, s.title, ''), 1, ?) AS preview,\n fts.rank\n FROM sessions_fts fts\n JOIN sessions s ON s.rowid = fts.rowid\n WHERE sessions_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`\n ).all(SEARCH_PREVIEW_CHARS, query, limit) as Array<{\n id: string;\n title: string | null;\n preview: string;\n rank: number;\n }>;\n\n for (const row of sessionRows) {\n results.push({\n id: String(row.id),\n type: 'session',\n title: row.title ?? `Session ${row.id.slice(-6)}`,\n preview: row.preview,\n score: Math.abs(row.rank),\n });\n }\n }\n\n // Sort combined results by score DESC and apply limit.\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, limit);\n}\n\n// ---------------------------------------------------------------------------\n// Hydration — convert VectorSearchResults into SearchResults\n// ---------------------------------------------------------------------------\n\n/** Row shape returned from sessions table for hydration. */\ninterface SessionRow {\n id: string;\n title: string | null;\n summary: string | null;\n session_id?: undefined;\n}\n\n/** Row shape returned from spores table for hydration. */\ninterface SporeRow {\n id: string;\n observation_type: string;\n content: string;\n session_id: string | null;\n}\n\n/** Row shape returned from plans table for hydration. */\ninterface PlanRow {\n id: string;\n title: string | null;\n content: string | null;\n session_id: string | null;\n}\n\n/** Row shape returned from artifacts table for hydration. */\ninterface ArtifactRow {\n id: string;\n title: string;\n content: string | null;\n}\n\n/**\n * Hydrate vector search results into SearchResults by fetching full records\n * from the record store.\n *\n * Groups results by namespace, queries each table for the relevant IDs, then\n * maps them into SearchResult format with titles and previews.\n */\nexport function hydrateSearchResults(\n vectorResults: VectorSearchResult[],\n): SearchResult[] {\n if (vectorResults.length === 0) return [];\n\n const db = getDatabase();\n const results: SearchResult[] = [];\n\n // Group result IDs by namespace\n const byNamespace = new Map<string, VectorSearchResult[]>();\n for (const vr of vectorResults) {\n const group = byNamespace.get(vr.namespace) ?? [];\n group.push(vr);\n byNamespace.set(vr.namespace, group);\n }\n\n // Use json_each so the statement text is stable and SQLite can cache the plan.\n const sessionStmt = db.prepare(\n `SELECT id, title, summary FROM sessions WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const sporeStmt = db.prepare(\n `SELECT id, observation_type, content, session_id FROM spores WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const planStmt = db.prepare(\n `SELECT id, title, content, session_id FROM plans WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const artifactStmt = db.prepare(\n `SELECT id, title, content FROM artifacts WHERE id IN (SELECT value FROM json_each(?))`,\n );\n const skillStmt = db.prepare(\n `SELECT id, name, display_name, description FROM skill_records WHERE id IN (SELECT value FROM json_each(?))`,\n );\n\n // --- sessions ---\n const sessionResults = byNamespace.get('sessions');\n if (sessionResults && sessionResults.length > 0) {\n const ids = sessionResults.map((r) => r.id);\n const rows = sessionStmt.all(JSON.stringify(ids)) as SessionRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of sessionResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'session',\n title: row.title ?? `Session ${row.id.slice(-6)}`,\n preview: (row.summary ?? '').slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n });\n }\n }\n\n // --- spores ---\n const sporeResults = byNamespace.get('spores');\n if (sporeResults && sporeResults.length > 0) {\n const ids = sporeResults.map((r) => r.id);\n const rows = sporeStmt.all(JSON.stringify(ids)) as SporeRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of sporeResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'spore',\n title: row.observation_type,\n preview: row.content.slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // --- plans ---\n const planResults = byNamespace.get('plans');\n if (planResults && planResults.length > 0) {\n const ids = planResults.map((r) => r.id);\n const rows = planStmt.all(JSON.stringify(ids)) as PlanRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of planResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'plan',\n title: row.title ?? `Plan ${row.id.slice(-6)}`,\n preview: (row.content ?? '').slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n ...(row.session_id != null ? { session_id: row.session_id } : {}),\n });\n }\n }\n\n // --- artifacts ---\n const artifactResults = byNamespace.get('artifacts');\n if (artifactResults && artifactResults.length > 0) {\n const ids = artifactResults.map((r) => r.id);\n const rows = artifactStmt.all(JSON.stringify(ids)) as ArtifactRow[];\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of artifactResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'artifact',\n title: row.title,\n preview: (row.content ?? '').slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n });\n }\n }\n\n // --- skill_records ---\n const skillResults = byNamespace.get('skill_records');\n if (skillResults && skillResults.length > 0) {\n const ids = skillResults.map((r) => r.id);\n const rows = skillStmt.all(JSON.stringify(ids)) as Array<{ id: string; name: string; display_name: string; description: string }>;\n\n const rowMap = new Map(rows.map((r) => [r.id, r]));\n for (const vr of skillResults) {\n const row = rowMap.get(vr.id);\n if (!row) continue;\n results.push({\n id: row.id,\n type: 'skill',\n title: row.display_name || row.name,\n preview: row.description.slice(0, SEARCH_PREVIEW_CHARS),\n score: vr.similarity,\n });\n }\n }\n\n // Preserve the original similarity-based ordering from vector search\n results.sort((a, b) => b.score - a.score);\n return results;\n}\n"],"mappings":"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","names":[]}
@@ -124,6 +124,10 @@ function buildSporeWhere(options) {
124
124
  const pattern = `%${options.search}%`;
125
125
  params.push(pattern, pattern);
126
126
  }
127
+ if (options.since !== void 0) {
128
+ conditions.push("created_at > ?");
129
+ params.push(options.since);
130
+ }
127
131
  return {
128
132
  where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
129
133
  params
@@ -183,4 +187,4 @@ export {
183
187
  listSporeIdsSince,
184
188
  updateSporeStatus
185
189
  };
186
- //# sourceMappingURL=chunk-7OYXB2NM.js.map
190
+ //# sourceMappingURL=chunk-TZAXQKO6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/queries/spores.ts"],"sourcesContent":["/**\n * Spore CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getTeamMachineId } from '@myco/daemon/team-context.js';\nimport { syncRow } from '@myco/db/queries/team-outbox.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of spores returned by listSpores when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default spore status for new spores. */\nconst DEFAULT_STATUS = 'active';\n\n/** Default importance score for new spores. */\nexport const DEFAULT_IMPORTANCE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a spore. */\nexport interface SporeInsert {\n id: string;\n agent_id: string;\n observation_type: string;\n content: string;\n created_at: number;\n session_id?: string | null;\n prompt_batch_id?: number | null;\n status?: string;\n context?: string | null;\n importance?: number;\n file_path?: string | null;\n tags?: string | null;\n content_hash?: string | null;\n properties?: string | null;\n updated_at?: number | null;\n machine_id?: string;\n}\n\n/** Row shape returned from spore queries (all columns). */\nexport interface SporeRow {\n id: string;\n agent_id: string;\n session_id: string | null;\n prompt_batch_id: number | null;\n observation_type: string;\n status: string;\n content: string;\n context: string | null;\n importance: number;\n file_path: string | null;\n tags: string | null;\n content_hash: string | null;\n properties: string | null;\n embedded: number;\n created_at: number;\n updated_at: number | null;\n machine_id: string;\n synced_at: number | null;\n}\n\n/** Filter options for `listSpores`. */\nexport interface ListSporesOptions {\n agent_id?: string;\n observation_type?: string;\n status?: string;\n session_id?: string;\n search?: string;\n /** Only return spores created after this epoch-seconds timestamp. */\n since?: number;\n limit?: number;\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst SPORE_COLUMNS = [\n 'id',\n 'agent_id',\n 'session_id',\n 'prompt_batch_id',\n 'observation_type',\n 'status',\n 'content',\n 'context',\n 'importance',\n 'file_path',\n 'tags',\n 'content_hash',\n 'properties',\n 'embedded',\n 'created_at',\n 'updated_at',\n 'machine_id',\n 'synced_at',\n] as const;\n\nconst SELECT_COLUMNS = SPORE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed SporeRow. */\nfunction toSporeRow(row: Record<string, unknown>): SporeRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n session_id: (row.session_id as string) ?? null,\n prompt_batch_id: (row.prompt_batch_id as number) ?? null,\n observation_type: row.observation_type as string,\n status: row.status as string,\n content: row.content as string,\n context: (row.context as string) ?? null,\n importance: row.importance as number,\n file_path: (row.file_path as string) ?? null,\n tags: (row.tags as string) ?? null,\n content_hash: (row.content_hash as string) ?? null,\n properties: (row.properties as string) ?? null,\n embedded: (row.embedded as number) ?? 0,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n machine_id: (row.machine_id as string) ?? 'local',\n synced_at: (row.synced_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new spore.\n *\n * Requires a valid `agent_id` (foreign key to agents table).\n */\nexport function insertSpore(data: SporeInsert): SporeRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO spores (\n id, agent_id, session_id, prompt_batch_id,\n observation_type, status, content, context,\n importance, file_path, tags, content_hash,\n properties, created_at, updated_at, machine_id\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.id,\n data.agent_id,\n data.session_id ?? null,\n data.prompt_batch_id ?? null,\n data.observation_type,\n data.status ?? DEFAULT_STATUS,\n data.content,\n data.context ?? null,\n data.importance ?? DEFAULT_IMPORTANCE,\n data.file_path ?? null,\n data.tags ?? null,\n data.content_hash ?? null,\n data.properties ?? null,\n data.created_at,\n data.updated_at ?? null,\n data.machine_id ?? getTeamMachineId(),\n );\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n\n/**\n * Retrieve a single spore by id.\n *\n * @returns the spore row, or null if not found.\n */\nexport function getSpore(id: string): SporeRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toSporeRow(row);\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\n/** Build WHERE clause and bound params from spore filter options. */\nfunction buildSporeWhere(\n options: Omit<ListSporesOptions, 'limit' | 'offset'>,\n): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n if (options.observation_type !== undefined) {\n conditions.push(`observation_type = ?`);\n params.push(options.observation_type);\n }\n if (options.status !== undefined) {\n conditions.push(`status = ?`);\n params.push(options.status);\n }\n if (options.session_id !== undefined) {\n conditions.push(`session_id = ?`);\n params.push(options.session_id);\n }\n if (options.search !== undefined && options.search.length > 0) {\n conditions.push(`(content LIKE ? OR observation_type LIKE ?)`);\n const pattern = `%${options.search}%`;\n params.push(pattern, pattern);\n }\n if (options.since !== undefined) {\n conditions.push('created_at > ?');\n params.push(options.since);\n }\n\n return {\n where: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n };\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\nexport function listSpores(\n options: ListSporesOptions = {},\n): SporeRow[] {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n const offset = options.offset ?? 0;\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM spores\n ${where}\n ORDER BY created_at DESC\n LIMIT ?\n OFFSET ?`,\n ).all(...params, limit, offset) as Record<string, unknown>[];\n\n return rows.map(toSporeRow);\n}\n\n/**\n * Count spores matching optional filters (for pagination totals).\n */\nexport function countSpores(\n options: Omit<ListSporesOptions, 'limit' | 'offset'> = {},\n): number {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores ${where}`,\n ).get(...params) as { count: number };\n\n return row.count;\n}\n\n/**\n * Count active spores created after a given timestamp.\n * Used by skill-evolve to detect new knowledge since last assessment.\n */\nexport function countSporesSince(sinceEpoch: number): number {\n const db = getDatabase();\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores WHERE created_at > ? AND status = 'active'`,\n ).get(sinceEpoch) as { count: number };\n return row.count;\n}\n\n/**\n * List active spore IDs created after a given timestamp, ordered newest first.\n */\nexport function listSporeIdsSince(sinceEpoch: number, limit = 20): string[] {\n const db = getDatabase();\n const rows = db.prepare(\n `SELECT id FROM spores WHERE created_at > ? AND status = 'active' ORDER BY created_at DESC LIMIT ?`,\n ).all(sinceEpoch, limit) as Array<{ id: string }>;\n return rows.map(r => r.id);\n}\n\n/**\n * Update the status and updated_at timestamp of a spore.\n *\n * @returns the updated row, or null if the spore does not exist.\n */\nexport function updateSporeStatus(\n id: string,\n status: string,\n updatedAt: number,\n): SporeRow | null {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE spores\n SET status = ?, updated_at = ?\n WHERE id = ?`,\n ).run(status, updatedAt, id);\n\n if (info.changes === 0) return null;\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n"],"mappings":"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","names":[]}
@@ -11,7 +11,7 @@ var cached;
11
11
  function getPluginVersion() {
12
12
  if (cached) return cached;
13
13
  if (true) {
14
- cached = "0.18.0";
14
+ cached = "0.18.1";
15
15
  return cached;
16
16
  }
17
17
  const root = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
@@ -32,4 +32,4 @@ function getPluginVersion() {
32
32
  export {
33
33
  getPluginVersion
34
34
  };
35
- //# sourceMappingURL=chunk-EO2RQW4S.js.map
35
+ //# sourceMappingURL=chunk-W7WENJ6F.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  getPluginVersion
4
- } from "./chunk-EO2RQW4S.js";
4
+ } from "./chunk-W7WENJ6F.js";
5
5
  import {
6
6
  DAEMON_CLIENT_TIMEOUT_MS,
7
7
  DAEMON_HEALTH_CHECK_TIMEOUT_MS,
@@ -185,4 +185,4 @@ export {
185
185
  resolveCliEntryPath,
186
186
  DaemonClient
187
187
  };
188
- //# sourceMappingURL=chunk-BUIR3JWM.js.map
188
+ //# sourceMappingURL=chunk-XWOQL4XN.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  loadManifests
4
- } from "./chunk-FABWUX5G.js";
4
+ } from "./chunk-DPSLJ242.js";
5
5
  import {
6
6
  STDIN_TIMEOUT_MS
7
7
  } from "./chunk-CKJAWZQE.js";
@@ -114,4 +114,4 @@ export {
114
114
  readStdin,
115
115
  normalizeHookInput
116
116
  };
117
- //# sourceMappingURL=chunk-PFWIPRF6.js.map
117
+ //# sourceMappingURL=chunk-YZPI2Y3E.js.map
@@ -2,7 +2,7 @@
2
2
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
3
3
  import {
4
4
  loadEnv
5
- } from "./chunk-55QEICRO.js";
5
+ } from "./chunk-TLK46KKD.js";
6
6
  import "./chunk-SAKJMNSR.js";
7
7
  import "./chunk-WYOE4IAX.js";
8
8
  import "./chunk-CML4MCYF.js";
@@ -10,8 +10,8 @@ import "./chunk-MYX5NCRH.js";
10
10
  import {
11
11
  resolveVaultDir
12
12
  } from "./chunk-5ZT2Q6P5.js";
13
- import "./chunk-BUIR3JWM.js";
14
- import "./chunk-EO2RQW4S.js";
13
+ import "./chunk-XWOQL4XN.js";
14
+ import "./chunk-W7WENJ6F.js";
15
15
  import "./chunk-LPUQPDC2.js";
16
16
  import "./chunk-CKJAWZQE.js";
17
17
  import "./chunk-E7NUADTQ.js";
@@ -55,29 +55,29 @@ async function main() {
55
55
  process.stdout.write(USAGE);
56
56
  return;
57
57
  }
58
- if (cmd === "init") return (await import("./init-WYYL44KZ.js")).run(args);
58
+ if (cmd === "init") return (await import("./init-QFNBKKDC.js")).run(args);
59
59
  if (cmd === "detect-providers") return (await import("./detect-providers-PSVKXTWE.js")).run(args);
60
60
  if (cmd === "version" || cmd === "--version" || cmd === "-v") {
61
- const { getPluginVersion } = await import("./version-YPBIKH77.js");
61
+ const { getPluginVersion } = await import("./version-QEVU66NT.js");
62
62
  console.log(getPluginVersion());
63
63
  return;
64
64
  }
65
- if (cmd === "mcp") return (await import("./server-6SUNYDV7.js")).main();
65
+ if (cmd === "mcp") return (await import("./server-PTXLVVEE.js")).main();
66
66
  if (cmd === "hook") {
67
67
  const hookName = args[0];
68
68
  const HOOK_DISPATCH = {
69
- "session-start": () => import("./session-start-5MB3LFOA.js"),
70
- "session-end": () => import("./session-end-OUTY7AFF.js"),
71
- "stop": () => import("./stop-YGHODSP7.js"),
72
- "user-prompt-submit": () => import("./user-prompt-submit-4IBFUYQ3.js"),
73
- "post-tool-use": () => import("./post-tool-use-DENRI5WB.js"),
74
- "post-tool-use-failure": () => import("./post-tool-use-failure-A6SNJX42.js"),
75
- "subagent-start": () => import("./subagent-start-ZBQ5PJB5.js"),
76
- "subagent-stop": () => import("./subagent-stop-N2TDQU2D.js"),
77
- "stop-failure": () => import("./stop-failure-7IJTPJ6W.js"),
78
- "task-completed": () => import("./task-completed-BDLMRSBB.js"),
79
- "pre-compact": () => import("./pre-compact-3Q4BALCL.js"),
80
- "post-compact": () => import("./post-compact-HT24YMAN.js")
69
+ "session-start": () => import("./session-start-NIMWEOIZ.js"),
70
+ "session-end": () => import("./session-end-SMU55UCM.js"),
71
+ "stop": () => import("./stop-7AKYBJJ2.js"),
72
+ "user-prompt-submit": () => import("./user-prompt-submit-IZJC3NV7.js"),
73
+ "post-tool-use": () => import("./post-tool-use-FRTSICC3.js"),
74
+ "post-tool-use-failure": () => import("./post-tool-use-failure-KYO2NCNB.js"),
75
+ "subagent-start": () => import("./subagent-start-LBNZF2TG.js"),
76
+ "subagent-stop": () => import("./subagent-stop-B2Z5GYAB.js"),
77
+ "stop-failure": () => import("./stop-failure-NLE2EURG.js"),
78
+ "task-completed": () => import("./task-completed-PO5TETJ7.js"),
79
+ "pre-compact": () => import("./pre-compact-J6GCJEJR.js"),
80
+ "post-compact": () => import("./post-compact-2TJ5FPZH.js")
81
81
  };
82
82
  const loader = HOOK_DISPATCH[hookName];
83
83
  if (!loader) {
@@ -86,13 +86,13 @@ async function main() {
86
86
  }
87
87
  return (await loader()).main();
88
88
  }
89
- if (cmd === "daemon") return (await import("./main-6PY3ITQ5.js")).main();
89
+ if (cmd === "daemon") return (await import("./main-5THODR77.js")).main();
90
90
  if (cmd === "doctor") {
91
91
  const vaultDir2 = resolveVaultDir();
92
- return (await import("./doctor-QYD34X7Q.js")).run(args, vaultDir2);
92
+ return (await import("./doctor-KCTXPX5D.js")).run(args, vaultDir2);
93
93
  }
94
- if (cmd === "update") return (await import("./update-STLAN7LR.js")).run(args);
95
- if (cmd === "remove") return (await import("./remove-YB5A6HY2.js")).run(args);
94
+ if (cmd === "update") return (await import("./update-WBWB5URU.js")).run(args);
95
+ if (cmd === "remove") return (await import("./remove-3WZZC7AX.js")).run(args);
96
96
  const vaultDir = resolveVaultDir();
97
97
  if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
98
98
  console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
@@ -102,35 +102,35 @@ async function main() {
102
102
  case "config":
103
103
  return (await import("./config-DA4IUVFL.js")).run(args, vaultDir);
104
104
  case "verify":
105
- return (await import("./verify-EJYPO7QA.js")).run(args, vaultDir);
105
+ return (await import("./verify-FNSP62I3.js")).run(args, vaultDir);
106
106
  case "stats":
107
- return (await import("./stats-DGI6B3HX.js")).run(args, vaultDir);
107
+ return (await import("./stats-GEOQ2DFF.js")).run(args, vaultDir);
108
108
  case "search":
109
- return (await import("./search-WOHT3G55.js")).run(args, vaultDir);
109
+ return (await import("./search-ZGN3LDXG.js")).run(args, vaultDir);
110
110
  case "vectors":
111
- return (await import("./search-WOHT3G55.js")).runVectors(args, vaultDir);
111
+ return (await import("./search-ZGN3LDXG.js")).runVectors(args, vaultDir);
112
112
  case "session":
113
- return (await import("./session-W3SKRFRV.js")).run(args, vaultDir);
113
+ return (await import("./session-7VV3IQMO.js")).run(args, vaultDir);
114
114
  case "setup-llm":
115
- return (await import("./setup-llm-ZMYGIQX5.js")).run(args, vaultDir);
115
+ return (await import("./setup-llm-7S3VPAPN.js")).run(args, vaultDir);
116
116
  case "setup-digest":
117
117
  return (await import("./setup-digest-4KDSXAIV.js")).run(args, vaultDir);
118
118
  case "agent":
119
- return (await import("./agent-run-2NFYMQXW.js")).run(args, vaultDir);
119
+ return (await import("./agent-run-I4O2K2CK.js")).run(args, vaultDir);
120
120
  case "task":
121
- return (await import("./agent-tasks-MEIYLXGN.js")).run(args, vaultDir);
121
+ return (await import("./agent-tasks-UOW5BQIB.js")).run(args, vaultDir);
122
122
  case "team": {
123
123
  const sub = args[0];
124
- if (sub === "init") return (await import("./team-2ZFGTSIN.js")).teamInit(vaultDir);
125
- if (sub === "upgrade") return (await import("./team-2ZFGTSIN.js")).teamUpgrade(vaultDir);
124
+ if (sub === "init") return (await import("./team-DPNP2RN7.js")).teamInit(vaultDir);
125
+ if (sub === "upgrade") return (await import("./team-DPNP2RN7.js")).teamUpgrade(vaultDir);
126
126
  console.error("Usage: myco team <init|upgrade>");
127
127
  process.exit(1);
128
128
  break;
129
129
  }
130
130
  case "open":
131
- return (await import("./open-HRFMJDQX.js")).run(args, vaultDir);
131
+ return (await import("./open-7737CSPN.js")).run(args, vaultDir);
132
132
  case "restart":
133
- return (await import("./restart-RGDVHELZ.js")).run(args, vaultDir);
133
+ return (await import("./restart-HUHEFOXU.js")).run(args, vaultDir);
134
134
  case "logs":
135
135
  return (await import("./logs-TMKNLSJY.js")).run(args, vaultDir);
136
136
  default:
@@ -143,4 +143,4 @@ main().catch((err) => {
143
143
  console.error(`myco: ${err.message}`);
144
144
  process.exit(1);
145
145
  });
146
- //# sourceMappingURL=cli-IIMBALPV.js.map
146
+ //# sourceMappingURL=cli-D3TJYJ2U.js.map
@@ -2,8 +2,8 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  DaemonClient,
4
4
  resolveCliEntryPath
5
- } from "./chunk-BUIR3JWM.js";
6
- import "./chunk-EO2RQW4S.js";
5
+ } from "./chunk-XWOQL4XN.js";
6
+ import "./chunk-W7WENJ6F.js";
7
7
  import "./chunk-LPUQPDC2.js";
8
8
  import "./chunk-CKJAWZQE.js";
9
9
  import "./chunk-E7NUADTQ.js";
@@ -12,4 +12,4 @@ export {
12
12
  DaemonClient,
13
13
  resolveCliEntryPath
14
14
  };
15
- //# sourceMappingURL=client-VZCUISHZ.js.map
15
+ //# sourceMappingURL=client-4LLEXLVK.js.map
@@ -3,7 +3,7 @@ import {
3
3
  detectSymbionts,
4
4
  loadManifests,
5
5
  resolvePackageRoot
6
- } from "./chunk-FABWUX5G.js";
6
+ } from "./chunk-DPSLJ242.js";
7
7
  import "./chunk-LPUQPDC2.js";
8
8
  import "./chunk-D7TYRPRM.js";
9
9
  import "./chunk-E4VLWIJC.js";
@@ -14,4 +14,4 @@ export {
14
14
  loadManifests,
15
15
  resolvePackageRoot
16
16
  };
17
- //# sourceMappingURL=detect-GEM3NVK6.js.map
17
+ //# sourceMappingURL=detect-SZ2KDUF4.js.map
@@ -1,15 +1,15 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  isProcessAlive
4
- } from "./chunk-55QEICRO.js";
4
+ } from "./chunk-TLK46KKD.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
6
  import {
7
7
  MYCO_MCP_SERVER_NAME
8
8
  } from "./chunk-WYOE4IAX.js";
9
9
  import "./chunk-CML4MCYF.js";
10
10
  import "./chunk-MYX5NCRH.js";
11
- import "./chunk-BUIR3JWM.js";
12
- import "./chunk-EO2RQW4S.js";
11
+ import "./chunk-XWOQL4XN.js";
12
+ import "./chunk-W7WENJ6F.js";
13
13
  import "./chunk-LPUQPDC2.js";
14
14
  import "./chunk-CKJAWZQE.js";
15
15
  import "./chunk-E7NUADTQ.js";
@@ -82,7 +82,7 @@ async function checkIntelligence(config) {
82
82
  }
83
83
  async function checkEmbeddings(config) {
84
84
  try {
85
- const { createEmbeddingProvider } = await import("./llm-KEDHK3TQ.js");
85
+ const { createEmbeddingProvider } = await import("./llm-SMA5ZEAW.js");
86
86
  const provider = createEmbeddingProvider(config.embedding);
87
87
  const available = await provider.isAvailable();
88
88
  const label = `${config.embedding.provider} / ${config.embedding.model}`;
@@ -96,7 +96,7 @@ async function checkEmbeddings(config) {
96
96
  }
97
97
  async function checkAgents(vaultDir, config) {
98
98
  try {
99
- const { detectSymbionts } = await import("./detect-GEM3NVK6.js");
99
+ const { detectSymbionts } = await import("./detect-SZ2KDUF4.js");
100
100
  const { getEnabledSymbiontNames } = await import("./loader-Q3P3R4UP.js");
101
101
  const projectRoot = path.dirname(vaultDir);
102
102
  const detected = detectSymbionts(projectRoot);
@@ -271,4 +271,4 @@ export {
271
271
  run,
272
272
  runChecks
273
273
  };
274
- //# sourceMappingURL=doctor-QYD34X7Q.js.map
274
+ //# sourceMappingURL=doctor-KCTXPX5D.js.map