@agentmeshhq/agent 0.1.6 → 0.1.8

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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/context.test.d.ts +1 -0
  3. package/dist/__tests__/context.test.js +353 -0
  4. package/dist/__tests__/context.test.js.map +1 -0
  5. package/dist/cli/config.d.ts +1 -0
  6. package/dist/cli/config.js +129 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/context.d.ts +4 -0
  9. package/dist/cli/context.js +190 -0
  10. package/dist/cli/context.js.map +1 -0
  11. package/dist/cli/index.js +76 -0
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/logs.d.ts +4 -0
  14. package/dist/cli/logs.js +54 -0
  15. package/dist/cli/logs.js.map +1 -0
  16. package/dist/cli/restart.d.ts +1 -0
  17. package/dist/cli/restart.js +41 -0
  18. package/dist/cli/restart.js.map +1 -0
  19. package/dist/cli/start.d.ts +1 -0
  20. package/dist/cli/start.js +10 -5
  21. package/dist/cli/start.js.map +1 -1
  22. package/dist/cli/status.d.ts +1 -0
  23. package/dist/cli/status.js +73 -0
  24. package/dist/cli/status.js.map +1 -0
  25. package/dist/context/handoff.d.ts +48 -0
  26. package/dist/context/handoff.js +88 -0
  27. package/dist/context/handoff.js.map +1 -0
  28. package/dist/context/index.d.ts +7 -0
  29. package/dist/context/index.js +8 -0
  30. package/dist/context/index.js.map +1 -0
  31. package/dist/context/schema.d.ts +82 -0
  32. package/dist/context/schema.js +33 -0
  33. package/dist/context/schema.js.map +1 -0
  34. package/dist/context/storage.d.ts +49 -0
  35. package/dist/context/storage.js +172 -0
  36. package/dist/context/storage.js.map +1 -0
  37. package/dist/core/daemon.d.ts +7 -0
  38. package/dist/core/daemon.js +53 -2
  39. package/dist/core/daemon.js.map +1 -1
  40. package/dist/core/heartbeat.d.ts +6 -0
  41. package/dist/core/heartbeat.js +8 -0
  42. package/dist/core/heartbeat.js.map +1 -1
  43. package/dist/core/injector.d.ts +9 -0
  44. package/dist/core/injector.js +55 -3
  45. package/dist/core/injector.js.map +1 -1
  46. package/dist/core/tmux.d.ts +13 -0
  47. package/dist/core/tmux.js +62 -0
  48. package/dist/core/tmux.js.map +1 -1
  49. package/package.json +11 -11
  50. package/src/__tests__/context.test.ts +464 -0
  51. package/src/cli/config.ts +148 -0
  52. package/src/cli/context.ts +232 -0
  53. package/src/cli/index.ts +76 -0
  54. package/src/cli/logs.ts +64 -0
  55. package/src/cli/restart.ts +50 -0
  56. package/src/cli/start.ts +11 -9
  57. package/src/cli/status.ts +83 -0
  58. package/src/context/handoff.ts +122 -0
  59. package/src/context/index.ts +8 -0
  60. package/src/context/schema.ts +111 -0
  61. package/src/context/storage.ts +197 -0
  62. package/src/core/daemon.ts +59 -1
  63. package/src/core/heartbeat.ts +13 -0
  64. package/src/core/injector.ts +74 -30
  65. package/src/core/tmux.ts +75 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 therajushahi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,353 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { extractHandoffContext, formatHandoffContextSummary, parseHandoffContext, serializeHandoffContext, } from "../context/handoff.js";
5
+ import { CONTEXT_VERSION, createEmptyContext } from "../context/schema.js";
6
+ import { deleteContext, exportContext, getContextPath, importContext, listContexts, loadContext, loadOrCreateContext, saveContext, updateContext, } from "../context/storage.js";
7
+ // Mock fs module
8
+ vi.mock("node:fs");
9
+ const mockFs = vi.mocked(fs);
10
+ describe("Context Schema", () => {
11
+ describe("createEmptyContext", () => {
12
+ it("creates context with correct version", () => {
13
+ const context = createEmptyContext("agent-123", "test-agent");
14
+ expect(context.version).toBe(CONTEXT_VERSION);
15
+ });
16
+ it("creates context with agent info", () => {
17
+ const context = createEmptyContext("agent-123", "test-agent");
18
+ expect(context.agentId).toBe("agent-123");
19
+ expect(context.agentName).toBe("test-agent");
20
+ });
21
+ it("creates context with empty conversation", () => {
22
+ const context = createEmptyContext("agent-123", "test-agent");
23
+ expect(context.conversation.messageCount).toBe(0);
24
+ expect(context.conversation.topics).toEqual([]);
25
+ expect(context.conversation.accomplishments).toEqual([]);
26
+ expect(context.conversation.recentMessages).toEqual([]);
27
+ });
28
+ it("creates context with working state", () => {
29
+ const context = createEmptyContext("agent-123", "test-agent");
30
+ expect(context.workingState.workdir).toBe(process.cwd());
31
+ expect(context.workingState.recentFiles).toEqual([]);
32
+ expect(context.workingState.openFiles).toEqual([]);
33
+ });
34
+ it("creates context with empty tasks", () => {
35
+ const context = createEmptyContext("agent-123", "test-agent");
36
+ expect(context.tasks.tasks).toEqual([]);
37
+ expect(context.tasks.currentGoal).toBeUndefined();
38
+ });
39
+ });
40
+ });
41
+ describe("Context Storage", () => {
42
+ const testAgentId = "test-agent-123";
43
+ const testContext = {
44
+ version: CONTEXT_VERSION,
45
+ agentId: testAgentId,
46
+ agentName: "test-agent",
47
+ savedAt: "2026-02-24T10:00:00.000Z",
48
+ conversation: {
49
+ messageCount: 5,
50
+ topics: ["testing", "context"],
51
+ accomplishments: ["wrote tests"],
52
+ recentMessages: [],
53
+ },
54
+ workingState: {
55
+ workdir: "/home/user/project",
56
+ recentFiles: ["file1.ts", "file2.ts"],
57
+ openFiles: ["file1.ts"],
58
+ gitBranch: "main",
59
+ },
60
+ tasks: {
61
+ tasks: [{ content: "test task", status: "in_progress", priority: "high" }],
62
+ currentGoal: "implement context",
63
+ },
64
+ custom: { key: "value" },
65
+ };
66
+ beforeEach(() => {
67
+ vi.clearAllMocks();
68
+ mockFs.existsSync.mockReturnValue(true);
69
+ });
70
+ afterEach(() => {
71
+ vi.resetAllMocks();
72
+ });
73
+ describe("getContextPath", () => {
74
+ it("returns correct path for agent ID", () => {
75
+ const contextPath = getContextPath("agent-123");
76
+ expect(contextPath).toContain("agent-123.json");
77
+ expect(contextPath).toContain(".agentmesh/context");
78
+ });
79
+ });
80
+ describe("saveContext", () => {
81
+ it("creates context directory if needed", () => {
82
+ mockFs.existsSync.mockReturnValue(false);
83
+ mockFs.mkdirSync.mockReturnValue(undefined);
84
+ mockFs.writeFileSync.mockReturnValue(undefined);
85
+ saveContext(testContext);
86
+ expect(mockFs.mkdirSync).toHaveBeenCalledWith(expect.stringContaining(".agentmesh/context"), {
87
+ recursive: true,
88
+ });
89
+ });
90
+ it("writes context to file", () => {
91
+ mockFs.writeFileSync.mockReturnValue(undefined);
92
+ saveContext(testContext);
93
+ expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining(`${testAgentId}.json`), expect.any(String));
94
+ });
95
+ it("updates savedAt timestamp", () => {
96
+ mockFs.writeFileSync.mockReturnValue(undefined);
97
+ const before = new Date().toISOString();
98
+ saveContext(testContext);
99
+ const writtenData = JSON.parse(mockFs.writeFileSync.mock.calls[0][1]);
100
+ expect(new Date(writtenData.savedAt).getTime()).toBeGreaterThanOrEqual(new Date(before).getTime());
101
+ });
102
+ });
103
+ describe("loadContext", () => {
104
+ it("returns null if file does not exist", () => {
105
+ mockFs.existsSync.mockReturnValue(false);
106
+ const result = loadContext("nonexistent");
107
+ expect(result).toBeNull();
108
+ });
109
+ it("loads and parses context file", () => {
110
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
111
+ const result = loadContext(testAgentId);
112
+ expect(result).toEqual(testContext);
113
+ });
114
+ it("returns null for version mismatch", () => {
115
+ const oldContext = { ...testContext, version: 0 };
116
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(oldContext));
117
+ const result = loadContext(testAgentId);
118
+ expect(result).toBeNull();
119
+ });
120
+ it("returns null for invalid JSON", () => {
121
+ mockFs.readFileSync.mockReturnValue("invalid json");
122
+ const result = loadContext(testAgentId);
123
+ expect(result).toBeNull();
124
+ });
125
+ });
126
+ describe("loadOrCreateContext", () => {
127
+ it("returns existing context if found", () => {
128
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
129
+ const result = loadOrCreateContext(testAgentId, "test-agent");
130
+ expect(result).toEqual(testContext);
131
+ });
132
+ it("creates new context if not found", () => {
133
+ mockFs.existsSync.mockReturnValue(false);
134
+ const result = loadOrCreateContext("new-agent", "new-name");
135
+ expect(result.agentId).toBe("new-agent");
136
+ expect(result.agentName).toBe("new-name");
137
+ expect(result.version).toBe(CONTEXT_VERSION);
138
+ });
139
+ });
140
+ describe("deleteContext", () => {
141
+ it("deletes context file if exists", () => {
142
+ mockFs.unlinkSync.mockReturnValue(undefined);
143
+ const result = deleteContext(testAgentId);
144
+ expect(result).toBe(true);
145
+ expect(mockFs.unlinkSync).toHaveBeenCalled();
146
+ });
147
+ it("returns false if file does not exist", () => {
148
+ mockFs.existsSync.mockReturnValue(false);
149
+ const result = deleteContext("nonexistent");
150
+ expect(result).toBe(false);
151
+ });
152
+ });
153
+ describe("listContexts", () => {
154
+ it("returns list of saved contexts", () => {
155
+ mockFs.readdirSync.mockReturnValue(["agent1.json", "agent2.json"]);
156
+ mockFs.readFileSync.mockImplementation((filePath) => {
157
+ const id = path.basename(filePath, ".json");
158
+ return JSON.stringify({
159
+ ...testContext,
160
+ agentId: id,
161
+ savedAt: id === "agent1" ? "2026-02-24T11:00:00.000Z" : "2026-02-24T10:00:00.000Z",
162
+ });
163
+ });
164
+ const result = listContexts();
165
+ expect(result).toHaveLength(2);
166
+ expect(result[0].agentId).toBe("agent1"); // More recent first
167
+ });
168
+ it("filters non-json files", () => {
169
+ mockFs.readdirSync.mockReturnValue([
170
+ "agent1.json",
171
+ "readme.md",
172
+ ".gitkeep",
173
+ ]);
174
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
175
+ const result = listContexts();
176
+ expect(result).toHaveLength(1);
177
+ });
178
+ });
179
+ describe("updateContext", () => {
180
+ it("updates context fields", () => {
181
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
182
+ mockFs.writeFileSync.mockReturnValue(undefined);
183
+ const result = updateContext(testAgentId, {
184
+ conversation: {
185
+ ...testContext.conversation,
186
+ messageCount: 10,
187
+ },
188
+ });
189
+ expect(result?.conversation.messageCount).toBe(10);
190
+ });
191
+ it("returns null if context not found", () => {
192
+ mockFs.existsSync.mockReturnValue(false);
193
+ const result = updateContext("nonexistent", {});
194
+ expect(result).toBeNull();
195
+ });
196
+ it("preserves version and agentId", () => {
197
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
198
+ mockFs.writeFileSync.mockReturnValue(undefined);
199
+ const result = updateContext(testAgentId, {
200
+ agentName: "new-name",
201
+ });
202
+ expect(result?.version).toBe(CONTEXT_VERSION);
203
+ expect(result?.agentId).toBe(testAgentId);
204
+ });
205
+ });
206
+ describe("exportContext", () => {
207
+ it("exports context to file", () => {
208
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
209
+ mockFs.writeFileSync.mockReturnValue(undefined);
210
+ const result = exportContext(testAgentId, "/tmp/export.json");
211
+ expect(result).toBe(true);
212
+ expect(mockFs.writeFileSync).toHaveBeenCalledWith("/tmp/export.json", expect.any(String));
213
+ });
214
+ it("returns false if context not found", () => {
215
+ mockFs.existsSync.mockReturnValue(false);
216
+ const result = exportContext("nonexistent", "/tmp/export.json");
217
+ expect(result).toBe(false);
218
+ });
219
+ });
220
+ describe("importContext", () => {
221
+ it("imports context from file", () => {
222
+ mockFs.readFileSync.mockReturnValue(JSON.stringify(testContext));
223
+ mockFs.writeFileSync.mockReturnValue(undefined);
224
+ const result = importContext("/tmp/import.json");
225
+ expect(result).not.toBeNull();
226
+ expect(result?.agentId).toBe(testAgentId);
227
+ });
228
+ it("returns null if file not found", () => {
229
+ mockFs.existsSync.mockReturnValue(false);
230
+ const result = importContext("/tmp/nonexistent.json");
231
+ expect(result).toBeNull();
232
+ });
233
+ it("returns null for invalid context", () => {
234
+ mockFs.readFileSync.mockReturnValue(JSON.stringify({ invalid: "context" }));
235
+ const result = importContext("/tmp/invalid.json");
236
+ expect(result).toBeNull();
237
+ });
238
+ });
239
+ });
240
+ describe("Handoff Context", () => {
241
+ const testContext = {
242
+ version: CONTEXT_VERSION,
243
+ agentId: "test-agent-123",
244
+ agentName: "test-agent",
245
+ savedAt: "2026-02-24T10:00:00.000Z",
246
+ conversation: {
247
+ messageCount: 5,
248
+ topics: ["testing", "context", "handoff"],
249
+ accomplishments: ["wrote tests", "added feature"],
250
+ recentMessages: [],
251
+ },
252
+ workingState: {
253
+ workdir: "/home/user/project",
254
+ recentFiles: ["file1.ts", "file2.ts"],
255
+ openFiles: ["file1.ts"],
256
+ gitBranch: "feature/context",
257
+ },
258
+ tasks: {
259
+ tasks: [
260
+ { content: "task in progress", status: "in_progress", priority: "high" },
261
+ { content: "pending task", status: "pending", priority: "medium" },
262
+ { content: "completed task", status: "completed", priority: "low" },
263
+ ],
264
+ currentGoal: "implement context persistence",
265
+ },
266
+ custom: { key: "value" },
267
+ };
268
+ describe("extractHandoffContext", () => {
269
+ it("extracts workdir and git branch", () => {
270
+ const handoff = extractHandoffContext(testContext);
271
+ expect(handoff.workdir).toBe("/home/user/project");
272
+ expect(handoff.gitBranch).toBe("feature/context");
273
+ });
274
+ it("extracts current goal", () => {
275
+ const handoff = extractHandoffContext(testContext);
276
+ expect(handoff.currentGoal).toBe("implement context persistence");
277
+ });
278
+ it("only includes active tasks", () => {
279
+ const handoff = extractHandoffContext(testContext);
280
+ expect(handoff.activeTasks).toHaveLength(2);
281
+ expect(handoff.activeTasks[0].content).toBe("task in progress");
282
+ expect(handoff.activeTasks[1].content).toBe("pending task");
283
+ });
284
+ it("includes recent accomplishments", () => {
285
+ const handoff = extractHandoffContext(testContext);
286
+ expect(handoff.recentAccomplishments).toContain("wrote tests");
287
+ });
288
+ it("includes topics", () => {
289
+ const handoff = extractHandoffContext(testContext);
290
+ expect(handoff.topics).toContain("testing");
291
+ });
292
+ it("includes custom context if present", () => {
293
+ const handoff = extractHandoffContext(testContext);
294
+ expect(handoff.custom).toEqual({ key: "value" });
295
+ });
296
+ });
297
+ describe("serializeHandoffContext", () => {
298
+ it("serializes to JSON string", () => {
299
+ const handoff = extractHandoffContext(testContext);
300
+ const serialized = serializeHandoffContext(handoff);
301
+ expect(typeof serialized).toBe("string");
302
+ expect(JSON.parse(serialized)).toEqual(handoff);
303
+ });
304
+ });
305
+ describe("parseHandoffContext", () => {
306
+ it("parses valid JSON", () => {
307
+ const handoff = extractHandoffContext(testContext);
308
+ const serialized = serializeHandoffContext(handoff);
309
+ const parsed = parseHandoffContext(serialized);
310
+ expect(parsed).toEqual(handoff);
311
+ });
312
+ it("returns null for invalid JSON", () => {
313
+ const parsed = parseHandoffContext("invalid json");
314
+ expect(parsed).toBeNull();
315
+ });
316
+ });
317
+ describe("formatHandoffContextSummary", () => {
318
+ it("formats workdir", () => {
319
+ const handoff = extractHandoffContext(testContext);
320
+ const summary = formatHandoffContextSummary(handoff);
321
+ expect(summary).toContain("Working directory: /home/user/project");
322
+ });
323
+ it("formats git branch", () => {
324
+ const handoff = extractHandoffContext(testContext);
325
+ const summary = formatHandoffContextSummary(handoff);
326
+ expect(summary).toContain("Git branch: feature/context");
327
+ });
328
+ it("formats current goal", () => {
329
+ const handoff = extractHandoffContext(testContext);
330
+ const summary = formatHandoffContextSummary(handoff);
331
+ expect(summary).toContain("Current goal: implement context persistence");
332
+ });
333
+ it("formats active tasks", () => {
334
+ const handoff = extractHandoffContext(testContext);
335
+ const summary = formatHandoffContextSummary(handoff);
336
+ expect(summary).toContain("Active tasks:");
337
+ expect(summary).toContain("> task in progress");
338
+ expect(summary).toContain("- pending task");
339
+ });
340
+ it("formats accomplishments", () => {
341
+ const handoff = extractHandoffContext(testContext);
342
+ const summary = formatHandoffContextSummary(handoff);
343
+ expect(summary).toContain("Recent accomplishments:");
344
+ expect(summary).toContain("- wrote tests");
345
+ });
346
+ it("formats topics", () => {
347
+ const handoff = extractHandoffContext(testContext);
348
+ const summary = formatHandoffContextSummary(handoff);
349
+ expect(summary).toContain("Topics:");
350
+ });
351
+ });
352
+ });
353
+ //# sourceMappingURL=context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function configCmd(action: string, key?: string, value?: string): Promise<void>;
@@ -0,0 +1,129 @@
1
+ import pc from "picocolors";
2
+ import { loadConfig, saveConfig } from "../config/loader.js";
3
+ import { CONFIG_PATH } from "../config/schema.js";
4
+ export async function configCmd(action, key, value) {
5
+ const config = loadConfig();
6
+ if (!config) {
7
+ console.log(pc.red("No config found. Run 'agentmesh init' first."));
8
+ process.exit(1);
9
+ }
10
+ switch (action) {
11
+ case "show":
12
+ case "view":
13
+ showConfig(config);
14
+ break;
15
+ case "get":
16
+ if (!key) {
17
+ console.log(pc.red("Key required. Usage: agentmesh config get <key>"));
18
+ process.exit(1);
19
+ }
20
+ getConfigValue(config, key);
21
+ break;
22
+ case "set":
23
+ if (!key || value === undefined) {
24
+ console.log(pc.red("Key and value required. Usage: agentmesh config set <key> <value>"));
25
+ process.exit(1);
26
+ }
27
+ setConfigValue(config, key, value);
28
+ break;
29
+ case "path":
30
+ console.log(CONFIG_PATH);
31
+ break;
32
+ case "edit":
33
+ await editConfig();
34
+ break;
35
+ default:
36
+ // Default to show
37
+ showConfig(config);
38
+ }
39
+ }
40
+ function showConfig(config) {
41
+ console.log(pc.bold("AgentMesh Configuration\n"));
42
+ console.log(pc.dim(`Path: ${CONFIG_PATH}\n`));
43
+ // Show main settings
44
+ console.log(`hubUrl: ${pc.cyan(config.hubUrl)}`);
45
+ console.log(`workspace: ${pc.cyan(config.workspace)}`);
46
+ console.log(`apiKey: ${pc.dim(maskApiKey(config.apiKey))}`);
47
+ // Show defaults
48
+ console.log();
49
+ console.log(pc.dim("Defaults:"));
50
+ console.log(` command: ${config.defaults.command}`);
51
+ console.log(` model: ${config.defaults.model}`);
52
+ // Show agents
53
+ if (config.agents.length > 0) {
54
+ console.log();
55
+ console.log(pc.dim("Agent Configs:"));
56
+ for (const agent of config.agents) {
57
+ console.log(` ${agent.name}:`);
58
+ if (agent.command)
59
+ console.log(` command: ${agent.command}`);
60
+ if (agent.model)
61
+ console.log(` model: ${agent.model}`);
62
+ }
63
+ }
64
+ }
65
+ function getConfigValue(config, key) {
66
+ const parts = key.split(".");
67
+ let value = config;
68
+ for (const part of parts) {
69
+ if (value && typeof value === "object" && part in value) {
70
+ value = value[part];
71
+ }
72
+ else {
73
+ console.log(pc.red(`Key "${key}" not found.`));
74
+ process.exit(1);
75
+ }
76
+ }
77
+ if (typeof value === "object") {
78
+ console.log(JSON.stringify(value, null, 2));
79
+ }
80
+ else {
81
+ console.log(String(value));
82
+ }
83
+ }
84
+ function setConfigValue(config, key, value) {
85
+ const parts = key.split(".");
86
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+ let target = config;
88
+ // Navigate to parent
89
+ for (let i = 0; i < parts.length - 1; i++) {
90
+ const part = parts[i];
91
+ if (!(part in target)) {
92
+ target[part] = {};
93
+ }
94
+ target = target[part];
95
+ }
96
+ const finalKey = parts[parts.length - 1];
97
+ const oldValue = target[finalKey];
98
+ // Try to parse as JSON, otherwise use string
99
+ try {
100
+ target[finalKey] = JSON.parse(value);
101
+ }
102
+ catch {
103
+ target[finalKey] = value;
104
+ }
105
+ saveConfig(config);
106
+ console.log(pc.green(`Set ${key}:`));
107
+ console.log(` Old: ${pc.dim(String(oldValue))}`);
108
+ console.log(` New: ${pc.cyan(String(target[finalKey]))}`);
109
+ }
110
+ async function editConfig() {
111
+ const { spawn } = await import("node:child_process");
112
+ const editor = process.env.EDITOR || process.env.VISUAL || "vi";
113
+ console.log(pc.dim(`Opening ${CONFIG_PATH} with ${editor}...`));
114
+ const child = spawn(editor, [CONFIG_PATH], {
115
+ stdio: "inherit",
116
+ });
117
+ child.on("exit", (code) => {
118
+ if (code === 0) {
119
+ console.log(pc.green("Config saved."));
120
+ }
121
+ process.exit(code ?? 0);
122
+ });
123
+ }
124
+ function maskApiKey(key) {
125
+ if (!key || key.length < 12)
126
+ return "***";
127
+ return `${key.slice(0, 8)}...${key.slice(-4)}`;
128
+ }
129
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface ContextOptions {
2
+ output?: string;
3
+ }
4
+ export declare function contextCmd(action: string, nameOrPath?: string, options?: ContextOptions): Promise<void>;