@goondocks/myco 0.18.1 → 0.19.1
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/README.md +17 -130
- package/dist/{agent-run-I4O2K2CK.js → agent-run-BV3ATBWB.js} +6 -6
- package/dist/{agent-tasks-UOW5BQIB.js → agent-tasks-I5SMLWVL.js} +6 -6
- package/dist/{chunk-TCSVDQF5.js → chunk-3J6TUJSV.js} +58 -58
- package/dist/chunk-3J6TUJSV.js.map +1 -0
- package/dist/{chunk-W7WENJ6F.js → chunk-46AQ7D23.js} +2 -2
- package/dist/{chunk-2V7HR7HB.js → chunk-4NIMDUYW.js} +5 -7
- package/dist/{chunk-2V7HR7HB.js.map → chunk-4NIMDUYW.js.map} +1 -1
- package/dist/{chunk-CURS2TNP.js → chunk-6DDRJQ4X.js} +2 -2
- package/dist/{chunk-D7TYRPRM.js → chunk-6LQIMRTC.js} +145 -145
- package/dist/chunk-6LQIMRTC.js.map +1 -0
- package/dist/{chunk-75AZFBFW.js → chunk-6ZDJXSEO.js} +3 -3
- package/dist/{chunk-TLK46KKD.js → chunk-AOCBCPAP.js} +5 -5
- package/dist/chunk-AOCBCPAP.js.map +1 -0
- package/dist/{chunk-O3TRN3RC.js → chunk-AULBWINA.js} +2 -2
- package/dist/chunk-CDM6ZLMZ.js +598 -0
- package/dist/chunk-CDM6ZLMZ.js.map +1 -0
- package/dist/{chunk-TOER6RNC.js → chunk-GVBVHYOT.js} +2 -2
- package/dist/{chunk-RIDSOQDR.js → chunk-HQLPB346.js} +2 -2
- package/dist/{chunk-CKJAWZQE.js → chunk-I54KLC6H.js} +13 -3
- package/dist/chunk-I54KLC6H.js.map +1 -0
- package/dist/{chunk-XWOQL4XN.js → chunk-NU74DHV3.js} +3 -3
- package/dist/{chunk-E4VLWIJC.js → chunk-ODXLRR4U.js} +1 -1
- package/dist/{chunk-RAV5YMRU.js → chunk-OR4XUYBJ.js} +4 -4
- package/dist/{chunk-CML4MCYF.js → chunk-PMT2LSTQ.js} +2 -2
- package/dist/{chunk-IB76KGBY.js → chunk-POEPHBQK.js} +1 -1
- package/dist/{chunk-TZAXQKO6.js → chunk-PZEAO35P.js} +2 -2
- package/dist/{chunk-GDY63YAW.js → chunk-U6PF3YII.js} +79 -79
- package/dist/chunk-U6PF3YII.js.map +1 -0
- package/dist/{chunk-C3EGL5JX.js → chunk-ULH667GT.js} +8 -8
- package/dist/{chunk-DPSLJ242.js → chunk-UVKQ62II.js} +3 -3
- package/dist/{chunk-N75GMQGA.js → chunk-VNL7KN4V.js} +3 -3
- package/dist/{chunk-U3J2DDSR.js → chunk-VQF5E4ZX.js} +2 -2
- package/dist/{chunk-LSP5HYOO.js → chunk-WGIQOJKJ.js} +4 -4
- package/dist/{chunk-YZPI2Y3E.js → chunk-WKNAKQKA.js} +3 -3
- package/dist/{chunk-NI23QCHB.js → chunk-YDU3AHSW.js} +5 -5
- package/dist/{cli-D3TJYJ2U.js → cli-2BW2PZMP.js} +39 -39
- package/dist/{client-4LLEXLVK.js → client-HMGTCKRW.js} +4 -4
- package/dist/{config-DA4IUVFL.js → config-LVXDVUYY.js} +6 -6
- package/dist/{detect-SZ2KDUF4.js → detect-BEOIHGBC.js} +5 -5
- package/dist/{detect-providers-PSVKXTWE.js → detect-providers-CDG6BKHU.js} +4 -4
- package/dist/{doctor-KCTXPX5D.js → doctor-AK3W5FMN.js} +11 -11
- package/dist/{executor-UYIZC3L5.js → executor-YLC7DHBY.js} +17 -17
- package/dist/{init-QFNBKKDC.js → init-4FV7ODOK.js} +15 -15
- package/dist/{llm-SMA5ZEAW.js → llm-INLSGEXY.js} +4 -4
- package/dist/{loader-Q3P3R4UP.js → loader-2ULW2FZS.js} +6 -6
- package/dist/{loader-SKKUMT5C.js → loader-HEGKUTGI.js} +6 -6
- package/dist/{main-5THODR77.js → main-IV64U72E.js} +348 -86
- package/dist/main-IV64U72E.js.map +1 -0
- package/dist/{open-7737CSPN.js → open-YSB36HP7.js} +6 -6
- package/dist/{post-compact-2TJ5FPZH.js → post-compact-5OB4LRLA.js} +10 -10
- package/dist/{post-tool-use-FRTSICC3.js → post-tool-use-2UOTDXXS.js} +9 -9
- package/dist/{post-tool-use-failure-KYO2NCNB.js → post-tool-use-failure-ZJQGHBMW.js} +10 -10
- package/dist/{pre-compact-J6GCJEJR.js → pre-compact-WD3FYUZ4.js} +10 -10
- package/dist/{provider-check-AE3L5Z6R.js → provider-check-V3NSOLZQ.js} +4 -4
- package/dist/{registry-O2NZLO3V.js → registry-XGRKLHEK.js} +7 -7
- package/dist/{remove-3WZZC7AX.js → remove-L6T4LMFP.js} +11 -11
- package/dist/{resolution-events-XWYLLDRK.js → resolution-events-PZFKMZHM.js} +4 -4
- package/dist/{restart-HUHEFOXU.js → restart-4UGLWER2.js} +7 -7
- package/dist/{search-ZGN3LDXG.js → search-MJGMQZ5N.js} +7 -7
- package/dist/{server-PTXLVVEE.js → server-MVBNGXLQ.js} +258 -173
- package/dist/server-MVBNGXLQ.js.map +1 -0
- package/dist/{session-7VV3IQMO.js → session-GLKHGGPJ.js} +8 -8
- package/dist/{session-end-SMU55UCM.js → session-end-ISPUQH3X.js} +9 -9
- package/dist/{session-start-NIMWEOIZ.js → session-start-VF26JMWW.js} +14 -14
- package/dist/{setup-llm-7S3VPAPN.js → setup-llm-7RCROQLP.js} +10 -10
- 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/{stats-GEOQ2DFF.js → stats-N7FYQSAY.js} +11 -11
- package/dist/{stop-7AKYBJJ2.js → stop-LVRFMSGO.js} +9 -9
- package/dist/{stop-failure-NLE2EURG.js → stop-failure-AXU5LOBN.js} +10 -10
- package/dist/{subagent-start-LBNZF2TG.js → subagent-start-KDJIQXQC.js} +10 -10
- package/dist/{subagent-stop-B2Z5GYAB.js → subagent-stop-2T2H2TYE.js} +10 -10
- package/dist/{task-completed-PO5TETJ7.js → task-completed-XHQ3XMYJ.js} +10 -10
- package/dist/team-GM2VZOVM.js +22 -0
- package/dist/ui/assets/{index-CiI1fwas.js → index-JtMb9fMt.js} +48 -48
- package/dist/ui/index.html +1 -1
- package/dist/{update-WBWB5URU.js → update-R6VHTRQA.js} +11 -11
- package/dist/{user-prompt-submit-IZJC3NV7.js → user-prompt-submit-EK2MDBLQ.js} +9 -9
- package/dist/{verify-FNSP62I3.js → verify-NK46D4II.js} +8 -8
- package/dist/{version-QEVU66NT.js → version-LTTJPC4F.js} +2 -2
- package/dist/version-LTTJPC4F.js.map +1 -0
- package/package.json +19 -2
- package/CONTRIBUTING.md +0 -132
- package/dist/chunk-CKJAWZQE.js.map +0 -1
- package/dist/chunk-D7TYRPRM.js.map +0 -1
- package/dist/chunk-GDY63YAW.js.map +0 -1
- package/dist/chunk-RJMXDUMA.js +0 -40
- package/dist/chunk-RJMXDUMA.js.map +0 -1
- package/dist/chunk-TCSVDQF5.js.map +0 -1
- package/dist/chunk-TLK46KKD.js.map +0 -1
- package/dist/main-5THODR77.js.map +0 -1
- package/dist/server-PTXLVVEE.js.map +0 -1
- package/dist/src/worker/package-lock.json +0 -4338
- package/dist/src/worker/package.json +0 -22
- package/dist/src/worker/src/auth.ts +0 -31
- package/dist/src/worker/src/index.ts +0 -476
- package/dist/src/worker/src/mcp/auth.ts +0 -65
- package/dist/src/worker/src/mcp/server.ts +0 -53
- package/dist/src/worker/src/mcp/tools/context.ts +0 -13
- package/dist/src/worker/src/mcp/tools/get.ts +0 -15
- package/dist/src/worker/src/mcp/tools/graph.ts +0 -35
- package/dist/src/worker/src/mcp/tools/search.ts +0 -32
- package/dist/src/worker/src/mcp/tools/sessions.ts +0 -24
- package/dist/src/worker/src/mcp/tools/skills.ts +0 -16
- package/dist/src/worker/src/mcp/tools/team.ts +0 -9
- package/dist/src/worker/src/schema.ts +0 -326
- package/dist/src/worker/src/search-helpers.ts +0 -70
- package/dist/src/worker/tsconfig.json +0 -16
- package/dist/src/worker/wrangler.toml +0 -30
- package/dist/team-DPNP2RN7.js +0 -368
- package/dist/team-DPNP2RN7.js.map +0 -1
- /package/dist/{agent-run-I4O2K2CK.js.map → agent-run-BV3ATBWB.js.map} +0 -0
- /package/dist/{agent-tasks-UOW5BQIB.js.map → agent-tasks-I5SMLWVL.js.map} +0 -0
- /package/dist/{chunk-W7WENJ6F.js.map → chunk-46AQ7D23.js.map} +0 -0
- /package/dist/{chunk-CURS2TNP.js.map → chunk-6DDRJQ4X.js.map} +0 -0
- /package/dist/{chunk-75AZFBFW.js.map → chunk-6ZDJXSEO.js.map} +0 -0
- /package/dist/{chunk-O3TRN3RC.js.map → chunk-AULBWINA.js.map} +0 -0
- /package/dist/{chunk-TOER6RNC.js.map → chunk-GVBVHYOT.js.map} +0 -0
- /package/dist/{chunk-RIDSOQDR.js.map → chunk-HQLPB346.js.map} +0 -0
- /package/dist/{chunk-XWOQL4XN.js.map → chunk-NU74DHV3.js.map} +0 -0
- /package/dist/{chunk-E4VLWIJC.js.map → chunk-ODXLRR4U.js.map} +0 -0
- /package/dist/{chunk-RAV5YMRU.js.map → chunk-OR4XUYBJ.js.map} +0 -0
- /package/dist/{chunk-CML4MCYF.js.map → chunk-PMT2LSTQ.js.map} +0 -0
- /package/dist/{chunk-IB76KGBY.js.map → chunk-POEPHBQK.js.map} +0 -0
- /package/dist/{chunk-TZAXQKO6.js.map → chunk-PZEAO35P.js.map} +0 -0
- /package/dist/{chunk-C3EGL5JX.js.map → chunk-ULH667GT.js.map} +0 -0
- /package/dist/{chunk-DPSLJ242.js.map → chunk-UVKQ62II.js.map} +0 -0
- /package/dist/{chunk-N75GMQGA.js.map → chunk-VNL7KN4V.js.map} +0 -0
- /package/dist/{chunk-U3J2DDSR.js.map → chunk-VQF5E4ZX.js.map} +0 -0
- /package/dist/{chunk-LSP5HYOO.js.map → chunk-WGIQOJKJ.js.map} +0 -0
- /package/dist/{chunk-YZPI2Y3E.js.map → chunk-WKNAKQKA.js.map} +0 -0
- /package/dist/{chunk-NI23QCHB.js.map → chunk-YDU3AHSW.js.map} +0 -0
- /package/dist/{cli-D3TJYJ2U.js.map → cli-2BW2PZMP.js.map} +0 -0
- /package/dist/{client-4LLEXLVK.js.map → client-HMGTCKRW.js.map} +0 -0
- /package/dist/{config-DA4IUVFL.js.map → config-LVXDVUYY.js.map} +0 -0
- /package/dist/{detect-SZ2KDUF4.js.map → detect-BEOIHGBC.js.map} +0 -0
- /package/dist/{detect-providers-PSVKXTWE.js.map → detect-providers-CDG6BKHU.js.map} +0 -0
- /package/dist/{doctor-KCTXPX5D.js.map → doctor-AK3W5FMN.js.map} +0 -0
- /package/dist/{executor-UYIZC3L5.js.map → executor-YLC7DHBY.js.map} +0 -0
- /package/dist/{init-QFNBKKDC.js.map → init-4FV7ODOK.js.map} +0 -0
- /package/dist/{llm-SMA5ZEAW.js.map → llm-INLSGEXY.js.map} +0 -0
- /package/dist/{loader-Q3P3R4UP.js.map → loader-2ULW2FZS.js.map} +0 -0
- /package/dist/{loader-SKKUMT5C.js.map → loader-HEGKUTGI.js.map} +0 -0
- /package/dist/{open-7737CSPN.js.map → open-YSB36HP7.js.map} +0 -0
- /package/dist/{post-compact-2TJ5FPZH.js.map → post-compact-5OB4LRLA.js.map} +0 -0
- /package/dist/{post-tool-use-FRTSICC3.js.map → post-tool-use-2UOTDXXS.js.map} +0 -0
- /package/dist/{post-tool-use-failure-KYO2NCNB.js.map → post-tool-use-failure-ZJQGHBMW.js.map} +0 -0
- /package/dist/{pre-compact-J6GCJEJR.js.map → pre-compact-WD3FYUZ4.js.map} +0 -0
- /package/dist/{provider-check-AE3L5Z6R.js.map → provider-check-V3NSOLZQ.js.map} +0 -0
- /package/dist/{registry-O2NZLO3V.js.map → registry-XGRKLHEK.js.map} +0 -0
- /package/dist/{remove-3WZZC7AX.js.map → remove-L6T4LMFP.js.map} +0 -0
- /package/dist/{resolution-events-XWYLLDRK.js.map → resolution-events-PZFKMZHM.js.map} +0 -0
- /package/dist/{restart-HUHEFOXU.js.map → restart-4UGLWER2.js.map} +0 -0
- /package/dist/{search-ZGN3LDXG.js.map → search-MJGMQZ5N.js.map} +0 -0
- /package/dist/{session-7VV3IQMO.js.map → session-GLKHGGPJ.js.map} +0 -0
- /package/dist/{session-end-SMU55UCM.js.map → session-end-ISPUQH3X.js.map} +0 -0
- /package/dist/{session-start-NIMWEOIZ.js.map → session-start-VF26JMWW.js.map} +0 -0
- /package/dist/{setup-llm-7S3VPAPN.js.map → setup-llm-7RCROQLP.js.map} +0 -0
- /package/dist/{stats-GEOQ2DFF.js.map → stats-N7FYQSAY.js.map} +0 -0
- /package/dist/{stop-7AKYBJJ2.js.map → stop-LVRFMSGO.js.map} +0 -0
- /package/dist/{stop-failure-NLE2EURG.js.map → stop-failure-AXU5LOBN.js.map} +0 -0
- /package/dist/{subagent-start-LBNZF2TG.js.map → subagent-start-KDJIQXQC.js.map} +0 -0
- /package/dist/{subagent-stop-B2Z5GYAB.js.map → subagent-stop-2T2H2TYE.js.map} +0 -0
- /package/dist/{task-completed-PO5TETJ7.js.map → task-completed-XHQ3XMYJ.js.map} +0 -0
- /package/dist/{version-QEVU66NT.js.map → team-GM2VZOVM.js.map} +0 -0
- /package/dist/{update-WBWB5URU.js.map → update-R6VHTRQA.js.map} +0 -0
- /package/dist/{user-prompt-submit-IZJC3NV7.js.map → user-prompt-submit-EK2MDBLQ.js.map} +0 -0
- /package/dist/{verify-FNSP62I3.js.map → verify-NK46D4II.js.map} +0 -0
|
@@ -2,10 +2,10 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
|
|
|
2
2
|
import {
|
|
3
3
|
LmStudioBackend,
|
|
4
4
|
OllamaBackend
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PMT2LSTQ.js";
|
|
6
6
|
import {
|
|
7
7
|
PROVIDER_DETECT_TIMEOUT_MS
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-I54KLC6H.js";
|
|
9
9
|
|
|
10
10
|
// src/intelligence/provider-check.ts
|
|
11
11
|
async function checkLocalProvider(type, baseUrl) {
|
|
@@ -19,4 +19,4 @@ async function checkLocalProvider(type, baseUrl) {
|
|
|
19
19
|
export {
|
|
20
20
|
checkLocalProvider
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=chunk-
|
|
22
|
+
//# sourceMappingURL=chunk-6ZDJXSEO.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
LmStudioBackend,
|
|
7
7
|
OllamaBackend
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-PMT2LSTQ.js";
|
|
9
9
|
import {
|
|
10
10
|
closeDatabase,
|
|
11
11
|
initDatabase,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-MYX5NCRH.js";
|
|
14
14
|
import {
|
|
15
15
|
DaemonClient
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-NU74DHV3.js";
|
|
17
17
|
|
|
18
18
|
// src/cli/shared.ts
|
|
19
19
|
import fs from "fs";
|
|
@@ -76,8 +76,8 @@ restart-reason.json
|
|
|
76
76
|
# Binary attachments \u2014 screenshots captured from transcripts
|
|
77
77
|
attachments/
|
|
78
78
|
|
|
79
|
-
# Team
|
|
80
|
-
|
|
79
|
+
# Team sync admin state + worker deployment
|
|
80
|
+
team/
|
|
81
81
|
|
|
82
82
|
# Runtime command alias \u2014 per-contributor override for which myco binary
|
|
83
83
|
# the hook guard invokes. Default (file absent) is \`myco\`; \`make dev-link\`
|
|
@@ -120,4 +120,4 @@ export {
|
|
|
120
120
|
VAULT_GITIGNORE,
|
|
121
121
|
registerSymbionts
|
|
122
122
|
};
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-AOCBCPAP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/shared.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { OllamaBackend } from '../intelligence/ollama.js';\nimport { LmStudioBackend } from '../intelligence/lm-studio.js';\n\nimport { DaemonClient } from '../hooks/client.js';\nimport { initDatabase, closeDatabase, vaultDbPath } from '../db/client.js';\nimport { SymbiontInstaller } from '../symbionts/installer.js';\nimport type { SymbiontManifest } from '../symbionts/manifest-schema.js';\n\nexport { parseStringFlag, parseIntFlag } from '../logs/format.js';\n\n/**\n * Initialize the singleton database for direct CLI reads.\n * Used by CLI commands that only need reads (stats, search, session).\n * Does NOT require the daemon to be running — WAL mode allows concurrent reads.\n *\n * @returns a cleanup function that closes the database.\n */\nexport function initVaultDb(vaultDir: string): () => void {\n initDatabase(vaultDbPath(vaultDir));\n return closeDatabase;\n}\n\n/** Connect to the daemon, ensuring it's running. Exits on failure. */\nexport async function connectToDaemon(vaultDir: string): Promise<DaemonClient> {\n const client = new DaemonClient(vaultDir);\n const healthy = await client.ensureRunning();\n if (!healthy) {\n console.error('Failed to connect to daemon');\n process.exit(1);\n }\n return client;\n}\n\n/** Load .env from cwd (not script location — that's the plugin install dir). */\nexport function loadEnv(): void {\n const envPath = path.resolve(process.cwd(), '.env');\n if (!fs.existsSync(envPath)) return;\n for (const line of fs.readFileSync(envPath, 'utf-8').split('\\n')) {\n const match = line.match(/^\\s*([^#=]+?)\\s*=\\s*(.*?)\\s*$/);\n if (match && !process.env[match[1]]) {\n process.env[match[1]] = match[2];\n }\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\n// --- Provider defaults (sourced from backend classes) ---\nexport const PROVIDER_DEFAULTS: Record<string, { base_url: string }> = {\n ollama: { base_url: OllamaBackend.DEFAULT_BASE_URL },\n 'lm-studio': { base_url: LmStudioBackend.DEFAULT_BASE_URL },\n};\n\n\nexport const VAULT_GITIGNORE = `# SQLite database\nmyco.db*\nvectors.db*\n\n# Daemon state — per-machine, ephemeral\ndaemon.json\nbuffer/\nlogs/\n\n# Secrets — API keys for cloud providers\nsecrets.env\n\n# Machine ID\nmachine_id\n\n# Update tracking — per-machine state\nlast-update-version\nrestart-reason.json\n\n# Binary attachments — screenshots captured from transcripts\nattachments/\n\n# Team sync admin state + worker deployment\nteam/\n\n# Runtime command alias — per-contributor override for which myco binary\n# the hook guard invokes. Default (file absent) is \\`myco\\`; \\`make dev-link\\`\n# writes \\`myco-dev\\`; users can hand-edit for PATH conflicts or pinning.\n# Never committed — different contributors use different aliases.\nruntime.command\n`;\n\n/** Collapse an absolute home-dir path to its `~/` form for portable config storage. */\nexport function collapseHomePath(absPath: string): string {\n const home = os.homedir();\n if (absPath.startsWith(home + path.sep) || absPath === home) {\n return '~' + absPath.slice(home.length);\n }\n return absPath;\n}\n\n/**\n * Run the SymbiontInstaller for each symbiont manifest and log results.\n * Shared between myco init and myco update.\n */\nexport function registerSymbionts(\n manifests: SymbiontManifest[],\n projectRoot: string,\n packageRoot: string,\n verb: 'Registered' | 'Updated',\n): number {\n let count = 0;\n for (const manifest of manifests) {\n try {\n const installer = new SymbiontInstaller(manifest, projectRoot, packageRoot);\n const result = installer.install();\n\n const installed = [\n result.hooks && 'hooks',\n result.mcp && 'MCP server',\n result.skills && 'skills',\n result.settings && 'settings',\n result.instructions && 'instructions',\n result.pluginPackage && 'plugin deps',\n ].filter(Boolean);\n\n if (installed.length > 0) {\n console.log(` \\u2713 ${verb} ${manifest.displayName}: ${installed.join(', ')}`);\n count++;\n } else {\n console.log(` \\u2013 ${manifest.displayName}: no registration targets configured`);\n }\n } catch (err) {\n console.error(` \\u2717 Failed to register ${manifest.displayName}: ${(err as Error).message}`);\n }\n }\n return count;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAkBR,SAAS,YAAY,UAA8B;AACxD,eAAa,YAAY,QAAQ,CAAC;AAClC,SAAO;AACT;AAGA,eAAsB,gBAAgB,UAAyC;AAC7E,QAAM,SAAS,IAAI,aAAa,QAAQ;AACxC,QAAM,UAAU,MAAM,OAAO,cAAc;AAC3C,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAGO,SAAS,UAAgB;AAC9B,QAAM,UAAU,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM;AAClD,MAAI,CAAC,GAAG,WAAW,OAAO,EAAG;AAC7B,aAAW,QAAQ,GAAG,aAAa,SAAS,OAAO,EAAE,MAAM,IAAI,GAAG;AAChE,UAAM,QAAQ,KAAK,MAAM,+BAA+B;AACxD,QAAI,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,GAAG;AACnC,cAAQ,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,eAAe,KAAsB;AACnD,MAAI;AAAE,YAAQ,KAAK,KAAK,CAAC;AAAG,WAAO;AAAA,EAAM,QAAQ;AAAE,WAAO;AAAA,EAAO;AACnE;AAGO,IAAM,oBAA0D;AAAA,EACrE,QAAQ,EAAE,UAAU,cAAc,iBAAiB;AAAA,EACnD,aAAa,EAAE,UAAU,gBAAgB,iBAAiB;AAC5D;AAGO,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CxB,SAAS,kBACd,WACA,aACA,aACA,MACQ;AACR,MAAI,QAAQ;AACZ,aAAW,YAAY,WAAW;AAChC,QAAI;AACF,YAAM,YAAY,IAAI,kBAAkB,UAAU,aAAa,WAAW;AAC1E,YAAM,SAAS,UAAU,QAAQ;AAEjC,YAAM,YAAY;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,OAAO,UAAU;AAAA,QACjB,OAAO,YAAY;AAAA,QACnB,OAAO,gBAAgB;AAAA,QACvB,OAAO,iBAAiB;AAAA,MAC1B,EAAE,OAAO,OAAO;AAEhB,UAAI,UAAU,SAAS,GAAG;AACxB,gBAAQ,IAAI,YAAY,IAAI,IAAI,SAAS,WAAW,KAAK,UAAU,KAAK,IAAI,CAAC,EAAE;AAC/E;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,YAAY,SAAS,WAAW,sCAAsC;AAAA,MACpF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,+BAA+B,SAAS,WAAW,KAAM,IAAc,OAAO,EAAE;AAAA,IAChG;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-MYX5NCRH.js";
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_MACHINE_ID
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-I54KLC6H.js";
|
|
8
8
|
|
|
9
9
|
// src/daemon/team-context.ts
|
|
10
10
|
var teamSyncEnabled = false;
|
|
@@ -224,4 +224,4 @@ export {
|
|
|
224
224
|
markSourceRowsSynced,
|
|
225
225
|
backfillUnsynced
|
|
226
226
|
};
|
|
227
|
-
//# sourceMappingURL=chunk-
|
|
227
|
+
//# sourceMappingURL=chunk-AULBWINA.js.map
|
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
SCHEMA_VERSION
|
|
4
|
+
} from "./chunk-6DDRJQ4X.js";
|
|
5
|
+
import {
|
|
6
|
+
loadConfig,
|
|
7
|
+
updateTeamConfig
|
|
8
|
+
} from "./chunk-4NIMDUYW.js";
|
|
9
|
+
import {
|
|
10
|
+
TEAM_API_KEY_SECRET,
|
|
11
|
+
TEAM_MCP_TOKEN_SECRET,
|
|
12
|
+
WRANGLER_COMMAND_TIMEOUT_MS
|
|
13
|
+
} from "./chunk-I54KLC6H.js";
|
|
14
|
+
|
|
15
|
+
// ../myco-team/src/cli.ts
|
|
16
|
+
import crypto2 from "crypto";
|
|
17
|
+
import fs4 from "fs";
|
|
18
|
+
import path4 from "path";
|
|
19
|
+
import { fileURLToPath } from "url";
|
|
20
|
+
|
|
21
|
+
// src/config/secrets.ts
|
|
22
|
+
import fs from "fs";
|
|
23
|
+
import path from "path";
|
|
24
|
+
var SECRETS_FILE = "secrets.env";
|
|
25
|
+
function readSecrets(vaultDir) {
|
|
26
|
+
const secretsPath = path.join(vaultDir, SECRETS_FILE);
|
|
27
|
+
if (!fs.existsSync(secretsPath)) return {};
|
|
28
|
+
const secrets = {};
|
|
29
|
+
for (const line of fs.readFileSync(secretsPath, "utf-8").split("\n")) {
|
|
30
|
+
const match = line.match(/^\s*([^#=]+?)\s*=\s*(.*?)\s*$/);
|
|
31
|
+
if (match) {
|
|
32
|
+
secrets[match[1]] = match[2];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return secrets;
|
|
36
|
+
}
|
|
37
|
+
function writeSecret(vaultDir, key, value) {
|
|
38
|
+
const secretsPath = path.join(vaultDir, SECRETS_FILE);
|
|
39
|
+
const existing = readSecrets(vaultDir);
|
|
40
|
+
existing[key] = value;
|
|
41
|
+
const content = Object.entries(existing).map(([k, v]) => `${k}=${v}`).join("\n") + "\n";
|
|
42
|
+
fs.writeFileSync(secretsPath, content, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
function loadSecrets(vaultDir) {
|
|
45
|
+
const secrets = readSecrets(vaultDir);
|
|
46
|
+
for (const [key, value] of Object.entries(secrets)) {
|
|
47
|
+
if (!process.env[key]) {
|
|
48
|
+
process.env[key] = value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ../myco-deploy/src/cloudflare.ts
|
|
54
|
+
import { execFileSync } from "child_process";
|
|
55
|
+
import fs2 from "fs";
|
|
56
|
+
import path2 from "path";
|
|
57
|
+
var WORKER_URL_REGEX = /(https:\/\/[^\s]+\.workers\.dev)/;
|
|
58
|
+
var D1_ID_JSON_REGEX = /"database_id"\s*:\s*"([0-9a-f-]{36})"/i;
|
|
59
|
+
var D1_ID_TEXT_REGEX = /id:\s*([0-9a-f-]{36})/i;
|
|
60
|
+
var KV_ID_REGEX = /"id":\s*"([0-9a-f]+)"/i;
|
|
61
|
+
function buildCommandEnv() {
|
|
62
|
+
const nodeBinDir = path2.dirname(process.execPath);
|
|
63
|
+
const pathValue = process.env.PATH ? `${nodeBinDir}${path2.delimiter}${process.env.PATH}` : nodeBinDir;
|
|
64
|
+
return { ...process.env, PATH: pathValue };
|
|
65
|
+
}
|
|
66
|
+
function runWrangler(args, options) {
|
|
67
|
+
try {
|
|
68
|
+
return execFileSync("wrangler", args, {
|
|
69
|
+
cwd: options.cwd,
|
|
70
|
+
env: buildCommandEnv(),
|
|
71
|
+
input: options.input,
|
|
72
|
+
encoding: "utf-8",
|
|
73
|
+
timeout: options.timeoutMs,
|
|
74
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
75
|
+
});
|
|
76
|
+
} catch (error) {
|
|
77
|
+
const execError = error;
|
|
78
|
+
const stderr = execError.stderr?.toString() ?? "";
|
|
79
|
+
const stdout = execError.stdout?.toString() ?? "";
|
|
80
|
+
const detail = [stderr, stdout].filter(Boolean).join("\n").trim();
|
|
81
|
+
throw new Error(detail || execError.message);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function installDeploymentDeps(deployDir, timeoutMs) {
|
|
85
|
+
const packageJsonPath = path2.join(deployDir, "package.json");
|
|
86
|
+
if (!fs2.existsSync(packageJsonPath)) return;
|
|
87
|
+
execFileSync("npm", ["install", "--silent", "--no-audit", "--no-fund"], {
|
|
88
|
+
cwd: deployDir,
|
|
89
|
+
env: buildCommandEnv(),
|
|
90
|
+
encoding: "utf-8",
|
|
91
|
+
timeout: timeoutMs,
|
|
92
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function parseWorkerUrl(output) {
|
|
96
|
+
const workerUrl = output.match(WORKER_URL_REGEX)?.[1];
|
|
97
|
+
if (!workerUrl) {
|
|
98
|
+
throw new Error(`Could not parse worker URL from deploy output:
|
|
99
|
+
${output}`);
|
|
100
|
+
}
|
|
101
|
+
return workerUrl;
|
|
102
|
+
}
|
|
103
|
+
function parseD1Id(output) {
|
|
104
|
+
const jsonMatch = output.match(D1_ID_JSON_REGEX);
|
|
105
|
+
if (jsonMatch) return jsonMatch[1];
|
|
106
|
+
const textMatch = output.match(D1_ID_TEXT_REGEX);
|
|
107
|
+
if (textMatch) return textMatch[1];
|
|
108
|
+
throw new Error(`Could not parse D1 database ID from wrangler output:
|
|
109
|
+
${output}`);
|
|
110
|
+
}
|
|
111
|
+
function parseKvNamespaceId(output) {
|
|
112
|
+
const kvId = output.match(KV_ID_REGEX)?.[1];
|
|
113
|
+
if (!kvId) {
|
|
114
|
+
throw new Error(`Could not parse KV namespace ID from wrangler output:
|
|
115
|
+
${output}`);
|
|
116
|
+
}
|
|
117
|
+
return kvId;
|
|
118
|
+
}
|
|
119
|
+
function extractJsonArray(output) {
|
|
120
|
+
const start = output.indexOf("[");
|
|
121
|
+
const end = output.lastIndexOf("]");
|
|
122
|
+
if (start === -1 || end === -1 || end < start) {
|
|
123
|
+
throw new Error(`No JSON array found in output:
|
|
124
|
+
${output}`);
|
|
125
|
+
}
|
|
126
|
+
return JSON.parse(output.slice(start, end + 1));
|
|
127
|
+
}
|
|
128
|
+
function stageDeploymentDir(options) {
|
|
129
|
+
if (options.reset) {
|
|
130
|
+
fs2.rmSync(options.deployDir, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
fs2.mkdirSync(options.deployDir, { recursive: true });
|
|
133
|
+
fs2.cpSync(options.sourceDir, options.deployDir, { recursive: true });
|
|
134
|
+
for (const copy of options.extraCopies ?? []) {
|
|
135
|
+
fs2.cpSync(copy.sourceDir, path2.join(options.deployDir, copy.destinationSubdir), { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
for (const patch of options.textPatches ?? []) {
|
|
138
|
+
const absolutePath = path2.join(options.deployDir, patch.filePath);
|
|
139
|
+
let nextText = fs2.readFileSync(absolutePath, "utf-8");
|
|
140
|
+
for (const transform of patch.transforms) {
|
|
141
|
+
nextText = transform(nextText);
|
|
142
|
+
}
|
|
143
|
+
fs2.writeFileSync(absolutePath, nextText, "utf-8");
|
|
144
|
+
}
|
|
145
|
+
if (options.installDepsTimeoutMs) {
|
|
146
|
+
installDeploymentDeps(options.deployDir, options.installDepsTimeoutMs);
|
|
147
|
+
}
|
|
148
|
+
return options.deployDir;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ../myco-deploy/src/local-config.ts
|
|
152
|
+
import crypto from "crypto";
|
|
153
|
+
import fs3 from "fs";
|
|
154
|
+
import os from "os";
|
|
155
|
+
import path3 from "path";
|
|
156
|
+
var MYCO_HOME_OVERRIDE_ENV = "MYCO_HOME_OVERRIDE";
|
|
157
|
+
function resolveHomeDir() {
|
|
158
|
+
return process.env[MYCO_HOME_OVERRIDE_ENV]?.trim() || os.homedir();
|
|
159
|
+
}
|
|
160
|
+
function resolveHomeConfigPath(configDir, fileName) {
|
|
161
|
+
return path3.join(resolveHomeDir(), configDir, fileName);
|
|
162
|
+
}
|
|
163
|
+
function resolveVaultConfigPath(vaultDir, configDir, fileName) {
|
|
164
|
+
return path3.join(vaultDir, configDir, fileName);
|
|
165
|
+
}
|
|
166
|
+
function readJsonConfig(configPath) {
|
|
167
|
+
if (!fs3.existsSync(configPath)) return null;
|
|
168
|
+
return JSON.parse(fs3.readFileSync(configPath, "utf-8"));
|
|
169
|
+
}
|
|
170
|
+
function writeJsonConfig(configPath, value) {
|
|
171
|
+
fs3.mkdirSync(path3.dirname(configPath), { recursive: true });
|
|
172
|
+
fs3.writeFileSync(configPath, `${JSON.stringify(value, null, 2)}
|
|
173
|
+
`, { encoding: "utf-8", mode: 384 });
|
|
174
|
+
fs3.chmodSync(configPath, 384);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ../myco-team/src/cli.ts
|
|
178
|
+
var API_KEY_BYTES = 32;
|
|
179
|
+
var VECTORIZE_DIMENSIONS = "1024";
|
|
180
|
+
var VECTORIZE_METRIC = "cosine";
|
|
181
|
+
var TEAM_RESOURCE_PREFIX = "myco-team";
|
|
182
|
+
var PROJECT_HASH_LENGTH = 8;
|
|
183
|
+
var WORKER_SOURCE_DIR = "worker";
|
|
184
|
+
var TEAM_STATE_DIR = "team";
|
|
185
|
+
var TEAM_DEPLOY_DIR = "worker";
|
|
186
|
+
var TEAM_CONFIG_FILE = "config.json";
|
|
187
|
+
var LEGACY_TEAM_CONFIG_DIR = ".myco-team";
|
|
188
|
+
var LEGACY_TEAM_DEPLOY_DIR = ".team-worker";
|
|
189
|
+
var TEAM_CONFIG_VERSION = 1;
|
|
190
|
+
var TOML_NAME_REGEX = /^name\s*=\s*"[^"]*"/m;
|
|
191
|
+
var TOML_D1_PLACEHOLDER_REGEX = /<YOUR_D1_DATABASE_ID>/g;
|
|
192
|
+
var TOML_DB_NAME_REGEX = /database_name\s*=\s*"[^"]*"/g;
|
|
193
|
+
var TOML_INDEX_NAME_REGEX = /index_name\s*=\s*"[^"]*"/g;
|
|
194
|
+
var TOML_TEAM_PACKAGE_VERSION_REGEX = /MYCO_TEAM_PACKAGE_VERSION\s*=\s*"[^"]*"/g;
|
|
195
|
+
var TOML_MYCO_SCHEMA_VERSION_REGEX = /MYCO_SCHEMA_VERSION\s*=\s*"[^"]*"/g;
|
|
196
|
+
var TOML_DB_ID_REGEX = /database_id\s*=\s*"([^"]+)"/;
|
|
197
|
+
var TOML_KV_PLACEHOLDER_REGEX = /<YOUR_KV_NAMESPACE_ID>/g;
|
|
198
|
+
var TOML_KV_ID_REGEX = /\[\[kv_namespaces\]\][\s\S]*?id\s*=\s*"([0-9a-f]+)"/;
|
|
199
|
+
function projectHash(vaultDir) {
|
|
200
|
+
const hash = crypto2.createHash("sha256").update(vaultDir).digest("hex");
|
|
201
|
+
return hash.slice(0, PROJECT_HASH_LENGTH);
|
|
202
|
+
}
|
|
203
|
+
function resourceName(vaultDir) {
|
|
204
|
+
return `${TEAM_RESOURCE_PREFIX}-${projectHash(vaultDir)}`;
|
|
205
|
+
}
|
|
206
|
+
function resolvePackageRoot() {
|
|
207
|
+
const override = process.env.MYCO_TEAM_PACKAGE_ROOT?.trim();
|
|
208
|
+
if (override) return override;
|
|
209
|
+
return path4.resolve(path4.dirname(fileURLToPath(import.meta.url)), "..");
|
|
210
|
+
}
|
|
211
|
+
function getTeamPackageVersion() {
|
|
212
|
+
if (true) {
|
|
213
|
+
return "0.1.1";
|
|
214
|
+
}
|
|
215
|
+
const packageRoot = resolvePackageRoot();
|
|
216
|
+
const candidatePaths = [
|
|
217
|
+
path4.join(packageRoot, "package.json"),
|
|
218
|
+
path4.join(path4.resolve(path4.dirname(fileURLToPath(import.meta.url)), ".."), "package.json")
|
|
219
|
+
];
|
|
220
|
+
for (const candidatePath of candidatePaths) {
|
|
221
|
+
if (!fs4.existsSync(candidatePath)) continue;
|
|
222
|
+
const packageJson = JSON.parse(fs4.readFileSync(candidatePath, "utf-8"));
|
|
223
|
+
if (packageJson.version) return packageJson.version;
|
|
224
|
+
}
|
|
225
|
+
return "0.1.0";
|
|
226
|
+
}
|
|
227
|
+
function getMycoSchemaVersion() {
|
|
228
|
+
return String(SCHEMA_VERSION);
|
|
229
|
+
}
|
|
230
|
+
function resolveLocalConfigPath(vaultDir) {
|
|
231
|
+
return resolveVaultConfigPath(vaultDir, TEAM_STATE_DIR, TEAM_CONFIG_FILE);
|
|
232
|
+
}
|
|
233
|
+
function resolveLegacyLocalConfigPath() {
|
|
234
|
+
return resolveHomeConfigPath(LEGACY_TEAM_CONFIG_DIR, TEAM_CONFIG_FILE);
|
|
235
|
+
}
|
|
236
|
+
function resolveDeployDir(vaultDir) {
|
|
237
|
+
return path4.join(vaultDir, TEAM_STATE_DIR, TEAM_DEPLOY_DIR);
|
|
238
|
+
}
|
|
239
|
+
function resolveLegacyDeployDir(vaultDir) {
|
|
240
|
+
return path4.join(vaultDir, LEGACY_TEAM_DEPLOY_DIR);
|
|
241
|
+
}
|
|
242
|
+
function writeLocalConfig(vaultDir, config) {
|
|
243
|
+
writeJsonConfig(resolveLocalConfigPath(vaultDir), config);
|
|
244
|
+
}
|
|
245
|
+
function migrateLegacyDeployDir(vaultDir) {
|
|
246
|
+
const legacyDeployDir = resolveLegacyDeployDir(vaultDir);
|
|
247
|
+
const nextDeployDir = resolveDeployDir(vaultDir);
|
|
248
|
+
if (!fs4.existsSync(legacyDeployDir) || fs4.existsSync(nextDeployDir)) return;
|
|
249
|
+
fs4.mkdirSync(path4.dirname(nextDeployDir), { recursive: true });
|
|
250
|
+
fs4.renameSync(legacyDeployDir, nextDeployDir);
|
|
251
|
+
}
|
|
252
|
+
function readLocalConfig(vaultDir) {
|
|
253
|
+
const config = readJsonConfig(resolveLocalConfigPath(vaultDir));
|
|
254
|
+
if (config) {
|
|
255
|
+
migrateLegacyDeployDir(vaultDir);
|
|
256
|
+
return config;
|
|
257
|
+
}
|
|
258
|
+
const legacyConfig = readJsonConfig(resolveLegacyLocalConfigPath());
|
|
259
|
+
if (!legacyConfig) return null;
|
|
260
|
+
if (legacyConfig.vault_dir && legacyConfig.vault_dir !== vaultDir) return null;
|
|
261
|
+
const migrated = {
|
|
262
|
+
worker_name: legacyConfig.worker_name,
|
|
263
|
+
worker_url: legacyConfig.worker_url,
|
|
264
|
+
package_version: legacyConfig.package_version,
|
|
265
|
+
created_at: legacyConfig.created_at,
|
|
266
|
+
last_upgraded: legacyConfig.last_upgraded,
|
|
267
|
+
config_version: legacyConfig.config_version ?? TEAM_CONFIG_VERSION
|
|
268
|
+
};
|
|
269
|
+
writeLocalConfig(vaultDir, migrated);
|
|
270
|
+
if (legacyConfig.api_key) writeSecret(vaultDir, TEAM_API_KEY_SECRET, legacyConfig.api_key);
|
|
271
|
+
if (legacyConfig.mcp_token) writeSecret(vaultDir, TEAM_MCP_TOKEN_SECRET, legacyConfig.mcp_token);
|
|
272
|
+
migrateLegacyDeployDir(vaultDir);
|
|
273
|
+
return migrated;
|
|
274
|
+
}
|
|
275
|
+
function wrangler(args, options) {
|
|
276
|
+
return runWrangler(args, { cwd: options?.cwd, timeoutMs: WRANGLER_COMMAND_TIMEOUT_MS });
|
|
277
|
+
}
|
|
278
|
+
function locateWorkerSource() {
|
|
279
|
+
const root = resolvePackageRoot();
|
|
280
|
+
const distPath = path4.join(root, "dist", WORKER_SOURCE_DIR);
|
|
281
|
+
if (fs4.existsSync(distPath)) return distPath;
|
|
282
|
+
const srcPath = path4.join(root, WORKER_SOURCE_DIR);
|
|
283
|
+
if (fs4.existsSync(srcPath)) return srcPath;
|
|
284
|
+
throw new Error(`Cannot find ${WORKER_SOURCE_DIR} \u2014 are you running from the myco-team package?`);
|
|
285
|
+
}
|
|
286
|
+
function prepareDeployDir(vaultDir, d1Id, kvId) {
|
|
287
|
+
const srcDir = locateWorkerSource();
|
|
288
|
+
const deployDir = resolveDeployDir(vaultDir);
|
|
289
|
+
const name = resourceName(vaultDir);
|
|
290
|
+
return stageDeploymentDir({
|
|
291
|
+
sourceDir: srcDir,
|
|
292
|
+
deployDir,
|
|
293
|
+
reset: true,
|
|
294
|
+
textPatches: [{
|
|
295
|
+
filePath: "wrangler.toml",
|
|
296
|
+
transforms: [
|
|
297
|
+
(toml) => toml.replace(TOML_NAME_REGEX, `name = "${name}"`),
|
|
298
|
+
(toml) => toml.replace(TOML_D1_PLACEHOLDER_REGEX, d1Id),
|
|
299
|
+
(toml) => toml.replace(TOML_DB_NAME_REGEX, `database_name = "${name}"`),
|
|
300
|
+
(toml) => toml.replace(TOML_INDEX_NAME_REGEX, `index_name = "${name}-vectors"`),
|
|
301
|
+
(toml) => toml.replace(TOML_KV_PLACEHOLDER_REGEX, kvId),
|
|
302
|
+
(toml) => toml.replace(TOML_TEAM_PACKAGE_VERSION_REGEX, `MYCO_TEAM_PACKAGE_VERSION = "${getTeamPackageVersion()}"`),
|
|
303
|
+
(toml) => toml.replace(TOML_MYCO_SCHEMA_VERSION_REGEX, `MYCO_SCHEMA_VERSION = "${getMycoSchemaVersion()}"`)
|
|
304
|
+
]
|
|
305
|
+
}],
|
|
306
|
+
installDepsTimeoutMs: WRANGLER_COMMAND_TIMEOUT_MS * 3
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
function ensureKvNamespace(name) {
|
|
310
|
+
const kvName = `${name}-secrets`;
|
|
311
|
+
const lookupExisting = () => {
|
|
312
|
+
const listOutput = wrangler(["kv", "namespace", "list"]);
|
|
313
|
+
const namespaces = extractJsonArray(listOutput);
|
|
314
|
+
const normalize = (s) => s.replace(/[-_]/g, "");
|
|
315
|
+
const target = normalize(kvName);
|
|
316
|
+
const existing = namespaces.find((ns) => normalize(ns.title) === target || normalize(ns.title).endsWith(target));
|
|
317
|
+
if (!existing) throw new Error(`KV namespace "${kvName}" not found in list of ${namespaces.length} namespaces`);
|
|
318
|
+
return existing.id;
|
|
319
|
+
};
|
|
320
|
+
try {
|
|
321
|
+
const output = wrangler(["kv", "namespace", "create", kvName]);
|
|
322
|
+
return parseKvNamespaceId(output);
|
|
323
|
+
} catch (err) {
|
|
324
|
+
const errMsg = err.message;
|
|
325
|
+
if (errMsg.includes("already exists") || errMsg.includes("duplicate") || errMsg.includes("same title")) {
|
|
326
|
+
return lookupExisting();
|
|
327
|
+
}
|
|
328
|
+
throw err;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
async function rotateMcpTokenForWorker(workerUrl, apiKey) {
|
|
332
|
+
const response = await fetch(`${workerUrl}/mcp/rotate`, {
|
|
333
|
+
method: "POST",
|
|
334
|
+
headers: {
|
|
335
|
+
Authorization: `Bearer ${apiKey}`,
|
|
336
|
+
"Content-Type": "application/json"
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
if (!response.ok) {
|
|
340
|
+
throw new Error(`MCP token rotation failed: ${response.status} ${await response.text()}`);
|
|
341
|
+
}
|
|
342
|
+
const body = await response.json();
|
|
343
|
+
if (!body.token) {
|
|
344
|
+
throw new Error("MCP token rotation response did not include a token");
|
|
345
|
+
}
|
|
346
|
+
return body.token;
|
|
347
|
+
}
|
|
348
|
+
async function teamInit(vaultDir) {
|
|
349
|
+
console.log("Provisioning team sync infrastructure...\n");
|
|
350
|
+
try {
|
|
351
|
+
const version = wrangler(["--version"]).trim();
|
|
352
|
+
console.log(`wrangler: ${version}`);
|
|
353
|
+
} catch {
|
|
354
|
+
console.error("Error: wrangler CLI not found. Install it with: npm install -g wrangler");
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
wrangler(["whoami"]);
|
|
359
|
+
console.log("Cloudflare auth: OK\n");
|
|
360
|
+
} catch {
|
|
361
|
+
console.error("Error: Not authenticated with Cloudflare. Run: wrangler login");
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
const name = resourceName(vaultDir);
|
|
365
|
+
console.log(`Resource name: ${name}
|
|
366
|
+
`);
|
|
367
|
+
console.log("Creating D1 database...");
|
|
368
|
+
let d1Id;
|
|
369
|
+
try {
|
|
370
|
+
const d1Output = wrangler(["d1", "create", name]);
|
|
371
|
+
d1Id = parseD1Id(d1Output);
|
|
372
|
+
console.log(`D1 database created: ${d1Id}
|
|
373
|
+
`);
|
|
374
|
+
} catch (err) {
|
|
375
|
+
const errMsg = err.message;
|
|
376
|
+
if (errMsg.includes("already exists")) {
|
|
377
|
+
console.log("D1 database already exists, looking up ID...");
|
|
378
|
+
const listOutput = wrangler(["d1", "list", "--json"]);
|
|
379
|
+
const databases = JSON.parse(listOutput);
|
|
380
|
+
const existing = databases.find((db) => db.name === name);
|
|
381
|
+
if (!existing) {
|
|
382
|
+
console.error(`D1 database "${name}" reported as existing but not found in list`);
|
|
383
|
+
process.exit(1);
|
|
384
|
+
}
|
|
385
|
+
d1Id = existing.uuid;
|
|
386
|
+
console.log(`Reusing D1 database: ${d1Id}
|
|
387
|
+
`);
|
|
388
|
+
} else {
|
|
389
|
+
console.error(`Failed to create D1 database: ${errMsg}`);
|
|
390
|
+
process.exit(1);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
console.log("Creating Vectorize index...");
|
|
394
|
+
try {
|
|
395
|
+
wrangler(["vectorize", "create", `${name}-vectors`, "--dimensions", VECTORIZE_DIMENSIONS, "--metric", VECTORIZE_METRIC]);
|
|
396
|
+
console.log("Vectorize index created\n");
|
|
397
|
+
} catch (err) {
|
|
398
|
+
const errMsg = err.message;
|
|
399
|
+
if (errMsg.includes("already exists") || errMsg.includes("duplicate_name")) {
|
|
400
|
+
console.log("Vectorize index already exists, reusing\n");
|
|
401
|
+
} else {
|
|
402
|
+
console.error(`Failed to create Vectorize index: ${errMsg}`);
|
|
403
|
+
process.exit(1);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
console.log("Creating KV namespace for secrets...");
|
|
407
|
+
let kvId;
|
|
408
|
+
try {
|
|
409
|
+
kvId = ensureKvNamespace(name);
|
|
410
|
+
console.log(`KV namespace ready: ${kvId}
|
|
411
|
+
`);
|
|
412
|
+
} catch (err) {
|
|
413
|
+
console.error(`Failed to create KV namespace: ${err.message}`);
|
|
414
|
+
process.exit(1);
|
|
415
|
+
}
|
|
416
|
+
const apiKey = crypto2.randomBytes(API_KEY_BYTES).toString("hex");
|
|
417
|
+
console.log("Preparing worker deployment...");
|
|
418
|
+
const deployDir = prepareDeployDir(vaultDir, d1Id, kvId);
|
|
419
|
+
console.log("Setting API key secret...");
|
|
420
|
+
try {
|
|
421
|
+
runWrangler(["secret", "put", TEAM_API_KEY_SECRET, "--name", name], {
|
|
422
|
+
cwd: deployDir,
|
|
423
|
+
input: apiKey,
|
|
424
|
+
timeoutMs: WRANGLER_COMMAND_TIMEOUT_MS
|
|
425
|
+
});
|
|
426
|
+
console.log("Secret set\n");
|
|
427
|
+
} catch (err) {
|
|
428
|
+
console.error(`Failed to set API key secret: ${err.message}`);
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
console.log("Deploying worker...");
|
|
432
|
+
let workerUrl;
|
|
433
|
+
try {
|
|
434
|
+
const deployOutput = wrangler(["deploy"], { cwd: deployDir });
|
|
435
|
+
workerUrl = parseWorkerUrl(deployOutput);
|
|
436
|
+
console.log(`Worker deployed: ${workerUrl}
|
|
437
|
+
`);
|
|
438
|
+
} catch (err) {
|
|
439
|
+
console.error(`Failed to deploy worker: ${err.message}`);
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
console.log("Setting team configuration...");
|
|
443
|
+
try {
|
|
444
|
+
const { getMachineId } = await import("./machine-id-RCM7TXPJ.js");
|
|
445
|
+
const creatorMachineId = await getMachineId(vaultDir);
|
|
446
|
+
await fetch(`${workerUrl}/config`, {
|
|
447
|
+
method: "PUT",
|
|
448
|
+
headers: { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json" },
|
|
449
|
+
body: JSON.stringify({
|
|
450
|
+
team_name: name,
|
|
451
|
+
embedding_model: "@cf/baai/bge-m3",
|
|
452
|
+
embedding_dimensions: "1024",
|
|
453
|
+
created_at: String(Math.floor(Date.now() / 1e3)),
|
|
454
|
+
created_by: creatorMachineId
|
|
455
|
+
})
|
|
456
|
+
});
|
|
457
|
+
console.log("Team config saved\n");
|
|
458
|
+
} catch {
|
|
459
|
+
console.log("Warning: could not seed team config (non-fatal)\n");
|
|
460
|
+
}
|
|
461
|
+
let mcpToken = null;
|
|
462
|
+
try {
|
|
463
|
+
mcpToken = await rotateMcpTokenForWorker(workerUrl, apiKey);
|
|
464
|
+
} catch {
|
|
465
|
+
}
|
|
466
|
+
updateTeamConfig(vaultDir, {
|
|
467
|
+
enabled: true,
|
|
468
|
+
worker_url: workerUrl
|
|
469
|
+
});
|
|
470
|
+
writeSecret(vaultDir, TEAM_API_KEY_SECRET, apiKey);
|
|
471
|
+
if (mcpToken) writeSecret(vaultDir, TEAM_MCP_TOKEN_SECRET, mcpToken);
|
|
472
|
+
writeLocalConfig(vaultDir, {
|
|
473
|
+
worker_name: name,
|
|
474
|
+
worker_url: workerUrl,
|
|
475
|
+
package_version: getTeamPackageVersion(),
|
|
476
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
477
|
+
last_upgraded: (/* @__PURE__ */ new Date()).toISOString(),
|
|
478
|
+
config_version: TEAM_CONFIG_VERSION
|
|
479
|
+
});
|
|
480
|
+
console.log("Team sync configured!\n");
|
|
481
|
+
console.log(` URL: ${workerUrl}`);
|
|
482
|
+
console.log(` API Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`);
|
|
483
|
+
if (mcpToken) {
|
|
484
|
+
console.log(` MCP: ${mcpToken.slice(0, 8)}...${mcpToken.slice(-4)}`);
|
|
485
|
+
}
|
|
486
|
+
console.log("\nShare the URL and API key with teammates so they can connect.");
|
|
487
|
+
}
|
|
488
|
+
function upgradeWorker(vaultDir) {
|
|
489
|
+
const config = loadConfig(vaultDir);
|
|
490
|
+
if (!config.team.worker_url) {
|
|
491
|
+
return { success: false, error: "No team sync configured. Run: myco team init" };
|
|
492
|
+
}
|
|
493
|
+
migrateLegacyDeployDir(vaultDir);
|
|
494
|
+
const deployDir = resolveDeployDir(vaultDir);
|
|
495
|
+
const tomlPath = path4.join(deployDir, "wrangler.toml");
|
|
496
|
+
if (!fs4.existsSync(tomlPath)) {
|
|
497
|
+
return { success: false, error: "No deployment directory found. Run: myco team init" };
|
|
498
|
+
}
|
|
499
|
+
const existingToml = fs4.readFileSync(tomlPath, "utf-8");
|
|
500
|
+
const d1Match = existingToml.match(TOML_DB_ID_REGEX);
|
|
501
|
+
if (!d1Match || d1Match[1] === "<YOUR_D1_DATABASE_ID>") {
|
|
502
|
+
return { success: false, error: "Cannot determine D1 database ID from existing deployment. Run: myco team init" };
|
|
503
|
+
}
|
|
504
|
+
const d1Id = d1Match[1];
|
|
505
|
+
const nameMatch = existingToml.match(/^name\s*=\s*"([^"]*)"/m);
|
|
506
|
+
const dbNameMatch = existingToml.match(/database_name\s*=\s*"([^"]*)"/);
|
|
507
|
+
const indexNameMatch = existingToml.match(/index_name\s*=\s*"([^"]*)"/);
|
|
508
|
+
const workerName = nameMatch?.[1] ?? resourceName(vaultDir);
|
|
509
|
+
const kvMatch = existingToml.match(TOML_KV_ID_REGEX);
|
|
510
|
+
let kvId;
|
|
511
|
+
if (kvMatch) {
|
|
512
|
+
kvId = kvMatch[1];
|
|
513
|
+
} else {
|
|
514
|
+
try {
|
|
515
|
+
kvId = ensureKvNamespace(workerName);
|
|
516
|
+
} catch (err) {
|
|
517
|
+
return { success: false, error: `Failed to provision KV namespace: ${err.message}` };
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
try {
|
|
521
|
+
stageDeploymentDir({
|
|
522
|
+
sourceDir: locateWorkerSource(),
|
|
523
|
+
deployDir,
|
|
524
|
+
textPatches: [{
|
|
525
|
+
filePath: "wrangler.toml",
|
|
526
|
+
transforms: [
|
|
527
|
+
(toml) => toml.replace(TOML_NAME_REGEX, `name = "${workerName}"`),
|
|
528
|
+
(toml) => toml.replace(TOML_D1_PLACEHOLDER_REGEX, d1Id),
|
|
529
|
+
(toml) => toml.replace(TOML_DB_NAME_REGEX, `database_name = "${dbNameMatch?.[1] ?? workerName}"`),
|
|
530
|
+
(toml) => toml.replace(TOML_INDEX_NAME_REGEX, `index_name = "${indexNameMatch?.[1] ?? `${workerName}-vectors`}"`),
|
|
531
|
+
(toml) => toml.replace(TOML_KV_PLACEHOLDER_REGEX, kvId),
|
|
532
|
+
(toml) => toml.replace(TOML_TEAM_PACKAGE_VERSION_REGEX, `MYCO_TEAM_PACKAGE_VERSION = "${getTeamPackageVersion()}"`),
|
|
533
|
+
(toml) => toml.replace(TOML_MYCO_SCHEMA_VERSION_REGEX, `MYCO_SCHEMA_VERSION = "${getMycoSchemaVersion()}"`)
|
|
534
|
+
]
|
|
535
|
+
}],
|
|
536
|
+
installDepsTimeoutMs: WRANGLER_COMMAND_TIMEOUT_MS * 3
|
|
537
|
+
});
|
|
538
|
+
} catch (err) {
|
|
539
|
+
return { success: false, error: `Failed to install worker dependencies: ${err.message}` };
|
|
540
|
+
}
|
|
541
|
+
const secrets = readSecrets(vaultDir);
|
|
542
|
+
const apiKey = secrets[TEAM_API_KEY_SECRET];
|
|
543
|
+
if (apiKey) {
|
|
544
|
+
try {
|
|
545
|
+
runWrangler(["secret", "put", TEAM_API_KEY_SECRET, "--name", workerName], {
|
|
546
|
+
cwd: deployDir,
|
|
547
|
+
input: apiKey,
|
|
548
|
+
timeoutMs: WRANGLER_COMMAND_TIMEOUT_MS
|
|
549
|
+
});
|
|
550
|
+
} catch {
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
try {
|
|
554
|
+
const deployOutput = wrangler(["deploy"], { cwd: deployDir });
|
|
555
|
+
const workerUrl = parseWorkerUrl(deployOutput);
|
|
556
|
+
const version = getTeamPackageVersion();
|
|
557
|
+
updateTeamConfig(vaultDir, {
|
|
558
|
+
worker_url: workerUrl
|
|
559
|
+
});
|
|
560
|
+
const localConfig = readLocalConfig(vaultDir);
|
|
561
|
+
if (localConfig) {
|
|
562
|
+
writeLocalConfig(vaultDir, {
|
|
563
|
+
...localConfig,
|
|
564
|
+
worker_name: workerName,
|
|
565
|
+
worker_url: workerUrl,
|
|
566
|
+
package_version: version,
|
|
567
|
+
last_upgraded: (/* @__PURE__ */ new Date()).toISOString()
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
return { success: true, worker_url: workerUrl, version };
|
|
571
|
+
} catch (err) {
|
|
572
|
+
return { success: false, error: `Failed to deploy worker: ${err.message}` };
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
async function teamUpgrade(vaultDir) {
|
|
576
|
+
console.log("Upgrading team sync worker...\n");
|
|
577
|
+
const result = upgradeWorker(vaultDir);
|
|
578
|
+
if (!result.success) {
|
|
579
|
+
console.error(result.error);
|
|
580
|
+
process.exit(1);
|
|
581
|
+
}
|
|
582
|
+
console.log(`Worker deployed: ${result.worker_url}`);
|
|
583
|
+
console.log(`Version: ${result.version}`);
|
|
584
|
+
console.log("\nUpgrade complete.");
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
export {
|
|
588
|
+
readSecrets,
|
|
589
|
+
writeSecret,
|
|
590
|
+
loadSecrets,
|
|
591
|
+
resolveVaultConfigPath,
|
|
592
|
+
readJsonConfig,
|
|
593
|
+
getTeamPackageVersion,
|
|
594
|
+
teamInit,
|
|
595
|
+
upgradeWorker,
|
|
596
|
+
teamUpgrade
|
|
597
|
+
};
|
|
598
|
+
//# sourceMappingURL=chunk-CDM6ZLMZ.js.map
|