@goondocks/myco 0.2.14 → 0.3.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.
Files changed (101) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/commands/init.md +33 -22
  4. package/dist/{chunk-BXFS4PCJ.js → chunk-2QEJKG7R.js} +2 -2
  5. package/dist/{chunk-MAFUTKOZ.js → chunk-2TKJPRZL.js} +2 -2
  6. package/dist/chunk-3JCXYLHD.js +33 -0
  7. package/dist/chunk-3JCXYLHD.js.map +1 -0
  8. package/dist/chunk-5EZ7QF6J.js +96 -0
  9. package/dist/chunk-5EZ7QF6J.js.map +1 -0
  10. package/dist/chunk-6FQISQNA.js +61 -0
  11. package/dist/chunk-6FQISQNA.js.map +1 -0
  12. package/dist/chunk-72OAG4SF.js +3692 -0
  13. package/dist/chunk-72OAG4SF.js.map +1 -0
  14. package/dist/{chunk-S4WBXXO6.js → chunk-BMJX2IDQ.js} +2 -2
  15. package/dist/chunk-EF4JVH24.js +7299 -0
  16. package/dist/chunk-EF4JVH24.js.map +1 -0
  17. package/dist/{chunk-YXZEP5U6.js → chunk-ISCT2SI6.js} +11 -7301
  18. package/dist/chunk-ISCT2SI6.js.map +1 -0
  19. package/dist/chunk-JIQISBPI.js +362 -0
  20. package/dist/chunk-JIQISBPI.js.map +1 -0
  21. package/dist/{chunk-6C26YFOA.js → chunk-N6IAW33G.js} +248 -4306
  22. package/dist/chunk-N6IAW33G.js.map +1 -0
  23. package/dist/{chunk-C2YPBQQM.js → chunk-NTYYYC32.js} +3 -3
  24. package/dist/{chunk-NKJIZSPD.js → chunk-P2Q77C5F.js} +3 -3
  25. package/dist/chunk-PAUPHPOC.js +111 -0
  26. package/dist/chunk-PAUPHPOC.js.map +1 -0
  27. package/dist/chunk-PZUWP5VK.js +44 -0
  28. package/dist/{chunk-O5VSPHDL.js → chunk-Q7BEFSOV.js} +3 -40
  29. package/dist/{chunk-O5VSPHDL.js.map → chunk-Q7BEFSOV.js.map} +1 -1
  30. package/dist/chunk-RGVBGTD6.js +21 -0
  31. package/dist/chunk-RGVBGTD6.js.map +1 -0
  32. package/dist/chunk-SAKJMNSR.js +50 -0
  33. package/dist/chunk-SAKJMNSR.js.map +1 -0
  34. package/dist/{chunk-UUFDD2FB.js → chunk-TJJRIVZ7.js} +2 -2
  35. package/dist/chunk-XQXXF6MU.js +96 -0
  36. package/dist/chunk-XQXXF6MU.js.map +1 -0
  37. package/dist/chunk-XW3OL55U.js +160 -0
  38. package/dist/chunk-XW3OL55U.js.map +1 -0
  39. package/dist/cli-ERAS5H43.js +79 -0
  40. package/dist/cli-ERAS5H43.js.map +1 -0
  41. package/dist/client-HORA3CC4.js +11 -0
  42. package/dist/client-HORA3CC4.js.map +1 -0
  43. package/dist/config-MD4XMLUS.js +101 -0
  44. package/dist/config-MD4XMLUS.js.map +1 -0
  45. package/dist/detect-providers-6RQCQZOI.js +35 -0
  46. package/dist/detect-providers-6RQCQZOI.js.map +1 -0
  47. package/dist/init-LLLHUNSY.js +120 -0
  48. package/dist/init-LLLHUNSY.js.map +1 -0
  49. package/dist/logs-BSTBZHDR.js +84 -0
  50. package/dist/logs-BSTBZHDR.js.map +1 -0
  51. package/dist/{main-UJAXPP6S.js → main-D4X6XWRT.js} +241 -542
  52. package/dist/main-D4X6XWRT.js.map +1 -0
  53. package/dist/rebuild-3367GP5R.js +85 -0
  54. package/dist/rebuild-3367GP5R.js.map +1 -0
  55. package/dist/reprocess-EM5RIRH4.js +199 -0
  56. package/dist/reprocess-EM5RIRH4.js.map +1 -0
  57. package/dist/restart-NH5MX45I.js +50 -0
  58. package/dist/restart-NH5MX45I.js.map +1 -0
  59. package/dist/search-W3ECVSTH.js +120 -0
  60. package/dist/search-W3ECVSTH.js.map +1 -0
  61. package/dist/{server-J3AQ3YFA.js → server-I7MRMIOP.js} +41 -21
  62. package/dist/{server-J3AQ3YFA.js.map → server-I7MRMIOP.js.map} +1 -1
  63. package/dist/session-5GI2YU6R.js +44 -0
  64. package/dist/session-5GI2YU6R.js.map +1 -0
  65. package/dist/{session-start-BEC4JMNZ.js → session-start-DECLNJDI.js} +8 -6
  66. package/dist/{session-start-BEC4JMNZ.js.map → session-start-DECLNJDI.js.map} +1 -1
  67. package/dist/src/cli.js +5 -4
  68. package/dist/src/cli.js.map +1 -1
  69. package/dist/src/daemon/main.js +5 -4
  70. package/dist/src/daemon/main.js.map +1 -1
  71. package/dist/src/hooks/post-tool-use.js +5 -4
  72. package/dist/src/hooks/post-tool-use.js.map +1 -1
  73. package/dist/src/hooks/session-end.js +5 -4
  74. package/dist/src/hooks/session-end.js.map +1 -1
  75. package/dist/src/hooks/session-start.js +5 -4
  76. package/dist/src/hooks/session-start.js.map +1 -1
  77. package/dist/src/hooks/stop.js +7 -5
  78. package/dist/src/hooks/stop.js.map +1 -1
  79. package/dist/src/hooks/user-prompt-submit.js +5 -4
  80. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  81. package/dist/src/mcp/server.js +5 -4
  82. package/dist/src/mcp/server.js.map +1 -1
  83. package/dist/stats-7VEZN2WF.js +77 -0
  84. package/dist/stats-7VEZN2WF.js.map +1 -0
  85. package/dist/verify-HN5DWV2H.js +50 -0
  86. package/dist/verify-HN5DWV2H.js.map +1 -0
  87. package/package.json +1 -1
  88. package/skills/myco/SKILL.md +33 -0
  89. package/dist/chunk-6C26YFOA.js.map +0 -1
  90. package/dist/chunk-YXZEP5U6.js.map +0 -1
  91. package/dist/cli-KMWJFK5Y.js +0 -623
  92. package/dist/cli-KMWJFK5Y.js.map +0 -1
  93. package/dist/client-TEUHXGOY.js +0 -10
  94. package/dist/main-UJAXPP6S.js.map +0 -1
  95. /package/dist/{chunk-BXFS4PCJ.js.map → chunk-2QEJKG7R.js.map} +0 -0
  96. /package/dist/{chunk-MAFUTKOZ.js.map → chunk-2TKJPRZL.js.map} +0 -0
  97. /package/dist/{chunk-S4WBXXO6.js.map → chunk-BMJX2IDQ.js.map} +0 -0
  98. /package/dist/{chunk-C2YPBQQM.js.map → chunk-NTYYYC32.js.map} +0 -0
  99. /package/dist/{chunk-NKJIZSPD.js.map → chunk-P2Q77C5F.js.map} +0 -0
  100. /package/dist/{client-TEUHXGOY.js.map → chunk-PZUWP5VK.js.map} +0 -0
  101. /package/dist/{chunk-UUFDD2FB.js.map → chunk-TJJRIVZ7.js.map} +0 -0
@@ -0,0 +1,160 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ CHARS_PER_TOKEN,
4
+ DAEMON_CLIENT_TIMEOUT_MS,
5
+ EMBEDDING_REQUEST_TIMEOUT_MS,
6
+ LLM_REQUEST_TIMEOUT_MS
7
+ } from "./chunk-Q7BEFSOV.js";
8
+
9
+ // src/intelligence/ollama.ts
10
+ var OllamaBackend = class _OllamaBackend {
11
+ static DEFAULT_BASE_URL = "http://localhost:11434";
12
+ name = "ollama";
13
+ baseUrl;
14
+ model;
15
+ contextWindow;
16
+ defaultMaxTokens;
17
+ constructor(config) {
18
+ this.baseUrl = config?.base_url ?? _OllamaBackend.DEFAULT_BASE_URL;
19
+ this.model = config?.model ?? config?.summary_model ?? "llama3.2";
20
+ this.contextWindow = config?.context_window ?? 8192;
21
+ this.defaultMaxTokens = config?.max_tokens ?? 1024;
22
+ }
23
+ async summarize(prompt, opts) {
24
+ const maxTokens = opts?.maxTokens ?? this.defaultMaxTokens;
25
+ const promptTokens = Math.ceil(prompt.length / CHARS_PER_TOKEN);
26
+ const numCtx = Math.max(promptTokens + maxTokens, this.contextWindow);
27
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
28
+ method: "POST",
29
+ headers: { "Content-Type": "application/json" },
30
+ body: JSON.stringify({
31
+ model: this.model,
32
+ prompt,
33
+ stream: false,
34
+ options: { num_ctx: numCtx }
35
+ }),
36
+ signal: AbortSignal.timeout(LLM_REQUEST_TIMEOUT_MS)
37
+ });
38
+ if (!response.ok) {
39
+ throw new Error(`Ollama summarize failed: ${response.status} ${response.statusText}`);
40
+ }
41
+ const data = await response.json();
42
+ return { text: data.response, model: data.model };
43
+ }
44
+ async embed(text) {
45
+ const response = await fetch(`${this.baseUrl}/api/embed`, {
46
+ method: "POST",
47
+ headers: { "Content-Type": "application/json" },
48
+ body: JSON.stringify({
49
+ model: this.model,
50
+ input: text
51
+ }),
52
+ signal: AbortSignal.timeout(EMBEDDING_REQUEST_TIMEOUT_MS)
53
+ });
54
+ if (!response.ok) {
55
+ throw new Error(`Ollama embed failed: ${response.status} ${response.statusText}`);
56
+ }
57
+ const data = await response.json();
58
+ const embedding = data.embeddings[0];
59
+ return { embedding, model: data.model, dimensions: embedding.length };
60
+ }
61
+ async isAvailable() {
62
+ try {
63
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
64
+ signal: AbortSignal.timeout(DAEMON_CLIENT_TIMEOUT_MS)
65
+ });
66
+ return response.ok;
67
+ } catch {
68
+ return false;
69
+ }
70
+ }
71
+ /** List available models on this Ollama instance. */
72
+ async listModels(timeoutMs) {
73
+ try {
74
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
75
+ signal: AbortSignal.timeout(timeoutMs ?? DAEMON_CLIENT_TIMEOUT_MS)
76
+ });
77
+ const data = await response.json();
78
+ return data.models.map((m) => m.name);
79
+ } catch {
80
+ return [];
81
+ }
82
+ }
83
+ };
84
+
85
+ // src/intelligence/lm-studio.ts
86
+ var LmStudioBackend = class _LmStudioBackend {
87
+ static DEFAULT_BASE_URL = "http://localhost:1234";
88
+ name = "lm-studio";
89
+ baseUrl;
90
+ model;
91
+ defaultMaxTokens;
92
+ constructor(config) {
93
+ this.baseUrl = config?.base_url ?? _LmStudioBackend.DEFAULT_BASE_URL;
94
+ this.model = config?.model ?? config?.summary_model ?? "llama3.2";
95
+ this.defaultMaxTokens = config?.max_tokens ?? 1024;
96
+ }
97
+ async summarize(prompt, opts) {
98
+ const maxTokens = opts?.maxTokens ?? this.defaultMaxTokens;
99
+ const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
100
+ method: "POST",
101
+ headers: { "Content-Type": "application/json" },
102
+ body: JSON.stringify({
103
+ model: this.model,
104
+ messages: [{ role: "user", content: prompt }],
105
+ max_tokens: maxTokens
106
+ }),
107
+ signal: AbortSignal.timeout(LLM_REQUEST_TIMEOUT_MS)
108
+ });
109
+ if (!response.ok) {
110
+ throw new Error(`LM Studio summarize failed: ${response.status}`);
111
+ }
112
+ const data = await response.json();
113
+ return { text: data.choices[0].message.content, model: data.model };
114
+ }
115
+ async embed(text) {
116
+ const response = await fetch(`${this.baseUrl}/v1/embeddings`, {
117
+ method: "POST",
118
+ headers: { "Content-Type": "application/json" },
119
+ body: JSON.stringify({
120
+ model: this.model,
121
+ input: text
122
+ }),
123
+ signal: AbortSignal.timeout(EMBEDDING_REQUEST_TIMEOUT_MS)
124
+ });
125
+ if (!response.ok) {
126
+ throw new Error(`LM Studio embed failed: ${response.status}`);
127
+ }
128
+ const data = await response.json();
129
+ const embedding = data.data[0].embedding;
130
+ return { embedding, model: data.model, dimensions: embedding.length };
131
+ }
132
+ async isAvailable() {
133
+ try {
134
+ const response = await fetch(`${this.baseUrl}/v1/models`, {
135
+ signal: AbortSignal.timeout(DAEMON_CLIENT_TIMEOUT_MS)
136
+ });
137
+ return response.ok;
138
+ } catch {
139
+ return false;
140
+ }
141
+ }
142
+ /** List available models on this LM Studio instance. */
143
+ async listModels(timeoutMs) {
144
+ try {
145
+ const response = await fetch(`${this.baseUrl}/v1/models`, {
146
+ signal: AbortSignal.timeout(timeoutMs ?? DAEMON_CLIENT_TIMEOUT_MS)
147
+ });
148
+ const data = await response.json();
149
+ return data.data.map((m) => m.id);
150
+ } catch {
151
+ return [];
152
+ }
153
+ }
154
+ };
155
+
156
+ export {
157
+ OllamaBackend,
158
+ LmStudioBackend
159
+ };
160
+ //# sourceMappingURL=chunk-XW3OL55U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/intelligence/ollama.ts","../src/intelligence/lm-studio.ts"],"sourcesContent":["import type { LlmProvider, EmbeddingProvider, LlmResponse, EmbeddingResponse, LlmRequestOptions } from './llm.js';\nimport { CHARS_PER_TOKEN, LLM_REQUEST_TIMEOUT_MS, EMBEDDING_REQUEST_TIMEOUT_MS, DAEMON_CLIENT_TIMEOUT_MS } from '../constants.js';\n\ninterface OllamaConfig {\n model?: string;\n base_url?: string;\n context_window?: number;\n max_tokens?: number;\n // Legacy fields (ignored, kept for backward compat during migration)\n embedding_model?: string;\n summary_model?: string;\n}\n\nexport class OllamaBackend implements LlmProvider, EmbeddingProvider {\n static readonly DEFAULT_BASE_URL = 'http://localhost:11434';\n readonly name = 'ollama';\n private baseUrl: string;\n private model: string;\n private contextWindow: number;\n private defaultMaxTokens: number;\n\n constructor(config?: OllamaConfig) {\n this.baseUrl = config?.base_url ?? OllamaBackend.DEFAULT_BASE_URL;\n this.model = config?.model ?? config?.summary_model ?? 'llama3.2';\n this.contextWindow = config?.context_window ?? 8192;\n this.defaultMaxTokens = config?.max_tokens ?? 1024;\n }\n\n async summarize(prompt: string, opts?: LlmRequestOptions): Promise<LlmResponse> {\n const maxTokens = opts?.maxTokens ?? this.defaultMaxTokens;\n const promptTokens = Math.ceil(prompt.length / CHARS_PER_TOKEN);\n const numCtx = Math.max(promptTokens + maxTokens, this.contextWindow);\n\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n prompt,\n stream: false,\n options: { num_ctx: numCtx },\n }),\n signal: AbortSignal.timeout(LLM_REQUEST_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama summarize failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as { response: string; model: string };\n return { text: data.response, model: data.model };\n }\n\n async embed(text: string): Promise<EmbeddingResponse> {\n const response = await fetch(`${this.baseUrl}/api/embed`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n input: text,\n }),\n signal: AbortSignal.timeout(EMBEDDING_REQUEST_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama embed failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as { embeddings: number[][]; model: string };\n const embedding = data.embeddings[0];\n return { embedding, model: data.model, dimensions: embedding.length };\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(DAEMON_CLIENT_TIMEOUT_MS),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /** List available models on this Ollama instance. */\n async listModels(timeoutMs?: number): Promise<string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(timeoutMs ?? DAEMON_CLIENT_TIMEOUT_MS),\n });\n const data = await response.json() as { models: Array<{ name: string }> };\n return data.models.map((m) => m.name);\n } catch {\n return [];\n }\n }\n}\n","import type { LlmProvider, EmbeddingProvider, LlmResponse, EmbeddingResponse, LlmRequestOptions } from './llm.js';\nimport { LLM_REQUEST_TIMEOUT_MS, EMBEDDING_REQUEST_TIMEOUT_MS, DAEMON_CLIENT_TIMEOUT_MS } from '../constants.js';\n\ninterface LmStudioConfig {\n model?: string;\n base_url?: string;\n max_tokens?: number;\n // Legacy fields\n embedding_model?: string;\n summary_model?: string;\n}\n\nexport class LmStudioBackend implements LlmProvider, EmbeddingProvider {\n static readonly DEFAULT_BASE_URL = 'http://localhost:1234';\n readonly name = 'lm-studio';\n private baseUrl: string;\n private model: string;\n private defaultMaxTokens: number;\n\n constructor(config?: LmStudioConfig) {\n this.baseUrl = config?.base_url ?? LmStudioBackend.DEFAULT_BASE_URL;\n this.model = config?.model ?? config?.summary_model ?? 'llama3.2';\n this.defaultMaxTokens = config?.max_tokens ?? 1024;\n }\n\n async summarize(prompt: string, opts?: LlmRequestOptions): Promise<LlmResponse> {\n const maxTokens = opts?.maxTokens ?? this.defaultMaxTokens;\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n messages: [{ role: 'user', content: prompt }],\n max_tokens: maxTokens,\n }),\n signal: AbortSignal.timeout(LLM_REQUEST_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(`LM Studio summarize failed: ${response.status}`);\n }\n\n const data = await response.json() as {\n choices: Array<{ message: { content: string } }>;\n model: string;\n };\n return { text: data.choices[0].message.content, model: data.model };\n }\n\n async embed(text: string): Promise<EmbeddingResponse> {\n const response = await fetch(`${this.baseUrl}/v1/embeddings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n input: text,\n }),\n signal: AbortSignal.timeout(EMBEDDING_REQUEST_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(`LM Studio embed failed: ${response.status}`);\n }\n\n const data = await response.json() as {\n data: Array<{ embedding: number[] }>;\n model: string;\n };\n const embedding = data.data[0].embedding;\n return { embedding, model: data.model, dimensions: embedding.length };\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n signal: AbortSignal.timeout(DAEMON_CLIENT_TIMEOUT_MS),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /** List available models on this LM Studio instance. */\n async listModels(timeoutMs?: number): Promise<string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n signal: AbortSignal.timeout(timeoutMs ?? DAEMON_CLIENT_TIMEOUT_MS),\n });\n const data = await response.json() as { data: Array<{ id: string }> };\n return data.data.map((m) => m.id);\n } catch {\n return [];\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
3
+ import {
4
+ loadEnv
5
+ } from "./chunk-PAUPHPOC.js";
6
+ import "./chunk-SAKJMNSR.js";
7
+ import "./chunk-XW3OL55U.js";
8
+ import {
9
+ resolveVaultDir
10
+ } from "./chunk-N33KUCFP.js";
11
+ import "./chunk-2QEJKG7R.js";
12
+ import "./chunk-Q7BEFSOV.js";
13
+ import "./chunk-PZUWP5VK.js";
14
+
15
+ // src/cli.ts
16
+ import fs from "fs";
17
+ import path from "path";
18
+ loadEnv();
19
+ var USAGE = `Usage: myco <command> [args]
20
+
21
+ Commands:
22
+ init [options] Initialize a new vault
23
+ config <get|set> [args] Get or set vault config values
24
+ detect-providers Detect available LLM/embedding providers (JSON)
25
+ verify Test LLM and embedding connectivity
26
+ stats Vault health, index counts, vector count
27
+ search <query> Combined FTS + vector search with scores
28
+ vectors <query> Raw vector search with similarity scores
29
+ session [id|latest] Show a session note
30
+ logs [options] View daemon logs
31
+ restart Restart the daemon
32
+ rebuild Reindex the entire vault
33
+ reprocess [options] Re-extract observations and re-index sessions
34
+ `;
35
+ async function main() {
36
+ const [cmd, ...args] = process.argv.slice(2);
37
+ if (!cmd || cmd === "--help" || cmd === "-h") {
38
+ process.stdout.write(USAGE);
39
+ return;
40
+ }
41
+ if (cmd === "init") return (await import("./init-LLLHUNSY.js")).run(args);
42
+ if (cmd === "detect-providers") return (await import("./detect-providers-6RQCQZOI.js")).run(args);
43
+ const vaultDir = resolveVaultDir();
44
+ if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
45
+ console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
46
+ process.exit(1);
47
+ }
48
+ switch (cmd) {
49
+ case "config":
50
+ return (await import("./config-MD4XMLUS.js")).run(args, vaultDir);
51
+ case "verify":
52
+ return (await import("./verify-HN5DWV2H.js")).run(args, vaultDir);
53
+ case "stats":
54
+ return (await import("./stats-7VEZN2WF.js")).run(args, vaultDir);
55
+ case "search":
56
+ return (await import("./search-W3ECVSTH.js")).run(args, vaultDir);
57
+ case "vectors":
58
+ return (await import("./search-W3ECVSTH.js")).runVectors(args, vaultDir);
59
+ case "session":
60
+ return (await import("./session-5GI2YU6R.js")).run(args, vaultDir);
61
+ case "restart":
62
+ return (await import("./restart-NH5MX45I.js")).run(args, vaultDir);
63
+ case "rebuild":
64
+ return (await import("./rebuild-3367GP5R.js")).run(args, vaultDir);
65
+ case "reprocess":
66
+ return (await import("./reprocess-EM5RIRH4.js")).run(args, vaultDir);
67
+ case "logs":
68
+ return (await import("./logs-BSTBZHDR.js")).run(args, vaultDir);
69
+ default:
70
+ console.error(`Unknown command: ${cmd}`);
71
+ process.stdout.write(USAGE);
72
+ process.exit(1);
73
+ }
74
+ }
75
+ main().catch((err) => {
76
+ console.error(`myco: ${err.message}`);
77
+ process.exit(1);
78
+ });
79
+ //# sourceMappingURL=cli-ERAS5H43.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { loadEnv } from './cli/shared.js';\nimport { resolveVaultDir } from './vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nloadEnv();\n\nconst USAGE = `Usage: myco <command> [args]\n\nCommands:\n init [options] Initialize a new vault\n config <get|set> [args] Get or set vault config values\n detect-providers Detect available LLM/embedding providers (JSON)\n verify Test LLM and embedding connectivity\n stats Vault health, index counts, vector count\n search <query> Combined FTS + vector search with scores\n vectors <query> Raw vector search with similarity scores\n session [id|latest] Show a session note\n logs [options] View daemon logs\n restart Restart the daemon\n rebuild Reindex the entire vault\n reprocess [options] Re-extract observations and re-index sessions\n`;\n\nasync function main(): Promise<void> {\n const [cmd, ...args] = process.argv.slice(2);\n if (!cmd || cmd === '--help' || cmd === '-h') {\n process.stdout.write(USAGE);\n return;\n }\n\n if (cmd === 'init') return (await import('./cli/init.js')).run(args);\n if (cmd === 'detect-providers') return (await import('./cli/detect-providers.js')).run(args);\n\n const vaultDir = resolveVaultDir();\n if (!fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {\n console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);\n process.exit(1);\n }\n\n switch (cmd) {\n case 'config': return (await import('./cli/config.js')).run(args, vaultDir);\n case 'verify': return (await import('./cli/verify.js')).run(args, vaultDir);\n case 'stats': return (await import('./cli/stats.js')).run(args, vaultDir);\n case 'search': return (await import('./cli/search.js')).run(args, vaultDir);\n case 'vectors': return (await import('./cli/search.js')).runVectors(args, vaultDir);\n case 'session': return (await import('./cli/session.js')).run(args, vaultDir);\n case 'restart': return (await import('./cli/restart.js')).run(args, vaultDir);\n case 'rebuild': return (await import('./cli/rebuild.js')).run(args, vaultDir);\n case 'reprocess': return (await import('./cli/reprocess.js')).run(args, vaultDir);\n case 'logs': return (await import('./cli/logs.js')).run(args, vaultDir);\n default:\n console.error(`Unknown command: ${cmd}`);\n process.stdout.write(USAGE);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(`myco: ${(err as Error).message}`);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;AAGA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,QAAQ;AAER,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBd,eAAe,OAAsB;AACnC,QAAM,CAAC,KAAK,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC3C,MAAI,CAAC,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC5C,YAAQ,OAAO,MAAM,KAAK;AAC1B;AAAA,EACF;AAEA,MAAI,QAAQ,OAAQ,SAAQ,MAAM,OAAO,oBAAe,GAAG,IAAI,IAAI;AACnE,MAAI,QAAQ,mBAAoB,SAAQ,MAAM,OAAO,gCAA2B,GAAG,IAAI,IAAI;AAE3F,QAAM,WAAW,gBAAgB;AACjC,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,UAAU,WAAW,CAAC,GAAG;AACpD,YAAQ,MAAM,yBAAyB,QAAQ,0BAA0B;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,KAAK;AAAA,IACX,KAAK;AAAU,cAAQ,MAAM,OAAO,sBAAiB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAC1E,KAAK;AAAU,cAAQ,MAAM,OAAO,sBAAiB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAC1E,KAAK;AAAS,cAAQ,MAAM,OAAO,qBAAgB,GAAG,IAAI,MAAM,QAAQ;AAAA,IACxE,KAAK;AAAU,cAAQ,MAAM,OAAO,sBAAiB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAC1E,KAAK;AAAW,cAAQ,MAAM,OAAO,sBAAiB,GAAG,WAAW,MAAM,QAAQ;AAAA,IAClF,KAAK;AAAW,cAAQ,MAAM,OAAO,uBAAkB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAC5E,KAAK;AAAW,cAAQ,MAAM,OAAO,uBAAkB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAC5E,KAAK;AAAW,cAAQ,MAAM,OAAO,uBAAkB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAC5E,KAAK;AAAa,cAAQ,MAAM,OAAO,yBAAoB,GAAG,IAAI,MAAM,QAAQ;AAAA,IAChF,KAAK;AAAQ,cAAQ,MAAM,OAAO,oBAAe,GAAG,IAAI,MAAM,QAAQ;AAAA,IACtE;AACE,cAAQ,MAAM,oBAAoB,GAAG,EAAE;AACvC,cAAQ,OAAO,MAAM,KAAK;AAC1B,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,SAAU,IAAc,OAAO,EAAE;AAC/C,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ DaemonClient
4
+ } from "./chunk-NTYYYC32.js";
5
+ import "./chunk-2QEJKG7R.js";
6
+ import "./chunk-Q7BEFSOV.js";
7
+ import "./chunk-PZUWP5VK.js";
8
+ export {
9
+ DaemonClient
10
+ };
11
+ //# sourceMappingURL=client-HORA3CC4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,101 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ MycoConfigSchema,
4
+ loadConfig
5
+ } from "./chunk-ISCT2SI6.js";
6
+ import {
7
+ require_dist
8
+ } from "./chunk-EF4JVH24.js";
9
+ import {
10
+ __toESM
11
+ } from "./chunk-PZUWP5VK.js";
12
+
13
+ // src/cli/config.ts
14
+ var import_yaml = __toESM(require_dist(), 1);
15
+ import fs from "fs";
16
+ import path from "path";
17
+ var CONFIG_FILENAME = "myco.yaml";
18
+ var DAEMON_STATE_FILENAME = "daemon.json";
19
+ async function run(args, vaultDir) {
20
+ const [subcommand, key, ...rest] = args;
21
+ if (subcommand === "get") {
22
+ if (!key) {
23
+ console.error("Usage: myco config get <dot.path.key>");
24
+ process.exit(1);
25
+ }
26
+ return configGet(key, vaultDir);
27
+ }
28
+ if (subcommand === "set") {
29
+ const value = rest[0];
30
+ if (!key || value === void 0) {
31
+ console.error("Usage: myco config set <dot.path.key> <value>");
32
+ process.exit(1);
33
+ }
34
+ return configSet(key, value, vaultDir);
35
+ }
36
+ console.error("Usage: myco config <get|set> <dot.path.key> [value]");
37
+ process.exit(1);
38
+ }
39
+ function configGet(dotPath, vaultDir) {
40
+ const config = loadConfig(vaultDir);
41
+ const value = walkPath(config, dotPath);
42
+ if (value === void 0) {
43
+ console.error(`Key not found: ${dotPath}`);
44
+ process.exit(1);
45
+ }
46
+ console.log(typeof value === "object" ? JSON.stringify(value, null, 2) : String(value));
47
+ }
48
+ function configSet(dotPath, rawValue, vaultDir) {
49
+ const configPath = path.join(vaultDir, CONFIG_FILENAME);
50
+ const raw = fs.readFileSync(configPath, "utf-8");
51
+ const doc = import_yaml.default.parse(raw);
52
+ const value = parseValue(rawValue);
53
+ setPath(doc, dotPath, value);
54
+ const result = MycoConfigSchema.safeParse(doc);
55
+ if (!result.success) {
56
+ console.error("Validation error:");
57
+ for (const issue of result.error.issues) {
58
+ console.error(` ${issue.path.join(".")}: ${issue.message}`);
59
+ }
60
+ process.exit(1);
61
+ }
62
+ fs.writeFileSync(configPath, import_yaml.default.stringify(doc), "utf-8");
63
+ console.log(`Set ${dotPath} = ${JSON.stringify(value)}`);
64
+ if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {
65
+ console.log("Note: restart the daemon for changes to take effect (myco restart)");
66
+ }
67
+ }
68
+ function walkPath(obj, dotPath) {
69
+ const segments = dotPath.split(".");
70
+ let current = obj;
71
+ for (const segment of segments) {
72
+ if (current === null || current === void 0 || typeof current !== "object") {
73
+ return void 0;
74
+ }
75
+ current = current[segment];
76
+ }
77
+ return current;
78
+ }
79
+ function setPath(obj, dotPath, value) {
80
+ const segments = dotPath.split(".");
81
+ let current = obj;
82
+ for (let i = 0; i < segments.length - 1; i++) {
83
+ const segment = segments[i];
84
+ if (current[segment] === void 0 || current[segment] === null || typeof current[segment] !== "object") {
85
+ current[segment] = {};
86
+ }
87
+ current = current[segment];
88
+ }
89
+ current[segments[segments.length - 1]] = value;
90
+ }
91
+ function parseValue(raw) {
92
+ try {
93
+ return JSON.parse(raw);
94
+ } catch {
95
+ return raw;
96
+ }
97
+ }
98
+ export {
99
+ run
100
+ };
101
+ //# sourceMappingURL=config-MD4XMLUS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/config.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { loadConfig } from '../config/loader.js';\nimport { MycoConfigSchema } from '../config/schema.js';\n\nconst CONFIG_FILENAME = 'myco.yaml';\nconst DAEMON_STATE_FILENAME = 'daemon.json';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const [subcommand, key, ...rest] = args;\n\n if (subcommand === 'get') {\n if (!key) {\n console.error('Usage: myco config get <dot.path.key>');\n process.exit(1);\n }\n return configGet(key, vaultDir);\n }\n\n if (subcommand === 'set') {\n const value = rest[0];\n if (!key || value === undefined) {\n console.error('Usage: myco config set <dot.path.key> <value>');\n process.exit(1);\n }\n return configSet(key, value, vaultDir);\n }\n\n console.error('Usage: myco config <get|set> <dot.path.key> [value]');\n process.exit(1);\n}\n\nfunction configGet(dotPath: string, vaultDir: string): void {\n const config = loadConfig(vaultDir);\n const value = walkPath(config as Record<string, unknown>, dotPath);\n if (value === undefined) {\n console.error(`Key not found: ${dotPath}`);\n process.exit(1);\n }\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value));\n}\n\nfunction configSet(dotPath: string, rawValue: string, vaultDir: string): void {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n const raw = fs.readFileSync(configPath, 'utf-8');\n const doc = YAML.parse(raw) as Record<string, unknown>;\n\n const value = parseValue(rawValue);\n setPath(doc, dotPath, value);\n\n const result = MycoConfigSchema.safeParse(doc);\n if (!result.success) {\n console.error('Validation error:');\n for (const issue of result.error.issues) {\n console.error(` ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n\n fs.writeFileSync(configPath, YAML.stringify(doc), 'utf-8');\n console.log(`Set ${dotPath} = ${JSON.stringify(value)}`);\n\n if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {\n console.log('Note: restart the daemon for changes to take effect (myco restart)');\n }\n}\n\n/** Walk a dot-separated path to retrieve a nested value. */\nfunction walkPath(obj: Record<string, unknown>, dotPath: string): unknown {\n const segments = dotPath.split('.');\n let current: unknown = obj;\n for (const segment of segments) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n/** Set a value at a dot-separated path, creating intermediate objects as needed. */\nfunction setPath(obj: Record<string, unknown>, dotPath: string, value: unknown): void {\n const segments = dotPath.split('.');\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i];\n if (current[segment] === undefined || current[segment] === null || typeof current[segment] !== 'object') {\n current[segment] = {};\n }\n current = current[segment] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n}\n\n/** Parse a string value as JSON (number, boolean, array, object), falling back to raw string. */\nfunction parseValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n"],"mappings":"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","names":["YAML"]}
@@ -0,0 +1,35 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ LmStudioBackend,
4
+ OllamaBackend
5
+ } from "./chunk-XW3OL55U.js";
6
+ import {
7
+ PROVIDER_DETECT_TIMEOUT_MS
8
+ } from "./chunk-Q7BEFSOV.js";
9
+ import "./chunk-PZUWP5VK.js";
10
+
11
+ // src/cli/detect-providers.ts
12
+ async function detectProvider(backend) {
13
+ const available = await backend.isAvailable();
14
+ if (!available) return { available: false, models: [] };
15
+ const models = await backend.listModels(PROVIDER_DETECT_TIMEOUT_MS);
16
+ return { available: true, models };
17
+ }
18
+ async function run(_args) {
19
+ const ollama = new OllamaBackend();
20
+ const lmStudio = new LmStudioBackend();
21
+ const [ollamaResult, lmStudioResult] = await Promise.all([
22
+ detectProvider(ollama),
23
+ detectProvider(lmStudio)
24
+ ]);
25
+ const result = {
26
+ ollama: ollamaResult,
27
+ "lm-studio": lmStudioResult,
28
+ anthropic: { available: !!process.env.ANTHROPIC_API_KEY, models: [] }
29
+ };
30
+ console.log(JSON.stringify(result, null, 2));
31
+ }
32
+ export {
33
+ run
34
+ };
35
+ //# sourceMappingURL=detect-providers-6RQCQZOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/detect-providers.ts"],"sourcesContent":["import { PROVIDER_DETECT_TIMEOUT_MS } from '../constants.js';\nimport { OllamaBackend } from '../intelligence/ollama.js';\nimport { LmStudioBackend } from '../intelligence/lm-studio.js';\n\ninterface ProviderResult {\n available: boolean;\n models: string[];\n}\n\ninterface DetectResult {\n ollama: ProviderResult;\n 'lm-studio': ProviderResult;\n anthropic: ProviderResult;\n}\n\nasync function detectProvider(\n backend: { isAvailable(): Promise<boolean>; listModels(timeoutMs?: number): Promise<string[]> },\n): Promise<ProviderResult> {\n const available = await backend.isAvailable();\n if (!available) return { available: false, models: [] };\n const models = await backend.listModels(PROVIDER_DETECT_TIMEOUT_MS);\n return { available: true, models };\n}\n\nexport async function run(_args: string[]): Promise<void> {\n const ollama = new OllamaBackend();\n const lmStudio = new LmStudioBackend();\n\n const [ollamaResult, lmStudioResult] = await Promise.all([\n detectProvider(ollama),\n detectProvider(lmStudio),\n ]);\n\n const result: DetectResult = {\n ollama: ollamaResult,\n 'lm-studio': lmStudioResult,\n anthropic: { available: !!process.env.ANTHROPIC_API_KEY, models: [] },\n };\n\n console.log(JSON.stringify(result, null, 2));\n}\n"],"mappings":";;;;;;;;;;;AAeA,eAAe,eACb,SACyB;AACzB,QAAM,YAAY,MAAM,QAAQ,YAAY;AAC5C,MAAI,CAAC,UAAW,QAAO,EAAE,WAAW,OAAO,QAAQ,CAAC,EAAE;AACtD,QAAM,SAAS,MAAM,QAAQ,WAAW,0BAA0B;AAClE,SAAO,EAAE,WAAW,MAAM,OAAO;AACnC;AAEA,eAAsB,IAAI,OAAgC;AACxD,QAAM,SAAS,IAAI,cAAc;AACjC,QAAM,WAAW,IAAI,gBAAgB;AAErC,QAAM,CAAC,cAAc,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,eAAe,MAAM;AAAA,IACrB,eAAe,QAAQ;AAAA,EACzB,CAAC;AAED,QAAM,SAAuB;AAAA,IAC3B,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,IAAI,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACtE;AAEA,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;","names":[]}
@@ -0,0 +1,120 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ initFts
4
+ } from "./chunk-6FQISQNA.js";
5
+ import {
6
+ DASHBOARD_CONTENT,
7
+ PROVIDER_DEFAULTS,
8
+ VAULT_GITIGNORE,
9
+ configureVaultEnv
10
+ } from "./chunk-PAUPHPOC.js";
11
+ import {
12
+ parseStringFlag
13
+ } from "./chunk-SAKJMNSR.js";
14
+ import {
15
+ MycoIndex
16
+ } from "./chunk-PA3VMINE.js";
17
+ import "./chunk-XW3OL55U.js";
18
+ import {
19
+ require_dist
20
+ } from "./chunk-EF4JVH24.js";
21
+ import {
22
+ resolveVaultDir
23
+ } from "./chunk-N33KUCFP.js";
24
+ import "./chunk-2QEJKG7R.js";
25
+ import "./chunk-Q7BEFSOV.js";
26
+ import {
27
+ __toESM
28
+ } from "./chunk-PZUWP5VK.js";
29
+
30
+ // src/cli/init.ts
31
+ var import_yaml = __toESM(require_dist(), 1);
32
+ import fs from "fs";
33
+ import path from "path";
34
+ import os from "os";
35
+ async function run(args) {
36
+ const vaultPath = parseStringFlag(args, "--vault");
37
+ const llmProvider = parseStringFlag(args, "--llm-provider") ?? "ollama";
38
+ const llmModel = parseStringFlag(args, "--llm-model") ?? "gpt-oss";
39
+ const llmUrl = parseStringFlag(args, "--llm-url") ?? PROVIDER_DEFAULTS[llmProvider]?.base_url;
40
+ const embeddingProvider = parseStringFlag(args, "--embedding-provider") ?? "ollama";
41
+ const embeddingModel = parseStringFlag(args, "--embedding-model") ?? "bge-m3";
42
+ const embeddingUrl = parseStringFlag(args, "--embedding-url") ?? PROVIDER_DEFAULTS[embeddingProvider]?.base_url;
43
+ const user = parseStringFlag(args, "--user") ?? "";
44
+ const teamEnabled = args.includes("--team");
45
+ const vaultDir = vaultPath ? vaultPath.startsWith("~/") ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath) : path.join(resolveVaultDir());
46
+ if (fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
47
+ console.log(`Vault already initialized at ${vaultDir}`);
48
+ return;
49
+ }
50
+ console.log(`Initializing Myco vault at ${vaultDir}`);
51
+ const dirs = ["sessions", "plans", "memories", "artifacts", "team", "buffer", "logs"];
52
+ for (const dir of dirs) {
53
+ fs.mkdirSync(path.join(vaultDir, dir), { recursive: true });
54
+ }
55
+ const config = {
56
+ version: 2,
57
+ intelligence: {
58
+ llm: {
59
+ provider: llmProvider,
60
+ model: llmModel,
61
+ ...llmUrl ? { base_url: llmUrl } : {},
62
+ context_window: 8192,
63
+ max_tokens: 1024
64
+ },
65
+ embedding: {
66
+ provider: embeddingProvider,
67
+ model: embeddingModel,
68
+ ...embeddingUrl ? { base_url: embeddingUrl } : {}
69
+ }
70
+ },
71
+ daemon: {
72
+ log_level: "info",
73
+ grace_period: 30,
74
+ max_log_size: 5242880
75
+ },
76
+ capture: {
77
+ transcript_paths: [],
78
+ artifact_watch: [".claude/plans/", ".cursor/plans/"],
79
+ artifact_extensions: [".md"],
80
+ buffer_max_events: 500
81
+ },
82
+ context: {
83
+ max_tokens: 1200,
84
+ layers: { plans: 200, sessions: 500, memories: 300, team: 200 }
85
+ },
86
+ team: {
87
+ enabled: teamEnabled,
88
+ user,
89
+ sync: "git"
90
+ }
91
+ };
92
+ fs.writeFileSync(
93
+ path.join(vaultDir, "myco.yaml"),
94
+ import_yaml.default.stringify(config),
95
+ "utf-8"
96
+ );
97
+ fs.writeFileSync(path.join(vaultDir, ".gitignore"), VAULT_GITIGNORE, "utf-8");
98
+ fs.writeFileSync(path.join(vaultDir, "_dashboard.md"), DASHBOARD_CONTENT, "utf-8");
99
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
100
+ initFts(index);
101
+ index.close();
102
+ console.log("");
103
+ console.log("=== Myco Vault Initialized ===");
104
+ console.log(`Path: ${vaultDir}`);
105
+ console.log(`LLM provider: ${llmProvider} / ${llmModel}`);
106
+ console.log(`Embedding provider: ${embeddingProvider} / ${embeddingModel}`);
107
+ console.log(`Team mode: ${teamEnabled ? "enabled" : "disabled"}`);
108
+ if (user) console.log(`User: ${user}`);
109
+ console.log("");
110
+ const projectRoot = path.resolve(".");
111
+ const isProjectLocal = vaultDir.startsWith(projectRoot);
112
+ if (!isProjectLocal) {
113
+ configureVaultEnv(projectRoot, vaultDir);
114
+ }
115
+ console.log("Next: start a coding session \u2014 Myco will begin capturing automatically.");
116
+ }
117
+ export {
118
+ run
119
+ };
120
+ //# sourceMappingURL=init-LLLHUNSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/init.ts"],"sourcesContent":["import { MycoIndex } from '../index/sqlite.js';\nimport { initFts } from '../index/fts.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport {\n parseStringFlag,\n PROVIDER_DEFAULTS,\n DASHBOARD_CONTENT,\n VAULT_GITIGNORE,\n configureVaultEnv,\n} from './shared.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport YAML from 'yaml';\n\nexport async function run(args: string[]): Promise<void> {\n const vaultPath = parseStringFlag(args, '--vault');\n const llmProvider = parseStringFlag(args, '--llm-provider') ?? 'ollama';\n const llmModel = parseStringFlag(args, '--llm-model') ?? 'gpt-oss';\n const llmUrl = parseStringFlag(args, '--llm-url') ?? PROVIDER_DEFAULTS[llmProvider]?.base_url;\n const embeddingProvider = parseStringFlag(args, '--embedding-provider') ?? 'ollama';\n const embeddingModel = parseStringFlag(args, '--embedding-model') ?? 'bge-m3';\n const embeddingUrl = parseStringFlag(args, '--embedding-url') ?? PROVIDER_DEFAULTS[embeddingProvider]?.base_url;\n const user = parseStringFlag(args, '--user') ?? '';\n const teamEnabled = args.includes('--team');\n\n // Resolve vault directory\n const vaultDir = vaultPath\n ? (vaultPath.startsWith('~/') ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath))\n : path.join(resolveVaultDir());\n\n // Check if already initialized\n if (fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {\n console.log(`Vault already initialized at ${vaultDir}`);\n return;\n }\n\n console.log(`Initializing Myco vault at ${vaultDir}`);\n\n // Create directory structure\n const dirs = ['sessions', 'plans', 'memories', 'artifacts', 'team', 'buffer', 'logs'];\n for (const dir of dirs) {\n fs.mkdirSync(path.join(vaultDir, dir), { recursive: true });\n }\n\n // Write myco.yaml — all values explicit, no hidden defaults\n const config: Record<string, unknown> = {\n version: 2,\n intelligence: {\n llm: {\n provider: llmProvider,\n model: llmModel,\n ...(llmUrl ? { base_url: llmUrl } : {}),\n context_window: 8192,\n max_tokens: 1024,\n },\n embedding: {\n provider: embeddingProvider,\n model: embeddingModel,\n ...(embeddingUrl ? { base_url: embeddingUrl } : {}),\n },\n },\n daemon: {\n log_level: 'info',\n grace_period: 30,\n max_log_size: 5242880,\n },\n capture: {\n transcript_paths: [],\n artifact_watch: ['.claude/plans/', '.cursor/plans/'],\n artifact_extensions: ['.md'],\n buffer_max_events: 500,\n },\n context: {\n max_tokens: 1200,\n layers: { plans: 200, sessions: 500, memories: 300, team: 200 },\n },\n team: {\n enabled: teamEnabled,\n user,\n sync: 'git',\n },\n };\n\n fs.writeFileSync(\n path.join(vaultDir, 'myco.yaml'),\n YAML.stringify(config),\n 'utf-8',\n );\n\n // Write .gitignore\n fs.writeFileSync(path.join(vaultDir, '.gitignore'), VAULT_GITIGNORE, 'utf-8');\n\n // Write Obsidian dashboard\n fs.writeFileSync(path.join(vaultDir, '_dashboard.md'), DASHBOARD_CONTENT, 'utf-8');\n\n // Initialize FTS index\n const index = new MycoIndex(path.join(vaultDir, 'index.db'));\n initFts(index);\n index.close();\n\n // Summary\n console.log('');\n console.log('=== Myco Vault Initialized ===');\n console.log(`Path: ${vaultDir}`);\n console.log(`LLM provider: ${llmProvider} / ${llmModel}`);\n console.log(`Embedding provider: ${embeddingProvider} / ${embeddingModel}`);\n console.log(`Team mode: ${teamEnabled ? 'enabled' : 'disabled'}`);\n if (user) console.log(`User: ${user}`);\n console.log('');\n\n // If vault is outside the project, configure MYCO_VAULT_DIR for the current agent\n const projectRoot = path.resolve('.');\n const isProjectLocal = vaultDir.startsWith(projectRoot);\n if (!isProjectLocal) {\n configureVaultEnv(projectRoot, vaultDir);\n }\n\n console.log('Next: start a coding session — Myco will begin capturing automatically.');\n}\n"],"mappings":"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","names":["YAML"]}