@goondocks/myco 0.20.1 → 0.21.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 (196) hide show
  1. package/dist/agent-eval-RJSQI5S2.js +355 -0
  2. package/dist/agent-eval-RJSQI5S2.js.map +1 -0
  3. package/dist/{agent-run-PQXC246Y.js → agent-run-2JSYFOKU.js} +10 -8
  4. package/dist/{agent-run-PQXC246Y.js.map → agent-run-2JSYFOKU.js.map} +1 -1
  5. package/dist/{agent-tasks-323BZEBX.js → agent-tasks-APFJIM2T.js} +10 -8
  6. package/dist/{agent-tasks-323BZEBX.js.map → agent-tasks-APFJIM2T.js.map} +1 -1
  7. package/dist/{chunk-SRXTSI25.js → chunk-53RPGOEN.js} +57 -9
  8. package/dist/chunk-53RPGOEN.js.map +1 -0
  9. package/dist/chunk-54SXG5HF.js +26 -0
  10. package/dist/chunk-54SXG5HF.js.map +1 -0
  11. package/dist/{chunk-DCSGJ7W4.js → chunk-5ZG4RMUH.js} +2 -2
  12. package/dist/{chunk-FLLBJLHM.js → chunk-6C6QZ4PM.js} +9 -5
  13. package/dist/chunk-6C6QZ4PM.js.map +1 -0
  14. package/dist/chunk-6LB7XELY.js +406 -0
  15. package/dist/chunk-6LB7XELY.js.map +1 -0
  16. package/dist/{chunk-22JALAXN.js → chunk-75Z7UKDY.js} +4 -4
  17. package/dist/{chunk-AIYFHQRX.js → chunk-BUTL6IFS.js} +2 -2
  18. package/dist/chunk-CESKJD44.js +586 -0
  19. package/dist/chunk-CESKJD44.js.map +1 -0
  20. package/dist/chunk-CISWUP5W.js +101 -0
  21. package/dist/chunk-CISWUP5W.js.map +1 -0
  22. package/dist/chunk-DJ3IHNYO.js +50 -0
  23. package/dist/chunk-DJ3IHNYO.js.map +1 -0
  24. package/dist/chunk-F3OEQYLS.js +847 -0
  25. package/dist/chunk-F3OEQYLS.js.map +1 -0
  26. package/dist/{chunk-6RFZWV4R.js → chunk-FCJ5JV54.js} +1 -1
  27. package/dist/{chunk-6RFZWV4R.js.map → chunk-FCJ5JV54.js.map} +1 -1
  28. package/dist/{chunk-63ZGP4Q2.js → chunk-G6QIBNZM.js} +9 -6
  29. package/dist/{chunk-63ZGP4Q2.js.map → chunk-G6QIBNZM.js.map} +1 -1
  30. package/dist/{chunk-57O67XVF.js → chunk-ILJPRYES.js} +6 -4
  31. package/dist/{chunk-57O67XVF.js.map → chunk-ILJPRYES.js.map} +1 -1
  32. package/dist/{chunk-US4LNCAT.js → chunk-IPPMYQ2Y.js} +5 -1
  33. package/dist/chunk-IPPMYQ2Y.js.map +1 -0
  34. package/dist/{chunk-UEWMSIL3.js → chunk-JR54LTPP.js} +4 -4
  35. package/dist/{chunk-4M7EWPIA.js → chunk-JZS6GZ6T.js} +16 -93
  36. package/dist/chunk-JZS6GZ6T.js.map +1 -0
  37. package/dist/{chunk-5XIVBO25.js → chunk-LVIY7P35.js} +2 -2
  38. package/dist/chunk-NGH7U6A3.js +13844 -0
  39. package/dist/chunk-NGH7U6A3.js.map +1 -0
  40. package/dist/chunk-OUJSQSKE.js +113 -0
  41. package/dist/chunk-OUJSQSKE.js.map +1 -0
  42. package/dist/{chunk-3WWJOTYG.js → chunk-P66DLD6G.js} +22 -10
  43. package/dist/chunk-P66DLD6G.js.map +1 -0
  44. package/dist/{chunk-QS5TWZBL.js → chunk-R2JIJBCL.js} +18 -4
  45. package/dist/{chunk-QS5TWZBL.js.map → chunk-R2JIJBCL.js.map} +1 -1
  46. package/dist/{chunk-MYOZLMB2.js → chunk-RL5R4CQU.js} +538 -19
  47. package/dist/chunk-RL5R4CQU.js.map +1 -0
  48. package/dist/{chunk-EVDQKYCG.js → chunk-RQSJLWP4.js} +13 -2
  49. package/dist/chunk-RQSJLWP4.js.map +1 -0
  50. package/dist/{chunk-BPRIYNLE.js → chunk-TKAJ3JVF.js} +3 -3
  51. package/dist/{chunk-LZP4IJB3.js → chunk-VHNRMM4O.js} +3 -2
  52. package/dist/{chunk-FMRZ26U5.js → chunk-X3IGT5RV.js} +5 -2
  53. package/dist/{chunk-FMRZ26U5.js.map → chunk-X3IGT5RV.js.map} +1 -1
  54. package/dist/{chunk-KHT24OWC.js → chunk-YDUOSRGD.js} +8 -94
  55. package/dist/{chunk-KHT24OWC.js.map → chunk-YDUOSRGD.js.map} +1 -1
  56. package/dist/{cli-UWBAOHLL.js → cli-LNYSTDQM.js} +49 -42
  57. package/dist/cli-LNYSTDQM.js.map +1 -0
  58. package/dist/{client-SLDDMSKN.js → client-NWE4TCNO.js} +4 -4
  59. package/dist/{config-XPV5GDE4.js → config-VC4ACP42.js} +6 -4
  60. package/dist/{config-XPV5GDE4.js.map → config-VC4ACP42.js.map} +1 -1
  61. package/dist/{detect-providers-5KOPZ7J2.js → detect-providers-ILLQZROY.js} +4 -4
  62. package/dist/{doctor-UUUOVDZS.js → doctor-TI7EZ3RW.js} +48 -15
  63. package/dist/doctor-TI7EZ3RW.js.map +1 -0
  64. package/dist/executor-F2YU7HXJ.js +44 -0
  65. package/dist/{init-UDH3ZBDD.js → init-KG3TYVGE.js} +14 -12
  66. package/dist/{init-UDH3ZBDD.js.map → init-KG3TYVGE.js.map} +1 -1
  67. package/dist/{installer-I6KRGJOO.js → installer-UMH7OJ5A.js} +6 -4
  68. package/dist/{llm-TH4NLIRM.js → llm-AGVEF5XD.js} +5 -4
  69. package/dist/{loader-H7OFASVC.js → loader-LX7TFRM6.js} +5 -3
  70. package/dist/{loader-TSB5M7FD.js → loader-NAVVZK63.js} +4 -3
  71. package/dist/{main-E7HU4QYR.js → main-5PRQNEEE.js} +2457 -649
  72. package/dist/main-5PRQNEEE.js.map +1 -0
  73. package/dist/{open-4UGDPBKN.js → open-5A27BCSB.js} +10 -8
  74. package/dist/{open-4UGDPBKN.js.map → open-5A27BCSB.js.map} +1 -1
  75. package/dist/{post-compact-BFU3WZSV.js → post-compact-USAODKPQ.js} +6 -6
  76. package/dist/{post-tool-use-RYHXLCTC.js → post-tool-use-GMMSYBII.js} +9 -7
  77. package/dist/post-tool-use-GMMSYBII.js.map +1 -0
  78. package/dist/{post-tool-use-failure-DCVHK2P3.js → post-tool-use-failure-NZVSL2PO.js} +6 -6
  79. package/dist/{pre-compact-EZZCJ6AG.js → pre-compact-LZ57DLUS.js} +6 -6
  80. package/dist/{provider-check-43LAMSMH.js → provider-check-ZEV5P4KM.js} +4 -4
  81. package/dist/{registry-MGJSJBAS.js → registry-M2Z5QBWH.js} +5 -4
  82. package/dist/{remove-GBBQG3SJ.js → remove-T3KE6C5N.js} +10 -8
  83. package/dist/{remove-GBBQG3SJ.js.map → remove-T3KE6C5N.js.map} +1 -1
  84. package/dist/{restart-RMIGKMA6.js → restart-YWDEVZUJ.js} +11 -9
  85. package/dist/{restart-RMIGKMA6.js.map → restart-YWDEVZUJ.js.map} +1 -1
  86. package/dist/{search-2A5AJVNG.js → search-GKFDGELR.js} +11 -9
  87. package/dist/{search-2A5AJVNG.js.map → search-GKFDGELR.js.map} +1 -1
  88. package/dist/{server-TSYZMFFK.js → server-AHUR6CWF.js} +368 -269
  89. package/dist/server-AHUR6CWF.js.map +1 -0
  90. package/dist/{session-NKREOTEO.js → session-2ZEPLWW6.js} +11 -9
  91. package/dist/{session-NKREOTEO.js.map → session-2ZEPLWW6.js.map} +1 -1
  92. package/dist/{session-end-DQELLTGJ.js → session-end-LWJYQAXX.js} +5 -5
  93. package/dist/session-start-WTA6GCOQ.js +134 -0
  94. package/dist/session-start-WTA6GCOQ.js.map +1 -0
  95. package/dist/{setup-llm-SLX5764H.js → setup-llm-E7UU5IO7.js} +11 -9
  96. package/dist/{setup-llm-SLX5764H.js.map → setup-llm-E7UU5IO7.js.map} +1 -1
  97. package/dist/src/agent/definitions/agent.yaml +9 -5
  98. package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +93 -0
  99. package/dist/src/agent/definitions/tasks/cortex-prompt-builder.yaml +67 -0
  100. package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -1
  101. package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
  102. package/dist/src/agent/definitions/tasks/review-session.yaml +10 -39
  103. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +5 -4
  104. package/dist/src/agent/definitions/tasks/skill-generate.yaml +2 -1
  105. package/dist/src/agent/definitions/tasks/skill-survey.yaml +25 -13
  106. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
  107. package/dist/src/agent/definitions/tasks/title-summary.yaml +12 -19
  108. package/dist/src/agent/definitions/tasks/{full-intelligence.yaml → vault-evolve.yaml} +18 -83
  109. package/dist/src/agent/definitions/tasks/vault-seed.yaml +370 -0
  110. package/dist/src/agent/prompts/agent.md +12 -38
  111. package/dist/src/cli.js +1 -1
  112. package/dist/src/daemon/main.js +1 -1
  113. package/dist/src/hooks/post-tool-use.js +1 -1
  114. package/dist/src/hooks/session-end.js +1 -1
  115. package/dist/src/hooks/session-start.js +1 -1
  116. package/dist/src/hooks/stop.js +1 -1
  117. package/dist/src/hooks/user-prompt-submit.js +1 -1
  118. package/dist/src/mcp/server.js +1 -1
  119. package/dist/src/symbionts/manifests/claude-code.yaml +4 -0
  120. package/dist/src/symbionts/manifests/pi.yaml +22 -0
  121. package/dist/src/symbionts/templates/pi/package.json +6 -0
  122. package/dist/src/symbionts/templates/pi/plugin.ts +559 -0
  123. package/dist/{stats-ARBLNEE3.js → stats-DFG6S23S.js} +11 -9
  124. package/dist/{stats-ARBLNEE3.js.map → stats-DFG6S23S.js.map} +1 -1
  125. package/dist/{stop-5AJXBKEE.js → stop-WRBTXEVT.js} +5 -5
  126. package/dist/{stop-failure-XGKTZPLR.js → stop-failure-32MGIG2Q.js} +6 -6
  127. package/dist/{subagent-start-2JLIPGJN.js → subagent-start-VFGHQFVL.js} +6 -6
  128. package/dist/{subagent-stop-FV4EOKWZ.js → subagent-stop-663FXG3P.js} +6 -6
  129. package/dist/{task-completed-XJKT366I.js → task-completed-ZCQYEFMZ.js} +6 -6
  130. package/dist/{team-3JKF7VAD.js → team-JTI5CDUO.js} +7 -5
  131. package/dist/{turns-YFNI5CQC.js → turns-HU2CTZAP.js} +2 -2
  132. package/dist/ui/assets/index-DGf1h-Ha.js +842 -0
  133. package/dist/ui/assets/index-_OP4ifzH.css +1 -0
  134. package/dist/ui/index.html +2 -2
  135. package/dist/{update-XVSAMN4O.js → update-3NBQTG32.js} +10 -8
  136. package/dist/{update-XVSAMN4O.js.map → update-3NBQTG32.js.map} +1 -1
  137. package/dist/{user-prompt-submit-TTBTHBBH.js → user-prompt-submit-ME2TBKOS.js} +8 -7
  138. package/dist/{user-prompt-submit-TTBTHBBH.js.map → user-prompt-submit-ME2TBKOS.js.map} +1 -1
  139. package/dist/{verify-LMHNEYIP.js → verify-R76ZFJSZ.js} +8 -5
  140. package/dist/{verify-LMHNEYIP.js.map → verify-R76ZFJSZ.js.map} +1 -1
  141. package/dist/{version-HRVSEMUR.js → version-GQAFBBPX.js} +2 -2
  142. package/dist/version-GQAFBBPX.js.map +1 -0
  143. package/package.json +3 -1
  144. package/skills/myco/SKILL.md +16 -1
  145. package/skills/myco/references/cli-usage.md +1 -1
  146. package/skills/myco-curate/SKILL.md +1 -1
  147. package/dist/chunk-3WWJOTYG.js.map +0 -1
  148. package/dist/chunk-4M7EWPIA.js.map +0 -1
  149. package/dist/chunk-4YFKBL3F.js +0 -195
  150. package/dist/chunk-4YFKBL3F.js.map +0 -1
  151. package/dist/chunk-EVDQKYCG.js.map +0 -1
  152. package/dist/chunk-FGY7J6EZ.js +0 -2276
  153. package/dist/chunk-FGY7J6EZ.js.map +0 -1
  154. package/dist/chunk-FLLBJLHM.js.map +0 -1
  155. package/dist/chunk-MYOZLMB2.js.map +0 -1
  156. package/dist/chunk-SRXTSI25.js.map +0 -1
  157. package/dist/chunk-US4LNCAT.js.map +0 -1
  158. package/dist/cli-UWBAOHLL.js.map +0 -1
  159. package/dist/doctor-UUUOVDZS.js.map +0 -1
  160. package/dist/executor-J4IBXSBY.js +0 -2472
  161. package/dist/executor-J4IBXSBY.js.map +0 -1
  162. package/dist/main-E7HU4QYR.js.map +0 -1
  163. package/dist/post-tool-use-RYHXLCTC.js.map +0 -1
  164. package/dist/server-TSYZMFFK.js.map +0 -1
  165. package/dist/session-start-5SUTR5GP.js +0 -189
  166. package/dist/session-start-5SUTR5GP.js.map +0 -1
  167. package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +0 -93
  168. package/dist/ui/assets/index-C2JuNtRB.css +0 -1
  169. package/dist/ui/assets/index-JLVaQKV2.js +0 -832
  170. /package/dist/{chunk-DCSGJ7W4.js.map → chunk-5ZG4RMUH.js.map} +0 -0
  171. /package/dist/{chunk-22JALAXN.js.map → chunk-75Z7UKDY.js.map} +0 -0
  172. /package/dist/{chunk-AIYFHQRX.js.map → chunk-BUTL6IFS.js.map} +0 -0
  173. /package/dist/{chunk-UEWMSIL3.js.map → chunk-JR54LTPP.js.map} +0 -0
  174. /package/dist/{chunk-5XIVBO25.js.map → chunk-LVIY7P35.js.map} +0 -0
  175. /package/dist/{chunk-BPRIYNLE.js.map → chunk-TKAJ3JVF.js.map} +0 -0
  176. /package/dist/{chunk-LZP4IJB3.js.map → chunk-VHNRMM4O.js.map} +0 -0
  177. /package/dist/{client-SLDDMSKN.js.map → client-NWE4TCNO.js.map} +0 -0
  178. /package/dist/{detect-providers-5KOPZ7J2.js.map → detect-providers-ILLQZROY.js.map} +0 -0
  179. /package/dist/{installer-I6KRGJOO.js.map → executor-F2YU7HXJ.js.map} +0 -0
  180. /package/dist/{llm-TH4NLIRM.js.map → installer-UMH7OJ5A.js.map} +0 -0
  181. /package/dist/{loader-H7OFASVC.js.map → llm-AGVEF5XD.js.map} +0 -0
  182. /package/dist/{loader-TSB5M7FD.js.map → loader-LX7TFRM6.js.map} +0 -0
  183. /package/dist/{provider-check-43LAMSMH.js.map → loader-NAVVZK63.js.map} +0 -0
  184. /package/dist/{post-compact-BFU3WZSV.js.map → post-compact-USAODKPQ.js.map} +0 -0
  185. /package/dist/{post-tool-use-failure-DCVHK2P3.js.map → post-tool-use-failure-NZVSL2PO.js.map} +0 -0
  186. /package/dist/{pre-compact-EZZCJ6AG.js.map → pre-compact-LZ57DLUS.js.map} +0 -0
  187. /package/dist/{registry-MGJSJBAS.js.map → provider-check-ZEV5P4KM.js.map} +0 -0
  188. /package/dist/{team-3JKF7VAD.js.map → registry-M2Z5QBWH.js.map} +0 -0
  189. /package/dist/{session-end-DQELLTGJ.js.map → session-end-LWJYQAXX.js.map} +0 -0
  190. /package/dist/{stop-5AJXBKEE.js.map → stop-WRBTXEVT.js.map} +0 -0
  191. /package/dist/{stop-failure-XGKTZPLR.js.map → stop-failure-32MGIG2Q.js.map} +0 -0
  192. /package/dist/{subagent-start-2JLIPGJN.js.map → subagent-start-VFGHQFVL.js.map} +0 -0
  193. /package/dist/{subagent-stop-FV4EOKWZ.js.map → subagent-stop-663FXG3P.js.map} +0 -0
  194. /package/dist/{task-completed-XJKT366I.js.map → task-completed-ZCQYEFMZ.js.map} +0 -0
  195. /package/dist/{turns-YFNI5CQC.js.map → team-JTI5CDUO.js.map} +0 -0
  196. /package/dist/{version-HRVSEMUR.js.map → turns-HU2CTZAP.js.map} +0 -0
@@ -0,0 +1,355 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ enumerateMatrixCells
4
+ } from "./chunk-54SXG5HF.js";
5
+ import {
6
+ runDurationMs
7
+ } from "./chunk-6LB7XELY.js";
8
+ import {
9
+ connectToDaemon
10
+ } from "./chunk-JR54LTPP.js";
11
+ import "./chunk-SAKJMNSR.js";
12
+ import "./chunk-VHNRMM4O.js";
13
+ import "./chunk-X3IGT5RV.js";
14
+ import "./chunk-53RPGOEN.js";
15
+ import "./chunk-OUJSQSKE.js";
16
+ import "./chunk-POEPHBQK.js";
17
+ import "./chunk-MYX5NCRH.js";
18
+ import "./chunk-P66DLD6G.js";
19
+ import "./chunk-BUTL6IFS.js";
20
+ import "./chunk-LPUQPDC2.js";
21
+ import "./chunk-6C6QZ4PM.js";
22
+ import "./chunk-UUHLLQXO.js";
23
+ import "./chunk-6LQIMRTC.js";
24
+ import "./chunk-ODXLRR4U.js";
25
+ import "./chunk-U6PF3YII.js";
26
+ import "./chunk-PZUWP5VK.js";
27
+
28
+ // src/cli/agent-eval.ts
29
+ import fs from "fs";
30
+ import path from "path";
31
+ var HELP = `Usage: myco agent eval [options]
32
+
33
+ Run an evaluation matrix across runtime/reasoning/model variants.
34
+
35
+ Options:
36
+ --task <taskId> Task to evaluate (required)
37
+ --runtimes <r1,r2> Comma-separated runtimes: claude-sdk, openai-agents
38
+ --reasoning <l1,l2> Comma-separated reasoning levels: low, default, high
39
+ --models <m1,m2> Comma-separated model names
40
+ --phase-reasoning <pairs> Per-phase reasoning pins: "extract:low,digest:high"
41
+ --phase-model <pairs> Per-phase model pins: "extract:claude-haiku-4-5,digest:claude-opus-4-6"
42
+ --dry-run Run in dry-run mode (writes intercepted, not applied)
43
+ --notes "<text>" Optional notes for this evaluation
44
+ --poll-interval <seconds> Polling interval (default: 10)
45
+ --timeout <seconds> Max wait time in seconds (default: 3600)
46
+ --no-wait Print evaluation id and exit without polling
47
+ --help, -h Show this help message
48
+
49
+ Examples:
50
+ myco agent eval --task vault-evolve --dry-run --no-wait
51
+ myco agent eval --task vault-evolve --runtimes claude-sdk,openai-agents --dry-run
52
+ myco agent eval --task vault-evolve --reasoning low,high --models claude-opus-4-5
53
+ `;
54
+ var VALID_REASONING = /* @__PURE__ */ new Set(["low", "default", "high"]);
55
+ function parsePhaseArg(raw, field, acc = {}) {
56
+ const pairs = raw.split(",").map((p) => p.trim()).filter(Boolean);
57
+ if (pairs.length === 0) {
58
+ throw new Error(`--phase-${field === "reasoningLevel" ? "reasoning" : "model"} produced zero pairs after splitting`);
59
+ }
60
+ for (const pair of pairs) {
61
+ const colonIdx = pair.indexOf(":");
62
+ if (colonIdx < 1 || colonIdx === pair.length - 1) {
63
+ throw new Error(`Malformed phase pair "${pair}" \u2014 expected "<phase>:<value>"`);
64
+ }
65
+ const phase = pair.slice(0, colonIdx).trim();
66
+ const value = pair.slice(colonIdx + 1).trim();
67
+ if (!phase || !value) {
68
+ throw new Error(`Malformed phase pair "${pair}" \u2014 expected "<phase>:<value>"`);
69
+ }
70
+ if (field === "reasoningLevel" && !VALID_REASONING.has(value)) {
71
+ throw new Error(
72
+ `Invalid reasoning level "${value}" for phase "${phase}" \u2014 expected low, default, or high`
73
+ );
74
+ }
75
+ const existing = acc[phase] ?? {};
76
+ acc[phase] = {
77
+ ...existing,
78
+ ...field === "reasoningLevel" ? { reasoningLevel: value } : { model: value }
79
+ };
80
+ }
81
+ return acc;
82
+ }
83
+ function parseArgs(args) {
84
+ if (args.includes("--help") || args.includes("-h")) {
85
+ process.stdout.write(HELP);
86
+ process.exit(0);
87
+ }
88
+ const getFlag = (flag) => {
89
+ const idx = args.indexOf(flag);
90
+ if (idx === -1) return void 0;
91
+ const val = args[idx + 1];
92
+ if (!val || val.startsWith("--")) return void 0;
93
+ return val;
94
+ };
95
+ const taskId = getFlag("--task");
96
+ if (!taskId) {
97
+ throw new Error("--task <taskId> is required");
98
+ }
99
+ const runtimesRaw = getFlag("--runtimes");
100
+ const reasoningRaw = getFlag("--reasoning");
101
+ const modelsRaw = getFlag("--models");
102
+ const phaseReasoningRaw = getFlag("--phase-reasoning");
103
+ const phaseModelRaw = getFlag("--phase-model");
104
+ const notesRaw = getFlag("--notes");
105
+ const pollIntervalRaw = getFlag("--poll-interval");
106
+ const timeoutRaw = getFlag("--timeout");
107
+ const dryRun = args.includes("--dry-run");
108
+ const noWait = args.includes("--no-wait");
109
+ const matrix = {};
110
+ if (runtimesRaw !== void 0) {
111
+ const runtimes = runtimesRaw.split(",").map((r) => r.trim()).filter(Boolean);
112
+ if (runtimes.length === 0) {
113
+ throw new Error("--runtimes produced zero values after splitting");
114
+ }
115
+ matrix.runtimes = runtimes;
116
+ }
117
+ if (reasoningRaw !== void 0) {
118
+ const reasoningLevels = reasoningRaw.split(",").map((r) => r.trim()).filter(Boolean);
119
+ if (reasoningLevels.length === 0) {
120
+ throw new Error("--reasoning produced zero values after splitting");
121
+ }
122
+ matrix.reasoningLevels = reasoningLevels;
123
+ }
124
+ if (modelsRaw !== void 0) {
125
+ const models = modelsRaw.split(",").map((m) => m.trim()).filter(Boolean);
126
+ if (models.length === 0) {
127
+ throw new Error("--models produced zero values after splitting");
128
+ }
129
+ matrix.models = models;
130
+ }
131
+ if (dryRun) {
132
+ matrix.dryRun = true;
133
+ }
134
+ if (notesRaw) {
135
+ matrix.notes = notesRaw;
136
+ }
137
+ let phases;
138
+ if (phaseReasoningRaw !== void 0) {
139
+ phases = parsePhaseArg(phaseReasoningRaw, "reasoningLevel", phases ?? {});
140
+ }
141
+ if (phaseModelRaw !== void 0) {
142
+ phases = parsePhaseArg(phaseModelRaw, "model", phases ?? {});
143
+ }
144
+ if (phases && Object.keys(phases).length > 0) {
145
+ matrix.phases = phases;
146
+ }
147
+ const pollInterval = pollIntervalRaw ? parseInt(pollIntervalRaw, 10) : 10;
148
+ if (isNaN(pollInterval) || pollInterval < 1) {
149
+ throw new Error("--poll-interval must be a positive integer");
150
+ }
151
+ const timeout = timeoutRaw ? parseInt(timeoutRaw, 10) : 3600;
152
+ if (isNaN(timeout) || timeout < 1) {
153
+ throw new Error("--timeout must be a positive integer");
154
+ }
155
+ return {
156
+ taskId,
157
+ matrix,
158
+ notes: notesRaw,
159
+ pollInterval,
160
+ timeout,
161
+ noWait
162
+ };
163
+ }
164
+ function enumerateCells(matrix) {
165
+ return enumerateMatrixCells(matrix);
166
+ }
167
+ var TABLE_COLUMNS = [
168
+ { key: "runtime", header: "runtime" },
169
+ { key: "reasoning", header: "reasoning" },
170
+ { key: "model", header: "model" },
171
+ { key: "dryRun", header: "dry-run" },
172
+ { key: "status", header: "status" },
173
+ { key: "turns", header: "turns" },
174
+ { key: "tokens", header: "tokens" },
175
+ { key: "cost", header: "cost" },
176
+ { key: "duration", header: "duration" }
177
+ ];
178
+ function formatPhaseOverrides(phases) {
179
+ if (!phases) return "";
180
+ const entries = Object.entries(phases);
181
+ if (entries.length === 0) return "";
182
+ return entries.map(([phase, pin]) => {
183
+ if (pin.reasoningLevel) return `${phase}=${pin.reasoningLevel}`;
184
+ if (pin.model) return `${phase}=${pin.model}`;
185
+ return phase;
186
+ }).join(", ");
187
+ }
188
+ function formatTable(rows) {
189
+ const includePhaseOverrides = rows.some((r) => (r.phaseOverrides ?? "").length > 0);
190
+ const columns = includePhaseOverrides ? [...TABLE_COLUMNS, { key: "phaseOverrides", header: "phase overrides" }] : TABLE_COLUMNS;
191
+ const widths = columns.map(({ key, header }) => {
192
+ let max = header.length;
193
+ for (const row of rows) {
194
+ const cell = row[key] ?? "";
195
+ if (cell.length > max) max = cell.length;
196
+ }
197
+ return max;
198
+ });
199
+ const sep = widths.map((w) => "-".repeat(w)).join("-+-");
200
+ const headerLine = columns.map(({ header }, i) => header.padEnd(widths[i])).join(" | ");
201
+ const dataLines = rows.map(
202
+ (row) => columns.map(({ key }, i) => (row[key] ?? "").padEnd(widths[i])).join(" | ")
203
+ );
204
+ return [headerLine, sep, ...dataLines].join("\n");
205
+ }
206
+ function fmtElapsed(seconds) {
207
+ const mm = Math.floor(seconds / 60);
208
+ const ss = String(seconds % 60).padStart(2, "0");
209
+ return `${String(mm).padStart(2, "0")}:${ss}`;
210
+ }
211
+ function writeReport(vaultDir, evaluationId, taskId, matrix, status, createdAt, completedAt, runs, aggregate) {
212
+ const reportDir = path.join(vaultDir, "digest", "evaluations");
213
+ fs.mkdirSync(reportDir, { recursive: true });
214
+ const reportCells = runs.map((run2) => ({
215
+ runId: run2.id,
216
+ runtime: run2.runtime ?? null,
217
+ reasoningLevel: run2.reasoning_level ?? null,
218
+ model: run2.model ?? null,
219
+ dryRun: run2.dry_run === 1 || run2.dry_run === true,
220
+ status: run2.status ?? null,
221
+ turns: run2.actions_taken ?? null,
222
+ tokens: run2.tokens_used ?? null,
223
+ costUsd: run2.cost_usd ?? null,
224
+ durationMs: runDurationMs({
225
+ started_at: run2.started_at ?? null,
226
+ completed_at: run2.completed_at ?? null
227
+ }),
228
+ error: run2.error ?? null
229
+ }));
230
+ const report = {
231
+ evaluationId,
232
+ taskId,
233
+ matrix,
234
+ status,
235
+ createdAt: createdAt ?? null,
236
+ completedAt: completedAt ?? null,
237
+ cells: reportCells,
238
+ aggregate
239
+ };
240
+ const reportPath = path.join(reportDir, `${evaluationId}.json`);
241
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), "utf-8");
242
+ console.log(`Report written to ${reportPath}`);
243
+ }
244
+ async function run(args, vaultDir) {
245
+ let parsed;
246
+ try {
247
+ parsed = parseArgs(args);
248
+ } catch (err) {
249
+ console.error(`myco agent eval: ${err.message}`);
250
+ process.stdout.write(HELP);
251
+ process.exit(1);
252
+ }
253
+ const { taskId, matrix, notes, pollInterval, timeout, noWait } = parsed;
254
+ const client = await connectToDaemon(vaultDir);
255
+ const createResult = await client.post("/api/agent/evaluations", {
256
+ taskId,
257
+ matrix,
258
+ ...notes ? { notes } : {}
259
+ });
260
+ if (!createResult.ok || !createResult.data?.evaluationId) {
261
+ console.error("Failed to create evaluation");
262
+ if (createResult.data?.error) {
263
+ console.error(` ${createResult.data.error}`);
264
+ }
265
+ process.exit(1);
266
+ }
267
+ const { evaluationId, cellCount } = createResult.data;
268
+ console.log(`Evaluation created: ${evaluationId}`);
269
+ console.log(` task: ${taskId}`);
270
+ console.log(` cells: ${cellCount}`);
271
+ if (matrix.dryRun) console.log(" mode: dry-run");
272
+ if (noWait) {
273
+ process.exit(0);
274
+ }
275
+ const startTime = Date.now();
276
+ let lastStatus = "";
277
+ while (true) {
278
+ const elapsed = Math.floor((Date.now() - startTime) / 1e3);
279
+ if (elapsed >= timeout) {
280
+ console.error(`
281
+ Evaluation timed out after ${timeout}s`);
282
+ process.exit(2);
283
+ }
284
+ await new Promise((resolve) => setTimeout(resolve, pollInterval * 1e3));
285
+ const getResult = await client.get(`/api/agent/evaluations/${evaluationId}`);
286
+ if (!getResult.ok || !getResult.data) {
287
+ console.error("Failed to poll evaluation status");
288
+ continue;
289
+ }
290
+ const { evaluation, runs, aggregate } = getResult.data;
291
+ const { completed, total } = aggregate;
292
+ const elapsedStr = fmtElapsed(elapsed);
293
+ const currentRun = runs.find((r) => r.status === "running");
294
+ const runningInfo = currentRun ? ` \u2014 running cell ${completed + 1} (${currentRun.runtime ?? "default"}/${currentRun.reasoning_level ?? "default"})` : "";
295
+ const statusLine = `[${elapsedStr}] ${completed}/${total} cells complete${runningInfo}`;
296
+ if (statusLine !== lastStatus) {
297
+ console.log(statusLine);
298
+ lastStatus = statusLine;
299
+ }
300
+ const done = evaluation.status === "completed" || evaluation.status === "failed";
301
+ if (done) {
302
+ console.log(`
303
+ Evaluation ${evaluation.status}: ${evaluationId}`);
304
+ const phaseOverridesStr = formatPhaseOverrides(evaluation.matrix.phases);
305
+ const tableRows = runs.map((run2) => {
306
+ const durationMs = runDurationMs({
307
+ started_at: run2.started_at ?? null,
308
+ completed_at: run2.completed_at ?? null
309
+ });
310
+ const durationStr = durationMs !== null ? `${(durationMs / 1e3).toFixed(1)}s` : "-";
311
+ const costStr = run2.cost_usd !== null && run2.cost_usd !== void 0 ? `$${run2.cost_usd.toFixed(4)}` : "-";
312
+ return {
313
+ runtime: run2.runtime ?? "(default)",
314
+ reasoning: run2.reasoning_level ?? "(task default)",
315
+ model: run2.model ?? "(default)",
316
+ dryRun: run2.dry_run === 1 || run2.dry_run === true ? "yes" : "no",
317
+ status: run2.status ?? "unknown",
318
+ turns: String(run2.actions_taken ?? "-"),
319
+ tokens: String(run2.tokens_used ?? "-"),
320
+ cost: costStr,
321
+ duration: durationStr,
322
+ ...phaseOverridesStr ? { phaseOverrides: phaseOverridesStr } : {}
323
+ };
324
+ });
325
+ if (tableRows.length > 0) {
326
+ console.log("\n" + formatTable(tableRows));
327
+ }
328
+ console.log(
329
+ `
330
+ Aggregate: ${aggregate.completed} completed, ${aggregate.failed} failed, ${aggregate.skipped} skipped | tokens: ${aggregate.totalTokens} | cost: $${aggregate.totalCostUsd.toFixed(4)}`
331
+ );
332
+ writeReport(
333
+ vaultDir,
334
+ evaluationId,
335
+ evaluation.taskId,
336
+ evaluation.matrix,
337
+ evaluation.status,
338
+ evaluation.createdAt,
339
+ evaluation.completedAt,
340
+ runs,
341
+ aggregate
342
+ );
343
+ process.exit(evaluation.status === "completed" ? 0 : 1);
344
+ }
345
+ }
346
+ }
347
+ export {
348
+ enumerateCells,
349
+ formatPhaseOverrides,
350
+ formatTable,
351
+ parseArgs,
352
+ parsePhaseArg,
353
+ run
354
+ };
355
+ //# sourceMappingURL=agent-eval-RJSQI5S2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/agent-eval.ts"],"sourcesContent":["/**\n * CLI `agent eval` command — run an evaluation matrix across runtime/reasoning/model\n * variants via the daemon API.\n *\n * POSTs to /api/agent/evaluations (fire-and-forget) then polls\n * GET /api/agent/evaluations/:id until the evaluation completes or times out.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { connectToDaemon } from './shared.js';\nimport { enumerateMatrixCells, type EvaluationMatrixCell } from '../agent/evaluation-matrix.js';\nimport { runDurationMs } from '../agent/run-accounting.js';\nimport type { RuntimeId, ReasoningLevel } from '../agent/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Per-phase overrides applied to every cell in the matrix. A phase entry\n * can pin `reasoningLevel`, `model`, or both — the executor merges these\n * on top of the cell-level runtime/reasoning/model at phase-execute time.\n */\nexport type PhaseOverrideMap = Record<\n string,\n { reasoningLevel?: ReasoningLevel; model?: string }\n>;\n\ninterface EvalMatrix {\n runtimes?: RuntimeId[];\n reasoningLevels?: ReasoningLevel[];\n models?: string[];\n dryRun?: boolean;\n notes?: string;\n phases?: PhaseOverrideMap;\n}\n\ninterface ParsedArgs {\n taskId: string;\n matrix: EvalMatrix;\n notes?: string;\n pollInterval: number;\n timeout: number;\n noWait: boolean;\n}\n\n/**\n * One row in the comparison table. Task A persists the reasoning level and\n * full execution-override packet on each `agent_runs` row (and the daemon\n * serializes both into the API response), so the CLI reads per-cell\n * attribution directly from the run row — no client-side zip against the\n * enumerated matrix cells is required. `enumerateMatrixCells` is still\n * used for display metadata (cell count, phase overlay).\n */\ninterface TableRow {\n runtime: string;\n reasoning: string;\n model: string;\n dryRun: string;\n status: string;\n turns: string;\n tokens: string;\n cost: string;\n duration: string;\n /**\n * Compact summary of `matrix.phases` pins shared across all cells, e.g.\n * `\"extract=low, digest=high\"`. Rendered only when at least one row has\n * a non-empty value (i.e. the matrix had a `phases` overlay).\n */\n phaseOverrides?: string;\n}\n\ninterface RunRecord {\n id: string;\n runtime?: string | null;\n model?: string | null;\n reasoning_level?: string | null;\n status?: string | null;\n started_at?: number | null;\n completed_at?: number | null;\n tokens_used?: number | null;\n cost_usd?: number | null;\n dry_run?: number | boolean | null;\n error?: string | null;\n actions_taken?: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Help text\n// ---------------------------------------------------------------------------\n\nconst HELP = `Usage: myco agent eval [options]\n\nRun an evaluation matrix across runtime/reasoning/model variants.\n\nOptions:\n --task <taskId> Task to evaluate (required)\n --runtimes <r1,r2> Comma-separated runtimes: claude-sdk, openai-agents\n --reasoning <l1,l2> Comma-separated reasoning levels: low, default, high\n --models <m1,m2> Comma-separated model names\n --phase-reasoning <pairs> Per-phase reasoning pins: \"extract:low,digest:high\"\n --phase-model <pairs> Per-phase model pins: \"extract:claude-haiku-4-5,digest:claude-opus-4-6\"\n --dry-run Run in dry-run mode (writes intercepted, not applied)\n --notes \"<text>\" Optional notes for this evaluation\n --poll-interval <seconds> Polling interval (default: 10)\n --timeout <seconds> Max wait time in seconds (default: 3600)\n --no-wait Print evaluation id and exit without polling\n --help, -h Show this help message\n\nExamples:\n myco agent eval --task vault-evolve --dry-run --no-wait\n myco agent eval --task vault-evolve --runtimes claude-sdk,openai-agents --dry-run\n myco agent eval --task vault-evolve --reasoning low,high --models claude-opus-4-5\n`;\n\n// ---------------------------------------------------------------------------\n// Phase arg parser\n// ---------------------------------------------------------------------------\n\nconst VALID_REASONING: ReadonlySet<ReasoningLevel> = new Set(['low', 'default', 'high']);\n\n/**\n * Parse a comma-separated list of \"phase:value\" pairs into a phase-keyed\n * object. The value is injected into the entry under `field`.\n *\n * Merges into an existing accumulator so `--phase-reasoning` and\n * `--phase-model` can collide on the same phase and combine their fields.\n *\n * Throws with a human-readable message on a malformed pair (missing colon,\n * empty phase, or — when `field` is `reasoningLevel` — a value outside\n * `'low' | 'default' | 'high'`).\n */\nexport function parsePhaseArg(\n raw: string,\n field: 'reasoningLevel' | 'model',\n acc: PhaseOverrideMap = {},\n): PhaseOverrideMap {\n const pairs = raw.split(',').map((p) => p.trim()).filter(Boolean);\n if (pairs.length === 0) {\n throw new Error(`--phase-${field === 'reasoningLevel' ? 'reasoning' : 'model'} produced zero pairs after splitting`);\n }\n for (const pair of pairs) {\n const colonIdx = pair.indexOf(':');\n if (colonIdx < 1 || colonIdx === pair.length - 1) {\n throw new Error(`Malformed phase pair \"${pair}\" — expected \"<phase>:<value>\"`);\n }\n const phase = pair.slice(0, colonIdx).trim();\n const value = pair.slice(colonIdx + 1).trim();\n if (!phase || !value) {\n throw new Error(`Malformed phase pair \"${pair}\" — expected \"<phase>:<value>\"`);\n }\n if (field === 'reasoningLevel' && !VALID_REASONING.has(value as ReasoningLevel)) {\n throw new Error(\n `Invalid reasoning level \"${value}\" for phase \"${phase}\" — expected low, default, or high`,\n );\n }\n const existing = acc[phase] ?? {};\n acc[phase] = {\n ...existing,\n ...(field === 'reasoningLevel'\n ? { reasoningLevel: value as ReasoningLevel }\n : { model: value }),\n };\n }\n return acc;\n}\n\n// ---------------------------------------------------------------------------\n// Arg parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse CLI args into a typed structure. Throws with a human-readable message\n * on invalid input.\n */\nexport function parseArgs(args: string[]): ParsedArgs {\n if (args.includes('--help') || args.includes('-h')) {\n process.stdout.write(HELP);\n process.exit(0);\n }\n\n // Helper to get the value after a flag\n const getFlag = (flag: string): string | undefined => {\n const idx = args.indexOf(flag);\n if (idx === -1) return undefined;\n const val = args[idx + 1];\n if (!val || val.startsWith('--')) return undefined;\n return val;\n };\n\n const taskId = getFlag('--task');\n if (!taskId) {\n throw new Error('--task <taskId> is required');\n }\n\n const runtimesRaw = getFlag('--runtimes');\n const reasoningRaw = getFlag('--reasoning');\n const modelsRaw = getFlag('--models');\n const phaseReasoningRaw = getFlag('--phase-reasoning');\n const phaseModelRaw = getFlag('--phase-model');\n const notesRaw = getFlag('--notes');\n const pollIntervalRaw = getFlag('--poll-interval');\n const timeoutRaw = getFlag('--timeout');\n\n const dryRun = args.includes('--dry-run');\n const noWait = args.includes('--no-wait');\n\n const matrix: EvalMatrix = {};\n\n if (runtimesRaw !== undefined) {\n const runtimes = runtimesRaw\n .split(',')\n .map((r) => r.trim())\n .filter(Boolean) as RuntimeId[];\n if (runtimes.length === 0) {\n throw new Error('--runtimes produced zero values after splitting');\n }\n matrix.runtimes = runtimes;\n }\n\n if (reasoningRaw !== undefined) {\n const reasoningLevels = reasoningRaw\n .split(',')\n .map((r) => r.trim())\n .filter(Boolean) as ReasoningLevel[];\n if (reasoningLevels.length === 0) {\n throw new Error('--reasoning produced zero values after splitting');\n }\n matrix.reasoningLevels = reasoningLevels;\n }\n\n if (modelsRaw !== undefined) {\n const models = modelsRaw\n .split(',')\n .map((m) => m.trim())\n .filter(Boolean);\n if (models.length === 0) {\n throw new Error('--models produced zero values after splitting');\n }\n matrix.models = models;\n }\n\n if (dryRun) {\n matrix.dryRun = true;\n }\n\n if (notesRaw) {\n matrix.notes = notesRaw;\n }\n\n // `--phase-reasoning` and `--phase-model` can target the same phase; they\n // merge into a single entry with whichever fields were specified.\n let phases: PhaseOverrideMap | undefined;\n if (phaseReasoningRaw !== undefined) {\n phases = parsePhaseArg(phaseReasoningRaw, 'reasoningLevel', phases ?? {});\n }\n if (phaseModelRaw !== undefined) {\n phases = parsePhaseArg(phaseModelRaw, 'model', phases ?? {});\n }\n if (phases && Object.keys(phases).length > 0) {\n matrix.phases = phases;\n }\n\n const pollInterval = pollIntervalRaw ? parseInt(pollIntervalRaw, 10) : 10;\n if (isNaN(pollInterval) || pollInterval < 1) {\n throw new Error('--poll-interval must be a positive integer');\n }\n\n const timeout = timeoutRaw ? parseInt(timeoutRaw, 10) : 3600;\n if (isNaN(timeout) || timeout < 1) {\n throw new Error('--timeout must be a positive integer');\n }\n\n return {\n taskId,\n matrix,\n notes: notesRaw,\n pollInterval,\n timeout,\n noWait,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix cell enumeration (display only)\n// ---------------------------------------------------------------------------\n\n/**\n * Thin re-export of the shared `enumerateMatrixCells` helper. The CLI used\n * to zip enumerated cells against child runs to derive per-cell\n * attribution, but each `agent_runs` row now persists its own runtime /\n * reasoning_level / execution_overrides (Task A + C), so per-row fields\n * come from the run row itself. This helper is retained solely for\n * display metadata (initial cell count, phase overlay rendering).\n */\nexport function enumerateCells(matrix: EvalMatrix): EvaluationMatrixCell[] {\n return enumerateMatrixCells(matrix);\n}\n\n// ---------------------------------------------------------------------------\n// Table formatter\n// ---------------------------------------------------------------------------\n\nconst TABLE_COLUMNS: Array<{ key: keyof TableRow; header: string }> = [\n { key: 'runtime', header: 'runtime' },\n { key: 'reasoning', header: 'reasoning' },\n { key: 'model', header: 'model' },\n { key: 'dryRun', header: 'dry-run' },\n { key: 'status', header: 'status' },\n { key: 'turns', header: 'turns' },\n { key: 'tokens', header: 'tokens' },\n { key: 'cost', header: 'cost' },\n { key: 'duration', header: 'duration' },\n];\n\n/**\n * Render `matrix.phases` as a compact summary like `\"extract=low,\n * digest=high\"`. When a phase entry has both `reasoningLevel` and `model`\n * pinned, only `reasoningLevel` is shown (model pins are usually long and\n * would blow out the table); the JSON report carries the full fidelity.\n *\n * Returns an empty string for missing / empty input so `formatTable` can\n * cheaply detect whether the column should appear at all.\n */\nexport function formatPhaseOverrides(phases: PhaseOverrideMap | undefined): string {\n if (!phases) return '';\n const entries = Object.entries(phases);\n if (entries.length === 0) return '';\n return entries\n .map(([phase, pin]) => {\n if (pin.reasoningLevel) return `${phase}=${pin.reasoningLevel}`;\n if (pin.model) return `${phase}=${pin.model}`;\n return phase;\n })\n .join(', ');\n}\n\n/**\n * Format rows into a plain-ASCII table with per-column width padding.\n * Returns the table as a string (no trailing newline).\n *\n * The \"phase overrides\" column is shown only when at least one row has a\n * non-empty `phaseOverrides` value; otherwise it's omitted entirely so\n * the common (no-phase-pins) output stays compact.\n */\nexport function formatTable(rows: TableRow[]): string {\n const includePhaseOverrides = rows.some((r) => (r.phaseOverrides ?? '').length > 0);\n const columns: Array<{ key: keyof TableRow; header: string }> = includePhaseOverrides\n ? [...TABLE_COLUMNS, { key: 'phaseOverrides', header: 'phase overrides' }]\n : TABLE_COLUMNS;\n\n // Compute column widths = max(header.length, max(cell.length)) for each col\n const widths = columns.map(({ key, header }) => {\n let max = header.length;\n for (const row of rows) {\n const cell = row[key] ?? '';\n if (cell.length > max) max = cell.length;\n }\n return max;\n });\n\n const sep = widths.map((w) => '-'.repeat(w)).join('-+-');\n const headerLine = columns.map(({ header }, i) => header.padEnd(widths[i])).join(' | ');\n\n const dataLines = rows.map((row) =>\n columns.map(({ key }, i) => (row[key] ?? '').padEnd(widths[i])).join(' | ')\n );\n\n return [headerLine, sep, ...dataLines].join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Elapsed-time formatter\n// ---------------------------------------------------------------------------\n\nfunction fmtElapsed(seconds: number): string {\n const mm = Math.floor(seconds / 60);\n const ss = String(seconds % 60).padStart(2, '0');\n return `${String(mm).padStart(2, '0')}:${ss}`;\n}\n\n// ---------------------------------------------------------------------------\n// JSON report writer\n// ---------------------------------------------------------------------------\n\nfunction writeReport(\n vaultDir: string,\n evaluationId: string,\n taskId: string,\n matrix: EvalMatrix,\n status: string,\n createdAt: number | undefined,\n completedAt: number | undefined,\n runs: RunRecord[],\n aggregate: Record<string, unknown>,\n): void {\n const reportDir = path.join(vaultDir, 'digest', 'evaluations');\n fs.mkdirSync(reportDir, { recursive: true });\n\n const reportCells = runs.map((run) => ({\n runId: run.id,\n runtime: run.runtime ?? null,\n reasoningLevel: run.reasoning_level ?? null,\n model: run.model ?? null,\n dryRun: run.dry_run === 1 || run.dry_run === true,\n status: run.status ?? null,\n turns: run.actions_taken ?? null,\n tokens: run.tokens_used ?? null,\n costUsd: run.cost_usd ?? null,\n durationMs: runDurationMs({\n started_at: run.started_at ?? null,\n completed_at: run.completed_at ?? null,\n }),\n error: run.error ?? null,\n }));\n\n const report = {\n evaluationId,\n taskId,\n matrix,\n status,\n createdAt: createdAt ?? null,\n completedAt: completedAt ?? null,\n cells: reportCells,\n aggregate,\n };\n\n const reportPath = path.join(reportDir, `${evaluationId}.json`);\n fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');\n console.log(`Report written to ${reportPath}`);\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n let parsed: ParsedArgs;\n try {\n parsed = parseArgs(args);\n } catch (err) {\n console.error(`myco agent eval: ${(err as Error).message}`);\n process.stdout.write(HELP);\n process.exit(1);\n }\n\n const { taskId, matrix, notes, pollInterval, timeout, noWait } = parsed;\n\n const client = await connectToDaemon(vaultDir);\n\n // POST to create evaluation\n const createResult = await client.post('/api/agent/evaluations', {\n taskId,\n matrix,\n ...(notes ? { notes } : {}),\n });\n\n if (!createResult.ok || !createResult.data?.evaluationId) {\n console.error('Failed to create evaluation');\n if (createResult.data?.error) {\n console.error(` ${createResult.data.error}`);\n }\n process.exit(1);\n }\n\n const { evaluationId, cellCount } = createResult.data as {\n evaluationId: string;\n cellCount: number;\n };\n\n console.log(`Evaluation created: ${evaluationId}`);\n console.log(` task: ${taskId}`);\n console.log(` cells: ${cellCount}`);\n if (matrix.dryRun) console.log(' mode: dry-run');\n\n if (noWait) {\n process.exit(0);\n }\n\n // Poll until done or timeout. Per-row attribution comes from the run row\n // itself (runtime/reasoning_level/model) — no client-side zip required.\n const startTime = Date.now();\n let lastStatus = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const elapsed = Math.floor((Date.now() - startTime) / 1000);\n if (elapsed >= timeout) {\n console.error(`\\nEvaluation timed out after ${timeout}s`);\n process.exit(2);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval * 1000));\n\n const getResult = await client.get(`/api/agent/evaluations/${evaluationId}`);\n if (!getResult.ok || !getResult.data) {\n console.error('Failed to poll evaluation status');\n continue;\n }\n\n const { evaluation, runs, aggregate } = getResult.data as {\n evaluation: {\n id: string;\n taskId: string;\n matrix: EvalMatrix;\n notes?: string;\n status: string;\n createdAt?: number;\n completedAt?: number;\n };\n runs: RunRecord[];\n aggregate: {\n total: number;\n completed: number;\n failed: number;\n skipped: number;\n totalTokens: number;\n totalCostUsd: number;\n };\n };\n\n const { completed, total } = aggregate;\n const elapsedStr = fmtElapsed(elapsed);\n const currentRun = runs.find((r) => r.status === 'running');\n const runningInfo = currentRun\n ? ` — running cell ${completed + 1} (${currentRun.runtime ?? 'default'}/${currentRun.reasoning_level ?? 'default'})`\n : '';\n\n const statusLine = `[${elapsedStr}] ${completed}/${total} cells complete${runningInfo}`;\n if (statusLine !== lastStatus) {\n console.log(statusLine);\n lastStatus = statusLine;\n }\n\n const done = evaluation.status === 'completed' || evaluation.status === 'failed';\n if (done) {\n console.log(`\\nEvaluation ${evaluation.status}: ${evaluationId}`);\n\n // Build comparison table from the run rows themselves — each row\n // carries runtime / reasoning_level / model / dry_run populated by\n // the executor, so no zip against enumerated matrix cells is needed.\n const phaseOverridesStr = formatPhaseOverrides(evaluation.matrix.phases);\n const tableRows: TableRow[] = runs.map((run) => {\n const durationMs = runDurationMs({\n started_at: run.started_at ?? null,\n completed_at: run.completed_at ?? null,\n });\n const durationStr = durationMs !== null ? `${(durationMs / 1000).toFixed(1)}s` : '-';\n const costStr = run.cost_usd !== null && run.cost_usd !== undefined\n ? `$${run.cost_usd.toFixed(4)}`\n : '-';\n return {\n runtime: run.runtime ?? '(default)',\n reasoning: run.reasoning_level ?? '(task default)',\n model: run.model ?? '(default)',\n dryRun: (run.dry_run === 1 || run.dry_run === true) ? 'yes' : 'no',\n status: run.status ?? 'unknown',\n turns: String(run.actions_taken ?? '-'),\n tokens: String(run.tokens_used ?? '-'),\n cost: costStr,\n duration: durationStr,\n ...(phaseOverridesStr ? { phaseOverrides: phaseOverridesStr } : {}),\n };\n });\n\n if (tableRows.length > 0) {\n console.log('\\n' + formatTable(tableRows));\n }\n\n // Summary line\n console.log(\n `\\nAggregate: ${aggregate.completed} completed, ${aggregate.failed} failed, ${aggregate.skipped} skipped` +\n ` | tokens: ${aggregate.totalTokens} | cost: $${aggregate.totalCostUsd.toFixed(4)}`\n );\n\n // Write JSON report\n writeReport(\n vaultDir,\n evaluationId,\n evaluation.taskId,\n evaluation.matrix,\n evaluation.status,\n evaluation.createdAt,\n evaluation.completedAt,\n runs,\n aggregate as Record<string, unknown>,\n );\n\n process.exit(evaluation.status === 'completed' ? 0 : 1);\n }\n }\n}\n"],"mappings":"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","names":["run"]}
@@ -1,16 +1,18 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-UEWMSIL3.js";
4
+ } from "./chunk-JR54LTPP.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-LZP4IJB3.js";
7
- import "./chunk-FMRZ26U5.js";
8
- import "./chunk-SRXTSI25.js";
6
+ import "./chunk-VHNRMM4O.js";
7
+ import "./chunk-X3IGT5RV.js";
8
+ import "./chunk-53RPGOEN.js";
9
+ import "./chunk-OUJSQSKE.js";
10
+ import "./chunk-POEPHBQK.js";
9
11
  import "./chunk-MYX5NCRH.js";
10
- import "./chunk-3WWJOTYG.js";
11
- import "./chunk-AIYFHQRX.js";
12
+ import "./chunk-P66DLD6G.js";
13
+ import "./chunk-BUTL6IFS.js";
12
14
  import "./chunk-LPUQPDC2.js";
13
- import "./chunk-FLLBJLHM.js";
15
+ import "./chunk-6C6QZ4PM.js";
14
16
  import "./chunk-UUHLLQXO.js";
15
17
  import "./chunk-6LQIMRTC.js";
16
18
  import "./chunk-ODXLRR4U.js";
@@ -36,4 +38,4 @@ async function run(args, vaultDir) {
36
38
  export {
37
39
  run
38
40
  };
39
- //# sourceMappingURL=agent-run-PQXC246Y.js.map
41
+ //# sourceMappingURL=agent-run-2JSYFOKU.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,16 +1,18 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-UEWMSIL3.js";
4
+ } from "./chunk-JR54LTPP.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-LZP4IJB3.js";
7
- import "./chunk-FMRZ26U5.js";
8
- import "./chunk-SRXTSI25.js";
6
+ import "./chunk-VHNRMM4O.js";
7
+ import "./chunk-X3IGT5RV.js";
8
+ import "./chunk-53RPGOEN.js";
9
+ import "./chunk-OUJSQSKE.js";
10
+ import "./chunk-POEPHBQK.js";
9
11
  import "./chunk-MYX5NCRH.js";
10
- import "./chunk-3WWJOTYG.js";
11
- import "./chunk-AIYFHQRX.js";
12
+ import "./chunk-P66DLD6G.js";
13
+ import "./chunk-BUTL6IFS.js";
12
14
  import "./chunk-LPUQPDC2.js";
13
- import "./chunk-FLLBJLHM.js";
15
+ import "./chunk-6C6QZ4PM.js";
14
16
  import "./chunk-UUHLLQXO.js";
15
17
  import "./chunk-6LQIMRTC.js";
16
18
  import "./chunk-ODXLRR4U.js";
@@ -182,4 +184,4 @@ async function run(args, vaultDir) {
182
184
  export {
183
185
  run
184
186
  };
185
- //# sourceMappingURL=agent-tasks-323BZEBX.js.map
187
+ //# sourceMappingURL=agent-tasks-APFJIM2T.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":[]}