@goondocks/myco 0.17.1 → 0.18.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 (208) hide show
  1. package/README.md +15 -23
  2. package/bin/myco-run +15 -2
  3. package/dist/{agent-run-BGW4TY3D.js → agent-run-2NFYMQXW.js} +7 -7
  4. package/dist/{agent-tasks-XUJ6FTPL.js → agent-tasks-MEIYLXGN.js} +7 -7
  5. package/dist/{chunk-FEX6ALLH.js → chunk-2V7HR7HB.js} +29 -3
  6. package/dist/chunk-2V7HR7HB.js.map +1 -0
  7. package/dist/{chunk-XQHL4GMO.js → chunk-55QEICRO.js} +14 -4
  8. package/dist/chunk-55QEICRO.js.map +1 -0
  9. package/dist/chunk-5NFJTZ64.js +14 -0
  10. package/dist/chunk-5NFJTZ64.js.map +1 -0
  11. package/dist/{chunk-CPL76CYD.js → chunk-75AZFBFW.js} +3 -3
  12. package/dist/{chunk-UDBCAFXS.js → chunk-7OYXB2NM.js} +2 -2
  13. package/dist/{chunk-N6JNOSBQ.js → chunk-BUIR3JWM.js} +3 -3
  14. package/dist/{chunk-6SDC6V3N.js → chunk-CKJAWZQE.js} +5 -5
  15. package/dist/chunk-CKJAWZQE.js.map +1 -0
  16. package/dist/{chunk-DKSQMH5X.js → chunk-CML4MCYF.js} +2 -2
  17. package/dist/{chunk-KOTFMGL5.js → chunk-DLFDBKEV.js} +4 -4
  18. package/dist/{chunk-LA7NDX3J.js → chunk-EO2RQW4S.js} +2 -2
  19. package/dist/{chunk-EBIYONNZ.js → chunk-FABWUX5G.js} +20 -2
  20. package/dist/chunk-FABWUX5G.js.map +1 -0
  21. package/dist/{chunk-SODRR3HE.js → chunk-GFR542SM.js} +1 -1
  22. package/dist/chunk-GFR542SM.js.map +1 -0
  23. package/dist/{chunk-YTOD6L6N.js → chunk-JDI4DPWD.js} +210 -118
  24. package/dist/chunk-JDI4DPWD.js.map +1 -0
  25. package/dist/chunk-JMOUFG6Y.js +65 -0
  26. package/dist/chunk-JMOUFG6Y.js.map +1 -0
  27. package/dist/{chunk-QQ7CXA7Q.js → chunk-KWTOCJLB.js} +95 -10
  28. package/dist/{chunk-QQ7CXA7Q.js.map → chunk-KWTOCJLB.js.map} +1 -1
  29. package/dist/{chunk-VQQ57UPG.js → chunk-NI23QCHB.js} +4 -4
  30. package/dist/{chunk-VQQ57UPG.js.map → chunk-NI23QCHB.js.map} +1 -1
  31. package/dist/{chunk-GBYLHPML.js → chunk-NZI7WBZI.js} +2 -2
  32. package/dist/{chunk-KKEMVH6D.js → chunk-O3TRN3RC.js} +2 -2
  33. package/dist/{chunk-OGNEW5CN.js → chunk-OW433Q4C.js} +2 -2
  34. package/dist/{chunk-2WRXLYG6.js → chunk-PFWIPRF6.js} +39 -5
  35. package/dist/chunk-PFWIPRF6.js.map +1 -0
  36. package/dist/{chunk-ZUSTCXHT.js → chunk-RAV5YMRU.js} +3 -3
  37. package/dist/{chunk-2IJ6C63F.js → chunk-U3J2DDSR.js} +2 -2
  38. package/dist/{chunk-VGVRBSLC.js → chunk-U7GJTVSX.js} +2 -2
  39. package/dist/{chunk-KQOII5RU.js → chunk-VOCGURV7.js} +3 -3
  40. package/dist/{chunk-VVGZL2HX.js → chunk-WYOE4IAX.js} +153 -15
  41. package/dist/{chunk-VVGZL2HX.js.map → chunk-WYOE4IAX.js.map} +1 -1
  42. package/dist/{cli-353VNZIY.js → cli-IIMBALPV.js} +40 -40
  43. package/dist/{client-7KJ453V4.js → client-VZCUISHZ.js} +4 -4
  44. package/dist/{config-K3CJEFFO.js → config-DA4IUVFL.js} +4 -4
  45. package/dist/{detect-NJ2OREDP.js → detect-GEM3NVK6.js} +2 -2
  46. package/dist/{detect-providers-OE6HWW3M.js → detect-providers-PSVKXTWE.js} +4 -4
  47. package/dist/{doctor-RYFP7ABA.js → doctor-QYD34X7Q.js} +13 -13
  48. package/dist/doctor-QYD34X7Q.js.map +1 -0
  49. package/dist/{executor-YOKYS7OT.js → executor-NSPRTH4M.js} +29 -110
  50. package/dist/executor-NSPRTH4M.js.map +1 -0
  51. package/dist/{init-XR2JZWY2.js → init-WYYL44KZ.js} +56 -74
  52. package/dist/init-WYYL44KZ.js.map +1 -0
  53. package/dist/{installer-45ZLP2RP.js → installer-BWJED3ED.js} +2 -2
  54. package/dist/{llm-PGETQHZ2.js → llm-KEDHK3TQ.js} +4 -7
  55. package/dist/{loader-AVWL7PNO.js → loader-Q3P3R4UP.js} +3 -3
  56. package/dist/{loader-J56KP27U.js → loader-SKKUMT5C.js} +3 -3
  57. package/dist/{main-6DGPZXRF.js → main-6PY3ITQ5.js} +449 -156
  58. package/dist/main-6PY3ITQ5.js.map +1 -0
  59. package/dist/{open-P7YEH7UJ.js → open-HRFMJDQX.js} +11 -10
  60. package/dist/open-HRFMJDQX.js.map +1 -0
  61. package/dist/open-browser-EBKBAYSM.js +9 -0
  62. package/dist/{post-compact-WPS4SONO.js → post-compact-HT24YMAN.js} +7 -7
  63. package/dist/{post-tool-use-5WLLRGZ5.js → post-tool-use-DENRI5WB.js} +6 -6
  64. package/dist/{post-tool-use-failure-6C6HSBHI.js → post-tool-use-failure-A6SNJX42.js} +7 -7
  65. package/dist/{pre-compact-Z4E4JLAK.js → pre-compact-3Q4BALCL.js} +7 -7
  66. package/dist/{provider-check-CESRPIY5.js → provider-check-AE3L5Z6R.js} +4 -4
  67. package/dist/{registry-SPKP2WLI.js → registry-O2NZLO3V.js} +4 -4
  68. package/dist/{remove-B2PFVQXK.js → remove-YB5A6HY2.js} +9 -9
  69. package/dist/{resolution-events-CLDXZF67.js → resolution-events-XWYLLDRK.js} +4 -4
  70. package/dist/{restart-XAJDOL3E.js → restart-RGDVHELZ.js} +8 -8
  71. package/dist/{search-ERTCTAQ3.js → search-WOHT3G55.js} +8 -8
  72. package/dist/{server-LXUA7XUQ.js → server-6SUNYDV7.js} +4 -4
  73. package/dist/{session-433T6V3C.js → session-W3SKRFRV.js} +9 -9
  74. package/dist/{session-end-4Y5VY4OI.js → session-end-OUTY7AFF.js} +6 -6
  75. package/dist/{session-start-3STH4HFL.js → session-start-5MB3LFOA.js} +24 -13
  76. package/dist/{session-start-3STH4HFL.js.map → session-start-5MB3LFOA.js.map} +1 -1
  77. package/dist/{setup-llm-UBBSQWX5.js → setup-llm-ZMYGIQX5.js} +9 -9
  78. package/dist/src/cli.js +1 -1
  79. package/dist/src/daemon/main.js +1 -1
  80. package/dist/src/hooks/post-tool-use.js +1 -1
  81. package/dist/src/hooks/session-end.js +1 -1
  82. package/dist/src/hooks/session-start.js +1 -1
  83. package/dist/src/hooks/stop.js +1 -1
  84. package/dist/src/hooks/user-prompt-submit.js +1 -1
  85. package/dist/src/mcp/server.js +1 -1
  86. package/dist/src/symbionts/manifests/codex.yaml +47 -0
  87. package/dist/src/symbionts/templates/claude-code/hooks.json +12 -12
  88. package/dist/src/symbionts/templates/claude-code/settings.json +3 -3
  89. package/dist/src/symbionts/templates/codex/hooks.json +4 -4
  90. package/dist/src/symbionts/templates/cursor/hooks.json +9 -9
  91. package/dist/src/symbionts/templates/cursor/settings.json +2 -2
  92. package/dist/src/symbionts/templates/gemini/hooks.json +6 -6
  93. package/dist/src/symbionts/templates/gemini/settings.json +2 -2
  94. package/dist/src/symbionts/templates/myco-run.cjs +44 -0
  95. package/dist/src/symbionts/templates/opencode/settings.json +2 -2
  96. package/dist/src/symbionts/templates/vscode-copilot/hooks.json +7 -7
  97. package/dist/src/symbionts/templates/vscode-copilot/settings.json +2 -2
  98. package/dist/src/symbionts/templates/windsurf/hooks.json +4 -4
  99. package/dist/src/symbionts/templates/windsurf/settings.json +2 -2
  100. package/dist/src/worker/package-lock.json +4338 -0
  101. package/dist/src/worker/package.json +5 -0
  102. package/dist/src/worker/src/index.ts +50 -63
  103. package/dist/src/worker/src/mcp/auth.ts +65 -0
  104. package/dist/src/worker/src/mcp/server.ts +53 -0
  105. package/dist/src/worker/src/mcp/tools/context.ts +13 -0
  106. package/dist/src/worker/src/mcp/tools/get.ts +15 -0
  107. package/dist/src/worker/src/mcp/tools/graph.ts +35 -0
  108. package/dist/src/worker/src/mcp/tools/search.ts +32 -0
  109. package/dist/src/worker/src/mcp/tools/sessions.ts +24 -0
  110. package/dist/src/worker/src/mcp/tools/skills.ts +16 -0
  111. package/dist/src/worker/src/mcp/tools/team.ts +9 -0
  112. package/dist/src/worker/src/schema.ts +3 -1
  113. package/dist/src/worker/src/search-helpers.ts +70 -0
  114. package/dist/src/worker/wrangler.toml +9 -0
  115. package/dist/{stats-3NW7PGQK.js → stats-DGI6B3HX.js} +9 -9
  116. package/dist/{stop-L7BLMHUD.js → stop-YGHODSP7.js} +6 -6
  117. package/dist/{stop-failure-P5MYHGAZ.js → stop-failure-7IJTPJ6W.js} +7 -7
  118. package/dist/{subagent-start-AIEFG4HA.js → subagent-start-ZBQ5PJB5.js} +7 -7
  119. package/dist/{subagent-stop-TZ62BSNI.js → subagent-stop-N2TDQU2D.js} +7 -7
  120. package/dist/{task-completed-ZKVCUBCP.js → task-completed-BDLMRSBB.js} +7 -7
  121. package/dist/{team-WHZW6IFU.js → team-2ZFGTSIN.js} +97 -14
  122. package/dist/team-2ZFGTSIN.js.map +1 -0
  123. package/dist/ui/assets/index-CRmkSi63.css +1 -0
  124. package/dist/ui/assets/index-DtT9_nlT.js +842 -0
  125. package/dist/ui/index.html +2 -2
  126. package/dist/{update-P7GIQLIV.js → update-STLAN7LR.js} +18 -9
  127. package/dist/update-STLAN7LR.js.map +1 -0
  128. package/dist/{user-prompt-submit-4J7ZW6X3.js → user-prompt-submit-4IBFUYQ3.js} +27 -7
  129. package/dist/user-prompt-submit-4IBFUYQ3.js.map +1 -0
  130. package/dist/{verify-PSERIZPF.js → verify-EJYPO7QA.js} +5 -8
  131. package/dist/{verify-PSERIZPF.js.map → verify-EJYPO7QA.js.map} +1 -1
  132. package/dist/{version-OHJ5ZLHX.js → version-YPBIKH77.js} +2 -2
  133. package/package.json +6 -2
  134. package/dist/chunk-2WRXLYG6.js.map +0 -1
  135. package/dist/chunk-6SDC6V3N.js.map +0 -1
  136. package/dist/chunk-EBIYONNZ.js.map +0 -1
  137. package/dist/chunk-FEX6ALLH.js.map +0 -1
  138. package/dist/chunk-KGL5QSDN.js +0 -66
  139. package/dist/chunk-KGL5QSDN.js.map +0 -1
  140. package/dist/chunk-SODRR3HE.js.map +0 -1
  141. package/dist/chunk-U3SSOSIR.js +0 -26
  142. package/dist/chunk-U3SSOSIR.js.map +0 -1
  143. package/dist/chunk-XQHL4GMO.js.map +0 -1
  144. package/dist/chunk-Y7QCKCEJ.js +0 -26
  145. package/dist/chunk-Y7QCKCEJ.js.map +0 -1
  146. package/dist/chunk-YTOD6L6N.js.map +0 -1
  147. package/dist/doctor-RYFP7ABA.js.map +0 -1
  148. package/dist/executor-YOKYS7OT.js.map +0 -1
  149. package/dist/init-XR2JZWY2.js.map +0 -1
  150. package/dist/init-wizard-5CH2FD76.js +0 -294
  151. package/dist/init-wizard-5CH2FD76.js.map +0 -1
  152. package/dist/main-6DGPZXRF.js.map +0 -1
  153. package/dist/open-P7YEH7UJ.js.map +0 -1
  154. package/dist/openai-embeddings-LZKY6RV5.js +0 -14
  155. package/dist/openrouter-UTOZG6Z5.js +0 -14
  156. package/dist/src/symbionts/templates/hook-guard.cjs +0 -19
  157. package/dist/team-WHZW6IFU.js.map +0 -1
  158. package/dist/ui/assets/index-2UyTdjlV.js +0 -842
  159. package/dist/ui/assets/index-Cts1wLEW.css +0 -1
  160. package/dist/update-P7GIQLIV.js.map +0 -1
  161. package/dist/user-prompt-submit-4J7ZW6X3.js.map +0 -1
  162. package/dist/version-OHJ5ZLHX.js.map +0 -1
  163. /package/dist/{agent-run-BGW4TY3D.js.map → agent-run-2NFYMQXW.js.map} +0 -0
  164. /package/dist/{agent-tasks-XUJ6FTPL.js.map → agent-tasks-MEIYLXGN.js.map} +0 -0
  165. /package/dist/{chunk-CPL76CYD.js.map → chunk-75AZFBFW.js.map} +0 -0
  166. /package/dist/{chunk-UDBCAFXS.js.map → chunk-7OYXB2NM.js.map} +0 -0
  167. /package/dist/{chunk-N6JNOSBQ.js.map → chunk-BUIR3JWM.js.map} +0 -0
  168. /package/dist/{chunk-DKSQMH5X.js.map → chunk-CML4MCYF.js.map} +0 -0
  169. /package/dist/{chunk-KOTFMGL5.js.map → chunk-DLFDBKEV.js.map} +0 -0
  170. /package/dist/{chunk-LA7NDX3J.js.map → chunk-EO2RQW4S.js.map} +0 -0
  171. /package/dist/{chunk-GBYLHPML.js.map → chunk-NZI7WBZI.js.map} +0 -0
  172. /package/dist/{chunk-KKEMVH6D.js.map → chunk-O3TRN3RC.js.map} +0 -0
  173. /package/dist/{chunk-OGNEW5CN.js.map → chunk-OW433Q4C.js.map} +0 -0
  174. /package/dist/{chunk-ZUSTCXHT.js.map → chunk-RAV5YMRU.js.map} +0 -0
  175. /package/dist/{chunk-2IJ6C63F.js.map → chunk-U3J2DDSR.js.map} +0 -0
  176. /package/dist/{chunk-VGVRBSLC.js.map → chunk-U7GJTVSX.js.map} +0 -0
  177. /package/dist/{chunk-KQOII5RU.js.map → chunk-VOCGURV7.js.map} +0 -0
  178. /package/dist/{cli-353VNZIY.js.map → cli-IIMBALPV.js.map} +0 -0
  179. /package/dist/{client-7KJ453V4.js.map → client-VZCUISHZ.js.map} +0 -0
  180. /package/dist/{config-K3CJEFFO.js.map → config-DA4IUVFL.js.map} +0 -0
  181. /package/dist/{detect-NJ2OREDP.js.map → detect-GEM3NVK6.js.map} +0 -0
  182. /package/dist/{detect-providers-OE6HWW3M.js.map → detect-providers-PSVKXTWE.js.map} +0 -0
  183. /package/dist/{installer-45ZLP2RP.js.map → installer-BWJED3ED.js.map} +0 -0
  184. /package/dist/{llm-PGETQHZ2.js.map → llm-KEDHK3TQ.js.map} +0 -0
  185. /package/dist/{loader-AVWL7PNO.js.map → loader-Q3P3R4UP.js.map} +0 -0
  186. /package/dist/{loader-J56KP27U.js.map → loader-SKKUMT5C.js.map} +0 -0
  187. /package/dist/{openai-embeddings-LZKY6RV5.js.map → open-browser-EBKBAYSM.js.map} +0 -0
  188. /package/dist/{post-compact-WPS4SONO.js.map → post-compact-HT24YMAN.js.map} +0 -0
  189. /package/dist/{post-tool-use-5WLLRGZ5.js.map → post-tool-use-DENRI5WB.js.map} +0 -0
  190. /package/dist/{post-tool-use-failure-6C6HSBHI.js.map → post-tool-use-failure-A6SNJX42.js.map} +0 -0
  191. /package/dist/{pre-compact-Z4E4JLAK.js.map → pre-compact-3Q4BALCL.js.map} +0 -0
  192. /package/dist/{openrouter-UTOZG6Z5.js.map → provider-check-AE3L5Z6R.js.map} +0 -0
  193. /package/dist/{provider-check-CESRPIY5.js.map → registry-O2NZLO3V.js.map} +0 -0
  194. /package/dist/{remove-B2PFVQXK.js.map → remove-YB5A6HY2.js.map} +0 -0
  195. /package/dist/{registry-SPKP2WLI.js.map → resolution-events-XWYLLDRK.js.map} +0 -0
  196. /package/dist/{restart-XAJDOL3E.js.map → restart-RGDVHELZ.js.map} +0 -0
  197. /package/dist/{search-ERTCTAQ3.js.map → search-WOHT3G55.js.map} +0 -0
  198. /package/dist/{server-LXUA7XUQ.js.map → server-6SUNYDV7.js.map} +0 -0
  199. /package/dist/{session-433T6V3C.js.map → session-W3SKRFRV.js.map} +0 -0
  200. /package/dist/{session-end-4Y5VY4OI.js.map → session-end-OUTY7AFF.js.map} +0 -0
  201. /package/dist/{setup-llm-UBBSQWX5.js.map → setup-llm-ZMYGIQX5.js.map} +0 -0
  202. /package/dist/{stats-3NW7PGQK.js.map → stats-DGI6B3HX.js.map} +0 -0
  203. /package/dist/{stop-L7BLMHUD.js.map → stop-YGHODSP7.js.map} +0 -0
  204. /package/dist/{stop-failure-P5MYHGAZ.js.map → stop-failure-7IJTPJ6W.js.map} +0 -0
  205. /package/dist/{subagent-start-AIEFG4HA.js.map → subagent-start-ZBQ5PJB5.js.map} +0 -0
  206. /package/dist/{subagent-stop-TZ62BSNI.js.map → subagent-stop-N2TDQU2D.js.map} +0 -0
  207. /package/dist/{task-completed-ZKVCUBCP.js.map → task-completed-BDLMRSBB.js.map} +0 -0
  208. /package/dist/{resolution-events-CLDXZF67.js.map → version-YPBIKH77.js.map} +0 -0
@@ -13,8 +13,26 @@ import {
13
13
  } from "./chunk-PZUWP5VK.js";
14
14
 
15
15
  // src/symbionts/manifest-schema.ts
16
+ var CaptureRuleSchema = external_exports.object({
17
+ event: external_exports.enum(["session_start", "user_prompt"]),
18
+ scope: external_exports.enum(["this_agent", "any_agent"]).default("this_agent"),
19
+ when: external_exports.object({
20
+ prompt_starts_with: external_exports.string().optional(),
21
+ prompt_contains: external_exports.string().optional(),
22
+ /** Structural: fires when transcript_path is absent or empty. */
23
+ transcript_path_missing: external_exports.boolean().optional()
24
+ }),
25
+ action: external_exports.enum(["drop", "rewrite_prompt"]),
26
+ /** Short audit string logged when the rule matches (e.g., "codex-internal-title-gen"). */
27
+ reason: external_exports.string().optional(),
28
+ /** For rewrite_prompt: keep only the substring after this marker (first occurrence). */
29
+ extract_after: external_exports.string().optional(),
30
+ /** For rewrite_prompt: trim whitespace from the extracted substring. Default true. */
31
+ trim: external_exports.boolean().default(true)
32
+ });
16
33
  var CaptureManifestSchema = external_exports.object({
17
- planDirs: external_exports.array(external_exports.string()).default([])
34
+ planDirs: external_exports.array(external_exports.string()).default([]),
35
+ rules: external_exports.array(CaptureRuleSchema).default([])
18
36
  });
19
37
  var RegistrationSchema = external_exports.object({
20
38
  hooksTarget: external_exports.string().optional(),
@@ -127,4 +145,4 @@ export {
127
145
  detectSymbionts,
128
146
  resolvePackageRoot
129
147
  };
130
- //# sourceMappingURL=chunk-EBIYONNZ.js.map
148
+ //# sourceMappingURL=chunk-FABWUX5G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/symbionts/manifest-schema.ts","../src/symbionts/detect.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Declarative capture rules owned per-symbiont in its YAML manifest.\n *\n * Rules let each symbiont describe how Myco should filter or rewrite\n * captured events *without* adding symbiont-specific branches inside\n * the generic hook handlers. The hook loads the rules, a generic\n * evaluator decides the action, and the hook acts on the result.\n *\n * Condition types (in `when`):\n * - `transcript_path_missing`: structural. Fires when the hook's\n * transcript_path field is absent/empty. A legitimate user-facing\n * session records a transcript; an ephemeral sub-invocation (e.g.,\n * an agent's internal title-generation call) does not. Preferred\n * over text matching because it doesn't drift as UIs evolve.\n * - `prompt_starts_with` / `prompt_contains`: text fallback. Use\n * when no structural signal is available. Document the upgrade path\n * in the YAML so future maintainers can replace it when a better\n * signal appears.\n *\n * Scope semantics:\n * - `this_agent` (default): rule fires only when the detected agent\n * matches the manifest that owns the rule. Use for behavior that\n * is specific to the symbiont and can rely on detection working.\n * - `any_agent`: rule fires regardless of detected agent. Use for\n * patterns where detection itself might fail — e.g., an internal\n * sub-invocation that omits the fields agent detection keys on.\n *\n * Events:\n * - `session_start`: fires on SessionStart, before any prompts or\n * tools are captured. The right place to catch ephemeral sub-\n * invocations so they're never registered as sessions at all.\n * - `user_prompt`: fires on UserPromptSubmit. Safety net for anything\n * that slips past session_start, and the only layer where\n * `rewrite_prompt` makes sense (prompt text doesn't exist until\n * the prompt is submitted).\n *\n * Actions:\n * - `drop`: discard the event entirely. For session_start, the hook\n * skips registering the session row. For user_prompt, the hook\n * skips posting the event and cascade-deletes any session row that\n * may have been registered before the drop rule could fire.\n * - `rewrite_prompt`: replace the captured prompt with the substring\n * after `extract_after`. Only valid for `user_prompt` events.\n */\nconst CaptureRuleSchema = z.object({\n event: z.enum(['session_start', 'user_prompt']),\n scope: z.enum(['this_agent', 'any_agent']).default('this_agent'),\n when: z.object({\n prompt_starts_with: z.string().optional(),\n prompt_contains: z.string().optional(),\n /** Structural: fires when transcript_path is absent or empty. */\n transcript_path_missing: z.boolean().optional(),\n }),\n action: z.enum(['drop', 'rewrite_prompt']),\n /** Short audit string logged when the rule matches (e.g., \"codex-internal-title-gen\"). */\n reason: z.string().optional(),\n /** For rewrite_prompt: keep only the substring after this marker (first occurrence). */\n extract_after: z.string().optional(),\n /** For rewrite_prompt: trim whitespace from the extracted substring. Default true. */\n trim: z.boolean().default(true),\n});\n\nexport type CaptureRule = z.infer<typeof CaptureRuleSchema>;\n\nconst CaptureManifestSchema = z.object({\n planDirs: z.array(z.string()).default([]),\n rules: z.array(CaptureRuleSchema).default([]),\n});\n\nconst RegistrationSchema = z.object({\n hooksTarget: z.string().optional(),\n /**\n * Format of the hooks target.\n * - 'json' (default): hooks template is merged into a JSON settings file.\n * - 'plugin-file': the hooks template is a verbatim file (e.g., an opencode TS plugin)\n * copied to hooksTarget without JSON parsing. Used for agents with plugin-based hook\n * systems rather than JSON hook entries.\n */\n hooksFormat: z.enum(['json', 'plugin-file']).default('json'),\n /**\n * Optional file path for a plugin deps package.json. When set, the installer writes\n * a package.json declaring the plugin SDK dependency so the agent's package manager\n * (e.g., opencode's Bun) can install it at startup. Preserved on uninstall so\n * contributors can keep their own deps.\n */\n pluginPackageTarget: z.string().optional(),\n mcpTarget: z.string().optional(),\n mcpFormat: z.enum(['json', 'toml']).default('json'),\n /**\n * JSON key under which MCP server entries are stored in the MCP config file.\n * Defaults to 'mcpServers' (used by Claude Code, Cursor, etc.). opencode uses 'mcp'.\n */\n mcpServersKey: z.string().default('mcpServers'),\n skillsTarget: z.string().optional(),\n settingsTarget: z.string().optional(),\n /** Format of the settings file. TOML-format agents (e.g., Codex) emit top-level template keys as TOML sections. */\n settingsFormat: z.enum(['json', 'toml']).default('json'),\n /** Instruction file that stubs out to AGENTS.md. Only for agents that don't read AGENTS.md natively. */\n instructionsFile: z.string().optional(),\n});\n\nexport const SymbiontManifestSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n binary: z.string(),\n configDir: z.string(),\n pluginRootEnvVar: z.string(),\n settingsPath: z.string().optional(),\n hookFields: z.object({\n sessionId: z.string(),\n transcriptPath: z.string(),\n lastResponse: z.string(),\n prompt: z.string().default('prompt'),\n toolName: z.string().default('tool_name'),\n toolInput: z.string().default('tool_input'),\n toolOutput: z.string().default('tool_output'),\n /** Env var fallback for session ID (e.g., GEMINI_SESSION_ID). */\n sessionIdEnv: z.string().optional(),\n }),\n /** Resume command template with {sessionId} placeholder. Omit for IDE-based agents. */\n resumeCommand: z.string().optional(),\n capture: CaptureManifestSchema.optional(),\n registration: RegistrationSchema.optional(),\n});\n\nexport type SymbiontManifest = z.infer<typeof SymbiontManifestSchema>;\nexport type SymbiontRegistration = z.infer<typeof RegistrationSchema>;\n","import { SymbiontManifestSchema, type SymbiontManifest } from './manifest-schema.js';\nimport { findPackageRoot } from '../utils/find-package-root.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\n\nexport interface DetectedSymbiont {\n manifest: SymbiontManifest;\n binaryFound: boolean;\n configDirFound: boolean;\n}\n\nconst MANIFESTS_SUBDIR = 'symbionts/manifests';\n\n/** Cached manifests — static files that never change at runtime. */\nlet manifestCache: SymbiontManifest[] | null = null;\n\n/** Load all symbiont manifests from the package's dist directory. */\nexport function loadManifests(): SymbiontManifest[] {\n if (manifestCache) return manifestCache;\n const candidates = [\n // Source layout: src/symbionts/detect.ts → src/symbionts/manifests/\n path.resolve(import.meta.dirname, MANIFESTS_SUBDIR),\n // Dist layout: dist/src/symbionts/ → dist/src/symbionts/manifests/\n // (or dist/src/daemon/ → dist/src/symbionts/manifests/)\n path.resolve(import.meta.dirname, '..', MANIFESTS_SUBDIR),\n path.resolve(import.meta.dirname, '..', '..', MANIFESTS_SUBDIR),\n // Chunk layout: dist/chunk-*.js → dist/src/symbionts/manifests/\n path.resolve(import.meta.dirname, 'src', MANIFESTS_SUBDIR),\n ];\n\n for (const dir of candidates) {\n if (!fs.existsSync(dir)) continue;\n const files = fs.readdirSync(dir).filter(f => f.endsWith('.yaml'));\n if (files.length === 0) continue;\n manifestCache = files.map(f => {\n const raw = YAML.parse(fs.readFileSync(path.join(dir, f), 'utf-8'));\n return SymbiontManifestSchema.parse(raw);\n });\n return manifestCache;\n }\n return [];\n}\n\n/** Check if a binary is available on PATH. */\nfunction isBinaryOnPath(binary: string): boolean {\n try {\n execFileSync('which', [binary], { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Detect which symbionts are available for a project. */\nexport function detectSymbionts(projectRoot: string): DetectedSymbiont[] {\n const manifests = loadManifests();\n return manifests.map(manifest => ({\n manifest,\n binaryFound: isBinaryOnPath(manifest.binary),\n configDirFound: fs.existsSync(path.join(projectRoot, manifest.configDir)),\n })).filter(d => d.binaryFound || d.configDirFound);\n}\n\n/** Find the Myco package root (where package.json lives). */\nexport function resolvePackageRoot(): string {\n return findPackageRoot(import.meta.dirname) ?? process.cwd();\n}\n"],"mappings":"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","names":["YAML"]}
@@ -101,4 +101,4 @@ export {
101
101
  withTaskConfig,
102
102
  withEmbedding
103
103
  };
104
- //# sourceMappingURL=chunk-SODRR3HE.js.map
104
+ //# sourceMappingURL=chunk-GFR542SM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/updates.ts"],"sourcesContent":["import type { MycoConfig, EmbeddingProviderConfig, ContextConfig, TaskProviderOverride, PhaseOverride } from './schema.js';\n\n/**\n * Set a value at a dot-separated path, returning a new config object.\n * Creates intermediate objects along the path as needed.\n */\nexport function withValue(config: MycoConfig, dotPath: string, value: unknown): MycoConfig {\n const clone = structuredClone(config) as MycoConfig & Record<string, unknown>;\n const segments = dotPath.split('.');\n let current: Record<string, unknown> = clone;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i];\n if (current[segment] === undefined || current[segment] === null || typeof current[segment] !== 'object') {\n current[segment] = {};\n }\n current = current[segment] as Record<string, unknown>;\n }\n\n current[segments[segments.length - 1]] = value;\n\n return clone as MycoConfig;\n}\n\n/** Provider override shape used in task config updates. Null means delete. */\ninterface ProviderInput {\n type: 'anthropic' | 'ollama' | 'lmstudio';\n model?: string;\n base_url?: string;\n context_length?: number;\n}\n\n/** Phase override input. Null fields mean delete. */\ninterface PhaseInput {\n provider?: ProviderInput | null;\n model?: string | null;\n maxTurns?: number | null;\n}\n\n/** Input shape for task config updates. Null values mean \"delete this field\". */\nexport interface TaskConfigUpdate {\n provider?: ProviderInput | null;\n model?: string | null;\n maxTurns?: number | null;\n timeoutSeconds?: number | null;\n phases?: Record<string, PhaseInput | null> | null;\n schedule?: { enabled?: boolean; intervalSeconds?: number; runIn?: ('active' | 'idle' | 'sleep')[] } | null;\n}\n\n/**\n * Apply partial task config updates, returning a new config object.\n * Null values delete fields. Empty task entries and phase maps are cleaned up.\n */\nexport function withTaskConfig(\n config: MycoConfig,\n taskId: string,\n update: TaskConfigUpdate,\n): MycoConfig {\n const tasks = { ...(config.agent.tasks ?? {}) };\n const entry: TaskProviderOverride = { ...(tasks[taskId] ?? {}) };\n\n // Apply top-level fields\n if ('provider' in update) {\n if (update.provider === null) {\n delete entry.provider;\n } else if (update.provider !== undefined) {\n entry.provider = { ...update.provider };\n }\n }\n\n if ('model' in update) {\n if (update.model === null) delete entry.model;\n else if (update.model !== undefined) entry.model = update.model;\n }\n\n if ('maxTurns' in update) {\n if (update.maxTurns === null) delete entry.maxTurns;\n else if (update.maxTurns !== undefined) entry.maxTurns = update.maxTurns;\n }\n\n if ('timeoutSeconds' in update) {\n if (update.timeoutSeconds === null) delete entry.timeoutSeconds;\n else if (update.timeoutSeconds !== undefined) entry.timeoutSeconds = update.timeoutSeconds;\n }\n\n // Handle schedule\n if ('schedule' in update) {\n if (update.schedule === null) {\n delete entry.schedule;\n } else if (update.schedule !== undefined) {\n entry.schedule = { ...entry.schedule, ...update.schedule };\n }\n }\n\n // Apply phase overrides\n if ('phases' in update) {\n if (update.phases === null) {\n delete entry.phases;\n } else if (update.phases !== undefined) {\n const phases: Record<string, PhaseOverride> = { ...(entry.phases ?? {}) };\n\n for (const [phaseName, phaseValue] of Object.entries(update.phases)) {\n if (phaseValue === null) {\n delete phases[phaseName];\n } else {\n const pe: PhaseOverride = { ...(phases[phaseName] ?? {}) };\n if ('provider' in phaseValue) {\n if (phaseValue.provider === null) delete pe.provider;\n else if (phaseValue.provider !== undefined) pe.provider = { ...phaseValue.provider };\n }\n if ('model' in phaseValue) {\n if (phaseValue.model === null) delete pe.model;\n else if (phaseValue.model !== undefined) pe.model = phaseValue.model;\n }\n if ('maxTurns' in phaseValue) {\n if (phaseValue.maxTurns === null) delete pe.maxTurns;\n else if (phaseValue.maxTurns !== undefined) pe.maxTurns = phaseValue.maxTurns;\n }\n phases[phaseName] = pe;\n }\n }\n\n // Clean up empty phases map\n if (Object.keys(phases).length === 0) {\n delete entry.phases;\n } else {\n entry.phases = phases;\n }\n }\n }\n\n // Clean up empty task entry\n if (Object.keys(entry).length === 0) {\n delete tasks[taskId];\n } else {\n tasks[taskId] = entry;\n }\n\n return {\n ...config,\n agent: {\n ...config.agent,\n tasks: Object.keys(tasks).length > 0 ? tasks : undefined,\n },\n };\n}\n\n/**\n * Merge partial embedding updates into config, returning a new config object.\n */\nexport function withEmbedding(\n config: MycoConfig,\n updates: Partial<EmbeddingProviderConfig>,\n): MycoConfig {\n return {\n ...config,\n embedding: { ...config.embedding, ...updates },\n };\n}\n\n/**\n * Merge partial context injection updates into config, returning a new config object.\n */\nexport function withContext(\n config: MycoConfig,\n updates: Partial<ContextConfig>,\n): MycoConfig {\n return {\n ...config,\n context: { ...config.context, ...updates },\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,18 +1,29 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ loadAllTasks
4
+ } from "./chunk-RAV5YMRU.js";
5
+ import {
6
+ getAgent,
7
+ getDefaultTask,
8
+ getTask,
9
+ loadAgentDefinition,
10
+ resolveDefinitionsDir,
11
+ resolveEffectiveConfig
12
+ } from "./chunk-NI23QCHB.js";
2
13
  import {
3
14
  getSpore,
4
15
  listSporeIdsSince
5
- } from "./chunk-UDBCAFXS.js";
16
+ } from "./chunk-7OYXB2NM.js";
6
17
  import {
7
18
  getSession
8
- } from "./chunk-VGVRBSLC.js";
19
+ } from "./chunk-U7GJTVSX.js";
9
20
  import {
10
21
  getTeamMachineId,
11
22
  syncRow
12
- } from "./chunk-KKEMVH6D.js";
23
+ } from "./chunk-O3TRN3RC.js";
13
24
  import {
14
25
  loadConfig
15
- } from "./chunk-FEX6ALLH.js";
26
+ } from "./chunk-2V7HR7HB.js";
16
27
  import {
17
28
  getDatabase
18
29
  } from "./chunk-MYX5NCRH.js";
@@ -26,7 +37,126 @@ import {
26
37
  GRAPH_EDGE_DEFAULT_CONFIDENCE,
27
38
  QUERY_DEFAULT_LIST_LIMIT,
28
39
  epochSeconds
29
- } from "./chunk-6SDC6V3N.js";
40
+ } from "./chunk-CKJAWZQE.js";
41
+
42
+ // src/notifications/notify.ts
43
+ import crypto from "crypto";
44
+
45
+ // src/db/queries/notifications.ts
46
+ var DEFAULT_LIMIT = 50;
47
+ var NOTIFICATION_PRUNE_AGE_SECONDS = 30 * 24 * 60 * 60;
48
+ function insertNotification(n) {
49
+ const db = getDatabase();
50
+ db.prepare(
51
+ `INSERT INTO notifications (id, domain, type, level, title, message, mode, status, link, metadata, created_at)
52
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'unread', ?, ?, ?)`
53
+ ).run(n.id, n.domain, n.type, n.level, n.title, n.message, n.mode, n.link, n.metadata, epochSeconds());
54
+ }
55
+ function listNotifications(opts = {}) {
56
+ const db = getDatabase();
57
+ const conditions = [];
58
+ const params = [];
59
+ if (opts.status) {
60
+ conditions.push("status = ?");
61
+ params.push(opts.status);
62
+ }
63
+ if (opts.domain) {
64
+ conditions.push("domain = ?");
65
+ params.push(opts.domain);
66
+ }
67
+ if (opts.mode) {
68
+ conditions.push("mode = ?");
69
+ params.push(opts.mode);
70
+ }
71
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
72
+ const limit = opts.limit ?? DEFAULT_LIMIT;
73
+ const offset = opts.offset ?? 0;
74
+ return db.prepare(
75
+ `SELECT * FROM notifications ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`
76
+ ).all(...params, limit, offset);
77
+ }
78
+ function countNotifications(status) {
79
+ const db = getDatabase();
80
+ if (status) {
81
+ const row2 = db.prepare("SELECT COUNT(*) as count FROM notifications WHERE status = ?").get(status);
82
+ return row2.count;
83
+ }
84
+ const row = db.prepare("SELECT COUNT(*) as count FROM notifications").get();
85
+ return row.count;
86
+ }
87
+ function getNotification(id) {
88
+ const db = getDatabase();
89
+ return db.prepare("SELECT * FROM notifications WHERE id = ?").get(id);
90
+ }
91
+ function updateNotificationStatus(id, status) {
92
+ const db = getDatabase();
93
+ const result = db.prepare("UPDATE notifications SET status = ? WHERE id = ?").run(status, id);
94
+ return result.changes > 0;
95
+ }
96
+ function dismissAllNotifications(domain) {
97
+ const db = getDatabase();
98
+ if (domain) {
99
+ const result2 = db.prepare("UPDATE notifications SET status = 'dismissed' WHERE domain = ? AND status != 'dismissed'").run(domain);
100
+ return result2.changes;
101
+ }
102
+ const result = db.prepare("UPDATE notifications SET status = 'dismissed' WHERE status != 'dismissed'").run();
103
+ return result.changes;
104
+ }
105
+ function markAllRead(domain) {
106
+ const db = getDatabase();
107
+ if (domain) {
108
+ const result2 = db.prepare("UPDATE notifications SET status = 'read' WHERE domain = ? AND status = 'unread'").run(domain);
109
+ return result2.changes;
110
+ }
111
+ const result = db.prepare("UPDATE notifications SET status = 'read' WHERE status = 'unread'").run();
112
+ return result.changes;
113
+ }
114
+
115
+ // src/notifications/registry.ts
116
+ var domains = /* @__PURE__ */ new Map();
117
+ function register(descriptor) {
118
+ domains.set(descriptor.domain, descriptor);
119
+ }
120
+ function getAllDomains() {
121
+ return [...domains.values()].sort((a, b) => a.domain.localeCompare(b.domain));
122
+ }
123
+ function getType(typeId) {
124
+ for (const descriptor of domains.values()) {
125
+ const match = descriptor.types.find((t) => t.id === typeId);
126
+ if (match) return { domain: descriptor, type: match };
127
+ }
128
+ return void 0;
129
+ }
130
+
131
+ // src/notifications/notify.ts
132
+ function notify(vaultDir, payload, config) {
133
+ if (!vaultDir) return null;
134
+ try {
135
+ const cfg = config ?? loadConfig(vaultDir);
136
+ if (!cfg.notifications.enabled) return null;
137
+ const domainConfig = cfg.notifications.domains[payload.domain];
138
+ if (domainConfig && !domainConfig.enabled) return null;
139
+ const registeredType = getType(payload.type);
140
+ const mode = payload.mode ?? domainConfig?.mode ?? registeredType?.type.defaultMode ?? cfg.notifications.default_mode;
141
+ const level = payload.level ?? registeredType?.type.defaultLevel ?? "info";
142
+ const id = crypto.randomUUID();
143
+ insertNotification({
144
+ id,
145
+ domain: payload.domain,
146
+ type: payload.type,
147
+ level,
148
+ title: payload.title,
149
+ message: payload.message ?? null,
150
+ mode,
151
+ link: payload.link ?? null,
152
+ metadata: payload.metadata ? JSON.stringify(payload.metadata) : null
153
+ });
154
+ return id;
155
+ } catch (err) {
156
+ console.warn("[notify] Failed to emit notification:", err instanceof Error ? err.message : err);
157
+ return null;
158
+ }
159
+ }
30
160
 
31
161
  // src/utils/error-message.ts
32
162
  function errorMessage(err) {
@@ -787,121 +917,81 @@ function getLatestRunId(agentId, taskName) {
787
917
  return row?.id ?? null;
788
918
  }
789
919
 
790
- // src/db/queries/notifications.ts
791
- var DEFAULT_LIMIT = 50;
792
- var NOTIFICATION_PRUNE_AGE_SECONDS = 30 * 24 * 60 * 60;
793
- function insertNotification(n) {
794
- const db = getDatabase();
795
- db.prepare(
796
- `INSERT INTO notifications (id, domain, type, level, title, message, mode, status, link, metadata, created_at)
797
- VALUES (?, ?, ?, ?, ?, ?, ?, 'unread', ?, ?, ?)`
798
- ).run(n.id, n.domain, n.type, n.level, n.title, n.message, n.mode, n.link, n.metadata, epochSeconds());
799
- }
800
- function listNotifications(opts = {}) {
801
- const db = getDatabase();
802
- const conditions = [];
803
- const params = [];
804
- if (opts.status) {
805
- conditions.push("status = ?");
806
- params.push(opts.status);
807
- }
808
- if (opts.domain) {
809
- conditions.push("domain = ?");
810
- params.push(opts.domain);
811
- }
812
- if (opts.mode) {
813
- conditions.push("mode = ?");
814
- params.push(opts.mode);
815
- }
816
- const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
817
- const limit = opts.limit ?? DEFAULT_LIMIT;
818
- const offset = opts.offset ?? 0;
819
- return db.prepare(
820
- `SELECT * FROM notifications ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`
821
- ).all(...params, limit, offset);
822
- }
823
- function countNotifications(status) {
824
- const db = getDatabase();
825
- if (status) {
826
- const row2 = db.prepare("SELECT COUNT(*) as count FROM notifications WHERE status = ?").get(status);
827
- return row2.count;
828
- }
829
- const row = db.prepare("SELECT COUNT(*) as count FROM notifications").get();
830
- return row.count;
831
- }
832
- function getNotification(id) {
833
- const db = getDatabase();
834
- return db.prepare("SELECT * FROM notifications WHERE id = ?").get(id);
835
- }
836
- function updateNotificationStatus(id, status) {
837
- const db = getDatabase();
838
- const result = db.prepare("UPDATE notifications SET status = ? WHERE id = ?").run(status, id);
839
- return result.changes > 0;
840
- }
841
- function dismissAllNotifications(domain) {
842
- const db = getDatabase();
843
- if (domain) {
844
- const result2 = db.prepare("UPDATE notifications SET status = 'dismissed' WHERE domain = ? AND status != 'dismissed'").run(domain);
845
- return result2.changes;
846
- }
847
- const result = db.prepare("UPDATE notifications SET status = 'dismissed' WHERE status != 'dismissed'").run();
848
- return result.changes;
849
- }
850
- function markAllRead(domain) {
851
- const db = getDatabase();
852
- if (domain) {
853
- const result2 = db.prepare("UPDATE notifications SET status = 'read' WHERE domain = ? AND status = 'unread'").run(domain);
854
- return result2.changes;
855
- }
856
- const result = db.prepare("UPDATE notifications SET status = 'read' WHERE status = 'unread'").run();
857
- return result.changes;
858
- }
859
-
860
- // src/notifications/registry.ts
861
- var domains = /* @__PURE__ */ new Map();
862
- function register(descriptor) {
863
- domains.set(descriptor.domain, descriptor);
864
- }
865
- function getAllDomains() {
866
- return [...domains.values()].sort((a, b) => a.domain.localeCompare(b.domain));
920
+ // src/agent/config-resolver.ts
921
+ function hasConfiguredProvider(mycoConfig, taskName) {
922
+ const taskProvider = taskName ? mycoConfig.agent.tasks?.[taskName]?.provider : void 0;
923
+ return !!(taskProvider ?? mycoConfig.agent.provider);
867
924
  }
868
- function getType(typeId) {
869
- for (const descriptor of domains.values()) {
870
- const match = descriptor.types.find((t) => t.id === typeId);
871
- if (match) return { domain: descriptor, type: match };
872
- }
873
- return void 0;
925
+ function toProviderConfig(p) {
926
+ return {
927
+ type: p.type,
928
+ baseUrl: p.base_url,
929
+ model: p.model,
930
+ contextLength: p.context_length
931
+ };
874
932
  }
875
-
876
- // src/notifications/notify.ts
877
- import crypto from "crypto";
878
- function notify(vaultDir, payload, config) {
879
- if (!vaultDir) return null;
933
+ function resolveRunConfig(agentId, requestedTask, vaultDir) {
934
+ const definitionsDir = resolveDefinitionsDir();
935
+ const definition = loadAgentDefinition(definitionsDir);
936
+ const agentRow = getAgent(agentId);
937
+ const taskRow = requestedTask ? getTask(requestedTask) : getDefaultTask(agentId);
938
+ const allTasks = loadAllTasks(definitionsDir, vaultDir);
939
+ const taskName = taskRow?.id ?? requestedTask;
940
+ const yamlTask = taskName ? allTasks.get(taskName) : void 0;
941
+ const taskOverrides = taskRow ? {
942
+ name: taskRow.id,
943
+ displayName: taskRow.display_name ?? taskRow.id,
944
+ description: taskRow.description ?? "",
945
+ agent: taskRow.agent_id,
946
+ prompt: taskRow.prompt,
947
+ isDefault: taskRow.is_default === 1,
948
+ ...taskRow.tool_overrides ? { toolOverrides: JSON.parse(taskRow.tool_overrides) } : {},
949
+ // Scalar config from YAML (model, turns, timeout) — DB doesn't store these
950
+ ...yamlTask?.model ? { model: yamlTask.model } : {},
951
+ ...yamlTask?.maxTurns ? { maxTurns: yamlTask.maxTurns } : {},
952
+ ...yamlTask?.timeoutSeconds ? { timeoutSeconds: yamlTask.timeoutSeconds } : {},
953
+ // Structural config from YAML
954
+ ...yamlTask?.phases ? { phases: yamlTask.phases } : {},
955
+ ...yamlTask?.execution ? { execution: yamlTask.execution } : {},
956
+ ...yamlTask?.contextQueries ? { contextQueries: yamlTask.contextQueries } : {},
957
+ ...yamlTask?.orchestrator ? { orchestrator: yamlTask.orchestrator } : {}
958
+ } : void 0;
959
+ const config = resolveEffectiveConfig(definition, agentRow, taskOverrides);
960
+ let taskProviderOverride;
961
+ let phaseProviderOverrides = {};
962
+ let taskParams;
880
963
  try {
881
- const cfg = config ?? loadConfig(vaultDir);
882
- if (!cfg.notifications.enabled) return null;
883
- const domainConfig = cfg.notifications.domains[payload.domain];
884
- if (domainConfig && !domainConfig.enabled) return null;
885
- const registeredType = getType(payload.type);
886
- const mode = payload.mode ?? domainConfig?.mode ?? registeredType?.type.defaultMode ?? cfg.notifications.default_mode;
887
- const level = payload.level ?? registeredType?.type.defaultLevel ?? "info";
888
- const id = crypto.randomUUID();
889
- insertNotification({
890
- id,
891
- domain: payload.domain,
892
- type: payload.type,
893
- level,
894
- title: payload.title,
895
- message: payload.message ?? null,
896
- mode,
897
- link: payload.link ?? null,
898
- metadata: payload.metadata ? JSON.stringify(payload.metadata) : null
899
- });
900
- return id;
901
- } catch (err) {
902
- console.warn("[notify] Failed to emit notification:", err instanceof Error ? err.message : err);
903
- return null;
964
+ const mycoConfig = loadConfig(vaultDir);
965
+ const taskConfig = taskName ? mycoConfig.agent.tasks?.[taskName] : void 0;
966
+ const globalProvider = mycoConfig.agent.provider;
967
+ if (taskConfig?.provider) {
968
+ taskProviderOverride = toProviderConfig(taskConfig.provider);
969
+ } else if (globalProvider) {
970
+ taskProviderOverride = toProviderConfig(globalProvider);
971
+ }
972
+ if (taskConfig?.phases) {
973
+ for (const [phaseName, phaseConfig] of Object.entries(taskConfig.phases)) {
974
+ phaseProviderOverrides[phaseName] = {
975
+ ...phaseConfig.provider ? { provider: toProviderConfig(phaseConfig.provider) } : {},
976
+ ...phaseConfig.maxTurns != null ? { maxTurns: phaseConfig.maxTurns } : {}
977
+ };
978
+ }
979
+ }
980
+ const yamlParams = yamlTask?.params;
981
+ const configParams = taskConfig?.params;
982
+ if (yamlParams || configParams) {
983
+ taskParams = { ...yamlParams, ...configParams };
984
+ }
985
+ } catch {
904
986
  }
987
+ return {
988
+ config,
989
+ definitionsDir,
990
+ taskProviderOverride,
991
+ phaseProviderOverrides,
992
+ taskName,
993
+ taskParams
994
+ };
905
995
  }
906
996
 
907
997
  // src/db/queries/batches.ts
@@ -1577,6 +1667,8 @@ export {
1577
1667
  createSporeLineage,
1578
1668
  createBatchLineage,
1579
1669
  insertReport,
1580
- listReports
1670
+ listReports,
1671
+ hasConfiguredProvider,
1672
+ resolveRunConfig
1581
1673
  };
1582
- //# sourceMappingURL=chunk-YTOD6L6N.js.map
1674
+ //# sourceMappingURL=chunk-JDI4DPWD.js.map