@goondocks/myco 0.2.13 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) 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-5EZ7QF6J.js +96 -0
  7. package/dist/chunk-5EZ7QF6J.js.map +1 -0
  8. package/dist/chunk-6FQISQNA.js +61 -0
  9. package/dist/chunk-6FQISQNA.js.map +1 -0
  10. package/dist/{chunk-S4WBXXO6.js → chunk-BMJX2IDQ.js} +2 -2
  11. package/dist/chunk-EF4JVH24.js +7299 -0
  12. package/dist/chunk-EF4JVH24.js.map +1 -0
  13. package/dist/{chunk-YXZEP5U6.js → chunk-ISCT2SI6.js} +11 -7301
  14. package/dist/chunk-ISCT2SI6.js.map +1 -0
  15. package/dist/{chunk-6C26YFOA.js → chunk-N6IAW33G.js} +248 -4306
  16. package/dist/chunk-N6IAW33G.js.map +1 -0
  17. package/dist/{chunk-C2YPBQQM.js → chunk-NTYYYC32.js} +3 -3
  18. package/dist/{chunk-NKJIZSPD.js → chunk-P2Q77C5F.js} +3 -3
  19. package/dist/chunk-PAUPHPOC.js +111 -0
  20. package/dist/chunk-PAUPHPOC.js.map +1 -0
  21. package/dist/chunk-PZUWP5VK.js +44 -0
  22. package/dist/{chunk-O5VSPHDL.js → chunk-Q7BEFSOV.js} +3 -40
  23. package/dist/{chunk-O5VSPHDL.js.map → chunk-Q7BEFSOV.js.map} +1 -1
  24. package/dist/chunk-QQWUV3TC.js +3691 -0
  25. package/dist/chunk-QQWUV3TC.js.map +1 -0
  26. package/dist/chunk-RGVBGTD6.js +21 -0
  27. package/dist/chunk-RGVBGTD6.js.map +1 -0
  28. package/dist/chunk-SAKJMNSR.js +50 -0
  29. package/dist/chunk-SAKJMNSR.js.map +1 -0
  30. package/dist/chunk-TJJRIVZ7.js +56 -0
  31. package/dist/chunk-TJJRIVZ7.js.map +1 -0
  32. package/dist/chunk-XQXXF6MU.js +96 -0
  33. package/dist/chunk-XQXXF6MU.js.map +1 -0
  34. package/dist/chunk-XW3OL55U.js +160 -0
  35. package/dist/chunk-XW3OL55U.js.map +1 -0
  36. package/dist/cli-ZHUR53CS.js +76 -0
  37. package/dist/cli-ZHUR53CS.js.map +1 -0
  38. package/dist/client-HORA3CC4.js +11 -0
  39. package/dist/client-HORA3CC4.js.map +1 -0
  40. package/dist/config-MD4XMLUS.js +101 -0
  41. package/dist/config-MD4XMLUS.js.map +1 -0
  42. package/dist/detect-providers-6RQCQZOI.js +35 -0
  43. package/dist/detect-providers-6RQCQZOI.js.map +1 -0
  44. package/dist/init-LLLHUNSY.js +120 -0
  45. package/dist/init-LLLHUNSY.js.map +1 -0
  46. package/dist/logs-BSTBZHDR.js +84 -0
  47. package/dist/logs-BSTBZHDR.js.map +1 -0
  48. package/dist/{main-ORWCEWNJ.js → main-JY6O6ZVH.js} +60 -15
  49. package/dist/{main-ORWCEWNJ.js.map → main-JY6O6ZVH.js.map} +1 -1
  50. package/dist/rebuild-YAN3TPFB.js +78 -0
  51. package/dist/rebuild-YAN3TPFB.js.map +1 -0
  52. package/dist/restart-NH5MX45I.js +50 -0
  53. package/dist/restart-NH5MX45I.js.map +1 -0
  54. package/dist/search-W3ECVSTH.js +120 -0
  55. package/dist/search-W3ECVSTH.js.map +1 -0
  56. package/dist/{server-J3AQ3YFA.js → server-DLBATUNG.js} +29 -16
  57. package/dist/{server-J3AQ3YFA.js.map → server-DLBATUNG.js.map} +1 -1
  58. package/dist/session-5GI2YU6R.js +44 -0
  59. package/dist/session-5GI2YU6R.js.map +1 -0
  60. package/dist/{session-start-BEC4JMNZ.js → session-start-DECLNJDI.js} +8 -6
  61. package/dist/{session-start-BEC4JMNZ.js.map → session-start-DECLNJDI.js.map} +1 -1
  62. package/dist/src/cli.js +8 -1
  63. package/dist/src/cli.js.map +1 -1
  64. package/dist/src/daemon/main.js +8 -1
  65. package/dist/src/daemon/main.js.map +1 -1
  66. package/dist/src/hooks/post-tool-use.js +5 -4
  67. package/dist/src/hooks/post-tool-use.js.map +1 -1
  68. package/dist/src/hooks/session-end.js +5 -4
  69. package/dist/src/hooks/session-end.js.map +1 -1
  70. package/dist/src/hooks/session-start.js +8 -1
  71. package/dist/src/hooks/session-start.js.map +1 -1
  72. package/dist/src/hooks/stop.js +7 -5
  73. package/dist/src/hooks/stop.js.map +1 -1
  74. package/dist/src/hooks/user-prompt-submit.js +5 -4
  75. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  76. package/dist/src/mcp/server.js +8 -1
  77. package/dist/src/mcp/server.js.map +1 -1
  78. package/dist/stats-7VEZN2WF.js +77 -0
  79. package/dist/stats-7VEZN2WF.js.map +1 -0
  80. package/dist/verify-HN5DWV2H.js +50 -0
  81. package/dist/verify-HN5DWV2H.js.map +1 -0
  82. package/package.json +1 -1
  83. package/dist/chunk-6C26YFOA.js.map +0 -1
  84. package/dist/chunk-YXZEP5U6.js.map +0 -1
  85. package/dist/cli-KMWJFK5Y.js +0 -623
  86. package/dist/cli-KMWJFK5Y.js.map +0 -1
  87. package/dist/client-TEUHXGOY.js +0 -10
  88. /package/dist/{chunk-BXFS4PCJ.js.map → chunk-2QEJKG7R.js.map} +0 -0
  89. /package/dist/{chunk-MAFUTKOZ.js.map → chunk-2TKJPRZL.js.map} +0 -0
  90. /package/dist/{chunk-S4WBXXO6.js.map → chunk-BMJX2IDQ.js.map} +0 -0
  91. /package/dist/{chunk-C2YPBQQM.js.map → chunk-NTYYYC32.js.map} +0 -0
  92. /package/dist/{chunk-NKJIZSPD.js.map → chunk-P2Q77C5F.js.map} +0 -0
  93. /package/dist/{client-TEUHXGOY.js.map → chunk-PZUWP5VK.js.map} +0 -0
@@ -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"]}
@@ -0,0 +1,84 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ DEFAULT_LOG_TAIL,
4
+ matchesFilter,
5
+ queryLogs
6
+ } from "./chunk-BMJX2IDQ.js";
7
+ import {
8
+ LEVEL_ORDER
9
+ } from "./chunk-5EZ7QF6J.js";
10
+ import {
11
+ formatLogLine,
12
+ parseIntFlag,
13
+ parseStringFlag
14
+ } from "./chunk-SAKJMNSR.js";
15
+ import "./chunk-PZUWP5VK.js";
16
+
17
+ // src/cli/logs.ts
18
+ import fs from "fs";
19
+ import path from "path";
20
+ var FOLLOW_POLL_INTERVAL_MS = 500;
21
+ function run(args, vaultDir) {
22
+ const logDir = path.join(vaultDir, "logs");
23
+ const follow = args.includes("--follow") || args.includes("-f");
24
+ const limit = parseIntFlag(args, "--tail", "-n") ?? DEFAULT_LOG_TAIL;
25
+ const rawLevel = parseStringFlag(args, "--level", "-l");
26
+ if (rawLevel && !(rawLevel in LEVEL_ORDER)) {
27
+ console.error(`Invalid level: ${rawLevel}. Valid levels: ${Object.keys(LEVEL_ORDER).join(", ")}`);
28
+ process.exit(1);
29
+ }
30
+ const level = rawLevel;
31
+ const component = parseStringFlag(args, "--component", "-c");
32
+ const since = parseStringFlag(args, "--since");
33
+ const until = parseStringFlag(args, "--until");
34
+ const result = queryLogs(logDir, { limit, level, component, since, until });
35
+ for (const e of result.entries) {
36
+ process.stdout.write(formatLogLine(e) + "\n");
37
+ }
38
+ if (result.truncated) {
39
+ process.stdout.write(` ... ${result.total - result.entries.length} earlier entries omitted
40
+ `);
41
+ }
42
+ if (!follow) return;
43
+ const followFilter = { level, component, until };
44
+ const logPath = path.join(logDir, "daemon.log");
45
+ let offset = 0;
46
+ try {
47
+ offset = fs.statSync(logPath).size;
48
+ } catch {
49
+ }
50
+ fs.watchFile(logPath, { interval: FOLLOW_POLL_INTERVAL_MS }, (curr, prev) => {
51
+ if (curr.size < prev.size || curr.ino !== prev.ino) {
52
+ offset = 0;
53
+ }
54
+ if (curr.size <= offset) return;
55
+ try {
56
+ const fd = fs.openSync(logPath, "r");
57
+ const buf = Buffer.alloc(curr.size - offset);
58
+ fs.readSync(fd, buf, 0, buf.length, offset);
59
+ fs.closeSync(fd);
60
+ const text = buf.toString("utf-8");
61
+ const lastNewline = text.lastIndexOf("\n");
62
+ if (lastNewline < 0) return;
63
+ offset += Buffer.byteLength(text.slice(0, lastNewline + 1));
64
+ for (const line of text.slice(0, lastNewline).split("\n")) {
65
+ if (!line.trim()) continue;
66
+ try {
67
+ const e = JSON.parse(line);
68
+ if (!matchesFilter(e, followFilter)) continue;
69
+ process.stdout.write(formatLogLine(e) + "\n");
70
+ } catch {
71
+ }
72
+ }
73
+ } catch {
74
+ }
75
+ });
76
+ process.on("SIGINT", () => {
77
+ fs.unwatchFile(logPath);
78
+ process.exit(0);
79
+ });
80
+ }
81
+ export {
82
+ run
83
+ };
84
+ //# sourceMappingURL=logs-BSTBZHDR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/logs.ts"],"sourcesContent":["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":";;;;;;;;;;;;;;;;;AAGA,OAAO,QAAQ;AACf,OAAO,UAAU;AAGjB,IAAM,0BAA0B;AAEzB,SAAS,IAAI,MAAgB,UAAwB;AAC1D,QAAM,SAAS,KAAK,KAAK,UAAU,MAAM;AACzC,QAAM,SAAS,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,IAAI;AAC9D,QAAM,QAAQ,aAAa,MAAM,UAAU,IAAI,KAAK;AACpD,QAAM,WAAW,gBAAgB,MAAM,WAAW,IAAI;AACtD,MAAI,YAAY,EAAE,YAAY,cAAc;AAC1C,YAAQ,MAAM,kBAAkB,QAAQ,mBAAmB,OAAO,KAAK,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE;AAChG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,QAAQ;AACd,QAAM,YAAY,gBAAgB,MAAM,eAAe,IAAI;AAC3D,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAC7C,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAG7C,QAAM,SAAS,UAAU,QAAQ,EAAE,OAAO,OAAO,WAAW,OAAO,MAAM,CAAC;AAC1E,aAAW,KAAK,OAAO,SAAS;AAC9B,YAAQ,OAAO,MAAM,cAAc,CAAC,IAAI,IAAI;AAAA,EAC9C;AACA,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO,MAAM,SAAS,OAAO,QAAQ,OAAO,QAAQ,MAAM;AAAA,CAA4B;AAAA,EAChG;AAEA,MAAI,CAAC,OAAQ;AAIb,QAAM,eAAe,EAAE,OAAO,WAAW,MAAM;AAC/C,QAAM,UAAU,KAAK,KAAK,QAAQ,YAAY;AAC9C,MAAI,SAAS;AACb,MAAI;AACF,aAAS,GAAG,SAAS,OAAO,EAAE;AAAA,EAChC,QAAQ;AAAA,EAER;AAEA,KAAG,UAAU,SAAS,EAAE,UAAU,wBAAwB,GAAG,CAAC,MAAM,SAAS;AAC3E,QAAI,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,KAAK;AAElD,eAAS;AAAA,IACX;AACA,QAAI,KAAK,QAAQ,OAAQ;AAEzB,QAAI;AACF,YAAM,KAAK,GAAG,SAAS,SAAS,GAAG;AACnC,YAAM,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM;AAC3C,SAAG,SAAS,IAAI,KAAK,GAAG,IAAI,QAAQ,MAAM;AAC1C,SAAG,UAAU,EAAE;AAEf,YAAM,OAAO,IAAI,SAAS,OAAO;AAEjC,YAAM,cAAc,KAAK,YAAY,IAAI;AACzC,UAAI,cAAc,EAAG;AACrB,gBAAU,OAAO,WAAW,KAAK,MAAM,GAAG,cAAc,CAAC,CAAC;AAE1D,iBAAW,QAAQ,KAAK,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,GAAG;AACzD,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,gBAAM,IAAI,KAAK,MAAM,IAAI;AACzB,cAAI,CAAC,cAAc,GAAG,YAAY,EAAG;AACrC,kBAAQ,OAAO,MAAM,cAAc,CAAC,IAAI,IAAI;AAAA,QAC9C,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AAID,UAAQ,GAAG,UAAU,MAAM;AACzB,OAAG,YAAY,OAAO;AACtB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":[]}
@@ -7,26 +7,39 @@ import {
7
7
  sessionNoteId,
8
8
  sessionRelativePath,
9
9
  sessionWikilink
10
- } from "./chunk-NKJIZSPD.js";
10
+ } from "./chunk-P2Q77C5F.js";
11
11
  import {
12
12
  ARTIFACT_TYPES,
13
- DaemonLogger,
14
- VectorIndex,
15
- createEmbeddingProvider,
16
- createLlmProvider,
17
- generateEmbedding,
18
13
  indexNote,
19
- initFts,
20
14
  rebuildIndex
21
- } from "./chunk-6C26YFOA.js";
15
+ } from "./chunk-QQWUV3TC.js";
16
+ import {
17
+ generateEmbedding
18
+ } from "./chunk-RGVBGTD6.js";
19
+ import {
20
+ DaemonLogger
21
+ } from "./chunk-5EZ7QF6J.js";
22
+ import {
23
+ initFts
24
+ } from "./chunk-6FQISQNA.js";
25
+ import {
26
+ createEmbeddingProvider,
27
+ createLlmProvider
28
+ } from "./chunk-N6IAW33G.js";
29
+ import {
30
+ VectorIndex
31
+ } from "./chunk-XQXXF6MU.js";
22
32
  import {
23
33
  MycoIndex
24
34
  } from "./chunk-PA3VMINE.js";
35
+ import "./chunk-XW3OL55U.js";
25
36
  import {
26
37
  external_exports,
27
- loadConfig,
38
+ loadConfig
39
+ } from "./chunk-ISCT2SI6.js";
40
+ import {
28
41
  require_dist
29
- } from "./chunk-YXZEP5U6.js";
42
+ } from "./chunk-EF4JVH24.js";
30
43
  import {
31
44
  EventBuffer
32
45
  } from "./chunk-I7PMGO6S.js";
@@ -35,7 +48,7 @@ import {
35
48
  claudeCodeAdapter,
36
49
  createPerProjectAdapter,
37
50
  extensionForMimeType
38
- } from "./chunk-BXFS4PCJ.js";
51
+ } from "./chunk-2QEJKG7R.js";
39
52
  import {
40
53
  AI_RESPONSE_PREVIEW_CHARS,
41
54
  CANDIDATE_CONTENT_PREVIEW,
@@ -57,9 +70,11 @@ import {
57
70
  SESSION_CONTEXT_MAX_PLANS,
58
71
  STALE_BUFFER_MAX_AGE_MS,
59
72
  SUMMARY_MAX_TOKENS,
60
- TITLE_MAX_TOKENS,
73
+ TITLE_MAX_TOKENS
74
+ } from "./chunk-Q7BEFSOV.js";
75
+ import {
61
76
  __toESM
62
- } from "./chunk-O5VSPHDL.js";
77
+ } from "./chunk-PZUWP5VK.js";
63
78
 
64
79
  // src/daemon/server.ts
65
80
  import http from "http";
@@ -2696,6 +2711,7 @@ async function main() {
2696
2711
  const bufferDir = path7.join(vaultDir, "buffer");
2697
2712
  const sessionBuffers = /* @__PURE__ */ new Map();
2698
2713
  const sessionFilePaths = /* @__PURE__ */ new Map();
2714
+ const capturedArtifactPaths = /* @__PURE__ */ new Map();
2699
2715
  if (fs5.existsSync(bufferDir)) {
2700
2716
  const cutoff = Date.now() - STALE_BUFFER_MAX_AGE_MS;
2701
2717
  for (const file of fs5.readdirSync(bufferDir)) {
@@ -2776,6 +2792,31 @@ ${content}`,
2776
2792
  observations: result.observations.length,
2777
2793
  degraded: result.degraded
2778
2794
  });
2795
+ const allPaths = sessionFilePaths.get(sessionId);
2796
+ const alreadyCaptured = capturedArtifactPaths.get(sessionId) ?? /* @__PURE__ */ new Set();
2797
+ if (allPaths && allPaths.size > alreadyCaptured.size) {
2798
+ const newPaths = new Set([...allPaths].filter((p) => !alreadyCaptured.has(p)));
2799
+ const candidates = collectArtifactCandidates(
2800
+ newPaths,
2801
+ { artifact_extensions: config.capture.artifact_extensions },
2802
+ process.cwd()
2803
+ );
2804
+ if (candidates.length > 0) {
2805
+ processor.classifyArtifacts(candidates, sessionId).then((classified) => captureArtifacts(candidates, classified, sessionId, { vault, ...indexDeps }, lineageGraph)).then(() => {
2806
+ if (!capturedArtifactPaths.has(sessionId)) {
2807
+ capturedArtifactPaths.set(sessionId, /* @__PURE__ */ new Set());
2808
+ }
2809
+ const captured = capturedArtifactPaths.get(sessionId);
2810
+ for (const c of candidates) {
2811
+ const absPath = path7.resolve(process.cwd(), c.path);
2812
+ captured.add(absPath);
2813
+ }
2814
+ }).catch((err) => logger.warn("processor", "Incremental artifact capture failed", {
2815
+ session_id: sessionId,
2816
+ error: err.message
2817
+ }));
2818
+ }
2819
+ }
2779
2820
  });
2780
2821
  server.registerRoute("POST", "/sessions/register", async (body) => {
2781
2822
  const { session_id, branch, started_at } = RegisterBody.parse(body);
@@ -2821,6 +2862,7 @@ ${content}`,
2821
2862
  }
2822
2863
  sessionBuffers.delete(session_id);
2823
2864
  sessionFilePaths.delete(session_id);
2865
+ capturedArtifactPaths.delete(session_id);
2824
2866
  server.updateDaemonJsonSessions(registry.sessions);
2825
2867
  logger.info("lifecycle", "Session unregistered", { session_id });
2826
2868
  return { ok: true, sessions: registry.sessions };
@@ -2849,6 +2891,7 @@ ${content}`,
2849
2891
  sessionFilePaths.set(event.session_id, /* @__PURE__ */ new Set());
2850
2892
  }
2851
2893
  sessionFilePaths.get(event.session_id).add(filePath);
2894
+ capturedArtifactPaths.get(event.session_id)?.delete(filePath);
2852
2895
  }
2853
2896
  }
2854
2897
  }
@@ -2932,8 +2975,10 @@ ${content}`,
2932
2975
  existingTurnCount = turnMatches?.length ?? 0;
2933
2976
  }
2934
2977
  const writtenFiles = sessionFilePaths.get(sessionId) ?? /* @__PURE__ */ new Set();
2978
+ const alreadyCaptured = capturedArtifactPaths.get(sessionId) ?? /* @__PURE__ */ new Set();
2979
+ const uncapturedFiles = new Set([...writtenFiles].filter((p) => !alreadyCaptured.has(p)));
2935
2980
  const artifactCandidates = collectArtifactCandidates(
2936
- writtenFiles,
2981
+ uncapturedFiles,
2937
2982
  { artifact_extensions: config.capture.artifact_extensions },
2938
2983
  process.cwd()
2939
2984
  );
@@ -3211,4 +3256,4 @@ export {
3211
3256
  chokidar/index.js:
3212
3257
  (*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) *)
3213
3258
  */
3214
- //# sourceMappingURL=main-ORWCEWNJ.js.map
3259
+ //# sourceMappingURL=main-JY6O6ZVH.js.map