@wrenautomation/aerie 0.7.0 → 0.8.0

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,63 @@
1
+ import type { CoordStore } from "./coord/port.js";
2
+ import { type PgCoordOptions } from "./coord/postgres.js";
3
+ import { type Db, type Hooks } from "./db.js";
4
+ import type { Atomic } from "./run/route.js";
5
+ import { type AerieStore } from "./store.js";
6
+ export type Port = "store" | "coord";
7
+ export type RemoteCall = {
8
+ port: Port;
9
+ op: string;
10
+ args: unknown[];
11
+ };
12
+ /** who the host's token check named */
13
+ export interface Caller {
14
+ actor: string;
15
+ email?: string;
16
+ }
17
+ /** `by` is the caller, or an agent, runner or peers machine acting for the caller (the call row names the person) */
18
+ export declare const actsFor: (by: string, caller: Caller) => boolean;
19
+ export interface RemoteServerOptions {
20
+ db: Db;
21
+ hooks?: Hooks;
22
+ prefix?: string;
23
+ /** the coord backing (default main) */
24
+ ns?: string;
25
+ /** the board's status names: set → the coord writes status (clients' `ownsStatus` must match) */
26
+ status?: PgCoordOptions["status"];
27
+ }
28
+ /** Host side, transport-free: the host checks the token, then hands the caller and the raw body here. */
29
+ export declare function remoteServer(o: RemoteServerOptions): {
30
+ /** body: the raw request text. Answer: status and superjson text. */
31
+ handle(caller: Caller, body: string): Promise<{
32
+ status: number;
33
+ body: string;
34
+ }>;
35
+ };
36
+ export type RemoteServer = ReturnType<typeof remoteServer>;
37
+ export interface RemoteOptions {
38
+ /** the host's route, e.g. https://…/api/aerie */
39
+ url: string;
40
+ token: string;
41
+ fetch?: typeof fetch;
42
+ /** store calls; default 15 s */
43
+ timeoutMs?: number;
44
+ /** coord calls: the port's budget, default 2 s */
45
+ coordTimeoutMs?: number;
46
+ /** must match the host's coord `status` (default true: the host writes status); sent, a mismatch is a 409 */
47
+ ownsStatus?: boolean;
48
+ /** this client's aerie version, sent and kept in the host's call row */
49
+ version?: string | undefined;
50
+ }
51
+ export interface Remote {
52
+ store: AerieStore;
53
+ coord: CoordStore;
54
+ atomic: Atomic;
55
+ }
56
+ /** Client side: an AerieStore, a CoordStore and an Atomic, each call one POST. */
57
+ export declare function remoteStore(o: RemoteOptions): Remote;
58
+ /** the remote calls a store method makes, for a test or a budget count */
59
+ export declare const REMOTE_OPS: {
60
+ store: string[];
61
+ coord: string[];
62
+ hostOnly: ("grant" | "revoke" | "addRouteRule" | "removeRouteRule" | "importTasks" | "addArea" | "actorOfEmail" | "setActor" | "putMilestones" | "mirrorFiles" | "setMirrorFile" | "setMirrorFiles" | "setSetting")[];
63
+ };
package/dist/remote.js ADDED
@@ -0,0 +1,430 @@
1
+ /**
2
+ * D20 B: the store and the coord port over HTTP, for machines with no Postgres URL.
3
+ * Wire: POST superjson `{port, op, args}` or `{batch}` (an Atomic: writes only, one transaction).
4
+ * Answer: superjson `{value}` or `{error}` with the AerieError status. The host checks the token and names the caller.
5
+ * Allow-list by effect; host-only ops (settings, roles, areas, rules, import, mirror) never cross the wire.
6
+ */
7
+ import superjson from "superjson";
8
+ import { z } from "zod";
9
+ import { pgCoord } from "./coord/postgres.js";
10
+ import { AerieError, atomic } from "./db.js";
11
+ import { SHAPES } from "./http.js";
12
+ import { remoteCall } from "./schema.js";
13
+ import { aerieStore } from "./store.js";
14
+ const { ID, TEXT, FILTER, SORT, EDIT } = SHAPES;
15
+ const BY = z.string().trim().min(1).max(200);
16
+ const WHY = z.string().max(2000);
17
+ const INT = z.int().positive();
18
+ const KIND = z.string().min(1).max(100);
19
+ const IDS = z.array(ID).max(5000);
20
+ const HOLDER = z.string().min(1).max(300);
21
+ const MS = z.int().positive().max(86_400_000);
22
+ const LANE = z.string().max(200).nullish();
23
+ // the portal's edit plus comments (the CLI adds them)
24
+ const TASK_EDIT = {
25
+ ...EDIT,
26
+ comments: z
27
+ .array(z.strictObject({ author: z.string().max(200).optional(), body: TEXT }))
28
+ .max(50)
29
+ .optional(),
30
+ };
31
+ const op = (effect, args, by) => ({
32
+ effect,
33
+ args: z.tuple(args),
34
+ ...(by === undefined ? {} : { by }),
35
+ });
36
+ const read = (args = [], by) => op("read", args, by);
37
+ const write = (args, by) => op("write", args, by);
38
+ const STORE_OPS = {
39
+ get: read([ID]),
40
+ list: read([FILTER.optional(), SORT.optional()]),
41
+ events: read([ID]),
42
+ decisions: read([
43
+ z
44
+ .strictObject({ open: z.boolean().optional(), ids: z.array(INT).max(500).optional() })
45
+ .optional(),
46
+ ]),
47
+ intakes: read([
48
+ z
49
+ .strictObject({
50
+ ids: z.array(INT).max(500).optional(),
51
+ limit: z.int().min(1).max(500).optional(),
52
+ })
53
+ .optional(),
54
+ ]),
55
+ areas: read(),
56
+ grants: read(),
57
+ actors: read(),
58
+ milestones: read(),
59
+ statusOf: read([IDS]),
60
+ routeRules: read(),
61
+ lastEvent: read([ID, KIND]),
62
+ countEvents: read([
63
+ ID,
64
+ KIND,
65
+ z.record(z.string(), z.unknown()).optional(),
66
+ z.int().nonnegative().optional(),
67
+ ]),
68
+ searchEvents: read([
69
+ z.string().trim().min(1).max(500),
70
+ z
71
+ .strictObject({
72
+ task: ID.optional(),
73
+ kind: KIND.optional(),
74
+ limit: z.int().min(1).max(500).optional(),
75
+ })
76
+ .optional(),
77
+ ]),
78
+ views: read([BY], 0),
79
+ prefixOf: read(),
80
+ mirrorAreas: read(),
81
+ getSetting: read([z.string().min(1).max(100)]),
82
+ create: write([
83
+ z.strictObject({ ...TASK_EDIT, title: z.string().trim().min(1).max(500) }),
84
+ BY,
85
+ z.strictObject({ why: WHY.optional() }).optional(),
86
+ ], 1),
87
+ edit: write([
88
+ ID,
89
+ z.strictObject(TASK_EDIT),
90
+ BY,
91
+ z.strictObject({ expect: z.int().nonnegative().optional(), why: WHY.optional() }).optional(),
92
+ ], 2),
93
+ log: write([ID, BY, KIND, z.unknown(), WHY.optional()], 1),
94
+ ask: write([
95
+ z.strictObject({
96
+ question: z.string().trim().min(1).max(2000),
97
+ options: z
98
+ .array(z.strictObject({
99
+ key: z.string().min(1).max(100),
100
+ text: z.string().max(2000),
101
+ cost: z.string().max(500).optional(),
102
+ }))
103
+ .min(1)
104
+ .max(20),
105
+ recommendation: z.string().max(200).optional(),
106
+ brief: TEXT.optional(),
107
+ blocks: z.array(ID).max(200).optional(),
108
+ area: z.string().max(200).optional(),
109
+ due: z.string().max(40).optional(),
110
+ kind: z.enum(["ask", "run-failed"]).optional(),
111
+ }),
112
+ BY,
113
+ ], 1),
114
+ decide: write([INT, z.string().trim().min(1).max(200), BY, WHY.optional()], 2),
115
+ briefDecision: write([
116
+ INT,
117
+ z.strictObject({
118
+ brief: TEXT.optional(),
119
+ recommendation: z.string().max(200).optional(),
120
+ why: WHY.optional(),
121
+ }),
122
+ BY,
123
+ ], 2),
124
+ mergeDecisions: write([INT, z.array(INT).min(1).max(200), BY, WHY.optional()], 2),
125
+ addIntake: write([
126
+ z.strictObject({
127
+ kind: z.enum(["text", "chat", "voice"]),
128
+ words: z.string().max(500_000),
129
+ audio: z.string().max(2000).optional(),
130
+ heard: z.unknown().optional(),
131
+ why: WHY.optional(),
132
+ }),
133
+ BY,
134
+ ], 1),
135
+ setIntake: write([
136
+ INT,
137
+ z.strictObject({
138
+ splitBy: z.string().max(200).optional(),
139
+ split: z.unknown().optional(),
140
+ checks: z.unknown().optional(),
141
+ taskIds: z.array(ID).max(500).optional(),
142
+ }),
143
+ ]),
144
+ saveView: write([
145
+ BY,
146
+ z.strictObject({
147
+ name: z.string().trim().min(1).max(100),
148
+ filter: FILTER,
149
+ sort: SORT,
150
+ groupBy: z.string().max(40).optional(),
151
+ layout: z.enum(["board", "list", "columns"]),
152
+ columns: z.array(z.string().max(40)).max(40).optional(),
153
+ }),
154
+ ], 0),
155
+ deleteView: write([BY, z.string().trim().min(1).max(100)], 0),
156
+ };
157
+ /** operator ops: on the host only. `setSetting("pool_command")` would run a command on the pool host. */
158
+ const HOST_ONLY = [
159
+ "setSetting",
160
+ "grant",
161
+ "revoke",
162
+ "addArea",
163
+ "setActor",
164
+ "actorOfEmail",
165
+ "addRouteRule",
166
+ "removeRouteRule",
167
+ "importTasks",
168
+ "putMilestones",
169
+ "mirrorFiles",
170
+ "setMirrorFile",
171
+ "setMirrorFiles",
172
+ ];
173
+ const _sorted = true;
174
+ void _sorted;
175
+ const COORD_OPS = {
176
+ claim: write([ID, HOLDER, MS]),
177
+ renew: write([z.array(HOLDER).max(500), MS]),
178
+ release: write([
179
+ ID,
180
+ HOLDER,
181
+ z
182
+ .strictObject({
183
+ done: z.strictObject({ reason: z.string().max(2000) }).optional(),
184
+ queue: z.boolean().optional(),
185
+ expire: z.array(HOLDER).max(500).optional(),
186
+ })
187
+ .optional(),
188
+ ]),
189
+ held: read(),
190
+ queueAdd: write([
191
+ z.array(ID).max(500),
192
+ z
193
+ .strictObject({
194
+ lane: LANE,
195
+ pin: LANE,
196
+ at: z.union([z.enum(["top", "end"]), z.strictObject({ after: ID })]).optional(),
197
+ })
198
+ .optional(),
199
+ ]),
200
+ queueRemove: write([z.array(ID).max(500)]),
201
+ queueList: read(),
202
+ queueTake: write([
203
+ z.strictObject({
204
+ lanes: z.union([z.literal("*"), z.array(z.string().max(200)).max(100)]),
205
+ pin: LANE,
206
+ cap: z.int().positive().optional(),
207
+ key: z.string().max(200).optional(),
208
+ }),
209
+ HOLDER,
210
+ MS,
211
+ ]),
212
+ fence: read([ID, HOLDER, z.int().nonnegative()]),
213
+ };
214
+ const OPS = { store: STORE_OPS, coord: COORD_OPS };
215
+ // envelopes stay loose (an older host ignores a newer field); each op's args are strict
216
+ const CALL = z.object({
217
+ port: z.enum(["store", "coord"]),
218
+ op: z.string().min(1).max(100),
219
+ args: z.array(z.unknown()).max(10),
220
+ });
221
+ const META = {
222
+ /** the client's aerie version, kept in the call row */
223
+ v: z.string().max(40).optional(),
224
+ /** the client's coord `ownsStatus`; a coord call refuses a mismatch with the host (409) */
225
+ owns: z.boolean().optional(),
226
+ };
227
+ const REQUEST = z.union([
228
+ z.object({ ...META, batch: z.array(CALL).min(1).max(100) }),
229
+ CALL.extend(META),
230
+ ]);
231
+ /** `by` is the caller, or an agent, runner or peers machine acting for the caller (the call row names the person) */
232
+ export const actsFor = (by, caller) => by === caller.actor || /^(agent|runner):/.test(by) || by.startsWith("@peers:");
233
+ /** Host side, transport-free: the host checks the token, then hands the caller and the raw body here. */
234
+ export function remoteServer(o) {
235
+ const pair = (q) => ({
236
+ store: aerieStore({
237
+ db: q,
238
+ ...(o.hooks ? { hooks: o.hooks } : {}),
239
+ ...(o.prefix ? { prefix: o.prefix } : {}),
240
+ }),
241
+ coord: pgCoord({
242
+ db: q,
243
+ ns: o.ns ?? "main",
244
+ ...(o.status ? { status: o.status } : {}),
245
+ }),
246
+ });
247
+ const run = async (on, call, caller, batch) => {
248
+ const spec = OPS[call.port][call.op];
249
+ if (!spec || !Object.hasOwn(OPS[call.port], call.op))
250
+ throw new AerieError(`${call.port}.${call.op} runs on the host only`, 403);
251
+ if (batch && spec.effect === "read")
252
+ throw new AerieError(`${call.port}.${call.op}: a batch holds writes only`, 400);
253
+ const p = spec.args.safeParse(call.args);
254
+ if (!p.success)
255
+ throw new AerieError(`${call.port}.${call.op}: ${z.prettifyError(p.error)}`, 400);
256
+ if (spec.by !== undefined) {
257
+ const by = p.data[spec.by];
258
+ if (!actsFor(by, caller))
259
+ throw new AerieError(`${call.port}.${call.op}: ${caller.actor} may not act as ${by}`, 403);
260
+ }
261
+ const target = on[call.port];
262
+ return target[call.op](...p.data);
263
+ };
264
+ const keep = async (caller, port, op, args, t0, client, error) => {
265
+ try {
266
+ await o.db.insert(remoteCall).values({
267
+ caller: caller.actor,
268
+ email: caller.email ?? null,
269
+ client,
270
+ port,
271
+ op,
272
+ args: (superjson.serialize(args).json ?? null),
273
+ ms: Date.now() - t0,
274
+ ok: !error,
275
+ status: error?.status ?? 200,
276
+ error: error?.message ?? null,
277
+ });
278
+ }
279
+ catch (err) {
280
+ // the call's answer stands; a lost log line is said, never fatal
281
+ console.error(`aerie remote: call log failed: ${err.message}`);
282
+ }
283
+ };
284
+ return {
285
+ /** body: the raw request text. Answer: status and superjson text. */
286
+ async handle(caller, body) {
287
+ const t0 = Date.now();
288
+ let req;
289
+ let port = "?";
290
+ let opName = "?";
291
+ // unparsable: the body as sent
292
+ let args = { raw: body };
293
+ let client = null;
294
+ try {
295
+ let raw;
296
+ try {
297
+ raw = superjson.parse(body);
298
+ }
299
+ catch {
300
+ throw new AerieError("body is not superjson", 400);
301
+ }
302
+ const p = REQUEST.safeParse(raw);
303
+ if (!p.success)
304
+ throw new AerieError(z.prettifyError(p.error), 400);
305
+ req = p.data;
306
+ client = req.v ?? null;
307
+ if ("batch" in req) {
308
+ port = "atomic";
309
+ opName = req.batch.map((c) => `${c.port}.${c.op}`).join(",");
310
+ args = req.batch;
311
+ }
312
+ else {
313
+ port = req.port;
314
+ opName = req.op;
315
+ args = req.args;
316
+ }
317
+ const main = pair(o.db);
318
+ if ((await main.store.getSetting("remote_store")) !== "on")
319
+ throw new AerieError("the remote store is off (setting remote_store)", 403);
320
+ const r = req;
321
+ const calls = "batch" in r ? r.batch : [r];
322
+ const writes = !!o.status;
323
+ if (r.owns !== undefined && r.owns !== writes && calls.some((c) => c.port === "coord"))
324
+ throw new AerieError(`coord status: this host ${writes ? "writes" : "does not write"} task status; set AERIE_COORD_STATUS to match`, 409);
325
+ const value = "batch" in r
326
+ ? await atomic(o.db, async (tx) => {
327
+ const on = pair(tx);
328
+ const out = [];
329
+ for (const c of r.batch)
330
+ out.push(await run(on, c, caller, true));
331
+ return out;
332
+ })
333
+ : await run(main, r, caller, false);
334
+ await keep(caller, port, opName, args, t0, client);
335
+ return { status: 200, body: superjson.stringify({ value }) };
336
+ }
337
+ catch (err) {
338
+ const status = err instanceof AerieError ? err.status : 500;
339
+ const message = err.message ?? String(err);
340
+ await keep(caller, port, opName, args, t0, client, { status, message });
341
+ return { status, body: superjson.stringify({ error: message }) };
342
+ }
343
+ },
344
+ };
345
+ }
346
+ const STATUSES = new Set([400, 403, 404, 409]);
347
+ /** a recorded write's answer: unknown until the batch commits, so any use of it throws (await still works) */
348
+ const UNKNOWN = new Proxy({}, {
349
+ get(_, k) {
350
+ if (k === "then")
351
+ return undefined;
352
+ throw new Error("aerie remote: a write's answer is unknown inside an Atomic (the batch runs after)");
353
+ },
354
+ });
355
+ /** Client side: an AerieStore, a CoordStore and an Atomic, each call one POST. */
356
+ export function remoteStore(o) {
357
+ const owns = o.ownsStatus ?? true;
358
+ const send = async (payload, ms) => {
359
+ const res = await (o.fetch ?? fetch)(o.url, {
360
+ method: "POST",
361
+ headers: { authorization: `Bearer ${o.token}`, "content-type": "application/json" },
362
+ body: superjson.stringify({ ...payload, v: o.version, owns }),
363
+ signal: AbortSignal.timeout(ms),
364
+ });
365
+ const text = await res.text();
366
+ let out;
367
+ try {
368
+ out = superjson.parse(text);
369
+ }
370
+ catch {
371
+ throw new Error(`aerie remote: ${res.status} ${text}`);
372
+ }
373
+ if (res.ok)
374
+ return out.value;
375
+ const message = out?.error ?? `${res.status}`;
376
+ if (STATUSES.has(res.status))
377
+ throw new AerieError(message, res.status);
378
+ throw new Error(`aerie remote: ${message}`);
379
+ };
380
+ // trailing undefined args: absent, so the tuple's optional tail matches
381
+ const trim = (a) => {
382
+ const out = [...a];
383
+ while (out.length && out[out.length - 1] === undefined)
384
+ out.pop();
385
+ return out;
386
+ };
387
+ const storeMs = o.timeoutMs ?? 15_000;
388
+ const coordMs = o.coordTimeoutMs ?? 2_000;
389
+ const call = (port, op) => (...args) => send({ port, op, args: trim(args) }, port === "coord" ? coordMs : storeMs);
390
+ const hostOnly = (op) => () => Promise.reject(new AerieError(`${op} runs on the host only (aerie remote)`, 403));
391
+ const store = Object.fromEntries([
392
+ ...Object.keys(STORE_OPS).map((k) => [k, call("store", k)]),
393
+ ...HOST_ONLY.map((k) => [k, hostOnly(k)]),
394
+ ]);
395
+ const coord = {
396
+ name: "aerie-remote",
397
+ ownsStatus: owns,
398
+ ...Object.fromEntries(Object.keys(COORD_OPS).map((k) => [k, call("coord", k)])),
399
+ end: async () => { },
400
+ };
401
+ // Atomic: the callback runs on recorders; writes are kept, a read throws; one POST runs them in one transaction
402
+ const recorder = (port, ops, batch) => Object.fromEntries(Object.entries(ops).map(([k, spec]) => [
403
+ k,
404
+ spec.effect === "write"
405
+ ? async (...args) => {
406
+ batch.push({ port, op: k, args: trim(args) });
407
+ return UNKNOWN;
408
+ }
409
+ : () => Promise.reject(new Error(`aerie remote: ${port}.${k} reads inside an Atomic`)),
410
+ ]));
411
+ const atomicRemote = async (fn) => {
412
+ const batch = [];
413
+ const out = await fn(recorder("store", STORE_OPS, batch), {
414
+ name: "aerie-remote",
415
+ ownsStatus: coord.ownsStatus,
416
+ ...recorder("coord", COORD_OPS, batch),
417
+ });
418
+ if (batch.length)
419
+ await send({ batch }, storeMs);
420
+ return out;
421
+ };
422
+ return { store, coord, atomic: atomicRemote };
423
+ }
424
+ /** the remote calls a store method makes, for a test or a budget count */
425
+ export const REMOTE_OPS = {
426
+ store: Object.keys(STORE_OPS),
427
+ coord: Object.keys(COORD_OPS),
428
+ hostOnly: [...HOST_ONLY],
429
+ };
430
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}