@jamesaphoenix/tx-api-server 0.1.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 (109) hide show
  1. package/dist/__tests__/api.test.d.ts +7 -0
  2. package/dist/__tests__/api.test.d.ts.map +1 -0
  3. package/dist/__tests__/api.test.js +184 -0
  4. package/dist/__tests__/api.test.js.map +1 -0
  5. package/dist/__tests__/auth.test.d.ts +7 -0
  6. package/dist/__tests__/auth.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth.test.js +174 -0
  8. package/dist/__tests__/auth.test.js.map +1 -0
  9. package/dist/__tests__/body-limit.test.d.ts +7 -0
  10. package/dist/__tests__/body-limit.test.d.ts.map +1 -0
  11. package/dist/__tests__/body-limit.test.js +60 -0
  12. package/dist/__tests__/body-limit.test.js.map +1 -0
  13. package/dist/__tests__/health.test.d.ts.map +1 -0
  14. package/dist/__tests__/health.test.js.map +1 -0
  15. package/dist/__tests__/log-reader.test.d.ts +8 -0
  16. package/dist/__tests__/log-reader.test.d.ts.map +1 -0
  17. package/dist/__tests__/log-reader.test.js +55 -0
  18. package/dist/__tests__/log-reader.test.js.map +1 -0
  19. package/dist/__tests__/rate-limit.test.d.ts.map +1 -0
  20. package/dist/__tests__/rate-limit.test.js.map +1 -0
  21. package/dist/__tests__/server-lib.test.d.ts +10 -0
  22. package/dist/__tests__/server-lib.test.d.ts.map +1 -0
  23. package/dist/__tests__/server-lib.test.js +145 -0
  24. package/dist/__tests__/server-lib.test.js.map +1 -0
  25. package/dist/api.d.ts +1616 -0
  26. package/dist/api.d.ts.map +1 -0
  27. package/dist/api.js +566 -0
  28. package/dist/api.js.map +1 -0
  29. package/dist/index.d.ts +16 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +19 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/middleware/auth.d.ts +31 -0
  34. package/dist/middleware/auth.d.ts.map +1 -0
  35. package/dist/middleware/auth.js +65 -0
  36. package/dist/middleware/auth.js.map +1 -0
  37. package/dist/middleware/body-limit.d.ts +33 -0
  38. package/dist/middleware/body-limit.d.ts.map +1 -0
  39. package/dist/middleware/body-limit.js +50 -0
  40. package/dist/middleware/body-limit.js.map +1 -0
  41. package/dist/middleware/cors.d.ts +15 -0
  42. package/dist/middleware/cors.d.ts.map +1 -0
  43. package/dist/middleware/cors.js +31 -0
  44. package/dist/middleware/cors.js.map +1 -0
  45. package/dist/middleware/error.d.ts +26 -0
  46. package/dist/middleware/error.d.ts.map +1 -0
  47. package/dist/middleware/error.js +84 -0
  48. package/dist/middleware/error.js.map +1 -0
  49. package/dist/middleware/rate-limit.d.ts +59 -0
  50. package/dist/middleware/rate-limit.d.ts.map +1 -0
  51. package/dist/middleware/rate-limit.js +296 -0
  52. package/dist/middleware/rate-limit.js.map +1 -0
  53. package/dist/routes/attempts.d.ts +9 -0
  54. package/dist/routes/attempts.d.ts.map +1 -0
  55. package/dist/routes/attempts.js +26 -0
  56. package/dist/routes/attempts.js.map +1 -0
  57. package/dist/routes/claims.d.ts +9 -0
  58. package/dist/routes/claims.d.ts.map +1 -0
  59. package/dist/routes/claims.js +42 -0
  60. package/dist/routes/claims.js.map +1 -0
  61. package/dist/routes/docs.d.ts +9 -0
  62. package/dist/routes/docs.d.ts.map +1 -0
  63. package/dist/routes/docs.js +80 -0
  64. package/dist/routes/docs.js.map +1 -0
  65. package/dist/routes/health.d.ts +8 -0
  66. package/dist/routes/health.d.ts.map +1 -0
  67. package/dist/routes/health.js +101 -0
  68. package/dist/routes/health.js.map +1 -0
  69. package/dist/routes/invariants.d.ts +9 -0
  70. package/dist/routes/invariants.d.ts.map +1 -0
  71. package/dist/routes/invariants.js +64 -0
  72. package/dist/routes/invariants.js.map +1 -0
  73. package/dist/routes/learnings.d.ts +8 -0
  74. package/dist/routes/learnings.d.ts.map +1 -0
  75. package/dist/routes/learnings.js +93 -0
  76. package/dist/routes/learnings.js.map +1 -0
  77. package/dist/routes/runs.d.ts +8 -0
  78. package/dist/routes/runs.d.ts.map +1 -0
  79. package/dist/routes/runs.js +195 -0
  80. package/dist/routes/runs.js.map +1 -0
  81. package/dist/routes/sync.d.ts +8 -0
  82. package/dist/routes/sync.d.ts.map +1 -0
  83. package/dist/routes/sync.js +67 -0
  84. package/dist/routes/sync.js.map +1 -0
  85. package/dist/routes/tasks.d.ts +9 -0
  86. package/dist/routes/tasks.d.ts.map +1 -0
  87. package/dist/routes/tasks.js +167 -0
  88. package/dist/routes/tasks.js.map +1 -0
  89. package/dist/runtime.d.ts +10 -0
  90. package/dist/runtime.d.ts.map +1 -0
  91. package/dist/runtime.js +10 -0
  92. package/dist/runtime.js.map +1 -0
  93. package/dist/server-lib.d.ts +26 -0
  94. package/dist/server-lib.d.ts.map +1 -0
  95. package/dist/server-lib.js +123 -0
  96. package/dist/server-lib.js.map +1 -0
  97. package/dist/server.d.ts +14 -0
  98. package/dist/server.d.ts.map +1 -0
  99. package/dist/server.js +15 -0
  100. package/dist/server.js.map +1 -0
  101. package/dist/utils/log-reader.d.ts +26 -0
  102. package/dist/utils/log-reader.d.ts.map +1 -0
  103. package/dist/utils/log-reader.js +52 -0
  104. package/dist/utils/log-reader.js.map +1 -0
  105. package/dist/utils/transcript-parser.d.ts +40 -0
  106. package/dist/utils/transcript-parser.d.ts.map +1 -0
  107. package/dist/utils/transcript-parser.js +216 -0
  108. package/dist/utils/transcript-parser.js.map +1 -0
  109. package/package.json +75 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * API Definition Tests
3
+ *
4
+ * Tests error types, mapCoreError mapping, and API structure.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * API Definition Tests
3
+ *
4
+ * Tests error types, mapCoreError mapping, and API structure.
5
+ */
6
+ import { describe, it, expect } from "vitest";
7
+ import { Schema } from "effect";
8
+ import { NotFound, BadRequest, InternalError, Unauthorized, Forbidden, ServiceUnavailable, mapCoreError, SafePathString, TxApi, HealthGroup, TasksGroup, LearningsGroup, RunsGroup, SyncGroup, } from "../api.js";
9
+ // =============================================================================
10
+ // Error Type Tests
11
+ // =============================================================================
12
+ describe("Error types", () => {
13
+ it("should create NotFound with message", () => {
14
+ const error = new NotFound({ message: "Task not found" });
15
+ expect(error._tag).toBe("NotFound");
16
+ expect(error.message).toBe("Task not found");
17
+ });
18
+ it("should create BadRequest with message", () => {
19
+ const error = new BadRequest({ message: "Invalid input" });
20
+ expect(error._tag).toBe("BadRequest");
21
+ expect(error.message).toBe("Invalid input");
22
+ });
23
+ it("should create InternalError with message", () => {
24
+ const error = new InternalError({ message: "Something went wrong" });
25
+ expect(error._tag).toBe("InternalError");
26
+ expect(error.message).toBe("Something went wrong");
27
+ });
28
+ it("should create Unauthorized with message", () => {
29
+ const error = new Unauthorized({ message: "Missing credentials" });
30
+ expect(error._tag).toBe("Unauthorized");
31
+ expect(error.message).toBe("Missing credentials");
32
+ });
33
+ it("should create Forbidden with message", () => {
34
+ const error = new Forbidden({ message: "Access denied" });
35
+ expect(error._tag).toBe("Forbidden");
36
+ expect(error.message).toBe("Access denied");
37
+ });
38
+ it("should create ServiceUnavailable with message", () => {
39
+ const error = new ServiceUnavailable({ message: "Service down" });
40
+ expect(error._tag).toBe("ServiceUnavailable");
41
+ expect(error.message).toBe("Service down");
42
+ });
43
+ });
44
+ // =============================================================================
45
+ // mapCoreError Tests
46
+ // =============================================================================
47
+ describe("mapCoreError", () => {
48
+ describe("maps not-found errors to NotFound", () => {
49
+ it("should map TaskNotFoundError", () => {
50
+ const result = mapCoreError({ _tag: "TaskNotFoundError", message: "Task tx-abc123 not found" });
51
+ expect(result._tag).toBe("NotFound");
52
+ expect(result.message).toBe("Task tx-abc123 not found");
53
+ });
54
+ it("should map LearningNotFoundError", () => {
55
+ const result = mapCoreError({ _tag: "LearningNotFoundError", message: "Learning 42 not found" });
56
+ expect(result._tag).toBe("NotFound");
57
+ expect(result.message).toBe("Learning 42 not found");
58
+ });
59
+ it("should map FileLearningNotFoundError", () => {
60
+ const result = mapCoreError({ _tag: "FileLearningNotFoundError", message: "Not found" });
61
+ expect(result._tag).toBe("NotFound");
62
+ });
63
+ it("should map AttemptNotFoundError", () => {
64
+ const result = mapCoreError({ _tag: "AttemptNotFoundError", message: "Not found" });
65
+ expect(result._tag).toBe("NotFound");
66
+ });
67
+ });
68
+ describe("maps validation errors to BadRequest", () => {
69
+ it("should map ValidationError", () => {
70
+ const result = mapCoreError({ _tag: "ValidationError", message: "Title is required" });
71
+ expect(result._tag).toBe("BadRequest");
72
+ expect(result.message).toBe("Title is required");
73
+ });
74
+ it("should map CircularDependencyError", () => {
75
+ const result = mapCoreError({ _tag: "CircularDependencyError", message: "Cycle detected" });
76
+ expect(result._tag).toBe("BadRequest");
77
+ expect(result.message).toBe("Cycle detected");
78
+ });
79
+ });
80
+ describe("maps service errors to ServiceUnavailable", () => {
81
+ it("should map EmbeddingUnavailableError", () => {
82
+ const result = mapCoreError({ _tag: "EmbeddingUnavailableError", message: "No embedding model" });
83
+ expect(result._tag).toBe("ServiceUnavailable");
84
+ expect(result.message).toBe("No embedding model");
85
+ });
86
+ });
87
+ describe("maps database and unknown tagged errors to InternalError", () => {
88
+ it("should map DatabaseError", () => {
89
+ const result = mapCoreError({ _tag: "DatabaseError", message: "Connection failed" });
90
+ expect(result._tag).toBe("InternalError");
91
+ expect(result.message).toBe("Connection failed");
92
+ });
93
+ it("should map unknown tagged errors to InternalError", () => {
94
+ const result = mapCoreError({ _tag: "SomeNewError", message: "Unknown issue" });
95
+ expect(result._tag).toBe("InternalError");
96
+ expect(result.message).toBe("Unknown issue");
97
+ });
98
+ });
99
+ describe("handles non-tagged errors", () => {
100
+ it("should map string errors to InternalError", () => {
101
+ const result = mapCoreError("Something broke");
102
+ expect(result._tag).toBe("InternalError");
103
+ expect(result.message).toBe("Something broke");
104
+ });
105
+ it("should map Error objects to InternalError", () => {
106
+ const result = mapCoreError(new Error("Unexpected"));
107
+ expect(result._tag).toBe("InternalError");
108
+ });
109
+ it("should map null to InternalError", () => {
110
+ const result = mapCoreError(null);
111
+ expect(result._tag).toBe("InternalError");
112
+ expect(result.message).toBe("null");
113
+ });
114
+ it("should map undefined to InternalError", () => {
115
+ const result = mapCoreError(undefined);
116
+ expect(result._tag).toBe("InternalError");
117
+ expect(result.message).toBe("undefined");
118
+ });
119
+ it("should use _tag as message when no message field present", () => {
120
+ const result = mapCoreError({ _tag: "TaskNotFoundError" });
121
+ expect(result._tag).toBe("NotFound");
122
+ expect(result.message).toBe("TaskNotFoundError");
123
+ });
124
+ });
125
+ });
126
+ // =============================================================================
127
+ // API Structure Tests
128
+ // =============================================================================
129
+ describe("API structure", () => {
130
+ it("should export TxApi class", () => {
131
+ expect(TxApi).toBeDefined();
132
+ });
133
+ it("should export all groups", () => {
134
+ expect(HealthGroup).toBeDefined();
135
+ expect(TasksGroup).toBeDefined();
136
+ expect(LearningsGroup).toBeDefined();
137
+ expect(RunsGroup).toBeDefined();
138
+ expect(SyncGroup).toBeDefined();
139
+ });
140
+ });
141
+ // =============================================================================
142
+ // SafePathString Tests
143
+ // =============================================================================
144
+ describe("SafePathString", () => {
145
+ const decode = Schema.decodeUnknownSync(SafePathString);
146
+ describe("accepts valid paths", () => {
147
+ it("should accept absolute paths", () => {
148
+ expect(decode("/home/user/.claude/projects/session.jsonl")).toBe("/home/user/.claude/projects/session.jsonl");
149
+ });
150
+ it("should accept paths with .tx/runs/", () => {
151
+ expect(decode("/project/.tx/runs/run-abc12345/stdout.log")).toBe("/project/.tx/runs/run-abc12345/stdout.log");
152
+ });
153
+ it("should accept tilde paths", () => {
154
+ expect(decode("~/.claude/projects/abc/session.jsonl")).toBe("~/.claude/projects/abc/session.jsonl");
155
+ });
156
+ it("should accept single dots in paths", () => {
157
+ expect(decode("/home/user/./file.txt")).toBe("/home/user/./file.txt");
158
+ });
159
+ it("should accept files named with double dots in name (not as segment)", () => {
160
+ expect(decode("/home/user/file..txt")).toBe("/home/user/file..txt");
161
+ });
162
+ });
163
+ describe("rejects traversal attacks", () => {
164
+ it("should reject paths with .. traversal", () => {
165
+ expect(() => decode("/home/user/../etc/passwd")).toThrow();
166
+ });
167
+ it("should reject paths starting with ..", () => {
168
+ expect(() => decode("../etc/passwd")).toThrow();
169
+ });
170
+ it("should reject paths ending with ..", () => {
171
+ expect(() => decode("/home/user/..")).toThrow();
172
+ });
173
+ it("should reject bare ..", () => {
174
+ expect(() => decode("..")).toThrow();
175
+ });
176
+ it("should reject paths with null bytes", () => {
177
+ expect(() => decode("/home/user/\0/file.txt")).toThrow();
178
+ });
179
+ it("should reject paths with embedded null byte before extension", () => {
180
+ expect(() => decode("/home/user/file.txt\0.jpg")).toThrow();
181
+ });
182
+ });
183
+ });
184
+ //# sourceMappingURL=api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Authentication Middleware Tests
3
+ *
4
+ * Tests API key extraction, timing-safe comparison, and middleware behavior.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Authentication Middleware Tests
3
+ *
4
+ * Tests API key extraction, timing-safe comparison, and middleware behavior.
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
7
+ import { isAuthEnabled, extractApiKey, timingSafeEqual, authMiddleware } from "../middleware/auth.js";
8
+ // =============================================================================
9
+ // isAuthEnabled Tests
10
+ // =============================================================================
11
+ describe("isAuthEnabled", () => {
12
+ let originalApiKey;
13
+ beforeEach(() => {
14
+ originalApiKey = process.env.TX_API_KEY;
15
+ });
16
+ afterEach(() => {
17
+ if (originalApiKey === undefined) {
18
+ delete process.env.TX_API_KEY;
19
+ }
20
+ else {
21
+ process.env.TX_API_KEY = originalApiKey;
22
+ }
23
+ });
24
+ it("should return false when TX_API_KEY is not set", () => {
25
+ delete process.env.TX_API_KEY;
26
+ expect(isAuthEnabled()).toBe(false);
27
+ });
28
+ it("should return false when TX_API_KEY is empty string", () => {
29
+ process.env.TX_API_KEY = "";
30
+ expect(isAuthEnabled()).toBe(false);
31
+ });
32
+ it("should return true when TX_API_KEY is set", () => {
33
+ process.env.TX_API_KEY = "test-key-12345";
34
+ expect(isAuthEnabled()).toBe(true);
35
+ });
36
+ it("should return true for any non-empty TX_API_KEY value", () => {
37
+ process.env.TX_API_KEY = "x";
38
+ expect(isAuthEnabled()).toBe(true);
39
+ });
40
+ });
41
+ // =============================================================================
42
+ // extractApiKey Tests
43
+ // =============================================================================
44
+ describe("extractApiKey", () => {
45
+ it("should extract X-Api-Key header", () => {
46
+ const result = extractApiKey({ "x-api-key": "my-secret" });
47
+ expect(result).toBe("my-secret");
48
+ });
49
+ it("should extract Bearer token from Authorization header", () => {
50
+ const result = extractApiKey({ "authorization": "Bearer my-token" });
51
+ expect(result).toBe("my-token");
52
+ });
53
+ it("should prefer X-Api-Key over Authorization header", () => {
54
+ const result = extractApiKey({
55
+ "x-api-key": "from-x-api-key",
56
+ "authorization": "Bearer from-bearer",
57
+ });
58
+ expect(result).toBe("from-x-api-key");
59
+ });
60
+ it("should return null when no auth headers present", () => {
61
+ const result = extractApiKey({});
62
+ expect(result).toBeNull();
63
+ });
64
+ it("should return null for non-Bearer Authorization header", () => {
65
+ const result = extractApiKey({ "authorization": "Basic dXNlcjpwYXNz" });
66
+ expect(result).toBeNull();
67
+ });
68
+ it("should return null for empty Authorization header", () => {
69
+ const result = extractApiKey({ "authorization": "" });
70
+ expect(result).toBeNull();
71
+ });
72
+ it("should handle undefined header values", () => {
73
+ const result = extractApiKey({ "x-api-key": undefined, "authorization": undefined });
74
+ expect(result).toBeNull();
75
+ });
76
+ it("should extract Bearer token with spaces in the token", () => {
77
+ const result = extractApiKey({ "authorization": "Bearer abc def" });
78
+ expect(result).toBe("abc def");
79
+ });
80
+ });
81
+ // =============================================================================
82
+ // timingSafeEqual Tests
83
+ // =============================================================================
84
+ describe("timingSafeEqual", () => {
85
+ it("should return true for equal strings", () => {
86
+ expect(timingSafeEqual("secret123", "secret123")).toBe(true);
87
+ });
88
+ it("should return false for different strings of same length", () => {
89
+ expect(timingSafeEqual("secret123", "secret456")).toBe(false);
90
+ });
91
+ it("should return false for different strings of different length", () => {
92
+ expect(timingSafeEqual("short", "longer-string")).toBe(false);
93
+ });
94
+ it("should return true for empty strings", () => {
95
+ expect(timingSafeEqual("", "")).toBe(true);
96
+ });
97
+ it("should return false when one string is empty", () => {
98
+ expect(timingSafeEqual("", "notempty")).toBe(false);
99
+ });
100
+ it("should handle unicode characters", () => {
101
+ expect(timingSafeEqual("héllo", "héllo")).toBe(true);
102
+ expect(timingSafeEqual("héllo", "hello")).toBe(false);
103
+ });
104
+ it("should handle long strings", () => {
105
+ const longStr = "a".repeat(10000);
106
+ expect(timingSafeEqual(longStr, longStr)).toBe(true);
107
+ expect(timingSafeEqual(longStr, "b".repeat(10000))).toBe(false);
108
+ });
109
+ });
110
+ // =============================================================================
111
+ // authMiddleware Tests
112
+ // =============================================================================
113
+ describe("authMiddleware", () => {
114
+ it("should export authMiddleware as a function", () => {
115
+ expect(authMiddleware).toBeDefined();
116
+ expect(typeof authMiddleware).toBe("function");
117
+ });
118
+ });
119
+ // =============================================================================
120
+ // Sensitive Info Disclosure Tests (health endpoint auth logic)
121
+ // =============================================================================
122
+ describe("sensitive info disclosure prevention", () => {
123
+ let originalApiKey;
124
+ beforeEach(() => {
125
+ originalApiKey = process.env.TX_API_KEY;
126
+ });
127
+ afterEach(() => {
128
+ if (originalApiKey === undefined) {
129
+ delete process.env.TX_API_KEY;
130
+ }
131
+ else {
132
+ process.env.TX_API_KEY = originalApiKey;
133
+ }
134
+ });
135
+ /**
136
+ * Tests the logic used by the /health endpoint to decide whether
137
+ * to expose the database path. The pattern is:
138
+ * showSensitive = TX_API_KEY is set AND request has valid key
139
+ */
140
+ function shouldShowSensitive(headers) {
141
+ const apiKey = process.env.TX_API_KEY;
142
+ if (!apiKey)
143
+ return false;
144
+ const providedKey = extractApiKey(headers);
145
+ if (!providedKey)
146
+ return false;
147
+ return timingSafeEqual(providedKey, apiKey);
148
+ }
149
+ it("should NOT expose sensitive info when auth is disabled (no TX_API_KEY)", () => {
150
+ delete process.env.TX_API_KEY;
151
+ expect(shouldShowSensitive({})).toBe(false);
152
+ });
153
+ it("should NOT expose sensitive info when auth is disabled even with a key header", () => {
154
+ delete process.env.TX_API_KEY;
155
+ expect(shouldShowSensitive({ "x-api-key": "some-key" })).toBe(false);
156
+ });
157
+ it("should NOT expose sensitive info when auth is enabled but no key provided", () => {
158
+ process.env.TX_API_KEY = "server-secret";
159
+ expect(shouldShowSensitive({})).toBe(false);
160
+ });
161
+ it("should NOT expose sensitive info when auth is enabled but wrong key provided", () => {
162
+ process.env.TX_API_KEY = "server-secret";
163
+ expect(shouldShowSensitive({ "x-api-key": "wrong-key" })).toBe(false);
164
+ });
165
+ it("should expose sensitive info when auth is enabled and correct key provided", () => {
166
+ process.env.TX_API_KEY = "server-secret";
167
+ expect(shouldShowSensitive({ "x-api-key": "server-secret" })).toBe(true);
168
+ });
169
+ it("should expose sensitive info when auth is enabled and correct Bearer token provided", () => {
170
+ process.env.TX_API_KEY = "server-secret";
171
+ expect(shouldShowSensitive({ "authorization": "Bearer server-secret" })).toBe(true);
172
+ });
173
+ });
174
+ //# sourceMappingURL=auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Body Size Limit Middleware Tests
3
+ *
4
+ * Tests for getMaxBytes routing logic and bodyLimitMiddleware export.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=body-limit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-limit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/body-limit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Body Size Limit Middleware Tests
3
+ *
4
+ * Tests for getMaxBytes routing logic and bodyLimitMiddleware export.
5
+ */
6
+ import { describe, it, expect } from "vitest";
7
+ import { getMaxBytes, DEFAULT_MAX_BYTES, SYNC_MAX_BYTES, bodyLimitMiddleware, } from "../middleware/body-limit.js";
8
+ // =============================================================================
9
+ // Constants Tests
10
+ // =============================================================================
11
+ describe("body limit constants", () => {
12
+ it("should define DEFAULT_MAX_BYTES as 1MB", () => {
13
+ expect(DEFAULT_MAX_BYTES).toBe(1 * 1024 * 1024);
14
+ });
15
+ it("should define SYNC_MAX_BYTES as 10MB", () => {
16
+ expect(SYNC_MAX_BYTES).toBe(10 * 1024 * 1024);
17
+ });
18
+ });
19
+ // =============================================================================
20
+ // getMaxBytes Tests
21
+ // =============================================================================
22
+ describe("getMaxBytes", () => {
23
+ it("should return SYNC_MAX_BYTES for /api/sync/export", () => {
24
+ expect(getMaxBytes("/api/sync/export")).toBe(SYNC_MAX_BYTES);
25
+ });
26
+ it("should return SYNC_MAX_BYTES for /api/sync/import", () => {
27
+ expect(getMaxBytes("/api/sync/import")).toBe(SYNC_MAX_BYTES);
28
+ });
29
+ it("should return SYNC_MAX_BYTES for /api/sync/status", () => {
30
+ expect(getMaxBytes("/api/sync/status")).toBe(SYNC_MAX_BYTES);
31
+ });
32
+ it("should return SYNC_MAX_BYTES for /api/sync/compact", () => {
33
+ expect(getMaxBytes("/api/sync/compact")).toBe(SYNC_MAX_BYTES);
34
+ });
35
+ it("should return DEFAULT_MAX_BYTES for /api/tasks", () => {
36
+ expect(getMaxBytes("/api/tasks")).toBe(DEFAULT_MAX_BYTES);
37
+ });
38
+ it("should return DEFAULT_MAX_BYTES for /api/learnings", () => {
39
+ expect(getMaxBytes("/api/learnings")).toBe(DEFAULT_MAX_BYTES);
40
+ });
41
+ it("should return DEFAULT_MAX_BYTES for /api/runs", () => {
42
+ expect(getMaxBytes("/api/runs")).toBe(DEFAULT_MAX_BYTES);
43
+ });
44
+ it("should return DEFAULT_MAX_BYTES for /health", () => {
45
+ expect(getMaxBytes("/health")).toBe(DEFAULT_MAX_BYTES);
46
+ });
47
+ it("should return DEFAULT_MAX_BYTES for root path", () => {
48
+ expect(getMaxBytes("/")).toBe(DEFAULT_MAX_BYTES);
49
+ });
50
+ });
51
+ // =============================================================================
52
+ // bodyLimitMiddleware Export Tests
53
+ // =============================================================================
54
+ describe("bodyLimitMiddleware", () => {
55
+ it("should export bodyLimitMiddleware as a function", () => {
56
+ expect(bodyLimitMiddleware).toBeDefined();
57
+ expect(typeof bodyLimitMiddleware).toBe("function");
58
+ });
59
+ });
60
+ //# sourceMappingURL=body-limit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-limit.test.js","sourceRoot":"","sources":["../../src/__tests__/body-limit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.js","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAY5C,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,cAAkC,CAAA;IAEtC,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,cAAc,CAAA;QACzC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;YAEtD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,qEAAqE;YACrE,iFAAiF;YACjF,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;YACvC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,MAAM,YAAY,GAAG,uBAAuB,CAAA;QAE5C,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;YAEtD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC5C,OAAO,EAAE;oBACP,WAAW,EAAE,WAAW;iBACzB;aACF,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;YAEtD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC5C,OAAO,EAAE;oBACP,WAAW,EAAE,YAAY;iBAC1B;aACF,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;YAEtD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,+EAA+E;YAC/E,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC5C,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,YAAY,EAAE;iBACxC;aACF,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;YAEtD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAUF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,CAAA;IAChE,IAAI,kBAA2B,CAAA;IAE/B,UAAU,CAAC,GAAG,EAAE;QACd,kBAAkB,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,sEAAsE;QACtE,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,6CAA6C;QAC7C,MAAM,MAAM,GAAG,SAAS,GAAG,cAAc,CAAA;QACzC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAChD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAA;YAErD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAA;YACnC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACzC,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,SAAS,GAAG,cAAc,CAAA;QACzC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;QAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;YACzC,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,KAAK;YACV,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,WAAW;SACzB,CAAC,CAAC,CAAA;QAEH,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAChD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAA;YAErD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC5B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC5C,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;YAC1B,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,MAAM,GAAG,SAAS,GAAG,cAAc,CAAA;QACzC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;QAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;QAEjD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAEtE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAChD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAA;YAErD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAA;YAEnC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,MAAM,CAAC,gBAAgB,CAAC,2CAA2C,CAAC,EACpE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,EAAE,CAAA;YACrB,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;YAC1B,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,mEAAmE;IACnE,kDAAkD;IAElD,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;QAC7B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;QAEvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;QAEtD,+DAA+D;QAC/D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Log Reader Tests
3
+ *
4
+ * Tests path traversal protection in isAllowedRunPath.
5
+ * Verifies prefix match (startsWith) instead of substring match (includes).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=log-reader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-reader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/log-reader.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Log Reader Tests
3
+ *
4
+ * Tests path traversal protection in isAllowedRunPath.
5
+ * Verifies prefix match (startsWith) instead of substring match (includes).
6
+ */
7
+ import { describe, it, expect } from "vitest";
8
+ import { resolve } from "node:path";
9
+ import { isAllowedRunPath } from "../utils/log-reader.js";
10
+ const cwd = process.cwd();
11
+ const runsDir = resolve(cwd, ".tx", "runs");
12
+ describe("isAllowedRunPath", () => {
13
+ describe("accepts valid paths under .tx/runs/", () => {
14
+ it("should accept a file directly under .tx/runs/", () => {
15
+ expect(isAllowedRunPath(`${runsDir}/stdout.log`)).toBe(true);
16
+ });
17
+ it("should accept a file in a run subdirectory", () => {
18
+ expect(isAllowedRunPath(`${runsDir}/run-abc12345/stdout.log`)).toBe(true);
19
+ });
20
+ it("should accept a nested file under .tx/runs/", () => {
21
+ expect(isAllowedRunPath(`${runsDir}/run-abc12345/logs/stderr.log`)).toBe(true);
22
+ });
23
+ });
24
+ describe("rejects paths outside .tx/runs/", () => {
25
+ it("should reject an absolute path outside the project", () => {
26
+ expect(isAllowedRunPath("/etc/passwd")).toBe(false);
27
+ });
28
+ it("should reject a path under .tx/ but not .tx/runs/", () => {
29
+ expect(isAllowedRunPath(resolve(cwd, ".tx", "tasks.db"))).toBe(false);
30
+ });
31
+ it("should reject the runs directory itself (no trailing file)", () => {
32
+ // runsDir alone should not match — startsWith(runsDir + sep) requires a child
33
+ expect(isAllowedRunPath(runsDir)).toBe(false);
34
+ });
35
+ });
36
+ describe("rejects substring bypass attacks", () => {
37
+ it("should reject a path from a different project containing /.tx/runs/", () => {
38
+ // This is the key attack vector: a different project's .tx/runs/ passes
39
+ // an includes() check but fails a startsWith() check
40
+ expect(isAllowedRunPath("/other/project/.tx/runs/evil.log")).toBe(false);
41
+ });
42
+ it("should reject a crafted path with .tx/runs/ as a non-prefix substring", () => {
43
+ expect(isAllowedRunPath("/evil/.tx/runs/payload")).toBe(false);
44
+ });
45
+ it("should reject a path with .. that resolves outside .tx/runs/", () => {
46
+ // resolve() normalizes the .., so this becomes cwd/.tx/tasks.db
47
+ expect(isAllowedRunPath(`${runsDir}/../tasks.db`)).toBe(false);
48
+ });
49
+ it("should reject a directory name that starts with 'runs' but is different", () => {
50
+ // e.g., .tx/runs-evil/ should not match .tx/runs/
51
+ expect(isAllowedRunPath(resolve(cwd, ".tx", "runs-evil", "file.log"))).toBe(false);
52
+ });
53
+ });
54
+ });
55
+ //# sourceMappingURL=log-reader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-reader.test.js","sourceRoot":"","sources":["../../src/__tests__/log-reader.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AAE3C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,gBAAgB,CAAC,GAAG,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,gBAAgB,CAAC,GAAG,OAAO,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,gBAAgB,CAAC,GAAG,OAAO,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,8EAA8E;YAC9E,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,wEAAwE;YACxE,qDAAqD;YACrD,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,gEAAgE;YAChE,MAAM,CAAC,gBAAgB,CAAC,GAAG,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YACjF,kDAAkD;YAClD,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rate-limit.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.test.js","sourceRoot":"","sources":["../../src/__tests__/rate-limit.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAErF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,iBAAqC,CAAA;IACzC,IAAI,kBAAsC,CAAA;IAC1C,IAAI,kBAAsC,CAAA;IAE1C,UAAU,CAAC,GAAG,EAAE;QACd,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;QACjD,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;QACnD,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAA;QAC9D,uDAAuD;QACvD,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,OAAO,CAAA;QACnD,kBAAkB,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;QACnD,CAAC;QACD,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QACrD,CAAC;QACD,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAA;QAClD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,kBAAkB,CAAA;QAChE,CAAC;QACD,kBAAkB,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;YACrC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAA;YACnC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAA;YACxC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAA;YACvC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;QACnE,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;YACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAA,CAAC,wBAAwB;QAC9D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,sDAAsD;YACtD,sFAAsF;YACtF,iFAAiF;YACjF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAElC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAElC,4DAA4D;YAC5D,2EAA2E;YAC3E,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,4CAA4C;YAC5C,mEAAmE;YACnE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;YACxF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAElC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;YACxF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAElC,mEAAmE;YACnE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;aACrC,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,iFAAiF;YACjF,gFAAgF;YAChF,mFAAmF;YACnF,6EAA6E;YAE7E,4EAA4E;YAC5E,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CACxD,CAAA;YAED,4DAA4D;YAC5D,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC7B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAA;YACvC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAA,CAAC,wBAAwB;QAC9D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,2EAA2E;YAC3E,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC9C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YACF,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC9C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YACF,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC9C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YAEF,mDAAmD;YACnD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAEnC,4CAA4C;YAC5C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,0EAA0E;YAC1E,qEAAqE;YACrE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE;aAC5C,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAElC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,mBAAmB,EAAE;aACpD,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAElC,oEAAoE;YACpE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,iBAAiB,EAAE;aAClD,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,0EAA0E;YAC1E,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,2BAA2B,EAAE;aAC5D,CAAC,CAAA;YACF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,kBAAkB,EAAE;aACnD,CAAC,CAAA;YACF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;aAC1C,CAAC,CAAA;YAEF,sDAAsD;YACtD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAE7C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;YACnE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAA;YACnC,gEAAgE;YAChE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAA;YACvC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;YAEvB,uCAAuC;YACvC,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;YAC/E,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;YAEhG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Server Library Tests
3
+ *
4
+ * Tests for server configuration and module exports.
5
+ * Note: makeServerLive and route layers require bun:sqlite (via tx-core)
6
+ * and can only be tested with `bun test`. These tests cover the parts
7
+ * that work in Node.js vitest.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=server-lib.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-lib.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/server-lib.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}