@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.
- package/dist/{api.d.ts → api/brains.d.ts} +2 -160
- package/dist/api/brains.d.ts.map +1 -0
- package/dist/{api.js → api/brains.js} +18 -1234
- package/dist/api/brains.js.map +1 -0
- package/dist/api/bundle.d.ts +17 -0
- package/dist/api/bundle.d.ts.map +1 -0
- package/dist/api/bundle.js +56 -0
- package/dist/api/bundle.js.map +1 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +11 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/pages.d.ts +46 -0
- package/dist/api/pages.d.ts.map +1 -0
- package/dist/api/pages.js +338 -0
- package/dist/api/pages.js.map +1 -0
- package/dist/api/resources.d.ts +28 -0
- package/dist/api/resources.d.ts.map +1 -0
- package/dist/api/resources.js +272 -0
- package/dist/api/resources.js.map +1 -0
- package/dist/api/schedules.d.ts +20 -0
- package/dist/api/schedules.d.ts.map +1 -0
- package/dist/api/schedules.js +159 -0
- package/dist/api/schedules.js.map +1 -0
- package/dist/api/secrets.d.ts +27 -0
- package/dist/api/secrets.d.ts.map +1 -0
- package/dist/api/secrets.js +175 -0
- package/dist/api/secrets.js.map +1 -0
- package/dist/api/signals.d.ts +53 -0
- package/dist/api/signals.d.ts.map +1 -0
- package/dist/api/signals.js +276 -0
- package/dist/api/signals.js.map +1 -0
- package/dist/api/status.d.ts +3 -0
- package/dist/api/status.d.ts.map +1 -0
- package/dist/api/status.js +23 -0
- package/dist/api/status.js.map +1 -0
- package/dist/api/types.d.ts +2 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/users.d.ts +43 -0
- package/dist/api/users.d.ts.map +1 -0
- package/dist/api/users.js +221 -0
- package/dist/api/users.js.map +1 -0
- package/dist/api/webhooks.d.ts +30 -0
- package/dist/api/webhooks.d.ts.map +1 -0
- package/dist/api/webhooks.js +208 -0
- package/dist/api/webhooks.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/{api.js → api/brains.js} +1378 -4108
- package/dist/src/api/bundle.js +228 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/api/pages.js +840 -0
- package/dist/src/api/resources.js +707 -0
- package/dist/src/api/schedules.js +479 -0
- package/dist/src/api/secrets.js +518 -0
- package/dist/src/api/signals.js +778 -0
- package/dist/src/api/status.js +180 -0
- package/dist/src/api/types.js +1 -0
- package/dist/src/api/users.js +650 -0
- package/dist/src/api/webhooks.js +639 -0
- package/dist/src/index.js +1 -1
- package/package.json +1 -1
- package/dist/api.d.ts.map +0 -1
- 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":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,KAAY,EAAE,KAAa;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;aACxC,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAC/E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CACX,4CAA4C,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CACjE,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,mBAAmB,EAC5D,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,KAAY,EAAE,KAAa;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACvC,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAC/E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CACX,2CAA2C,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAChE,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,kBAAkB,EAC3D,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,KAAY,EACZ,KAAa,EACb,OAAe;QAEf,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;aACxD,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAC/E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;gBACzC,OAAO,CAAC,KAAK,CACX,mDAAmD,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CACxE,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,0BAA0B,EACnE,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAY,EAAE,KAAa;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;aACxE,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAC/E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;YAE1D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CACX,2CAA2C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAClE,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,mCAAmC,EAC5E,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,KAAY,EAAE,KAAa;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aACzC,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAC/E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CACX,6CAA6C,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAClE,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,oBAAoB,EAC7D,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACnB,KAAY,EACZ,KAAa,EACb,QAAiC;QAEjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;aAC7D,CACF,CAAC;YAEF,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAE3C,IAAI,aAAa,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,aAAa,CAAC,MAAM,gBAAgB,CACpF,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAGvC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC7C,OAAO,CAAC,KAAK,CACX,uDAAuD,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAC5E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,8BAA8B,EACvE,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,KAAY,EAAE,KAAa;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,SAAS,EACpE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,oBAAoB,QAAQ,CAAC,MAAM,gBAAgB,CAC9E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,UAAU,EACnD,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAY,EAAE,KAAa;QAChD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,SAAS,EACpE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,oBAAoB,QAAQ,CAAC,MAAM,gBAAgB,CAC9E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;YAE1D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CACX,2CAA2C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAClE,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,wBAAwB,EACjE,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,KAAY,EAAE,KAAa;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB,kCAAkC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EACrE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;aACxC,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAC/E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,uBAAuB,EAChE,KAAK,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|