@superblocksteam/sdk 2.0.118-next.0 → 2.0.118-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/cli-replacement/dev.d.mts +0 -6
  3. package/dist/cli-replacement/dev.d.mts.map +1 -1
  4. package/dist/cli-replacement/dev.mjs +0 -1
  5. package/dist/cli-replacement/dev.mjs.map +1 -1
  6. package/dist/client.d.ts +6 -67
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +0 -94
  9. package/dist/client.js.map +1 -1
  10. package/dist/dev-utils/dev-server-persist.test.mjs +17 -117
  11. package/dist/dev-utils/dev-server-persist.test.mjs.map +1 -1
  12. package/dist/dev-utils/dev-server.d.mts +1 -19
  13. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  14. package/dist/dev-utils/dev-server.mjs +28 -296
  15. package/dist/dev-utils/dev-server.mjs.map +1 -1
  16. package/dist/flag.d.ts +1 -1
  17. package/dist/flag.d.ts.map +1 -1
  18. package/dist/flag.js +3 -3
  19. package/dist/flag.js.map +1 -1
  20. package/dist/index.d.ts +3 -4
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/sdk.d.ts +1 -8
  25. package/dist/sdk.d.ts.map +1 -1
  26. package/dist/sdk.js +1 -24
  27. package/dist/sdk.js.map +1 -1
  28. package/dist/sdk.test.js +1 -102
  29. package/dist/sdk.test.js.map +1 -1
  30. package/dist/telemetry/index.d.ts +1 -2
  31. package/dist/telemetry/index.d.ts.map +1 -1
  32. package/dist/telemetry/index.js +1 -8
  33. package/dist/telemetry/index.js.map +1 -1
  34. package/dist/telemetry/logging.d.ts +2 -1
  35. package/dist/telemetry/logging.d.ts.map +1 -1
  36. package/dist/telemetry/logging.js +1 -1
  37. package/dist/telemetry/logging.js.map +1 -1
  38. package/dist/types/common.d.ts +1 -1
  39. package/dist/types/common.d.ts.map +1 -1
  40. package/dist/version-control.d.mts.map +1 -1
  41. package/dist/version-control.mjs +19 -14
  42. package/dist/version-control.mjs.map +1 -1
  43. package/eslint.config.js +0 -6
  44. package/package.json +8 -8
  45. package/src/cli-replacement/dev.mts +0 -8
  46. package/src/client.ts +6 -189
  47. package/src/dev-utils/dev-server-persist.test.mts +19 -170
  48. package/src/dev-utils/dev-server.mts +32 -366
  49. package/src/flag.ts +4 -4
  50. package/src/index.ts +1 -19
  51. package/src/sdk.test.ts +6 -145
  52. package/src/sdk.ts +0 -36
  53. package/src/telemetry/index.ts +1 -9
  54. package/src/telemetry/logging.ts +2 -2
  55. package/src/types/common.ts +1 -1
  56. package/src/version-control.mts +30 -11
  57. package/test/version-control.test.mts +2 -0
  58. package/tsconfig.tsbuildinfo +1 -1
  59. package/turbo.json +0 -1
  60. package/dist/dev-utils/dedupe-async.d.ts +0 -16
  61. package/dist/dev-utils/dedupe-async.d.ts.map +0 -1
  62. package/dist/dev-utils/dedupe-async.js +0 -27
  63. package/dist/dev-utils/dedupe-async.js.map +0 -1
  64. package/dist/dev-utils/dedupe-async.test.d.ts +0 -2
  65. package/dist/dev-utils/dedupe-async.test.d.ts.map +0 -1
  66. package/dist/dev-utils/dedupe-async.test.js +0 -120
  67. package/dist/dev-utils/dedupe-async.test.js.map +0 -1
  68. package/dist/dev-utils/dev-server-metrics.d.mts +0 -95
  69. package/dist/dev-utils/dev-server-metrics.d.mts.map +0 -1
  70. package/dist/dev-utils/dev-server-metrics.mjs +0 -193
  71. package/dist/dev-utils/dev-server-metrics.mjs.map +0 -1
  72. package/dist/telemetry/memory-metrics.d.ts +0 -3
  73. package/dist/telemetry/memory-metrics.d.ts.map +0 -1
  74. package/dist/telemetry/memory-metrics.js +0 -59
  75. package/dist/telemetry/memory-metrics.js.map +0 -1
  76. package/src/dev-utils/dedupe-async.test.ts +0 -151
  77. package/src/dev-utils/dedupe-async.ts +0 -45
  78. package/src/dev-utils/dev-server-metrics.mts +0 -252
  79. package/src/telemetry/memory-metrics.ts +0 -90
@@ -1,11 +1,8 @@
1
1
  import type * as NodeChildProcess from "node:child_process";
2
2
  import { EventEmitter } from "node:events";
3
- import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
3
  import { PassThrough } from "node:stream";
7
4
 
8
- import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
5
+ import { describe, expect, it, vi } from "vitest";
9
6
 
10
7
  const { spawnMock } = vi.hoisted(() => ({
11
8
  spawnMock: vi.fn(),
@@ -25,14 +22,6 @@ vi.mock("node:child_process", async () => {
25
22
  };
26
23
  });
27
24
 
28
- // Use a static import so the slow `dev-server.mjs` module graph (vite, react
29
- // plugin, workspace deps) loads during file evaluation rather than inside each
30
- // test, where the cold-import cost easily exceeds the default 5s test timeout.
31
- import {
32
- createWorkspacePersistArchive,
33
- getSuperblocksTarExcludes,
34
- } from "./dev-server.mjs";
35
-
36
25
  function createMockProcess() {
37
26
  return Object.assign(new EventEmitter(), {
38
27
  stdin: new PassThrough(),
@@ -41,53 +30,8 @@ function createMockProcess() {
41
30
  });
42
31
  }
43
32
 
44
- describe("getSuperblocksTarExcludes", () => {
45
- let tempRoot: string;
46
-
47
- beforeAll(() => {
48
- tempRoot = mkdtempSync(join(tmpdir(), "persist-test-"));
49
- });
50
-
51
- afterAll(() => {
52
- rmSync(tempRoot, { recursive: true, force: true });
53
- });
54
-
55
- it("excludes .superblocks entirely when the directory does not exist", () => {
56
- const result = getSuperblocksTarExcludes(tempRoot);
57
- expect(result).toEqual(["--exclude", ".superblocks"]);
58
- });
59
-
60
- it("excludes subdirs not in the safelist and keeps context/drafts", () => {
61
- const sb = join(tempRoot, ".superblocks");
62
- mkdirSync(sb);
63
- mkdirSync(join(sb, "context"));
64
- mkdirSync(join(sb, "drafts"));
65
- mkdirSync(join(sb, "recordings"));
66
- mkdirSync(join(sb, "scratch"));
67
- mkdirSync(join(sb, "system-skills"));
68
-
69
- const result = getSuperblocksTarExcludes(tempRoot);
70
-
71
- // Safelisted dirs must NOT appear
72
- expect(result).not.toContain(".superblocks/context");
73
- expect(result).not.toContain(".superblocks/drafts");
74
-
75
- // Non-safelisted dirs must be excluded
76
- expect(result).toContain(".superblocks/recordings");
77
- expect(result).toContain(".superblocks/scratch");
78
- expect(result).toContain(".superblocks/system-skills");
79
-
80
- // Each excluded dir has a preceding --exclude flag
81
- for (const name of ["recordings", "scratch", "system-skills"]) {
82
- const idx = result.indexOf(`.superblocks/${name}`);
83
- expect(idx).toBeGreaterThan(0);
84
- expect(result[idx - 1]).toBe("--exclude");
85
- }
86
- });
87
- });
88
-
89
33
  describe("createWorkspacePersistArchive", () => {
90
- it("archive respects excludes", async () => {
34
+ it("excludes node_modules from the tar archive", async () => {
91
35
  const tarProc = createMockProcess();
92
36
  const zstdProc = createMockProcess();
93
37
  spawnMock.mockImplementation((command: string) => {
@@ -103,17 +47,27 @@ describe("createWorkspacePersistArchive", () => {
103
47
  return zstdProc;
104
48
  });
105
49
 
50
+ const { createWorkspacePersistArchive } = await import("./dev-server.mjs");
51
+
106
52
  await expect(createWorkspacePersistArchive("/workspace")).resolves.toEqual(
107
53
  Buffer.from("archive"),
108
54
  );
109
55
 
110
56
  const tarCall = spawnMock.mock.calls.find(([command]) => command === "tar");
111
57
  expect(tarCall).toBeDefined();
112
- const args: string[] = tarCall?.[1];
113
-
114
- // Standard excludes are always present
115
- expect(args).toContain(".git");
116
- expect(args).toContain("node_modules");
58
+ expect(tarCall?.[1]).toEqual([
59
+ "cf",
60
+ "-",
61
+ "--exclude",
62
+ ".git",
63
+ "--exclude",
64
+ "node_modules",
65
+ "--exclude",
66
+ ".superblocks",
67
+ "-C",
68
+ "/workspace",
69
+ ".",
70
+ ]);
117
71
  });
118
72
 
119
73
  it("rejects if tar fails after zstd closes successfully", async () => {
@@ -133,115 +87,10 @@ describe("createWorkspacePersistArchive", () => {
133
87
  return zstdProc;
134
88
  });
135
89
 
90
+ const { createWorkspacePersistArchive } = await import("./dev-server.mjs");
91
+
136
92
  await expect(
137
93
  createWorkspacePersistArchive("/workspace"),
138
94
  ).rejects.toThrowError(/^tar archival failed \(code 2\): tar failed$/);
139
95
  });
140
96
  });
141
-
142
- describe("createWorkspacePersistUploadHeaders", () => {
143
- it("forwards presigned upload headers and adds the archive content length", async () => {
144
- const { createWorkspacePersistUploadHeaders } =
145
- await import("./dev-server.mjs");
146
-
147
- expect(
148
- createWorkspacePersistUploadHeaders(123, {
149
- "Content-Type": "application/custom-zstd",
150
- "x-amz-server-side-encryption": "AES256",
151
- }),
152
- ).toEqual({
153
- "content-length": "123",
154
- "content-type": "application/custom-zstd",
155
- "x-amz-server-side-encryption": "AES256",
156
- });
157
- });
158
-
159
- it("normalizes presigned upload header names case-insensitively", async () => {
160
- const { createWorkspacePersistUploadHeaders } =
161
- await import("./dev-server.mjs");
162
-
163
- expect(
164
- createWorkspacePersistUploadHeaders(789, {
165
- "content-type": "application/custom-zstd",
166
- "content-length": "1",
167
- "x-amz-server-side-encryption": "AES256",
168
- }),
169
- ).toEqual({
170
- "content-length": "789",
171
- "content-type": "application/custom-zstd",
172
- "x-amz-server-side-encryption": "AES256",
173
- });
174
- });
175
-
176
- it("keeps the legacy content headers when SABS sends only a URL", async () => {
177
- const { createWorkspacePersistUploadHeaders } =
178
- await import("./dev-server.mjs");
179
-
180
- expect(createWorkspacePersistUploadHeaders(456)).toEqual({
181
- "content-length": "456",
182
- "content-type": "application/zstd",
183
- });
184
- });
185
- });
186
-
187
- describe("isWorkspacePersistUploadHeaders", () => {
188
- it("accepts undefined (legacy SABS payloads with no uploadHeaders)", async () => {
189
- const { isWorkspacePersistUploadHeaders } =
190
- await import("./dev-server.mjs");
191
-
192
- expect(isWorkspacePersistUploadHeaders(undefined)).toBe(true);
193
- });
194
-
195
- it("accepts a valid string map", async () => {
196
- const { isWorkspacePersistUploadHeaders } =
197
- await import("./dev-server.mjs");
198
-
199
- expect(
200
- isWorkspacePersistUploadHeaders({
201
- "content-type": "application/zstd",
202
- "x-amz-server-side-encryption": "AES256",
203
- }),
204
- ).toBe(true);
205
- });
206
-
207
- it("rejects null, arrays, and non-string values", async () => {
208
- const { isWorkspacePersistUploadHeaders } =
209
- await import("./dev-server.mjs");
210
-
211
- expect(isWorkspacePersistUploadHeaders(null)).toBe(false);
212
- expect(isWorkspacePersistUploadHeaders([])).toBe(false);
213
- expect(isWorkspacePersistUploadHeaders({ "x-foo": 1 })).toBe(false);
214
- });
215
-
216
- it("rejects case-insensitive duplicate keys", async () => {
217
- const { isWorkspacePersistUploadHeaders } =
218
- await import("./dev-server.mjs");
219
-
220
- expect(
221
- isWorkspacePersistUploadHeaders({
222
- "Content-Type": "application/zstd",
223
- "content-type": "application/custom-zstd",
224
- }),
225
- ).toBe(false);
226
- });
227
-
228
- it("rejects header names with illegal characters", async () => {
229
- const { isWorkspacePersistUploadHeaders } =
230
- await import("./dev-server.mjs");
231
-
232
- // Spaces are not allowed in HTTP token names.
233
- expect(isWorkspacePersistUploadHeaders({ "bad header": "value" })).toBe(
234
- false,
235
- );
236
- });
237
-
238
- it("rejects header values with illegal characters", async () => {
239
- const { isWorkspacePersistUploadHeaders } =
240
- await import("./dev-server.mjs");
241
-
242
- // CR/LF in header values is not allowed (header injection guard).
243
- expect(isWorkspacePersistUploadHeaders({ "x-foo": "bad\r\nvalue" })).toBe(
244
- false,
245
- );
246
- });
247
- });