@positronic/spec 0.0.68 → 0.0.69

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.
@@ -0,0 +1,265 @@
1
+ import { BRAIN_EVENTS } from '@positronic/core';
2
+ import { startBrainRun, readSseUntil } from './helpers.js';
3
+ /**
4
+ * Helper: start a brain run as a specific user's fetch, wait for completion,
5
+ * and return the brainRunId.
6
+ */
7
+ async function runBrainAndWait(fetchFn, brainIdentifier) {
8
+ try {
9
+ const brainRunId = await startBrainRun(fetchFn, brainIdentifier);
10
+ if (!brainRunId)
11
+ return null;
12
+ // Watch until completion
13
+ const watchResponse = await fetchFn(new Request(`http://example.com/brains/runs/${brainRunId}/watch`));
14
+ if (!watchResponse.ok || !watchResponse.body) {
15
+ console.error(`GET /brains/runs/${brainRunId}/watch returned ${watchResponse.status}`);
16
+ return null;
17
+ }
18
+ await readSseUntil(watchResponse.body, (event) => event.type === BRAIN_EVENTS.COMPLETE ||
19
+ event.type === BRAIN_EVENTS.ERROR);
20
+ return brainRunId;
21
+ }
22
+ catch (error) {
23
+ console.error('Failed to run brain and wait:', error);
24
+ return null;
25
+ }
26
+ }
27
+ export const scoping = {
28
+ /**
29
+ * Test that brain runs are isolated between users.
30
+ *
31
+ * userA creates a run and waits for completion. Then:
32
+ * - userB gets 404 on GET /runs/:runId
33
+ * - root gets 200 on GET /runs/:runId
34
+ * - userA's history has the run
35
+ * - userB's history is empty
36
+ */
37
+ async brainRunIsolation(rootFetch, fetchFactory, brainIdentifier) {
38
+ try {
39
+ const userA = await fetchFactory('scoping-alice-run');
40
+ const userB = await fetchFactory('scoping-bob-run');
41
+ // userA creates a run and waits for completion
42
+ const brainRunId = await runBrainAndWait(userA.fetch, brainIdentifier);
43
+ if (!brainRunId) {
44
+ console.error('Failed to create and complete brain run as userA');
45
+ return false;
46
+ }
47
+ // userB tries to get the run — should get 404
48
+ const responseB = await userB.fetch(new Request(`http://example.com/brains/runs/${brainRunId}`));
49
+ if (responseB.status !== 404) {
50
+ console.error(`Expected userB to get 404 for userA's run, got ${responseB.status}`);
51
+ return false;
52
+ }
53
+ // root can see the run — should get 200
54
+ const responseRoot = await rootFetch(new Request(`http://example.com/brains/runs/${brainRunId}`));
55
+ if (responseRoot.status !== 200) {
56
+ console.error(`Expected root to get 200 for userA's run, got ${responseRoot.status}`);
57
+ return false;
58
+ }
59
+ const rootRun = (await responseRoot.json());
60
+ if (rootRun.brainRunId !== brainRunId) {
61
+ console.error(`Root returned wrong brainRunId: expected ${brainRunId}, got ${rootRun.brainRunId}`);
62
+ return false;
63
+ }
64
+ // userA's history has the run
65
+ const historyA = await userA.fetch(new Request(`http://example.com/brains/${encodeURIComponent(brainIdentifier)}/history?limit=50`));
66
+ if (historyA.status !== 200) {
67
+ console.error(`Expected userA history to return 200, got ${historyA.status}`);
68
+ return false;
69
+ }
70
+ const historyDataA = (await historyA.json());
71
+ if (historyDataA.runs.length === 0) {
72
+ console.error("userA's history is empty but should have the run");
73
+ return false;
74
+ }
75
+ // userB's history is empty for this brain
76
+ const historyB = await userB.fetch(new Request(`http://example.com/brains/${encodeURIComponent(brainIdentifier)}/history?limit=50`));
77
+ if (historyB.status !== 200) {
78
+ console.error(`Expected userB history to return 200, got ${historyB.status}`);
79
+ return false;
80
+ }
81
+ const historyDataB = (await historyB.json());
82
+ if (historyDataB.runs.length !== 0) {
83
+ console.error(`userB's history should be empty but has ${historyDataB.runs.length} runs`);
84
+ return false;
85
+ }
86
+ return true;
87
+ }
88
+ catch (error) {
89
+ console.error('Failed brain run isolation spec:', error);
90
+ return false;
91
+ }
92
+ },
93
+ /**
94
+ * Test that active runs are isolated between users.
95
+ *
96
+ * userA starts a delayed brain (will remain running).
97
+ * - userA sees it in active-runs
98
+ * - userB does not see it in active-runs
99
+ */
100
+ async activeRunIsolation(rootFetch, fetchFactory, delayedBrainIdentifier) {
101
+ try {
102
+ const userA = await fetchFactory('scoping-alice-active');
103
+ const userB = await fetchFactory('scoping-bob-active');
104
+ // Start a delayed brain as userA (will be running for a while)
105
+ const brainRunId = await startBrainRun(userA.fetch, delayedBrainIdentifier);
106
+ if (!brainRunId)
107
+ return false;
108
+ // userB checks active runs — should be empty
109
+ const responseB = await userB.fetch(new Request(`http://example.com/brains/${encodeURIComponent(delayedBrainIdentifier)}/active-runs`));
110
+ if (responseB.status !== 200) {
111
+ console.error(`Expected userB active-runs to return 200, got ${responseB.status}`);
112
+ return false;
113
+ }
114
+ const activeB = (await responseB.json());
115
+ if (activeB.runs.length !== 0) {
116
+ console.error(`userB should see 0 active runs but sees ${activeB.runs.length}`);
117
+ return false;
118
+ }
119
+ // userA checks active runs — should have the run
120
+ const responseA = await userA.fetch(new Request(`http://example.com/brains/${encodeURIComponent(delayedBrainIdentifier)}/active-runs`));
121
+ if (responseA.status !== 200) {
122
+ console.error(`Expected userA active-runs to return 200, got ${responseA.status}`);
123
+ return false;
124
+ }
125
+ const activeA = (await responseA.json());
126
+ if (activeA.runs.length === 0) {
127
+ console.error('userA should see at least 1 active run but sees 0');
128
+ return false;
129
+ }
130
+ return true;
131
+ }
132
+ catch (error) {
133
+ console.error('Failed active run isolation spec:', error);
134
+ return false;
135
+ }
136
+ },
137
+ /**
138
+ * Test that schedules are isolated between users.
139
+ *
140
+ * userA creates a schedule. Then:
141
+ * - userB can't see it in GET /schedules
142
+ * - userA can see it in GET /schedules
143
+ * - root can see it in GET /schedules
144
+ * - userB can't see runs for it in GET /schedules/runs
145
+ */
146
+ async scheduleIsolation(rootFetch, fetchFactory, brainIdentifier) {
147
+ try {
148
+ const userA = await fetchFactory('scoping-alice-sched');
149
+ const userB = await fetchFactory('scoping-bob-sched');
150
+ // userA creates a schedule
151
+ const createResponse = await userA.fetch(new Request('http://example.com/brains/schedules', {
152
+ method: 'POST',
153
+ headers: { 'Content-Type': 'application/json' },
154
+ body: JSON.stringify({
155
+ identifier: brainIdentifier,
156
+ cronExpression: '0 6 * * *',
157
+ }),
158
+ }));
159
+ if (createResponse.status !== 201) {
160
+ console.error(`POST /brains/schedules returned ${createResponse.status}, expected 201`);
161
+ return false;
162
+ }
163
+ const schedule = (await createResponse.json());
164
+ if (schedule.runAsUserId !== userA.userId) {
165
+ console.error(`Expected runAsUserId to be '${userA.userId}', got '${schedule.runAsUserId}'`);
166
+ return false;
167
+ }
168
+ // userB lists schedules — should not see userA's schedule
169
+ const listResponseB = await userB.fetch(new Request('http://example.com/brains/schedules'));
170
+ if (listResponseB.status !== 200) {
171
+ console.error(`Expected userB schedule list to return 200, got ${listResponseB.status}`);
172
+ return false;
173
+ }
174
+ const listB = (await listResponseB.json());
175
+ if (listB.schedules.some((s) => s.id === schedule.id)) {
176
+ console.error("userB should not see userA's schedule in list");
177
+ return false;
178
+ }
179
+ // userA lists schedules — should see their own
180
+ const listResponseA = await userA.fetch(new Request('http://example.com/brains/schedules'));
181
+ if (listResponseA.status !== 200) {
182
+ console.error(`Expected userA schedule list to return 200, got ${listResponseA.status}`);
183
+ return false;
184
+ }
185
+ const listA = (await listResponseA.json());
186
+ if (!listA.schedules.some((s) => s.id === schedule.id)) {
187
+ console.error("userA should see their own schedule in list");
188
+ return false;
189
+ }
190
+ // root lists schedules — should see it
191
+ const listResponseRoot = await rootFetch(new Request('http://example.com/brains/schedules'));
192
+ if (listResponseRoot.status !== 200) {
193
+ console.error(`Expected root schedule list to return 200, got ${listResponseRoot.status}`);
194
+ return false;
195
+ }
196
+ const listRoot = (await listResponseRoot.json());
197
+ if (!listRoot.schedules.some((s) => s.id === schedule.id)) {
198
+ console.error("root should see userA's schedule in list");
199
+ return false;
200
+ }
201
+ // userB can't see runs for userA's schedule
202
+ const runsResponseB = await userB.fetch(new Request(`http://example.com/brains/schedules/runs?scheduleId=${schedule.id}`));
203
+ if (runsResponseB.status !== 200) {
204
+ console.error(`Expected userB schedule runs to return 200, got ${runsResponseB.status}`);
205
+ return false;
206
+ }
207
+ const runsB = (await runsResponseB.json());
208
+ if (runsB.runs.length !== 0) {
209
+ console.error(`userB should see 0 schedule runs but sees ${runsB.runs.length}`);
210
+ return false;
211
+ }
212
+ return true;
213
+ }
214
+ catch (error) {
215
+ console.error('Failed schedule isolation spec:', error);
216
+ return false;
217
+ }
218
+ },
219
+ /**
220
+ * Test that non-root users get 403 on secrets endpoints.
221
+ *
222
+ * A non-root user calling GET/POST/DELETE /secrets gets 403.
223
+ * (Root access to secrets is already tested by secrets.list spec.)
224
+ */
225
+ async secretsRequireRoot(rootFetch, fetchFactory) {
226
+ try {
227
+ const user = await fetchFactory('scoping-user-secrets');
228
+ // GET /secrets — should get 403
229
+ const getResponse = await user.fetch(new Request('http://example.com/secrets'));
230
+ if (getResponse.status !== 403) {
231
+ console.error(`Expected non-root GET /secrets to return 403, got ${getResponse.status}`);
232
+ return false;
233
+ }
234
+ const getBody = (await getResponse.json());
235
+ if (getBody.error !== 'Root access required') {
236
+ console.error(`Expected error 'Root access required', got '${getBody.error}'`);
237
+ return false;
238
+ }
239
+ // POST /secrets — should get 403
240
+ const postResponse = await user.fetch(new Request('http://example.com/secrets', {
241
+ method: 'POST',
242
+ headers: { 'Content-Type': 'application/json' },
243
+ body: JSON.stringify({ name: 'MY_SECRET', value: 'secret-value' }),
244
+ }));
245
+ if (postResponse.status !== 403) {
246
+ console.error(`Expected non-root POST /secrets to return 403, got ${postResponse.status}`);
247
+ return false;
248
+ }
249
+ // DELETE /secrets/:name — should get 403
250
+ const deleteResponse = await user.fetch(new Request('http://example.com/secrets/MY_SECRET', {
251
+ method: 'DELETE',
252
+ }));
253
+ if (deleteResponse.status !== 403) {
254
+ console.error(`Expected non-root DELETE /secrets to return 403, got ${deleteResponse.status}`);
255
+ return false;
256
+ }
257
+ return true;
258
+ }
259
+ catch (error) {
260
+ console.error('Failed secrets require root spec:', error);
261
+ return false;
262
+ }
263
+ },
264
+ };
265
+ //# sourceMappingURL=scoping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoping.js","sourceRoot":"","sources":["../../src/api/scoping.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,6 @@
1
1
  export type Fetch = (request: Request) => Promise<Response>;
2
+ export type FetchFactory = (userName: string) => Promise<{
3
+ fetch: Fetch;
4
+ userId: string;
5
+ }>;
2
6
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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"}
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;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -119,6 +119,6 @@ export interface PositronicDevServer {
119
119
  */
120
120
  bulkSecrets(filePath: string): Promise<void>;
121
121
  }
122
- export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth } from './api/index.js';
123
- export type { AuthSetupResponse } from './api/index.js';
122
+ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping } from './api/index.js';
123
+ export type { AuthSetupResponse, Fetch, FetchFactory } from './api/index.js';
124
124
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAEhD;;;;OAIG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5C;;;;;OAKG;IACH,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEjD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEnD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAErD;;;OAGG;IACH,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAErF;;;;OAIG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;OAIG;IACH,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3H,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAEhD;;;;OAIG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5C;;;;;OAKG;IACH,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEjD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEnD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAErD;;;OAGG;IACH,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAErF;;;;OAIG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;OAIG;IACH,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACpI,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -9,5 +9,5 @@
9
9
  * Currently includes the PositronicDevServer interface.
10
10
  * Future additions will include REST API specifications and tests.
11
11
  */
12
- export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth } from './api/index.js';
12
+ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping } from './api/index.js';
13
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6HH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6HH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}