@positronic/spec 0.0.55 → 0.0.57

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 (68) hide show
  1. package/dist/{api.d.ts → api/brains.d.ts} +2 -160
  2. package/dist/api/brains.d.ts.map +1 -0
  3. package/dist/{api.js → api/brains.js} +18 -1234
  4. package/dist/api/brains.js.map +1 -0
  5. package/dist/api/bundle.d.ts +17 -0
  6. package/dist/api/bundle.d.ts.map +1 -0
  7. package/dist/api/bundle.js +56 -0
  8. package/dist/api/bundle.js.map +1 -0
  9. package/dist/api/index.d.ts +12 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api/index.js +11 -0
  12. package/dist/api/index.js.map +1 -0
  13. package/dist/api/pages.d.ts +46 -0
  14. package/dist/api/pages.d.ts.map +1 -0
  15. package/dist/api/pages.js +338 -0
  16. package/dist/api/pages.js.map +1 -0
  17. package/dist/api/resources.d.ts +28 -0
  18. package/dist/api/resources.d.ts.map +1 -0
  19. package/dist/api/resources.js +272 -0
  20. package/dist/api/resources.js.map +1 -0
  21. package/dist/api/schedules.d.ts +20 -0
  22. package/dist/api/schedules.d.ts.map +1 -0
  23. package/dist/api/schedules.js +159 -0
  24. package/dist/api/schedules.js.map +1 -0
  25. package/dist/api/secrets.d.ts +27 -0
  26. package/dist/api/secrets.d.ts.map +1 -0
  27. package/dist/api/secrets.js +175 -0
  28. package/dist/api/secrets.js.map +1 -0
  29. package/dist/api/signals.d.ts +53 -0
  30. package/dist/api/signals.d.ts.map +1 -0
  31. package/dist/api/signals.js +276 -0
  32. package/dist/api/signals.js.map +1 -0
  33. package/dist/api/status.d.ts +3 -0
  34. package/dist/api/status.d.ts.map +1 -0
  35. package/dist/api/status.js +23 -0
  36. package/dist/api/status.js.map +1 -0
  37. package/dist/api/types.d.ts +2 -0
  38. package/dist/api/types.d.ts.map +1 -0
  39. package/dist/api/types.js +2 -0
  40. package/dist/api/types.js.map +1 -0
  41. package/dist/api/users.d.ts +43 -0
  42. package/dist/api/users.d.ts.map +1 -0
  43. package/dist/api/users.js +221 -0
  44. package/dist/api/users.js.map +1 -0
  45. package/dist/api/webhooks.d.ts +30 -0
  46. package/dist/api/webhooks.d.ts.map +1 -0
  47. package/dist/api/webhooks.js +208 -0
  48. package/dist/api/webhooks.js.map +1 -0
  49. package/dist/index.d.ts +1 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/src/{api.js → api/brains.js} +1378 -4108
  54. package/dist/src/api/bundle.js +228 -0
  55. package/dist/src/api/index.js +10 -0
  56. package/dist/src/api/pages.js +840 -0
  57. package/dist/src/api/resources.js +707 -0
  58. package/dist/src/api/schedules.js +479 -0
  59. package/dist/src/api/secrets.js +518 -0
  60. package/dist/src/api/signals.js +778 -0
  61. package/dist/src/api/status.js +180 -0
  62. package/dist/src/api/types.js +1 -0
  63. package/dist/src/api/users.js +650 -0
  64. package/dist/src/api/webhooks.js +639 -0
  65. package/dist/src/index.js +1 -1
  66. package/package.json +1 -1
  67. package/dist/api.d.ts.map +0 -1
  68. package/dist/api.js.map +0 -1
@@ -0,0 +1,175 @@
1
+ export const secrets = {
2
+ /**
3
+ * Test POST /secrets - Create or update a secret
4
+ */
5
+ async create(fetch, name, value) {
6
+ try {
7
+ const request = new Request('http://example.com/secrets', {
8
+ method: 'POST',
9
+ headers: {
10
+ 'Content-Type': 'application/json',
11
+ },
12
+ body: JSON.stringify({ name, value }),
13
+ });
14
+ const response = await fetch(request);
15
+ if (response.status !== 201) {
16
+ console.error(`POST /secrets returned ${response.status}, expected 201`);
17
+ return false;
18
+ }
19
+ const data = (await response.json());
20
+ // Validate response structure
21
+ if (!data.name || typeof data.name !== 'string') {
22
+ console.error(`Expected name to be string, got ${typeof data.name}`);
23
+ return false;
24
+ }
25
+ if (data.name !== name) {
26
+ console.error(`Expected name to be '${name}', got ${data.name}`);
27
+ return false;
28
+ }
29
+ if (typeof data.createdAt !== 'string') {
30
+ console.error(`Expected createdAt to be string, got ${typeof data.createdAt}`);
31
+ return false;
32
+ }
33
+ if (typeof data.updatedAt !== 'string') {
34
+ console.error(`Expected updatedAt to be string, got ${typeof data.updatedAt}`);
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ catch (error) {
40
+ console.error(`Failed to test POST /secrets:`, error);
41
+ return false;
42
+ }
43
+ },
44
+ /**
45
+ * Test GET /secrets - List all secrets (names only, not values)
46
+ */
47
+ async list(fetch) {
48
+ try {
49
+ const request = new Request('http://example.com/secrets', {
50
+ method: 'GET',
51
+ });
52
+ const response = await fetch(request);
53
+ if (!response.ok) {
54
+ console.error(`GET /secrets returned ${response.status}`);
55
+ return false;
56
+ }
57
+ const data = (await response.json());
58
+ // Validate response structure
59
+ if (!Array.isArray(data.secrets)) {
60
+ console.error(`Expected secrets to be an array, got ${typeof data.secrets}`);
61
+ return false;
62
+ }
63
+ if (typeof data.count !== 'number') {
64
+ console.error(`Expected count to be number, got ${typeof data.count}`);
65
+ return false;
66
+ }
67
+ // Validate each secret has required fields (but NOT the value)
68
+ for (const secret of data.secrets) {
69
+ if (!secret.name ||
70
+ typeof secret.name !== 'string' ||
71
+ typeof secret.createdAt !== 'string' ||
72
+ typeof secret.updatedAt !== 'string') {
73
+ console.error(`Secret missing required fields: ${JSON.stringify(secret)}`);
74
+ return false;
75
+ }
76
+ // Ensure value is NOT included
77
+ if ('value' in secret) {
78
+ console.error(`Secret should not include value field: ${JSON.stringify(secret)}`);
79
+ return false;
80
+ }
81
+ }
82
+ return true;
83
+ }
84
+ catch (error) {
85
+ console.error(`Failed to test GET /secrets:`, error);
86
+ return false;
87
+ }
88
+ },
89
+ /**
90
+ * Test DELETE /secrets/:name - Delete a specific secret
91
+ */
92
+ async delete(fetch, name) {
93
+ try {
94
+ const request = new Request(`http://example.com/secrets/${encodeURIComponent(name)}`, {
95
+ method: 'DELETE',
96
+ });
97
+ const response = await fetch(request);
98
+ if (response.status !== 204) {
99
+ console.error(`DELETE /secrets/${name} returned ${response.status}, expected 204`);
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+ catch (error) {
105
+ console.error(`Failed to test DELETE /secrets/${name}:`, error);
106
+ return false;
107
+ }
108
+ },
109
+ /**
110
+ * Test GET /secrets/:name/exists - Check if a secret exists
111
+ */
112
+ async exists(fetch, name) {
113
+ try {
114
+ const request = new Request(`http://example.com/secrets/${encodeURIComponent(name)}/exists`, {
115
+ method: 'GET',
116
+ });
117
+ const response = await fetch(request);
118
+ if (!response.ok) {
119
+ console.error(`GET /secrets/${name}/exists returned ${response.status}`);
120
+ return false;
121
+ }
122
+ const data = (await response.json());
123
+ // Validate response structure
124
+ if (typeof data.exists !== 'boolean') {
125
+ console.error(`Expected exists to be boolean, got ${typeof data.exists}`);
126
+ return false;
127
+ }
128
+ return true;
129
+ }
130
+ catch (error) {
131
+ console.error(`Failed to test GET /secrets/${name}/exists:`, error);
132
+ return false;
133
+ }
134
+ },
135
+ /**
136
+ * Test POST /secrets/bulk - Create multiple secrets
137
+ */
138
+ async bulk(fetch, secrets) {
139
+ try {
140
+ const request = new Request('http://example.com/secrets/bulk', {
141
+ method: 'POST',
142
+ headers: {
143
+ 'Content-Type': 'application/json',
144
+ },
145
+ body: JSON.stringify({ secrets }),
146
+ });
147
+ const response = await fetch(request);
148
+ if (response.status !== 201) {
149
+ console.error(`POST /secrets/bulk returned ${response.status}, expected 201`);
150
+ return false;
151
+ }
152
+ const data = (await response.json());
153
+ // Validate response structure
154
+ if (typeof data.created !== 'number') {
155
+ console.error(`Expected created to be number, got ${typeof data.created}`);
156
+ return false;
157
+ }
158
+ if (typeof data.updated !== 'number') {
159
+ console.error(`Expected updated to be number, got ${typeof data.updated}`);
160
+ return false;
161
+ }
162
+ // Total should match input
163
+ if (data.created + data.updated !== secrets.length) {
164
+ console.error(`Expected total (${data.created + data.updated}) to match input length (${secrets.length})`);
165
+ return false;
166
+ }
167
+ return true;
168
+ }
169
+ catch (error) {
170
+ console.error(`Failed to test POST /secrets/bulk:`, error);
171
+ return false;
172
+ }
173
+ },
174
+ };
175
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/api/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Fetch } from './types.js';
2
+ export declare const signals: {
3
+ /**
4
+ * Test POST /brains/runs/:runId/signals - Queue PAUSE signal
5
+ * Expects 202 Accepted with signal confirmation
6
+ */
7
+ pause(fetch: Fetch, runId: string): Promise<boolean>;
8
+ /**
9
+ * Test POST /brains/runs/:runId/signals - Queue KILL signal
10
+ * Expects 202 Accepted with signal confirmation
11
+ */
12
+ kill(fetch: Fetch, runId: string): Promise<boolean>;
13
+ /**
14
+ * Test POST /brains/runs/:runId/signals - Queue USER_MESSAGE signal
15
+ * Expects 202 Accepted with signal confirmation
16
+ */
17
+ sendMessage(fetch: Fetch, runId: string, content: string): Promise<boolean>;
18
+ /**
19
+ * Test POST /brains/runs/:runId/signals - USER_MESSAGE without active agent
20
+ * Expects 409 Conflict when no agent step is currently active
21
+ */
22
+ sendMessageNoAgent(fetch: Fetch, runId: string): Promise<boolean>;
23
+ /**
24
+ * Test POST /brains/runs/:runId/signals - Queue RESUME signal
25
+ * Expects 202 Accepted with signal confirmation
26
+ * Note: This is an alternative to POST /brains/runs/:runId/resume
27
+ * The brain must be in PAUSED state for RESUME signal to be valid
28
+ */
29
+ resumeSignal(fetch: Fetch, runId: string): Promise<boolean>;
30
+ /**
31
+ * Test POST /brains/runs/:runId/signals - Queue WEBHOOK_RESPONSE signal
32
+ * Expects 202 Accepted with signal confirmation
33
+ * Note: This is an alternative to sending webhooks via POST /webhooks/:slug
34
+ * The brain must be in WAITING state for WEBHOOK_RESPONSE signal to be valid
35
+ */
36
+ webhookResponse(fetch: Fetch, runId: string, response: Record<string, unknown>): Promise<boolean>;
37
+ /**
38
+ * Test POST /brains/runs/:runId/resume - Resume a PAUSED brain
39
+ * Expects 202 Accepted with resumed confirmation
40
+ */
41
+ resume(fetch: Fetch, runId: string): Promise<boolean>;
42
+ /**
43
+ * Test POST /brains/runs/:runId/resume - Resume a non-PAUSED brain
44
+ * Expects 409 Conflict when brain is not in PAUSED state
45
+ */
46
+ resumeWrongState(fetch: Fetch, runId: string): Promise<boolean>;
47
+ /**
48
+ * Test POST /brains/runs/:runId/signals - Signal to non-existent run
49
+ * Expects 404 Not Found
50
+ */
51
+ signalNotFound(fetch: Fetch, runId: string): Promise<boolean>;
52
+ };
53
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/api/signals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,OAAO;IAClB;;;OAGG;iBACgB,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+C1D;;;OAGG;gBACe,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+CzD;;;OAGG;uBAEM,KAAK,SACL,MAAM,WACJ,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IA+CnB;;;OAGG;8BAC6B,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuCvE;;;;;OAKG;wBACuB,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+CjE;;;;;OAKG;2BAEM,KAAK,SACL,MAAM,YACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC;IA+CnB;;;OAGG;kBACiB,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4C3D;;;OAGG;4BAC2B,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCrE;;;OAGG;0BACyB,KAAK,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA6BpE,CAAC"}
@@ -0,0 +1,276 @@
1
+ export const signals = {
2
+ /**
3
+ * Test POST /brains/runs/:runId/signals - Queue PAUSE signal
4
+ * Expects 202 Accepted with signal confirmation
5
+ */
6
+ async pause(fetch, runId) {
7
+ try {
8
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
9
+ method: 'POST',
10
+ headers: { 'Content-Type': 'application/json' },
11
+ body: JSON.stringify({ type: 'PAUSE' }),
12
+ });
13
+ const response = await fetch(request);
14
+ if (response.status !== 202) {
15
+ console.error(`POST /brains/runs/${runId}/signals returned ${response.status}, expected 202`);
16
+ return false;
17
+ }
18
+ const data = (await response.json());
19
+ if (!data.success) {
20
+ console.error(`Expected success: true, got ${JSON.stringify(data)}`);
21
+ return false;
22
+ }
23
+ if (data.signal?.type !== 'PAUSE') {
24
+ console.error(`Expected signal.type to be 'PAUSE', got '${data.signal?.type}'`);
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ catch (error) {
30
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (PAUSE):`, error);
31
+ return false;
32
+ }
33
+ },
34
+ /**
35
+ * Test POST /brains/runs/:runId/signals - Queue KILL signal
36
+ * Expects 202 Accepted with signal confirmation
37
+ */
38
+ async kill(fetch, runId) {
39
+ try {
40
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify({ type: 'KILL' }),
44
+ });
45
+ const response = await fetch(request);
46
+ if (response.status !== 202) {
47
+ console.error(`POST /brains/runs/${runId}/signals returned ${response.status}, expected 202`);
48
+ return false;
49
+ }
50
+ const data = (await response.json());
51
+ if (!data.success) {
52
+ console.error(`Expected success: true, got ${JSON.stringify(data)}`);
53
+ return false;
54
+ }
55
+ if (data.signal?.type !== 'KILL') {
56
+ console.error(`Expected signal.type to be 'KILL', got '${data.signal?.type}'`);
57
+ return false;
58
+ }
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (KILL):`, error);
63
+ return false;
64
+ }
65
+ },
66
+ /**
67
+ * Test POST /brains/runs/:runId/signals - Queue USER_MESSAGE signal
68
+ * Expects 202 Accepted with signal confirmation
69
+ */
70
+ async sendMessage(fetch, runId, content) {
71
+ try {
72
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
73
+ method: 'POST',
74
+ headers: { 'Content-Type': 'application/json' },
75
+ body: JSON.stringify({ type: 'USER_MESSAGE', content }),
76
+ });
77
+ const response = await fetch(request);
78
+ if (response.status !== 202) {
79
+ console.error(`POST /brains/runs/${runId}/signals returned ${response.status}, expected 202`);
80
+ return false;
81
+ }
82
+ const data = (await response.json());
83
+ if (!data.success) {
84
+ console.error(`Expected success: true, got ${JSON.stringify(data)}`);
85
+ return false;
86
+ }
87
+ if (data.signal?.type !== 'USER_MESSAGE') {
88
+ console.error(`Expected signal.type to be 'USER_MESSAGE', got '${data.signal?.type}'`);
89
+ return false;
90
+ }
91
+ return true;
92
+ }
93
+ catch (error) {
94
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (USER_MESSAGE):`, error);
95
+ return false;
96
+ }
97
+ },
98
+ /**
99
+ * Test POST /brains/runs/:runId/signals - USER_MESSAGE without active agent
100
+ * Expects 409 Conflict when no agent step is currently active
101
+ */
102
+ async sendMessageNoAgent(fetch, runId) {
103
+ try {
104
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
105
+ method: 'POST',
106
+ headers: { 'Content-Type': 'application/json' },
107
+ body: JSON.stringify({ type: 'USER_MESSAGE', content: 'test message' }),
108
+ });
109
+ const response = await fetch(request);
110
+ if (response.status !== 409) {
111
+ console.error(`POST /brains/runs/${runId}/signals returned ${response.status}, expected 409`);
112
+ return false;
113
+ }
114
+ const data = (await response.json());
115
+ if (!data.error) {
116
+ console.error(`Expected error message in response, got ${JSON.stringify(data)}`);
117
+ return false;
118
+ }
119
+ return true;
120
+ }
121
+ catch (error) {
122
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (USER_MESSAGE no agent):`, error);
123
+ return false;
124
+ }
125
+ },
126
+ /**
127
+ * Test POST /brains/runs/:runId/signals - Queue RESUME signal
128
+ * Expects 202 Accepted with signal confirmation
129
+ * Note: This is an alternative to POST /brains/runs/:runId/resume
130
+ * The brain must be in PAUSED state for RESUME signal to be valid
131
+ */
132
+ async resumeSignal(fetch, runId) {
133
+ try {
134
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
135
+ method: 'POST',
136
+ headers: { 'Content-Type': 'application/json' },
137
+ body: JSON.stringify({ type: 'RESUME' }),
138
+ });
139
+ const response = await fetch(request);
140
+ if (response.status !== 202) {
141
+ console.error(`POST /brains/runs/${runId}/signals returned ${response.status}, expected 202`);
142
+ return false;
143
+ }
144
+ const data = (await response.json());
145
+ if (!data.success) {
146
+ console.error(`Expected success: true, got ${JSON.stringify(data)}`);
147
+ return false;
148
+ }
149
+ if (data.signal?.type !== 'RESUME') {
150
+ console.error(`Expected signal.type to be 'RESUME', got '${data.signal?.type}'`);
151
+ return false;
152
+ }
153
+ return true;
154
+ }
155
+ catch (error) {
156
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (RESUME):`, error);
157
+ return false;
158
+ }
159
+ },
160
+ /**
161
+ * Test POST /brains/runs/:runId/signals - Queue WEBHOOK_RESPONSE signal
162
+ * Expects 202 Accepted with signal confirmation
163
+ * Note: This is an alternative to sending webhooks via POST /webhooks/:slug
164
+ * The brain must be in WAITING state for WEBHOOK_RESPONSE signal to be valid
165
+ */
166
+ async webhookResponse(fetch, runId, response) {
167
+ try {
168
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
169
+ method: 'POST',
170
+ headers: { 'Content-Type': 'application/json' },
171
+ body: JSON.stringify({ type: 'WEBHOOK_RESPONSE', response }),
172
+ });
173
+ const fetchResponse = await fetch(request);
174
+ if (fetchResponse.status !== 202) {
175
+ console.error(`POST /brains/runs/${runId}/signals returned ${fetchResponse.status}, expected 202`);
176
+ return false;
177
+ }
178
+ const data = (await fetchResponse.json());
179
+ if (!data.success) {
180
+ console.error(`Expected success: true, got ${JSON.stringify(data)}`);
181
+ return false;
182
+ }
183
+ if (data.signal?.type !== 'WEBHOOK_RESPONSE') {
184
+ console.error(`Expected signal.type to be 'WEBHOOK_RESPONSE', got '${data.signal?.type}'`);
185
+ return false;
186
+ }
187
+ return true;
188
+ }
189
+ catch (error) {
190
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (WEBHOOK_RESPONSE):`, error);
191
+ return false;
192
+ }
193
+ },
194
+ /**
195
+ * Test POST /brains/runs/:runId/resume - Resume a PAUSED brain
196
+ * Expects 202 Accepted with resumed confirmation
197
+ */
198
+ async resume(fetch, runId) {
199
+ try {
200
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/resume`, {
201
+ method: 'POST',
202
+ headers: { 'Content-Type': 'application/json' },
203
+ });
204
+ const response = await fetch(request);
205
+ if (response.status !== 202) {
206
+ console.error(`POST /brains/runs/${runId}/resume returned ${response.status}, expected 202`);
207
+ return false;
208
+ }
209
+ const data = (await response.json());
210
+ if (!data.success) {
211
+ console.error(`Expected success: true, got ${JSON.stringify(data)}`);
212
+ return false;
213
+ }
214
+ if (data.action !== 'resumed') {
215
+ console.error(`Expected action to be 'resumed', got '${data.action}'`);
216
+ return false;
217
+ }
218
+ return true;
219
+ }
220
+ catch (error) {
221
+ console.error(`Failed to test POST /brains/runs/${runId}/resume:`, error);
222
+ return false;
223
+ }
224
+ },
225
+ /**
226
+ * Test POST /brains/runs/:runId/resume - Resume a non-PAUSED brain
227
+ * Expects 409 Conflict when brain is not in PAUSED state
228
+ */
229
+ async resumeWrongState(fetch, runId) {
230
+ try {
231
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/resume`, {
232
+ method: 'POST',
233
+ headers: { 'Content-Type': 'application/json' },
234
+ });
235
+ const response = await fetch(request);
236
+ if (response.status !== 409) {
237
+ console.error(`POST /brains/runs/${runId}/resume returned ${response.status}, expected 409`);
238
+ return false;
239
+ }
240
+ const data = (await response.json());
241
+ if (!data.error) {
242
+ console.error(`Expected error message in response, got ${JSON.stringify(data)}`);
243
+ return false;
244
+ }
245
+ return true;
246
+ }
247
+ catch (error) {
248
+ console.error(`Failed to test POST /brains/runs/${runId}/resume (wrong state):`, error);
249
+ return false;
250
+ }
251
+ },
252
+ /**
253
+ * Test POST /brains/runs/:runId/signals - Signal to non-existent run
254
+ * Expects 404 Not Found
255
+ */
256
+ async signalNotFound(fetch, runId) {
257
+ try {
258
+ const request = new Request(`http://example.com/brains/runs/${encodeURIComponent(runId)}/signals`, {
259
+ method: 'POST',
260
+ headers: { 'Content-Type': 'application/json' },
261
+ body: JSON.stringify({ type: 'PAUSE' }),
262
+ });
263
+ const response = await fetch(request);
264
+ if (response.status !== 404) {
265
+ console.error(`POST /brains/runs/${runId}/signals returned ${response.status}, expected 404`);
266
+ return false;
267
+ }
268
+ return true;
269
+ }
270
+ catch (error) {
271
+ console.error(`Failed to test POST /brains/runs/${runId}/signals (not found):`, error);
272
+ return false;
273
+ }
274
+ },
275
+ };
276
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/api/signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Fetch } from './types.js';
2
+ export declare function testStatus(fetch: Fetch): Promise<boolean>;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/api/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,wBAAsB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB/D"}
@@ -0,0 +1,23 @@
1
+ export async function testStatus(fetch) {
2
+ try {
3
+ const request = new Request('http://example.com/status', {
4
+ method: 'GET',
5
+ });
6
+ const response = await fetch(request);
7
+ if (!response.ok) {
8
+ console.error(`Status endpoint returned ${response.status}`);
9
+ return false;
10
+ }
11
+ const data = (await response.json());
12
+ if (data.ready !== true) {
13
+ console.error(`Expected { ready: true }, got ${JSON.stringify(data)}`);
14
+ return false;
15
+ }
16
+ return true;
17
+ }
18
+ catch (error) {
19
+ console.error(`Failed to test status endpoint:`, error);
20
+ return false;
21
+ }
22
+ }
23
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/api/status.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAY;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,2BAA2B,EAAE;YACvD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QAE3D,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type Fetch = (request: Request) => Promise<Response>;
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import type { Fetch } from './types.js';
2
+ export interface User {
3
+ id: string;
4
+ name: string;
5
+ createdAt: number;
6
+ }
7
+ export interface UserKey {
8
+ fingerprint: string;
9
+ userId: string;
10
+ label: string;
11
+ addedAt: number;
12
+ }
13
+ export declare const users: {
14
+ /**
15
+ * Test POST /users - Create a new user
16
+ */
17
+ create(fetch: Fetch, name: string): Promise<string | null>;
18
+ /**
19
+ * Test GET /users - List all users
20
+ */
21
+ list(fetch: Fetch): Promise<boolean>;
22
+ /**
23
+ * Test GET /users/:id - Get a specific user
24
+ */
25
+ get(fetch: Fetch, userId: string): Promise<User | null>;
26
+ /**
27
+ * Test DELETE /users/:id - Delete a user
28
+ */
29
+ delete(fetch: Fetch, userId: string): Promise<boolean>;
30
+ /**
31
+ * Test POST /users/:id/keys - Add a key to a user
32
+ */
33
+ addKey(fetch: Fetch, userId: string, jwk: object, fingerprint: string, label?: string): Promise<boolean>;
34
+ /**
35
+ * Test GET /users/:id/keys - List keys for a user
36
+ */
37
+ listKeys(fetch: Fetch, userId: string): Promise<boolean>;
38
+ /**
39
+ * Test DELETE /users/:id/keys/:fingerprint - Remove a key from a user
40
+ */
41
+ removeKey(fetch: Fetch, userId: string, fingerprint: string): Promise<boolean>;
42
+ };
43
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/api/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,KAAK;IAChB;;OAEG;kBACiB,KAAK,QAAQ,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA6ChE;;OAEG;gBACe,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAmD1C;;OAEG;eACc,KAAK,UAAU,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA+B7D;;OAEG;kBACiB,KAAK,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB5D;;OAEG;kBAEM,KAAK,UACJ,MAAM,OACT,MAAM,eACE,MAAM,UACX,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IA+CnB;;OAEG;oBACmB,KAAK,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+C9D;;OAEG;qBAEM,KAAK,UACJ,MAAM,eACD,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC;CA2BpB,CAAC"}