@goondocks/myco 0.18.0 → 0.19.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 (192) hide show
  1. package/README.md +17 -130
  2. package/dist/{agent-run-2NFYMQXW.js → agent-run-EADUYYAS.js} +6 -6
  3. package/dist/{agent-tasks-MEIYLXGN.js → agent-tasks-GC77JXQB.js} +6 -6
  4. package/dist/{chunk-EO2RQW4S.js → chunk-2CKDAFSX.js} +2 -2
  5. package/dist/{chunk-NZI7WBZI.js → chunk-2DF4OZ2D.js} +22 -2
  6. package/dist/chunk-2DF4OZ2D.js.map +1 -0
  7. package/dist/{chunk-OW433Q4C.js → chunk-2LN2BBKA.js} +45 -4
  8. package/dist/chunk-2LN2BBKA.js.map +1 -0
  9. package/dist/{chunk-U7GJTVSX.js → chunk-2OO3BRFK.js} +21 -7
  10. package/dist/chunk-2OO3BRFK.js.map +1 -0
  11. package/dist/{chunk-RAV5YMRU.js → chunk-3TPD6HEF.js} +4 -4
  12. package/dist/{chunk-JMOUFG6Y.js → chunk-44PZCAYS.js} +47 -5
  13. package/dist/chunk-44PZCAYS.js.map +1 -0
  14. package/dist/{chunk-D7TYRPRM.js → chunk-6LQIMRTC.js} +145 -145
  15. package/dist/chunk-6LQIMRTC.js.map +1 -0
  16. package/dist/{chunk-NI23QCHB.js → chunk-AELJ4PS5.js} +5 -5
  17. package/dist/{chunk-BUIR3JWM.js → chunk-CYBC2HZ3.js} +3 -3
  18. package/dist/chunk-EM63ZFKA.js +166 -0
  19. package/dist/chunk-EM63ZFKA.js.map +1 -0
  20. package/dist/{chunk-O3TRN3RC.js → chunk-INWD6AIQ.js} +2 -2
  21. package/dist/{chunk-CML4MCYF.js → chunk-KSXTNYXO.js} +2 -2
  22. package/dist/{chunk-KWTOCJLB.js → chunk-LLJMDXO2.js} +1176 -241
  23. package/dist/chunk-LLJMDXO2.js.map +1 -0
  24. package/dist/{chunk-2V7HR7HB.js → chunk-MDEUXYJG.js} +4 -4
  25. package/dist/{chunk-PFWIPRF6.js → chunk-MS6FDV45.js} +3 -3
  26. package/dist/{chunk-55QEICRO.js → chunk-N77K772N.js} +3 -3
  27. package/dist/{chunk-E4VLWIJC.js → chunk-ODXLRR4U.js} +1 -1
  28. package/dist/{chunk-DLFDBKEV.js → chunk-OZF5EURR.js} +19 -16
  29. package/dist/chunk-OZF5EURR.js.map +1 -0
  30. package/dist/{chunk-IB76KGBY.js → chunk-POEPHBQK.js} +1 -1
  31. package/dist/{chunk-7OYXB2NM.js → chunk-REN37KYI.js} +6 -2
  32. package/dist/chunk-REN37KYI.js.map +1 -0
  33. package/dist/{chunk-JDI4DPWD.js → chunk-RXROZBSK.js} +637 -150
  34. package/dist/chunk-RXROZBSK.js.map +1 -0
  35. package/dist/{chunk-U3J2DDSR.js → chunk-SCI55NKY.js} +2 -2
  36. package/dist/{chunk-GDY63YAW.js → chunk-U6PF3YII.js} +79 -79
  37. package/dist/chunk-U6PF3YII.js.map +1 -0
  38. package/dist/{chunk-FABWUX5G.js → chunk-UVKQ62II.js} +18 -4
  39. package/dist/chunk-UVKQ62II.js.map +1 -0
  40. package/dist/{chunk-VOCGURV7.js → chunk-UW6DGPSV.js} +3 -3
  41. package/dist/{chunk-CKJAWZQE.js → chunk-W4VHC2ES.js} +11 -3
  42. package/dist/chunk-W4VHC2ES.js.map +1 -0
  43. package/dist/{chunk-75AZFBFW.js → chunk-YPWF322W.js} +3 -3
  44. package/dist/{cli-IIMBALPV.js → cli-X7CFP4YD.js} +39 -39
  45. package/dist/{client-VZCUISHZ.js → client-YA33HUFY.js} +4 -4
  46. package/dist/{config-DA4IUVFL.js → config-RFB2DJC6.js} +6 -6
  47. package/dist/{detect-GEM3NVK6.js → detect-BEOIHGBC.js} +5 -5
  48. package/dist/{detect-providers-PSVKXTWE.js → detect-providers-2OQBU4VX.js} +4 -4
  49. package/dist/{doctor-QYD34X7Q.js → doctor-FAH7N66M.js} +11 -11
  50. package/dist/{executor-NSPRTH4M.js → executor-ICTRRUBY.js} +93 -285
  51. package/dist/executor-ICTRRUBY.js.map +1 -0
  52. package/dist/{init-WYYL44KZ.js → init-PTJEOTJV.js} +15 -15
  53. package/dist/{llm-KEDHK3TQ.js → llm-7D2OGDEK.js} +4 -4
  54. package/dist/{loader-Q3P3R4UP.js → loader-O2JFO2UC.js} +6 -6
  55. package/dist/{loader-SKKUMT5C.js → loader-VPE4RCIF.js} +6 -6
  56. package/dist/{main-6PY3ITQ5.js → main-EIKBLOUL.js} +752 -264
  57. package/dist/main-EIKBLOUL.js.map +1 -0
  58. package/dist/{open-HRFMJDQX.js → open-2JCSOLZS.js} +6 -6
  59. package/dist/{post-compact-HT24YMAN.js → post-compact-2HPPWPBI.js} +10 -10
  60. package/dist/{post-tool-use-DENRI5WB.js → post-tool-use-TWBBBABS.js} +9 -9
  61. package/dist/{post-tool-use-failure-A6SNJX42.js → post-tool-use-failure-LIJYR4KL.js} +10 -10
  62. package/dist/{pre-compact-3Q4BALCL.js → pre-compact-II2CMNTG.js} +10 -10
  63. package/dist/{provider-check-AE3L5Z6R.js → provider-check-KEQNQ6LO.js} +4 -4
  64. package/dist/{registry-O2NZLO3V.js → registry-X5FDGYXT.js} +7 -7
  65. package/dist/{remove-YB5A6HY2.js → remove-L5MVYBOY.js} +11 -11
  66. package/dist/{resolution-events-XWYLLDRK.js → resolution-events-MVIZMONR.js} +4 -4
  67. package/dist/{restart-RGDVHELZ.js → restart-VIT3JBD6.js} +7 -7
  68. package/dist/{search-WOHT3G55.js → search-O6BB5MTO.js} +7 -7
  69. package/dist/{server-6SUNYDV7.js → server-O3UPJVBR.js} +258 -173
  70. package/dist/server-O3UPJVBR.js.map +1 -0
  71. package/dist/{session-W3SKRFRV.js → session-5JV3DQIK.js} +8 -8
  72. package/dist/{session-end-OUTY7AFF.js → session-end-PZ2OXBGG.js} +9 -9
  73. package/dist/{session-start-5MB3LFOA.js → session-start-FDGM56BX.js} +22 -17
  74. package/dist/{session-start-5MB3LFOA.js.map → session-start-FDGM56BX.js.map} +1 -1
  75. package/dist/{setup-llm-ZMYGIQX5.js → setup-llm-MQK557BB.js} +10 -10
  76. package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
  77. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +10 -0
  78. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +163 -49
  79. package/dist/src/agent/definitions/tasks/skill-generate.yaml +44 -27
  80. package/dist/src/agent/definitions/tasks/skill-survey.yaml +132 -138
  81. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
  82. package/dist/src/cli.js +1 -1
  83. package/dist/src/daemon/main.js +1 -1
  84. package/dist/src/hooks/post-tool-use.js +1 -1
  85. package/dist/src/hooks/session-end.js +1 -1
  86. package/dist/src/hooks/session-start.js +1 -1
  87. package/dist/src/hooks/stop.js +1 -1
  88. package/dist/src/hooks/user-prompt-submit.js +1 -1
  89. package/dist/src/mcp/server.js +1 -1
  90. package/dist/src/symbionts/manifests/codex.yaml +45 -7
  91. package/dist/{stats-DGI6B3HX.js → stats-2STTARTC.js} +11 -11
  92. package/dist/{stop-YGHODSP7.js → stop-WNKCMCGO.js} +9 -9
  93. package/dist/{stop-failure-7IJTPJ6W.js → stop-failure-6GTOBVTN.js} +10 -10
  94. package/dist/{subagent-start-ZBQ5PJB5.js → subagent-start-VJF5YKVX.js} +10 -10
  95. package/dist/{subagent-stop-N2TDQU2D.js → subagent-stop-UW6HMICY.js} +10 -10
  96. package/dist/{task-completed-BDLMRSBB.js → task-completed-U4Q3XXLX.js} +10 -10
  97. package/dist/{team-2ZFGTSIN.js → team-N6TXS2PF.js} +148 -103
  98. package/dist/team-N6TXS2PF.js.map +1 -0
  99. package/dist/ui/assets/{index-DtT9_nlT.js → index-CHIm98OP.js} +48 -48
  100. package/dist/ui/index.html +1 -1
  101. package/dist/{update-STLAN7LR.js → update-ZYCOWKMD.js} +11 -11
  102. package/dist/{user-prompt-submit-4IBFUYQ3.js → user-prompt-submit-SOYL4OWF.js} +15 -12
  103. package/dist/user-prompt-submit-SOYL4OWF.js.map +1 -0
  104. package/dist/{verify-EJYPO7QA.js → verify-P37PQ4YM.js} +8 -8
  105. package/dist/{version-YPBIKH77.js → version-XAWC277D.js} +2 -2
  106. package/package.json +25 -8
  107. package/CONTRIBUTING.md +0 -132
  108. package/dist/chunk-7OYXB2NM.js.map +0 -1
  109. package/dist/chunk-CKJAWZQE.js.map +0 -1
  110. package/dist/chunk-D7TYRPRM.js.map +0 -1
  111. package/dist/chunk-DLFDBKEV.js.map +0 -1
  112. package/dist/chunk-FABWUX5G.js.map +0 -1
  113. package/dist/chunk-GDY63YAW.js.map +0 -1
  114. package/dist/chunk-JDI4DPWD.js.map +0 -1
  115. package/dist/chunk-JMOUFG6Y.js.map +0 -1
  116. package/dist/chunk-KWTOCJLB.js.map +0 -1
  117. package/dist/chunk-NZI7WBZI.js.map +0 -1
  118. package/dist/chunk-OW433Q4C.js.map +0 -1
  119. package/dist/chunk-RJMXDUMA.js +0 -40
  120. package/dist/chunk-RJMXDUMA.js.map +0 -1
  121. package/dist/chunk-U7GJTVSX.js.map +0 -1
  122. package/dist/executor-NSPRTH4M.js.map +0 -1
  123. package/dist/main-6PY3ITQ5.js.map +0 -1
  124. package/dist/server-6SUNYDV7.js.map +0 -1
  125. package/dist/src/worker/package-lock.json +0 -4338
  126. package/dist/src/worker/package.json +0 -22
  127. package/dist/src/worker/src/auth.ts +0 -31
  128. package/dist/src/worker/src/index.ts +0 -470
  129. package/dist/src/worker/src/mcp/auth.ts +0 -65
  130. package/dist/src/worker/src/mcp/server.ts +0 -53
  131. package/dist/src/worker/src/mcp/tools/context.ts +0 -13
  132. package/dist/src/worker/src/mcp/tools/get.ts +0 -15
  133. package/dist/src/worker/src/mcp/tools/graph.ts +0 -35
  134. package/dist/src/worker/src/mcp/tools/search.ts +0 -32
  135. package/dist/src/worker/src/mcp/tools/sessions.ts +0 -24
  136. package/dist/src/worker/src/mcp/tools/skills.ts +0 -16
  137. package/dist/src/worker/src/mcp/tools/team.ts +0 -9
  138. package/dist/src/worker/src/schema.ts +0 -324
  139. package/dist/src/worker/src/search-helpers.ts +0 -70
  140. package/dist/src/worker/tsconfig.json +0 -16
  141. package/dist/src/worker/wrangler.toml +0 -30
  142. package/dist/team-2ZFGTSIN.js.map +0 -1
  143. package/dist/user-prompt-submit-4IBFUYQ3.js.map +0 -1
  144. /package/dist/{agent-run-2NFYMQXW.js.map → agent-run-EADUYYAS.js.map} +0 -0
  145. /package/dist/{agent-tasks-MEIYLXGN.js.map → agent-tasks-GC77JXQB.js.map} +0 -0
  146. /package/dist/{chunk-EO2RQW4S.js.map → chunk-2CKDAFSX.js.map} +0 -0
  147. /package/dist/{chunk-RAV5YMRU.js.map → chunk-3TPD6HEF.js.map} +0 -0
  148. /package/dist/{chunk-NI23QCHB.js.map → chunk-AELJ4PS5.js.map} +0 -0
  149. /package/dist/{chunk-BUIR3JWM.js.map → chunk-CYBC2HZ3.js.map} +0 -0
  150. /package/dist/{chunk-O3TRN3RC.js.map → chunk-INWD6AIQ.js.map} +0 -0
  151. /package/dist/{chunk-CML4MCYF.js.map → chunk-KSXTNYXO.js.map} +0 -0
  152. /package/dist/{chunk-2V7HR7HB.js.map → chunk-MDEUXYJG.js.map} +0 -0
  153. /package/dist/{chunk-PFWIPRF6.js.map → chunk-MS6FDV45.js.map} +0 -0
  154. /package/dist/{chunk-55QEICRO.js.map → chunk-N77K772N.js.map} +0 -0
  155. /package/dist/{chunk-E4VLWIJC.js.map → chunk-ODXLRR4U.js.map} +0 -0
  156. /package/dist/{chunk-IB76KGBY.js.map → chunk-POEPHBQK.js.map} +0 -0
  157. /package/dist/{chunk-U3J2DDSR.js.map → chunk-SCI55NKY.js.map} +0 -0
  158. /package/dist/{chunk-VOCGURV7.js.map → chunk-UW6DGPSV.js.map} +0 -0
  159. /package/dist/{chunk-75AZFBFW.js.map → chunk-YPWF322W.js.map} +0 -0
  160. /package/dist/{cli-IIMBALPV.js.map → cli-X7CFP4YD.js.map} +0 -0
  161. /package/dist/{client-VZCUISHZ.js.map → client-YA33HUFY.js.map} +0 -0
  162. /package/dist/{config-DA4IUVFL.js.map → config-RFB2DJC6.js.map} +0 -0
  163. /package/dist/{detect-GEM3NVK6.js.map → detect-BEOIHGBC.js.map} +0 -0
  164. /package/dist/{detect-providers-PSVKXTWE.js.map → detect-providers-2OQBU4VX.js.map} +0 -0
  165. /package/dist/{doctor-QYD34X7Q.js.map → doctor-FAH7N66M.js.map} +0 -0
  166. /package/dist/{init-WYYL44KZ.js.map → init-PTJEOTJV.js.map} +0 -0
  167. /package/dist/{llm-KEDHK3TQ.js.map → llm-7D2OGDEK.js.map} +0 -0
  168. /package/dist/{loader-Q3P3R4UP.js.map → loader-O2JFO2UC.js.map} +0 -0
  169. /package/dist/{loader-SKKUMT5C.js.map → loader-VPE4RCIF.js.map} +0 -0
  170. /package/dist/{open-HRFMJDQX.js.map → open-2JCSOLZS.js.map} +0 -0
  171. /package/dist/{post-compact-HT24YMAN.js.map → post-compact-2HPPWPBI.js.map} +0 -0
  172. /package/dist/{post-tool-use-DENRI5WB.js.map → post-tool-use-TWBBBABS.js.map} +0 -0
  173. /package/dist/{post-tool-use-failure-A6SNJX42.js.map → post-tool-use-failure-LIJYR4KL.js.map} +0 -0
  174. /package/dist/{pre-compact-3Q4BALCL.js.map → pre-compact-II2CMNTG.js.map} +0 -0
  175. /package/dist/{provider-check-AE3L5Z6R.js.map → provider-check-KEQNQ6LO.js.map} +0 -0
  176. /package/dist/{registry-O2NZLO3V.js.map → registry-X5FDGYXT.js.map} +0 -0
  177. /package/dist/{remove-YB5A6HY2.js.map → remove-L5MVYBOY.js.map} +0 -0
  178. /package/dist/{resolution-events-XWYLLDRK.js.map → resolution-events-MVIZMONR.js.map} +0 -0
  179. /package/dist/{restart-RGDVHELZ.js.map → restart-VIT3JBD6.js.map} +0 -0
  180. /package/dist/{search-WOHT3G55.js.map → search-O6BB5MTO.js.map} +0 -0
  181. /package/dist/{session-W3SKRFRV.js.map → session-5JV3DQIK.js.map} +0 -0
  182. /package/dist/{session-end-OUTY7AFF.js.map → session-end-PZ2OXBGG.js.map} +0 -0
  183. /package/dist/{setup-llm-ZMYGIQX5.js.map → setup-llm-MQK557BB.js.map} +0 -0
  184. /package/dist/{stats-DGI6B3HX.js.map → stats-2STTARTC.js.map} +0 -0
  185. /package/dist/{stop-YGHODSP7.js.map → stop-WNKCMCGO.js.map} +0 -0
  186. /package/dist/{stop-failure-7IJTPJ6W.js.map → stop-failure-6GTOBVTN.js.map} +0 -0
  187. /package/dist/{subagent-start-ZBQ5PJB5.js.map → subagent-start-VJF5YKVX.js.map} +0 -0
  188. /package/dist/{subagent-stop-N2TDQU2D.js.map → subagent-stop-UW6HMICY.js.map} +0 -0
  189. /package/dist/{task-completed-BDLMRSBB.js.map → task-completed-U4Q3XXLX.js.map} +0 -0
  190. /package/dist/{update-STLAN7LR.js.map → update-ZYCOWKMD.js.map} +0 -0
  191. /package/dist/{verify-EJYPO7QA.js.map → verify-P37PQ4YM.js.map} +0 -0
  192. /package/dist/{version-YPBIKH77.js.map → version-XAWC277D.js.map} +0 -0
@@ -1,35 +0,0 @@
1
- import type { Env } from '../../index';
2
-
3
- export async function handleGraph(
4
- args: { node_id: string; direction?: string },
5
- env: Pick<Env, 'MYCO_TEAM_DB'>,
6
- ) {
7
- const { node_id, direction = 'both' } = args;
8
- let edgeCondition: string;
9
- const edgeBinds: string[] = [];
10
-
11
- if (direction === 'outgoing') { edgeCondition = 'source_id = ?'; edgeBinds.push(node_id); }
12
- else if (direction === 'incoming') { edgeCondition = 'target_id = ?'; edgeBinds.push(node_id); }
13
- else { edgeCondition = '(source_id = ? OR target_id = ?)'; edgeBinds.push(node_id, node_id); }
14
-
15
- const { results: edges } = await env.MYCO_TEAM_DB.prepare(
16
- `SELECT id, source_id, source_type, target_id, target_type, type, confidence, properties FROM graph_edges WHERE ${edgeCondition} LIMIT 100`,
17
- ).bind(...edgeBinds).all();
18
-
19
- const entityIds = new Set<string>();
20
- for (const edge of edges as Array<Record<string, unknown>>) {
21
- if (edge.source_type === 'entity') entityIds.add(edge.source_id as string);
22
- if (edge.target_type === 'entity') entityIds.add(edge.target_id as string);
23
- }
24
-
25
- let entities: Record<string, unknown>[] = [];
26
- if (entityIds.size > 0) {
27
- const placeholders = [...entityIds].map(() => '?').join(', ');
28
- const { results } = await env.MYCO_TEAM_DB.prepare(
29
- `SELECT id, type, name, properties, first_seen, last_seen FROM entities WHERE id IN (${placeholders})`,
30
- ).bind(...entityIds).all();
31
- entities = results as Record<string, unknown>[];
32
- }
33
-
34
- return { content: [{ type: 'text' as const, text: JSON.stringify({ node_id, edges, entities }) }] };
35
- }
@@ -1,32 +0,0 @@
1
- import type { Env } from '../../index';
2
- import { embedText, hydrateVectorMatches } from '../../search-helpers';
3
-
4
- interface SearchArgs {
5
- query: string;
6
- types?: string[];
7
- limit?: number;
8
- }
9
-
10
- export async function handleSearch(args: SearchArgs, env: Pick<Env, 'MYCO_TEAM_DB' | 'MYCO_TEAM_VECTORS' | 'AI'>) {
11
- const { query, types, limit = 10 } = args;
12
- const topK = Math.min(Math.max(limit, 1), 50);
13
-
14
- const queryVector = await embedText(env.AI, query);
15
- const matches = await env.MYCO_TEAM_VECTORS.query(queryVector, { topK, returnMetadata: 'all' });
16
-
17
- // Filter by types if specified, then cast metadata
18
- let filtered = matches.matches.filter((m) => m.metadata);
19
- if (types && types.length > 0) {
20
- const typeSet = new Set(types);
21
- filtered = filtered.filter((m) => typeSet.has((m.metadata as { table: string }).table));
22
- }
23
-
24
- const validMatches = filtered.map((m) => ({
25
- metadata: m.metadata as { table: string; id: string; machine_id: string },
26
- score: m.score,
27
- }));
28
-
29
- const results = await hydrateVectorMatches(env.MYCO_TEAM_DB, validMatches);
30
-
31
- return { content: [{ type: 'text' as const, text: JSON.stringify({ results: results.slice(0, topK) }) }] };
32
- }
@@ -1,24 +0,0 @@
1
- import type { Env } from '../../index';
2
-
3
- export async function handleSessions(
4
- args: { limit?: number; status?: string; agent?: string; branch?: string; since?: string },
5
- env: Pick<Env, 'MYCO_TEAM_DB'>,
6
- ) {
7
- const { limit = 20, status, agent, branch, since } = args;
8
- const conditions: string[] = [];
9
- const binds: unknown[] = [];
10
-
11
- if (status) { conditions.push('status = ?'); binds.push(status); }
12
- if (agent) { conditions.push('agent = ?'); binds.push(agent); }
13
- if (branch) { conditions.push('branch = ?'); binds.push(branch); }
14
- if (since) { conditions.push('started_at >= ?'); binds.push(Math.floor(new Date(since).getTime() / 1000)); }
15
-
16
- const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
17
- binds.push(Math.min(Math.max(limit, 1), 100));
18
-
19
- const { results } = await env.MYCO_TEAM_DB.prepare(
20
- `SELECT id, machine_id, agent, "user", branch, status, title, SUBSTR(summary, 1, 300) as summary, prompt_count, tool_count, started_at, ended_at FROM sessions ${where} ORDER BY started_at DESC LIMIT ?`,
21
- ).bind(...binds).all();
22
-
23
- return { content: [{ type: 'text' as const, text: JSON.stringify({ sessions: results }) }] };
24
- }
@@ -1,16 +0,0 @@
1
- import type { Env } from '../../index';
2
-
3
- export async function handleSkills(args: { status?: string; limit?: number }, env: Pick<Env, 'MYCO_TEAM_DB'>) {
4
- const { status, limit = 50 } = args;
5
- const conditions: string[] = [];
6
- const binds: unknown[] = [];
7
- if (status) { conditions.push('status = ?'); binds.push(status); }
8
- const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
9
- binds.push(Math.min(Math.max(limit, 1), 100));
10
-
11
- const { results } = await env.MYCO_TEAM_DB.prepare(
12
- `SELECT id, machine_id, name, display_name, description, status, generation, usage_count, last_used_at, created_at, updated_at FROM skill_records ${where} ORDER BY usage_count DESC, created_at DESC LIMIT ?`,
13
- ).bind(...binds).all();
14
-
15
- return { content: [{ type: 'text' as const, text: JSON.stringify({ skills: results }) }] };
16
- }
@@ -1,9 +0,0 @@
1
- import type { Env } from '../../index';
2
-
3
- export async function handleTeam(env: Pick<Env, 'MYCO_TEAM_DB'>) {
4
- const { results } = await env.MYCO_TEAM_DB.prepare(
5
- `SELECT machine_id, package_version, schema_version, sync_protocol_version, last_seen, registered_at FROM nodes ORDER BY last_seen DESC`,
6
- ).all();
7
-
8
- return { content: [{ type: 'text' as const, text: JSON.stringify({ nodes: results }) }] };
9
- }
@@ -1,324 +0,0 @@
1
- /**
2
- * D1 schema for the Myco team sync worker.
3
- *
4
- * Mirrors the synced subset of the local SQLite schema. Tables use
5
- * (id, machine_id) composite primary keys so records from multiple
6
- * machines coexist without collision.
7
- *
8
- * Fully idempotent — safe to call on every request.
9
- */
10
-
11
- // Inline constants — the worker is deployed independently and cannot
12
- // import from the main @myco package at runtime.
13
- const CANDIDATE_STATUS = { APPROVED: 'approved', GENERATED: 'generated' } as const;
14
-
15
- const SESSIONS_TABLE = `
16
- CREATE TABLE IF NOT EXISTS sessions (
17
- id TEXT NOT NULL,
18
- machine_id TEXT NOT NULL,
19
- agent TEXT NOT NULL,
20
- "user" TEXT,
21
- project_root TEXT,
22
- branch TEXT,
23
- started_at INTEGER NOT NULL,
24
- ended_at INTEGER,
25
- status TEXT DEFAULT 'active',
26
- prompt_count INTEGER DEFAULT 0,
27
- tool_count INTEGER DEFAULT 0,
28
- title TEXT,
29
- summary TEXT,
30
- transcript_path TEXT,
31
- parent_session_id TEXT,
32
- parent_session_reason TEXT,
33
- processed INTEGER DEFAULT 0,
34
- content_hash TEXT,
35
- created_at INTEGER NOT NULL,
36
- synced_at INTEGER,
37
- PRIMARY KEY (id, machine_id)
38
- )`;
39
-
40
- const PROMPT_BATCHES_TABLE = `
41
- CREATE TABLE IF NOT EXISTS prompt_batches (
42
- id INTEGER NOT NULL,
43
- machine_id TEXT NOT NULL,
44
- session_id TEXT NOT NULL,
45
- prompt_number INTEGER,
46
- user_prompt TEXT,
47
- response_summary TEXT,
48
- classification TEXT,
49
- started_at INTEGER,
50
- ended_at INTEGER,
51
- status TEXT DEFAULT 'active',
52
- activity_count INTEGER DEFAULT 0,
53
- processed INTEGER DEFAULT 0,
54
- content_hash TEXT,
55
- created_at INTEGER NOT NULL,
56
- synced_at INTEGER,
57
- PRIMARY KEY (id, machine_id)
58
- )`;
59
-
60
- const SPORES_TABLE = `
61
- CREATE TABLE IF NOT EXISTS spores (
62
- id TEXT NOT NULL,
63
- machine_id TEXT NOT NULL,
64
- agent_id TEXT NOT NULL,
65
- session_id TEXT,
66
- prompt_batch_id INTEGER,
67
- observation_type TEXT NOT NULL,
68
- status TEXT DEFAULT 'active',
69
- content TEXT NOT NULL,
70
- context TEXT,
71
- importance INTEGER DEFAULT 5,
72
- file_path TEXT,
73
- tags TEXT,
74
- content_hash TEXT,
75
- properties TEXT,
76
- created_at INTEGER NOT NULL,
77
- updated_at INTEGER,
78
- synced_at INTEGER,
79
- PRIMARY KEY (id, machine_id)
80
- )`;
81
-
82
- const ENTITIES_TABLE = `
83
- CREATE TABLE IF NOT EXISTS entities (
84
- id TEXT NOT NULL,
85
- machine_id TEXT NOT NULL,
86
- agent_id TEXT NOT NULL,
87
- type TEXT NOT NULL,
88
- name TEXT NOT NULL,
89
- properties TEXT,
90
- first_seen INTEGER NOT NULL,
91
- last_seen INTEGER NOT NULL,
92
- status TEXT DEFAULT 'active',
93
- synced_at INTEGER,
94
- PRIMARY KEY (id, machine_id)
95
- )`;
96
-
97
- const GRAPH_EDGES_TABLE = `
98
- CREATE TABLE IF NOT EXISTS graph_edges (
99
- id TEXT NOT NULL,
100
- machine_id TEXT NOT NULL,
101
- agent_id TEXT NOT NULL,
102
- source_id TEXT NOT NULL,
103
- source_type TEXT NOT NULL,
104
- target_id TEXT NOT NULL,
105
- target_type TEXT NOT NULL,
106
- type TEXT NOT NULL,
107
- session_id TEXT,
108
- confidence REAL DEFAULT 1.0,
109
- properties TEXT,
110
- created_at INTEGER NOT NULL,
111
- synced_at INTEGER,
112
- PRIMARY KEY (id, machine_id)
113
- )`;
114
-
115
- const PLANS_TABLE = `
116
- CREATE TABLE IF NOT EXISTS plans (
117
- id TEXT NOT NULL,
118
- machine_id TEXT NOT NULL,
119
- status TEXT DEFAULT 'active',
120
- author TEXT,
121
- title TEXT,
122
- content TEXT,
123
- source_path TEXT,
124
- tags TEXT,
125
- session_id TEXT,
126
- prompt_batch_id INTEGER,
127
- content_hash TEXT,
128
- processed INTEGER DEFAULT 0,
129
- created_at INTEGER NOT NULL,
130
- updated_at INTEGER,
131
- synced_at INTEGER,
132
- PRIMARY KEY (id, machine_id)
133
- )`;
134
-
135
- const ARTIFACTS_TABLE = `
136
- CREATE TABLE IF NOT EXISTS artifacts (
137
- id TEXT NOT NULL,
138
- machine_id TEXT NOT NULL,
139
- artifact_type TEXT,
140
- source_path TEXT NOT NULL,
141
- title TEXT NOT NULL,
142
- content TEXT,
143
- last_captured_by TEXT,
144
- tags TEXT,
145
- created_at INTEGER NOT NULL,
146
- updated_at INTEGER,
147
- synced_at INTEGER,
148
- PRIMARY KEY (id, machine_id)
149
- )`;
150
-
151
- const ENTITY_MENTIONS_TABLE = `
152
- CREATE TABLE IF NOT EXISTS entity_mentions (
153
- entity_id TEXT NOT NULL,
154
- note_id TEXT NOT NULL,
155
- note_type TEXT NOT NULL,
156
- agent_id TEXT NOT NULL,
157
- machine_id TEXT NOT NULL,
158
- synced_at INTEGER,
159
- UNIQUE (entity_id, note_id, note_type, agent_id)
160
- )`;
161
-
162
- const RESOLUTION_EVENTS_TABLE = `
163
- CREATE TABLE IF NOT EXISTS resolution_events (
164
- id TEXT NOT NULL,
165
- machine_id TEXT NOT NULL,
166
- agent_id TEXT NOT NULL,
167
- spore_id TEXT NOT NULL,
168
- action TEXT NOT NULL,
169
- new_spore_id TEXT,
170
- reason TEXT,
171
- session_id TEXT,
172
- created_at INTEGER NOT NULL,
173
- synced_at INTEGER,
174
- PRIMARY KEY (id, machine_id)
175
- )`;
176
-
177
- const DIGEST_EXTRACTS_TABLE = `
178
- CREATE TABLE IF NOT EXISTS digest_extracts (
179
- id INTEGER NOT NULL,
180
- machine_id TEXT NOT NULL,
181
- agent_id TEXT NOT NULL,
182
- tier INTEGER NOT NULL,
183
- content TEXT NOT NULL,
184
- substrate_hash TEXT,
185
- generated_at INTEGER NOT NULL,
186
- synced_at INTEGER,
187
- PRIMARY KEY (id, machine_id)
188
- )`;
189
-
190
- const SKILL_CANDIDATES_TABLE = `
191
- CREATE TABLE IF NOT EXISTS skill_candidates (
192
- id TEXT NOT NULL,
193
- machine_id TEXT NOT NULL,
194
- agent_id TEXT NOT NULL,
195
- topic TEXT NOT NULL,
196
- rationale TEXT NOT NULL,
197
- confidence REAL NOT NULL DEFAULT 0.0,
198
- status TEXT NOT NULL DEFAULT 'identified',
199
- source_ids TEXT NOT NULL DEFAULT '[]',
200
- skill_id TEXT,
201
- approved_at INTEGER,
202
- created_at INTEGER NOT NULL,
203
- updated_at INTEGER NOT NULL,
204
- synced_at INTEGER,
205
- PRIMARY KEY (id, machine_id)
206
- )`;
207
-
208
- const SKILL_RECORDS_TABLE = `
209
- CREATE TABLE IF NOT EXISTS skill_records (
210
- id TEXT NOT NULL,
211
- machine_id TEXT NOT NULL,
212
- agent_id TEXT NOT NULL,
213
- name TEXT NOT NULL,
214
- display_name TEXT NOT NULL,
215
- description TEXT NOT NULL,
216
- status TEXT NOT NULL DEFAULT 'active',
217
- generation INTEGER NOT NULL DEFAULT 1,
218
- candidate_id TEXT,
219
- source_ids TEXT NOT NULL DEFAULT '[]',
220
- path TEXT NOT NULL,
221
- usage_count INTEGER NOT NULL DEFAULT 0,
222
- last_used_at INTEGER,
223
- created_at INTEGER NOT NULL,
224
- updated_at INTEGER NOT NULL,
225
- properties TEXT NOT NULL DEFAULT '{}',
226
- synced_at INTEGER,
227
- PRIMARY KEY (id, machine_id)
228
- )`;
229
-
230
- const SKILL_USAGE_TABLE = `
231
- CREATE TABLE IF NOT EXISTS skill_usage (
232
- id TEXT NOT NULL,
233
- machine_id TEXT NOT NULL,
234
- skill_id TEXT NOT NULL,
235
- session_id TEXT NOT NULL,
236
- detected_at INTEGER NOT NULL,
237
- synced_at INTEGER,
238
- PRIMARY KEY (id, machine_id)
239
- )`;
240
-
241
- const NODES_TABLE = `
242
- CREATE TABLE IF NOT EXISTS nodes (
243
- machine_id TEXT PRIMARY KEY,
244
- package_version TEXT,
245
- schema_version INTEGER,
246
- sync_protocol_version INTEGER,
247
- last_seen INTEGER NOT NULL,
248
- registered_at INTEGER NOT NULL
249
- )`;
250
-
251
- const TEAM_CONFIG_TABLE = `
252
- CREATE TABLE IF NOT EXISTS team_config (
253
- key TEXT PRIMARY KEY,
254
- value TEXT NOT NULL
255
- )`;
256
-
257
- const SECONDARY_INDEXES = [
258
- 'CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions (status)',
259
- 'CREATE INDEX IF NOT EXISTS idx_sessions_content_hash ON sessions (content_hash)',
260
- 'CREATE INDEX IF NOT EXISTS idx_spores_status ON spores (status)',
261
- 'CREATE INDEX IF NOT EXISTS idx_spores_content_hash ON spores (content_hash)',
262
- 'CREATE INDEX IF NOT EXISTS idx_spores_observation_type ON spores (observation_type)',
263
- 'CREATE INDEX IF NOT EXISTS idx_plans_content_hash ON plans (content_hash)',
264
- 'CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id, source_type)',
265
- 'CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id, target_type)',
266
- 'CREATE INDEX IF NOT EXISTS idx_entities_type ON entities (type)',
267
- 'CREATE INDEX IF NOT EXISTS idx_skill_candidates_status ON skill_candidates (status)',
268
- 'CREATE INDEX IF NOT EXISTS idx_skill_records_status ON skill_records (status)',
269
- 'CREATE INDEX IF NOT EXISTS idx_skill_records_name ON skill_records (name, machine_id)',
270
- 'CREATE INDEX IF NOT EXISTS idx_skill_usage_skill_id ON skill_usage (skill_id)',
271
- ];
272
-
273
- const ALL_DDLS = [
274
- SESSIONS_TABLE,
275
- PROMPT_BATCHES_TABLE,
276
- SPORES_TABLE,
277
- ENTITIES_TABLE,
278
- GRAPH_EDGES_TABLE,
279
- ENTITY_MENTIONS_TABLE,
280
- RESOLUTION_EVENTS_TABLE,
281
- PLANS_TABLE,
282
- ARTIFACTS_TABLE,
283
- DIGEST_EXTRACTS_TABLE,
284
- SKILL_CANDIDATES_TABLE,
285
- SKILL_RECORDS_TABLE,
286
- SKILL_USAGE_TABLE,
287
- NODES_TABLE,
288
- TEAM_CONFIG_TABLE,
289
- ];
290
-
291
- /**
292
- * Create all D1 tables and indexes. Fully idempotent via IF NOT EXISTS.
293
- * Includes ALTER TABLE migrations for columns added after initial deployment.
294
- */
295
- export async function initD1Schema(db: D1Database): Promise<void> {
296
- const statements = [...ALL_DDLS, ...SECONDARY_INDEXES];
297
- const batch = statements.map((sql) => db.prepare(sql));
298
- await db.batch(batch);
299
-
300
- // Migrations for existing tables (safe to re-run — silently ignored if column exists)
301
- const migrations = [
302
- 'ALTER TABLE skill_usage ADD COLUMN synced_at INTEGER',
303
- 'ALTER TABLE skill_candidates ADD COLUMN approved_at INTEGER',
304
- ];
305
- for (const sql of migrations) {
306
- try {
307
- await db.prepare(sql).run();
308
- } catch {
309
- // Column already exists — expected after first run
310
- }
311
- }
312
-
313
- // Backfill approved_at for already-synced historical rows so remote D1
314
- // mirrors the local SQLite v10 migration semantics. Idempotent via the
315
- // approved_at IS NULL guard.
316
- await db.prepare(
317
- `UPDATE skill_candidates
318
- SET approved_at = strftime('%s', 'now')
319
- WHERE approved_at IS NULL
320
- AND status IN (?, ?)`,
321
- )
322
- .bind(CANDIDATE_STATUS.APPROVED, CANDIDATE_STATUS.GENERATED)
323
- .run();
324
- }
@@ -1,70 +0,0 @@
1
- /**
2
- * Shared search helpers used by both the REST /search endpoint and MCP myco_search tool.
3
- */
4
-
5
- /**
6
- * Embed text via Workers AI (bge-m3) and return the vector.
7
- */
8
- export async function embedText(ai: Ai, text: string): Promise<number[]> {
9
- const result = await ai.run('@cf/baai/bge-m3', { text: [text] }) as { data: number[][] };
10
- return result.data[0];
11
- }
12
-
13
- export interface HydratedResult {
14
- id: string;
15
- machine_id: string;
16
- type: string;
17
- score: number;
18
- data: Record<string, unknown>;
19
- }
20
-
21
- interface VectorMatch {
22
- metadata: { table: string; id: string; machine_id: string };
23
- score: number;
24
- }
25
-
26
- /**
27
- * Group Vectorize matches by table and batch-hydrate each group from D1.
28
- * Queries run in parallel across tables.
29
- */
30
- export async function hydrateVectorMatches(
31
- db: D1Database,
32
- matches: VectorMatch[],
33
- ): Promise<HydratedResult[]> {
34
- // Group by table
35
- const groups = new Map<string, Array<{ id: string; machine_id: string; score: number }>>();
36
- for (const match of matches) {
37
- const { table, id, machine_id } = match.metadata;
38
- const group = groups.get(table) ?? [];
39
- group.push({ id, machine_id, score: match.score });
40
- groups.set(table, group);
41
- }
42
-
43
- // Hydrate all tables in parallel
44
- const hydrationPromises = [...groups.entries()].map(async ([table, items]) => {
45
- const placeholders = items.map(() => '(?, ?)').join(', ');
46
- const binds = items.flatMap((item) => [item.id, item.machine_id]);
47
- const { results: rows } = await db.prepare(
48
- `SELECT * FROM ${table} WHERE (id, machine_id) IN (VALUES ${placeholders})`,
49
- ).bind(...binds).all();
50
-
51
- const rowMap = new Map<string, Record<string, unknown>>();
52
- for (const row of rows as Record<string, unknown>[]) {
53
- rowMap.set(`${row.id}:${row.machine_id}`, row);
54
- }
55
-
56
- const results: HydratedResult[] = [];
57
- for (const item of items) {
58
- const row = rowMap.get(`${item.id}:${item.machine_id}`);
59
- if (row) {
60
- results.push({ id: item.id, machine_id: item.machine_id, type: table, score: item.score, data: row });
61
- }
62
- }
63
- return results;
64
- });
65
-
66
- const resultArrays = await Promise.all(hydrationPromises);
67
- const results = resultArrays.flat();
68
- results.sort((a, b) => b.score - a.score);
69
- return results;
70
- }
@@ -1,16 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ES2022",
5
- "moduleResolution": "bundler",
6
- "lib": ["ES2022"],
7
- "types": ["@cloudflare/workers-types"],
8
- "strict": true,
9
- "skipLibCheck": true,
10
- "noEmit": true,
11
- "isolatedModules": true,
12
- "resolveJsonModule": true,
13
- "esModuleInterop": true
14
- },
15
- "include": ["src/**/*.ts"]
16
- }
@@ -1,30 +0,0 @@
1
- name = "myco-team-sync"
2
- main = "src/index.ts"
3
- compatibility_date = "2025-03-27"
4
- # nodejs_compat is required by the agents SDK and @modelcontextprotocol/sdk,
5
- # which depend on packages that import Node.js built-ins (node:async_hooks,
6
- # node:diagnostics_channel, node:os, etc.).
7
- compatibility_flags = [ "nodejs_compat" ]
8
-
9
- [vars]
10
- SYNC_PROTOCOL_VERSION = "1"
11
-
12
- # D1 database — fill database_id after `wrangler d1 create myco-team`
13
- [[d1_databases]]
14
- binding = "MYCO_TEAM_DB"
15
- database_name = "myco-team"
16
- database_id = "<YOUR_D1_DATABASE_ID>"
17
-
18
- # Vectorize index — fill index_name after `wrangler vectorize create myco-team-vectors`
19
- [[vectorize]]
20
- binding = "MYCO_TEAM_VECTORS"
21
- index_name = "myco-team-vectors"
22
-
23
- # KV namespace for runtime secrets (MCP tokens, etc.)
24
- [[kv_namespaces]]
25
- binding = "MYCO_SECRETS"
26
- id = "<YOUR_KV_NAMESPACE_ID>"
27
-
28
- # Workers AI binding
29
- [ai]
30
- binding = "AI"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/team.ts"],"sourcesContent":["/**\n * CLI team commands — provision and manage Cloudflare team sync infrastructure.\n *\n * `myco team init` — Provision D1 database, Vectorize index, deploy worker.\n * `myco team upgrade` — Redeploy worker with updated source.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { loadConfig, updateTeamConfig } from '../config/loader.js';\nimport { writeSecret, readSecrets } from '../config/secrets.js';\nimport { resolvePackageRoot } from '../symbionts/detect.js';\nimport { getPluginVersion } from '../version.js';\nimport { WRANGLER_COMMAND_TIMEOUT_MS, TEAM_API_KEY_SECRET } from '../constants.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Number of random bytes for API key generation. */\nconst API_KEY_BYTES = 32;\n\n/** Vectorize index dimensions (must match the embedding model). */\nconst VECTORIZE_DIMENSIONS = '1024';\n\n/** Vectorize distance metric. */\nconst VECTORIZE_METRIC = 'cosine';\n\n/** Prefix for team resource names. */\nconst TEAM_RESOURCE_PREFIX = 'myco-team';\n\n/** Length of the project hash suffix for unique resource naming. */\nconst PROJECT_HASH_LENGTH = 8;\n\n\n/** Source directory for worker files (relative to package root). */\nconst WORKER_SOURCE_DIR = 'src/worker';\n\n/** Deployment directory name within the vault. */\nconst TEAM_WORKER_DIR = '.team-worker';\n\n/** Regex to extract D1 database ID from wrangler d1 create output (JSON format). */\nconst D1_ID_JSON_REGEX = /\"database_id\"\\s*:\\s*\"([0-9a-f-]{36})\"/i;\n\n/** Regex to extract D1 database ID from wrangler d1 create output (text format). */\nconst D1_ID_TEXT_REGEX = /id:\\s*([0-9a-f-]{36})/i;\n\n/** Regex to extract worker URL from wrangler deploy output. */\nconst WORKER_URL_REGEX = /(https:\\/\\/[^\\s]+\\.workers\\.dev)/;\n\n/** Regex to match wrangler.toml name field. */\nconst TOML_NAME_REGEX = /^name\\s*=\\s*\"[^\"]*\"/m;\n\n/** Regex to match wrangler.toml D1 placeholder. */\nconst TOML_D1_PLACEHOLDER_REGEX = /<YOUR_D1_DATABASE_ID>/g;\n\n/** Regex to match wrangler.toml database_name field. */\nconst TOML_DB_NAME_REGEX = /database_name\\s*=\\s*\"[^\"]*\"/g;\n\n/** Regex to match wrangler.toml index_name field. */\nconst TOML_INDEX_NAME_REGEX = /index_name\\s*=\\s*\"[^\"]*\"/g;\n\n/** Regex to match database_id in existing wrangler.toml. */\nconst TOML_DB_ID_REGEX = /database_id\\s*=\\s*\"([^\"]+)\"/;\n\n/** Regex to match wrangler.toml KV namespace placeholder. */\nconst TOML_KV_PLACEHOLDER_REGEX = /<YOUR_KV_NAMESPACE_ID>/g;\n\n/** Regex to extract the KV namespace ID from an existing wrangler.toml. */\nconst TOML_KV_ID_REGEX = /\\[\\[kv_namespaces\\]\\][\\s\\S]*?id\\s*=\\s*\"([0-9a-f]+)\"/;\n\n/**\n * Regex to extract the KV namespace ID from `wrangler kv namespace create` output.\n * Wrangler prints a JSON configuration snippet like:\n * { \"kv_namespaces\": [ { \"binding\": \"...\", \"id\": \"7cc069cb32b4438b29079cca4714056\" } ] }\n * Note: Cloudflare KV IDs are hex strings of variable length (observed 31-32 chars).\n */\nconst KV_ID_REGEX = /\"id\":\\s*\"([0-9a-f]+)\"/i;\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Generate a project hash from vault dir for unique resource naming. */\nfunction projectHash(vaultDir: string): string {\n const hash = crypto.createHash('sha256').update(vaultDir).digest('hex');\n return hash.slice(0, PROJECT_HASH_LENGTH);\n}\n\n/** Build the unique resource name for this project's team infrastructure. */\nfunction resourceName(vaultDir: string): string {\n return `${TEAM_RESOURCE_PREFIX}-${projectHash(vaultDir)}`;\n}\n\n/** Run a wrangler command and return stdout. Throws on failure, surfacing stderr. */\nfunction wrangler(args: string[], options?: { cwd?: string }): string {\n try {\n return execFileSync('wrangler', args, {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS,\n stdio: ['pipe', 'pipe', 'pipe'],\n ...options,\n });\n } catch (err) {\n // execFileSync loses stderr in err.message — reconstruct it here so\n // callers see the actual wrangler failure instead of just \"Command failed\".\n const execErr = err as Error & { stderr?: Buffer | string; stdout?: Buffer | string };\n const stderr = execErr.stderr?.toString() ?? '';\n const stdout = execErr.stdout?.toString() ?? '';\n const detail = [stderr, stdout].filter(Boolean).join('\\n').trim();\n throw new Error(detail || execErr.message);\n }\n}\n\n/** Find the worker source directory. Checks dist layout first (installed), then source layout (dev). */\nfunction locateWorkerSource(): string {\n const root = resolvePackageRoot();\n const distPath = path.join(root, 'dist', WORKER_SOURCE_DIR);\n if (fs.existsSync(distPath)) return distPath;\n const srcPath = path.join(root, WORKER_SOURCE_DIR);\n if (fs.existsSync(srcPath)) return srcPath;\n throw new Error(`Cannot find ${WORKER_SOURCE_DIR} — are you running from the myco package?`);\n}\n\n/**\n * Copy worker source to the vault deployment directory and patch wrangler.toml\n * with actual D1 database ID and resource names.\n */\nfunction prepareDeployDir(vaultDir: string, d1Id: string, kvId: string): string {\n const srcDir = locateWorkerSource();\n const deployDir = path.join(vaultDir, TEAM_WORKER_DIR);\n\n // Copy all worker source files\n fs.cpSync(srcDir, deployDir, { recursive: true });\n\n // Patch wrangler.toml with actual IDs\n const tomlPath = path.join(deployDir, 'wrangler.toml');\n let toml = fs.readFileSync(tomlPath, 'utf-8');\n const name = resourceName(vaultDir);\n toml = toml.replace(TOML_NAME_REGEX, `name = \"${name}\"`);\n toml = toml.replace(TOML_D1_PLACEHOLDER_REGEX, d1Id);\n toml = toml.replace(TOML_DB_NAME_REGEX, `database_name = \"${name}\"`);\n toml = toml.replace(TOML_INDEX_NAME_REGEX, `index_name = \"${name}-vectors\"`);\n toml = toml.replace(TOML_KV_PLACEHOLDER_REGEX, kvId);\n fs.writeFileSync(tomlPath, toml, 'utf-8');\n\n // Install runtime dependencies before deploy (required for bundled imports)\n installDeploymentDeps(deployDir);\n\n return deployDir;\n}\n\n/** Extract a JSON array from wrangler output that may be prefixed with banner text. */\nfunction extractJsonArray(output: string): unknown[] {\n const start = output.indexOf('[');\n const end = output.lastIndexOf(']');\n if (start === -1 || end === -1 || end < start) {\n throw new Error(`No JSON array found in output:\\n${output}`);\n }\n return JSON.parse(output.slice(start, end + 1));\n}\n\n/** Ensure a KV namespace exists for this project. Returns the namespace ID. */\nfunction ensureKvNamespace(name: string): string {\n const kvName = `${name}-secrets`;\n const lookupExisting = (): string => {\n const listOutput = wrangler(['kv', 'namespace', 'list']);\n const namespaces = extractJsonArray(listOutput) as Array<{ id: string; title: string }>;\n // Wrangler sometimes rewrites hyphens to underscores in titles\n const normalize = (s: string) => s.replace(/[-_]/g, '');\n const target = normalize(kvName);\n const existing = namespaces.find((ns) => normalize(ns.title) === target || normalize(ns.title).endsWith(target));\n if (!existing) throw new Error(`KV namespace \"${kvName}\" not found in list of ${namespaces.length} namespaces`);\n return existing.id;\n };\n\n try {\n const output = wrangler(['kv', 'namespace', 'create', kvName]);\n const match = output.match(KV_ID_REGEX);\n if (match) return match[1];\n // Created successfully but we couldn't parse — fall back to list lookup\n return lookupExisting();\n } catch (err) {\n const errMsg = (err as Error).message;\n if (errMsg.includes('already exists') || errMsg.includes('duplicate') || errMsg.includes('same title')) {\n return lookupExisting();\n }\n throw err;\n }\n}\n\n/** Install npm dependencies in the deploy directory. Required for runtime imports. */\nfunction installDeploymentDeps(deployDir: string): void {\n const packageJsonPath = path.join(deployDir, 'package.json');\n if (!fs.existsSync(packageJsonPath)) return;\n execFileSync('npm', ['install', '--silent', '--no-audit', '--no-fund'], {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS * 3,\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: deployDir,\n });\n}\n\n/** Extract D1 database ID from wrangler d1 create output (handles both JSON and text formats). */\nfunction parseD1Id(output: string): string {\n const jsonMatch = output.match(D1_ID_JSON_REGEX);\n if (jsonMatch) return jsonMatch[1];\n const textMatch = output.match(D1_ID_TEXT_REGEX);\n if (textMatch) return textMatch[1];\n throw new Error(`Could not parse D1 database ID from wrangler output:\\n${output}`);\n}\n\n/** Extract worker URL from wrangler deploy output. */\nfunction parseWorkerUrl(output: string): string {\n // Output typically contains: \"https://<name>.<subdomain>.workers.dev\"\n const match = output.match(WORKER_URL_REGEX);\n if (!match) throw new Error(`Could not parse worker URL from deploy output:\\n${output}`);\n return match[1];\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nexport async function teamInit(vaultDir: string): Promise<void> {\n console.log('Provisioning team sync infrastructure...\\n');\n\n // 1. Check for wrangler\n try {\n const version = wrangler(['--version']).trim();\n console.log(`wrangler: ${version}`);\n } catch {\n console.error('Error: wrangler CLI not found. Install it with: npm install -g wrangler');\n process.exit(1);\n }\n\n // 2. Check auth\n try {\n wrangler(['whoami']);\n console.log('Cloudflare auth: OK\\n');\n } catch {\n console.error('Error: Not authenticated with Cloudflare. Run: wrangler login');\n process.exit(1);\n }\n\n const name = resourceName(vaultDir);\n console.log(`Resource name: ${name}\\n`);\n\n // 3. Create D1 database (or reuse existing)\n console.log('Creating D1 database...');\n let d1Id: string;\n try {\n const d1Output = wrangler(['d1', 'create', name]);\n d1Id = parseD1Id(d1Output);\n console.log(`D1 database created: ${d1Id}\\n`);\n } catch (err) {\n const errMsg = (err as Error).message;\n if (errMsg.includes('already exists')) {\n console.log('D1 database already exists, looking up ID...');\n const listOutput = wrangler(['d1', 'list', '--json']);\n const databases = JSON.parse(listOutput) as Array<{ name: string; uuid: string }>;\n const existing = databases.find((db) => db.name === name);\n if (!existing) {\n console.error(`D1 database \"${name}\" reported as existing but not found in list`);\n process.exit(1);\n }\n d1Id = existing.uuid;\n console.log(`Reusing D1 database: ${d1Id}\\n`);\n } else {\n console.error(`Failed to create D1 database: ${errMsg}`);\n process.exit(1);\n }\n }\n\n // 4. Create Vectorize index (or reuse existing)\n console.log('Creating Vectorize index...');\n try {\n wrangler(['vectorize', 'create', `${name}-vectors`, '--dimensions', VECTORIZE_DIMENSIONS, '--metric', VECTORIZE_METRIC]);\n console.log('Vectorize index created\\n');\n } catch (err) {\n const errMsg = (err as Error).message;\n if (errMsg.includes('already exists') || errMsg.includes('duplicate_name')) {\n console.log('Vectorize index already exists, reusing\\n');\n } else {\n console.error(`Failed to create Vectorize index: ${errMsg}`);\n process.exit(1);\n }\n }\n\n // 5. Create KV namespace for runtime secrets (MCP tokens)\n console.log('Creating KV namespace for secrets...');\n let kvId: string;\n try {\n kvId = ensureKvNamespace(name);\n console.log(`KV namespace ready: ${kvId}\\n`);\n } catch (err) {\n console.error(`Failed to create KV namespace: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // 6. Generate API key\n const apiKey = crypto.randomBytes(API_KEY_BYTES).toString('hex');\n\n // 7. Prepare deployment directory\n console.log('Preparing worker deployment...');\n const deployDir = prepareDeployDir(vaultDir, d1Id, kvId);\n\n // 7. Set API key secret via wrangler\n console.log('Setting API key secret...');\n try {\n execFileSync('wrangler', ['secret', 'put', TEAM_API_KEY_SECRET, '--name', name], {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS,\n input: apiKey,\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: deployDir,\n });\n console.log('Secret set\\n');\n } catch (err) {\n console.error(`Failed to set API key secret: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // 8. Deploy worker\n console.log('Deploying worker...');\n let workerUrl: string;\n try {\n const deployOutput = wrangler(['deploy'], { cwd: deployDir });\n workerUrl = parseWorkerUrl(deployOutput);\n console.log(`Worker deployed: ${workerUrl}\\n`);\n } catch (err) {\n console.error(`Failed to deploy worker: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // 9. Seed team config in the Worker\n console.log('Setting team configuration...');\n try {\n const { getMachineId } = await import('../daemon/machine-id.js');\n const creatorMachineId = await getMachineId(vaultDir);\n await fetch(`${workerUrl}/config`, {\n method: 'PUT',\n headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n team_name: name,\n embedding_model: '@cf/baai/bge-m3',\n embedding_dimensions: '1024',\n created_at: String(Math.floor(Date.now() / 1000)),\n created_by: creatorMachineId,\n }),\n });\n console.log('Team config saved\\n');\n } catch {\n console.log('Warning: could not seed team config (non-fatal)\\n');\n }\n\n // 10. Save config and API key locally\n updateTeamConfig(vaultDir, {\n enabled: true,\n worker_url: workerUrl,\n deployed_worker_version: getPluginVersion(),\n });\n writeSecret(vaultDir, TEAM_API_KEY_SECRET, apiKey);\n\n console.log('Team sync configured!\\n');\n console.log(` URL: ${workerUrl}`);\n console.log(` API Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`);\n console.log('\\nShare the URL and API key with teammates so they can connect.');\n}\n\n// ---------------------------------------------------------------------------\n// Shared upgrade logic (used by CLI and daemon API)\n// ---------------------------------------------------------------------------\n\nexport interface UpgradeResult {\n success: boolean;\n worker_url?: string;\n version?: string;\n error?: string;\n}\n\n/**\n * Upgrade the team sync worker: re-copy source, patch config, redeploy.\n * Returns a result instead of calling process.exit — safe for both CLI and daemon.\n */\nexport function upgradeWorker(vaultDir: string): UpgradeResult {\n const config = loadConfig(vaultDir);\n if (!config.team.worker_url) {\n return { success: false, error: 'No team sync configured. Run: myco team init' };\n }\n\n const deployDir = path.join(vaultDir, TEAM_WORKER_DIR);\n const tomlPath = path.join(deployDir, 'wrangler.toml');\n\n if (!fs.existsSync(tomlPath)) {\n return { success: false, error: 'No deployment directory found. Run: myco team init' };\n }\n\n // Read ALL existing resource identifiers from current wrangler.toml.\n const existingToml = fs.readFileSync(tomlPath, 'utf-8');\n const d1Match = existingToml.match(TOML_DB_ID_REGEX);\n if (!d1Match || d1Match[1] === '<YOUR_D1_DATABASE_ID>') {\n return { success: false, error: 'Cannot determine D1 database ID from existing deployment. Run: myco team init' };\n }\n const d1Id = d1Match[1];\n\n const nameMatch = existingToml.match(/^name\\s*=\\s*\"([^\"]*)\"/m);\n const dbNameMatch = existingToml.match(/database_name\\s*=\\s*\"([^\"]*)\"/);\n const indexNameMatch = existingToml.match(/index_name\\s*=\\s*\"([^\"]*)\"/);\n const workerName = nameMatch?.[1] ?? resourceName(vaultDir);\n\n // KV namespace may not exist on older deployments — create or reuse.\n const kvMatch = existingToml.match(TOML_KV_ID_REGEX);\n let kvId: string;\n if (kvMatch) {\n kvId = kvMatch[1];\n } else {\n try {\n kvId = ensureKvNamespace(workerName);\n } catch (err) {\n return { success: false, error: `Failed to provision KV namespace: ${(err as Error).message}` };\n }\n }\n\n // Re-copy worker source from package (updated code)\n const srcDir = locateWorkerSource();\n fs.cpSync(srcDir, deployDir, { recursive: true });\n\n // Patch wrangler.toml preserving existing resource names\n let toml = fs.readFileSync(path.join(deployDir, 'wrangler.toml'), 'utf-8');\n toml = toml.replace(TOML_NAME_REGEX, `name = \"${workerName}\"`);\n toml = toml.replace(TOML_D1_PLACEHOLDER_REGEX, d1Id);\n toml = toml.replace(TOML_DB_NAME_REGEX, `database_name = \"${dbNameMatch?.[1] ?? workerName}\"`);\n toml = toml.replace(TOML_INDEX_NAME_REGEX, `index_name = \"${indexNameMatch?.[1] ?? `${workerName}-vectors`}\"`);\n toml = toml.replace(TOML_KV_PLACEHOLDER_REGEX, kvId);\n fs.writeFileSync(path.join(deployDir, 'wrangler.toml'), toml, 'utf-8');\n\n // Install runtime dependencies before deploy (required for bundled imports)\n try {\n installDeploymentDeps(deployDir);\n } catch (err) {\n return { success: false, error: `Failed to install worker dependencies: ${(err as Error).message}` };\n }\n\n // Re-set API key secret before deploy (deploy can wipe secrets)\n const secrets = readSecrets(vaultDir);\n const apiKey = secrets[TEAM_API_KEY_SECRET];\n if (apiKey) {\n try {\n execFileSync('wrangler', ['secret', 'put', TEAM_API_KEY_SECRET, '--name', workerName], {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS,\n input: apiKey,\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: deployDir,\n });\n } catch {\n // Non-fatal — secret may already be set\n }\n }\n\n // Redeploy\n try {\n const deployOutput = wrangler(['deploy'], { cwd: deployDir });\n const workerUrl = parseWorkerUrl(deployOutput);\n const version = getPluginVersion();\n\n updateTeamConfig(vaultDir, {\n worker_url: workerUrl,\n deployed_worker_version: version,\n });\n\n return { success: true, worker_url: workerUrl, version };\n } catch (err) {\n return { success: false, error: `Failed to deploy worker: ${(err as Error).message}` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI wrapper\n// ---------------------------------------------------------------------------\n\nexport async function teamUpgrade(vaultDir: string): Promise<void> {\n console.log('Upgrading team sync worker...\\n');\n const result = upgradeWorker(vaultDir);\n if (!result.success) {\n console.error(result.error);\n process.exit(1);\n }\n console.log(`Worker deployed: ${result.worker_url}`);\n console.log(`Version: ${result.version}`);\n console.log('\\nUpgrade complete.');\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/user-prompt-submit.ts"],"sourcesContent":["import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput } from './normalize.js';\nimport { evaluateUserPromptRules } from './capture-rules.js';\nimport { loadManifests } from '../symbionts/detect.js';\nimport { EventBuffer } from '../capture/buffer.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const rawInput = JSON.parse(await readStdin());\n const input = normalizeHookInput(rawInput);\n const rawPrompt = input.prompt ?? '';\n const sessionId = input.sessionId;\n\n // Apply generic capture rules owned by each symbiont's manifest.\n // The hook stays symbiont-agnostic — per-agent behavior lives in YAML.\n // Pass structural context so rules can key on things like\n // `transcript_path_missing` without doing their own text mining.\n const decision = evaluateUserPromptRules(loadManifests(), input.agent, {\n prompt: rawPrompt,\n transcriptPath: input.transcriptPath,\n });\n\n const client = new DaemonClient(VAULT_DIR);\n // Spawn daemon if needed but don't block on full health check backoff.\n // The event POST will fail fast if daemon isn't ready — buffer absorbs it.\n if (!(await client.isHealthy())) {\n client.spawnDaemon();\n }\n\n if (decision.action === 'drop') {\n // A rule classified this prompt as a phantom sub-invocation (e.g., an\n // agent's internal title-generation call). SessionStart already\n // registered the session row; delete it so it doesn't linger as a\n // zero-prompt ghost in the UI. Silently tolerate failures — the\n // session-maintenance sweep will clean up stragglers within the\n // stale threshold as a safety net.\n process.stderr.write(`[myco] user-prompt-submit: dropped (${decision.reason ?? 'rule'})\\n`);\n await client.delete(`/api/sessions/${sessionId}`);\n return;\n }\n\n const prompt = decision.action === 'rewrite' ? decision.prompt : rawPrompt;\n if (decision.action === 'rewrite') {\n process.stderr.write(`[myco] user-prompt-submit: rewritten (${decision.reason ?? 'rule'})\\n`);\n }\n\n // Forward prompt as event for capture\n const eventResult = await client.post('/events', {\n type: 'user_prompt', prompt, session_id: sessionId, agent: input.agent,\n });\n\n if (!eventResult.ok) {\n // Daemon still unreachable — write directly to buffer for later processing\n const buffer = new EventBuffer(path.join(VAULT_DIR, 'buffer'), sessionId);\n buffer.append({ type: 'user_prompt', prompt });\n }\n\n // Search for relevant spores to inject as context for this prompt.\n // The daemon does a vector search against the prompt text and returns\n // any high-relevance spores. This is fast (~20ms) — no LLM call.\n const contextResult = await client.post('/context/prompt', {\n prompt,\n session_id: sessionId,\n });\n\n // Always include the session ID so the agent can pass it to myco_remember.\n // Uses Session:: format consistent with daemon context injection (Branch::, Session::).\n const sessionLine = `Session:: \\`${sessionId}\\``;\n const contextText = contextResult.ok && contextResult.data?.text\n ? `${contextResult.data.text}\\n${sessionLine}`\n : sessionLine;\n\n process.stdout.write(contextText);\n } catch (error) {\n process.stderr.write(`[myco] user-prompt-submit error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,OAAO;AAC3B,QAAM,YAAY,gBAAgB;AAClC,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,WAAW,WAAW,CAAC,EAAG;AAEvD,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,MAAM,UAAU,CAAC;AAC7C,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,YAAY,MAAM;AAMxB,UAAM,WAAW,wBAAwB,cAAc,GAAG,MAAM,OAAO;AAAA,MACrE,QAAQ;AAAA,MACR,gBAAgB,MAAM;AAAA,IACxB,CAAC;AAED,UAAM,SAAS,IAAI,aAAa,SAAS;AAGzC,QAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,aAAO,YAAY;AAAA,IACrB;AAEA,QAAI,SAAS,WAAW,QAAQ;AAO9B,cAAQ,OAAO,MAAM,uCAAuC,SAAS,UAAU,MAAM;AAAA,CAAK;AAC1F,YAAM,OAAO,OAAO,iBAAiB,SAAS,EAAE;AAChD;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,WAAW,YAAY,SAAS,SAAS;AACjE,QAAI,SAAS,WAAW,WAAW;AACjC,cAAQ,OAAO,MAAM,yCAAyC,SAAS,UAAU,MAAM;AAAA,CAAK;AAAA,IAC9F;AAGA,UAAM,cAAc,MAAM,OAAO,KAAK,WAAW;AAAA,MAC/C,MAAM;AAAA,MAAe;AAAA,MAAQ,YAAY;AAAA,MAAW,OAAO,MAAM;AAAA,IACnE,CAAC;AAED,QAAI,CAAC,YAAY,IAAI;AAEnB,YAAM,SAAS,IAAI,YAAY,KAAK,KAAK,WAAW,QAAQ,GAAG,SAAS;AACxE,aAAO,OAAO,EAAE,MAAM,eAAe,OAAO,CAAC;AAAA,IAC/C;AAKA,UAAM,gBAAgB,MAAM,OAAO,KAAK,mBAAmB;AAAA,MACzD;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAID,UAAM,cAAc,eAAe,SAAS;AAC5C,UAAM,cAAc,cAAc,MAAM,cAAc,MAAM,OACxD,GAAG,cAAc,KAAK,IAAI;AAAA,EAAK,WAAW,KAC1C;AAEJ,YAAQ,OAAO,MAAM,WAAW;AAAA,EAClC,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,oCAAqC,MAAgB,OAAO;AAAA,CAAI;AAAA,EACvF;AACF;","names":[]}