@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.
- package/dist/{agent-run-GZ5UVLDV.js → agent-run-DUOJ3KDI.js} +6 -6
- package/dist/{agent-tasks-KKQ2GBBB.js → agent-tasks-LUWBY5JD.js} +6 -6
- package/dist/{chunk-X34OFKYU.js → chunk-23FJUKCN.js} +2 -2
- package/dist/{chunk-KNTJOMWY.js → chunk-3MEOYXOW.js} +2 -2
- package/dist/{chunk-PSYLKCWQ.js → chunk-4BQ5QE76.js} +24 -5
- package/dist/chunk-4BQ5QE76.js.map +1 -0
- package/dist/{chunk-JTYZRPX5.js → chunk-5ZT2Q6P5.js} +1 -1
- package/dist/{chunk-JJXVDCEX.js → chunk-75J2BR4P.js} +486 -488
- package/dist/chunk-75J2BR4P.js.map +1 -0
- package/dist/{chunk-GMTWRMLP.js → chunk-B3SF2CCW.js} +3 -3
- package/dist/{chunk-S6I62FAH.js → chunk-CUADDHHU.js} +4 -2
- package/dist/{chunk-S6I62FAH.js.map → chunk-CUADDHHU.js.map} +1 -1
- package/dist/{chunk-4VF6KQ2Z.js → chunk-DJQOYEK3.js} +87 -84
- package/dist/chunk-DJQOYEK3.js.map +1 -0
- package/dist/{chunk-LD6U3L6O.js → chunk-DK5VEBB5.js} +5 -5
- package/dist/{chunk-STBNNKL5.js → chunk-DKGUCEWU.js} +6 -6
- package/dist/{chunk-OQVKLTQY.js → chunk-EYMKBNRP.js} +2 -2
- package/dist/{chunk-KH64DHOY.js → chunk-GDY63YAW.js} +279 -277
- package/dist/chunk-GDY63YAW.js.map +1 -0
- package/dist/{chunk-ZESTWGJT.js → chunk-GYIA6XLB.js} +2 -2
- package/dist/{chunk-BCKYVLUZ.js → chunk-GZ7MXWYX.js} +3 -3
- package/dist/{chunk-S66YG6QK.js → chunk-LF5Z62X6.js} +46 -7
- package/dist/chunk-LF5Z62X6.js.map +1 -0
- package/dist/{chunk-TFBAV3PV.js → chunk-OMZCVRX6.js} +2 -2
- package/dist/{chunk-UZ5Y6XMP.js → chunk-R3YW7XVF.js} +2 -2
- package/dist/{chunk-PX5KIOKY.js → chunk-SPJGJEFV.js} +10 -2
- package/dist/{chunk-PX5KIOKY.js.map → chunk-SPJGJEFV.js.map} +1 -1
- package/dist/{chunk-QFMBZ72S.js → chunk-SV6UCB2Z.js} +2 -2
- package/dist/{chunk-NVCGF2DS.js → chunk-X4XFJG6I.js} +10 -6
- package/dist/chunk-X4XFJG6I.js.map +1 -0
- package/dist/{chunk-TNCBMGWB.js → chunk-X5IXK5KO.js} +262 -226
- package/dist/chunk-X5IXK5KO.js.map +1 -0
- package/dist/{chunk-TVV6PZOC.js → chunk-Z7TZJ2SP.js} +2 -2
- package/dist/{cli-JLDCZ77U.js → cli-YBD2GPK4.js} +45 -44
- package/dist/cli-YBD2GPK4.js.map +1 -0
- package/dist/{client-LRQMMKLP.js → client-CJ3X252K.js} +4 -4
- package/dist/{config-H657SF6B.js → config-MOWCOJJ4.js} +4 -4
- package/dist/{detect-27DN6UTL.js → detect-GFYKKHLJ.js} +3 -3
- package/dist/{detect-providers-PAVE2X6O.js → detect-providers-EU35RUL3.js} +2 -2
- package/dist/{doctor-IG3CXMI7.js → doctor-JR7NEL7K.js} +38 -19
- package/dist/doctor-JR7NEL7K.js.map +1 -0
- package/dist/{executor-HKNINUWO.js → executor-7XOKS6HS.js} +439 -248
- package/dist/executor-7XOKS6HS.js.map +1 -0
- package/dist/{init-RHQUINC2.js → init-PDLKYWQ4.js} +41 -23
- package/dist/init-PDLKYWQ4.js.map +1 -0
- package/dist/{init-wizard-ZB3JRDLE.js → init-wizard-WH3SXNMB.js} +7 -7
- package/dist/{installer-25TSX4SR.js → installer-BTUNKWOU.js} +2 -2
- package/dist/{llm-T3QVHC3Y.js → llm-DK44LYO6.js} +4 -4
- package/dist/{loader-WQKVWL5D.js → loader-WC4U5NM5.js} +4 -4
- package/dist/{loader-JQLO6K44.js → loader-WGDVRGLM.js} +6 -4
- package/dist/{logs-LXHPDKUA.js → logs-WFBX2I7C.js} +3 -3
- package/dist/{main-MVXPBP5Z.js → main-JB3R3DQE.js} +2346 -1912
- package/dist/main-JB3R3DQE.js.map +1 -0
- package/dist/{open-CVEMRH3Z.js → open-AADZPSLW.js} +6 -6
- package/dist/{openai-embeddings-5T5ZP7LO.js → openai-embeddings-SEIV7AM3.js} +2 -2
- package/dist/{openrouter-RD2COFC7.js → openrouter-ELODIZRP.js} +2 -2
- package/dist/{post-compact-ALQ2UGZ7.js → post-compact-KNQ4DYLM.js} +9 -9
- package/dist/{post-tool-use-SPL7HIYU.js → post-tool-use-OMWHFQLM.js} +10 -10
- package/dist/{post-tool-use-failure-B3CUYBTR.js → post-tool-use-failure-KFP6MB7Z.js} +9 -9
- package/dist/{pre-compact-KPWC4V64.js → pre-compact-2ZYE2HRB.js} +9 -9
- package/dist/{provider-check-QN7OGXZA.js → provider-check-B66E5PWS.js} +2 -2
- package/dist/{registry-2XQMCPA6.js → registry-DHWVHXWY.js} +5 -5
- package/dist/{remove-O2WCN6RC.js → remove-QT7634L5.js} +52 -20
- package/dist/remove-QT7634L5.js.map +1 -0
- package/dist/{resolution-events-5EVUEWHS.js → resolution-events-DBCRVZGU.js} +4 -4
- package/dist/{restart-S52VV3SP.js → restart-YQNQEHOU.js} +7 -7
- package/dist/{search-IOJ5O37S.js → search-C6JTQDWY.js} +6 -6
- package/dist/{server-T4VPK6FU.js → server-QJ3RWZZZ.js} +8 -8
- package/dist/{session-ID6BX72K.js → session-JLVL5TYX.js} +8 -8
- package/dist/{session-end-I7ZABXRI.js → session-end-XFZRRP5H.js} +10 -10
- package/dist/{session-start-VPOUY42U.js → session-start-XGINISXO.js} +15 -15
- package/dist/{setup-llm-G5UG5N3T.js → setup-llm-X2OCM6R7.js} +8 -8
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +8 -7
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +71 -144
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +10 -62
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +87 -53
- package/dist/src/agent/prompts/agent.md +1 -0
- package/dist/src/cli.js +1 -1
- package/dist/src/daemon/main.js +1 -1
- package/dist/src/hooks/post-tool-use.js +1 -1
- package/dist/src/hooks/session-end.js +1 -1
- package/dist/src/hooks/session-start.js +1 -1
- package/dist/src/hooks/stop.js +1 -1
- package/dist/src/hooks/user-prompt-submit.js +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/src/worker/src/schema.ts +14 -0
- package/dist/{stats-GRI4MTS2.js → stats-2EAETG2T.js} +9 -9
- package/dist/{stop-UTZ2CXI2.js → stop-WOBDYTSA.js} +10 -10
- package/dist/{stop-failure-CECM5NB7.js → stop-failure-QEC7ZGBQ.js} +9 -9
- package/dist/{subagent-start-SYZGJYUN.js → subagent-start-H6DVRVOE.js} +9 -9
- package/dist/{subagent-stop-7WWW7TGQ.js → subagent-stop-LKENKJ65.js} +9 -9
- package/dist/{task-completed-N7SIY6T6.js → task-completed-ZZ47PRPD.js} +9 -9
- package/dist/{team-SJPDXELY.js → team-J62N7VMG.js} +34 -26
- package/dist/team-J62N7VMG.js.map +1 -0
- package/dist/ui/assets/index-Bx9l8uxa.js +837 -0
- package/dist/ui/assets/{index-BmsHIwjl.css → index-DlEQ8A8Y.css} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/{update-DZZYQ4NJ.js → update-LX3CJ4TJ.js} +30 -14
- package/dist/update-LX3CJ4TJ.js.map +1 -0
- package/dist/{user-prompt-submit-UUNRRS5P.js → user-prompt-submit-NNMLY3EW.js} +10 -10
- package/dist/{verify-JHIMXTY5.js → verify-AMRQXQ3K.js} +6 -6
- package/dist/{version-VKNCAPZW.js → version-6OJH5HLZ.js} +2 -2
- package/package.json +2 -2
- package/dist/chunk-4VF6KQ2Z.js.map +0 -1
- package/dist/chunk-JJXVDCEX.js.map +0 -1
- package/dist/chunk-KH64DHOY.js.map +0 -1
- package/dist/chunk-NVCGF2DS.js.map +0 -1
- package/dist/chunk-PSYLKCWQ.js.map +0 -1
- package/dist/chunk-S66YG6QK.js.map +0 -1
- package/dist/chunk-TNCBMGWB.js.map +0 -1
- package/dist/cli-JLDCZ77U.js.map +0 -1
- package/dist/doctor-IG3CXMI7.js.map +0 -1
- package/dist/executor-HKNINUWO.js.map +0 -1
- package/dist/init-RHQUINC2.js.map +0 -1
- package/dist/main-MVXPBP5Z.js.map +0 -1
- package/dist/remove-O2WCN6RC.js.map +0 -1
- package/dist/resolve-3FEUV462.js +0 -9
- package/dist/team-SJPDXELY.js.map +0 -1
- package/dist/ui/assets/index-Cn6cQwJy.js +0 -842
- package/dist/update-DZZYQ4NJ.js.map +0 -1
- package/dist/version-VKNCAPZW.js.map +0 -1
- /package/dist/{agent-run-GZ5UVLDV.js.map → agent-run-DUOJ3KDI.js.map} +0 -0
- /package/dist/{agent-tasks-KKQ2GBBB.js.map → agent-tasks-LUWBY5JD.js.map} +0 -0
- /package/dist/{chunk-X34OFKYU.js.map → chunk-23FJUKCN.js.map} +0 -0
- /package/dist/{chunk-KNTJOMWY.js.map → chunk-3MEOYXOW.js.map} +0 -0
- /package/dist/{chunk-JTYZRPX5.js.map → chunk-5ZT2Q6P5.js.map} +0 -0
- /package/dist/{chunk-GMTWRMLP.js.map → chunk-B3SF2CCW.js.map} +0 -0
- /package/dist/{chunk-LD6U3L6O.js.map → chunk-DK5VEBB5.js.map} +0 -0
- /package/dist/{chunk-STBNNKL5.js.map → chunk-DKGUCEWU.js.map} +0 -0
- /package/dist/{chunk-OQVKLTQY.js.map → chunk-EYMKBNRP.js.map} +0 -0
- /package/dist/{chunk-ZESTWGJT.js.map → chunk-GYIA6XLB.js.map} +0 -0
- /package/dist/{chunk-BCKYVLUZ.js.map → chunk-GZ7MXWYX.js.map} +0 -0
- /package/dist/{chunk-TFBAV3PV.js.map → chunk-OMZCVRX6.js.map} +0 -0
- /package/dist/{chunk-UZ5Y6XMP.js.map → chunk-R3YW7XVF.js.map} +0 -0
- /package/dist/{chunk-QFMBZ72S.js.map → chunk-SV6UCB2Z.js.map} +0 -0
- /package/dist/{chunk-TVV6PZOC.js.map → chunk-Z7TZJ2SP.js.map} +0 -0
- /package/dist/{client-LRQMMKLP.js.map → client-CJ3X252K.js.map} +0 -0
- /package/dist/{config-H657SF6B.js.map → config-MOWCOJJ4.js.map} +0 -0
- /package/dist/{detect-27DN6UTL.js.map → detect-GFYKKHLJ.js.map} +0 -0
- /package/dist/{detect-providers-PAVE2X6O.js.map → detect-providers-EU35RUL3.js.map} +0 -0
- /package/dist/{init-wizard-ZB3JRDLE.js.map → init-wizard-WH3SXNMB.js.map} +0 -0
- /package/dist/{installer-25TSX4SR.js.map → installer-BTUNKWOU.js.map} +0 -0
- /package/dist/{llm-T3QVHC3Y.js.map → llm-DK44LYO6.js.map} +0 -0
- /package/dist/{loader-JQLO6K44.js.map → loader-WC4U5NM5.js.map} +0 -0
- /package/dist/{loader-WQKVWL5D.js.map → loader-WGDVRGLM.js.map} +0 -0
- /package/dist/{logs-LXHPDKUA.js.map → logs-WFBX2I7C.js.map} +0 -0
- /package/dist/{open-CVEMRH3Z.js.map → open-AADZPSLW.js.map} +0 -0
- /package/dist/{openai-embeddings-5T5ZP7LO.js.map → openai-embeddings-SEIV7AM3.js.map} +0 -0
- /package/dist/{openrouter-RD2COFC7.js.map → openrouter-ELODIZRP.js.map} +0 -0
- /package/dist/{post-compact-ALQ2UGZ7.js.map → post-compact-KNQ4DYLM.js.map} +0 -0
- /package/dist/{post-tool-use-SPL7HIYU.js.map → post-tool-use-OMWHFQLM.js.map} +0 -0
- /package/dist/{post-tool-use-failure-B3CUYBTR.js.map → post-tool-use-failure-KFP6MB7Z.js.map} +0 -0
- /package/dist/{pre-compact-KPWC4V64.js.map → pre-compact-2ZYE2HRB.js.map} +0 -0
- /package/dist/{provider-check-QN7OGXZA.js.map → provider-check-B66E5PWS.js.map} +0 -0
- /package/dist/{registry-2XQMCPA6.js.map → registry-DHWVHXWY.js.map} +0 -0
- /package/dist/{resolution-events-5EVUEWHS.js.map → resolution-events-DBCRVZGU.js.map} +0 -0
- /package/dist/{restart-S52VV3SP.js.map → restart-YQNQEHOU.js.map} +0 -0
- /package/dist/{search-IOJ5O37S.js.map → search-C6JTQDWY.js.map} +0 -0
- /package/dist/{server-T4VPK6FU.js.map → server-QJ3RWZZZ.js.map} +0 -0
- /package/dist/{session-ID6BX72K.js.map → session-JLVL5TYX.js.map} +0 -0
- /package/dist/{session-end-I7ZABXRI.js.map → session-end-XFZRRP5H.js.map} +0 -0
- /package/dist/{session-start-VPOUY42U.js.map → session-start-XGINISXO.js.map} +0 -0
- /package/dist/{setup-llm-G5UG5N3T.js.map → setup-llm-X2OCM6R7.js.map} +0 -0
- /package/dist/{stats-GRI4MTS2.js.map → stats-2EAETG2T.js.map} +0 -0
- /package/dist/{stop-UTZ2CXI2.js.map → stop-WOBDYTSA.js.map} +0 -0
- /package/dist/{stop-failure-CECM5NB7.js.map → stop-failure-QEC7ZGBQ.js.map} +0 -0
- /package/dist/{subagent-start-SYZGJYUN.js.map → subagent-start-H6DVRVOE.js.map} +0 -0
- /package/dist/{subagent-stop-7WWW7TGQ.js.map → subagent-stop-LKENKJ65.js.map} +0 -0
- /package/dist/{task-completed-N7SIY6T6.js.map → task-completed-ZZ47PRPD.js.map} +0 -0
- /package/dist/{user-prompt-submit-UUNRRS5P.js.map → user-prompt-submit-NNMLY3EW.js.map} +0 -0
- /package/dist/{verify-JHIMXTY5.js.map → verify-AMRQXQ3K.js.map} +0 -0
- /package/dist/{resolve-3FEUV462.js.map → version-6OJH5HLZ.js.map} +0 -0
|
@@ -6,19 +6,22 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
loadConfig,
|
|
8
8
|
updateTeamConfig
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-4BQ5QE76.js";
|
|
10
|
+
import {
|
|
11
|
+
getPluginVersion
|
|
12
|
+
} from "./chunk-OMZCVRX6.js";
|
|
10
13
|
import {
|
|
11
14
|
resolvePackageRoot
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-SV6UCB2Z.js";
|
|
13
16
|
import "./chunk-LPUQPDC2.js";
|
|
14
17
|
import {
|
|
15
18
|
TEAM_API_KEY_SECRET,
|
|
16
19
|
WRANGLER_COMMAND_TIMEOUT_MS
|
|
17
20
|
} from "./chunk-TRA3R4EC.js";
|
|
18
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-CUADDHHU.js";
|
|
19
22
|
import "./chunk-D7TYRPRM.js";
|
|
20
23
|
import "./chunk-E4VLWIJC.js";
|
|
21
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-GDY63YAW.js";
|
|
22
25
|
import "./chunk-PZUWP5VK.js";
|
|
23
26
|
|
|
24
27
|
// src/cli/team.ts
|
|
@@ -199,7 +202,8 @@ async function teamInit(vaultDir) {
|
|
|
199
202
|
}
|
|
200
203
|
updateTeamConfig(vaultDir, {
|
|
201
204
|
enabled: true,
|
|
202
|
-
worker_url: workerUrl
|
|
205
|
+
worker_url: workerUrl,
|
|
206
|
+
deployed_worker_version: getPluginVersion()
|
|
203
207
|
});
|
|
204
208
|
writeSecret(vaultDir, TEAM_API_KEY_SECRET, apiKey);
|
|
205
209
|
console.log("Team sync configured!\n");
|
|
@@ -207,30 +211,25 @@ async function teamInit(vaultDir) {
|
|
|
207
211
|
console.log(` API Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`);
|
|
208
212
|
console.log("\nShare the URL and API key with teammates so they can connect.");
|
|
209
213
|
}
|
|
210
|
-
|
|
211
|
-
console.log("Upgrading team sync worker...\n");
|
|
214
|
+
function upgradeWorker(vaultDir) {
|
|
212
215
|
const config = loadConfig(vaultDir);
|
|
213
216
|
if (!config.team.worker_url) {
|
|
214
|
-
|
|
215
|
-
process.exit(1);
|
|
217
|
+
return { success: false, error: "No team sync configured. Run: myco team init" };
|
|
216
218
|
}
|
|
217
219
|
const deployDir = path.join(vaultDir, TEAM_WORKER_DIR);
|
|
218
220
|
const tomlPath = path.join(deployDir, "wrangler.toml");
|
|
219
221
|
if (!fs.existsSync(tomlPath)) {
|
|
220
|
-
|
|
221
|
-
process.exit(1);
|
|
222
|
+
return { success: false, error: "No deployment directory found. Run: myco team init" };
|
|
222
223
|
}
|
|
223
224
|
const existingToml = fs.readFileSync(tomlPath, "utf-8");
|
|
224
225
|
const d1Match = existingToml.match(TOML_DB_ID_REGEX);
|
|
225
226
|
if (!d1Match || d1Match[1] === "<YOUR_D1_DATABASE_ID>") {
|
|
226
|
-
|
|
227
|
-
process.exit(1);
|
|
227
|
+
return { success: false, error: "Cannot determine D1 database ID from existing deployment. Run: myco team init" };
|
|
228
228
|
}
|
|
229
229
|
const d1Id = d1Match[1];
|
|
230
230
|
const nameMatch = existingToml.match(/^name\s*=\s*"([^"]*)"/m);
|
|
231
231
|
const dbNameMatch = existingToml.match(/database_name\s*=\s*"([^"]*)"/);
|
|
232
232
|
const indexNameMatch = existingToml.match(/index_name\s*=\s*"([^"]*)"/);
|
|
233
|
-
console.log("Updating worker source...");
|
|
234
233
|
const srcDir = locateWorkerSource();
|
|
235
234
|
fs.cpSync(srcDir, deployDir, { recursive: true });
|
|
236
235
|
let toml = fs.readFileSync(path.join(deployDir, "wrangler.toml"), "utf-8");
|
|
@@ -240,7 +239,6 @@ async function teamUpgrade(vaultDir) {
|
|
|
240
239
|
toml = toml.replace(TOML_DB_NAME_REGEX, `database_name = "${dbNameMatch?.[1] ?? workerName}"`);
|
|
241
240
|
toml = toml.replace(TOML_INDEX_NAME_REGEX, `index_name = "${indexNameMatch?.[1] ?? `${workerName}-vectors`}"`);
|
|
242
241
|
fs.writeFileSync(path.join(deployDir, "wrangler.toml"), toml, "utf-8");
|
|
243
|
-
console.log("Setting API key secret...");
|
|
244
242
|
const secrets = readSecrets(vaultDir);
|
|
245
243
|
const apiKey = secrets[TEAM_API_KEY_SECRET];
|
|
246
244
|
if (apiKey) {
|
|
@@ -252,26 +250,36 @@ async function teamUpgrade(vaultDir) {
|
|
|
252
250
|
stdio: ["pipe", "pipe", "pipe"],
|
|
253
251
|
cwd: deployDir
|
|
254
252
|
});
|
|
255
|
-
|
|
256
|
-
} catch (err) {
|
|
257
|
-
console.warn(`Warning: could not set API key secret: ${err.message}`);
|
|
253
|
+
} catch {
|
|
258
254
|
}
|
|
259
255
|
}
|
|
260
|
-
console.log("Deploying...");
|
|
261
256
|
try {
|
|
262
257
|
const deployOutput = wrangler(["deploy"], { cwd: deployDir });
|
|
263
258
|
const workerUrl = parseWorkerUrl(deployOutput);
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
259
|
+
const version = getPluginVersion();
|
|
260
|
+
updateTeamConfig(vaultDir, {
|
|
261
|
+
worker_url: workerUrl,
|
|
262
|
+
deployed_worker_version: version
|
|
263
|
+
});
|
|
264
|
+
return { success: true, worker_url: workerUrl, version };
|
|
267
265
|
} catch (err) {
|
|
268
|
-
|
|
266
|
+
return { success: false, error: `Failed to deploy worker: ${err.message}` };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function teamUpgrade(vaultDir) {
|
|
270
|
+
console.log("Upgrading team sync worker...\n");
|
|
271
|
+
const result = upgradeWorker(vaultDir);
|
|
272
|
+
if (!result.success) {
|
|
273
|
+
console.error(result.error);
|
|
269
274
|
process.exit(1);
|
|
270
275
|
}
|
|
271
|
-
console.log(
|
|
276
|
+
console.log(`Worker deployed: ${result.worker_url}`);
|
|
277
|
+
console.log(`Version: ${result.version}`);
|
|
278
|
+
console.log("\nUpgrade complete.");
|
|
272
279
|
}
|
|
273
280
|
export {
|
|
274
281
|
teamInit,
|
|
275
|
-
teamUpgrade
|
|
282
|
+
teamUpgrade,
|
|
283
|
+
upgradeWorker
|
|
276
284
|
};
|
|
277
|
-
//# sourceMappingURL=team-
|
|
285
|
+
//# sourceMappingURL=team-J62N7VMG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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\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. */\nfunction wrangler(args: string[], options?: { cwd?: string }): string {\n return execFileSync('wrangler', args, {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS,\n stdio: ['pipe', 'pipe', 'pipe'],\n ...options,\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): 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 fs.writeFileSync(tomlPath, toml, 'utf-8');\n\n return deployDir;\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. Generate API key\n const apiKey = crypto.randomBytes(API_KEY_BYTES).toString('hex');\n\n // 6. Prepare deployment directory\n console.log('Preparing worker deployment...');\n const deployDir = prepareDeployDir(vaultDir, d1Id);\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\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 const workerName = nameMatch?.[1] ?? resourceName(vaultDir);\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 fs.writeFileSync(path.join(deployDir, 'wrangler.toml'), toml, 'utf-8');\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":[]}
|