bikky 0.1.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 (124) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +323 -0
  3. package/bin/bikky.js +6 -0
  4. package/dist/cli.d.ts +12 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +51 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +59 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +141 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/config.test.d.ts +8 -0
  13. package/dist/config.test.d.ts.map +1 -0
  14. package/dist/config.test.js +449 -0
  15. package/dist/config.test.js.map +1 -0
  16. package/dist/daemon/consolidation.d.ts +60 -0
  17. package/dist/daemon/consolidation.d.ts.map +1 -0
  18. package/dist/daemon/consolidation.js +448 -0
  19. package/dist/daemon/consolidation.js.map +1 -0
  20. package/dist/daemon/extraction.d.ts +17 -0
  21. package/dist/daemon/extraction.d.ts.map +1 -0
  22. package/dist/daemon/extraction.js +465 -0
  23. package/dist/daemon/extraction.js.map +1 -0
  24. package/dist/daemon/index.d.ts +3 -0
  25. package/dist/daemon/index.d.ts.map +1 -0
  26. package/dist/daemon/index.js +3 -0
  27. package/dist/daemon/index.js.map +1 -0
  28. package/dist/daemon/loop.d.ts +3 -0
  29. package/dist/daemon/loop.d.ts.map +1 -0
  30. package/dist/daemon/loop.js +93 -0
  31. package/dist/daemon/loop.js.map +1 -0
  32. package/dist/daemon/qdrant.d.ts +103 -0
  33. package/dist/daemon/qdrant.d.ts.map +1 -0
  34. package/dist/daemon/qdrant.js +273 -0
  35. package/dist/daemon/qdrant.js.map +1 -0
  36. package/dist/daemon/qdrant.test.d.ts +8 -0
  37. package/dist/daemon/qdrant.test.d.ts.map +1 -0
  38. package/dist/daemon/qdrant.test.js +209 -0
  39. package/dist/daemon/qdrant.test.js.map +1 -0
  40. package/dist/daemon/relations.d.ts +54 -0
  41. package/dist/daemon/relations.d.ts.map +1 -0
  42. package/dist/daemon/relations.js +290 -0
  43. package/dist/daemon/relations.js.map +1 -0
  44. package/dist/daemon/staleness.d.ts +24 -0
  45. package/dist/daemon/staleness.d.ts.map +1 -0
  46. package/dist/daemon/staleness.js +63 -0
  47. package/dist/daemon/staleness.js.map +1 -0
  48. package/dist/daemon/watcher.d.ts +11 -0
  49. package/dist/daemon/watcher.d.ts.map +1 -0
  50. package/dist/daemon/watcher.js +38 -0
  51. package/dist/daemon/watcher.js.map +1 -0
  52. package/dist/daemon/watcher.test.d.ts +8 -0
  53. package/dist/daemon/watcher.test.d.ts.map +1 -0
  54. package/dist/daemon/watcher.test.js +214 -0
  55. package/dist/daemon/watcher.test.js.map +1 -0
  56. package/dist/install.d.ts +5 -0
  57. package/dist/install.d.ts.map +1 -0
  58. package/dist/install.js +49 -0
  59. package/dist/install.js.map +1 -0
  60. package/dist/install.test.d.ts +9 -0
  61. package/dist/install.test.d.ts.map +1 -0
  62. package/dist/install.test.js +126 -0
  63. package/dist/install.test.js.map +1 -0
  64. package/dist/llm/embedding.d.ts +13 -0
  65. package/dist/llm/embedding.d.ts.map +1 -0
  66. package/dist/llm/embedding.js +127 -0
  67. package/dist/llm/embedding.js.map +1 -0
  68. package/dist/llm/embedding.test.d.ts +8 -0
  69. package/dist/llm/embedding.test.d.ts.map +1 -0
  70. package/dist/llm/embedding.test.js +117 -0
  71. package/dist/llm/embedding.test.js.map +1 -0
  72. package/dist/llm/index.d.ts +4 -0
  73. package/dist/llm/index.d.ts.map +1 -0
  74. package/dist/llm/index.js +3 -0
  75. package/dist/llm/index.js.map +1 -0
  76. package/dist/llm/inference.d.ts +12 -0
  77. package/dist/llm/inference.d.ts.map +1 -0
  78. package/dist/llm/inference.js +146 -0
  79. package/dist/llm/inference.js.map +1 -0
  80. package/dist/llm/inference.test.d.ts +8 -0
  81. package/dist/llm/inference.test.d.ts.map +1 -0
  82. package/dist/llm/inference.test.js +117 -0
  83. package/dist/llm/inference.test.js.map +1 -0
  84. package/dist/llm/types.d.ts +41 -0
  85. package/dist/llm/types.d.ts.map +1 -0
  86. package/dist/llm/types.js +5 -0
  87. package/dist/llm/types.js.map +1 -0
  88. package/dist/logger.d.ts +13 -0
  89. package/dist/logger.d.ts.map +1 -0
  90. package/dist/logger.js +41 -0
  91. package/dist/logger.js.map +1 -0
  92. package/dist/mcp/api.d.ts +30 -0
  93. package/dist/mcp/api.d.ts.map +1 -0
  94. package/dist/mcp/api.js +150 -0
  95. package/dist/mcp/api.js.map +1 -0
  96. package/dist/mcp/helpers.d.ts +35 -0
  97. package/dist/mcp/helpers.d.ts.map +1 -0
  98. package/dist/mcp/helpers.js +152 -0
  99. package/dist/mcp/helpers.js.map +1 -0
  100. package/dist/mcp/helpers.test.d.ts +5 -0
  101. package/dist/mcp/helpers.test.d.ts.map +1 -0
  102. package/dist/mcp/helpers.test.js +487 -0
  103. package/dist/mcp/helpers.test.js.map +1 -0
  104. package/dist/mcp/index.d.ts +9 -0
  105. package/dist/mcp/index.d.ts.map +1 -0
  106. package/dist/mcp/index.js +67 -0
  107. package/dist/mcp/index.js.map +1 -0
  108. package/dist/mcp/taxonomy.d.ts +38 -0
  109. package/dist/mcp/taxonomy.d.ts.map +1 -0
  110. package/dist/mcp/taxonomy.js +223 -0
  111. package/dist/mcp/taxonomy.js.map +1 -0
  112. package/dist/mcp/taxonomy.test.d.ts +5 -0
  113. package/dist/mcp/taxonomy.test.d.ts.map +1 -0
  114. package/dist/mcp/taxonomy.test.js +341 -0
  115. package/dist/mcp/taxonomy.test.js.map +1 -0
  116. package/dist/mcp/tools.d.ts +6 -0
  117. package/dist/mcp/tools.d.ts.map +1 -0
  118. package/dist/mcp/tools.js +958 -0
  119. package/dist/mcp/tools.js.map +1 -0
  120. package/dist/mcp/types.d.ts +118 -0
  121. package/dist/mcp/types.d.ts.map +1 -0
  122. package/dist/mcp/types.js +5 -0
  123. package/dist/mcp/types.js.map +1 -0
  124. package/package.json +56 -0
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Tests for the session watcher.
3
+ *
4
+ * Creates a temporary directory structure mimicking ~/.copilot/session-state/
5
+ * and verifies discoverSessions() behavior.
6
+ */
7
+ import { describe, it, before, after, beforeEach } from "node:test";
8
+ import assert from "node:assert/strict";
9
+ import fs from "node:fs";
10
+ import path from "node:path";
11
+ import os from "node:os";
12
+ import { resetConfig, saveConfig, CONFIG_DEFAULTS } from "../config.js";
13
+ import { discoverSessions } from "./watcher.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Test directory setup
16
+ // ---------------------------------------------------------------------------
17
+ let testDir;
18
+ let savedConfig = null;
19
+ function createTestDir() {
20
+ return fs.mkdtempSync(path.join(os.tmpdir(), "bikky-test-sessions-"));
21
+ }
22
+ describe("discoverSessions", () => {
23
+ before(() => {
24
+ // Save existing config state
25
+ const configPath = path.join(os.homedir(), ".bikky", "config.json");
26
+ if (fs.existsSync(configPath)) {
27
+ savedConfig = fs.readFileSync(configPath, "utf-8");
28
+ }
29
+ testDir = createTestDir();
30
+ });
31
+ after(() => {
32
+ // Clean up test directory
33
+ fs.rmSync(testDir, { recursive: true, force: true });
34
+ // Restore original config
35
+ const configPath = path.join(os.homedir(), ".bikky", "config.json");
36
+ if (savedConfig !== null) {
37
+ fs.writeFileSync(configPath, savedConfig);
38
+ }
39
+ else if (fs.existsSync(configPath)) {
40
+ fs.unlinkSync(configPath);
41
+ }
42
+ resetConfig();
43
+ });
44
+ beforeEach(() => {
45
+ resetConfig();
46
+ });
47
+ it("returns empty array when base dir does not exist", () => {
48
+ const cfg = {
49
+ ...CONFIG_DEFAULTS,
50
+ watchers: {
51
+ ...CONFIG_DEFAULTS.watchers,
52
+ copilot: {
53
+ enabled: true,
54
+ path: path.join(testDir, "nonexistent"),
55
+ },
56
+ },
57
+ };
58
+ // Don't resetConfig — use cached config to avoid races with concurrent test files
59
+ saveConfig(cfg);
60
+ const sessions = discoverSessions();
61
+ assert.deepStrictEqual(sessions, []);
62
+ });
63
+ it("returns empty array when directory exists but has no sessions", () => {
64
+ const emptyDir = path.join(testDir, "empty");
65
+ fs.mkdirSync(emptyDir, { recursive: true });
66
+ const cfg = {
67
+ ...CONFIG_DEFAULTS,
68
+ watchers: {
69
+ ...CONFIG_DEFAULTS.watchers,
70
+ copilot: { enabled: true, path: emptyDir },
71
+ },
72
+ };
73
+ saveConfig(cfg);
74
+ const sessions = discoverSessions();
75
+ assert.deepStrictEqual(sessions, []);
76
+ });
77
+ it("discovers sessions with events.jsonl files", () => {
78
+ const sessionsDir = path.join(testDir, "with-sessions");
79
+ fs.mkdirSync(sessionsDir, { recursive: true });
80
+ const sessionUuid = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
81
+ const sessionDir = path.join(sessionsDir, sessionUuid);
82
+ fs.mkdirSync(sessionDir, { recursive: true });
83
+ fs.writeFileSync(path.join(sessionDir, "events.jsonl"), '{"event":"test"}\n');
84
+ const cfg = {
85
+ ...CONFIG_DEFAULTS,
86
+ watchers: {
87
+ ...CONFIG_DEFAULTS.watchers,
88
+ copilot: { enabled: true, path: sessionsDir },
89
+ },
90
+ };
91
+ saveConfig(cfg);
92
+ const sessions = discoverSessions();
93
+ assert.strictEqual(sessions.length, 1);
94
+ assert.strictEqual(sessions[0].uuid, sessionUuid);
95
+ assert.ok(sessions[0].eventsPath.endsWith("events.jsonl"));
96
+ assert.strictEqual(sessions[0].active, false);
97
+ });
98
+ it("marks sessions with lock files as active", () => {
99
+ const sessionsDir = path.join(testDir, "active-sessions");
100
+ fs.mkdirSync(sessionsDir, { recursive: true });
101
+ const sessionUuid = "11111111-2222-3333-4444-555555555555";
102
+ const sessionDir = path.join(sessionsDir, sessionUuid);
103
+ fs.mkdirSync(sessionDir, { recursive: true });
104
+ fs.writeFileSync(path.join(sessionDir, "events.jsonl"), '{"event":"test"}\n');
105
+ fs.writeFileSync(path.join(sessionDir, "inuse.12345.lock"), "");
106
+ const cfg = {
107
+ ...CONFIG_DEFAULTS,
108
+ watchers: {
109
+ ...CONFIG_DEFAULTS.watchers,
110
+ copilot: { enabled: true, path: sessionsDir },
111
+ },
112
+ };
113
+ saveConfig(cfg);
114
+ const sessions = discoverSessions();
115
+ assert.strictEqual(sessions.length, 1);
116
+ assert.strictEqual(sessions[0].active, true);
117
+ });
118
+ it("detects both active and inactive sessions", () => {
119
+ const sessionsDir = path.join(testDir, "mixed-sessions");
120
+ fs.mkdirSync(sessionsDir, { recursive: true });
121
+ const activeUuid = "active-uuid-1111";
122
+ const activeDir = path.join(sessionsDir, activeUuid);
123
+ fs.mkdirSync(activeDir, { recursive: true });
124
+ fs.writeFileSync(path.join(activeDir, "events.jsonl"), "");
125
+ fs.writeFileSync(path.join(activeDir, "inuse.999.lock"), "");
126
+ const inactiveUuid = "inactive-uuid-2222";
127
+ const inactiveDir = path.join(sessionsDir, inactiveUuid);
128
+ fs.mkdirSync(inactiveDir, { recursive: true });
129
+ fs.writeFileSync(path.join(inactiveDir, "events.jsonl"), "");
130
+ const cfg = {
131
+ ...CONFIG_DEFAULTS,
132
+ watchers: {
133
+ ...CONFIG_DEFAULTS.watchers,
134
+ copilot: { enabled: true, path: sessionsDir },
135
+ },
136
+ };
137
+ saveConfig(cfg);
138
+ const sessions = discoverSessions();
139
+ assert.strictEqual(sessions.length, 2);
140
+ const active = sessions.find((s) => s.uuid === activeUuid);
141
+ const inactive = sessions.find((s) => s.uuid === inactiveUuid);
142
+ assert.ok(active);
143
+ assert.ok(inactive);
144
+ assert.strictEqual(active.active, true);
145
+ assert.strictEqual(inactive.active, false);
146
+ });
147
+ it("skips non-directory entries", () => {
148
+ const sessionsDir = path.join(testDir, "with-files");
149
+ fs.mkdirSync(sessionsDir, { recursive: true });
150
+ fs.writeFileSync(path.join(sessionsDir, "not-a-dir.txt"), "");
151
+ const sessionUuid = "valid-session-uuid";
152
+ const sessionDir = path.join(sessionsDir, sessionUuid);
153
+ fs.mkdirSync(sessionDir, { recursive: true });
154
+ fs.writeFileSync(path.join(sessionDir, "events.jsonl"), "");
155
+ const cfg = {
156
+ ...CONFIG_DEFAULTS,
157
+ watchers: {
158
+ ...CONFIG_DEFAULTS.watchers,
159
+ copilot: { enabled: true, path: sessionsDir },
160
+ },
161
+ };
162
+ saveConfig(cfg);
163
+ const sessions = discoverSessions();
164
+ assert.strictEqual(sessions.length, 1);
165
+ assert.strictEqual(sessions[0].uuid, sessionUuid);
166
+ });
167
+ it("skips directories without events.jsonl", () => {
168
+ const sessionsDir = path.join(testDir, "no-events");
169
+ fs.mkdirSync(sessionsDir, { recursive: true });
170
+ const noEventsUuid = "no-events-uuid";
171
+ const noEventsDir = path.join(sessionsDir, noEventsUuid);
172
+ fs.mkdirSync(noEventsDir, { recursive: true });
173
+ const withEventsUuid = "with-events-uuid";
174
+ const withEventsDir = path.join(sessionsDir, withEventsUuid);
175
+ fs.mkdirSync(withEventsDir, { recursive: true });
176
+ fs.writeFileSync(path.join(withEventsDir, "events.jsonl"), "");
177
+ const cfg = {
178
+ ...CONFIG_DEFAULTS,
179
+ watchers: {
180
+ ...CONFIG_DEFAULTS.watchers,
181
+ copilot: { enabled: true, path: sessionsDir },
182
+ },
183
+ };
184
+ saveConfig(cfg);
185
+ const sessions = discoverSessions();
186
+ assert.strictEqual(sessions.length, 1);
187
+ assert.strictEqual(sessions[0].uuid, withEventsUuid);
188
+ });
189
+ it("creates proper WatchedSession objects", () => {
190
+ const sessionsDir = path.join(testDir, "proper-sessions");
191
+ fs.mkdirSync(sessionsDir, { recursive: true });
192
+ const sessionUuid = "proper-session-uuid";
193
+ const sessionDir = path.join(sessionsDir, sessionUuid);
194
+ fs.mkdirSync(sessionDir, { recursive: true });
195
+ fs.writeFileSync(path.join(sessionDir, "events.jsonl"), "");
196
+ const cfg = {
197
+ ...CONFIG_DEFAULTS,
198
+ watchers: {
199
+ ...CONFIG_DEFAULTS.watchers,
200
+ copilot: { enabled: true, path: sessionsDir },
201
+ },
202
+ };
203
+ saveConfig(cfg);
204
+ const sessions = discoverSessions();
205
+ const session = sessions[0];
206
+ assert.ok(session);
207
+ assert.strictEqual(typeof session.uuid, "string");
208
+ assert.strictEqual(typeof session.eventsPath, "string");
209
+ assert.strictEqual(typeof session.active, "boolean");
210
+ assert.strictEqual(session.uuid, sessionUuid);
211
+ assert.strictEqual(session.eventsPath, path.join(sessionDir, "events.jsonl"));
212
+ });
213
+ });
214
+ //# sourceMappingURL=watcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.test.js","sourceRoot":"","sources":["../../src/daemon/watcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Write MCP config entries for Copilot and/or Claude Code.
3
+ */
4
+ export declare function writeInstallConfig(): Promise<void>;
5
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6CxD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Write MCP config entries for Copilot and/or Claude Code.
3
+ */
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ import os from "node:os";
7
+ export async function writeInstallConfig() {
8
+ const entry = {
9
+ type: "stdio",
10
+ command: "npx",
11
+ args: ["-y", "bikky", "mcp"],
12
+ };
13
+ // Copilot MCP config
14
+ const copilotConfigPath = path.join(os.homedir(), ".copilot", "mcp-config.json");
15
+ let config = {};
16
+ if (fs.existsSync(copilotConfigPath)) {
17
+ try {
18
+ config = JSON.parse(fs.readFileSync(copilotConfigPath, "utf-8"));
19
+ }
20
+ catch {
21
+ config = {};
22
+ }
23
+ }
24
+ if (!config.mcpServers)
25
+ config.mcpServers = {};
26
+ config.mcpServers["bikky"] = entry;
27
+ fs.mkdirSync(path.dirname(copilotConfigPath), { recursive: true });
28
+ fs.writeFileSync(copilotConfigPath, JSON.stringify(config, null, 2) + "\n");
29
+ console.log(`✅ Written to ${copilotConfigPath}`);
30
+ // Claude Code MCP config
31
+ const claudeConfigPath = path.join(os.homedir(), ".claude", "mcp.json");
32
+ let claudeConfig = {};
33
+ if (fs.existsSync(claudeConfigPath)) {
34
+ try {
35
+ claudeConfig = JSON.parse(fs.readFileSync(claudeConfigPath, "utf-8"));
36
+ }
37
+ catch {
38
+ claudeConfig = {};
39
+ }
40
+ }
41
+ if (!claudeConfig.mcpServers)
42
+ claudeConfig.mcpServers = {};
43
+ claudeConfig.mcpServers["bikky"] = entry;
44
+ fs.mkdirSync(path.dirname(claudeConfigPath), { recursive: true });
45
+ fs.writeFileSync(claudeConfigPath, JSON.stringify(claudeConfig, null, 2) + "\n");
46
+ console.log(`✅ Written to ${claudeConfigPath}`);
47
+ console.log("\n🧠 bikky is now registered. Restart your editor to activate.");
48
+ }
49
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAkBzB,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAmB;QAC5B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;KAC7B,CAAC;IAEF,qBAAqB;IACrB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAEjF,IAAI,MAAM,GAAqB,EAAE,CAAC;IAClC,IAAI,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAqB,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAC/C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAEnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,gBAAgB,iBAAiB,EAAE,CAAC,CAAC;IAEjD,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,YAAY,GAAoB,EAAE,CAAC;IACvC,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAoB,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,UAAU;QAAE,YAAY,CAAC,UAAU,GAAG,EAAE,CAAC;IAC3D,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAEzC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tests for the MCP config installer.
3
+ *
4
+ * Tests the structure of what writeInstallConfig() would write
5
+ * without actually modifying the user's home directory config files.
6
+ * We back up and restore the real config files around the test.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=install.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.test.d.ts","sourceRoot":"","sources":["../src/install.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Tests for the MCP config installer.
3
+ *
4
+ * Tests the structure of what writeInstallConfig() would write
5
+ * without actually modifying the user's home directory config files.
6
+ * We back up and restore the real config files around the test.
7
+ */
8
+ import { describe, it, before, after } from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import fs from "node:fs";
11
+ import path from "node:path";
12
+ import os from "node:os";
13
+ import { writeInstallConfig } from "./install.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Backup / restore
16
+ // ---------------------------------------------------------------------------
17
+ const copilotConfigPath = path.join(os.homedir(), ".copilot", "mcp-config.json");
18
+ const claudeConfigPath = path.join(os.homedir(), ".claude", "mcp.json");
19
+ let copilotBackup = null;
20
+ let claudeBackup = null;
21
+ function backup() {
22
+ if (fs.existsSync(copilotConfigPath)) {
23
+ copilotBackup = fs.readFileSync(copilotConfigPath, "utf-8");
24
+ }
25
+ if (fs.existsSync(claudeConfigPath)) {
26
+ claudeBackup = fs.readFileSync(claudeConfigPath, "utf-8");
27
+ }
28
+ }
29
+ function restore() {
30
+ if (copilotBackup !== null) {
31
+ fs.writeFileSync(copilotConfigPath, copilotBackup);
32
+ }
33
+ else if (fs.existsSync(copilotConfigPath)) {
34
+ // If the file didn't exist before but does now, we need to remove
35
+ // only the bikky entry, not delete the whole file (other tools may have written it)
36
+ // Actually, for safety, just leave it. The backup was null meaning it didn't exist.
37
+ // But writeInstallConfig created it. We should remove it to be clean.
38
+ fs.unlinkSync(copilotConfigPath);
39
+ }
40
+ if (claudeBackup !== null) {
41
+ fs.writeFileSync(claudeConfigPath, claudeBackup);
42
+ }
43
+ else if (fs.existsSync(claudeConfigPath)) {
44
+ fs.unlinkSync(claudeConfigPath);
45
+ }
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Tests
49
+ // ---------------------------------------------------------------------------
50
+ describe("writeInstallConfig", () => {
51
+ before(() => {
52
+ backup();
53
+ });
54
+ after(() => {
55
+ restore();
56
+ });
57
+ it("writes to copilot mcp-config.json", async () => {
58
+ await writeInstallConfig();
59
+ assert.ok(fs.existsSync(copilotConfigPath));
60
+ });
61
+ it("writes to claude mcp.json", async () => {
62
+ await writeInstallConfig();
63
+ assert.ok(fs.existsSync(claudeConfigPath));
64
+ });
65
+ it("copilot config has correct structure", async () => {
66
+ await writeInstallConfig();
67
+ const config = JSON.parse(fs.readFileSync(copilotConfigPath, "utf-8"));
68
+ assert.ok(config.mcpServers);
69
+ assert.ok(config.mcpServers.bikky);
70
+ assert.strictEqual(config.mcpServers.bikky.command, "npx");
71
+ assert.deepStrictEqual(config.mcpServers.bikky.args, ["-y", "bikky", "mcp"]);
72
+ });
73
+ it("claude config has correct structure", async () => {
74
+ await writeInstallConfig();
75
+ const config = JSON.parse(fs.readFileSync(claudeConfigPath, "utf-8"));
76
+ assert.ok(config.mcpServers);
77
+ assert.ok(config.mcpServers.bikky);
78
+ assert.strictEqual(config.mcpServers.bikky.command, "npx");
79
+ assert.deepStrictEqual(config.mcpServers.bikky.args, ["-y", "bikky", "mcp"]);
80
+ });
81
+ it("preserves existing mcpServers in copilot config", async () => {
82
+ // Write a pre-existing config with another server
83
+ fs.mkdirSync(path.dirname(copilotConfigPath), { recursive: true });
84
+ fs.writeFileSync(copilotConfigPath, JSON.stringify({
85
+ mcpServers: {
86
+ "other-tool": { command: "other", args: ["--flag"] },
87
+ },
88
+ }));
89
+ await writeInstallConfig();
90
+ const config = JSON.parse(fs.readFileSync(copilotConfigPath, "utf-8"));
91
+ // Both servers should exist
92
+ assert.ok(config.mcpServers["other-tool"]);
93
+ assert.ok(config.mcpServers.bikky);
94
+ assert.strictEqual(config.mcpServers["other-tool"].command, "other");
95
+ });
96
+ it("preserves existing mcpServers in claude config", async () => {
97
+ fs.mkdirSync(path.dirname(claudeConfigPath), { recursive: true });
98
+ fs.writeFileSync(claudeConfigPath, JSON.stringify({
99
+ mcpServers: {
100
+ "existing-server": { command: "existing", args: [] },
101
+ },
102
+ }));
103
+ await writeInstallConfig();
104
+ const config = JSON.parse(fs.readFileSync(claudeConfigPath, "utf-8"));
105
+ assert.ok(config.mcpServers["existing-server"]);
106
+ assert.ok(config.mcpServers.bikky);
107
+ });
108
+ it("overwrites existing bikky entry on re-run", async () => {
109
+ // First run
110
+ await writeInstallConfig();
111
+ // Second run
112
+ await writeInstallConfig();
113
+ const config = JSON.parse(fs.readFileSync(copilotConfigPath, "utf-8"));
114
+ assert.strictEqual(config.mcpServers.bikky.command, "npx");
115
+ assert.deepStrictEqual(config.mcpServers.bikky.args, ["-y", "bikky", "mcp"]);
116
+ });
117
+ it("handles malformed existing config file", async () => {
118
+ fs.mkdirSync(path.dirname(copilotConfigPath), { recursive: true });
119
+ fs.writeFileSync(copilotConfigPath, "not valid json!!!");
120
+ // Should not throw — should overwrite with valid config
121
+ await writeInstallConfig();
122
+ const config = JSON.parse(fs.readFileSync(copilotConfigPath, "utf-8"));
123
+ assert.ok(config.mcpServers.bikky);
124
+ });
125
+ });
126
+ //# sourceMappingURL=install.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.test.js","sourceRoot":"","sources":["../src/install.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Embedding provider — config-driven, supports Ollama (default), OpenAI, and Bedrock.
3
+ *
4
+ * Ollama uses the OpenAI-compatible /v1/embeddings HTTP format.
5
+ * OpenAI uses the same /v1/embeddings format with an API key.
6
+ * Bedrock uses AWS SDK with Titan Embed V2.
7
+ */
8
+ import type { EmbeddingProviderConfig } from "./types.js";
9
+ export declare function initEmbedding(overrides?: Partial<EmbeddingProviderConfig>): EmbeddingProviderConfig;
10
+ export declare function getEmbeddingConfig(): EmbeddingProviderConfig;
11
+ export declare function getEmbeddingDimensions(): number;
12
+ export declare function embed(text: string): Promise<number[]>;
13
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAkD1D,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAAG,uBAAuB,CAoBvG;AAMD,wBAAgB,kBAAkB,IAAI,uBAAuB,CAG5D;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAMD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B3D"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Embedding provider — config-driven, supports Ollama (default), OpenAI, and Bedrock.
3
+ *
4
+ * Ollama uses the OpenAI-compatible /v1/embeddings HTTP format.
5
+ * OpenAI uses the same /v1/embeddings format with an API key.
6
+ * Bedrock uses AWS SDK with Titan Embed V2.
7
+ */
8
+ import { BedrockRuntimeClient, InvokeModelCommand, } from "@aws-sdk/client-bedrock-runtime";
9
+ // ---------------------------------------------------------------------------
10
+ // Provider defaults
11
+ // ---------------------------------------------------------------------------
12
+ const PROVIDER_DEFAULTS = {
13
+ ollama: {
14
+ provider: "ollama",
15
+ baseUrl: "http://localhost:11434",
16
+ model: "qwen3-embedding:0.6b",
17
+ dimensions: 1024,
18
+ },
19
+ openai: {
20
+ provider: "openai",
21
+ baseUrl: "https://api.openai.com",
22
+ model: "text-embedding-3-small",
23
+ dimensions: 1536,
24
+ },
25
+ bedrock: {
26
+ provider: "bedrock",
27
+ baseUrl: "",
28
+ model: "amazon.titan-embed-text-v2:0",
29
+ dimensions: 1024,
30
+ },
31
+ };
32
+ // ---------------------------------------------------------------------------
33
+ // State
34
+ // ---------------------------------------------------------------------------
35
+ let config = null;
36
+ let bedrockClient = null;
37
+ // ---------------------------------------------------------------------------
38
+ // Init
39
+ // ---------------------------------------------------------------------------
40
+ export function initEmbedding(overrides = {}) {
41
+ const provider = overrides.provider ?? "ollama";
42
+ const defaults = PROVIDER_DEFAULTS[provider] ?? PROVIDER_DEFAULTS.ollama;
43
+ config = {
44
+ provider,
45
+ baseUrl: (overrides.baseUrl ?? defaults.baseUrl).replace(/\/+$/, ""),
46
+ model: overrides.model ?? defaults.model,
47
+ dimensions: overrides.dimensions ?? defaults.dimensions,
48
+ apiKey: overrides.apiKey ?? null,
49
+ };
50
+ if (provider === "bedrock") {
51
+ const region = process.env.AWS_BEDROCK_REGION ?? process.env.AWS_REGION ?? "us-east-1";
52
+ // Let the AWS SDK resolve credentials via its default chain:
53
+ // env vars → shared credentials file → SSO → IAM role
54
+ bedrockClient = new BedrockRuntimeClient({ region });
55
+ }
56
+ return config;
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Accessors
60
+ // ---------------------------------------------------------------------------
61
+ export function getEmbeddingConfig() {
62
+ if (!config)
63
+ throw new Error("Embedding not initialized — call initEmbedding() first");
64
+ return config;
65
+ }
66
+ export function getEmbeddingDimensions() {
67
+ if (!config)
68
+ throw new Error("Embedding not initialized — call initEmbedding() first");
69
+ return config.dimensions;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Embed
73
+ // ---------------------------------------------------------------------------
74
+ export async function embed(text) {
75
+ if (!config)
76
+ throw new Error("Embedding not initialized — call initEmbedding() first");
77
+ if (!text?.trim())
78
+ throw new Error("embed() called with empty text");
79
+ if (config.provider === "bedrock")
80
+ return bedrockEmbed(text);
81
+ // Ollama and OpenAI both use OpenAI-compatible /v1/embeddings
82
+ const headers = { "Content-Type": "application/json" };
83
+ if (config.provider === "openai" && config.apiKey) {
84
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
85
+ }
86
+ const resp = await fetch(`${config.baseUrl}/v1/embeddings`, {
87
+ method: "POST",
88
+ headers,
89
+ body: JSON.stringify({ model: config.model, input: text }),
90
+ });
91
+ if (!resp.ok) {
92
+ const body = await resp.text().catch(() => "");
93
+ throw new Error(`Embedding failed [${config.provider}/${config.model}] (${resp.status}): ${body.slice(0, 200)}`);
94
+ }
95
+ const data = (await resp.json());
96
+ const first = data.data[0];
97
+ if (!first)
98
+ throw new Error(`Embedding response from ${config.provider} missing data`);
99
+ return first.embedding;
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Bedrock Embed (Titan Embed V2)
103
+ // ---------------------------------------------------------------------------
104
+ async function bedrockEmbed(text) {
105
+ if (!bedrockClient) {
106
+ const region = process.env.AWS_BEDROCK_REGION ?? process.env.AWS_REGION ?? "us-east-1";
107
+ bedrockClient = new BedrockRuntimeClient({ region });
108
+ }
109
+ const payload = JSON.stringify({
110
+ inputText: text,
111
+ dimensions: config.dimensions,
112
+ normalize: true,
113
+ });
114
+ const command = new InvokeModelCommand({
115
+ modelId: config.model,
116
+ contentType: "application/json",
117
+ accept: "application/json",
118
+ body: new TextEncoder().encode(payload),
119
+ });
120
+ const resp = await bedrockClient.send(command);
121
+ const raw = JSON.parse(new TextDecoder().decode(resp.body));
122
+ if (!raw.embedding) {
123
+ throw new Error(`Bedrock embedding response missing data (model: ${config.model})`);
124
+ }
125
+ return raw.embedding;
126
+ }
127
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for the embedding module.
3
+ *
4
+ * These tests verify initialization and config, NOT actual embedding calls
5
+ * (which require a live Ollama/OpenAI/Bedrock service).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=embedding.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.test.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}