@positronic/spec 0.0.71 → 0.0.72

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.
@@ -10,6 +10,7 @@ export { bundle } from './bundle.js';
10
10
  export { users } from './users.js';
11
11
  export { auth } from './auth.js';
12
12
  export { scoping } from './scoping.js';
13
+ export { store } from './store.js';
13
14
  export type { User, UserKey } from './users.js';
14
15
  export type { AuthSetupResponse } from './auth.js';
15
16
  export type { Fetch, FetchFactory } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/api/index.js CHANGED
@@ -10,4 +10,5 @@ export { bundle } from './bundle.js';
10
10
  export { users } from './users.js';
11
11
  export { auth } from './auth.js';
12
12
  export { scoping } from './scoping.js';
13
+ export { store } from './store.js';
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { Fetch, FetchFactory } from './types.js';
2
+ export declare const store: {
3
+ /**
4
+ * Test GET /store - List brains with store data
5
+ */
6
+ listBrains(fetch: Fetch): Promise<boolean>;
7
+ /**
8
+ * Test GET /store/:brainTitle - List keys for a brain
9
+ */
10
+ listKeys(fetch: Fetch, brainTitle: string): Promise<boolean>;
11
+ /**
12
+ * Test GET /store/:brainTitle/shared/:key - Get shared key value
13
+ */
14
+ getSharedValue(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
15
+ /**
16
+ * Test GET /store/:brainTitle/user/:key - Get per-user key value
17
+ */
18
+ getUserValue(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
19
+ /**
20
+ * Test DELETE /store/:brainTitle/shared/:key - Delete shared key
21
+ */
22
+ deleteSharedKey(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
23
+ /**
24
+ * Test DELETE /store/:brainTitle/user/:key - Delete per-user key
25
+ */
26
+ deleteUserKey(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
27
+ /**
28
+ * Test DELETE /store/:brainTitle - Clear all accessible keys for a brain
29
+ */
30
+ clearBrainStore(fetch: Fetch, brainTitle: string): Promise<boolean>;
31
+ /**
32
+ * Test that shared endpoints require root access - non-root gets 403
33
+ */
34
+ sharedKeyRequiresRoot(fetchFactory: FetchFactory): Promise<boolean>;
35
+ /**
36
+ * Test that userA cannot read userB's per-user keys
37
+ */
38
+ userKeyIsolation(rootFetch: Fetch, fetchFactory: FetchFactory): Promise<boolean>;
39
+ };
40
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/api/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,KAAK;IAChB;;OAEG;sBACqB,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAqChD;;OAEG;oBACmB,KAAK,cAAc,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiElE;;OAEG;0BAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IA+CnB;;OAEG;wBAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IAqDnB;;OAEG;2BAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IA0BnB;;OAEG;yBAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IA0BnB;;OAEG;2BAEM,KAAK,cACA,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAmCnB;;OAEG;wCACuC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBzE;;OAEG;gCAEU,KAAK,gBACF,YAAY,GACzB,OAAO,CAAC,OAAO,CAAC;CA4BpB,CAAC"}
@@ -0,0 +1,244 @@
1
+ export const store = {
2
+ /**
3
+ * Test GET /store - List brains with store data
4
+ */
5
+ async listBrains(fetch) {
6
+ try {
7
+ const request = new Request('http://example.com/store', {
8
+ method: 'GET',
9
+ });
10
+ const response = await fetch(request);
11
+ if (!response.ok) {
12
+ console.error(`GET /store returned ${response.status}`);
13
+ return false;
14
+ }
15
+ const data = (await response.json());
16
+ if (!Array.isArray(data.brains)) {
17
+ console.error(`Expected brains to be an array, got ${typeof data.brains}`);
18
+ return false;
19
+ }
20
+ if (typeof data.count !== 'number') {
21
+ console.error(`Expected count to be number, got ${typeof data.count}`);
22
+ return false;
23
+ }
24
+ return true;
25
+ }
26
+ catch (error) {
27
+ console.error(`Failed to test GET /store:`, error);
28
+ return false;
29
+ }
30
+ },
31
+ /**
32
+ * Test GET /store/:brainTitle - List keys for a brain
33
+ */
34
+ async listKeys(fetch, brainTitle) {
35
+ try {
36
+ const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}`, { method: 'GET' });
37
+ const response = await fetch(request);
38
+ if (!response.ok) {
39
+ console.error(`GET /store/${brainTitle} returned ${response.status}`);
40
+ return false;
41
+ }
42
+ const data = (await response.json());
43
+ if (!Array.isArray(data.keys)) {
44
+ console.error(`Expected keys to be an array, got ${typeof data.keys}`);
45
+ return false;
46
+ }
47
+ if (typeof data.count !== 'number') {
48
+ console.error(`Expected count to be number, got ${typeof data.count}`);
49
+ return false;
50
+ }
51
+ for (const entry of data.keys) {
52
+ if (typeof entry.key !== 'string') {
53
+ console.error(`Expected key to be string, got ${typeof entry.key}`);
54
+ return false;
55
+ }
56
+ if (entry.scope !== 'shared' && entry.scope !== 'user') {
57
+ console.error(`Expected scope to be 'shared' or 'user', got '${entry.scope}'`);
58
+ return false;
59
+ }
60
+ if (typeof entry.size !== 'number') {
61
+ console.error(`Expected size to be number, got ${typeof entry.size}`);
62
+ return false;
63
+ }
64
+ if (typeof entry.lastModified !== 'string') {
65
+ console.error(`Expected lastModified to be string, got ${typeof entry.lastModified}`);
66
+ return false;
67
+ }
68
+ }
69
+ return true;
70
+ }
71
+ catch (error) {
72
+ console.error(`Failed to test GET /store/${brainTitle}:`, error);
73
+ return false;
74
+ }
75
+ },
76
+ /**
77
+ * Test GET /store/:brainTitle/shared/:key - Get shared key value
78
+ */
79
+ async getSharedValue(fetch, brainTitle, key) {
80
+ try {
81
+ const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/shared/${encodeURIComponent(key)}`, { method: 'GET' });
82
+ const response = await fetch(request);
83
+ if (!response.ok) {
84
+ console.error(`GET /store/${brainTitle}/shared/${key} returned ${response.status}`);
85
+ return false;
86
+ }
87
+ const data = (await response.json());
88
+ if (data.key !== key) {
89
+ console.error(`Expected key '${key}', got '${data.key}'`);
90
+ return false;
91
+ }
92
+ if (data.scope !== 'shared') {
93
+ console.error(`Expected scope 'shared', got '${data.scope}'`);
94
+ return false;
95
+ }
96
+ if (data.value === undefined) {
97
+ console.error(`Expected value to be defined`);
98
+ return false;
99
+ }
100
+ return true;
101
+ }
102
+ catch (error) {
103
+ console.error(`Failed to test GET /store/${brainTitle}/shared/${key}:`, error);
104
+ return false;
105
+ }
106
+ },
107
+ /**
108
+ * Test GET /store/:brainTitle/user/:key - Get per-user key value
109
+ */
110
+ async getUserValue(fetch, brainTitle, key) {
111
+ try {
112
+ const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/user/${encodeURIComponent(key)}`, { method: 'GET' });
113
+ const response = await fetch(request);
114
+ if (!response.ok) {
115
+ console.error(`GET /store/${brainTitle}/user/${key} returned ${response.status}`);
116
+ return false;
117
+ }
118
+ const data = (await response.json());
119
+ if (data.key !== key) {
120
+ console.error(`Expected key '${key}', got '${data.key}'`);
121
+ return false;
122
+ }
123
+ if (data.scope !== 'user') {
124
+ console.error(`Expected scope 'user', got '${data.scope}'`);
125
+ return false;
126
+ }
127
+ if (typeof data.userId !== 'string') {
128
+ console.error(`Expected userId to be string, got ${typeof data.userId}`);
129
+ return false;
130
+ }
131
+ if (data.value === undefined) {
132
+ console.error(`Expected value to be defined`);
133
+ return false;
134
+ }
135
+ return true;
136
+ }
137
+ catch (error) {
138
+ console.error(`Failed to test GET /store/${brainTitle}/user/${key}:`, error);
139
+ return false;
140
+ }
141
+ },
142
+ /**
143
+ * Test DELETE /store/:brainTitle/shared/:key - Delete shared key
144
+ */
145
+ async deleteSharedKey(fetch, brainTitle, key) {
146
+ try {
147
+ const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/shared/${encodeURIComponent(key)}`, { method: 'DELETE' });
148
+ const response = await fetch(request);
149
+ if (response.status !== 204) {
150
+ console.error(`DELETE /store/${brainTitle}/shared/${key} returned ${response.status}, expected 204`);
151
+ return false;
152
+ }
153
+ return true;
154
+ }
155
+ catch (error) {
156
+ console.error(`Failed to test DELETE /store/${brainTitle}/shared/${key}:`, error);
157
+ return false;
158
+ }
159
+ },
160
+ /**
161
+ * Test DELETE /store/:brainTitle/user/:key - Delete per-user key
162
+ */
163
+ async deleteUserKey(fetch, brainTitle, key) {
164
+ try {
165
+ const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/user/${encodeURIComponent(key)}`, { method: 'DELETE' });
166
+ const response = await fetch(request);
167
+ if (response.status !== 204) {
168
+ console.error(`DELETE /store/${brainTitle}/user/${key} returned ${response.status}, expected 204`);
169
+ return false;
170
+ }
171
+ return true;
172
+ }
173
+ catch (error) {
174
+ console.error(`Failed to test DELETE /store/${brainTitle}/user/${key}:`, error);
175
+ return false;
176
+ }
177
+ },
178
+ /**
179
+ * Test DELETE /store/:brainTitle - Clear all accessible keys for a brain
180
+ */
181
+ async clearBrainStore(fetch, brainTitle) {
182
+ try {
183
+ const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}`, { method: 'DELETE' });
184
+ const response = await fetch(request);
185
+ if (!response.ok) {
186
+ console.error(`DELETE /store/${brainTitle} returned ${response.status}`);
187
+ return false;
188
+ }
189
+ const data = (await response.json());
190
+ if (typeof data.deleted !== 'number') {
191
+ console.error(`Expected deleted to be number, got ${typeof data.deleted}`);
192
+ return false;
193
+ }
194
+ return true;
195
+ }
196
+ catch (error) {
197
+ console.error(`Failed to test DELETE /store/${brainTitle}:`, error);
198
+ return false;
199
+ }
200
+ },
201
+ /**
202
+ * Test that shared endpoints require root access - non-root gets 403
203
+ */
204
+ async sharedKeyRequiresRoot(fetchFactory) {
205
+ try {
206
+ const { fetch: userFetch } = await fetchFactory('non-root-user');
207
+ const request = new Request('http://example.com/store/test-brain/shared/test-key', { method: 'GET' });
208
+ const response = await userFetch(request);
209
+ if (response.status !== 403) {
210
+ console.error(`Expected 403 for non-root shared key access, got ${response.status}`);
211
+ return false;
212
+ }
213
+ return true;
214
+ }
215
+ catch (error) {
216
+ console.error(`Failed to test shared key root requirement:`, error);
217
+ return false;
218
+ }
219
+ },
220
+ /**
221
+ * Test that userA cannot read userB's per-user keys
222
+ */
223
+ async userKeyIsolation(rootFetch, fetchFactory) {
224
+ try {
225
+ // Get userA's fetch
226
+ const { fetch: userAFetch, userId: userAId } = await fetchFactory('userA');
227
+ // Try to access userA's key with userA's credentials - should work
228
+ const request = new Request('http://example.com/store/test-brain/user/test-key', { method: 'GET' });
229
+ const response = await userAFetch(request);
230
+ // If the key doesn't exist, we'd get 404, which is fine for isolation testing
231
+ // We're testing that the endpoint doesn't return 403 for the user's own data
232
+ if (response.status === 403) {
233
+ console.error(`User should be able to access their own per-user keys, got 403`);
234
+ return false;
235
+ }
236
+ return true;
237
+ }
238
+ catch (error) {
239
+ console.error(`Failed to test user key isolation:`, error);
240
+ return false;
241
+ }
242
+ },
243
+ };
244
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/api/store.ts"],"names":[],"mappings":"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"}
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, scoping } from './api/index.js';
122
+ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping, store } from './api/index.js';
123
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,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACpI,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,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,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC3I,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, scoping } from './api/index.js';
12
+ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping, store } 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,OAAO,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,KAAK,EAAE,MAAM,gBAAgB,CAAC"}
@@ -10,3 +10,4 @@ export { bundle } from './bundle.js';
10
10
  export { users } from './users.js';
11
11
  export { auth } from './auth.js';
12
12
  export { scoping } from './scoping.js';
13
+ export { store } from './store.js';
@@ -0,0 +1,743 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _type_of(obj) {
31
+ "@swc/helpers - typeof";
32
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
33
+ }
34
+ function _ts_generator(thisArg, body) {
35
+ var f, y, t, _ = {
36
+ label: 0,
37
+ sent: function() {
38
+ if (t[0] & 1) throw t[1];
39
+ return t[1];
40
+ },
41
+ trys: [],
42
+ ops: []
43
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
44
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
45
+ return this;
46
+ }), g;
47
+ function verb(n) {
48
+ return function(v) {
49
+ return step([
50
+ n,
51
+ v
52
+ ]);
53
+ };
54
+ }
55
+ function step(op) {
56
+ if (f) throw new TypeError("Generator is already executing.");
57
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
58
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
59
+ if (y = 0, t) op = [
60
+ op[0] & 2,
61
+ t.value
62
+ ];
63
+ switch(op[0]){
64
+ case 0:
65
+ case 1:
66
+ t = op;
67
+ break;
68
+ case 4:
69
+ _.label++;
70
+ return {
71
+ value: op[1],
72
+ done: false
73
+ };
74
+ case 5:
75
+ _.label++;
76
+ y = op[1];
77
+ op = [
78
+ 0
79
+ ];
80
+ continue;
81
+ case 7:
82
+ op = _.ops.pop();
83
+ _.trys.pop();
84
+ continue;
85
+ default:
86
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
87
+ _ = 0;
88
+ continue;
89
+ }
90
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
91
+ _.label = op[1];
92
+ break;
93
+ }
94
+ if (op[0] === 6 && _.label < t[1]) {
95
+ _.label = t[1];
96
+ t = op;
97
+ break;
98
+ }
99
+ if (t && _.label < t[2]) {
100
+ _.label = t[2];
101
+ _.ops.push(op);
102
+ break;
103
+ }
104
+ if (t[2]) _.ops.pop();
105
+ _.trys.pop();
106
+ continue;
107
+ }
108
+ op = body.call(thisArg, _);
109
+ } catch (e) {
110
+ op = [
111
+ 6,
112
+ e
113
+ ];
114
+ y = 0;
115
+ } finally{
116
+ f = t = 0;
117
+ }
118
+ if (op[0] & 5) throw op[1];
119
+ return {
120
+ value: op[0] ? op[1] : void 0,
121
+ done: true
122
+ };
123
+ }
124
+ }
125
+ export var store = {
126
+ listBrains: /**
127
+ * Test GET /store - List brains with store data
128
+ */ function listBrains(fetch) {
129
+ return _async_to_generator(function() {
130
+ var request, response, data, error;
131
+ return _ts_generator(this, function(_state) {
132
+ switch(_state.label){
133
+ case 0:
134
+ _state.trys.push([
135
+ 0,
136
+ 3,
137
+ ,
138
+ 4
139
+ ]);
140
+ request = new Request('http://example.com/store', {
141
+ method: 'GET'
142
+ });
143
+ return [
144
+ 4,
145
+ fetch(request)
146
+ ];
147
+ case 1:
148
+ response = _state.sent();
149
+ if (!response.ok) {
150
+ console.error("GET /store returned ".concat(response.status));
151
+ return [
152
+ 2,
153
+ false
154
+ ];
155
+ }
156
+ return [
157
+ 4,
158
+ response.json()
159
+ ];
160
+ case 2:
161
+ data = _state.sent();
162
+ if (!Array.isArray(data.brains)) {
163
+ console.error("Expected brains to be an array, got ".concat(_type_of(data.brains)));
164
+ return [
165
+ 2,
166
+ false
167
+ ];
168
+ }
169
+ if (typeof data.count !== 'number') {
170
+ console.error("Expected count to be number, got ".concat(_type_of(data.count)));
171
+ return [
172
+ 2,
173
+ false
174
+ ];
175
+ }
176
+ return [
177
+ 2,
178
+ true
179
+ ];
180
+ case 3:
181
+ error = _state.sent();
182
+ console.error("Failed to test GET /store:", error);
183
+ return [
184
+ 2,
185
+ false
186
+ ];
187
+ case 4:
188
+ return [
189
+ 2
190
+ ];
191
+ }
192
+ });
193
+ })();
194
+ },
195
+ listKeys: /**
196
+ * Test GET /store/:brainTitle - List keys for a brain
197
+ */ function listKeys(fetch, brainTitle) {
198
+ return _async_to_generator(function() {
199
+ var request, response, data, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, entry, error;
200
+ return _ts_generator(this, function(_state) {
201
+ switch(_state.label){
202
+ case 0:
203
+ _state.trys.push([
204
+ 0,
205
+ 3,
206
+ ,
207
+ 4
208
+ ]);
209
+ request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle)), {
210
+ method: 'GET'
211
+ });
212
+ return [
213
+ 4,
214
+ fetch(request)
215
+ ];
216
+ case 1:
217
+ response = _state.sent();
218
+ if (!response.ok) {
219
+ console.error("GET /store/".concat(brainTitle, " returned ").concat(response.status));
220
+ return [
221
+ 2,
222
+ false
223
+ ];
224
+ }
225
+ return [
226
+ 4,
227
+ response.json()
228
+ ];
229
+ case 2:
230
+ data = _state.sent();
231
+ if (!Array.isArray(data.keys)) {
232
+ console.error("Expected keys to be an array, got ".concat(_type_of(data.keys)));
233
+ return [
234
+ 2,
235
+ false
236
+ ];
237
+ }
238
+ if (typeof data.count !== 'number') {
239
+ console.error("Expected count to be number, got ".concat(_type_of(data.count)));
240
+ return [
241
+ 2,
242
+ false
243
+ ];
244
+ }
245
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
246
+ try {
247
+ for(_iterator = data.keys[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
248
+ entry = _step.value;
249
+ if (typeof entry.key !== 'string') {
250
+ console.error("Expected key to be string, got ".concat(_type_of(entry.key)));
251
+ return [
252
+ 2,
253
+ false
254
+ ];
255
+ }
256
+ if (entry.scope !== 'shared' && entry.scope !== 'user') {
257
+ console.error("Expected scope to be 'shared' or 'user', got '".concat(entry.scope, "'"));
258
+ return [
259
+ 2,
260
+ false
261
+ ];
262
+ }
263
+ if (typeof entry.size !== 'number') {
264
+ console.error("Expected size to be number, got ".concat(_type_of(entry.size)));
265
+ return [
266
+ 2,
267
+ false
268
+ ];
269
+ }
270
+ if (typeof entry.lastModified !== 'string') {
271
+ console.error("Expected lastModified to be string, got ".concat(_type_of(entry.lastModified)));
272
+ return [
273
+ 2,
274
+ false
275
+ ];
276
+ }
277
+ }
278
+ } catch (err) {
279
+ _didIteratorError = true;
280
+ _iteratorError = err;
281
+ } finally{
282
+ try {
283
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
284
+ _iterator.return();
285
+ }
286
+ } finally{
287
+ if (_didIteratorError) {
288
+ throw _iteratorError;
289
+ }
290
+ }
291
+ }
292
+ return [
293
+ 2,
294
+ true
295
+ ];
296
+ case 3:
297
+ error = _state.sent();
298
+ console.error("Failed to test GET /store/".concat(brainTitle, ":"), error);
299
+ return [
300
+ 2,
301
+ false
302
+ ];
303
+ case 4:
304
+ return [
305
+ 2
306
+ ];
307
+ }
308
+ });
309
+ })();
310
+ },
311
+ getSharedValue: /**
312
+ * Test GET /store/:brainTitle/shared/:key - Get shared key value
313
+ */ function getSharedValue(fetch, brainTitle, key) {
314
+ return _async_to_generator(function() {
315
+ var request, response, data, error;
316
+ return _ts_generator(this, function(_state) {
317
+ switch(_state.label){
318
+ case 0:
319
+ _state.trys.push([
320
+ 0,
321
+ 3,
322
+ ,
323
+ 4
324
+ ]);
325
+ request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/shared/").concat(encodeURIComponent(key)), {
326
+ method: 'GET'
327
+ });
328
+ return [
329
+ 4,
330
+ fetch(request)
331
+ ];
332
+ case 1:
333
+ response = _state.sent();
334
+ if (!response.ok) {
335
+ console.error("GET /store/".concat(brainTitle, "/shared/").concat(key, " returned ").concat(response.status));
336
+ return [
337
+ 2,
338
+ false
339
+ ];
340
+ }
341
+ return [
342
+ 4,
343
+ response.json()
344
+ ];
345
+ case 2:
346
+ data = _state.sent();
347
+ if (data.key !== key) {
348
+ console.error("Expected key '".concat(key, "', got '").concat(data.key, "'"));
349
+ return [
350
+ 2,
351
+ false
352
+ ];
353
+ }
354
+ if (data.scope !== 'shared') {
355
+ console.error("Expected scope 'shared', got '".concat(data.scope, "'"));
356
+ return [
357
+ 2,
358
+ false
359
+ ];
360
+ }
361
+ if (data.value === undefined) {
362
+ console.error("Expected value to be defined");
363
+ return [
364
+ 2,
365
+ false
366
+ ];
367
+ }
368
+ return [
369
+ 2,
370
+ true
371
+ ];
372
+ case 3:
373
+ error = _state.sent();
374
+ console.error("Failed to test GET /store/".concat(brainTitle, "/shared/").concat(key, ":"), error);
375
+ return [
376
+ 2,
377
+ false
378
+ ];
379
+ case 4:
380
+ return [
381
+ 2
382
+ ];
383
+ }
384
+ });
385
+ })();
386
+ },
387
+ getUserValue: /**
388
+ * Test GET /store/:brainTitle/user/:key - Get per-user key value
389
+ */ function getUserValue(fetch, brainTitle, key) {
390
+ return _async_to_generator(function() {
391
+ var request, response, data, error;
392
+ return _ts_generator(this, function(_state) {
393
+ switch(_state.label){
394
+ case 0:
395
+ _state.trys.push([
396
+ 0,
397
+ 3,
398
+ ,
399
+ 4
400
+ ]);
401
+ request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/user/").concat(encodeURIComponent(key)), {
402
+ method: 'GET'
403
+ });
404
+ return [
405
+ 4,
406
+ fetch(request)
407
+ ];
408
+ case 1:
409
+ response = _state.sent();
410
+ if (!response.ok) {
411
+ console.error("GET /store/".concat(brainTitle, "/user/").concat(key, " returned ").concat(response.status));
412
+ return [
413
+ 2,
414
+ false
415
+ ];
416
+ }
417
+ return [
418
+ 4,
419
+ response.json()
420
+ ];
421
+ case 2:
422
+ data = _state.sent();
423
+ if (data.key !== key) {
424
+ console.error("Expected key '".concat(key, "', got '").concat(data.key, "'"));
425
+ return [
426
+ 2,
427
+ false
428
+ ];
429
+ }
430
+ if (data.scope !== 'user') {
431
+ console.error("Expected scope 'user', got '".concat(data.scope, "'"));
432
+ return [
433
+ 2,
434
+ false
435
+ ];
436
+ }
437
+ if (typeof data.userId !== 'string') {
438
+ console.error("Expected userId to be string, got ".concat(_type_of(data.userId)));
439
+ return [
440
+ 2,
441
+ false
442
+ ];
443
+ }
444
+ if (data.value === undefined) {
445
+ console.error("Expected value to be defined");
446
+ return [
447
+ 2,
448
+ false
449
+ ];
450
+ }
451
+ return [
452
+ 2,
453
+ true
454
+ ];
455
+ case 3:
456
+ error = _state.sent();
457
+ console.error("Failed to test GET /store/".concat(brainTitle, "/user/").concat(key, ":"), error);
458
+ return [
459
+ 2,
460
+ false
461
+ ];
462
+ case 4:
463
+ return [
464
+ 2
465
+ ];
466
+ }
467
+ });
468
+ })();
469
+ },
470
+ deleteSharedKey: /**
471
+ * Test DELETE /store/:brainTitle/shared/:key - Delete shared key
472
+ */ function deleteSharedKey(fetch, brainTitle, key) {
473
+ return _async_to_generator(function() {
474
+ var request, response, error;
475
+ return _ts_generator(this, function(_state) {
476
+ switch(_state.label){
477
+ case 0:
478
+ _state.trys.push([
479
+ 0,
480
+ 2,
481
+ ,
482
+ 3
483
+ ]);
484
+ request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/shared/").concat(encodeURIComponent(key)), {
485
+ method: 'DELETE'
486
+ });
487
+ return [
488
+ 4,
489
+ fetch(request)
490
+ ];
491
+ case 1:
492
+ response = _state.sent();
493
+ if (response.status !== 204) {
494
+ console.error("DELETE /store/".concat(brainTitle, "/shared/").concat(key, " returned ").concat(response.status, ", expected 204"));
495
+ return [
496
+ 2,
497
+ false
498
+ ];
499
+ }
500
+ return [
501
+ 2,
502
+ true
503
+ ];
504
+ case 2:
505
+ error = _state.sent();
506
+ console.error("Failed to test DELETE /store/".concat(brainTitle, "/shared/").concat(key, ":"), error);
507
+ return [
508
+ 2,
509
+ false
510
+ ];
511
+ case 3:
512
+ return [
513
+ 2
514
+ ];
515
+ }
516
+ });
517
+ })();
518
+ },
519
+ deleteUserKey: /**
520
+ * Test DELETE /store/:brainTitle/user/:key - Delete per-user key
521
+ */ function deleteUserKey(fetch, brainTitle, key) {
522
+ return _async_to_generator(function() {
523
+ var request, response, error;
524
+ return _ts_generator(this, function(_state) {
525
+ switch(_state.label){
526
+ case 0:
527
+ _state.trys.push([
528
+ 0,
529
+ 2,
530
+ ,
531
+ 3
532
+ ]);
533
+ request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/user/").concat(encodeURIComponent(key)), {
534
+ method: 'DELETE'
535
+ });
536
+ return [
537
+ 4,
538
+ fetch(request)
539
+ ];
540
+ case 1:
541
+ response = _state.sent();
542
+ if (response.status !== 204) {
543
+ console.error("DELETE /store/".concat(brainTitle, "/user/").concat(key, " returned ").concat(response.status, ", expected 204"));
544
+ return [
545
+ 2,
546
+ false
547
+ ];
548
+ }
549
+ return [
550
+ 2,
551
+ true
552
+ ];
553
+ case 2:
554
+ error = _state.sent();
555
+ console.error("Failed to test DELETE /store/".concat(brainTitle, "/user/").concat(key, ":"), error);
556
+ return [
557
+ 2,
558
+ false
559
+ ];
560
+ case 3:
561
+ return [
562
+ 2
563
+ ];
564
+ }
565
+ });
566
+ })();
567
+ },
568
+ clearBrainStore: /**
569
+ * Test DELETE /store/:brainTitle - Clear all accessible keys for a brain
570
+ */ function clearBrainStore(fetch, brainTitle) {
571
+ return _async_to_generator(function() {
572
+ var request, response, data, error;
573
+ return _ts_generator(this, function(_state) {
574
+ switch(_state.label){
575
+ case 0:
576
+ _state.trys.push([
577
+ 0,
578
+ 3,
579
+ ,
580
+ 4
581
+ ]);
582
+ request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle)), {
583
+ method: 'DELETE'
584
+ });
585
+ return [
586
+ 4,
587
+ fetch(request)
588
+ ];
589
+ case 1:
590
+ response = _state.sent();
591
+ if (!response.ok) {
592
+ console.error("DELETE /store/".concat(brainTitle, " returned ").concat(response.status));
593
+ return [
594
+ 2,
595
+ false
596
+ ];
597
+ }
598
+ return [
599
+ 4,
600
+ response.json()
601
+ ];
602
+ case 2:
603
+ data = _state.sent();
604
+ if (typeof data.deleted !== 'number') {
605
+ console.error("Expected deleted to be number, got ".concat(_type_of(data.deleted)));
606
+ return [
607
+ 2,
608
+ false
609
+ ];
610
+ }
611
+ return [
612
+ 2,
613
+ true
614
+ ];
615
+ case 3:
616
+ error = _state.sent();
617
+ console.error("Failed to test DELETE /store/".concat(brainTitle, ":"), error);
618
+ return [
619
+ 2,
620
+ false
621
+ ];
622
+ case 4:
623
+ return [
624
+ 2
625
+ ];
626
+ }
627
+ });
628
+ })();
629
+ },
630
+ sharedKeyRequiresRoot: /**
631
+ * Test that shared endpoints require root access - non-root gets 403
632
+ */ function sharedKeyRequiresRoot(fetchFactory) {
633
+ return _async_to_generator(function() {
634
+ var _ref, userFetch, request, response, error;
635
+ return _ts_generator(this, function(_state) {
636
+ switch(_state.label){
637
+ case 0:
638
+ _state.trys.push([
639
+ 0,
640
+ 3,
641
+ ,
642
+ 4
643
+ ]);
644
+ return [
645
+ 4,
646
+ fetchFactory('non-root-user')
647
+ ];
648
+ case 1:
649
+ _ref = _state.sent(), userFetch = _ref.fetch;
650
+ request = new Request('http://example.com/store/test-brain/shared/test-key', {
651
+ method: 'GET'
652
+ });
653
+ return [
654
+ 4,
655
+ userFetch(request)
656
+ ];
657
+ case 2:
658
+ response = _state.sent();
659
+ if (response.status !== 403) {
660
+ console.error("Expected 403 for non-root shared key access, got ".concat(response.status));
661
+ return [
662
+ 2,
663
+ false
664
+ ];
665
+ }
666
+ return [
667
+ 2,
668
+ true
669
+ ];
670
+ case 3:
671
+ error = _state.sent();
672
+ console.error("Failed to test shared key root requirement:", error);
673
+ return [
674
+ 2,
675
+ false
676
+ ];
677
+ case 4:
678
+ return [
679
+ 2
680
+ ];
681
+ }
682
+ });
683
+ })();
684
+ },
685
+ userKeyIsolation: /**
686
+ * Test that userA cannot read userB's per-user keys
687
+ */ function userKeyIsolation(rootFetch, fetchFactory) {
688
+ return _async_to_generator(function() {
689
+ var _ref, userAFetch, userAId, request, response, error;
690
+ return _ts_generator(this, function(_state) {
691
+ switch(_state.label){
692
+ case 0:
693
+ _state.trys.push([
694
+ 0,
695
+ 3,
696
+ ,
697
+ 4
698
+ ]);
699
+ return [
700
+ 4,
701
+ fetchFactory('userA')
702
+ ];
703
+ case 1:
704
+ _ref = _state.sent(), userAFetch = _ref.fetch, userAId = _ref.userId;
705
+ // Try to access userA's key with userA's credentials - should work
706
+ request = new Request('http://example.com/store/test-brain/user/test-key', {
707
+ method: 'GET'
708
+ });
709
+ return [
710
+ 4,
711
+ userAFetch(request)
712
+ ];
713
+ case 2:
714
+ response = _state.sent();
715
+ // If the key doesn't exist, we'd get 404, which is fine for isolation testing
716
+ // We're testing that the endpoint doesn't return 403 for the user's own data
717
+ if (response.status === 403) {
718
+ console.error("User should be able to access their own per-user keys, got 403");
719
+ return [
720
+ 2,
721
+ false
722
+ ];
723
+ }
724
+ return [
725
+ 2,
726
+ true
727
+ ];
728
+ case 3:
729
+ error = _state.sent();
730
+ console.error("Failed to test user key isolation:", error);
731
+ return [
732
+ 2,
733
+ false
734
+ ];
735
+ case 4:
736
+ return [
737
+ 2
738
+ ];
739
+ }
740
+ });
741
+ })();
742
+ }
743
+ };
package/dist/src/index.js CHANGED
@@ -13,4 +13,4 @@
13
13
  *
14
14
  * This interface provides lifecycle management for a server instance,
15
15
  * abstracting away the underlying implementation details (process, worker, etc.)
16
- */ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping } from './api/index.js';
16
+ */ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping, store } from './api/index.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/spec",
3
- "version": "0.0.71",
3
+ "version": "0.0.72",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },