@goondocks/myco 0.6.4 → 0.9.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/.claude-plugin/marketplace.json +2 -3
- package/.claude-plugin/plugin.json +3 -3
- package/CONTRIBUTING.md +37 -30
- package/README.md +64 -28
- package/bin/myco-run +2 -0
- package/dist/agent-run-EFICNTAU.js +34 -0
- package/dist/agent-run-EFICNTAU.js.map +1 -0
- package/dist/agent-tasks-RXJ7Z5NG.js +180 -0
- package/dist/agent-tasks-RXJ7Z5NG.js.map +1 -0
- package/dist/chunk-2T7RPVPP.js +116 -0
- package/dist/chunk-2T7RPVPP.js.map +1 -0
- package/dist/chunk-3K5WGSJ4.js +165 -0
- package/dist/chunk-3K5WGSJ4.js.map +1 -0
- package/dist/chunk-46PWOKSI.js +26 -0
- package/dist/chunk-46PWOKSI.js.map +1 -0
- package/dist/chunk-4LPQ26CK.js +277 -0
- package/dist/chunk-4LPQ26CK.js.map +1 -0
- package/dist/chunk-5PEUFJ6U.js +92 -0
- package/dist/chunk-5PEUFJ6U.js.map +1 -0
- package/dist/chunk-5VZ52A4T.js +136 -0
- package/dist/chunk-5VZ52A4T.js.map +1 -0
- package/dist/chunk-BUSP3OJB.js +103 -0
- package/dist/chunk-BUSP3OJB.js.map +1 -0
- package/dist/chunk-D7TYRPRM.js +7312 -0
- package/dist/chunk-D7TYRPRM.js.map +1 -0
- package/dist/chunk-DCXRSSBP.js +22 -0
- package/dist/chunk-DCXRSSBP.js.map +1 -0
- package/dist/chunk-E4VLWIJC.js +2 -0
- package/dist/chunk-FFAYUQ5N.js +39 -0
- package/dist/chunk-FFAYUQ5N.js.map +1 -0
- package/dist/chunk-IB76KGBY.js +2 -0
- package/dist/chunk-JMJJEQ3P.js +486 -0
- package/dist/chunk-JMJJEQ3P.js.map +1 -0
- package/dist/{chunk-N33KUCFP.js → chunk-JTYZRPX5.js} +1 -9
- package/dist/chunk-JTYZRPX5.js.map +1 -0
- package/dist/{chunk-NLUE6CYG.js → chunk-JYOOJCPQ.js} +33 -17
- package/dist/chunk-JYOOJCPQ.js.map +1 -0
- package/dist/{chunk-Z74SDEKE.js → chunk-KB4DGYIY.js} +91 -9
- package/dist/chunk-KB4DGYIY.js.map +1 -0
- package/dist/{chunk-ERG2IEWX.js → chunk-KH64DHOY.js} +3 -7413
- package/dist/chunk-KH64DHOY.js.map +1 -0
- package/dist/chunk-KV4OC4H3.js +498 -0
- package/dist/chunk-KV4OC4H3.js.map +1 -0
- package/dist/chunk-KYLDNM7H.js +66 -0
- package/dist/chunk-KYLDNM7H.js.map +1 -0
- package/dist/chunk-LPUQPDC2.js +19 -0
- package/dist/chunk-LPUQPDC2.js.map +1 -0
- package/dist/chunk-M5XWW7UI.js +97 -0
- package/dist/chunk-M5XWW7UI.js.map +1 -0
- package/dist/chunk-MHSCMET3.js +275 -0
- package/dist/chunk-MHSCMET3.js.map +1 -0
- package/dist/chunk-MYX5NCRH.js +45 -0
- package/dist/chunk-MYX5NCRH.js.map +1 -0
- package/dist/chunk-OXZSXYAT.js +877 -0
- package/dist/chunk-OXZSXYAT.js.map +1 -0
- package/dist/chunk-PB6TOLRQ.js +35 -0
- package/dist/chunk-PB6TOLRQ.js.map +1 -0
- package/dist/chunk-PT5IC642.js +162 -0
- package/dist/chunk-PT5IC642.js.map +1 -0
- package/dist/chunk-QIK2XSDQ.js +187 -0
- package/dist/chunk-QIK2XSDQ.js.map +1 -0
- package/dist/chunk-RJ6ZQKG5.js +26 -0
- package/dist/chunk-RJ6ZQKG5.js.map +1 -0
- package/dist/{chunk-YIQLYIHW.js → chunk-TRUJLI6K.js} +29 -43
- package/dist/chunk-TRUJLI6K.js.map +1 -0
- package/dist/chunk-U3IBO3O3.js +41 -0
- package/dist/chunk-U3IBO3O3.js.map +1 -0
- package/dist/{chunk-7WHF2OIZ.js → chunk-UBZPD4HN.js} +25 -7
- package/dist/chunk-UBZPD4HN.js.map +1 -0
- package/dist/{chunk-HIN3UVOG.js → chunk-V7XG6V6C.js} +20 -11
- package/dist/chunk-V7XG6V6C.js.map +1 -0
- package/dist/chunk-WGTCA2NU.js +84 -0
- package/dist/chunk-WGTCA2NU.js.map +1 -0
- package/dist/{chunk-O6PERU7U.js → chunk-XNOCTDHF.js} +2 -2
- package/dist/chunk-YDN4OM33.js +80 -0
- package/dist/chunk-YDN4OM33.js.map +1 -0
- package/dist/cli-ODLFRIYS.js +128 -0
- package/dist/cli-ODLFRIYS.js.map +1 -0
- package/dist/client-EYOTW3JU.js +19 -0
- package/dist/client-MXRNQ5FI.js +13 -0
- package/dist/{config-IBS6KOLQ.js → config-UR5BSGVX.js} +21 -34
- package/dist/config-UR5BSGVX.js.map +1 -0
- package/dist/detect-H5OPI7GD.js +17 -0
- package/dist/detect-H5OPI7GD.js.map +1 -0
- package/dist/detect-providers-Q42OD4OS.js +26 -0
- package/dist/detect-providers-Q42OD4OS.js.map +1 -0
- package/dist/doctor-JLKTXDEH.js +258 -0
- package/dist/doctor-JLKTXDEH.js.map +1 -0
- package/dist/executor-ONSDHPGX.js +1441 -0
- package/dist/executor-ONSDHPGX.js.map +1 -0
- package/dist/init-6GWY345B.js +198 -0
- package/dist/init-6GWY345B.js.map +1 -0
- package/dist/init-wizard-UONLDYLI.js +294 -0
- package/dist/init-wizard-UONLDYLI.js.map +1 -0
- package/dist/llm-BV3QNVRD.js +17 -0
- package/dist/llm-BV3QNVRD.js.map +1 -0
- package/dist/loader-SH67XD54.js +28 -0
- package/dist/loader-SH67XD54.js.map +1 -0
- package/dist/loader-XVXKZZDH.js +18 -0
- package/dist/loader-XVXKZZDH.js.map +1 -0
- package/dist/{chunk-H7PRCVGQ.js → logs-QZVYF6FP.js} +74 -5
- package/dist/logs-QZVYF6FP.js.map +1 -0
- package/dist/main-BMCL7CPO.js +4393 -0
- package/dist/main-BMCL7CPO.js.map +1 -0
- package/dist/openai-embeddings-C265WRNK.js +14 -0
- package/dist/openai-embeddings-C265WRNK.js.map +1 -0
- package/dist/openrouter-U6VFCRX2.js +14 -0
- package/dist/openrouter-U6VFCRX2.js.map +1 -0
- package/dist/post-compact-OWFSOITU.js +26 -0
- package/dist/post-compact-OWFSOITU.js.map +1 -0
- package/dist/post-tool-use-DOUM7CGQ.js +56 -0
- package/dist/post-tool-use-DOUM7CGQ.js.map +1 -0
- package/dist/post-tool-use-failure-SG3C7PE6.js +28 -0
- package/dist/post-tool-use-failure-SG3C7PE6.js.map +1 -0
- package/dist/pre-compact-3J33CHXQ.js +25 -0
- package/dist/pre-compact-3J33CHXQ.js.map +1 -0
- package/dist/provider-check-3WBPZADE.js +12 -0
- package/dist/provider-check-3WBPZADE.js.map +1 -0
- package/dist/registry-J4XTWARS.js +25 -0
- package/dist/registry-J4XTWARS.js.map +1 -0
- package/dist/resolution-events-TFEQPVKS.js +12 -0
- package/dist/resolution-events-TFEQPVKS.js.map +1 -0
- package/dist/resolve-3FEUV462.js +9 -0
- package/dist/resolve-3FEUV462.js.map +1 -0
- package/dist/{restart-XCMILOL5.js → restart-2VM33WOB.js} +10 -6
- package/dist/{restart-XCMILOL5.js.map → restart-2VM33WOB.js.map} +1 -1
- package/dist/search-ZGQR5MDE.js +91 -0
- package/dist/search-ZGQR5MDE.js.map +1 -0
- package/dist/{server-6UDN35QN.js → server-6KMBJCHZ.js} +308 -517
- package/dist/server-6KMBJCHZ.js.map +1 -0
- package/dist/session-Z2FXDDG6.js +68 -0
- package/dist/session-Z2FXDDG6.js.map +1 -0
- package/dist/session-end-FLVX32LE.js +38 -0
- package/dist/session-end-FLVX32LE.js.map +1 -0
- package/dist/session-start-UCLK7PXE.js +169 -0
- package/dist/session-start-UCLK7PXE.js.map +1 -0
- package/dist/setup-digest-4KDSXAIV.js +15 -0
- package/dist/setup-digest-4KDSXAIV.js.map +1 -0
- package/dist/setup-llm-GKMCHURK.js +81 -0
- package/dist/setup-llm-GKMCHURK.js.map +1 -0
- package/dist/src/agent/definitions/agent.yaml +35 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +84 -0
- package/dist/src/agent/definitions/tasks/extract-only.yaml +87 -0
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +472 -0
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +92 -0
- package/dist/src/agent/definitions/tasks/review-session.yaml +132 -0
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +86 -0
- package/dist/src/agent/definitions/tasks/title-summary.yaml +88 -0
- package/dist/src/agent/prompts/agent.md +121 -0
- package/dist/src/agent/prompts/orchestrator.md +91 -0
- package/dist/src/cli.js +1 -8
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon/main.js +1 -8
- package/dist/src/daemon/main.js.map +1 -1
- package/dist/src/hooks/post-tool-use.js +3 -50
- package/dist/src/hooks/post-tool-use.js.map +1 -1
- package/dist/src/hooks/session-end.js +3 -32
- package/dist/src/hooks/session-end.js.map +1 -1
- package/dist/src/hooks/session-start.js +2 -8
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/stop.js +3 -42
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/hooks/user-prompt-submit.js +3 -53
- package/dist/src/hooks/user-prompt-submit.js.map +1 -1
- package/dist/src/mcp/server.js +1 -8
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/prompts/digest-system.md +1 -1
- package/dist/src/symbionts/manifests/claude-code.yaml +16 -0
- package/dist/src/symbionts/manifests/cursor.yaml +14 -0
- package/dist/stats-IUJPZSVZ.js +94 -0
- package/dist/stats-IUJPZSVZ.js.map +1 -0
- package/dist/stop-XRQLLXST.js +42 -0
- package/dist/stop-XRQLLXST.js.map +1 -0
- package/dist/stop-failure-2CAJJKRG.js +26 -0
- package/dist/stop-failure-2CAJJKRG.js.map +1 -0
- package/dist/subagent-start-MWWQTZMQ.js +26 -0
- package/dist/subagent-start-MWWQTZMQ.js.map +1 -0
- package/dist/subagent-stop-PJXYGRXB.js +28 -0
- package/dist/subagent-stop-PJXYGRXB.js.map +1 -0
- package/dist/task-completed-4LFRJVGI.js +27 -0
- package/dist/task-completed-4LFRJVGI.js.map +1 -0
- package/dist/ui/assets/index-DZrElonz.js +744 -0
- package/dist/ui/assets/index-TkeiYbZB.css +1 -0
- package/dist/ui/favicon.svg +7 -7
- package/dist/ui/fonts/Inter-Variable.woff2 +0 -0
- package/dist/ui/fonts/JetBrainsMono-Variable.woff2 +0 -0
- package/dist/ui/fonts/Newsreader-Italic-Variable.woff2 +0 -0
- package/dist/ui/fonts/Newsreader-Variable.woff2 +0 -0
- package/dist/ui/index.html +2 -2
- package/dist/user-prompt-submit-KSM3AR6P.js +59 -0
- package/dist/user-prompt-submit-KSM3AR6P.js.map +1 -0
- package/dist/{verify-TOWQHPBX.js → verify-UDAYVX37.js} +17 -22
- package/dist/verify-UDAYVX37.js.map +1 -0
- package/dist/{version-36RVCQA6.js → version-KLBN4HZT.js} +3 -4
- package/dist/version-KLBN4HZT.js.map +1 -0
- package/hooks/hooks.json +82 -5
- package/package.json +6 -3
- package/skills/myco/SKILL.md +10 -10
- package/skills/myco/references/cli-usage.md +15 -13
- package/skills/myco/references/vault-status.md +3 -3
- package/skills/myco/references/wisdom.md +4 -4
- package/skills/myco-curate/SKILL.md +86 -0
- package/dist/chunk-2ZIBCEYO.js +0 -113
- package/dist/chunk-2ZIBCEYO.js.map +0 -1
- package/dist/chunk-4RMSHZE4.js +0 -107
- package/dist/chunk-4RMSHZE4.js.map +0 -1
- package/dist/chunk-4XVKZ3WA.js +0 -1078
- package/dist/chunk-4XVKZ3WA.js.map +0 -1
- package/dist/chunk-6FQISQNA.js +0 -61
- package/dist/chunk-6FQISQNA.js.map +0 -1
- package/dist/chunk-7WHF2OIZ.js.map +0 -1
- package/dist/chunk-ERG2IEWX.js.map +0 -1
- package/dist/chunk-FPRXMJLT.js +0 -56
- package/dist/chunk-FPRXMJLT.js.map +0 -1
- package/dist/chunk-GENQ5QGP.js +0 -37
- package/dist/chunk-GENQ5QGP.js.map +0 -1
- package/dist/chunk-H7PRCVGQ.js.map +0 -1
- package/dist/chunk-HIN3UVOG.js.map +0 -1
- package/dist/chunk-HYVT345Y.js +0 -159
- package/dist/chunk-HYVT345Y.js.map +0 -1
- package/dist/chunk-J4D4CROB.js +0 -143
- package/dist/chunk-J4D4CROB.js.map +0 -1
- package/dist/chunk-MDLSAFPP.js +0 -99
- package/dist/chunk-MDLSAFPP.js.map +0 -1
- package/dist/chunk-N33KUCFP.js.map +0 -1
- package/dist/chunk-NL6WQO56.js +0 -65
- package/dist/chunk-NL6WQO56.js.map +0 -1
- package/dist/chunk-NLUE6CYG.js.map +0 -1
- package/dist/chunk-P723N2LP.js +0 -147
- package/dist/chunk-P723N2LP.js.map +0 -1
- package/dist/chunk-QLUE3BUL.js +0 -161
- package/dist/chunk-QLUE3BUL.js.map +0 -1
- package/dist/chunk-QN4W3JUA.js +0 -43
- package/dist/chunk-QN4W3JUA.js.map +0 -1
- package/dist/chunk-RGVBGTD6.js +0 -21
- package/dist/chunk-RGVBGTD6.js.map +0 -1
- package/dist/chunk-TWSTAVLO.js +0 -132
- package/dist/chunk-TWSTAVLO.js.map +0 -1
- package/dist/chunk-UP4P4OAA.js +0 -4423
- package/dist/chunk-UP4P4OAA.js.map +0 -1
- package/dist/chunk-YIQLYIHW.js.map +0 -1
- package/dist/chunk-YTFXA4RX.js +0 -86
- package/dist/chunk-YTFXA4RX.js.map +0 -1
- package/dist/chunk-Z74SDEKE.js.map +0 -1
- package/dist/cli-IHILSS6N.js +0 -97
- package/dist/cli-IHILSS6N.js.map +0 -1
- package/dist/client-AGFNR2S4.js +0 -12
- package/dist/config-IBS6KOLQ.js.map +0 -1
- package/dist/curate-3D4GHKJH.js +0 -78
- package/dist/curate-3D4GHKJH.js.map +0 -1
- package/dist/detect-providers-XEP4QA3R.js +0 -35
- package/dist/detect-providers-XEP4QA3R.js.map +0 -1
- package/dist/digest-7HLJXL77.js +0 -85
- package/dist/digest-7HLJXL77.js.map +0 -1
- package/dist/init-ARQ53JOR.js +0 -109
- package/dist/init-ARQ53JOR.js.map +0 -1
- package/dist/logs-IENORIYR.js +0 -84
- package/dist/logs-IENORIYR.js.map +0 -1
- package/dist/main-6AGPIMH2.js +0 -5715
- package/dist/main-6AGPIMH2.js.map +0 -1
- package/dist/rebuild-Q2ACEB6F.js +0 -64
- package/dist/rebuild-Q2ACEB6F.js.map +0 -1
- package/dist/reprocess-CDEFGQOV.js +0 -79
- package/dist/reprocess-CDEFGQOV.js.map +0 -1
- package/dist/search-7W25SKCB.js +0 -120
- package/dist/search-7W25SKCB.js.map +0 -1
- package/dist/server-6UDN35QN.js.map +0 -1
- package/dist/session-F326AWCH.js +0 -44
- package/dist/session-F326AWCH.js.map +0 -1
- package/dist/session-start-K6IGAC7H.js +0 -192
- package/dist/session-start-K6IGAC7H.js.map +0 -1
- package/dist/setup-digest-X5PN27F4.js +0 -15
- package/dist/setup-llm-S5OHQJXK.js +0 -15
- package/dist/src/prompts/classification.md +0 -43
- package/dist/stats-TTSDXGJV.js +0 -58
- package/dist/stats-TTSDXGJV.js.map +0 -1
- package/dist/templates-XPRBOWCE.js +0 -38
- package/dist/templates-XPRBOWCE.js.map +0 -1
- package/dist/ui/assets/index-08wKT7wS.css +0 -1
- package/dist/ui/assets/index-CMSMi4Jb.js +0 -369
- package/dist/verify-TOWQHPBX.js.map +0 -1
- package/skills/setup/SKILL.md +0 -174
- package/skills/setup/references/model-recommendations.md +0 -83
- /package/dist/{client-AGFNR2S4.js.map → chunk-E4VLWIJC.js.map} +0 -0
- /package/dist/{setup-digest-X5PN27F4.js.map → chunk-IB76KGBY.js.map} +0 -0
- /package/dist/{chunk-O6PERU7U.js.map → chunk-XNOCTDHF.js.map} +0 -0
- /package/dist/{setup-llm-S5OHQJXK.js.map → client-EYOTW3JU.js.map} +0 -0
- /package/dist/{version-36RVCQA6.js.map → client-MXRNQ5FI.js.map} +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
OpenRouterEmbeddingProvider
|
|
4
|
+
} from "./chunk-46PWOKSI.js";
|
|
5
|
+
import {
|
|
6
|
+
OpenAIEmbeddingProvider
|
|
7
|
+
} from "./chunk-RJ6ZQKG5.js";
|
|
8
|
+
import "./chunk-KYLDNM7H.js";
|
|
9
|
+
import {
|
|
10
|
+
LmStudioBackend,
|
|
11
|
+
OllamaBackend
|
|
12
|
+
} from "./chunk-UBZPD4HN.js";
|
|
13
|
+
import {
|
|
14
|
+
DEFAULT_OLLAMA_EMBEDDING_MODEL,
|
|
15
|
+
DEFAULT_OPENAI_EMBEDDING_MODEL,
|
|
16
|
+
PROVIDER_DETECT_TIMEOUT_MS,
|
|
17
|
+
RECOMMENDED_LOCAL_CONTEXT_WINDOW
|
|
18
|
+
} from "./chunk-5VZ52A4T.js";
|
|
19
|
+
import "./chunk-WGTCA2NU.js";
|
|
20
|
+
import {
|
|
21
|
+
getPluginVersion
|
|
22
|
+
} from "./chunk-PB6TOLRQ.js";
|
|
23
|
+
import "./chunk-LPUQPDC2.js";
|
|
24
|
+
import "./chunk-PZUWP5VK.js";
|
|
25
|
+
|
|
26
|
+
// src/cli/init-wizard.ts
|
|
27
|
+
import { select, input, password } from "@inquirer/prompts";
|
|
28
|
+
function buildEmbeddingConfig(answers) {
|
|
29
|
+
if (answers.embeddingProvider === "skip") {
|
|
30
|
+
return {
|
|
31
|
+
provider: "ollama",
|
|
32
|
+
model: DEFAULT_OLLAMA_EMBEDDING_MODEL
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
provider: answers.embeddingProvider,
|
|
37
|
+
model: answers.embeddingModel ?? DEFAULT_OLLAMA_EMBEDDING_MODEL
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function buildAgentConfig(answers) {
|
|
41
|
+
if (answers.intelligenceProvider === "cloud") {
|
|
42
|
+
return { provider: { type: "cloud" } };
|
|
43
|
+
}
|
|
44
|
+
const provider = {
|
|
45
|
+
type: answers.intelligenceProvider
|
|
46
|
+
};
|
|
47
|
+
if (answers.intelligenceBaseUrl) provider.base_url = answers.intelligenceBaseUrl;
|
|
48
|
+
if (answers.intelligenceModel) provider.model = answers.intelligenceModel;
|
|
49
|
+
return {
|
|
50
|
+
provider,
|
|
51
|
+
model: answers.intelligenceModel
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function printBanner() {
|
|
55
|
+
const version = getPluginVersion();
|
|
56
|
+
console.log("");
|
|
57
|
+
console.log(" \u{1F344} Myco");
|
|
58
|
+
console.log(` v${version} \u2014 Collective Agent Intelligence`);
|
|
59
|
+
console.log(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
|
|
60
|
+
console.log("");
|
|
61
|
+
}
|
|
62
|
+
function ollamaInstallHint() {
|
|
63
|
+
if (process.platform === "darwin") {
|
|
64
|
+
return "Install: brew install ollama && ollama serve";
|
|
65
|
+
}
|
|
66
|
+
if (process.platform === "linux") {
|
|
67
|
+
return "Install: curl -fsSL https://ollama.com/install.sh | sh";
|
|
68
|
+
}
|
|
69
|
+
return "Install: https://ollama.com/download";
|
|
70
|
+
}
|
|
71
|
+
function printLocalModelTip() {
|
|
72
|
+
console.log("");
|
|
73
|
+
console.log(` Tip: For local models, we recommend an ${RECOMMENDED_LOCAL_CONTEXT_WINDOW / 1024}K context window.`);
|
|
74
|
+
console.log(" Set in myco.yaml under agent.tasks or configure via the dashboard.");
|
|
75
|
+
console.log("");
|
|
76
|
+
}
|
|
77
|
+
async function selectLocalIntelligenceModel(backend, providerName) {
|
|
78
|
+
const available = await backend.isAvailable();
|
|
79
|
+
if (!available) {
|
|
80
|
+
console.log("");
|
|
81
|
+
console.log(` ${providerName} is not running.`);
|
|
82
|
+
if (providerName === "Ollama") {
|
|
83
|
+
console.log(` ${ollamaInstallHint()}`);
|
|
84
|
+
} else {
|
|
85
|
+
console.log(" Start LM Studio and enable the local server.");
|
|
86
|
+
}
|
|
87
|
+
console.log("");
|
|
88
|
+
const action = await select({
|
|
89
|
+
message: `${providerName} is not available. What would you like to do?`,
|
|
90
|
+
choices: [
|
|
91
|
+
{ name: `Retry (after starting ${providerName})`, value: "retry" },
|
|
92
|
+
{ name: "Continue without selecting a model", value: "skip" }
|
|
93
|
+
]
|
|
94
|
+
});
|
|
95
|
+
if (action === "retry") {
|
|
96
|
+
return selectLocalIntelligenceModel(backend, providerName);
|
|
97
|
+
}
|
|
98
|
+
return {};
|
|
99
|
+
}
|
|
100
|
+
const models = await backend.listModels(PROVIDER_DETECT_TIMEOUT_MS);
|
|
101
|
+
let model;
|
|
102
|
+
if (models.length > 0) {
|
|
103
|
+
model = await select({
|
|
104
|
+
message: `Select an intelligence model from ${providerName}:`,
|
|
105
|
+
choices: [
|
|
106
|
+
...models.map((m) => ({ name: m, value: m })),
|
|
107
|
+
{ name: "Enter model name manually", value: "__manual__" }
|
|
108
|
+
],
|
|
109
|
+
default: models[0]
|
|
110
|
+
});
|
|
111
|
+
} else {
|
|
112
|
+
console.log(` No models found in ${providerName}.`);
|
|
113
|
+
model = "__manual__";
|
|
114
|
+
}
|
|
115
|
+
if (model === "__manual__") {
|
|
116
|
+
model = await input({
|
|
117
|
+
message: "Model name:"
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
printLocalModelTip();
|
|
121
|
+
return { model: model || void 0 };
|
|
122
|
+
}
|
|
123
|
+
async function selectIntelligenceProvider() {
|
|
124
|
+
const provider = await select({
|
|
125
|
+
message: "How should Myco run intelligence tasks (extraction, summarization)?",
|
|
126
|
+
choices: [
|
|
127
|
+
{ name: "Cloud (Claude) \u2014 fast, requires Anthropic API key in env", value: "cloud" },
|
|
128
|
+
{ name: "Ollama (local, free)", value: "ollama" },
|
|
129
|
+
{ name: "LM Studio (local)", value: "lmstudio" }
|
|
130
|
+
],
|
|
131
|
+
default: "cloud"
|
|
132
|
+
});
|
|
133
|
+
if (provider === "cloud") {
|
|
134
|
+
return { intelligenceProvider: "cloud" };
|
|
135
|
+
}
|
|
136
|
+
if (provider === "ollama") {
|
|
137
|
+
const backend2 = new OllamaBackend();
|
|
138
|
+
const result2 = await selectLocalIntelligenceModel(backend2, "Ollama");
|
|
139
|
+
return {
|
|
140
|
+
intelligenceProvider: "ollama",
|
|
141
|
+
intelligenceModel: result2.model
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const backend = new LmStudioBackend();
|
|
145
|
+
const result = await selectLocalIntelligenceModel(backend, "LM Studio");
|
|
146
|
+
return {
|
|
147
|
+
intelligenceProvider: "lmstudio",
|
|
148
|
+
intelligenceModel: result.model,
|
|
149
|
+
intelligenceBaseUrl: result.baseUrl
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async function selectOllamaEmbeddingModel() {
|
|
153
|
+
const backend = new OllamaBackend();
|
|
154
|
+
const available = await backend.isAvailable();
|
|
155
|
+
if (!available) {
|
|
156
|
+
console.log("");
|
|
157
|
+
console.log(` Ollama is not running. ${ollamaInstallHint()}`);
|
|
158
|
+
console.log("");
|
|
159
|
+
const action = await select({
|
|
160
|
+
message: "Ollama is not available. What would you like to do?",
|
|
161
|
+
choices: [
|
|
162
|
+
{ name: "Retry (after starting Ollama)", value: "retry" },
|
|
163
|
+
{ name: "Switch to a cloud provider", value: "switch" },
|
|
164
|
+
{ name: "Skip embedding setup", value: "skip" }
|
|
165
|
+
]
|
|
166
|
+
});
|
|
167
|
+
if (action === "retry") {
|
|
168
|
+
return selectOllamaEmbeddingModel();
|
|
169
|
+
}
|
|
170
|
+
if (action === "switch") {
|
|
171
|
+
return selectCloudEmbeddingProvider();
|
|
172
|
+
}
|
|
173
|
+
return { embeddingProvider: "skip" };
|
|
174
|
+
}
|
|
175
|
+
const models = await backend.listModels(PROVIDER_DETECT_TIMEOUT_MS);
|
|
176
|
+
const embeddingModels = models.filter(
|
|
177
|
+
(m) => m.includes("bge") || m.includes("embed") || m.includes("nomic")
|
|
178
|
+
);
|
|
179
|
+
let embeddingModel;
|
|
180
|
+
if (embeddingModels.length > 0) {
|
|
181
|
+
embeddingModel = await select({
|
|
182
|
+
message: "Select an embedding model:",
|
|
183
|
+
choices: [
|
|
184
|
+
...embeddingModels.map((m) => ({ name: m, value: m })),
|
|
185
|
+
{ name: "Enter model name manually", value: "__manual__" }
|
|
186
|
+
],
|
|
187
|
+
default: embeddingModels.includes(DEFAULT_OLLAMA_EMBEDDING_MODEL) ? DEFAULT_OLLAMA_EMBEDDING_MODEL : embeddingModels[0]
|
|
188
|
+
});
|
|
189
|
+
} else {
|
|
190
|
+
console.log(` No embedding models found. Pull one first: ollama pull ${DEFAULT_OLLAMA_EMBEDDING_MODEL}`);
|
|
191
|
+
embeddingModel = "__manual__";
|
|
192
|
+
}
|
|
193
|
+
if (embeddingModel === "__manual__") {
|
|
194
|
+
embeddingModel = await input({
|
|
195
|
+
message: "Embedding model name:",
|
|
196
|
+
default: DEFAULT_OLLAMA_EMBEDDING_MODEL
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return { embeddingProvider: "ollama", embeddingModel };
|
|
200
|
+
}
|
|
201
|
+
async function selectCloudEmbeddingProvider() {
|
|
202
|
+
const provider = await select({
|
|
203
|
+
message: "Select a cloud embedding provider:",
|
|
204
|
+
choices: [
|
|
205
|
+
{ name: "OpenRouter (many models, one API key)", value: "openrouter" },
|
|
206
|
+
{ name: "OpenAI (text-embedding-3-small)", value: "openai" }
|
|
207
|
+
]
|
|
208
|
+
});
|
|
209
|
+
return selectCloudEmbeddingModel(provider);
|
|
210
|
+
}
|
|
211
|
+
async function selectCloudEmbeddingModel(provider) {
|
|
212
|
+
const apiKey = await password({
|
|
213
|
+
message: `Enter your ${provider === "openrouter" ? "OpenRouter" : "OpenAI"} API key:`,
|
|
214
|
+
mask: "*"
|
|
215
|
+
});
|
|
216
|
+
if (!apiKey) {
|
|
217
|
+
console.log(" No API key provided. Skipping embedding setup.");
|
|
218
|
+
return { embeddingProvider: "skip" };
|
|
219
|
+
}
|
|
220
|
+
let models = [];
|
|
221
|
+
try {
|
|
222
|
+
if (provider === "openrouter") {
|
|
223
|
+
const p = new OpenRouterEmbeddingProvider({ api_key: apiKey });
|
|
224
|
+
models = await p.listModels(PROVIDER_DETECT_TIMEOUT_MS);
|
|
225
|
+
} else {
|
|
226
|
+
const p = new OpenAIEmbeddingProvider({ api_key: apiKey });
|
|
227
|
+
models = await p.listModels(PROVIDER_DETECT_TIMEOUT_MS);
|
|
228
|
+
}
|
|
229
|
+
} catch {
|
|
230
|
+
}
|
|
231
|
+
let embeddingModel;
|
|
232
|
+
if (models.length > 0) {
|
|
233
|
+
const defaultModel = provider === "openrouter" ? `openai/${DEFAULT_OPENAI_EMBEDDING_MODEL}` : DEFAULT_OPENAI_EMBEDDING_MODEL;
|
|
234
|
+
embeddingModel = await select({
|
|
235
|
+
message: "Select an embedding model:",
|
|
236
|
+
choices: [
|
|
237
|
+
...models.map((m) => ({ name: m, value: m })),
|
|
238
|
+
{ name: "Enter model ID manually", value: "__manual__" }
|
|
239
|
+
],
|
|
240
|
+
default: models.includes(defaultModel) ? defaultModel : models[0]
|
|
241
|
+
});
|
|
242
|
+
} else {
|
|
243
|
+
console.log(" Could not fetch model list. Enter the model ID manually.");
|
|
244
|
+
embeddingModel = "__manual__";
|
|
245
|
+
}
|
|
246
|
+
if (embeddingModel === "__manual__") {
|
|
247
|
+
const defaultModel = provider === "openrouter" ? `openai/${DEFAULT_OPENAI_EMBEDDING_MODEL}` : DEFAULT_OPENAI_EMBEDDING_MODEL;
|
|
248
|
+
embeddingModel = await input({
|
|
249
|
+
message: "Embedding model ID:",
|
|
250
|
+
default: defaultModel
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
embeddingProvider: provider,
|
|
255
|
+
embeddingModel,
|
|
256
|
+
embeddingApiKey: apiKey
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
async function runWizard() {
|
|
260
|
+
const intelligenceAnswers = await selectIntelligenceProvider();
|
|
261
|
+
const embeddingChoice = await select({
|
|
262
|
+
message: "How would you like to generate embeddings?",
|
|
263
|
+
choices: [
|
|
264
|
+
{ name: "Ollama (local, free, recommended)", value: "ollama" },
|
|
265
|
+
{ name: "Cloud provider (OpenRouter or OpenAI)", value: "cloud" },
|
|
266
|
+
{ name: "Skip for now (embeddings disabled)", value: "skip" }
|
|
267
|
+
],
|
|
268
|
+
default: "ollama"
|
|
269
|
+
});
|
|
270
|
+
let embeddingAnswers;
|
|
271
|
+
if (embeddingChoice === "skip") {
|
|
272
|
+
console.log("");
|
|
273
|
+
console.log(" Skipping embedding setup. Semantic search and context injection");
|
|
274
|
+
console.log(" will be disabled until you configure an embedding provider.");
|
|
275
|
+
console.log(" Run `myco config` later to set one up.");
|
|
276
|
+
console.log("");
|
|
277
|
+
embeddingAnswers = { embeddingProvider: "skip" };
|
|
278
|
+
} else if (embeddingChoice === "cloud") {
|
|
279
|
+
embeddingAnswers = await selectCloudEmbeddingProvider();
|
|
280
|
+
} else {
|
|
281
|
+
embeddingAnswers = await selectOllamaEmbeddingModel();
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
...intelligenceAnswers,
|
|
285
|
+
...embeddingAnswers
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
export {
|
|
289
|
+
buildAgentConfig,
|
|
290
|
+
buildEmbeddingConfig,
|
|
291
|
+
printBanner,
|
|
292
|
+
runWizard
|
|
293
|
+
};
|
|
294
|
+
//# sourceMappingURL=init-wizard-UONLDYLI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/init-wizard.ts"],"sourcesContent":["/**\n * Interactive init wizard for `myco init`.\n * Collects intelligence provider and embedding provider configuration\n * from the user via @inquirer/prompts.\n * The pure `buildEmbeddingConfig` and `buildAgentConfig` functions are\n * exported separately for testing.\n */\nimport { select, input, password } from '@inquirer/prompts';\nimport { OllamaBackend } from '../intelligence/ollama.js';\nimport { LmStudioBackend } from '../intelligence/lm-studio.js';\nimport { OpenRouterEmbeddingProvider } from './providers/openrouter.js';\nimport { OpenAIEmbeddingProvider } from './providers/openai-embeddings.js';\nimport {\n PROVIDER_DETECT_TIMEOUT_MS,\n DEFAULT_OLLAMA_EMBEDDING_MODEL,\n DEFAULT_OPENAI_EMBEDDING_MODEL,\n RECOMMENDED_LOCAL_CONTEXT_WINDOW,\n} from '../constants.js';\nimport { getPluginVersion } from '../version.js';\n\n// --- Types ---\n\nexport interface WizardAnswers {\n // Intelligence provider\n intelligenceProvider: 'cloud' | 'ollama' | 'lmstudio';\n intelligenceModel?: string;\n intelligenceBaseUrl?: string;\n // Embedding provider\n embeddingProvider: 'ollama' | 'openrouter' | 'openai' | 'skip';\n embeddingModel?: string;\n embeddingApiKey?: string;\n}\n\nexport interface EmbeddingConfig {\n provider: string;\n model: string;\n}\n\n// --- Pure functions ---\n\n/** Convert wizard answers into a config object suitable for MycoConfigSchema embedding overrides. */\nexport function buildEmbeddingConfig(answers: WizardAnswers): EmbeddingConfig {\n if (answers.embeddingProvider === 'skip') {\n return {\n provider: 'ollama',\n model: DEFAULT_OLLAMA_EMBEDDING_MODEL,\n };\n }\n\n return {\n provider: answers.embeddingProvider,\n model: answers.embeddingModel ?? DEFAULT_OLLAMA_EMBEDDING_MODEL,\n };\n}\n\n/** Convert wizard answers into an agent config object for myco.yaml. */\nexport function buildAgentConfig(\n answers: WizardAnswers,\n): { provider?: { type: string; base_url?: string; model?: string }; model?: string } | null {\n if (answers.intelligenceProvider === 'cloud') {\n return { provider: { type: 'cloud' } };\n }\n\n const provider: { type: string; base_url?: string; model?: string } = {\n type: answers.intelligenceProvider,\n };\n if (answers.intelligenceBaseUrl) provider.base_url = answers.intelligenceBaseUrl;\n if (answers.intelligenceModel) provider.model = answers.intelligenceModel;\n\n return {\n provider,\n model: answers.intelligenceModel,\n };\n}\n\n// --- Interactive wizard ---\n\n/** Print the welcome banner with the current package version. */\nexport function printBanner(): void {\n const version = getPluginVersion();\n console.log('');\n console.log(' 🍄 Myco');\n console.log(` v${version} — Collective Agent Intelligence`);\n console.log(' ─────────────────────────────────────────────');\n console.log('');\n}\n\n/** Platform-specific Ollama install instructions. */\nfunction ollamaInstallHint(): string {\n if (process.platform === 'darwin') {\n return 'Install: brew install ollama && ollama serve';\n }\n if (process.platform === 'linux') {\n return 'Install: curl -fsSL https://ollama.com/install.sh | sh';\n }\n return 'Install: https://ollama.com/download';\n}\n\n/** Print local model context window recommendation. */\nfunction printLocalModelTip(): void {\n console.log('');\n console.log(` Tip: For local models, we recommend an ${RECOMMENDED_LOCAL_CONTEXT_WINDOW / 1024}K context window.`);\n console.log(' Set in myco.yaml under agent.tasks or configure via the dashboard.');\n console.log('');\n}\n\n// --- Intelligence provider step ---\n\n/** Select a model from a local provider (Ollama or LM Studio). */\nasync function selectLocalIntelligenceModel(\n backend: OllamaBackend | LmStudioBackend,\n providerName: string,\n): Promise<{ model?: string; baseUrl?: string }> {\n const available = await backend.isAvailable();\n\n if (!available) {\n console.log('');\n console.log(` ${providerName} is not running.`);\n if (providerName === 'Ollama') {\n console.log(` ${ollamaInstallHint()}`);\n } else {\n console.log(' Start LM Studio and enable the local server.');\n }\n console.log('');\n\n const action = await select({\n message: `${providerName} is not available. What would you like to do?`,\n choices: [\n { name: `Retry (after starting ${providerName})`, value: 'retry' },\n { name: 'Continue without selecting a model', value: 'skip' },\n ],\n });\n\n if (action === 'retry') {\n return selectLocalIntelligenceModel(backend, providerName);\n }\n return {};\n }\n\n const models = await backend.listModels(PROVIDER_DETECT_TIMEOUT_MS);\n\n let model: string;\n\n if (models.length > 0) {\n model = await select({\n message: `Select an intelligence model from ${providerName}:`,\n choices: [\n ...models.map((m) => ({ name: m, value: m })),\n { name: 'Enter model name manually', value: '__manual__' },\n ],\n default: models[0],\n });\n } else {\n console.log(` No models found in ${providerName}.`);\n model = '__manual__';\n }\n\n if (model === '__manual__') {\n model = await input({\n message: 'Model name:',\n });\n }\n\n printLocalModelTip();\n\n return { model: model || undefined };\n}\n\n/** Run the intelligence provider selection step. */\nasync function selectIntelligenceProvider(): Promise<Pick<WizardAnswers, 'intelligenceProvider' | 'intelligenceModel' | 'intelligenceBaseUrl'>> {\n const provider = await select<'cloud' | 'ollama' | 'lmstudio'>({\n message: 'How should Myco run intelligence tasks (extraction, summarization)?',\n choices: [\n { name: 'Cloud (Claude) — fast, requires Anthropic API key in env', value: 'cloud' },\n { name: 'Ollama (local, free)', value: 'ollama' },\n { name: 'LM Studio (local)', value: 'lmstudio' },\n ],\n default: 'cloud',\n });\n\n if (provider === 'cloud') {\n return { intelligenceProvider: 'cloud' };\n }\n\n if (provider === 'ollama') {\n const backend = new OllamaBackend();\n const result = await selectLocalIntelligenceModel(backend, 'Ollama');\n return {\n intelligenceProvider: 'ollama',\n intelligenceModel: result.model,\n };\n }\n\n // LM Studio\n const backend = new LmStudioBackend();\n const result = await selectLocalIntelligenceModel(backend, 'LM Studio');\n return {\n intelligenceProvider: 'lmstudio',\n intelligenceModel: result.model,\n intelligenceBaseUrl: result.baseUrl,\n };\n}\n\n// --- Embedding provider step ---\n\n/** Prompt the user to select an embedding model from Ollama. */\nasync function selectOllamaEmbeddingModel(): Promise<Pick<WizardAnswers, 'embeddingProvider' | 'embeddingModel'>> {\n const backend = new OllamaBackend();\n const available = await backend.isAvailable();\n\n if (!available) {\n console.log('');\n console.log(` Ollama is not running. ${ollamaInstallHint()}`);\n console.log('');\n\n const action = await select({\n message: 'Ollama is not available. What would you like to do?',\n choices: [\n { name: 'Retry (after starting Ollama)', value: 'retry' },\n { name: 'Switch to a cloud provider', value: 'switch' },\n { name: 'Skip embedding setup', value: 'skip' },\n ],\n });\n\n if (action === 'retry') {\n return selectOllamaEmbeddingModel();\n }\n if (action === 'switch') {\n return selectCloudEmbeddingProvider();\n }\n return { embeddingProvider: 'skip' };\n }\n\n const models = await backend.listModels(PROVIDER_DETECT_TIMEOUT_MS);\n const embeddingModels = models.filter(\n (m) => m.includes('bge') || m.includes('embed') || m.includes('nomic'),\n );\n\n let embeddingModel: string;\n\n if (embeddingModels.length > 0) {\n embeddingModel = await select({\n message: 'Select an embedding model:',\n choices: [\n ...embeddingModels.map((m) => ({ name: m, value: m })),\n { name: 'Enter model name manually', value: '__manual__' },\n ],\n default: embeddingModels.includes(DEFAULT_OLLAMA_EMBEDDING_MODEL)\n ? DEFAULT_OLLAMA_EMBEDDING_MODEL\n : embeddingModels[0],\n });\n } else {\n console.log(` No embedding models found. Pull one first: ollama pull ${DEFAULT_OLLAMA_EMBEDDING_MODEL}`);\n embeddingModel = '__manual__';\n }\n\n if (embeddingModel === '__manual__') {\n embeddingModel = await input({\n message: 'Embedding model name:',\n default: DEFAULT_OLLAMA_EMBEDDING_MODEL,\n });\n }\n\n return { embeddingProvider: 'ollama', embeddingModel };\n}\n\n/** Prompt the user to pick between OpenRouter and OpenAI. */\nasync function selectCloudEmbeddingProvider(): Promise<Pick<WizardAnswers, 'embeddingProvider' | 'embeddingModel' | 'embeddingApiKey'>> {\n const provider = await select<'openrouter' | 'openai'>({\n message: 'Select a cloud embedding provider:',\n choices: [\n { name: 'OpenRouter (many models, one API key)', value: 'openrouter' },\n { name: 'OpenAI (text-embedding-3-small)', value: 'openai' },\n ],\n });\n\n return selectCloudEmbeddingModel(provider);\n}\n\n/** Collect API key and model for a cloud embedding provider. */\nasync function selectCloudEmbeddingModel(\n provider: 'openrouter' | 'openai',\n): Promise<Pick<WizardAnswers, 'embeddingProvider' | 'embeddingModel' | 'embeddingApiKey'>> {\n const apiKey = await password({\n message: `Enter your ${provider === 'openrouter' ? 'OpenRouter' : 'OpenAI'} API key:`,\n mask: '*',\n });\n\n if (!apiKey) {\n console.log(' No API key provided. Skipping embedding setup.');\n return { embeddingProvider: 'skip' };\n }\n\n // Try to list models with the provided key\n let models: string[] = [];\n try {\n if (provider === 'openrouter') {\n const p = new OpenRouterEmbeddingProvider({ api_key: apiKey });\n models = await p.listModels(PROVIDER_DETECT_TIMEOUT_MS);\n } else {\n const p = new OpenAIEmbeddingProvider({ api_key: apiKey });\n models = await p.listModels(PROVIDER_DETECT_TIMEOUT_MS);\n }\n } catch {\n // Fall through to manual input\n }\n\n let embeddingModel: string;\n\n if (models.length > 0) {\n const defaultModel = provider === 'openrouter'\n ? `openai/${DEFAULT_OPENAI_EMBEDDING_MODEL}`\n : DEFAULT_OPENAI_EMBEDDING_MODEL;\n\n embeddingModel = await select({\n message: 'Select an embedding model:',\n choices: [\n ...models.map((m) => ({ name: m, value: m })),\n { name: 'Enter model ID manually', value: '__manual__' },\n ],\n default: models.includes(defaultModel) ? defaultModel : models[0],\n });\n } else {\n console.log(' Could not fetch model list. Enter the model ID manually.');\n embeddingModel = '__manual__';\n }\n\n if (embeddingModel === '__manual__') {\n const defaultModel = provider === 'openrouter'\n ? `openai/${DEFAULT_OPENAI_EMBEDDING_MODEL}`\n : DEFAULT_OPENAI_EMBEDDING_MODEL;\n\n embeddingModel = await input({\n message: 'Embedding model ID:',\n default: defaultModel,\n });\n }\n\n return {\n embeddingProvider: provider,\n embeddingModel,\n embeddingApiKey: apiKey,\n };\n}\n\n// --- Main wizard ---\n\n/** Run the interactive init wizard. Returns intelligence and embedding configuration choices. */\nexport async function runWizard(): Promise<WizardAnswers> {\n\n // Step 1: Intelligence provider\n const intelligenceAnswers = await selectIntelligenceProvider();\n\n // Step 2: Embedding provider\n const embeddingChoice = await select<'ollama' | 'cloud' | 'skip'>({\n message: 'How would you like to generate embeddings?',\n choices: [\n { name: 'Ollama (local, free, recommended)', value: 'ollama' },\n { name: 'Cloud provider (OpenRouter or OpenAI)', value: 'cloud' },\n { name: 'Skip for now (embeddings disabled)', value: 'skip' },\n ],\n default: 'ollama',\n });\n\n let embeddingAnswers: Pick<WizardAnswers, 'embeddingProvider' | 'embeddingModel' | 'embeddingApiKey'>;\n\n if (embeddingChoice === 'skip') {\n console.log('');\n console.log(' Skipping embedding setup. Semantic search and context injection');\n console.log(' will be disabled until you configure an embedding provider.');\n console.log(' Run `myco config` later to set one up.');\n console.log('');\n embeddingAnswers = { embeddingProvider: 'skip' };\n } else if (embeddingChoice === 'cloud') {\n embeddingAnswers = await selectCloudEmbeddingProvider();\n } else {\n embeddingAnswers = await selectOllamaEmbeddingModel();\n }\n\n return {\n ...intelligenceAnswers,\n ...embeddingAnswers,\n };\n}\n"],"mappings":"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","names":["backend","result"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
createEmbeddingProvider,
|
|
4
|
+
createLlmProvider
|
|
5
|
+
} from "./chunk-JYOOJCPQ.js";
|
|
6
|
+
import "./chunk-46PWOKSI.js";
|
|
7
|
+
import "./chunk-RJ6ZQKG5.js";
|
|
8
|
+
import "./chunk-KYLDNM7H.js";
|
|
9
|
+
import "./chunk-UBZPD4HN.js";
|
|
10
|
+
import "./chunk-5VZ52A4T.js";
|
|
11
|
+
import "./chunk-WGTCA2NU.js";
|
|
12
|
+
import "./chunk-PZUWP5VK.js";
|
|
13
|
+
export {
|
|
14
|
+
createEmbeddingProvider,
|
|
15
|
+
createLlmProvider
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=llm-BV3QNVRD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
loadAgentDefinition,
|
|
4
|
+
loadAgentTasks,
|
|
5
|
+
loadSystemPrompt,
|
|
6
|
+
registerBuiltInAgentsAndTasks,
|
|
7
|
+
resolveDefinitionsDir,
|
|
8
|
+
resolveEffectiveConfig,
|
|
9
|
+
taskFromParsed
|
|
10
|
+
} from "./chunk-JMJJEQ3P.js";
|
|
11
|
+
import "./chunk-IB76KGBY.js";
|
|
12
|
+
import "./chunk-D7TYRPRM.js";
|
|
13
|
+
import "./chunk-KH64DHOY.js";
|
|
14
|
+
import "./chunk-MYX5NCRH.js";
|
|
15
|
+
import "./chunk-5VZ52A4T.js";
|
|
16
|
+
import "./chunk-WGTCA2NU.js";
|
|
17
|
+
import "./chunk-LPUQPDC2.js";
|
|
18
|
+
import "./chunk-PZUWP5VK.js";
|
|
19
|
+
export {
|
|
20
|
+
loadAgentDefinition,
|
|
21
|
+
loadAgentTasks,
|
|
22
|
+
loadSystemPrompt,
|
|
23
|
+
registerBuiltInAgentsAndTasks,
|
|
24
|
+
resolveDefinitionsDir,
|
|
25
|
+
resolveEffectiveConfig,
|
|
26
|
+
taskFromParsed
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=loader-SH67XD54.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
CONFIG_FILENAME,
|
|
4
|
+
loadConfig,
|
|
5
|
+
saveConfig,
|
|
6
|
+
updateConfig
|
|
7
|
+
} from "./chunk-MHSCMET3.js";
|
|
8
|
+
import "./chunk-D7TYRPRM.js";
|
|
9
|
+
import "./chunk-E4VLWIJC.js";
|
|
10
|
+
import "./chunk-KH64DHOY.js";
|
|
11
|
+
import "./chunk-PZUWP5VK.js";
|
|
12
|
+
export {
|
|
13
|
+
CONFIG_FILENAME,
|
|
14
|
+
loadConfig,
|
|
15
|
+
saveConfig,
|
|
16
|
+
updateConfig
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=loader-XVXKZZDH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
LEVEL_ORDER
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2T7RPVPP.js";
|
|
5
|
+
import {
|
|
6
|
+
formatLogLine,
|
|
7
|
+
parseIntFlag,
|
|
8
|
+
parseStringFlag
|
|
9
|
+
} from "./chunk-SAKJMNSR.js";
|
|
10
|
+
import "./chunk-WGTCA2NU.js";
|
|
11
|
+
import "./chunk-PZUWP5VK.js";
|
|
5
12
|
|
|
6
13
|
// src/logs/reader.ts
|
|
7
14
|
import fs from "fs";
|
|
@@ -83,9 +90,71 @@ function applyFilters(entries, query) {
|
|
|
83
90
|
return entries.filter((entry) => matchesFilter(entry, query));
|
|
84
91
|
}
|
|
85
92
|
|
|
93
|
+
// src/cli/logs.ts
|
|
94
|
+
import fs2 from "fs";
|
|
95
|
+
import path2 from "path";
|
|
96
|
+
var FOLLOW_POLL_INTERVAL_MS = 500;
|
|
97
|
+
function run(args, vaultDir) {
|
|
98
|
+
const logDir = path2.join(vaultDir, "logs");
|
|
99
|
+
const follow = args.includes("--follow") || args.includes("-f");
|
|
100
|
+
const limit = parseIntFlag(args, "--tail", "-n") ?? DEFAULT_LOG_TAIL;
|
|
101
|
+
const rawLevel = parseStringFlag(args, "--level", "-l");
|
|
102
|
+
if (rawLevel && !(rawLevel in LEVEL_ORDER)) {
|
|
103
|
+
console.error(`Invalid level: ${rawLevel}. Valid levels: ${Object.keys(LEVEL_ORDER).join(", ")}`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const level = rawLevel;
|
|
107
|
+
const component = parseStringFlag(args, "--component", "-c");
|
|
108
|
+
const since = parseStringFlag(args, "--since");
|
|
109
|
+
const until = parseStringFlag(args, "--until");
|
|
110
|
+
const result = queryLogs(logDir, { limit, level, component, since, until });
|
|
111
|
+
for (const e of result.entries) {
|
|
112
|
+
process.stdout.write(formatLogLine(e) + "\n");
|
|
113
|
+
}
|
|
114
|
+
if (result.truncated) {
|
|
115
|
+
process.stdout.write(` ... ${result.total - result.entries.length} earlier entries omitted
|
|
116
|
+
`);
|
|
117
|
+
}
|
|
118
|
+
if (!follow) return;
|
|
119
|
+
const followFilter = { level, component, until };
|
|
120
|
+
const logPath = path2.join(logDir, "daemon.log");
|
|
121
|
+
let offset = 0;
|
|
122
|
+
try {
|
|
123
|
+
offset = fs2.statSync(logPath).size;
|
|
124
|
+
} catch {
|
|
125
|
+
}
|
|
126
|
+
fs2.watchFile(logPath, { interval: FOLLOW_POLL_INTERVAL_MS }, (curr, prev) => {
|
|
127
|
+
if (curr.size < prev.size || curr.ino !== prev.ino) {
|
|
128
|
+
offset = 0;
|
|
129
|
+
}
|
|
130
|
+
if (curr.size <= offset) return;
|
|
131
|
+
try {
|
|
132
|
+
const fd = fs2.openSync(logPath, "r");
|
|
133
|
+
const buf = Buffer.alloc(curr.size - offset);
|
|
134
|
+
fs2.readSync(fd, buf, 0, buf.length, offset);
|
|
135
|
+
fs2.closeSync(fd);
|
|
136
|
+
const text = buf.toString("utf-8");
|
|
137
|
+
const lastNewline = text.lastIndexOf("\n");
|
|
138
|
+
if (lastNewline < 0) return;
|
|
139
|
+
offset += Buffer.byteLength(text.slice(0, lastNewline + 1));
|
|
140
|
+
for (const line of text.slice(0, lastNewline).split("\n")) {
|
|
141
|
+
if (!line.trim()) continue;
|
|
142
|
+
try {
|
|
143
|
+
const e = JSON.parse(line);
|
|
144
|
+
if (!matchesFilter(e, followFilter)) continue;
|
|
145
|
+
process.stdout.write(formatLogLine(e) + "\n");
|
|
146
|
+
} catch {
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
} catch {
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
process.on("SIGINT", () => {
|
|
153
|
+
fs2.unwatchFile(logPath);
|
|
154
|
+
process.exit(0);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
86
157
|
export {
|
|
87
|
-
|
|
88
|
-
queryLogs,
|
|
89
|
-
matchesFilter
|
|
158
|
+
run
|
|
90
159
|
};
|
|
91
|
-
//# sourceMappingURL=
|
|
160
|
+
//# sourceMappingURL=logs-QZVYF6FP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logs/reader.ts","../src/cli/logs.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { LogEntry } from '../daemon/logger.js';\nimport { LEVEL_ORDER } from '../daemon/logger.js';\nimport type { LogLevel } from '../daemon/logger.js';\n\nexport { LEVEL_ORDER };\nexport type { LogEntry, LogLevel };\n\nexport interface LogQuery {\n limit?: number;\n level?: LogLevel;\n component?: string;\n since?: string;\n until?: string;\n}\n\nexport interface LogQueryResult {\n entries: LogEntry[];\n total: number;\n truncated: boolean;\n}\n\n/** Default number of entries returned when no limit is specified. */\nexport const DEFAULT_LOG_TAIL = 50;\n\n/** Hard ceiling on entries returned to prevent memory issues. */\nconst MAX_LOG_QUERY_LIMIT = 10_000;\n\n/** Matches daemon.log, rotated daemon.N.log, and mcp.jsonl. */\nconst DAEMON_LOG_PATTERN = /^daemon(?:\\.(\\d+))?\\.log$/;\nconst MCP_LOG_FILE = 'mcp.jsonl';\n\n/**\n * Query parsed log entries from all JSONL log files on disk.\n * Reads both daemon logs and MCP activity logs.\n * Returns the last N matching entries (tail behavior).\n */\nexport function queryLogs(logDir: string, query: LogQuery = {}): LogQueryResult {\n const limit = Math.min(query.limit ?? DEFAULT_LOG_TAIL, MAX_LOG_QUERY_LIMIT);\n\n const logFiles = discoverLogFiles(logDir);\n if (logFiles.length === 0) {\n return { entries: [], total: 0, truncated: false };\n }\n const allEntries = readAndParse(logFiles);\n\n // Sort all entries by timestamp so daemon + MCP logs interleave correctly\n allEntries.sort((a, b) => (a.timestamp ?? '').localeCompare(b.timestamp ?? ''));\n\n const filtered = applyFilters(allEntries, query);\n\n const total = filtered.length;\n const truncated = total > limit;\n const entries = truncated ? filtered.slice(total - limit) : filtered;\n\n return { entries, total, truncated };\n}\n\n/** Discover and sort log files: MCP first, then rotated daemon logs oldest-first, current daemon last. */\nfunction discoverLogFiles(logDir: string): string[] {\n let files: string[];\n try {\n files = fs.readdirSync(logDir);\n } catch {\n return [];\n }\n\n const matched: Array<{ path: string; order: number }> = [];\n for (const file of files) {\n if (file === MCP_LOG_FILE) {\n matched.push({ path: path.join(logDir, file), order: -1 });\n continue;\n }\n const m = DAEMON_LOG_PATTERN.exec(file);\n if (!m) continue;\n const rotationNum = m[1] ? parseInt(m[1], 10) : 0;\n matched.push({ path: path.join(logDir, file), order: rotationNum });\n }\n\n matched.sort((a, b) => {\n if (a.order === 0) return 1;\n if (b.order === 0) return -1;\n return b.order - a.order;\n });\n\n return matched.map((m) => m.path);\n}\n\n/** Read all log files and parse each line as JSON. Malformed lines are skipped. */\nfunction readAndParse(filePaths: string[]): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const filePath of filePaths) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n for (const line of content.split('\\n')) {\n if (!line.trim()) continue;\n try {\n entries.push(JSON.parse(line) as LogEntry);\n } catch {\n // Malformed line — skip\n }\n }\n }\n return entries;\n}\n\n/** Test whether a single entry matches the query filters. */\nexport function matchesFilter(entry: LogEntry, query: LogQuery): boolean {\n if (query.level) {\n const entryOrder = LEVEL_ORDER[entry.level as LogLevel] ?? 0;\n const minOrder = LEVEL_ORDER[query.level];\n if (entryOrder < minOrder) return false;\n }\n if (query.component && entry.component !== query.component) return false;\n if (query.since && entry.timestamp < query.since) return false;\n if (query.until && entry.timestamp > query.until) return false;\n return true;\n}\n\n/** Apply level, component, and time range filters. */\nfunction applyFilters(entries: LogEntry[], query: LogQuery): LogEntry[] {\n return entries.filter((entry) => matchesFilter(entry, query));\n}\n","import { queryLogs, matchesFilter, DEFAULT_LOG_TAIL, LEVEL_ORDER } from '../logs/reader.js';\nimport type { LogEntry, LogLevel } from '../logs/reader.js';\nimport { formatLogLine, parseIntFlag, parseStringFlag } from '../logs/format.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/** Polling interval for follow mode (milliseconds). */\nconst FOLLOW_POLL_INTERVAL_MS = 500;\n\nexport function run(args: string[], vaultDir: string): void {\n const logDir = path.join(vaultDir, 'logs');\n const follow = args.includes('--follow') || args.includes('-f');\n const limit = parseIntFlag(args, '--tail', '-n') ?? DEFAULT_LOG_TAIL;\n const rawLevel = parseStringFlag(args, '--level', '-l');\n if (rawLevel && !(rawLevel in LEVEL_ORDER)) {\n console.error(`Invalid level: ${rawLevel}. Valid levels: ${Object.keys(LEVEL_ORDER).join(', ')}`);\n process.exit(1);\n }\n const level = rawLevel as LogLevel | undefined;\n const component = parseStringFlag(args, '--component', '-c');\n const since = parseStringFlag(args, '--since');\n const until = parseStringFlag(args, '--until');\n\n // Show initial tail\n const result = queryLogs(logDir, { limit, level, component, since, until });\n for (const e of result.entries) {\n process.stdout.write(formatLogLine(e) + '\\n');\n }\n if (result.truncated) {\n process.stdout.write(` ... ${result.total - result.entries.length} earlier entries omitted\\n`);\n }\n\n if (!follow) return;\n\n // Follow mode: watch for new appends via stat-based polling.\n // --since is intentionally not applied to streamed lines (only the initial tail).\n const followFilter = { level, component, until };\n const logPath = path.join(logDir, 'daemon.log');\n let offset = 0;\n try {\n offset = fs.statSync(logPath).size;\n } catch {\n // File doesn't exist yet — start from 0\n }\n\n fs.watchFile(logPath, { interval: FOLLOW_POLL_INTERVAL_MS }, (curr, prev) => {\n if (curr.size < prev.size || curr.ino !== prev.ino) {\n // Rotation detected — reset to beginning of new file\n offset = 0;\n }\n if (curr.size <= offset) return;\n\n try {\n const fd = fs.openSync(logPath, 'r');\n const buf = Buffer.alloc(curr.size - offset);\n fs.readSync(fd, buf, 0, buf.length, offset);\n fs.closeSync(fd);\n\n const text = buf.toString('utf-8');\n // Only advance offset past complete lines to avoid losing partial writes\n const lastNewline = text.lastIndexOf('\\n');\n if (lastNewline < 0) return; // no complete lines yet\n offset += Buffer.byteLength(text.slice(0, lastNewline + 1));\n\n for (const line of text.slice(0, lastNewline).split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as LogEntry;\n if (!matchesFilter(e, followFilter)) continue;\n process.stdout.write(formatLogLine(e) + '\\n');\n } catch {\n // Malformed line\n }\n }\n } catch {\n // File read error — skip this cycle\n }\n });\n\n // fs.watchFile with persistent: true (default) keeps the event loop alive.\n // SIGINT (Ctrl+C) cleans up the watcher.\n process.on('SIGINT', () => {\n fs.unwatchFile(logPath);\n process.exit(0);\n });\n}\n"],"mappings":"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","names":["fs","path"]}
|