@intentface/latch-server 0.9.1

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,457 @@
1
+ import { decodeOAuthState } from "@intentface/latch-mcp";
2
+ const json = (data, status = 200) => new Response(JSON.stringify(data), {
3
+ status,
4
+ headers: { "content-type": "application/json" },
5
+ });
6
+ const redirect = (location) => new Response(null, { status: 302, headers: { location } });
7
+ /**
8
+ * A caller-supplied `returnTo` is only allowed as an app-relative path. Absolute
9
+ * (`https://evil`) or protocol-relative (`//evil`, `/\evil`) targets are an
10
+ * open-redirect vector — fall back to `/`.
11
+ */
12
+ function safeReturnTo(raw) {
13
+ if (!raw || !raw.startsWith("/") || raw[1] === "/" || raw[1] === "\\")
14
+ return "/";
15
+ return raw;
16
+ }
17
+ /**
18
+ * Redirect to a vetted relative `returnTo`, merging `params` into its query with
19
+ * proper encoding (preserving any query the path already carries).
20
+ */
21
+ function redirectTo(raw, params) {
22
+ const [base, existing] = safeReturnTo(raw).split("?", 2);
23
+ const qs = new URLSearchParams(existing);
24
+ for (const [key, value] of Object.entries(params))
25
+ qs.set(key, value);
26
+ const query = qs.toString();
27
+ return redirect(query ? `${base}?${query}` : base);
28
+ }
29
+ /** Split a path into segments after stripping `basePath`. Null if outside it. */
30
+ function segmentsUnder(pathname, basePath) {
31
+ let base = basePath.replace(/\/$/, "");
32
+ if (base === "") {
33
+ return pathname.replace(/^\/+/, "").split("/").filter(Boolean);
34
+ }
35
+ if (pathname === base)
36
+ return [];
37
+ if (!pathname.startsWith(base + "/"))
38
+ return null;
39
+ return pathname.slice(base.length + 1).split("/").filter(Boolean);
40
+ }
41
+ /** Accept `{ message }`, `{ text }`, or a `useChat`-style `{ messages }` (last). */
42
+ function toUserMessage(body) {
43
+ const explicit = body.message;
44
+ if (explicit?.parts)
45
+ return explicit;
46
+ let text = "";
47
+ if (typeof body.text === "string") {
48
+ text = body.text;
49
+ }
50
+ else if (Array.isArray(body.messages)) {
51
+ const last = body.messages[body.messages.length - 1];
52
+ text = (last?.parts ?? [])
53
+ .filter((p) => p.type === "text")
54
+ .map((p) => p.text)
55
+ .join("");
56
+ }
57
+ return {
58
+ id: crypto.randomUUID(),
59
+ role: "user",
60
+ parts: [{ type: "text", text }],
61
+ metadata: { visibility: "user", createdAt: Date.now() },
62
+ };
63
+ }
64
+ /**
65
+ * The runtime's typed refusals → HTTP. Every run-producing route (a message, an
66
+ * approval decision, a client-tool result) can meet any of these, so they all
67
+ * map through here instead of surfacing as a host 500:
68
+ *
69
+ * pending_approval 409 a decision is outstanding — resolve it first
70
+ * chat_busy 409 a turn is live in this chat — retry after `Retry-After`
71
+ * chat_conflict 409 the client-chosen chat id exists and isn't yours
72
+ * limit_exceeded 429 a budget is spent — retry after `Retry-After`
73
+ */
74
+ function refusalResponse(e) {
75
+ const code = e && typeof e === "object" ? e.code : undefined;
76
+ const message = (fallback) => (e instanceof Error ? e.message : fallback);
77
+ const retryAfterMs = Number(e?.retryAfterMs ?? 0);
78
+ const withRetry = (body, status) => new Response(JSON.stringify({ ...body, retryAfterMs }), {
79
+ status,
80
+ headers: {
81
+ "content-type": "application/json",
82
+ "retry-after": String(Math.max(1, Math.ceil(retryAfterMs / 1000))),
83
+ },
84
+ });
85
+ switch (code) {
86
+ case "pending_approval":
87
+ return json({ error: message("awaiting approval decision"), code }, 409);
88
+ case "chat_busy":
89
+ return withRetry({ error: message("a turn is already running in this chat"), code }, 409);
90
+ case "chat_conflict":
91
+ return json({ error: message("chat id is not available"), code }, 409);
92
+ case "limit_exceeded":
93
+ return withRetry({ error: message("limit exceeded"), code }, 429);
94
+ default:
95
+ return undefined;
96
+ }
97
+ }
98
+ export function createLatchHandler(config) {
99
+ const { runtime, resolveContext, connections } = config;
100
+ const basePath = config.basePath ?? "/";
101
+ /** Resolve the runtime for this request's principal (static value or per-principal resolver). */
102
+ const resolveRuntime = (principal) => typeof runtime === "function"
103
+ ? runtime(principal)
104
+ : runtime;
105
+ /** Resolve the connection registry for a principal (static value or per-principal resolver). */
106
+ const resolveConnections = async (principal) => typeof connections === "function"
107
+ ? await connections(principal)
108
+ : connections;
109
+ return async (request) => {
110
+ const url = new URL(request.url);
111
+ const seg = segmentsUnder(url.pathname, basePath);
112
+ if (seg === null)
113
+ return undefined; // not under our mount → host handles it
114
+ const method = request.method.toUpperCase();
115
+ // --- connections (generic, any MCP server) ----------------------------
116
+ // The callback may run before/without an app session, so it resolves the
117
+ // principal itself; the other connection routes require one.
118
+ if (seg[0] === "connections" && connections) {
119
+ const name = seg[1];
120
+ const action = seg[2];
121
+ // The callback arrives at a moment we don't control (an IdP redirect),
122
+ // so its identity must NEVER come from the live session — a degraded
123
+ // session there is exactly how credentials end up under the wrong owner.
124
+ // Every flow this handler starts pins the resolved principal into the
125
+ // state (`__latch`); the callback rebuilds identity from that pin. The
126
+ // pin is tamper-evident: the full state string is exact-matched against
127
+ // the copy stored (owner-keyed) at authorize time, so a forged payload
128
+ // never survives the exchange.
129
+ const isCallback = !!name && action === "callback" && method === "GET";
130
+ const callbackState = isCallback
131
+ ? (decodeOAuthState(url.searchParams.get("state")) ?? undefined)
132
+ : undefined;
133
+ let principal;
134
+ if (isCallback) {
135
+ // A callback ALWAYS identifies itself by its pin. No state, an
136
+ // undecodable state, or a state without a pin (a flow started before
137
+ // pinning existed, or a hand-built one) is treated like a stale pin:
138
+ // the flow can't be trusted, so it is expired — the live session is
139
+ // never asked to stand in for it.
140
+ const pinned = callbackState?.__latch;
141
+ const maxAge = config.oauthFlowMaxAgeMs ?? 30 * 60_000;
142
+ const valid = !!pinned && pinned.p !== undefined && typeof pinned.iat === "number";
143
+ if (!valid || Date.now() - pinned.iat > maxAge) {
144
+ return redirectTo(callbackState?.returnTo ?? "/", {
145
+ error: "flow_expired",
146
+ });
147
+ }
148
+ principal = await (config.reconstructPrincipal ?? ((id) => id))(pinned.p, request);
149
+ }
150
+ else {
151
+ principal = await resolveContext(request);
152
+ }
153
+ if (!principal)
154
+ return json({ error: "unauthorized" }, 401);
155
+ const conns = await resolveConnections(principal);
156
+ if (!conns)
157
+ return json({ error: "no connections configured" }, 400);
158
+ const oauth = name ? conns.oauth(name) : undefined;
159
+ // GET connections → status list
160
+ if (!name && method === "GET") {
161
+ return json({ connections: await conns.status(principal) });
162
+ }
163
+ // GET connections/:name/authorize → 302 to IdP
164
+ if (name && action === "authorize" && method === "GET") {
165
+ if (!oauth)
166
+ return json({ error: `not an OAuth connection: ${name}` }, 400);
167
+ const chatId = url.searchParams.get("chatId") ?? undefined;
168
+ const approvalId = url.searchParams.get("approvalId") ?? undefined;
169
+ const returnTo = url.searchParams.get("returnTo") ?? undefined;
170
+ // Optional caller-supplied context folded into the OAuth state so the
171
+ // callback (which may lack a session) can rebuild it — a credential-
172
+ // scope selector.
173
+ const scope = url.searchParams.get("scope") ?? undefined;
174
+ // Pin the resolved principal (+ issue time) into the flow state. The
175
+ // callback rebuilds identity from this pin via `reconstructPrincipal`
176
+ // — the live session at redirect time never decides where credentials
177
+ // land. Principals are IDs-only by contract, so the payload is small
178
+ // and non-sensitive; integrity comes from the stored-state exact match.
179
+ const state = {
180
+ chatId,
181
+ approvalId,
182
+ returnTo,
183
+ scope,
184
+ __latch: { p: principal, iat: Date.now() },
185
+ };
186
+ // A connection resolved as OAuth-capable but not actually configured for
187
+ // it (e.g. a dynamic name whose stored record isn't oauth) throws here —
188
+ // surface it as a 400 rather than starting an orphan flow.
189
+ let res;
190
+ try {
191
+ res = await oauth.start(principal, { state });
192
+ }
193
+ catch (e) {
194
+ return json({ error: e instanceof Error ? e.message : "authorize failed" }, 400);
195
+ }
196
+ if (res.status !== "redirect") {
197
+ // Already authorized (tokens live in the Vault) — start()
198
+ // short-circuits without an IdP round-trip, so the callback (which
199
+ // signals `onConnected` and appends `connectedParam`) never runs.
200
+ // Signal both here too, so a pending `connect_<name>` still resumes.
201
+ await config.onConnected?.(principal, name);
202
+ return redirectTo(returnTo, {
203
+ [config.connectedParam ?? "connected"]: name,
204
+ });
205
+ }
206
+ return redirect(res.authorizationUrl);
207
+ }
208
+ // GET connections/:name/callback → finish OAuth, then redirect. It does
209
+ // NOT resume a waiting turn: the browser must not sit on a blank page
210
+ // for a whole run. Resuming is the CLIENT's job after the redirect —
211
+ // find the pending `connect_<name>` approval in the chat's history and
212
+ // submit it to `POST agents/:agent/:id/approvals`, which returns the
213
+ // continuation stream. See the "OAuth callback identity" section of the
214
+ // package README for the full client protocol.
215
+ if (name && action === "callback" && method === "GET") {
216
+ if (!oauth)
217
+ return json({ error: `not an OAuth connection: ${name}` }, 400);
218
+ const code = url.searchParams.get("code");
219
+ const rawState = url.searchParams.get("state");
220
+ const returnTo = callbackState?.returnTo ?? "/";
221
+ if (!code)
222
+ return redirectTo(returnTo, { error: "missing_code" });
223
+ try {
224
+ await oauth.finish(principal, { code, state: rawState ?? undefined });
225
+ }
226
+ catch (e) {
227
+ // Surface the real cause — token exchange failures (redirect_uri
228
+ // mismatch, bad secret, resource/scope rejection) are otherwise
229
+ // invisible behind the redirect.
230
+ console.warn(`OAuth callback "${name}" token exchange failed:`, e instanceof Error ? (e.stack ?? e.message) : e);
231
+ return redirectTo(returnTo, { error: "exchange_failed" });
232
+ }
233
+ await config.onConnected?.(principal, name);
234
+ // Redirect back IMMEDIATELY — don't run the resumed turn here, or the
235
+ // browser would block on a blank page until the whole answer (tool calls
236
+ // + generation) finished. The chat page approves the pending
237
+ // `connect_<name>` on return, so the conversation renders at once and
238
+ // the answer streams/fills in with a working state.
239
+ return redirectTo(returnTo, {
240
+ [config.connectedParam ?? "connected"]: name,
241
+ });
242
+ }
243
+ // POST connections/:name/disconnect → drop credentials
244
+ if (name && action === "disconnect" && method === "POST") {
245
+ await oauth?.provider(principal).invalidateCredentials?.("all");
246
+ return json({ ok: true });
247
+ }
248
+ // POST connections/:name/test → connectivity probe (tool names)
249
+ if (name && action === "test" && method === "POST") {
250
+ try {
251
+ return json({ tools: await conns.testTools(name, principal) });
252
+ }
253
+ catch (e) {
254
+ return json({ error: e instanceof Error ? e.message : "test failed" }, 502);
255
+ }
256
+ }
257
+ }
258
+ // --- runtime ops ------------------------------------------------------
259
+ if (seg[0] === "agents") {
260
+ const principal = await resolveContext(request);
261
+ if (!principal)
262
+ return json({ error: "unauthorized" }, 401);
263
+ const rt = await resolveRuntime(principal);
264
+ // GET agents — the agents available to the caller (for a picker).
265
+ // Hidden (internal) agents stay resolvable by name but are dropped here;
266
+ // callers that need the full set use `runtime.listAgents()` directly.
267
+ if (!seg[1] && method === "GET") {
268
+ const all = await rt.listAgents(principal);
269
+ return json({ agents: all.filter((a) => !a.hidden) });
270
+ }
271
+ const agent = seg[1];
272
+ // Client-chosen chat id, used as-is. Tenant isolation is enforced by the
273
+ // storage scope (orgId on the row + scoped reads), so it isn't prefixed —
274
+ // and the same id flows through the UI, history, and OAuth-resume links.
275
+ const chatId = seg[2];
276
+ if (!agent || !chatId)
277
+ return undefined;
278
+ // POST agents/:agent/:id/approvals
279
+ if (seg[3] === "approvals" && method === "POST") {
280
+ const body = (await request.json().catch(() => ({})));
281
+ try {
282
+ return await rt.applyApproval({
283
+ chatId,
284
+ principal,
285
+ decisions: Array.isArray(body.decisions) ? body.decisions : [],
286
+ request,
287
+ // The body was consumed above — hand the parsed payload on so
288
+ // context.build never needs to re-read the spent Request.
289
+ turnContext: body,
290
+ });
291
+ }
292
+ catch (e) {
293
+ // A decision is a turn too: it can meet a busy chat (two clicks) or a
294
+ // spent budget, and must answer 409/429 like a message does.
295
+ const refused = refusalResponse(e);
296
+ if (refused)
297
+ return refused;
298
+ throw e;
299
+ }
300
+ }
301
+ // POST agents/:agent/:id/tool-result (client-handled tool, e.g. askUser)
302
+ if (seg[3] === "tool-result" && method === "POST") {
303
+ const body = (await request.json().catch(() => ({})));
304
+ if (!body.toolCallId)
305
+ return json({ error: "toolCallId is required" }, 400);
306
+ try {
307
+ return await rt.applyToolResult({
308
+ chatId,
309
+ principal,
310
+ toolCallId: body.toolCallId,
311
+ output: body.output,
312
+ request,
313
+ // See the approvals route: the parsed body doubles as turnContext.
314
+ turnContext: body,
315
+ });
316
+ }
317
+ catch (e) {
318
+ const refused = refusalResponse(e);
319
+ if (refused)
320
+ return refused;
321
+ throw e;
322
+ }
323
+ }
324
+ // POST agents/:agent/:id
325
+ if (!seg[3] && method === "POST") {
326
+ const body = (await request.json().catch(() => ({})));
327
+ try {
328
+ return await rt.handleChat({
329
+ agent,
330
+ chatId,
331
+ principal,
332
+ message: toUserMessage(body),
333
+ request,
334
+ // The POST body is parsed exactly once, here — pass it on as the
335
+ // per-turn payload so `context.build` / agent factories can read
336
+ // request-scoped fields without touching the spent Request body.
337
+ turnContext: body,
338
+ });
339
+ }
340
+ catch (e) {
341
+ const refused = refusalResponse(e);
342
+ if (refused)
343
+ return refused;
344
+ throw e;
345
+ }
346
+ }
347
+ }
348
+ if (seg[0] === "chats" && method === "GET") {
349
+ const principal = await resolveContext(request);
350
+ if (!principal)
351
+ return json({ error: "unauthorized" }, 401);
352
+ const rt = await resolveRuntime(principal);
353
+ const id = seg[1];
354
+ if (id) {
355
+ return json({ messages: await rt.loadHistory({ chatId: id, principal }) });
356
+ }
357
+ return json({ chats: await rt.listChats({ principal }) });
358
+ }
359
+ if (seg[0] === "runs" && method === "GET") {
360
+ const principal = await resolveContext(request);
361
+ if (!principal)
362
+ return json({ error: "unauthorized" }, 401);
363
+ const rt = await resolveRuntime(principal);
364
+ // `identity` is the serialized Principal — durable SERVER state, and a
365
+ // customer type the docs invite you to extend (plan tier, impersonation
366
+ // markers, support-actor ids). It has no business in a browser payload,
367
+ // so this projection drops it. Read it server-side via `listRuns` if you
368
+ // need it.
369
+ const runs = (await rt.listRuns({ principal })).map(({ identity: _identity, ...run }) => run);
370
+ return json({ runs });
371
+ }
372
+ // --- schedules (cron-driven agents) -----------------------------------
373
+ if (seg[0] === "schedules") {
374
+ const principal = await resolveContext(request);
375
+ if (!principal)
376
+ return json({ error: "unauthorized" }, 401);
377
+ const rt = await resolveRuntime(principal);
378
+ const id = seg[1];
379
+ if (!id && method === "GET") {
380
+ return json({ schedules: await rt.listSchedules({ principal }) });
381
+ }
382
+ if (!id && method === "POST") {
383
+ const body = (await request.json().catch(() => ({})));
384
+ if (!body.agent || !body.prompt) {
385
+ return json({ error: "agent and prompt are required" }, 400);
386
+ }
387
+ // Reject an unknown policy rather than silently defaulting it: a
388
+ // caller that meant "fire" and typo'd must not get "skip" plus a 200.
389
+ if (body.onParked !== undefined &&
390
+ body.onParked !== "skip" &&
391
+ body.onParked !== "fire") {
392
+ return json({ error: 'onParked must be "skip" or "fire"' }, 400);
393
+ }
394
+ try {
395
+ const record = await rt.schedule({
396
+ principal,
397
+ agent: body.agent,
398
+ cron: body.cron ?? null,
399
+ timezone: body.timezone,
400
+ prompt: body.prompt,
401
+ // Host-interpreted, opaque to core (see `RuntimeConfig.runSchedule`).
402
+ // Forwarded verbatim — dropping it silently made the whole delivery
403
+ // seam unreachable through this handler.
404
+ delivery: body.delivery,
405
+ onParked: body.onParked,
406
+ });
407
+ return json({ schedule: record });
408
+ }
409
+ catch (e) {
410
+ return json({ error: e instanceof Error ? e.message : "schedule failed" }, 400);
411
+ }
412
+ }
413
+ // GET schedules/:id — owner-scoped read. Filtered from the caller's own
414
+ // list, so another tenant's id is indistinguishable from a missing one.
415
+ if (id && !seg[2] && method === "GET") {
416
+ const found = (await rt.listSchedules({ principal })).find((sch) => sch.id === id);
417
+ if (!found)
418
+ return json({ error: "not found" }, 404);
419
+ return json({ schedule: found });
420
+ }
421
+ // POST schedules/:id/run-now — arm it for the next tick. Deliberately
422
+ // NOT a direct fire: it goes through the ordinary runDue path (same
423
+ // claim, same occurrence consume, same delivery), so "run now" can't
424
+ // drift from what the cron actually does.
425
+ if (id && seg[2] === "run-now" && method === "POST") {
426
+ const armed = await rt.runScheduleNow({ principal, id });
427
+ if (!armed)
428
+ return json({ error: "not found, or already spent" }, 404);
429
+ return json({ ok: true });
430
+ }
431
+ if (id && !seg[2] && method === "DELETE") {
432
+ await rt.unschedule({ principal, id });
433
+ return json({ ok: true });
434
+ }
435
+ }
436
+ // POST cron/run — system-wide tick: fire ALL tenants' due schedules, then
437
+ // reap + resume stalled runs. Host-guarded by `cronSecret`, NOT user auth.
438
+ // Disabled if no secret set.
439
+ if (seg[0] === "cron" && seg[1] === "run" && method === "POST") {
440
+ if (!config.cronSecret)
441
+ return json({ error: "cron route disabled" }, 404);
442
+ if (request.headers.get("x-latch-cron-secret") !== config.cronSecret) {
443
+ return json({ error: "forbidden" }, 403);
444
+ }
445
+ // Host-supplied tick first — the only option for a resolver-based
446
+ // (DB-per-tenant) setup, where no principal exists to resolve a runtime.
447
+ if (config.cronRun)
448
+ return json(await config.cronRun());
449
+ if (typeof runtime === "function") {
450
+ return json({ error: "cron/run requires a static runtime or a `cronRun` tick in the handler config" }, 400);
451
+ }
452
+ return json(await runtime.cron());
453
+ }
454
+ return undefined;
455
+ };
456
+ }
457
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.test.d.ts","sourceRoot":"","sources":["../src/handler.test.ts"],"names":[],"mappings":""}