@goondocks/myco 0.12.10 → 0.14.0

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 (186) hide show
  1. package/README.md +6 -0
  2. package/dist/{agent-run-GUHXRNZB.js → agent-run-3WLMSLMJ.js} +8 -7
  3. package/dist/{agent-run-GUHXRNZB.js.map → agent-run-3WLMSLMJ.js.map} +1 -1
  4. package/dist/{agent-tasks-GWZI5WSB.js → agent-tasks-BQE2GEVS.js} +8 -7
  5. package/dist/{agent-tasks-GWZI5WSB.js.map → agent-tasks-BQE2GEVS.js.map} +1 -1
  6. package/dist/{chunk-PW5QVY44.js → chunk-4VF6KQ2Z.js} +371 -6
  7. package/dist/chunk-4VF6KQ2Z.js.map +1 -0
  8. package/dist/{chunk-QL2RBFIC.js → chunk-5YQ6VOFZ.js} +2 -2
  9. package/dist/{chunk-MCARJFBA.js → chunk-745SWTQX.js} +4 -4
  10. package/dist/{chunk-D4M2AV65.js → chunk-DTE3SHYK.js} +46 -3
  11. package/dist/chunk-DTE3SHYK.js.map +1 -0
  12. package/dist/{chunk-HLGPGHT7.js → chunk-EVPG26CR.js} +3 -3
  13. package/dist/{chunk-YRUJ5KGV.js → chunk-GDCSPMH4.js} +3 -3
  14. package/dist/{chunk-LUQBT2Y4.js → chunk-HHZ3RTEI.js} +2 -2
  15. package/dist/{chunk-TCGOSLW6.js → chunk-JJXVDCEX.js} +613 -98
  16. package/dist/chunk-JJXVDCEX.js.map +1 -0
  17. package/dist/{chunk-D4ESHOOJ.js → chunk-KNTJOMWY.js} +3 -3
  18. package/dist/{chunk-JHLALJPB.js → chunk-LD6U3L6O.js} +8 -8
  19. package/dist/{chunk-7NBDELZB.js → chunk-NVCGF2DS.js} +26 -8
  20. package/dist/{chunk-7NBDELZB.js.map → chunk-NVCGF2DS.js.map} +1 -1
  21. package/dist/{chunk-SW62AX75.js → chunk-OKCSSDFC.js} +2 -2
  22. package/dist/{chunk-RR75ZKEV.js → chunk-OQVKLTQY.js} +4 -4
  23. package/dist/{chunk-OAGY5APE.js → chunk-PSYLKCWQ.js} +83 -7
  24. package/dist/chunk-PSYLKCWQ.js.map +1 -0
  25. package/dist/{chunk-Q2AYS2QE.js → chunk-PX5KIOKY.js} +5 -7
  26. package/dist/chunk-PX5KIOKY.js.map +1 -0
  27. package/dist/chunk-QLCD77AN.js +93 -0
  28. package/dist/chunk-QLCD77AN.js.map +1 -0
  29. package/dist/{chunk-J3L2RTYK.js → chunk-RBFECYNA.js} +2 -2
  30. package/dist/{chunk-4VSNNMEU.js → chunk-S66YG6QK.js} +26 -3
  31. package/dist/{chunk-4VSNNMEU.js.map → chunk-S66YG6QK.js.map} +1 -1
  32. package/dist/chunk-SBVDG5JP.js +112 -0
  33. package/dist/chunk-SBVDG5JP.js.map +1 -0
  34. package/dist/{chunk-M5XWW7UI.js → chunk-SODRR3HE.js} +8 -1
  35. package/dist/chunk-SODRR3HE.js.map +1 -0
  36. package/dist/{chunk-SFC4GXEN.js → chunk-TNCBMGWB.js} +39 -104
  37. package/dist/chunk-TNCBMGWB.js.map +1 -0
  38. package/dist/{chunk-PIRWYDOH.js → chunk-TRA3R4EC.js} +7 -1
  39. package/dist/chunk-TRA3R4EC.js.map +1 -0
  40. package/dist/{chunk-LGPBVBFY.js → chunk-TVV6PZOC.js} +5 -7
  41. package/dist/chunk-TVV6PZOC.js.map +1 -0
  42. package/dist/{chunk-SVQAPEYH.js → chunk-UWXJCLCK.js} +22 -5
  43. package/dist/chunk-UWXJCLCK.js.map +1 -0
  44. package/dist/{chunk-JROOQQH6.js → chunk-X34OFKYU.js} +12 -7
  45. package/dist/chunk-X34OFKYU.js.map +1 -0
  46. package/dist/{chunk-FYGFMIS6.js → chunk-ZKXW46HZ.js} +2 -2
  47. package/dist/{cli-CFOIDXOY.js → cli-SKCINMJI.js} +41 -40
  48. package/dist/{cli-CFOIDXOY.js.map → cli-SKCINMJI.js.map} +1 -1
  49. package/dist/{client-ZBCGODTS.js → client-KZGZHHXT.js} +5 -5
  50. package/dist/{config-6RQ7FAEV.js → config-H657SF6B.js} +5 -3
  51. package/dist/{config-6RQ7FAEV.js.map → config-H657SF6B.js.map} +1 -1
  52. package/dist/{detect-providers-JFE3QLJI.js → detect-providers-PAVE2X6O.js} +4 -4
  53. package/dist/{doctor-W3I7RVU4.js → doctor-6FKSHJRU.js} +13 -11
  54. package/dist/{doctor-W3I7RVU4.js.map → doctor-6FKSHJRU.js.map} +1 -1
  55. package/dist/{executor-LKDWMGC7.js → executor-W5MKZH7B.js} +407 -46
  56. package/dist/executor-W5MKZH7B.js.map +1 -0
  57. package/dist/{init-M3HYJGHE.js → init-5QHCXBLF.js} +16 -15
  58. package/dist/{init-M3HYJGHE.js.map → init-5QHCXBLF.js.map} +1 -1
  59. package/dist/{init-wizard-C4WQA47U.js → init-wizard-HEY4HMG3.js} +12 -12
  60. package/dist/installer-25TSX4SR.js +13 -0
  61. package/dist/{llm-O46QYWEM.js → llm-T3QVHC3Y.js} +7 -7
  62. package/dist/{loader-4FMGOVWF.js → loader-JQLO6K44.js} +4 -2
  63. package/dist/{loader-BQ4X4K3F.js → loader-WQKVWL5D.js} +4 -4
  64. package/dist/{main-CMWNMCW2.js → main-IZ277SHB.js} +689 -124
  65. package/dist/main-IZ277SHB.js.map +1 -0
  66. package/dist/{open-4N7T37XV.js → open-S7YUWON4.js} +8 -7
  67. package/dist/{open-4N7T37XV.js.map → open-S7YUWON4.js.map} +1 -1
  68. package/dist/{openai-embeddings-HWAKOGUM.js → openai-embeddings-5T5ZP7LO.js} +4 -4
  69. package/dist/{openrouter-GXZK7JXR.js → openrouter-RD2COFC7.js} +4 -4
  70. package/dist/{post-compact-BPICHUPV.js → post-compact-EFKFT7TM.js} +7 -7
  71. package/dist/{post-tool-use-OHJ2EH7I.js → post-tool-use-624YC6ZH.js} +7 -7
  72. package/dist/{post-tool-use-failure-CBPY2TSN.js → post-tool-use-failure-QCHZAWQH.js} +7 -7
  73. package/dist/{pre-compact-ULAA4XIB.js → pre-compact-7DWH2EM3.js} +7 -7
  74. package/dist/{provider-check-CKZW3GQX.js → provider-check-QN7OGXZA.js} +4 -4
  75. package/dist/{registry-ZHUVXGPO.js → registry-2XQMCPA6.js} +5 -5
  76. package/dist/{remove-52PTVOCJ.js → remove-ESVIET5C.js} +10 -8
  77. package/dist/{remove-52PTVOCJ.js.map → remove-ESVIET5C.js.map} +1 -1
  78. package/dist/{resolution-events-WZHPQQMN.js → resolution-events-5EVUEWHS.js} +4 -4
  79. package/dist/{restart-O37BUPLH.js → restart-AZHV6OKM.js} +9 -8
  80. package/dist/{restart-O37BUPLH.js.map → restart-AZHV6OKM.js.map} +1 -1
  81. package/dist/{search-52YK2ZWU.js → search-JS4HXYGS.js} +9 -8
  82. package/dist/{search-52YK2ZWU.js.map → search-JS4HXYGS.js.map} +1 -1
  83. package/dist/{server-7OKRAJCM.js → server-KT5GW333.js} +115 -14
  84. package/dist/server-KT5GW333.js.map +1 -0
  85. package/dist/{session-57IAZYRK.js → session-JSI67FEM.js} +10 -9
  86. package/dist/{session-57IAZYRK.js.map → session-JSI67FEM.js.map} +1 -1
  87. package/dist/{session-end-WRKDJEWM.js → session-end-4CM462MC.js} +6 -6
  88. package/dist/{session-start-7VWGEVOX.js → session-start-ZGF7F6DE.js} +12 -12
  89. package/dist/{setup-llm-IDQPX22O.js → setup-llm-S2UYJYIS.js} +10 -9
  90. package/dist/{setup-llm-IDQPX22O.js.map → setup-llm-S2UYJYIS.js.map} +1 -1
  91. package/dist/src/agent/definitions/agent.yaml +2 -0
  92. package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -0
  93. package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -0
  94. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +8 -0
  95. package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +1 -0
  96. package/dist/src/agent/definitions/tasks/review-session.yaml +1 -0
  97. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +155 -0
  98. package/dist/src/agent/definitions/tasks/skill-generate.yaml +210 -0
  99. package/dist/src/agent/definitions/tasks/skill-survey.yaml +149 -0
  100. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -0
  101. package/dist/src/agent/definitions/tasks/title-summary.yaml +1 -0
  102. package/dist/src/agent/prompts/agent.md +29 -0
  103. package/dist/src/cli.js +1 -1
  104. package/dist/src/daemon/main.js +1 -1
  105. package/dist/src/hooks/post-tool-use.js +1 -1
  106. package/dist/src/hooks/session-end.js +1 -1
  107. package/dist/src/hooks/session-start.js +1 -1
  108. package/dist/src/hooks/stop.js +1 -1
  109. package/dist/src/hooks/user-prompt-submit.js +1 -1
  110. package/dist/src/mcp/server.js +1 -1
  111. package/dist/src/worker/src/index.ts +3 -0
  112. package/dist/src/worker/src/schema.ts +56 -0
  113. package/dist/{stats-D7U5HQ3L.js → stats-D2FM6ZXO.js} +10 -9
  114. package/dist/{stats-D7U5HQ3L.js.map → stats-D2FM6ZXO.js.map} +1 -1
  115. package/dist/{stop-VJU4AAOQ.js → stop-DQEKVNST.js} +6 -6
  116. package/dist/{stop-failure-ILPHO26U.js → stop-failure-EHH7AN5E.js} +7 -7
  117. package/dist/{subagent-start-77MY4UMP.js → subagent-start-6R52PAFA.js} +7 -7
  118. package/dist/{subagent-stop-DABERMXZ.js → subagent-stop-CLDFJKYQ.js} +7 -7
  119. package/dist/{task-completed-TBWBOAJ6.js → task-completed-V47JA3OV.js} +7 -7
  120. package/dist/{team-K6H4B3ZD.js → team-SJPDXELY.js} +45 -19
  121. package/dist/team-SJPDXELY.js.map +1 -0
  122. package/dist/turns-3ZQAF6HF.js +16 -0
  123. package/dist/turns-3ZQAF6HF.js.map +1 -0
  124. package/dist/ui/assets/index-BmsHIwjl.css +1 -0
  125. package/dist/ui/assets/index-Cn6cQwJy.js +842 -0
  126. package/dist/ui/index.html +2 -2
  127. package/dist/{update-GW774ZMW.js → update-ZNIYDQHJ.js} +8 -7
  128. package/dist/{update-GW774ZMW.js.map → update-ZNIYDQHJ.js.map} +1 -1
  129. package/dist/{user-prompt-submit-C47Y5Y5I.js → user-prompt-submit-6TX6VECI.js} +6 -6
  130. package/dist/{verify-MQAANTUR.js → verify-JHIMXTY5.js} +8 -8
  131. package/dist/{version-42DQW43N.js → version-UMEN7OJU.js} +2 -2
  132. package/dist/version-UMEN7OJU.js.map +1 -0
  133. package/package.json +6 -6
  134. package/dist/chunk-D4M2AV65.js.map +0 -1
  135. package/dist/chunk-JROOQQH6.js.map +0 -1
  136. package/dist/chunk-LGPBVBFY.js.map +0 -1
  137. package/dist/chunk-M5XWW7UI.js.map +0 -1
  138. package/dist/chunk-OAGY5APE.js.map +0 -1
  139. package/dist/chunk-PIRWYDOH.js.map +0 -1
  140. package/dist/chunk-PW5QVY44.js.map +0 -1
  141. package/dist/chunk-Q2AYS2QE.js.map +0 -1
  142. package/dist/chunk-SFC4GXEN.js.map +0 -1
  143. package/dist/chunk-SVQAPEYH.js.map +0 -1
  144. package/dist/chunk-TCGOSLW6.js.map +0 -1
  145. package/dist/executor-LKDWMGC7.js.map +0 -1
  146. package/dist/main-CMWNMCW2.js.map +0 -1
  147. package/dist/server-7OKRAJCM.js.map +0 -1
  148. package/dist/team-K6H4B3ZD.js.map +0 -1
  149. package/dist/ui/assets/index-BGbil7f1.css +0 -1
  150. package/dist/ui/assets/index-ZSGlKT25.js +0 -804
  151. /package/dist/{chunk-QL2RBFIC.js.map → chunk-5YQ6VOFZ.js.map} +0 -0
  152. /package/dist/{chunk-MCARJFBA.js.map → chunk-745SWTQX.js.map} +0 -0
  153. /package/dist/{chunk-HLGPGHT7.js.map → chunk-EVPG26CR.js.map} +0 -0
  154. /package/dist/{chunk-YRUJ5KGV.js.map → chunk-GDCSPMH4.js.map} +0 -0
  155. /package/dist/{chunk-LUQBT2Y4.js.map → chunk-HHZ3RTEI.js.map} +0 -0
  156. /package/dist/{chunk-D4ESHOOJ.js.map → chunk-KNTJOMWY.js.map} +0 -0
  157. /package/dist/{chunk-JHLALJPB.js.map → chunk-LD6U3L6O.js.map} +0 -0
  158. /package/dist/{chunk-SW62AX75.js.map → chunk-OKCSSDFC.js.map} +0 -0
  159. /package/dist/{chunk-RR75ZKEV.js.map → chunk-OQVKLTQY.js.map} +0 -0
  160. /package/dist/{chunk-J3L2RTYK.js.map → chunk-RBFECYNA.js.map} +0 -0
  161. /package/dist/{chunk-FYGFMIS6.js.map → chunk-ZKXW46HZ.js.map} +0 -0
  162. /package/dist/{client-ZBCGODTS.js.map → client-KZGZHHXT.js.map} +0 -0
  163. /package/dist/{detect-providers-JFE3QLJI.js.map → detect-providers-PAVE2X6O.js.map} +0 -0
  164. /package/dist/{init-wizard-C4WQA47U.js.map → init-wizard-HEY4HMG3.js.map} +0 -0
  165. /package/dist/{llm-O46QYWEM.js.map → installer-25TSX4SR.js.map} +0 -0
  166. /package/dist/{loader-4FMGOVWF.js.map → llm-T3QVHC3Y.js.map} +0 -0
  167. /package/dist/{loader-BQ4X4K3F.js.map → loader-JQLO6K44.js.map} +0 -0
  168. /package/dist/{openai-embeddings-HWAKOGUM.js.map → loader-WQKVWL5D.js.map} +0 -0
  169. /package/dist/{openrouter-GXZK7JXR.js.map → openai-embeddings-5T5ZP7LO.js.map} +0 -0
  170. /package/dist/{provider-check-CKZW3GQX.js.map → openrouter-RD2COFC7.js.map} +0 -0
  171. /package/dist/{post-compact-BPICHUPV.js.map → post-compact-EFKFT7TM.js.map} +0 -0
  172. /package/dist/{post-tool-use-OHJ2EH7I.js.map → post-tool-use-624YC6ZH.js.map} +0 -0
  173. /package/dist/{post-tool-use-failure-CBPY2TSN.js.map → post-tool-use-failure-QCHZAWQH.js.map} +0 -0
  174. /package/dist/{pre-compact-ULAA4XIB.js.map → pre-compact-7DWH2EM3.js.map} +0 -0
  175. /package/dist/{registry-ZHUVXGPO.js.map → provider-check-QN7OGXZA.js.map} +0 -0
  176. /package/dist/{resolution-events-WZHPQQMN.js.map → registry-2XQMCPA6.js.map} +0 -0
  177. /package/dist/{version-42DQW43N.js.map → resolution-events-5EVUEWHS.js.map} +0 -0
  178. /package/dist/{session-end-WRKDJEWM.js.map → session-end-4CM462MC.js.map} +0 -0
  179. /package/dist/{session-start-7VWGEVOX.js.map → session-start-ZGF7F6DE.js.map} +0 -0
  180. /package/dist/{stop-VJU4AAOQ.js.map → stop-DQEKVNST.js.map} +0 -0
  181. /package/dist/{stop-failure-ILPHO26U.js.map → stop-failure-EHH7AN5E.js.map} +0 -0
  182. /package/dist/{subagent-start-77MY4UMP.js.map → subagent-start-6R52PAFA.js.map} +0 -0
  183. /package/dist/{subagent-stop-DABERMXZ.js.map → subagent-stop-CLDFJKYQ.js.map} +0 -0
  184. /package/dist/{task-completed-TBWBOAJ6.js.map → task-completed-V47JA3OV.js.map} +0 -0
  185. /package/dist/{user-prompt-submit-C47Y5Y5I.js.map → user-prompt-submit-6TX6VECI.js.map} +0 -0
  186. /package/dist/{verify-MQAANTUR.js.map → verify-JHIMXTY5.js.map} +0 -0
package/README.md CHANGED
@@ -129,6 +129,12 @@ Local databases remain the source of truth. The cloud store is a queryable mirro
129
129
 
130
130
  Runs on the Cloudflare free tier. See the [Team Sync docs](docs/team-sync.md) for the full guide.
131
131
 
132
+ ### Skills
133
+
134
+ Myco auto-generates project-specific skills from accumulated vault knowledge. As the intelligence pipeline processes sessions, it identifies recurring procedures — debugging the build, adding API routes, configuring providers — and surfaces them as candidates. You approve candidates from the Skills dashboard, and Myco writes SKILL.md files that teach your agents how to work in your codebase. Skills are deployed to `.agents/skills/` and symlinked to each agent's native skills directory, so every agent gets the same procedural knowledge.
135
+
136
+ Skills evolve over time. When the project's understanding changes — a pattern is abandoned, a new gotcha is discovered, a workflow shifts — the evolve task detects the drift and rewrites affected skills, preserving what's still accurate and incorporating new knowledge. Each update is recorded with full lineage: generation number, rationale, and a content snapshot. See the [Skills docs](docs/skills.md) for the full lifecycle.
137
+
132
138
  ### Backup & restore
133
139
 
134
140
  Local SQL dump backups run automatically during daemon idle periods. Configure a custom backup directory (network share, git repo) from the Operations page. Restore with content-hash deduplication — never overwrites existing records.
@@ -1,15 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-SFC4GXEN.js";
4
+ } from "./chunk-SBVDG5JP.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-LUQBT2Y4.js";
6
+ import "./chunk-TNCBMGWB.js";
7
+ import "./chunk-HHZ3RTEI.js";
7
8
  import "./chunk-MYX5NCRH.js";
8
- import "./chunk-SVQAPEYH.js";
9
- import "./chunk-PIRWYDOH.js";
10
- import "./chunk-S6I62FAH.js";
11
- import "./chunk-FYGFMIS6.js";
9
+ import "./chunk-UWXJCLCK.js";
10
+ import "./chunk-ZKXW46HZ.js";
12
11
  import "./chunk-LPUQPDC2.js";
12
+ import "./chunk-TRA3R4EC.js";
13
+ import "./chunk-S6I62FAH.js";
13
14
  import "./chunk-PZUWP5VK.js";
14
15
 
15
16
  // src/cli/agent-run.ts
@@ -31,4 +32,4 @@ async function run(args, vaultDir) {
31
32
  export {
32
33
  run
33
34
  };
34
- //# sourceMappingURL=agent-run-GUHXRNZB.js.map
35
+ //# sourceMappingURL=agent-run-3WLMSLMJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/agent-run.ts"],"sourcesContent":["/**\n * CLI `agent` command — trigger an intelligence agent run via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n * The daemon's /api/agent/run endpoint fires-and-forgets the run.\n */\n\nimport { connectToDaemon } from './shared.js';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const task = args.find((_, i) => args[i - 1] === '--task');\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n const client = await connectToDaemon(vaultDir);\n\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ;AACzD,QAAM,cAAc,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,eAAe;AAEvE,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAE7C,UAAQ,IAAI,mBAAmB;AAC/B,QAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,gCAAgC;AAC5C,MAAI,OAAO,MAAM,SAAS;AACxB,YAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACxC;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/cli/agent-run.ts"],"sourcesContent":["/**\n * CLI `agent` command — trigger an intelligence agent run via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n * The daemon's /api/agent/run endpoint fires-and-forgets the run.\n */\n\nimport { connectToDaemon } from './shared.js';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const task = args.find((_, i) => args[i - 1] === '--task');\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n const client = await connectToDaemon(vaultDir);\n\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AASA,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ;AACzD,QAAM,cAAc,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,eAAe;AAEvE,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAE7C,UAAQ,IAAI,mBAAmB;AAC/B,QAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,gCAAgC;AAC5C,MAAI,OAAO,MAAM,SAAS;AACxB,YAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACxC;AACF;","names":[]}
@@ -1,15 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-SFC4GXEN.js";
4
+ } from "./chunk-SBVDG5JP.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-LUQBT2Y4.js";
6
+ import "./chunk-TNCBMGWB.js";
7
+ import "./chunk-HHZ3RTEI.js";
7
8
  import "./chunk-MYX5NCRH.js";
8
- import "./chunk-SVQAPEYH.js";
9
- import "./chunk-PIRWYDOH.js";
10
- import "./chunk-S6I62FAH.js";
11
- import "./chunk-FYGFMIS6.js";
9
+ import "./chunk-UWXJCLCK.js";
10
+ import "./chunk-ZKXW46HZ.js";
12
11
  import "./chunk-LPUQPDC2.js";
12
+ import "./chunk-TRA3R4EC.js";
13
+ import "./chunk-S6I62FAH.js";
13
14
  import "./chunk-PZUWP5VK.js";
14
15
 
15
16
  // src/cli/agent-tasks.ts
@@ -177,4 +178,4 @@ async function run(args, vaultDir) {
177
178
  export {
178
179
  run
179
180
  };
180
- //# sourceMappingURL=agent-tasks-GWZI5WSB.js.map
181
+ //# sourceMappingURL=agent-tasks-BQE2GEVS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/agent-tasks.ts"],"sourcesContent":["/**\n * CLI `task` subcommands — manage agent task definitions via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n *\n * Subcommands:\n * task list [--source built-in|user] List all tasks\n * task show <name> Show a single task with phases\n * task create <name> --from <template> Copy a template task to user dir\n * task delete <name> Delete a user task\n * task run <name> [--instruction TEXT] Run a task via the agent\n */\n\nimport { connectToDaemon } from './shared.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Column widths for the task list table. */\nconst COL_NAME_WIDTH = 22;\nconst COL_SOURCE_WIDTH = 10;\nconst COL_PHASES_WIDTH = 7;\n\n/** Marker displayed in the Default column for the default task. */\nconst DEFAULT_MARKER = '*';\n\n// ---------------------------------------------------------------------------\n// Types (local — mirrors the API response shape)\n// ---------------------------------------------------------------------------\n\ninterface PhaseRow {\n name: string;\n maxTurns: number;\n required: boolean;\n model?: string;\n tools: string[];\n}\n\ninterface TaskRow {\n name: string;\n displayName: string;\n description: string;\n agent: string;\n prompt: string;\n isDefault: boolean;\n source: string;\n isBuiltin: boolean;\n phases?: PhaseRow[];\n model?: string;\n maxTurns?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction padRight(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\nfunction printTaskTable(tasks: TaskRow[]): void {\n const header =\n padRight('Name', COL_NAME_WIDTH) +\n padRight('Source', COL_SOURCE_WIDTH) +\n padRight('Phases', COL_PHASES_WIDTH) +\n 'Default';\n console.log(header);\n console.log('-'.repeat(header.length));\n\n for (const t of tasks) {\n const phaseCount = t.phases?.length ?? 0;\n const row =\n padRight(t.name, COL_NAME_WIDTH) +\n padRight(t.source, COL_SOURCE_WIDTH) +\n padRight(String(phaseCount), COL_PHASES_WIDTH) +\n (t.isDefault ? DEFAULT_MARKER : '');\n console.log(row);\n }\n}\n\nfunction printTaskDetail(task: TaskRow): void {\n console.log(`Name: ${task.name}`);\n console.log(`Display: ${task.displayName}`);\n console.log(`Description: ${task.description}`);\n console.log(`Agent: ${task.agent}`);\n console.log(`Source: ${task.source}`);\n console.log(`Default: ${task.isDefault ? 'yes' : 'no'}`);\n if (task.model) console.log(`Model: ${task.model}`);\n if (task.maxTurns !== undefined) console.log(`Max turns: ${task.maxTurns}`);\n console.log(`Prompt: ${task.prompt}`);\n\n const phases = task.phases ?? [];\n if (phases.length > 0) {\n console.log(`\\nPhases (${phases.length}):`);\n for (let i = 0; i < phases.length; i++) {\n const p = phases[i];\n const req = p.required ? 'required' : 'optional';\n const model = p.model ? ` [${p.model}]` : '';\n console.log(` ${i + 1}. ${p.name} — ${p.maxTurns} turns, ${req}${model}`);\n if (p.tools.length > 0) {\n console.log(` tools: ${p.tools.join(', ')}`);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Subcommand handlers\n// ---------------------------------------------------------------------------\n\nasync function listTasks(args: string[], vaultDir: string): Promise<void> {\n const source = args.find((_, i) => args[i - 1] === '--source');\n const endpoint = source\n ? `/api/agent/tasks?source=${encodeURIComponent(source)}`\n : '/api/agent/tasks';\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(endpoint);\n\n if (!result.ok || !result.data) {\n console.error('Failed to fetch tasks from daemon');\n process.exit(1);\n }\n\n const tasks = result.data as TaskRow[];\n if (tasks.length === 0) {\n console.log('No tasks found');\n return;\n }\n\n printTaskTable(tasks);\n}\n\nasync function showTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task show <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok || !result.data) {\n console.error(`Task not found: ${name}`);\n process.exit(1);\n }\n\n printTaskDetail(result.data as TaskRow);\n}\n\nasync function createTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const from = args.find((_, i) => args[i - 1] === '--from');\n\n if (!name || !from) {\n console.error('Usage: myco task create <name> --from <template>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.post(`/api/agent/tasks/${encodeURIComponent(from)}/copy`, { name });\n\n if (!result.ok) {\n console.error(`Failed to create task '${name}' from template '${from}'`);\n if (result.data?.error) {\n console.error(` ${result.data.error}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' created from '${from}'`);\n}\n\nasync function deleteTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task delete <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.delete(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok) {\n const errCode = result.data?.error as string | undefined;\n if (errCode === 'cannot_delete_builtin') {\n console.error(`Cannot delete built-in task: ${name}`);\n } else if (errCode === 'task_not_found') {\n console.error(`Task not found: ${name}`);\n } else {\n console.error(`Failed to delete task: ${name}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' deleted`);\n}\n\nasync function runTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n if (!name) {\n console.error('Usage: myco task run <name> [--instruction TEXT]');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task: name, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\nconst TASK_USAGE = `Usage: myco task <subcommand> [args]\n\nSubcommands:\n list [--source built-in|user] List all tasks\n show <name> Show task details and phases\n create <name> --from <template> Copy a task template to your user dir\n delete <name> Delete a user task\n run <name> [--instruction TEXT] Run a task via the agent\n`;\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const subcommand = args[0];\n const subArgs = args.slice(1);\n\n switch (subcommand) {\n case 'list': return listTasks(subArgs, vaultDir);\n case 'show': return showTask(subArgs, vaultDir);\n case 'create': return createTask(subArgs, vaultDir);\n case 'delete': return deleteTask(subArgs, vaultDir);\n case 'run': return runTask(subArgs, vaultDir);\n default:\n if (subcommand) {\n console.error(`Unknown task subcommand: ${subcommand}`);\n }\n process.stdout.write(TASK_USAGE);\n if (subcommand) process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli/agent-tasks.ts"],"sourcesContent":["/**\n * CLI `task` subcommands — manage agent task definitions via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n *\n * Subcommands:\n * task list [--source built-in|user] List all tasks\n * task show <name> Show a single task with phases\n * task create <name> --from <template> Copy a template task to user dir\n * task delete <name> Delete a user task\n * task run <name> [--instruction TEXT] Run a task via the agent\n */\n\nimport { connectToDaemon } from './shared.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Column widths for the task list table. */\nconst COL_NAME_WIDTH = 22;\nconst COL_SOURCE_WIDTH = 10;\nconst COL_PHASES_WIDTH = 7;\n\n/** Marker displayed in the Default column for the default task. */\nconst DEFAULT_MARKER = '*';\n\n// ---------------------------------------------------------------------------\n// Types (local — mirrors the API response shape)\n// ---------------------------------------------------------------------------\n\ninterface PhaseRow {\n name: string;\n maxTurns: number;\n required: boolean;\n model?: string;\n tools: string[];\n}\n\ninterface TaskRow {\n name: string;\n displayName: string;\n description: string;\n agent: string;\n prompt: string;\n isDefault: boolean;\n source: string;\n isBuiltin: boolean;\n phases?: PhaseRow[];\n model?: string;\n maxTurns?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction padRight(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\nfunction printTaskTable(tasks: TaskRow[]): void {\n const header =\n padRight('Name', COL_NAME_WIDTH) +\n padRight('Source', COL_SOURCE_WIDTH) +\n padRight('Phases', COL_PHASES_WIDTH) +\n 'Default';\n console.log(header);\n console.log('-'.repeat(header.length));\n\n for (const t of tasks) {\n const phaseCount = t.phases?.length ?? 0;\n const row =\n padRight(t.name, COL_NAME_WIDTH) +\n padRight(t.source, COL_SOURCE_WIDTH) +\n padRight(String(phaseCount), COL_PHASES_WIDTH) +\n (t.isDefault ? DEFAULT_MARKER : '');\n console.log(row);\n }\n}\n\nfunction printTaskDetail(task: TaskRow): void {\n console.log(`Name: ${task.name}`);\n console.log(`Display: ${task.displayName}`);\n console.log(`Description: ${task.description}`);\n console.log(`Agent: ${task.agent}`);\n console.log(`Source: ${task.source}`);\n console.log(`Default: ${task.isDefault ? 'yes' : 'no'}`);\n if (task.model) console.log(`Model: ${task.model}`);\n if (task.maxTurns !== undefined) console.log(`Max turns: ${task.maxTurns}`);\n console.log(`Prompt: ${task.prompt}`);\n\n const phases = task.phases ?? [];\n if (phases.length > 0) {\n console.log(`\\nPhases (${phases.length}):`);\n for (let i = 0; i < phases.length; i++) {\n const p = phases[i];\n const req = p.required ? 'required' : 'optional';\n const model = p.model ? ` [${p.model}]` : '';\n console.log(` ${i + 1}. ${p.name} — ${p.maxTurns} turns, ${req}${model}`);\n if (p.tools.length > 0) {\n console.log(` tools: ${p.tools.join(', ')}`);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Subcommand handlers\n// ---------------------------------------------------------------------------\n\nasync function listTasks(args: string[], vaultDir: string): Promise<void> {\n const source = args.find((_, i) => args[i - 1] === '--source');\n const endpoint = source\n ? `/api/agent/tasks?source=${encodeURIComponent(source)}`\n : '/api/agent/tasks';\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(endpoint);\n\n if (!result.ok || !result.data) {\n console.error('Failed to fetch tasks from daemon');\n process.exit(1);\n }\n\n const tasks = result.data as TaskRow[];\n if (tasks.length === 0) {\n console.log('No tasks found');\n return;\n }\n\n printTaskTable(tasks);\n}\n\nasync function showTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task show <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok || !result.data) {\n console.error(`Task not found: ${name}`);\n process.exit(1);\n }\n\n printTaskDetail(result.data as TaskRow);\n}\n\nasync function createTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const from = args.find((_, i) => args[i - 1] === '--from');\n\n if (!name || !from) {\n console.error('Usage: myco task create <name> --from <template>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.post(`/api/agent/tasks/${encodeURIComponent(from)}/copy`, { name });\n\n if (!result.ok) {\n console.error(`Failed to create task '${name}' from template '${from}'`);\n if (result.data?.error) {\n console.error(` ${result.data.error}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' created from '${from}'`);\n}\n\nasync function deleteTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task delete <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.delete(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok) {\n const errCode = result.data?.error as string | undefined;\n if (errCode === 'cannot_delete_builtin') {\n console.error(`Cannot delete built-in task: ${name}`);\n } else if (errCode === 'task_not_found') {\n console.error(`Task not found: ${name}`);\n } else {\n console.error(`Failed to delete task: ${name}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' deleted`);\n}\n\nasync function runTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n if (!name) {\n console.error('Usage: myco task run <name> [--instruction TEXT]');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task: name, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\nconst TASK_USAGE = `Usage: myco task <subcommand> [args]\n\nSubcommands:\n list [--source built-in|user] List all tasks\n show <name> Show task details and phases\n create <name> --from <template> Copy a task template to your user dir\n delete <name> Delete a user task\n run <name> [--instruction TEXT] Run a task via the agent\n`;\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const subcommand = args[0];\n const subArgs = args.slice(1);\n\n switch (subcommand) {\n case 'list': return listTasks(subArgs, vaultDir);\n case 'show': return showTask(subArgs, vaultDir);\n case 'create': return createTask(subArgs, vaultDir);\n case 'delete': return deleteTask(subArgs, vaultDir);\n case 'run': return runTask(subArgs, vaultDir);\n default:\n if (subcommand) {\n console.error(`Unknown task subcommand: ${subcommand}`);\n }\n process.stdout.write(TASK_USAGE);\n if (subcommand) process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,10 +2,10 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  DEFAULT_MACHINE_ID,
4
4
  epochSeconds
5
- } from "./chunk-PIRWYDOH.js";
5
+ } from "./chunk-TRA3R4EC.js";
6
6
 
7
7
  // src/db/schema.ts
8
- var SCHEMA_VERSION = 4;
8
+ var SCHEMA_VERSION = 8;
9
9
  var EMBEDDING_DIMENSIONS = 1024;
10
10
  var SCHEMA_VERSION_TABLE = `
11
11
  CREATE TABLE IF NOT EXISTS schema_version (
@@ -312,19 +312,124 @@ var LOG_ENTRIES_TABLE = `
312
312
  data TEXT,
313
313
  session_id TEXT
314
314
  )`;
315
+ var SKILL_CANDIDATES_TABLE = `
316
+ CREATE TABLE IF NOT EXISTS skill_candidates (
317
+ id TEXT PRIMARY KEY,
318
+ agent_id TEXT NOT NULL REFERENCES agents(id),
319
+ machine_id TEXT NOT NULL DEFAULT 'local',
320
+ topic TEXT NOT NULL,
321
+ rationale TEXT NOT NULL,
322
+ confidence REAL NOT NULL DEFAULT 0.0,
323
+ status TEXT NOT NULL DEFAULT 'identified',
324
+ source_ids TEXT NOT NULL DEFAULT '[]',
325
+ skill_id TEXT,
326
+ created_at INTEGER NOT NULL,
327
+ updated_at INTEGER NOT NULL,
328
+ synced_at INTEGER
329
+ )`;
330
+ var SKILL_RECORDS_TABLE = `
331
+ CREATE TABLE IF NOT EXISTS skill_records (
332
+ id TEXT PRIMARY KEY,
333
+ agent_id TEXT NOT NULL REFERENCES agents(id),
334
+ machine_id TEXT NOT NULL DEFAULT 'local',
335
+ name TEXT NOT NULL UNIQUE,
336
+ display_name TEXT NOT NULL,
337
+ description TEXT NOT NULL,
338
+ status TEXT NOT NULL DEFAULT 'active',
339
+ generation INTEGER NOT NULL DEFAULT 1,
340
+ candidate_id TEXT REFERENCES skill_candidates(id),
341
+ source_ids TEXT NOT NULL DEFAULT '[]',
342
+ path TEXT NOT NULL,
343
+ usage_count INTEGER NOT NULL DEFAULT 0,
344
+ last_used_at INTEGER,
345
+ created_at INTEGER NOT NULL,
346
+ updated_at INTEGER NOT NULL,
347
+ properties TEXT NOT NULL DEFAULT '{}',
348
+ synced_at INTEGER
349
+ )`;
350
+ var SKILL_LINEAGE_TABLE = `
351
+ CREATE TABLE IF NOT EXISTS skill_lineage (
352
+ id TEXT PRIMARY KEY,
353
+ skill_id TEXT NOT NULL REFERENCES skill_records(id),
354
+ generation INTEGER NOT NULL,
355
+ action TEXT NOT NULL,
356
+ rationale TEXT NOT NULL,
357
+ source_ids_added TEXT NOT NULL DEFAULT '[]',
358
+ content_snapshot TEXT NOT NULL,
359
+ created_at INTEGER NOT NULL
360
+ )`;
361
+ var SKILL_USAGE_TABLE = `
362
+ CREATE TABLE IF NOT EXISTS skill_usage (
363
+ id TEXT PRIMARY KEY,
364
+ skill_id TEXT NOT NULL REFERENCES skill_records(id),
365
+ session_id TEXT NOT NULL REFERENCES sessions(id),
366
+ machine_id TEXT NOT NULL DEFAULT 'local',
367
+ detected_at INTEGER NOT NULL
368
+ )`;
369
+ var NOTIFICATIONS_TABLE = `
370
+ CREATE TABLE IF NOT EXISTS notifications (
371
+ id TEXT PRIMARY KEY,
372
+ domain TEXT NOT NULL,
373
+ type TEXT NOT NULL,
374
+ level TEXT NOT NULL DEFAULT 'info',
375
+ title TEXT NOT NULL,
376
+ message TEXT,
377
+ mode TEXT NOT NULL DEFAULT 'banner',
378
+ status TEXT NOT NULL DEFAULT 'unread',
379
+ link TEXT,
380
+ metadata TEXT,
381
+ created_at INTEGER NOT NULL
382
+ )`;
315
383
  var FTS_TABLES = [
316
384
  `CREATE VIRTUAL TABLE IF NOT EXISTS prompt_batches_fts
317
- USING fts5(user_prompt, content='prompt_batches', content_rowid='id')`,
385
+ USING fts5(user_prompt, response_summary, content='prompt_batches', content_rowid='id')`,
318
386
  `CREATE VIRTUAL TABLE IF NOT EXISTS activities_fts
319
387
  USING fts5(tool_name, tool_input, file_path, content='activities', content_rowid='id')`,
320
388
  `CREATE VIRTUAL TABLE IF NOT EXISTS log_entries_fts
321
389
  USING fts5(message, content='log_entries', content_rowid='id')`,
390
+ `CREATE VIRTUAL TABLE IF NOT EXISTS spores_fts
391
+ USING fts5(content, content='spores', content_rowid='rowid')`,
392
+ `CREATE VIRTUAL TABLE IF NOT EXISTS sessions_fts
393
+ USING fts5(title, summary, content='sessions', content_rowid='rowid')`,
322
394
  // FTS5 sync triggers for log_entries (external-content table)
323
395
  `CREATE TRIGGER IF NOT EXISTS log_entries_ai AFTER INSERT ON log_entries BEGIN
324
396
  INSERT INTO log_entries_fts(rowid, message) VALUES (new.id, new.message);
325
397
  END`,
326
398
  `CREATE TRIGGER IF NOT EXISTS log_entries_ad AFTER DELETE ON log_entries BEGIN
327
399
  INSERT INTO log_entries_fts(log_entries_fts, rowid, message) VALUES('delete', old.id, old.message);
400
+ END`,
401
+ // FTS5 sync triggers for prompt_batches
402
+ `CREATE TRIGGER IF NOT EXISTS prompt_batches_fts_ai AFTER INSERT ON prompt_batches BEGIN
403
+ INSERT INTO prompt_batches_fts(rowid, user_prompt, response_summary) VALUES (new.id, new.user_prompt, new.response_summary);
404
+ END`,
405
+ `CREATE TRIGGER IF NOT EXISTS prompt_batches_fts_au AFTER UPDATE OF user_prompt, response_summary ON prompt_batches BEGIN
406
+ INSERT INTO prompt_batches_fts(prompt_batches_fts, rowid, user_prompt, response_summary) VALUES('delete', old.id, old.user_prompt, old.response_summary);
407
+ INSERT INTO prompt_batches_fts(rowid, user_prompt, response_summary) VALUES (new.id, new.user_prompt, new.response_summary);
408
+ END`,
409
+ `CREATE TRIGGER IF NOT EXISTS prompt_batches_fts_ad AFTER DELETE ON prompt_batches BEGIN
410
+ INSERT INTO prompt_batches_fts(prompt_batches_fts, rowid, user_prompt, response_summary) VALUES('delete', old.id, old.user_prompt, old.response_summary);
411
+ END`,
412
+ // FTS5 sync triggers for spores
413
+ `CREATE TRIGGER IF NOT EXISTS spores_fts_ai AFTER INSERT ON spores BEGIN
414
+ INSERT INTO spores_fts(rowid, content) VALUES (new.rowid, new.content);
415
+ END`,
416
+ `CREATE TRIGGER IF NOT EXISTS spores_fts_au AFTER UPDATE OF content ON spores BEGIN
417
+ INSERT INTO spores_fts(spores_fts, rowid, content) VALUES('delete', old.rowid, old.content);
418
+ INSERT INTO spores_fts(rowid, content) VALUES (new.rowid, new.content);
419
+ END`,
420
+ `CREATE TRIGGER IF NOT EXISTS spores_fts_ad AFTER DELETE ON spores BEGIN
421
+ INSERT INTO spores_fts(spores_fts, rowid, content) VALUES('delete', old.rowid, old.content);
422
+ END`,
423
+ // FTS5 sync triggers for sessions
424
+ `CREATE TRIGGER IF NOT EXISTS sessions_fts_ai AFTER INSERT ON sessions BEGIN
425
+ INSERT INTO sessions_fts(rowid, title, summary) VALUES (new.rowid, new.title, new.summary);
426
+ END`,
427
+ `CREATE TRIGGER IF NOT EXISTS sessions_fts_au AFTER UPDATE OF title, summary ON sessions BEGIN
428
+ INSERT INTO sessions_fts(sessions_fts, rowid, title, summary) VALUES('delete', old.rowid, old.title, old.summary);
429
+ INSERT INTO sessions_fts(rowid, title, summary) VALUES (new.rowid, new.title, new.summary);
430
+ END`,
431
+ `CREATE TRIGGER IF NOT EXISTS sessions_fts_ad AFTER DELETE ON sessions BEGIN
432
+ INSERT INTO sessions_fts(sessions_fts, rowid, title, summary) VALUES('delete', old.rowid, old.title, old.summary);
328
433
  END`
329
434
  ];
330
435
  var SECONDARY_INDEXES = [
@@ -370,6 +475,7 @@ var SECONDARY_INDEXES = [
370
475
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_id ON agent_runs (agent_id)",
371
476
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs (status)",
372
477
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_status ON agent_runs (agent_id, status)",
478
+ "CREATE INDEX IF NOT EXISTS idx_agent_runs_task_completed ON agent_runs (task, status, completed_at)",
373
479
  // Agent reports
374
480
  "CREATE INDEX IF NOT EXISTS idx_agent_reports_run_id ON agent_reports (run_id)",
375
481
  // Agent turns
@@ -390,12 +496,34 @@ var SECONDARY_INDEXES = [
390
496
  "CREATE INDEX IF NOT EXISTS idx_sessions_machine_id ON sessions (machine_id)",
391
497
  "CREATE INDEX IF NOT EXISTS idx_spores_machine_id ON spores (machine_id)",
392
498
  "CREATE INDEX IF NOT EXISTS idx_graph_edges_machine_id ON graph_edges (machine_id)",
499
+ // Skill candidates
500
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_agent_id ON skill_candidates (agent_id)",
501
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_status ON skill_candidates (status)",
502
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_machine_id ON skill_candidates (machine_id)",
503
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_agent_status ON skill_candidates (agent_id, status)",
504
+ // Skill records
505
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_agent_id ON skill_records (agent_id)",
506
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_status ON skill_records (status)",
507
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_name ON skill_records (name)",
508
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_machine_id ON skill_records (machine_id)",
509
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_agent_status ON skill_records (agent_id, status)",
510
+ // Skill lineage
511
+ "CREATE INDEX IF NOT EXISTS idx_skill_lineage_skill_id ON skill_lineage (skill_id)",
512
+ // Skill usage
513
+ "CREATE INDEX IF NOT EXISTS idx_skill_usage_skill_id ON skill_usage (skill_id)",
514
+ "CREATE INDEX IF NOT EXISTS idx_skill_usage_session_id ON skill_usage (session_id)",
515
+ "CREATE INDEX IF NOT EXISTS idx_skill_usage_skill_session ON skill_usage (skill_id, session_id)",
393
516
  // Log entries
394
517
  "CREATE INDEX IF NOT EXISTS idx_log_entries_timestamp ON log_entries (timestamp)",
395
518
  "CREATE INDEX IF NOT EXISTS idx_log_entries_level ON log_entries (level)",
396
519
  "CREATE INDEX IF NOT EXISTS idx_log_entries_component ON log_entries (component)",
397
520
  "CREATE INDEX IF NOT EXISTS idx_log_entries_kind ON log_entries (kind)",
398
- "CREATE INDEX IF NOT EXISTS idx_log_entries_session_id ON log_entries (session_id)"
521
+ "CREATE INDEX IF NOT EXISTS idx_log_entries_session_id ON log_entries (session_id)",
522
+ // Notifications
523
+ "CREATE INDEX IF NOT EXISTS idx_notifications_status ON notifications (status)",
524
+ "CREATE INDEX IF NOT EXISTS idx_notifications_domain ON notifications (domain)",
525
+ "CREATE INDEX IF NOT EXISTS idx_notifications_created_at ON notifications (created_at)",
526
+ "CREATE INDEX IF NOT EXISTS idx_notifications_status_created ON notifications (status, created_at)"
399
527
  ];
400
528
  var TABLE_DDLS = [
401
529
  SCHEMA_VERSION_TABLE,
@@ -421,10 +549,17 @@ var TABLE_DDLS = [
421
549
  AGENT_TURNS_TABLE,
422
550
  AGENT_TASKS_TABLE,
423
551
  AGENT_STATE_TABLE,
552
+ // Skills layer
553
+ SKILL_CANDIDATES_TABLE,
554
+ SKILL_RECORDS_TABLE,
555
+ SKILL_LINEAGE_TABLE,
556
+ SKILL_USAGE_TABLE,
424
557
  // Sync layer
425
558
  TEAM_OUTBOX_TABLE,
426
559
  // Logging layer
427
- LOG_ENTRIES_TABLE
560
+ LOG_ENTRIES_TABLE,
561
+ // Notifications layer
562
+ NOTIFICATIONS_TABLE
428
563
  ];
429
564
  function migrateV1ToV2(db) {
430
565
  db.exec("BEGIN");
@@ -553,6 +688,212 @@ function migrateV3ToV4(db, machineId) {
553
688
  throw err;
554
689
  }
555
690
  }
691
+ function migrateV5ToV6(db) {
692
+ db.exec("BEGIN");
693
+ try {
694
+ db.exec("DROP TABLE IF EXISTS prompt_batches_fts");
695
+ db.exec(
696
+ `CREATE VIRTUAL TABLE IF NOT EXISTS prompt_batches_fts
697
+ USING fts5(user_prompt, response_summary, content='prompt_batches', content_rowid='id')`
698
+ );
699
+ db.exec(
700
+ `CREATE VIRTUAL TABLE IF NOT EXISTS spores_fts
701
+ USING fts5(content, content='spores', content_rowid='rowid')`
702
+ );
703
+ db.exec(
704
+ `CREATE VIRTUAL TABLE IF NOT EXISTS sessions_fts
705
+ USING fts5(title, summary, content='sessions', content_rowid='rowid')`
706
+ );
707
+ db.exec(
708
+ `CREATE TRIGGER IF NOT EXISTS prompt_batches_fts_ai AFTER INSERT ON prompt_batches BEGIN
709
+ INSERT INTO prompt_batches_fts(rowid, user_prompt, response_summary) VALUES (new.id, new.user_prompt, new.response_summary);
710
+ END`
711
+ );
712
+ db.exec(
713
+ `CREATE TRIGGER IF NOT EXISTS prompt_batches_fts_au AFTER UPDATE OF user_prompt, response_summary ON prompt_batches BEGIN
714
+ INSERT INTO prompt_batches_fts(prompt_batches_fts, rowid, user_prompt, response_summary) VALUES('delete', old.id, old.user_prompt, old.response_summary);
715
+ INSERT INTO prompt_batches_fts(rowid, user_prompt, response_summary) VALUES (new.id, new.user_prompt, new.response_summary);
716
+ END`
717
+ );
718
+ db.exec(
719
+ `CREATE TRIGGER IF NOT EXISTS prompt_batches_fts_ad AFTER DELETE ON prompt_batches BEGIN
720
+ INSERT INTO prompt_batches_fts(prompt_batches_fts, rowid, user_prompt, response_summary) VALUES('delete', old.id, old.user_prompt, old.response_summary);
721
+ END`
722
+ );
723
+ db.exec(
724
+ `CREATE TRIGGER IF NOT EXISTS spores_fts_ai AFTER INSERT ON spores BEGIN
725
+ INSERT INTO spores_fts(rowid, content) VALUES (new.rowid, new.content);
726
+ END`
727
+ );
728
+ db.exec(
729
+ `CREATE TRIGGER IF NOT EXISTS spores_fts_au AFTER UPDATE OF content ON spores BEGIN
730
+ INSERT INTO spores_fts(spores_fts, rowid, content) VALUES('delete', old.rowid, old.content);
731
+ INSERT INTO spores_fts(rowid, content) VALUES (new.rowid, new.content);
732
+ END`
733
+ );
734
+ db.exec(
735
+ `CREATE TRIGGER IF NOT EXISTS spores_fts_ad AFTER DELETE ON spores BEGIN
736
+ INSERT INTO spores_fts(spores_fts, rowid, content) VALUES('delete', old.rowid, old.content);
737
+ END`
738
+ );
739
+ db.exec(
740
+ `CREATE TRIGGER IF NOT EXISTS sessions_fts_ai AFTER INSERT ON sessions BEGIN
741
+ INSERT INTO sessions_fts(rowid, title, summary) VALUES (new.rowid, new.title, new.summary);
742
+ END`
743
+ );
744
+ db.exec(
745
+ `CREATE TRIGGER IF NOT EXISTS sessions_fts_au AFTER UPDATE OF title, summary ON sessions BEGIN
746
+ INSERT INTO sessions_fts(sessions_fts, rowid, title, summary) VALUES('delete', old.rowid, old.title, old.summary);
747
+ INSERT INTO sessions_fts(rowid, title, summary) VALUES (new.rowid, new.title, new.summary);
748
+ END`
749
+ );
750
+ db.exec(
751
+ `CREATE TRIGGER IF NOT EXISTS sessions_fts_ad AFTER DELETE ON sessions BEGIN
752
+ INSERT INTO sessions_fts(sessions_fts, rowid, title, summary) VALUES('delete', old.rowid, old.title, old.summary);
753
+ END`
754
+ );
755
+ db.exec(
756
+ `INSERT INTO prompt_batches_fts(rowid, user_prompt, response_summary)
757
+ SELECT rowid, user_prompt, response_summary FROM prompt_batches`
758
+ );
759
+ db.exec(
760
+ `INSERT INTO spores_fts(rowid, content)
761
+ SELECT rowid, content FROM spores`
762
+ );
763
+ db.exec(
764
+ `INSERT INTO sessions_fts(rowid, title, summary)
765
+ SELECT rowid, title, summary FROM sessions`
766
+ );
767
+ db.prepare(
768
+ `INSERT INTO schema_version (version, applied_at)
769
+ VALUES (?, ?)
770
+ ON CONFLICT (version) DO NOTHING`
771
+ ).run(6, epochSeconds());
772
+ db.exec("COMMIT");
773
+ } catch (err) {
774
+ db.exec("ROLLBACK");
775
+ throw err;
776
+ }
777
+ }
778
+ function migrateV4ToV5(db) {
779
+ db.exec("BEGIN");
780
+ try {
781
+ db.exec(SKILL_CANDIDATES_TABLE);
782
+ db.exec(SKILL_RECORDS_TABLE);
783
+ db.exec(SKILL_LINEAGE_TABLE);
784
+ db.exec(SKILL_USAGE_TABLE);
785
+ const newIndexes = [
786
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_agent_id ON skill_candidates (agent_id)",
787
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_status ON skill_candidates (status)",
788
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_machine_id ON skill_candidates (machine_id)",
789
+ "CREATE INDEX IF NOT EXISTS idx_skill_candidates_agent_status ON skill_candidates (agent_id, status)",
790
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_agent_id ON skill_records (agent_id)",
791
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_status ON skill_records (status)",
792
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_name ON skill_records (name)",
793
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_machine_id ON skill_records (machine_id)",
794
+ "CREATE INDEX IF NOT EXISTS idx_skill_records_agent_status ON skill_records (agent_id, status)",
795
+ "CREATE INDEX IF NOT EXISTS idx_skill_lineage_skill_id ON skill_lineage (skill_id)",
796
+ "CREATE INDEX IF NOT EXISTS idx_skill_usage_skill_id ON skill_usage (skill_id)",
797
+ "CREATE INDEX IF NOT EXISTS idx_skill_usage_session_id ON skill_usage (session_id)",
798
+ "CREATE INDEX IF NOT EXISTS idx_skill_usage_skill_session ON skill_usage (skill_id, session_id)",
799
+ "CREATE INDEX IF NOT EXISTS idx_agent_runs_task_completed ON agent_runs (task, status, completed_at)"
800
+ ];
801
+ for (const idx of newIndexes) {
802
+ db.exec(idx);
803
+ }
804
+ db.prepare(
805
+ `INSERT INTO schema_version (version, applied_at)
806
+ VALUES (?, ?)
807
+ ON CONFLICT (version) DO NOTHING`
808
+ ).run(5, epochSeconds());
809
+ db.exec("COMMIT");
810
+ } catch (err) {
811
+ db.exec("ROLLBACK");
812
+ throw err;
813
+ }
814
+ }
815
+ function migrateV6ToV7(db, machineId) {
816
+ if (machineId === "local" || machineId === DEFAULT_MACHINE_ID) return;
817
+ db.exec("BEGIN");
818
+ try {
819
+ const tables = [
820
+ "sessions",
821
+ "prompt_batches",
822
+ "spores",
823
+ "entities",
824
+ "graph_edges",
825
+ "resolution_events",
826
+ "plans",
827
+ "artifacts",
828
+ "digest_extracts",
829
+ "skill_candidates",
830
+ "skill_records"
831
+ ];
832
+ for (const table of tables) {
833
+ try {
834
+ const staleRows = db.prepare(
835
+ `SELECT id FROM ${table} WHERE machine_id = 'local'`
836
+ ).all();
837
+ if (staleRows.length === 0) continue;
838
+ db.prepare(
839
+ `UPDATE ${table} SET machine_id = ?, synced_at = NULL WHERE machine_id = 'local'`
840
+ ).run(machineId);
841
+ for (const row of staleRows) {
842
+ db.prepare(
843
+ `DELETE FROM team_outbox WHERE table_name = ? AND row_id = ?`
844
+ ).run(table, String(row.id));
845
+ }
846
+ const enqueueStmt = db.prepare(
847
+ `INSERT INTO team_outbox (table_name, row_id, operation, payload, machine_id, created_at)
848
+ VALUES (?, ?, 'upsert', ?, ?, ?)`
849
+ );
850
+ const now = epochSeconds();
851
+ for (const stale of staleRows) {
852
+ const fresh = db.prepare(`SELECT * FROM ${table} WHERE id = ?`).get(stale.id);
853
+ if (fresh) {
854
+ enqueueStmt.run(table, String(stale.id), JSON.stringify(fresh), machineId, now);
855
+ }
856
+ }
857
+ } catch (tableErr) {
858
+ const msg = tableErr instanceof Error ? tableErr.message : String(tableErr);
859
+ if (!msg.includes("no such table")) throw tableErr;
860
+ }
861
+ }
862
+ db.prepare(
863
+ `INSERT INTO schema_version (version, applied_at)
864
+ VALUES (?, ?)
865
+ ON CONFLICT (version) DO NOTHING`
866
+ ).run(7, epochSeconds());
867
+ db.exec("COMMIT");
868
+ } catch (err) {
869
+ db.exec("ROLLBACK");
870
+ throw err;
871
+ }
872
+ }
873
+ function migrateV7ToV8(db) {
874
+ db.exec("BEGIN");
875
+ try {
876
+ db.exec(NOTIFICATIONS_TABLE);
877
+ const newIndexes = [
878
+ "CREATE INDEX IF NOT EXISTS idx_notifications_status ON notifications (status)",
879
+ "CREATE INDEX IF NOT EXISTS idx_notifications_domain ON notifications (domain)",
880
+ "CREATE INDEX IF NOT EXISTS idx_notifications_created_at ON notifications (created_at)",
881
+ "CREATE INDEX IF NOT EXISTS idx_notifications_status_created ON notifications (status, created_at)"
882
+ ];
883
+ for (const idx of newIndexes) {
884
+ db.exec(idx);
885
+ }
886
+ db.prepare(
887
+ `INSERT INTO schema_version (version, applied_at)
888
+ VALUES (?, ?)
889
+ ON CONFLICT (version) DO NOTHING`
890
+ ).run(8, epochSeconds());
891
+ db.exec("COMMIT");
892
+ } catch (err) {
893
+ db.exec("ROLLBACK");
894
+ throw err;
895
+ }
896
+ }
556
897
  function createSchema(db, machineId = DEFAULT_MACHINE_ID) {
557
898
  try {
558
899
  const row = db.prepare(
@@ -574,6 +915,30 @@ function createSchema(db, machineId = DEFAULT_MACHINE_ID) {
574
915
  if (afterV2Migration < 4) {
575
916
  migrateV3ToV4(db, machineId);
576
917
  }
918
+ const afterV3Migration = db.prepare(
919
+ "SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
920
+ ).get()?.version ?? 0;
921
+ if (afterV3Migration < 5) {
922
+ migrateV4ToV5(db);
923
+ }
924
+ const afterV4Migration = db.prepare(
925
+ "SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
926
+ ).get()?.version ?? 0;
927
+ if (afterV4Migration < 6) {
928
+ migrateV5ToV6(db);
929
+ }
930
+ const afterV5Migration = db.prepare(
931
+ "SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
932
+ ).get()?.version ?? 0;
933
+ if (afterV5Migration < 7) {
934
+ migrateV6ToV7(db, machineId);
935
+ }
936
+ const afterV6Migration = db.prepare(
937
+ "SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
938
+ ).get()?.version ?? 0;
939
+ if (afterV6Migration < 8) {
940
+ migrateV7ToV8(db);
941
+ }
577
942
  return;
578
943
  } catch {
579
944
  }
@@ -598,4 +963,4 @@ export {
598
963
  EMBEDDING_DIMENSIONS,
599
964
  createSchema
600
965
  };
601
- //# sourceMappingURL=chunk-PW5QVY44.js.map
966
+ //# sourceMappingURL=chunk-4VF6KQ2Z.js.map