@goondocks/myco 0.14.4 → 0.15.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 (172) hide show
  1. package/dist/{agent-run-GZ5UVLDV.js → agent-run-DUOJ3KDI.js} +6 -6
  2. package/dist/{agent-tasks-KKQ2GBBB.js → agent-tasks-LUWBY5JD.js} +6 -6
  3. package/dist/{chunk-X34OFKYU.js → chunk-23FJUKCN.js} +2 -2
  4. package/dist/{chunk-KNTJOMWY.js → chunk-3MEOYXOW.js} +2 -2
  5. package/dist/{chunk-PSYLKCWQ.js → chunk-4BQ5QE76.js} +24 -5
  6. package/dist/chunk-4BQ5QE76.js.map +1 -0
  7. package/dist/{chunk-JTYZRPX5.js → chunk-5ZT2Q6P5.js} +1 -1
  8. package/dist/{chunk-JJXVDCEX.js → chunk-75J2BR4P.js} +486 -488
  9. package/dist/chunk-75J2BR4P.js.map +1 -0
  10. package/dist/{chunk-GMTWRMLP.js → chunk-B3SF2CCW.js} +3 -3
  11. package/dist/{chunk-S6I62FAH.js → chunk-CUADDHHU.js} +4 -2
  12. package/dist/{chunk-S6I62FAH.js.map → chunk-CUADDHHU.js.map} +1 -1
  13. package/dist/{chunk-4VF6KQ2Z.js → chunk-DJQOYEK3.js} +87 -84
  14. package/dist/chunk-DJQOYEK3.js.map +1 -0
  15. package/dist/{chunk-LD6U3L6O.js → chunk-DK5VEBB5.js} +5 -5
  16. package/dist/{chunk-STBNNKL5.js → chunk-DKGUCEWU.js} +6 -6
  17. package/dist/{chunk-OQVKLTQY.js → chunk-EYMKBNRP.js} +2 -2
  18. package/dist/{chunk-KH64DHOY.js → chunk-GDY63YAW.js} +279 -277
  19. package/dist/chunk-GDY63YAW.js.map +1 -0
  20. package/dist/{chunk-ZESTWGJT.js → chunk-GYIA6XLB.js} +2 -2
  21. package/dist/{chunk-BCKYVLUZ.js → chunk-GZ7MXWYX.js} +3 -3
  22. package/dist/{chunk-S66YG6QK.js → chunk-LF5Z62X6.js} +46 -7
  23. package/dist/chunk-LF5Z62X6.js.map +1 -0
  24. package/dist/{chunk-TFBAV3PV.js → chunk-OMZCVRX6.js} +2 -2
  25. package/dist/{chunk-UZ5Y6XMP.js → chunk-R3YW7XVF.js} +2 -2
  26. package/dist/{chunk-PX5KIOKY.js → chunk-SPJGJEFV.js} +10 -2
  27. package/dist/{chunk-PX5KIOKY.js.map → chunk-SPJGJEFV.js.map} +1 -1
  28. package/dist/{chunk-QFMBZ72S.js → chunk-SV6UCB2Z.js} +2 -2
  29. package/dist/{chunk-NVCGF2DS.js → chunk-X4XFJG6I.js} +10 -6
  30. package/dist/chunk-X4XFJG6I.js.map +1 -0
  31. package/dist/{chunk-TNCBMGWB.js → chunk-X5IXK5KO.js} +262 -226
  32. package/dist/chunk-X5IXK5KO.js.map +1 -0
  33. package/dist/{chunk-TVV6PZOC.js → chunk-Z7TZJ2SP.js} +2 -2
  34. package/dist/{cli-JLDCZ77U.js → cli-YBD2GPK4.js} +45 -44
  35. package/dist/cli-YBD2GPK4.js.map +1 -0
  36. package/dist/{client-LRQMMKLP.js → client-CJ3X252K.js} +4 -4
  37. package/dist/{config-H657SF6B.js → config-MOWCOJJ4.js} +4 -4
  38. package/dist/{detect-27DN6UTL.js → detect-GFYKKHLJ.js} +3 -3
  39. package/dist/{detect-providers-PAVE2X6O.js → detect-providers-EU35RUL3.js} +2 -2
  40. package/dist/{doctor-IG3CXMI7.js → doctor-JR7NEL7K.js} +38 -19
  41. package/dist/doctor-JR7NEL7K.js.map +1 -0
  42. package/dist/{executor-HKNINUWO.js → executor-7XOKS6HS.js} +439 -248
  43. package/dist/executor-7XOKS6HS.js.map +1 -0
  44. package/dist/{init-RHQUINC2.js → init-PDLKYWQ4.js} +41 -23
  45. package/dist/init-PDLKYWQ4.js.map +1 -0
  46. package/dist/{init-wizard-ZB3JRDLE.js → init-wizard-WH3SXNMB.js} +7 -7
  47. package/dist/{installer-25TSX4SR.js → installer-BTUNKWOU.js} +2 -2
  48. package/dist/{llm-T3QVHC3Y.js → llm-DK44LYO6.js} +4 -4
  49. package/dist/{loader-WQKVWL5D.js → loader-WC4U5NM5.js} +4 -4
  50. package/dist/{loader-JQLO6K44.js → loader-WGDVRGLM.js} +6 -4
  51. package/dist/{logs-LXHPDKUA.js → logs-WFBX2I7C.js} +3 -3
  52. package/dist/{main-MVXPBP5Z.js → main-JB3R3DQE.js} +2346 -1912
  53. package/dist/main-JB3R3DQE.js.map +1 -0
  54. package/dist/{open-CVEMRH3Z.js → open-AADZPSLW.js} +6 -6
  55. package/dist/{openai-embeddings-5T5ZP7LO.js → openai-embeddings-SEIV7AM3.js} +2 -2
  56. package/dist/{openrouter-RD2COFC7.js → openrouter-ELODIZRP.js} +2 -2
  57. package/dist/{post-compact-ALQ2UGZ7.js → post-compact-KNQ4DYLM.js} +9 -9
  58. package/dist/{post-tool-use-SPL7HIYU.js → post-tool-use-OMWHFQLM.js} +10 -10
  59. package/dist/{post-tool-use-failure-B3CUYBTR.js → post-tool-use-failure-KFP6MB7Z.js} +9 -9
  60. package/dist/{pre-compact-KPWC4V64.js → pre-compact-2ZYE2HRB.js} +9 -9
  61. package/dist/{provider-check-QN7OGXZA.js → provider-check-B66E5PWS.js} +2 -2
  62. package/dist/{registry-2XQMCPA6.js → registry-DHWVHXWY.js} +5 -5
  63. package/dist/{remove-O2WCN6RC.js → remove-QT7634L5.js} +52 -20
  64. package/dist/remove-QT7634L5.js.map +1 -0
  65. package/dist/{resolution-events-5EVUEWHS.js → resolution-events-DBCRVZGU.js} +4 -4
  66. package/dist/{restart-S52VV3SP.js → restart-YQNQEHOU.js} +7 -7
  67. package/dist/{search-IOJ5O37S.js → search-C6JTQDWY.js} +6 -6
  68. package/dist/{server-T4VPK6FU.js → server-QJ3RWZZZ.js} +8 -8
  69. package/dist/{session-ID6BX72K.js → session-JLVL5TYX.js} +8 -8
  70. package/dist/{session-end-I7ZABXRI.js → session-end-XFZRRP5H.js} +10 -10
  71. package/dist/{session-start-VPOUY42U.js → session-start-XGINISXO.js} +15 -15
  72. package/dist/{setup-llm-G5UG5N3T.js → setup-llm-X2OCM6R7.js} +8 -8
  73. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +8 -7
  74. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +71 -144
  75. package/dist/src/agent/definitions/tasks/skill-generate.yaml +10 -62
  76. package/dist/src/agent/definitions/tasks/skill-survey.yaml +87 -53
  77. package/dist/src/agent/prompts/agent.md +1 -0
  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/worker/src/schema.ts +14 -0
  87. package/dist/{stats-GRI4MTS2.js → stats-2EAETG2T.js} +9 -9
  88. package/dist/{stop-UTZ2CXI2.js → stop-WOBDYTSA.js} +10 -10
  89. package/dist/{stop-failure-CECM5NB7.js → stop-failure-QEC7ZGBQ.js} +9 -9
  90. package/dist/{subagent-start-SYZGJYUN.js → subagent-start-H6DVRVOE.js} +9 -9
  91. package/dist/{subagent-stop-7WWW7TGQ.js → subagent-stop-LKENKJ65.js} +9 -9
  92. package/dist/{task-completed-N7SIY6T6.js → task-completed-ZZ47PRPD.js} +9 -9
  93. package/dist/{team-SJPDXELY.js → team-J62N7VMG.js} +34 -26
  94. package/dist/team-J62N7VMG.js.map +1 -0
  95. package/dist/ui/assets/index-Bx9l8uxa.js +837 -0
  96. package/dist/ui/assets/{index-BmsHIwjl.css → index-DlEQ8A8Y.css} +1 -1
  97. package/dist/ui/index.html +2 -2
  98. package/dist/{update-DZZYQ4NJ.js → update-LX3CJ4TJ.js} +30 -14
  99. package/dist/update-LX3CJ4TJ.js.map +1 -0
  100. package/dist/{user-prompt-submit-UUNRRS5P.js → user-prompt-submit-NNMLY3EW.js} +10 -10
  101. package/dist/{verify-JHIMXTY5.js → verify-AMRQXQ3K.js} +6 -6
  102. package/dist/{version-VKNCAPZW.js → version-6OJH5HLZ.js} +2 -2
  103. package/package.json +2 -2
  104. package/dist/chunk-4VF6KQ2Z.js.map +0 -1
  105. package/dist/chunk-JJXVDCEX.js.map +0 -1
  106. package/dist/chunk-KH64DHOY.js.map +0 -1
  107. package/dist/chunk-NVCGF2DS.js.map +0 -1
  108. package/dist/chunk-PSYLKCWQ.js.map +0 -1
  109. package/dist/chunk-S66YG6QK.js.map +0 -1
  110. package/dist/chunk-TNCBMGWB.js.map +0 -1
  111. package/dist/cli-JLDCZ77U.js.map +0 -1
  112. package/dist/doctor-IG3CXMI7.js.map +0 -1
  113. package/dist/executor-HKNINUWO.js.map +0 -1
  114. package/dist/init-RHQUINC2.js.map +0 -1
  115. package/dist/main-MVXPBP5Z.js.map +0 -1
  116. package/dist/remove-O2WCN6RC.js.map +0 -1
  117. package/dist/resolve-3FEUV462.js +0 -9
  118. package/dist/team-SJPDXELY.js.map +0 -1
  119. package/dist/ui/assets/index-Cn6cQwJy.js +0 -842
  120. package/dist/update-DZZYQ4NJ.js.map +0 -1
  121. package/dist/version-VKNCAPZW.js.map +0 -1
  122. /package/dist/{agent-run-GZ5UVLDV.js.map → agent-run-DUOJ3KDI.js.map} +0 -0
  123. /package/dist/{agent-tasks-KKQ2GBBB.js.map → agent-tasks-LUWBY5JD.js.map} +0 -0
  124. /package/dist/{chunk-X34OFKYU.js.map → chunk-23FJUKCN.js.map} +0 -0
  125. /package/dist/{chunk-KNTJOMWY.js.map → chunk-3MEOYXOW.js.map} +0 -0
  126. /package/dist/{chunk-JTYZRPX5.js.map → chunk-5ZT2Q6P5.js.map} +0 -0
  127. /package/dist/{chunk-GMTWRMLP.js.map → chunk-B3SF2CCW.js.map} +0 -0
  128. /package/dist/{chunk-LD6U3L6O.js.map → chunk-DK5VEBB5.js.map} +0 -0
  129. /package/dist/{chunk-STBNNKL5.js.map → chunk-DKGUCEWU.js.map} +0 -0
  130. /package/dist/{chunk-OQVKLTQY.js.map → chunk-EYMKBNRP.js.map} +0 -0
  131. /package/dist/{chunk-ZESTWGJT.js.map → chunk-GYIA6XLB.js.map} +0 -0
  132. /package/dist/{chunk-BCKYVLUZ.js.map → chunk-GZ7MXWYX.js.map} +0 -0
  133. /package/dist/{chunk-TFBAV3PV.js.map → chunk-OMZCVRX6.js.map} +0 -0
  134. /package/dist/{chunk-UZ5Y6XMP.js.map → chunk-R3YW7XVF.js.map} +0 -0
  135. /package/dist/{chunk-QFMBZ72S.js.map → chunk-SV6UCB2Z.js.map} +0 -0
  136. /package/dist/{chunk-TVV6PZOC.js.map → chunk-Z7TZJ2SP.js.map} +0 -0
  137. /package/dist/{client-LRQMMKLP.js.map → client-CJ3X252K.js.map} +0 -0
  138. /package/dist/{config-H657SF6B.js.map → config-MOWCOJJ4.js.map} +0 -0
  139. /package/dist/{detect-27DN6UTL.js.map → detect-GFYKKHLJ.js.map} +0 -0
  140. /package/dist/{detect-providers-PAVE2X6O.js.map → detect-providers-EU35RUL3.js.map} +0 -0
  141. /package/dist/{init-wizard-ZB3JRDLE.js.map → init-wizard-WH3SXNMB.js.map} +0 -0
  142. /package/dist/{installer-25TSX4SR.js.map → installer-BTUNKWOU.js.map} +0 -0
  143. /package/dist/{llm-T3QVHC3Y.js.map → llm-DK44LYO6.js.map} +0 -0
  144. /package/dist/{loader-JQLO6K44.js.map → loader-WC4U5NM5.js.map} +0 -0
  145. /package/dist/{loader-WQKVWL5D.js.map → loader-WGDVRGLM.js.map} +0 -0
  146. /package/dist/{logs-LXHPDKUA.js.map → logs-WFBX2I7C.js.map} +0 -0
  147. /package/dist/{open-CVEMRH3Z.js.map → open-AADZPSLW.js.map} +0 -0
  148. /package/dist/{openai-embeddings-5T5ZP7LO.js.map → openai-embeddings-SEIV7AM3.js.map} +0 -0
  149. /package/dist/{openrouter-RD2COFC7.js.map → openrouter-ELODIZRP.js.map} +0 -0
  150. /package/dist/{post-compact-ALQ2UGZ7.js.map → post-compact-KNQ4DYLM.js.map} +0 -0
  151. /package/dist/{post-tool-use-SPL7HIYU.js.map → post-tool-use-OMWHFQLM.js.map} +0 -0
  152. /package/dist/{post-tool-use-failure-B3CUYBTR.js.map → post-tool-use-failure-KFP6MB7Z.js.map} +0 -0
  153. /package/dist/{pre-compact-KPWC4V64.js.map → pre-compact-2ZYE2HRB.js.map} +0 -0
  154. /package/dist/{provider-check-QN7OGXZA.js.map → provider-check-B66E5PWS.js.map} +0 -0
  155. /package/dist/{registry-2XQMCPA6.js.map → registry-DHWVHXWY.js.map} +0 -0
  156. /package/dist/{resolution-events-5EVUEWHS.js.map → resolution-events-DBCRVZGU.js.map} +0 -0
  157. /package/dist/{restart-S52VV3SP.js.map → restart-YQNQEHOU.js.map} +0 -0
  158. /package/dist/{search-IOJ5O37S.js.map → search-C6JTQDWY.js.map} +0 -0
  159. /package/dist/{server-T4VPK6FU.js.map → server-QJ3RWZZZ.js.map} +0 -0
  160. /package/dist/{session-ID6BX72K.js.map → session-JLVL5TYX.js.map} +0 -0
  161. /package/dist/{session-end-I7ZABXRI.js.map → session-end-XFZRRP5H.js.map} +0 -0
  162. /package/dist/{session-start-VPOUY42U.js.map → session-start-XGINISXO.js.map} +0 -0
  163. /package/dist/{setup-llm-G5UG5N3T.js.map → setup-llm-X2OCM6R7.js.map} +0 -0
  164. /package/dist/{stats-GRI4MTS2.js.map → stats-2EAETG2T.js.map} +0 -0
  165. /package/dist/{stop-UTZ2CXI2.js.map → stop-WOBDYTSA.js.map} +0 -0
  166. /package/dist/{stop-failure-CECM5NB7.js.map → stop-failure-QEC7ZGBQ.js.map} +0 -0
  167. /package/dist/{subagent-start-SYZGJYUN.js.map → subagent-start-H6DVRVOE.js.map} +0 -0
  168. /package/dist/{subagent-stop-7WWW7TGQ.js.map → subagent-stop-LKENKJ65.js.map} +0 -0
  169. /package/dist/{task-completed-N7SIY6T6.js.map → task-completed-ZZ47PRPD.js.map} +0 -0
  170. /package/dist/{user-prompt-submit-UUNRRS5P.js.map → user-prompt-submit-NNMLY3EW.js.map} +0 -0
  171. /package/dist/{verify-JHIMXTY5.js.map → verify-AMRQXQ3K.js.map} +0 -0
  172. /package/dist/{resolve-3FEUV462.js.map → version-6OJH5HLZ.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  kindToComponent
4
- } from "./chunk-S6I62FAH.js";
4
+ } from "./chunk-CUADDHHU.js";
5
5
 
6
6
  // src/daemon/logger.ts
7
7
  import fs from "fs";
@@ -113,4 +113,4 @@ export {
113
113
  LEVEL_ORDER,
114
114
  DaemonLogger
115
115
  };
116
- //# sourceMappingURL=chunk-ZESTWGJT.js.map
116
+ //# sourceMappingURL=chunk-GYIA6XLB.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  SymbiontInstaller
4
- } from "./chunk-TNCBMGWB.js";
4
+ } from "./chunk-X5IXK5KO.js";
5
5
  import {
6
6
  LmStudioBackend,
7
7
  OllamaBackend
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-MYX5NCRH.js";
14
14
  import {
15
15
  DaemonClient
16
- } from "./chunk-UZ5Y6XMP.js";
16
+ } from "./chunk-R3YW7XVF.js";
17
17
 
18
18
  // src/cli/shared.ts
19
19
  import fs from "fs";
@@ -109,4 +109,4 @@ export {
109
109
  VAULT_GITIGNORE,
110
110
  registerSymbionts
111
111
  };
112
- //# sourceMappingURL=chunk-BCKYVLUZ.js.map
112
+ //# sourceMappingURL=chunk-GZ7MXWYX.js.map
@@ -23,6 +23,7 @@ function getTeamMachineId() {
23
23
  // src/db/queries/team-outbox.ts
24
24
  var BURST_BATCH_SIZE = 200;
25
25
  var SENT_PRUNE_AGE_SECONDS = 86400;
26
+ var MAX_OUTBOX_RETRIES = 10;
26
27
  var MS_PER_SECOND = 1e3;
27
28
  var OUTBOX_COLUMNS = [
28
29
  "id",
@@ -32,7 +33,9 @@ var OUTBOX_COLUMNS = [
32
33
  "payload",
33
34
  "machine_id",
34
35
  "created_at",
35
- "sent_at"
36
+ "sent_at",
37
+ "retry_count",
38
+ "last_attempt_at"
36
39
  ];
37
40
  var SELECT_COLUMNS = OUTBOX_COLUMNS.join(", ");
38
41
  function toOutboxRow(row) {
@@ -44,7 +47,9 @@ function toOutboxRow(row) {
44
47
  payload: row.payload,
45
48
  machine_id: row.machine_id,
46
49
  created_at: row.created_at,
47
- sent_at: row.sent_at ?? null
50
+ sent_at: row.sent_at ?? null,
51
+ retry_count: row.retry_count ?? 0,
52
+ last_attempt_at: row.last_attempt_at ?? null
48
53
  };
49
54
  }
50
55
  function syncRow(tableName, row) {
@@ -81,10 +86,10 @@ function listPending(limit) {
81
86
  const rows = db.prepare(
82
87
  `SELECT ${SELECT_COLUMNS}
83
88
  FROM team_outbox
84
- WHERE sent_at IS NULL
89
+ WHERE sent_at IS NULL AND retry_count < ?
85
90
  ORDER BY created_at ASC
86
91
  LIMIT ?`
87
- ).all(limit ?? BURST_BATCH_SIZE);
92
+ ).all(MAX_OUTBOX_RETRIES, limit ?? BURST_BATCH_SIZE);
88
93
  return rows.map(toOutboxRow);
89
94
  }
90
95
  function markSent(ids, sentAt) {
@@ -97,6 +102,37 @@ function markSent(ids, sentAt) {
97
102
  WHERE id IN (${placeholders})`
98
103
  ).run(sentAt, ...ids);
99
104
  }
105
+ function incrementRetryCount(ids, attemptAt) {
106
+ if (ids.length === 0) return [];
107
+ const db = getDatabase();
108
+ const placeholders = ids.map(() => "?").join(", ");
109
+ db.prepare(
110
+ `UPDATE team_outbox
111
+ SET retry_count = retry_count + 1, last_attempt_at = ?
112
+ WHERE id IN (${placeholders})`
113
+ ).run(attemptAt, ...ids);
114
+ const deadLettered = db.prepare(
115
+ `SELECT id FROM team_outbox
116
+ WHERE id IN (${placeholders}) AND retry_count >= ?`
117
+ ).all(...ids, MAX_OUTBOX_RETRIES);
118
+ return deadLettered.map((r) => r.id);
119
+ }
120
+ function retryDeadLettered() {
121
+ const db = getDatabase();
122
+ const info = db.prepare(
123
+ `UPDATE team_outbox
124
+ SET retry_count = 0, last_attempt_at = NULL
125
+ WHERE sent_at IS NULL AND retry_count >= ?`
126
+ ).run(MAX_OUTBOX_RETRIES);
127
+ return info.changes;
128
+ }
129
+ function countDeadLettered() {
130
+ const db = getDatabase();
131
+ const row = db.prepare(
132
+ `SELECT COUNT(*) as count FROM team_outbox WHERE sent_at IS NULL AND retry_count >= ?`
133
+ ).get(MAX_OUTBOX_RETRIES);
134
+ return row.count;
135
+ }
100
136
  function pruneOld() {
101
137
  const db = getDatabase();
102
138
  const cutoff = Math.floor(Date.now() / MS_PER_SECOND) - SENT_PRUNE_AGE_SECONDS;
@@ -109,8 +145,8 @@ function pruneOld() {
109
145
  function countPending() {
110
146
  const db = getDatabase();
111
147
  const row = db.prepare(
112
- `SELECT COUNT(*) as count FROM team_outbox WHERE sent_at IS NULL`
113
- ).get();
148
+ `SELECT COUNT(*) as count FROM team_outbox WHERE sent_at IS NULL AND retry_count < ?`
149
+ ).get(MAX_OUTBOX_RETRIES);
114
150
  return row.count;
115
151
  }
116
152
  var BACKFILL_TABLES = [
@@ -180,9 +216,12 @@ export {
180
216
  enqueueOutbox,
181
217
  listPending,
182
218
  markSent,
219
+ incrementRetryCount,
220
+ retryDeadLettered,
221
+ countDeadLettered,
183
222
  pruneOld,
184
223
  countPending,
185
224
  markSourceRowsSynced,
186
225
  backfillUnsynced
187
226
  };
188
- //# sourceMappingURL=chunk-S66YG6QK.js.map
227
+ //# sourceMappingURL=chunk-LF5Z62X6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daemon/team-context.ts","../src/db/queries/team-outbox.ts"],"sourcesContent":["/**\n * Module-level state for team sync.\n *\n * Initialized once by the daemon on startup. Query modules import\n * `isTeamSyncEnabled()` and `getTeamMachineId()` to decide whether\n * to enqueue outbox records on write.\n */\n\nimport { SYNC_PROTOCOL_VERSION, DEFAULT_MACHINE_ID } from '@myco/constants.js';\n\n// ---------------------------------------------------------------------------\n// Module state\n// ---------------------------------------------------------------------------\n\nlet teamSyncEnabled = false;\nlet teamMachineId = DEFAULT_MACHINE_ID;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Initialize team context. Called once on daemon startup.\n */\nexport function initTeamContext(enabled: boolean, machineId: string): void {\n teamSyncEnabled = enabled;\n teamMachineId = machineId;\n}\n\n/**\n * Whether team sync is currently enabled.\n *\n * Query modules check this before enqueuing outbox records.\n */\nexport function isTeamSyncEnabled(): boolean {\n return teamSyncEnabled;\n}\n\n/**\n * The machine ID for this instance.\n */\nexport function getTeamMachineId(): string {\n return teamMachineId;\n}\n\n/**\n * The sync protocol version in use.\n */\nexport function getTeamSyncProtocolVersion(): number {\n return SYNC_PROTOCOL_VERSION;\n}\n\n/**\n * Reset team context (for testing).\n */\nexport function resetTeamContext(): void {\n teamSyncEnabled = false;\n teamMachineId = DEFAULT_MACHINE_ID;\n}\n","/**\n * Team outbox CRUD query helpers.\n *\n * The outbox pattern: write paths enqueue records here when team sync is enabled.\n * The sync client flushes pending records in batches to the Cloudflare Worker.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { isTeamSyncEnabled, getTeamMachineId } from '@myco/daemon/team-context.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Max records returned per listPending call. */\nconst BURST_BATCH_SIZE = 200;\n\n/** Age in seconds after which sent records are pruned (24 hours). */\nconst SENT_PRUNE_AGE_SECONDS = 86_400;\n\n/** Max retry attempts before a record is dead-lettered. */\nexport const MAX_OUTBOX_RETRIES = 10;\n\n/** Milliseconds-per-second multiplier for epoch math. */\nconst MS_PER_SECOND = 1000;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required when enqueuing an outbox record. */\nexport interface OutboxInsert {\n table_name: string;\n row_id: string;\n operation?: string;\n payload: string;\n machine_id: string;\n created_at: number;\n}\n\n/** Row shape returned from outbox queries. */\nexport interface OutboxRow {\n id: number;\n table_name: string;\n row_id: string;\n operation: string;\n payload: string;\n machine_id: string;\n created_at: number;\n sent_at: number | null;\n retry_count: number;\n last_attempt_at: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst OUTBOX_COLUMNS = [\n 'id',\n 'table_name',\n 'row_id',\n 'operation',\n 'payload',\n 'machine_id',\n 'created_at',\n 'sent_at',\n 'retry_count',\n 'last_attempt_at',\n] as const;\n\nconst SELECT_COLUMNS = OUTBOX_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed OutboxRow. */\nfunction toOutboxRow(row: Record<string, unknown>): OutboxRow {\n return {\n id: row.id as number,\n table_name: row.table_name as string,\n row_id: row.row_id as string,\n operation: row.operation as string,\n payload: row.payload as string,\n machine_id: row.machine_id as string,\n created_at: row.created_at as number,\n sent_at: (row.sent_at as number) ?? null,\n retry_count: (row.retry_count as number) ?? 0,\n last_attempt_at: (row.last_attempt_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience helper — used by query modules\n// ---------------------------------------------------------------------------\n\n/**\n * Enqueue a row for team sync if sync is enabled.\n *\n * Centralizes the if-enabled / enqueue / serialize pattern that every\n * write-path query module previously duplicated inline.\n */\nexport function syncRow(tableName: string, row: { id: string | number; created_at?: number }): void {\n if (!isTeamSyncEnabled()) return;\n enqueueOutbox({\n table_name: tableName,\n row_id: String(row.id),\n payload: JSON.stringify(row),\n machine_id: getTeamMachineId(),\n created_at: row.created_at ?? Math.floor(Date.now() / 1000),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Enqueue a record into the team outbox for later sync.\n *\n * Inserted with `sent_at = NULL` (pending).\n */\nexport function enqueueOutbox(data: OutboxInsert): OutboxRow {\n const db = getDatabase();\n\n const info = db.prepare(\n `INSERT INTO team_outbox (\n table_name, row_id, operation, payload, machine_id, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n data.table_name,\n data.row_id,\n data.operation ?? 'upsert',\n data.payload,\n data.machine_id,\n data.created_at,\n );\n\n const id = Number(info.lastInsertRowid);\n\n return toOutboxRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM team_outbox WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n}\n\n/**\n * List pending outbox records (oldest-first).\n *\n * Uses burst sizing: fetches BURST_BATCH_SIZE rows and returns them all.\n * If fewer than BURST_THRESHOLD rows come back, callers get a normal-size\n * batch; if more, the full burst. This avoids a separate COUNT query.\n */\nexport function listPending(limit?: number): OutboxRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM team_outbox\n WHERE sent_at IS NULL AND retry_count < ?\n ORDER BY created_at ASC\n LIMIT ?`,\n ).all(MAX_OUTBOX_RETRIES, limit ?? BURST_BATCH_SIZE) as Record<string, unknown>[];\n\n return rows.map(toOutboxRow);\n}\n\n/**\n * Mark outbox records as sent by setting sent_at.\n */\nexport function markSent(ids: number[], sentAt: number): void {\n if (ids.length === 0) return;\n\n const db = getDatabase();\n const placeholders = ids.map(() => '?').join(', ');\n\n db.prepare(\n `UPDATE team_outbox\n SET sent_at = ?\n WHERE id IN (${placeholders})`,\n ).run(sentAt, ...ids);\n}\n\n/**\n * Reset sent_at to NULL for records that need to be retried.\n *\n * This allows the sync client to re-enqueue specific records for retry.\n */\nexport function markForRetry(ids: number[]): void {\n if (ids.length === 0) return;\n\n const db = getDatabase();\n const placeholders = ids.map(() => '?').join(', ');\n\n db.prepare(\n `UPDATE team_outbox\n SET sent_at = NULL\n WHERE id IN (${placeholders})`,\n ).run(...ids);\n}\n\n/**\n * Increment retry_count and set last_attempt_at for failed outbox records.\n *\n * @returns IDs of records that have now reached MAX_OUTBOX_RETRIES (newly dead-lettered).\n */\nexport function incrementRetryCount(ids: number[], attemptAt: number): number[] {\n if (ids.length === 0) return [];\n\n const db = getDatabase();\n const placeholders = ids.map(() => '?').join(', ');\n\n db.prepare(\n `UPDATE team_outbox\n SET retry_count = retry_count + 1, last_attempt_at = ?\n WHERE id IN (${placeholders})`,\n ).run(attemptAt, ...ids);\n\n // Return IDs that just hit the threshold\n const deadLettered = db.prepare(\n `SELECT id FROM team_outbox\n WHERE id IN (${placeholders}) AND retry_count >= ?`,\n ).all(...ids, MAX_OUTBOX_RETRIES) as Array<{ id: number }>;\n\n return deadLettered.map((r) => r.id);\n}\n\n/**\n * Reset all dead-lettered records back to pending for retry.\n *\n * @returns the number of records reset.\n */\nexport function retryDeadLettered(): number {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE team_outbox\n SET retry_count = 0, last_attempt_at = NULL\n WHERE sent_at IS NULL AND retry_count >= ?`,\n ).run(MAX_OUTBOX_RETRIES);\n\n return info.changes;\n}\n\n/**\n * Count dead-lettered outbox records (exceeded max retries, never sent).\n */\nexport function countDeadLettered(): number {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM team_outbox WHERE sent_at IS NULL AND retry_count >= ?`,\n ).get(MAX_OUTBOX_RETRIES) as { count: number };\n\n return row.count;\n}\n\n/**\n * Prune old outbox records.\n *\n * Removes sent records older than 24 hours.\n *\n * @returns the number of records deleted.\n */\nexport function pruneOld(): number {\n const db = getDatabase();\n const cutoff = Math.floor(Date.now() / MS_PER_SECOND) - SENT_PRUNE_AGE_SECONDS;\n\n const info = db.prepare(\n `DELETE FROM team_outbox\n WHERE sent_at IS NOT NULL AND sent_at < ?`,\n ).run(cutoff);\n\n return info.changes;\n}\n\n/**\n * Count pending (unsent) outbox records.\n */\nexport function countPending(): number {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM team_outbox WHERE sent_at IS NULL AND retry_count < ?`,\n ).get(MAX_OUTBOX_RETRIES) as { count: number };\n\n return row.count;\n}\n\n// ---------------------------------------------------------------------------\n// Source-row sync bookkeeping\n// ---------------------------------------------------------------------------\n\n/** Tables eligible for backfill/sync (must have id, machine_id, synced_at columns). */\nconst BACKFILL_TABLES = [\n 'sessions',\n 'prompt_batches',\n 'spores',\n 'entities',\n 'graph_edges',\n 'resolution_events',\n 'plans',\n 'artifacts',\n 'digest_extracts',\n 'skill_candidates',\n 'skill_records',\n] as const;\n// entity_mentions excluded — no `id` column (composite key entity_id+note_id+note_type)\n// skill_usage excluded — no `synced_at` column (syncs via syncRow on insert)\n\nconst BACKFILL_TABLE_SET = new Set<string>(BACKFILL_TABLES);\n\n/**\n * Mark source rows as synced after successful outbox flush.\n *\n * Groups outbox records by table_name, then sets `synced_at` on the\n * corresponding source rows. This closes the re-enqueue loop: once\n * synced_at is non-NULL, `backfillUnsynced` skips the row even after\n * the outbox entry is pruned.\n */\nexport function markSourceRowsSynced(records: OutboxRow[], syncedAt: number): void {\n const db = getDatabase();\n\n // Group row_ids by table\n const byTable = new Map<string, string[]>();\n for (const rec of records) {\n if (!BACKFILL_TABLE_SET.has(rec.table_name)) continue;\n const ids = byTable.get(rec.table_name) ?? [];\n ids.push(rec.row_id);\n byTable.set(rec.table_name, ids);\n }\n\n for (const [table, ids] of byTable) {\n const placeholders = ids.map(() => '?').join(', ');\n db.prepare(\n `UPDATE ${table} SET synced_at = ? WHERE id IN (${placeholders}) AND synced_at IS NULL`,\n ).run(syncedAt, ...ids);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Backfill\n// ---------------------------------------------------------------------------\n\n/**\n * Enqueue all unsynced records across all synced tables into the outbox.\n *\n * Scans each table for rows where `synced_at IS NULL`, serializes the full\n * row as JSON, and inserts into the outbox. Idempotent — re-running only\n * picks up rows not yet in the outbox (checked via existing outbox entries).\n *\n * @returns the total number of records enqueued.\n */\nexport function backfillUnsynced(machineId: string): number {\n const db = getDatabase();\n let total = 0;\n\n const now = Math.floor(Date.now() / MS_PER_SECOND);\n\n // Process one table at a time in separate transactions to avoid long locks\n for (const table of BACKFILL_TABLES) {\n const rows = db.prepare(\n `SELECT * FROM ${table}\n WHERE synced_at IS NULL\n AND NOT EXISTS (\n SELECT 1 FROM team_outbox\n WHERE team_outbox.table_name = ? AND team_outbox.row_id = CAST(${table}.id AS TEXT)\n )`,\n ).all(table) as Record<string, unknown>[];\n\n if (rows.length === 0) continue;\n\n const insertBatch = db.transaction((batchRows: Record<string, unknown>[]) => {\n const stmt = db.prepare(\n `INSERT INTO team_outbox (table_name, row_id, operation, payload, machine_id, created_at)\n VALUES (?, ?, 'upsert', ?, ?, ?)`,\n );\n for (const row of batchRows) {\n stmt.run(table, String(row.id), JSON.stringify(row), machineId, now);\n }\n });\n\n insertBatch(rows);\n total += rows.length;\n }\n\n return total;\n}\n\n"],"mappings":"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","names":[]}
@@ -11,7 +11,7 @@ var cached;
11
11
  function getPluginVersion() {
12
12
  if (cached) return cached;
13
13
  if (true) {
14
- cached = "0.14.4";
14
+ cached = "0.15.0";
15
15
  return cached;
16
16
  }
17
17
  const root = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
@@ -32,4 +32,4 @@ function getPluginVersion() {
32
32
  export {
33
33
  getPluginVersion
34
34
  };
35
- //# sourceMappingURL=chunk-TFBAV3PV.js.map
35
+ //# sourceMappingURL=chunk-OMZCVRX6.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  getPluginVersion
4
- } from "./chunk-TFBAV3PV.js";
4
+ } from "./chunk-OMZCVRX6.js";
5
5
  import {
6
6
  DAEMON_CLIENT_TIMEOUT_MS,
7
7
  DAEMON_HEALTH_CHECK_TIMEOUT_MS,
@@ -185,4 +185,4 @@ export {
185
185
  resolveCliEntryPath,
186
186
  DaemonClient
187
187
  };
188
- //# sourceMappingURL=chunk-UZ5Y6XMP.js.map
188
+ //# sourceMappingURL=chunk-R3YW7XVF.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  getTeamMachineId,
4
4
  syncRow
5
- } from "./chunk-S66YG6QK.js";
5
+ } from "./chunk-LF5Z62X6.js";
6
6
  import {
7
7
  getDatabase
8
8
  } from "./chunk-MYX5NCRH.js";
@@ -152,6 +152,13 @@ function countSpores(options = {}) {
152
152
  ).get(...params);
153
153
  return row.count;
154
154
  }
155
+ function listSporeIdsSince(sinceEpoch, limit = 20) {
156
+ const db = getDatabase();
157
+ const rows = db.prepare(
158
+ `SELECT id FROM spores WHERE created_at > ? AND status = 'active' ORDER BY created_at DESC LIMIT ?`
159
+ ).all(sinceEpoch, limit);
160
+ return rows.map((r) => r.id);
161
+ }
155
162
  function updateSporeStatus(id, status, updatedAt) {
156
163
  const db = getDatabase();
157
164
  const info = db.prepare(
@@ -173,6 +180,7 @@ export {
173
180
  getSpore,
174
181
  listSpores,
175
182
  countSpores,
183
+ listSporeIdsSince,
176
184
  updateSporeStatus
177
185
  };
178
- //# sourceMappingURL=chunk-PX5KIOKY.js.map
186
+ //# sourceMappingURL=chunk-SPJGJEFV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/db/queries/spores.ts"],"sourcesContent":["/**\n * Spore CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getTeamMachineId } from '@myco/daemon/team-context.js';\nimport { syncRow } from '@myco/db/queries/team-outbox.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of spores returned by listSpores when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default spore status for new spores. */\nconst DEFAULT_STATUS = 'active';\n\n/** Default importance score for new spores. */\nexport const DEFAULT_IMPORTANCE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a spore. */\nexport interface SporeInsert {\n id: string;\n agent_id: string;\n observation_type: string;\n content: string;\n created_at: number;\n session_id?: string | null;\n prompt_batch_id?: number | null;\n status?: string;\n context?: string | null;\n importance?: number;\n file_path?: string | null;\n tags?: string | null;\n content_hash?: string | null;\n properties?: string | null;\n updated_at?: number | null;\n machine_id?: string;\n}\n\n/** Row shape returned from spore queries (all columns). */\nexport interface SporeRow {\n id: string;\n agent_id: string;\n session_id: string | null;\n prompt_batch_id: number | null;\n observation_type: string;\n status: string;\n content: string;\n context: string | null;\n importance: number;\n file_path: string | null;\n tags: string | null;\n content_hash: string | null;\n properties: string | null;\n embedded: number;\n created_at: number;\n updated_at: number | null;\n machine_id: string;\n synced_at: number | null;\n}\n\n/** Filter options for `listSpores`. */\nexport interface ListSporesOptions {\n agent_id?: string;\n observation_type?: string;\n status?: string;\n session_id?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst SPORE_COLUMNS = [\n 'id',\n 'agent_id',\n 'session_id',\n 'prompt_batch_id',\n 'observation_type',\n 'status',\n 'content',\n 'context',\n 'importance',\n 'file_path',\n 'tags',\n 'content_hash',\n 'properties',\n 'embedded',\n 'created_at',\n 'updated_at',\n 'machine_id',\n 'synced_at',\n] as const;\n\nconst SELECT_COLUMNS = SPORE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed SporeRow. */\nfunction toSporeRow(row: Record<string, unknown>): SporeRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n session_id: (row.session_id as string) ?? null,\n prompt_batch_id: (row.prompt_batch_id as number) ?? null,\n observation_type: row.observation_type as string,\n status: row.status as string,\n content: row.content as string,\n context: (row.context as string) ?? null,\n importance: row.importance as number,\n file_path: (row.file_path as string) ?? null,\n tags: (row.tags as string) ?? null,\n content_hash: (row.content_hash as string) ?? null,\n properties: (row.properties as string) ?? null,\n embedded: (row.embedded as number) ?? 0,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n machine_id: (row.machine_id as string) ?? 'local',\n synced_at: (row.synced_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new spore.\n *\n * Requires a valid `agent_id` (foreign key to agents table).\n */\nexport function insertSpore(data: SporeInsert): SporeRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO spores (\n id, agent_id, session_id, prompt_batch_id,\n observation_type, status, content, context,\n importance, file_path, tags, content_hash,\n properties, created_at, updated_at, machine_id\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.id,\n data.agent_id,\n data.session_id ?? null,\n data.prompt_batch_id ?? null,\n data.observation_type,\n data.status ?? DEFAULT_STATUS,\n data.content,\n data.context ?? null,\n data.importance ?? DEFAULT_IMPORTANCE,\n data.file_path ?? null,\n data.tags ?? null,\n data.content_hash ?? null,\n data.properties ?? null,\n data.created_at,\n data.updated_at ?? null,\n data.machine_id ?? getTeamMachineId(),\n );\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n\n/**\n * Retrieve a single spore by id.\n *\n * @returns the spore row, or null if not found.\n */\nexport function getSpore(id: string): SporeRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toSporeRow(row);\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\n/** Build WHERE clause and bound params from spore filter options. */\nfunction buildSporeWhere(\n options: Omit<ListSporesOptions, 'limit' | 'offset'>,\n): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n if (options.observation_type !== undefined) {\n conditions.push(`observation_type = ?`);\n params.push(options.observation_type);\n }\n if (options.status !== undefined) {\n conditions.push(`status = ?`);\n params.push(options.status);\n }\n if (options.session_id !== undefined) {\n conditions.push(`session_id = ?`);\n params.push(options.session_id);\n }\n if (options.search !== undefined && options.search.length > 0) {\n conditions.push(`(content LIKE ? OR observation_type LIKE ?)`);\n const pattern = `%${options.search}%`;\n params.push(pattern, pattern);\n }\n\n return {\n where: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n };\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\nexport function listSpores(\n options: ListSporesOptions = {},\n): SporeRow[] {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n const offset = options.offset ?? 0;\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM spores\n ${where}\n ORDER BY created_at DESC\n LIMIT ?\n OFFSET ?`,\n ).all(...params, limit, offset) as Record<string, unknown>[];\n\n return rows.map(toSporeRow);\n}\n\n/**\n * Count spores matching optional filters (for pagination totals).\n */\nexport function countSpores(\n options: Omit<ListSporesOptions, 'limit' | 'offset'> = {},\n): number {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores ${where}`,\n ).get(...params) as { count: number };\n\n return row.count;\n}\n\n/**\n * Update the status and updated_at timestamp of a spore.\n *\n * @returns the updated row, or null if the spore does not exist.\n */\nexport function updateSporeStatus(\n id: string,\n status: string,\n updatedAt: number,\n): SporeRow | null {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE spores\n SET status = ?, updated_at = ?\n WHERE id = ?`,\n ).run(status, updatedAt, id);\n\n if (info.changes === 0) return null;\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,qBAAqB;AAG3B,IAAM,iBAAiB;AAGhB,IAAM,qBAAqB;AA+DlC,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB,cAAc,KAAK,IAAI;AAO9C,SAAS,WAAW,KAAwC;AAC1D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,UAAU,IAAI;AAAA,IACd,YAAa,IAAI,cAAyB;AAAA,IAC1C,iBAAkB,IAAI,mBAA8B;AAAA,IACpD,kBAAkB,IAAI;AAAA,IACtB,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,SAAU,IAAI,WAAsB;AAAA,IACpC,YAAY,IAAI;AAAA,IAChB,WAAY,IAAI,aAAwB;AAAA,IACxC,MAAO,IAAI,QAAmB;AAAA,IAC9B,cAAe,IAAI,gBAA2B;AAAA,IAC9C,YAAa,IAAI,cAAyB;AAAA,IAC1C,UAAW,IAAI,YAAuB;AAAA,IACtC,YAAY,IAAI;AAAA,IAChB,YAAa,IAAI,cAAyB;AAAA,IAC1C,YAAa,IAAI,cAAyB;AAAA,IAC1C,WAAY,IAAI,aAAwB;AAAA,EAC1C;AACF;AAWO,SAAS,YAAY,MAA6B;AACvD,QAAM,KAAK,YAAY;AAEvB,KAAG;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EAAE;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,cAAc;AAAA,IACnB,KAAK,mBAAmB;AAAA,IACxB,KAAK;AAAA,IACL,KAAK,UAAU;AAAA,IACf,KAAK;AAAA,IACL,KAAK,WAAW;AAAA,IAChB,KAAK,cAAc;AAAA,IACnB,KAAK,aAAa;AAAA,IAClB,KAAK,QAAQ;AAAA,IACb,KAAK,gBAAgB;AAAA,IACrB,KAAK,cAAc;AAAA,IACnB,KAAK;AAAA,IACL,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc,iBAAiB;AAAA,EACtC;AAEA,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ,UAAU,cAAc,2BAA2B,EAAE,IAAI,KAAK,EAAE;AAAA,EAC7E;AAEA,UAAQ,UAAU,GAAG;AAErB,SAAO;AACT;AAOO,SAAS,SAAS,IAA6B;AACpD,QAAM,KAAK,YAAY;AAEvB,QAAM,MAAM,GAAG;AAAA,IACb,UAAU,cAAc;AAAA,EAC1B,EAAE,IAAI,EAAE;AAER,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,WAAW,GAAG;AACvB;AAMA,SAAS,gBACP,SACsC;AACtC,QAAM,aAAuB,CAAC;AAC9B,QAAM,SAAoB,CAAC;AAE3B,MAAI,QAAQ,aAAa,QAAW;AAClC,eAAW,KAAK,cAAc;AAC9B,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AACA,MAAI,QAAQ,qBAAqB,QAAW;AAC1C,eAAW,KAAK,sBAAsB;AACtC,WAAO,KAAK,QAAQ,gBAAgB;AAAA,EACtC;AACA,MAAI,QAAQ,WAAW,QAAW;AAChC,eAAW,KAAK,YAAY;AAC5B,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B;AACA,MAAI,QAAQ,eAAe,QAAW;AACpC,eAAW,KAAK,gBAAgB;AAChC,WAAO,KAAK,QAAQ,UAAU;AAAA,EAChC;AACA,MAAI,QAAQ,WAAW,UAAa,QAAQ,OAAO,SAAS,GAAG;AAC7D,eAAW,KAAK,6CAA6C;AAC7D,UAAM,UAAU,IAAI,QAAQ,MAAM;AAClC,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,OAAO,WAAW,SAAS,IAAI,SAAS,WAAW,KAAK,OAAO,CAAC,KAAK;AAAA,IACrE;AAAA,EACF;AACF;AAKO,SAAS,WACd,UAA6B,CAAC,GAClB;AACZ,QAAM,KAAK,YAAY;AACvB,QAAM,EAAE,OAAO,OAAO,IAAI,gBAAgB,OAAO;AACjD,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AAEjC,QAAM,OAAO,GAAG;AAAA,IACd,UAAU,cAAc;AAAA;AAAA,OAErB,KAAK;AAAA;AAAA;AAAA;AAAA,EAIV,EAAE,IAAI,GAAG,QAAQ,OAAO,MAAM;AAE9B,SAAO,KAAK,IAAI,UAAU;AAC5B;AAKO,SAAS,YACd,UAAuD,CAAC,GAChD;AACR,QAAM,KAAK,YAAY;AACvB,QAAM,EAAE,OAAO,OAAO,IAAI,gBAAgB,OAAO;AAEjD,QAAM,MAAM,GAAG;AAAA,IACb,wCAAwC,KAAK;AAAA,EAC/C,EAAE,IAAI,GAAG,MAAM;AAEf,SAAO,IAAI;AACb;AAOO,SAAS,kBACd,IACA,QACA,WACiB;AACjB,QAAM,KAAK,YAAY;AAEvB,QAAM,OAAO,GAAG;AAAA,IACd;AAAA;AAAA;AAAA,EAGF,EAAE,IAAI,QAAQ,WAAW,EAAE;AAE3B,MAAI,KAAK,YAAY,EAAG,QAAO;AAE/B,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ,UAAU,cAAc,2BAA2B,EAAE,IAAI,EAAE;AAAA,EACxE;AAEA,UAAQ,UAAU,GAAG;AAErB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/db/queries/spores.ts"],"sourcesContent":["/**\n * Spore CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getTeamMachineId } from '@myco/daemon/team-context.js';\nimport { syncRow } from '@myco/db/queries/team-outbox.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of spores returned by listSpores when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default spore status for new spores. */\nconst DEFAULT_STATUS = 'active';\n\n/** Default importance score for new spores. */\nexport const DEFAULT_IMPORTANCE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a spore. */\nexport interface SporeInsert {\n id: string;\n agent_id: string;\n observation_type: string;\n content: string;\n created_at: number;\n session_id?: string | null;\n prompt_batch_id?: number | null;\n status?: string;\n context?: string | null;\n importance?: number;\n file_path?: string | null;\n tags?: string | null;\n content_hash?: string | null;\n properties?: string | null;\n updated_at?: number | null;\n machine_id?: string;\n}\n\n/** Row shape returned from spore queries (all columns). */\nexport interface SporeRow {\n id: string;\n agent_id: string;\n session_id: string | null;\n prompt_batch_id: number | null;\n observation_type: string;\n status: string;\n content: string;\n context: string | null;\n importance: number;\n file_path: string | null;\n tags: string | null;\n content_hash: string | null;\n properties: string | null;\n embedded: number;\n created_at: number;\n updated_at: number | null;\n machine_id: string;\n synced_at: number | null;\n}\n\n/** Filter options for `listSpores`. */\nexport interface ListSporesOptions {\n agent_id?: string;\n observation_type?: string;\n status?: string;\n session_id?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst SPORE_COLUMNS = [\n 'id',\n 'agent_id',\n 'session_id',\n 'prompt_batch_id',\n 'observation_type',\n 'status',\n 'content',\n 'context',\n 'importance',\n 'file_path',\n 'tags',\n 'content_hash',\n 'properties',\n 'embedded',\n 'created_at',\n 'updated_at',\n 'machine_id',\n 'synced_at',\n] as const;\n\nconst SELECT_COLUMNS = SPORE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed SporeRow. */\nfunction toSporeRow(row: Record<string, unknown>): SporeRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n session_id: (row.session_id as string) ?? null,\n prompt_batch_id: (row.prompt_batch_id as number) ?? null,\n observation_type: row.observation_type as string,\n status: row.status as string,\n content: row.content as string,\n context: (row.context as string) ?? null,\n importance: row.importance as number,\n file_path: (row.file_path as string) ?? null,\n tags: (row.tags as string) ?? null,\n content_hash: (row.content_hash as string) ?? null,\n properties: (row.properties as string) ?? null,\n embedded: (row.embedded as number) ?? 0,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n machine_id: (row.machine_id as string) ?? 'local',\n synced_at: (row.synced_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new spore.\n *\n * Requires a valid `agent_id` (foreign key to agents table).\n */\nexport function insertSpore(data: SporeInsert): SporeRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO spores (\n id, agent_id, session_id, prompt_batch_id,\n observation_type, status, content, context,\n importance, file_path, tags, content_hash,\n properties, created_at, updated_at, machine_id\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.id,\n data.agent_id,\n data.session_id ?? null,\n data.prompt_batch_id ?? null,\n data.observation_type,\n data.status ?? DEFAULT_STATUS,\n data.content,\n data.context ?? null,\n data.importance ?? DEFAULT_IMPORTANCE,\n data.file_path ?? null,\n data.tags ?? null,\n data.content_hash ?? null,\n data.properties ?? null,\n data.created_at,\n data.updated_at ?? null,\n data.machine_id ?? getTeamMachineId(),\n );\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n\n/**\n * Retrieve a single spore by id.\n *\n * @returns the spore row, or null if not found.\n */\nexport function getSpore(id: string): SporeRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toSporeRow(row);\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\n/** Build WHERE clause and bound params from spore filter options. */\nfunction buildSporeWhere(\n options: Omit<ListSporesOptions, 'limit' | 'offset'>,\n): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n if (options.observation_type !== undefined) {\n conditions.push(`observation_type = ?`);\n params.push(options.observation_type);\n }\n if (options.status !== undefined) {\n conditions.push(`status = ?`);\n params.push(options.status);\n }\n if (options.session_id !== undefined) {\n conditions.push(`session_id = ?`);\n params.push(options.session_id);\n }\n if (options.search !== undefined && options.search.length > 0) {\n conditions.push(`(content LIKE ? OR observation_type LIKE ?)`);\n const pattern = `%${options.search}%`;\n params.push(pattern, pattern);\n }\n\n return {\n where: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n };\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\nexport function listSpores(\n options: ListSporesOptions = {},\n): SporeRow[] {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n const offset = options.offset ?? 0;\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM spores\n ${where}\n ORDER BY created_at DESC\n LIMIT ?\n OFFSET ?`,\n ).all(...params, limit, offset) as Record<string, unknown>[];\n\n return rows.map(toSporeRow);\n}\n\n/**\n * Count spores matching optional filters (for pagination totals).\n */\nexport function countSpores(\n options: Omit<ListSporesOptions, 'limit' | 'offset'> = {},\n): number {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores ${where}`,\n ).get(...params) as { count: number };\n\n return row.count;\n}\n\n/**\n * Count active spores created after a given timestamp.\n * Used by skill-evolve to detect new knowledge since last assessment.\n */\nexport function countSporesSince(sinceEpoch: number): number {\n const db = getDatabase();\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores WHERE created_at > ? AND status = 'active'`,\n ).get(sinceEpoch) as { count: number };\n return row.count;\n}\n\n/**\n * List active spore IDs created after a given timestamp, ordered newest first.\n */\nexport function listSporeIdsSince(sinceEpoch: number, limit = 20): string[] {\n const db = getDatabase();\n const rows = db.prepare(\n `SELECT id FROM spores WHERE created_at > ? AND status = 'active' ORDER BY created_at DESC LIMIT ?`,\n ).all(sinceEpoch, limit) as Array<{ id: string }>;\n return rows.map(r => r.id);\n}\n\n/**\n * Update the status and updated_at timestamp of a spore.\n *\n * @returns the updated row, or null if the spore does not exist.\n */\nexport function updateSporeStatus(\n id: string,\n status: string,\n updatedAt: number,\n): SporeRow | null {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE spores\n SET status = ?, updated_at = ?\n WHERE id = ?`,\n ).run(status, updatedAt, id);\n\n if (info.changes === 0) return null;\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D7TYRPRM.js";
8
8
  import {
9
9
  external_exports
10
- } from "./chunk-KH64DHOY.js";
10
+ } from "./chunk-GDY63YAW.js";
11
11
  import {
12
12
  __toESM
13
13
  } from "./chunk-PZUWP5VK.js";
@@ -105,4 +105,4 @@ export {
105
105
  detectSymbionts,
106
106
  resolvePackageRoot
107
107
  };
108
- //# sourceMappingURL=chunk-QFMBZ72S.js.map
108
+ //# sourceMappingURL=chunk-SV6UCB2Z.js.map
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-D7TYRPRM.js";
18
18
  import {
19
19
  external_exports
20
- } from "./chunk-KH64DHOY.js";
20
+ } from "./chunk-GDY63YAW.js";
21
21
  import {
22
22
  __toESM
23
23
  } from "./chunk-PZUWP5VK.js";
@@ -275,7 +275,8 @@ var PhaseDefinitionSchema = external_exports.object({
275
275
  required: external_exports.boolean(),
276
276
  dependsOn: external_exports.array(external_exports.string()).optional(),
277
277
  provider: ProviderConfigSchema.optional(),
278
- skipPriorContext: external_exports.boolean().optional()
278
+ skipPriorContext: external_exports.boolean().optional(),
279
+ readOnly: external_exports.boolean().optional()
279
280
  });
280
281
  var AgentTaskSchema = external_exports.object({
281
282
  name: external_exports.string(),
@@ -293,7 +294,9 @@ var AgentTaskSchema = external_exports.object({
293
294
  contextQueries: external_exports.record(external_exports.string(), external_exports.array(ContextQuerySchema)).optional(),
294
295
  schemaVersion: external_exports.number().optional(),
295
296
  orchestrator: OrchestratorConfigSchema.optional(),
296
- schedule: TaskScheduleSchema.optional()
297
+ schedule: TaskScheduleSchema.optional(),
298
+ /** Task-specific params with defaults. */
299
+ params: external_exports.record(external_exports.string(), external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean()])).optional()
297
300
  });
298
301
 
299
302
  // src/agent/loader.ts
@@ -360,7 +363,8 @@ function taskFromParsed(parsed) {
360
363
  ...parsed.contextQueries ? { contextQueries: parsed.contextQueries } : {},
361
364
  ...parsed.execution ? { execution: parsed.execution } : {},
362
365
  ...parsed.schemaVersion ? { schemaVersion: parsed.schemaVersion } : {},
363
- ...parsed.schedule ? { schedule: parsed.schedule } : {}
366
+ ...parsed.schedule ? { schedule: parsed.schedule } : {},
367
+ ...parsed.params ? { params: parsed.params } : {}
364
368
  };
365
369
  }
366
370
  function loadSystemPrompt(definitionsDir, relativePath) {
@@ -460,7 +464,7 @@ async function registerBuiltInAgentsAndTasks(definitionsDir, vaultDir) {
460
464
  ).run(BUILT_IN_SOURCE, definition.name, ...validTaskIds);
461
465
  }
462
466
  if (vaultDir) {
463
- const { loadAllTasks } = await import("./registry-2XQMCPA6.js");
467
+ const { loadAllTasks } = await import("./registry-DHWVHXWY.js");
464
468
  const allTasks = loadAllTasks(definitionsDir, vaultDir);
465
469
  for (const [name, task] of allTasks) {
466
470
  if (task.source === USER_TASK_SOURCE) {
@@ -501,4 +505,4 @@ export {
501
505
  resolveEffectiveConfig,
502
506
  registerBuiltInAgentsAndTasks
503
507
  };
504
- //# sourceMappingURL=chunk-NVCGF2DS.js.map
508
+ //# sourceMappingURL=chunk-X4XFJG6I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/loader.ts","../src/db/queries/agents.ts","../src/db/queries/tasks.ts","../src/agent/schemas.ts"],"sourcesContent":["/**\n * Agent definition and task YAML loader.\n *\n * Reads agent.yaml and tasks/*.yaml from the definitions directory,\n * validates their shape, and provides helpers for merging built-in\n * definitions with database overrides into an EffectiveConfig.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { findPackageRoot } from '@myco/utils/find-package-root.js';\nimport { parse as parseYaml } from 'yaml';\nimport { epochSeconds, DEFAULT_AGENT_ID, BUILT_IN_SOURCE, USER_TASK_SOURCE } from '@myco/constants.js';\nimport { getDatabase } from '@myco/db/client.js';\nimport { registerAgent } from '@myco/db/queries/agents.js';\nimport { upsertTask } from '@myco/db/queries/tasks.js';\nimport type { AgentRow } from '@myco/db/queries/agents.js';\nimport type { AgentDefinition, AgentTask, EffectiveConfig } from './types.js';\nimport { AgentDefinitionSchema, AgentTaskSchema } from './schemas.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Filename for the built-in agent definition. */\nconst AGENT_DEFINITION_FILE = 'agent.yaml';\n\n/** Subdirectory containing task YAML files. */\nconst TASKS_SUBDIRECTORY = 'tasks';\n\n// Package root resolution uses shared findPackageRoot from @myco/utils\n\n// BUILT_IN_SOURCE imported from @myco/constants.js\n\n// ---------------------------------------------------------------------------\n// Definitions directory resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the definitions directory at runtime.\n *\n * Strategy (same pattern as `src/prompts/index.ts`):\n * 1. Walk up from `import.meta.url` looking for `package.json`.\n * 2. From package root, try `dist/src/agent/definitions/` (tsup output).\n * 3. Fall back to `src/agent/definitions/` (dev mode / tsc output).\n * 4. Also check if the current file's directory already contains agent.yaml.\n */\nexport function resolveDefinitionsDir(): string {\n const scriptDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Check if we're already adjacent to the definitions (tsc output or dev mode)\n const adjacentDefs = path.join(scriptDir, 'definitions');\n if (fs.existsSync(path.join(adjacentDefs, AGENT_DEFINITION_FILE))) {\n return adjacentDefs;\n }\n\n // Walk up to package root using shared utility\n const root = findPackageRoot(scriptDir);\n if (root) {\n // Try dist path first (tsup bundled output)\n const distPath = path.join(root, 'dist', 'src', 'agent', 'definitions');\n if (fs.existsSync(path.join(distPath, AGENT_DEFINITION_FILE))) {\n return distPath;\n }\n // Fall back to src path (dev mode)\n const srcPath = path.join(root, 'src', 'agent', 'definitions');\n if (fs.existsSync(path.join(srcPath, AGENT_DEFINITION_FILE))) {\n return srcPath;\n }\n }\n\n // Final fallback: adjacent to current file\n return adjacentDefs;\n}\n\n// ---------------------------------------------------------------------------\n// YAML loaders\n// ---------------------------------------------------------------------------\n\n/**\n * Load and parse the built-in agent definition from `agent.yaml`.\n *\n * @param definitionsDir — path to the definitions directory.\n * @returns the parsed AgentDefinition.\n * @throws if the file is missing or malformed.\n */\nexport function loadAgentDefinition(definitionsDir: string): AgentDefinition {\n const filePath = path.join(definitionsDir, AGENT_DEFINITION_FILE);\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = AgentDefinitionSchema.parse(parseYaml(raw));\n\n return {\n name: parsed.name,\n displayName: parsed.displayName,\n description: parsed.description.trim(),\n model: parsed.model,\n maxTurns: parsed.maxTurns,\n timeoutSeconds: parsed.timeoutSeconds,\n systemPromptPath: parsed.systemPromptPath,\n tools: parsed.tools,\n };\n}\n\n/**\n * Load and parse all task YAML files from `tasks/`.\n *\n * @param definitionsDir — path to the definitions directory.\n * @returns array of parsed AgentTask objects.\n */\nexport function loadAgentTasks(definitionsDir: string): AgentTask[] {\n const tasksDir = path.join(definitionsDir, TASKS_SUBDIRECTORY);\n if (!fs.existsSync(tasksDir)) return [];\n\n const files = fs.readdirSync(tasksDir).filter((f) => f.endsWith('.yaml'));\n return files.map((file) => {\n const raw = fs.readFileSync(path.join(tasksDir, file), 'utf-8');\n const parsed = AgentTaskSchema.parse(parseYaml(raw));\n\n return taskFromParsed(parsed);\n });\n}\n\n/**\n * Convert a Zod-parsed task schema result to an AgentTask object.\n *\n * Shared by loadAgentTasks (built-in) and registry (user tasks) to ensure\n * all optional fields are consistently spread. Adding a new optional field\n * to AgentTaskSchema only requires updating this one function.\n */\nexport function taskFromParsed(parsed: AgentTask): AgentTask {\n return {\n name: parsed.name,\n displayName: parsed.displayName,\n description: parsed.description.trim(),\n agent: parsed.agent,\n prompt: parsed.prompt.trim(),\n isDefault: parsed.isDefault,\n ...(parsed.toolOverrides ? { toolOverrides: parsed.toolOverrides } : {}),\n ...(parsed.model ? { model: parsed.model } : {}),\n ...(parsed.maxTurns ? { maxTurns: parsed.maxTurns } : {}),\n ...(parsed.timeoutSeconds ? { timeoutSeconds: parsed.timeoutSeconds } : {}),\n ...(parsed.phases ? { phases: parsed.phases } : {}),\n ...(parsed.orchestrator ? { orchestrator: parsed.orchestrator } : {}),\n ...(parsed.contextQueries ? { contextQueries: parsed.contextQueries } : {}),\n ...(parsed.execution ? { execution: parsed.execution } : {}),\n ...(parsed.schemaVersion ? { schemaVersion: parsed.schemaVersion } : {}),\n ...(parsed.schedule ? { schedule: parsed.schedule } : {}),\n ...(parsed.params ? { params: parsed.params } : {}),\n };\n}\n\n/**\n * Load a system prompt markdown file.\n *\n * @param definitionsDir — path to the definitions directory.\n * @param relativePath — path relative to definitionsDir (from AgentDefinition.systemPromptPath).\n * @returns the prompt file content as a string.\n */\nexport function loadSystemPrompt(definitionsDir: string, relativePath: string): string {\n const filePath = path.resolve(definitionsDir, relativePath);\n return fs.readFileSync(filePath, 'utf-8').trim();\n}\n\n// ---------------------------------------------------------------------------\n// Config resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Merge a built-in AgentDefinition with optional database overrides and\n * task-specific configuration to produce the effective runtime config.\n *\n * Priority (highest wins):\n * 1. Task toolOverrides (replaces tool list entirely if present)\n * 2. AgentRow database overrides (model, maxTurns, timeoutSeconds, tool_access)\n * 3. Built-in AgentDefinition defaults\n *\n * @param definition — the built-in agent definition from YAML.\n * @param agentOverrides — optional database row with user-applied overrides.\n * @param taskOverrides — optional task definition (determines prompt and may override tools).\n * @returns the merged EffectiveConfig.\n */\nexport function resolveEffectiveConfig(\n definition: AgentDefinition,\n agentOverrides?: AgentRow | null,\n taskOverrides?: AgentTask,\n): EffectiveConfig {\n // Start with definition defaults\n let model = definition.model;\n let maxTurns = definition.maxTurns;\n let timeoutSeconds = definition.timeoutSeconds;\n let tools = [...definition.tools];\n const agentId = agentOverrides?.id ?? DEFAULT_AGENT_ID;\n\n // Apply agent DB overrides\n if (agentOverrides) {\n if (agentOverrides.model) model = agentOverrides.model;\n if (agentOverrides.max_turns !== null) maxTurns = agentOverrides.max_turns;\n if (agentOverrides.timeout_seconds !== null) timeoutSeconds = agentOverrides.timeout_seconds;\n if (agentOverrides.tool_access) {\n try {\n const parsed = JSON.parse(agentOverrides.tool_access);\n if (Array.isArray(parsed)) tools = parsed as string[];\n } catch {\n // Invalid JSON in tool_access — keep definition defaults\n }\n }\n }\n\n // Apply task overrides (model, turns, timeout, tool list)\n if (taskOverrides?.model) model = taskOverrides.model;\n if (taskOverrides?.maxTurns) maxTurns = taskOverrides.maxTurns;\n if (taskOverrides?.timeoutSeconds) timeoutSeconds = taskOverrides.timeoutSeconds;\n if (taskOverrides?.toolOverrides) {\n tools = [...taskOverrides.toolOverrides];\n }\n\n // Apply execution config overrides (highest priority)\n // Precedence: execution.model > task.model > agent.model\n if (taskOverrides?.execution) {\n if (taskOverrides.execution.model) model = taskOverrides.execution.model;\n if (taskOverrides.execution.maxTurns) maxTurns = taskOverrides.execution.maxTurns;\n if (taskOverrides.execution.timeoutSeconds) timeoutSeconds = taskOverrides.execution.timeoutSeconds;\n }\n\n // Task prompt and display info (fall back to a generic prompt)\n const taskName = taskOverrides?.name ?? 'full-intelligence';\n const taskDisplayName = taskOverrides?.displayName ?? 'Full Intelligence';\n const taskPrompt = taskOverrides?.prompt ?? '';\n\n return {\n agentId,\n model,\n maxTurns,\n timeoutSeconds,\n systemPromptPath: definition.systemPromptPath,\n tools,\n taskName,\n taskDisplayName,\n taskPrompt,\n ...(taskOverrides?.phases ? { phases: taskOverrides.phases } : {}),\n ...(taskOverrides?.orchestrator ? { orchestrator: taskOverrides.orchestrator } : {}),\n ...(taskOverrides?.contextQueries ? { contextQueries: taskOverrides.contextQueries } : {}),\n ...(taskOverrides?.execution ? { execution: taskOverrides.execution } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Database registration\n// ---------------------------------------------------------------------------\n\n/**\n * Register the built-in agent and all built-in tasks into the database.\n *\n * Idempotent: uses upsert (ON CONFLICT DO UPDATE) for both agent and tasks.\n * Safe to call on every daemon startup.\n *\n * @param definitionsDir — path to the definitions directory.\n */\nexport async function registerBuiltInAgentsAndTasks(definitionsDir: string, vaultDir?: string): Promise<void> {\n const definition = loadAgentDefinition(definitionsDir);\n const tasks = loadAgentTasks(definitionsDir);\n const now = epochSeconds();\n\n // Upsert the built-in agent\n registerAgent({\n id: definition.name,\n name: definition.displayName,\n model: definition.model,\n source: BUILT_IN_SOURCE,\n max_turns: definition.maxTurns,\n timeout_seconds: definition.timeoutSeconds,\n tool_access: JSON.stringify(definition.tools),\n created_at: now,\n updated_at: now,\n });\n\n // Upsert all built-in tasks\n for (const task of tasks) {\n upsertTask({\n id: task.name,\n agent_id: definition.name,\n source: BUILT_IN_SOURCE,\n display_name: task.displayName,\n description: task.description,\n prompt: task.prompt,\n is_default: task.isDefault ? 1 : 0,\n tool_overrides: task.toolOverrides ? JSON.stringify(task.toolOverrides) : null,\n config: JSON.stringify({\n phases: task.phases ?? null,\n execution: task.execution ?? null,\n contextQueries: task.contextQueries ?? null,\n schemaVersion: task.schemaVersion ?? 1,\n }),\n created_at: now,\n updated_at: now,\n });\n }\n\n // Remove built-in tasks that no longer have YAML definitions\n const validTaskIds = tasks.map(t => t.name);\n if (validTaskIds.length > 0) {\n const db = getDatabase();\n const placeholders = validTaskIds.map(() => '?').join(', ');\n db.prepare(\n `DELETE FROM agent_tasks\n WHERE source = ? AND agent_id = ? AND id NOT IN (${placeholders})`,\n ).run(BUILT_IN_SOURCE, definition.name, ...validTaskIds);\n }\n\n // Register user tasks from the vault (if vault dir provided)\n if (vaultDir) {\n const { loadAllTasks } = await import('./registry.js');\n const allTasks = loadAllTasks(definitionsDir, vaultDir);\n for (const [name, task] of allTasks) {\n if (task.source === USER_TASK_SOURCE) {\n upsertTask({\n id: name,\n agent_id: task.agent ?? definition.name,\n source: USER_TASK_SOURCE,\n display_name: task.displayName,\n description: task.description,\n prompt: task.prompt,\n is_default: task.isDefault ? 1 : 0,\n tool_overrides: task.toolOverrides ? JSON.stringify(task.toolOverrides) : null,\n config: JSON.stringify({\n phases: task.phases ?? null,\n execution: task.execution ?? null,\n contextQueries: task.contextQueries ?? null,\n schemaVersion: task.schemaVersion ?? 1,\n }),\n created_at: now,\n updated_at: now,\n });\n }\n }\n }\n}\n","/**\n * Agent CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when registering an agent. */\nexport interface AgentInsert {\n id: string;\n name: string;\n created_at: number;\n provider?: string | null;\n model?: string | null;\n system_prompt_hash?: string | null;\n config?: string | null;\n source?: string;\n system_prompt?: string | null;\n max_turns?: number | null;\n timeout_seconds?: number | null;\n tool_access?: string | null;\n enabled?: number;\n updated_at?: number | null;\n}\n\n/** Row shape returned from agent queries (all columns). */\nexport interface AgentRow {\n id: string;\n name: string;\n provider: string | null;\n model: string | null;\n system_prompt_hash: string | null;\n config: string | null;\n source: string;\n system_prompt: string | null;\n max_turns: number | null;\n timeout_seconds: number | null;\n tool_access: string | null;\n enabled: number;\n created_at: number;\n updated_at: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default agent source for new agents. */\nconst DEFAULT_SOURCE = 'built-in';\n\n/** Default enabled flag for new agents. */\nconst DEFAULT_ENABLED = 1;\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst AGENT_COLUMNS = [\n 'id',\n 'name',\n 'provider',\n 'model',\n 'system_prompt_hash',\n 'config',\n 'source',\n 'system_prompt',\n 'max_turns',\n 'timeout_seconds',\n 'tool_access',\n 'enabled',\n 'created_at',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = AGENT_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed AgentRow. */\nfunction toAgentRow(row: Record<string, unknown>): AgentRow {\n return {\n id: row.id as string,\n name: row.name as string,\n provider: (row.provider as string) ?? null,\n model: (row.model as string) ?? null,\n system_prompt_hash: (row.system_prompt_hash as string) ?? null,\n config: (row.config as string) ?? null,\n source: (row.source as string) ?? DEFAULT_SOURCE,\n system_prompt: (row.system_prompt as string) ?? null,\n max_turns: (row.max_turns as number) ?? null,\n timeout_seconds: (row.timeout_seconds as number) ?? null,\n tool_access: (row.tool_access as string) ?? null,\n enabled: (row.enabled as number) ?? DEFAULT_ENABLED,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Register an agent or update it if the id already exists.\n *\n * On conflict the row is updated with the values from `data`.\n * This is the idempotent upsert — calling twice with the same data\n * produces the same result.\n */\nexport function registerAgent(data: AgentInsert): AgentRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agents (\n id, name, provider, model, system_prompt_hash, config,\n source, system_prompt, max_turns, timeout_seconds, tool_access,\n enabled, created_at, updated_at\n ) VALUES (\n ?, ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?, ?\n )\n ON CONFLICT (id) DO UPDATE SET\n name = EXCLUDED.name,\n provider = EXCLUDED.provider,\n model = EXCLUDED.model,\n system_prompt_hash = EXCLUDED.system_prompt_hash,\n config = EXCLUDED.config,\n source = EXCLUDED.source,\n system_prompt = EXCLUDED.system_prompt,\n max_turns = EXCLUDED.max_turns,\n timeout_seconds = EXCLUDED.timeout_seconds,\n tool_access = EXCLUDED.tool_access,\n enabled = EXCLUDED.enabled,\n updated_at = EXCLUDED.updated_at`,\n ).run(\n data.id,\n data.name,\n data.provider ?? null,\n data.model ?? null,\n data.system_prompt_hash ?? null,\n data.config ?? null,\n data.source ?? DEFAULT_SOURCE,\n data.system_prompt ?? null,\n data.max_turns ?? null,\n data.timeout_seconds ?? null,\n data.tool_access ?? null,\n data.enabled ?? DEFAULT_ENABLED,\n data.created_at,\n data.updated_at ?? null,\n );\n\n return toAgentRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agents WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n}\n\n/**\n * Retrieve a single agent by id.\n *\n * @returns the agent row, or null if not found.\n */\nexport function getAgent(id: string): AgentRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agents WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toAgentRow(row);\n}\n\n/**\n * List all agents, ordered by created_at ASC.\n */\nexport function listAgents(): AgentRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agents\n ORDER BY created_at ASC`,\n ).all() as Record<string, unknown>[];\n\n return rows.map(toAgentRow);\n}\n","/**\n * Agent task CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { BUILT_IN_SOURCE } from '@myco/constants.js';\nimport type { TaskConfig } from '@myco/agent/types.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of tasks returned by listTasks when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default task source for new tasks. */\nconst DEFAULT_SOURCE = BUILT_IN_SOURCE;\n\n/** Default is_default flag for new tasks. */\nconst DEFAULT_IS_DEFAULT = 0;\n\n/** Value indicating a task is the default for its agent. */\nconst IS_DEFAULT_TRUE = 1;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when upserting a task. */\nexport interface TaskInsert {\n id: string;\n agent_id: string;\n prompt: string;\n created_at: number;\n source?: string;\n display_name?: string | null;\n description?: string | null;\n is_default?: number;\n tool_overrides?: string | null;\n model?: string | null;\n config?: string | null;\n updated_at?: number | null;\n}\n\n/** Row shape returned from agent_tasks queries (all columns). */\nexport interface TaskRow {\n id: string;\n agent_id: string;\n source: string;\n display_name: string | null;\n description: string | null;\n prompt: string;\n is_default: number;\n tool_overrides: string | null;\n model: string | null;\n config: string | null;\n created_at: number;\n updated_at: number | null;\n}\n\n/** Filter options for `listTasks`. */\nexport interface ListTasksOptions {\n limit?: number;\n agent_id?: string;\n source?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst TASK_COLUMNS = [\n 'id',\n 'agent_id',\n 'source',\n 'display_name',\n 'description',\n 'prompt',\n 'is_default',\n 'tool_overrides',\n 'model',\n 'config',\n 'created_at',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = TASK_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed TaskRow. */\nfunction toTaskRow(row: Record<string, unknown>): TaskRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n source: (row.source as string) ?? DEFAULT_SOURCE,\n display_name: (row.display_name as string) ?? null,\n description: (row.description as string) ?? null,\n prompt: row.prompt as string,\n is_default: (row.is_default as number) ?? DEFAULT_IS_DEFAULT,\n tool_overrides: (row.tool_overrides as string) ?? null,\n model: (row.model as string) ?? null,\n config: (row.config as string) ?? null,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n };\n}\n\n/** Serialize a TaskConfig to a JSON string for storage. */\nexport function serializeConfig(config: TaskConfig | null): string | null {\n if (!config) return null;\n return JSON.stringify(config);\n}\n\n/** Deserialize a TaskConfig from a stored JSON string. Returns null on failure. */\nexport function deserializeConfig(raw: string | null): TaskConfig | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as TaskConfig;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Upsert a task — insert or update on conflict.\n *\n * On conflict the row is updated with the values from `data`.\n * This is the idempotent upsert — calling twice with the same data\n * produces the same result.\n */\nexport function upsertTask(data: TaskInsert): TaskRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agent_tasks (\n id, agent_id, source, display_name, description,\n prompt, is_default, tool_overrides, model, config,\n created_at, updated_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?\n )\n ON CONFLICT (id) DO UPDATE SET\n agent_id = EXCLUDED.agent_id,\n source = EXCLUDED.source,\n display_name = EXCLUDED.display_name,\n description = EXCLUDED.description,\n prompt = EXCLUDED.prompt,\n is_default = EXCLUDED.is_default,\n tool_overrides = EXCLUDED.tool_overrides,\n model = EXCLUDED.model,\n config = EXCLUDED.config,\n updated_at = EXCLUDED.updated_at`,\n ).run(\n data.id,\n data.agent_id,\n data.source ?? DEFAULT_SOURCE,\n data.display_name ?? null,\n data.description ?? null,\n data.prompt,\n data.is_default ?? DEFAULT_IS_DEFAULT,\n data.tool_overrides ?? null,\n data.model ?? null,\n data.config ?? null,\n data.created_at,\n data.updated_at ?? null,\n );\n\n return toTaskRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_tasks WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n}\n\n/**\n * Retrieve a single task by id.\n *\n * @returns the task row, or null if not found.\n */\nexport function getTask(id: string): TaskRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agent_tasks WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toTaskRow(row);\n}\n\n/**\n * List tasks with optional filters, ordered by created_at ASC.\n */\nexport function listTasks(\n options: ListTasksOptions = {},\n): TaskRow[] {\n const db = getDatabase();\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n\n if (options.source !== undefined) {\n conditions.push(`source = ?`);\n params.push(options.source);\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n\n params.push(limit);\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n ${where}\n ORDER BY created_at ASC\n LIMIT ?`,\n ).all(...params) as Record<string, unknown>[];\n\n return rows.map(toTaskRow);\n}\n\n/**\n * Get the default task for an agent.\n *\n * @returns the default task row, or null if no default exists.\n */\nexport function getDefaultTask(\n agentId: string,\n): TaskRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n WHERE agent_id = ? AND is_default = ?\n LIMIT 1`,\n ).get(agentId, IS_DEFAULT_TRUE) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toTaskRow(row);\n}\n\n/**\n * List all tasks for an agent, ordered by display_name ASC.\n *\n * Rows with a null display_name sort before named tasks.\n */\nexport function listTasksByAgent(\n agentId: string,\n): TaskRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n WHERE agent_id = ?\n ORDER BY display_name ASC`,\n ).all(agentId) as Record<string, unknown>[];\n\n return rows.map(toTaskRow);\n}\n\n/**\n * Delete a task by id.\n *\n * Built-in tasks (source = 'built-in') are protected and cannot be deleted.\n *\n * @returns true if the task was deleted, false if not found or protected.\n */\nexport function deleteTask(id: string): boolean {\n const db = getDatabase();\n const info = db.prepare(\n `DELETE FROM agent_tasks WHERE id = ? AND source != ?`,\n ).run(id, BUILT_IN_SOURCE);\n return info.changes > 0;\n}\n","/**\n * Zod schemas for agent definition and task YAML validation.\n *\n * These schemas are shared between the loader (which validates YAML files)\n * and any other code that needs to parse or validate task/agent config.\n */\n\nimport { z } from 'zod/v4';\nimport { SCHEDULABLE_POWER_STATES } from '@myco/constants.js';\n\n// ---------------------------------------------------------------------------\n// Schema version\n// ---------------------------------------------------------------------------\n\n/** Current schema version for task config structures. */\nexport const CURRENT_TASK_SCHEMA_VERSION = 1;\n\n// ---------------------------------------------------------------------------\n// Shared sub-schemas\n// ---------------------------------------------------------------------------\n\n/** Schema for API provider configuration. */\nexport const ProviderConfigSchema = z.object({\n type: z.enum(['cloud', 'ollama', 'lmstudio']),\n baseUrl: z.string().optional(),\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\n/** Schema for execution configuration overrides. */\nexport const ExecutionConfigSchema = z.object({\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n timeoutSeconds: z.number().optional(),\n provider: ProviderConfigSchema.optional(),\n});\n\n/** Schema for a single context query entry. */\nexport const ContextQuerySchema = z.object({\n tool: z.string(),\n queryTemplate: z.string(),\n limit: z.number(),\n purpose: z.string(),\n required: z.boolean(),\n});\n\n// ---------------------------------------------------------------------------\n// Agent definition schema\n// ---------------------------------------------------------------------------\n\n/** Schema for agent.yaml agent definition files. */\nexport const AgentDefinitionSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string(),\n model: z.string(),\n maxTurns: z.number(),\n timeoutSeconds: z.number(),\n systemPromptPath: z.string(),\n tools: z.array(z.string()),\n});\n\n// ---------------------------------------------------------------------------\n// Task schemas\n// ---------------------------------------------------------------------------\n\n/** Schema for orchestrator configuration on a task definition. */\nexport const OrchestratorConfigSchema = z.object({\n enabled: z.boolean(),\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n});\n\n/** Pre-condition identifiers for scheduled task auto-runs. */\nconst PreConditionSchema = z.enum([\n 'has-unprocessed-batches',\n 'has-active-skills',\n 'has-approved-candidates',\n]);\n\n/** Schedule configuration for automatic task execution via PowerManager. */\nexport const TaskScheduleSchema = z.object({\n /** Whether auto-run is enabled for this task. */\n enabled: z.boolean().default(false),\n /** Seconds between runs. */\n intervalSeconds: z.number().int().positive(),\n /** PowerManager states where this task runs. */\n runIn: z.array(z.enum([...SCHEDULABLE_POWER_STATES])).min(1),\n /** Optional pre-condition check before running. */\n preCondition: PreConditionSchema.optional(),\n});\n\n/** Schema for a single phase within a phased task pipeline. */\nexport const PhaseDefinitionSchema = z.object({\n name: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()),\n maxTurns: z.number(),\n model: z.string().optional(),\n required: z.boolean(),\n dependsOn: z.array(z.string()).optional(),\n provider: ProviderConfigSchema.optional(),\n skipPriorContext: z.boolean().optional(),\n readOnly: z.boolean().optional(),\n});\n\n/** Schema for task YAML files in tasks/. */\nexport const AgentTaskSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string(),\n agent: z.string(),\n prompt: z.string(),\n isDefault: z.boolean(),\n toolOverrides: z.array(z.string()).optional(),\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n timeoutSeconds: z.number().optional(),\n phases: z.array(PhaseDefinitionSchema).optional(),\n execution: ExecutionConfigSchema.optional(),\n contextQueries: z.record(z.string(), z.array(ContextQuerySchema)).optional(),\n schemaVersion: z.number().optional(),\n orchestrator: OrchestratorConfigSchema.optional(),\n schedule: TaskScheduleSchema.optional(),\n /** Task-specific params with defaults. */\n params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n});\n"],"mappings":"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","names":["DEFAULT_SOURCE","SELECT_COLUMNS","DEFAULT_SOURCE","SELECT_COLUMNS","SELECT_COLUMNS","parseYaml"]}