@tyvm/knowhow 0.0.142 → 0.0.144

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 (57) hide show
  1. package/package.json +1 -1
  2. package/src/agents/developer/developer.ts +4 -1
  3. package/src/agents/patcher/patcher.ts +1 -1
  4. package/src/agents/tools/connectAgent.ts +2 -0
  5. package/src/agents/tools/observe.ts +2 -0
  6. package/src/agents/tools/replyToParent.ts +1 -0
  7. package/src/agents/tools/runGenerate.ts +1 -0
  8. package/src/agents/tools/sendAgentMessage.ts +1 -0
  9. package/src/agents/tools/startAgentTask.ts +1 -0
  10. package/src/agents/tools/waitForAgentCompleted.ts +1 -0
  11. package/src/chat/modules/SystemModule.ts +4 -3
  12. package/src/clients/pricing/fireworks.ts +73 -25
  13. package/src/clients/types.ts +8 -0
  14. package/src/commands/sandbox.ts +139 -114
  15. package/src/services/Mcp.ts +3 -0
  16. package/src/services/Tools.ts +12 -2
  17. package/src/types.ts +2 -0
  18. package/tests/services/Tools.test.ts +13 -11
  19. package/tests/unit/commands/sandbox.test.ts +350 -0
  20. package/ts_build/package.json +1 -1
  21. package/ts_build/src/agents/developer/developer.js +4 -0
  22. package/ts_build/src/agents/developer/developer.js.map +1 -1
  23. package/ts_build/src/agents/patcher/patcher.js +1 -1
  24. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  25. package/ts_build/src/agents/tools/connectAgent.js +2 -0
  26. package/ts_build/src/agents/tools/connectAgent.js.map +1 -1
  27. package/ts_build/src/agents/tools/observe.js +2 -0
  28. package/ts_build/src/agents/tools/observe.js.map +1 -1
  29. package/ts_build/src/agents/tools/replyToParent.js +1 -0
  30. package/ts_build/src/agents/tools/replyToParent.js.map +1 -1
  31. package/ts_build/src/agents/tools/runGenerate.js +1 -0
  32. package/ts_build/src/agents/tools/runGenerate.js.map +1 -1
  33. package/ts_build/src/agents/tools/sendAgentMessage.js +1 -0
  34. package/ts_build/src/agents/tools/sendAgentMessage.js.map +1 -1
  35. package/ts_build/src/agents/tools/startAgentTask.js +1 -0
  36. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -1
  37. package/ts_build/src/agents/tools/waitForAgentCompleted.js +1 -0
  38. package/ts_build/src/agents/tools/waitForAgentCompleted.js.map +1 -1
  39. package/ts_build/src/chat/modules/SystemModule.js +4 -3
  40. package/ts_build/src/chat/modules/SystemModule.js.map +1 -1
  41. package/ts_build/src/clients/pricing/fireworks.d.ts +26 -0
  42. package/ts_build/src/clients/pricing/fireworks.js +51 -25
  43. package/ts_build/src/clients/pricing/fireworks.js.map +1 -1
  44. package/ts_build/src/clients/types.d.ts +1 -0
  45. package/ts_build/src/commands/sandbox.js +79 -80
  46. package/ts_build/src/commands/sandbox.js.map +1 -1
  47. package/ts_build/src/services/Mcp.js.map +1 -1
  48. package/ts_build/src/services/Tools.js +7 -2
  49. package/ts_build/src/services/Tools.js.map +1 -1
  50. package/ts_build/src/types.d.ts +26 -0
  51. package/ts_build/src/types.js +2 -0
  52. package/ts_build/src/types.js.map +1 -1
  53. package/ts_build/tests/services/Tools.test.js +6 -4
  54. package/ts_build/tests/services/Tools.test.js.map +1 -1
  55. package/ts_build/tests/unit/commands/sandbox.test.d.ts +1 -0
  56. package/ts_build/tests/unit/commands/sandbox.test.js +258 -0
  57. package/ts_build/tests/unit/commands/sandbox.test.js.map +1 -0
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ jest.mock("../../../src/utils/http", () => {
4
+ const get = jest.fn();
5
+ const post = jest.fn();
6
+ const del = jest.fn();
7
+ const mock = { get, post, delete: del };
8
+ return { default: mock, __esModule: true };
9
+ });
10
+ const httpMock = require("../../../src/utils/http").default;
11
+ const mockGet = httpMock.get;
12
+ const mockPost = httpMock.post;
13
+ const mockDelete = httpMock.delete;
14
+ jest.mock("../../../src/services/KnowhowClient", () => ({
15
+ KNOWHOW_API_URL: "https://api.example.com",
16
+ loadKnowhowJwt: jest.fn().mockReturnValue("test-jwt-token"),
17
+ }));
18
+ const commander_1 = require("commander");
19
+ const sandbox_1 = require("../../../src/commands/sandbox");
20
+ function makeProgram() {
21
+ const program = new commander_1.Command();
22
+ program.exitOverride();
23
+ (0, sandbox_1.addSandboxCommand)(program);
24
+ return program;
25
+ }
26
+ function makeSnapshot(overrides = {}) {
27
+ return {
28
+ id: "snap123456789012",
29
+ sandboxId: "sb123456789012",
30
+ label: "tests-ready",
31
+ description: "CI snapshot",
32
+ status: "ready",
33
+ errorMsg: null,
34
+ statusMessage: null,
35
+ regenerationSandboxId: null,
36
+ snapshotContent: "disk_only",
37
+ setupScript: "npm install && npm run build",
38
+ ...overrides,
39
+ };
40
+ }
41
+ function makeSandbox(overrides = {}) {
42
+ return {
43
+ id: "sb123456789012",
44
+ name: "knowhow-web",
45
+ status: "running",
46
+ vmStatus: "running",
47
+ ...overrides,
48
+ };
49
+ }
50
+ describe("sandbox regenerate-snapshot", () => {
51
+ let program;
52
+ let consoleSpy;
53
+ let consoleErrorSpy;
54
+ beforeEach(() => {
55
+ jest.clearAllMocks();
56
+ jest.useFakeTimers();
57
+ program = makeProgram();
58
+ consoleSpy = jest.spyOn(console, "log").mockImplementation(() => { });
59
+ consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(() => { });
60
+ });
61
+ afterEach(() => {
62
+ jest.useRealTimers();
63
+ consoleSpy.mockRestore();
64
+ consoleErrorSpy.mockRestore();
65
+ });
66
+ it("calls POST /regenerate and returns immediately when --no-wait is set", async () => {
67
+ const snap = makeSnapshot();
68
+ mockGet.mockResolvedValueOnce({ data: snap });
69
+ mockPost.mockResolvedValueOnce({
70
+ data: makeSnapshot({ regenerationSandboxId: "eph123456789012" }),
71
+ });
72
+ await program.parseAsync([
73
+ "node", "knowhow", "sandbox", "regenerate-snapshot",
74
+ "--sandbox-id", "sb123456789012",
75
+ "--snapshot-id", "snap123456789012",
76
+ "--no-wait",
77
+ ]);
78
+ expect(mockPost).toHaveBeenCalledTimes(1);
79
+ expect(mockPost).toHaveBeenCalledWith(expect.stringContaining("/sandboxes/sb123456789012/snapshots/snap123456789012/regenerate"), undefined, expect.any(Object));
80
+ expect(mockGet).toHaveBeenCalledTimes(1);
81
+ });
82
+ it("polls snapshot status until regenerationSandboxId clears and status is ready", async () => {
83
+ const snap = makeSnapshot();
84
+ mockGet.mockResolvedValueOnce({ data: snap });
85
+ mockPost.mockResolvedValueOnce({
86
+ data: makeSnapshot({ regenerationSandboxId: "eph123456789012" }),
87
+ });
88
+ mockGet.mockResolvedValueOnce({
89
+ data: makeSnapshot({
90
+ regenerationSandboxId: "eph123456789012",
91
+ statusMessage: "Running setupScript...",
92
+ }),
93
+ });
94
+ mockGet.mockResolvedValueOnce({
95
+ data: makeSnapshot({ regenerationSandboxId: null, status: "ready" }),
96
+ });
97
+ const parsePromise = program.parseAsync([
98
+ "node", "knowhow", "sandbox", "regenerate-snapshot",
99
+ "--sandbox-id", "sb123456789012",
100
+ "--snapshot-id", "snap123456789012",
101
+ ]);
102
+ await Promise.resolve();
103
+ await Promise.resolve();
104
+ await Promise.resolve();
105
+ jest.runAllTimers();
106
+ await Promise.resolve();
107
+ await Promise.resolve();
108
+ jest.runAllTimers();
109
+ await Promise.resolve();
110
+ await Promise.resolve();
111
+ jest.runAllTimers();
112
+ await parsePromise;
113
+ expect(mockPost).toHaveBeenCalledTimes(1);
114
+ expect(mockGet).toHaveBeenCalledTimes(3);
115
+ const logOutput = consoleSpy.mock.calls.map((c) => c.join(" ")).join("\n");
116
+ expect(logOutput).toContain("✅ Snapshot regeneration complete!");
117
+ });
118
+ it("does NOT fork a sandbox or exec a script directly (old behavior)", async () => {
119
+ const snap = makeSnapshot();
120
+ mockGet.mockResolvedValueOnce({ data: snap });
121
+ mockPost.mockResolvedValueOnce({
122
+ data: makeSnapshot({ regenerationSandboxId: "eph123456789012" }),
123
+ });
124
+ mockGet.mockResolvedValueOnce({
125
+ data: makeSnapshot({ regenerationSandboxId: null, status: "ready" }),
126
+ });
127
+ const parsePromise = program.parseAsync([
128
+ "node", "knowhow", "sandbox", "regenerate-snapshot",
129
+ "--sandbox-id", "sb123456789012",
130
+ "--snapshot-id", "snap123456789012",
131
+ ]);
132
+ await Promise.resolve();
133
+ await Promise.resolve();
134
+ await Promise.resolve();
135
+ jest.runAllTimers();
136
+ await Promise.resolve();
137
+ await Promise.resolve();
138
+ await parsePromise;
139
+ const postCalls = mockPost.mock.calls.map((c) => c[0]);
140
+ expect(postCalls.every((url) => url.includes("/regenerate"))).toBe(true);
141
+ expect(postCalls.some((url) => url.includes("/fork"))).toBe(false);
142
+ expect(postCalls.some((url) => url.includes("/exec"))).toBe(false);
143
+ });
144
+ it("shows statusMessage updates during polling", async () => {
145
+ const snap = makeSnapshot();
146
+ mockGet.mockResolvedValueOnce({ data: snap });
147
+ mockPost.mockResolvedValueOnce({
148
+ data: makeSnapshot({ regenerationSandboxId: "eph123456789012" }),
149
+ });
150
+ mockGet.mockResolvedValueOnce({
151
+ data: makeSnapshot({
152
+ regenerationSandboxId: "eph123456789012",
153
+ statusMessage: "Uploading 500 MB / 1.0 GB (50%)",
154
+ }),
155
+ });
156
+ mockGet.mockResolvedValueOnce({
157
+ data: makeSnapshot({ regenerationSandboxId: null, status: "ready" }),
158
+ });
159
+ const parsePromise = program.parseAsync([
160
+ "node", "knowhow", "sandbox", "regenerate-snapshot",
161
+ "--sandbox-id", "sb123456789012",
162
+ "--snapshot-id", "snap123456789012",
163
+ ]);
164
+ for (let i = 0; i < 10; i++) {
165
+ await Promise.resolve();
166
+ jest.runAllTimers();
167
+ }
168
+ await parsePromise;
169
+ const logOutput = consoleSpy.mock.calls.map((c) => c.join(" ")).join("\n");
170
+ expect(logOutput).toContain("Uploading 500 MB / 1.0 GB (50%)");
171
+ }, 15000);
172
+ it("requires --sandbox-id or --sandbox-name", async () => {
173
+ await expect(program.parseAsync([
174
+ "node", "knowhow", "sandbox", "regenerate-snapshot",
175
+ "--snapshot-id", "snap123456789012",
176
+ ])).rejects.toThrow(/sandbox-id|sandbox-name/i);
177
+ });
178
+ it("requires --snapshot-id or --snapshot-name", async () => {
179
+ await expect(program.parseAsync([
180
+ "node", "knowhow", "sandbox", "regenerate-snapshot",
181
+ "--sandbox-id", "sb123456789012",
182
+ ])).rejects.toThrow(/snapshot-id|snapshot-name/i);
183
+ });
184
+ });
185
+ describe("sandbox snapshot-status", () => {
186
+ let program;
187
+ let consoleSpy;
188
+ beforeEach(() => {
189
+ jest.clearAllMocks();
190
+ jest.useFakeTimers();
191
+ program = makeProgram();
192
+ consoleSpy = jest.spyOn(console, "log").mockImplementation(() => { });
193
+ });
194
+ afterEach(() => {
195
+ jest.useRealTimers();
196
+ consoleSpy.mockRestore();
197
+ });
198
+ it("prints snapshot status without waiting when --wait not set", async () => {
199
+ const snap = makeSnapshot({ regenerationSandboxId: "eph123456789012", status: "ready" });
200
+ mockGet.mockResolvedValueOnce({ data: snap });
201
+ await program.parseAsync([
202
+ "node", "knowhow", "sandbox", "snapshot-status",
203
+ "--sandbox-id", "sb123456789012",
204
+ "--snapshot-id", "snap123456789012",
205
+ ]);
206
+ const logOutput = consoleSpy.mock.calls.map((c) => c.join(" ")).join("\n");
207
+ expect(logOutput).toContain("regenerating");
208
+ expect(logOutput).toContain("eph123456789012");
209
+ expect(mockGet).toHaveBeenCalledTimes(1);
210
+ });
211
+ it("shows ready status when not regenerating", async () => {
212
+ const snap = makeSnapshot({ id: "snap123456789012", status: "ready" });
213
+ mockGet.mockResolvedValueOnce({ data: snap });
214
+ await program.parseAsync([
215
+ "node", "knowhow", "sandbox", "snapshot-status",
216
+ "--sandbox-id", "sb123456789012",
217
+ "--snapshot-id", "snap123456789012",
218
+ ]);
219
+ const logOutput = consoleSpy.mock.calls.map((c) => c.join(" ")).join("\n");
220
+ expect(logOutput).toContain("ready");
221
+ });
222
+ it("polls when --wait is set and regeneration is in progress", async () => {
223
+ const snapInProgress = makeSnapshot({ regenerationSandboxId: "eph123456789012" });
224
+ const snapDone = makeSnapshot({ regenerationSandboxId: null, status: "ready" });
225
+ mockGet.mockResolvedValueOnce({ data: snapInProgress });
226
+ mockGet.mockResolvedValueOnce({ data: snapInProgress });
227
+ mockGet.mockResolvedValueOnce({ data: snapDone });
228
+ const parsePromise = program.parseAsync([
229
+ "node", "knowhow", "sandbox", "snapshot-status",
230
+ "--sandbox-id", "sb123456789012",
231
+ "--snapshot-id", "snap123456789012",
232
+ "--wait",
233
+ ]);
234
+ for (let i = 0; i < 10; i++) {
235
+ await Promise.resolve();
236
+ jest.runAllTimers();
237
+ }
238
+ await parsePromise;
239
+ const logOutput = consoleSpy.mock.calls.map((c) => c.join(" ")).join("\n");
240
+ expect(logOutput).toContain("Done");
241
+ expect(mockGet).toHaveBeenCalledTimes(3);
242
+ }, 15000);
243
+ it("outputs raw JSON with --json flag", async () => {
244
+ const snap = makeSnapshot();
245
+ mockGet.mockResolvedValueOnce({ data: snap });
246
+ await program.parseAsync([
247
+ "node", "knowhow", "sandbox", "snapshot-status",
248
+ "--sandbox-id", "sb123456789012",
249
+ "--snapshot-id", "snap123456789012",
250
+ "--json",
251
+ ]);
252
+ const logOutput = consoleSpy.mock.calls.map((c) => c.join(" ")).join("\n");
253
+ const parsed = JSON.parse(logOutput);
254
+ expect(parsed.id).toBe("snap123456789012");
255
+ expect(parsed.status).toBe("ready");
256
+ });
257
+ });
258
+ //# sourceMappingURL=sandbox.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.test.js","sourceRoot":"","sources":["../../../../tests/unit/commands/sandbox.test.ts"],"names":[],"mappings":"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"}