@intentface/latch-server 0.17.0 → 0.18.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.
- package/README.md +2 -2
- package/dist/app.d.ts +18 -16
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +7 -4
- package/dist/app.js.map +1 -1
- package/dist/handler.d.ts +44 -47
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js +24 -4
- package/dist/handler.js.map +1 -1
- package/dist/node.d.ts +27 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +147 -0
- package/dist/node.js.map +1 -0
- package/package.json +13 -7
- package/dist/handler.test.d.ts +0 -2
- package/dist/handler.test.d.ts.map +0 -1
- package/dist/handler.test.js +0 -343
- package/dist/handler.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @intentface/latch-server
|
|
2
2
|
|
|
3
|
-
The mountable HTTP surface for a Latch runtime — **one framework-agnostic Web handler** you mount at a single route in any Web-standard host (TanStack Start, Next, Bun, Deno, serverless).
|
|
3
|
+
The mountable HTTP surface for a Latch runtime — **one framework-agnostic Web handler** you mount at a single route in any Web-standard host (TanStack Start, Next, Bun, Deno, serverless). Express, Fastify and NestJS mount it through `toNodeHandler` from `@intentface/latch-server/node`.
|
|
4
4
|
|
|
5
5
|
## What it does
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ The mountable HTTP surface for a Latch runtime — **one framework-agnostic Web
|
|
|
10
10
|
- `POST /agents/:agent/:id/approvals` — submit HITL approval decisions (resumes the turn).
|
|
11
11
|
- `POST /agents/:agent/:id/tool-result` — return a client-handled tool result (e.g. `ask_question`).
|
|
12
12
|
- `GET /agents/:agent/:id/history`, `GET /chats`, `GET /runs` — projections for the UI.
|
|
13
|
-
- `GET/POST/DELETE /schedules`, `GET /schedules/:id`, `POST /schedules/:id/run-now` — manage scheduled agents; `POST /cron/run` — the host-guarded tick.
|
|
13
|
+
- `GET/POST/DELETE /schedules`, `GET /schedules/:id`, `POST /schedules/:id/run-now` — manage scheduled agents; `GET`/`POST /cron/run` — the host-guarded tick (a bearer token or `x-latch-cron-secret`, so Vercel Cron can call it).
|
|
14
14
|
- `GET /connections`, `…/:name/authorize`, `…/:name/callback`, `…/:name/disconnect`, `…/test` — generic MCP connection OAuth + status.
|
|
15
15
|
|
|
16
16
|
`resolveContext(request)` turns a request into your `Principal` (bring-your-own auth). A Hono adapter is exported from the `/hono` subpath.
|
package/dist/app.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentFactory, type
|
|
1
|
+
import { type AgentFactory, type ContextInput, type Runtime, type RuntimeConfig, type Scheduler, type StorageAdapter } from "@intentface/latch-core";
|
|
2
2
|
import { type ModelCatalog } from "@intentface/latch-core/models";
|
|
3
3
|
import { type LatchHandler, type LatchHandlerConfig } from "./handler.js";
|
|
4
4
|
/**
|
|
@@ -15,31 +15,33 @@ import { type LatchHandler, type LatchHandlerConfig } from "./handler.js";
|
|
|
15
15
|
* A hello-world is the storage adapter plus one agent; see `apps/example`.
|
|
16
16
|
*/
|
|
17
17
|
export interface LatchAppConfig<P, RC = unknown> {
|
|
18
|
-
/**
|
|
18
|
+
/** Where conversations, runs and usage are stored, for example `createPostgresAdapter(db, { owner })`. */
|
|
19
19
|
storage: StorageAdapter<P>;
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
22
|
-
* can pick
|
|
23
|
-
*
|
|
21
|
+
* Your agents, by name. Pass a function to get the model catalog, so an
|
|
22
|
+
* agent can pick its model by id: `(models) => ({ assistant: defineAgent({
|
|
23
|
+
* model: models.modelFor("claude-sonnet-4-6"), … }) })`.
|
|
24
24
|
*/
|
|
25
25
|
agents: Record<string, AgentFactory<P, any, any>> | ((models: ModelCatalog) => Record<string, AgentFactory<P, any, any>>);
|
|
26
|
-
/** Your
|
|
26
|
+
/** Your login: turns a request into the principal, or `null` for a `401`. */
|
|
27
27
|
resolveContext: LatchHandlerConfig<P>["resolveContext"];
|
|
28
|
-
/**
|
|
29
|
-
context?:
|
|
30
|
-
/** A
|
|
28
|
+
/** What your agents and tools can work with, built from who is asking on every turn: `async ({ principal }) => ({ … })`. @default `{}` */
|
|
29
|
+
context?: ContextInput<P, RC>;
|
|
30
|
+
/** A model catalog you already loaded. @default `loadModelCatalog()` */
|
|
31
31
|
models?: ModelCatalog;
|
|
32
|
-
/**
|
|
32
|
+
/** A key per caller for prompt caching, so one person's cached prompt is never reused for another. Usually the same as the storage owner. */
|
|
33
33
|
principalKey?: (principal: P) => string;
|
|
34
|
-
/**
|
|
34
|
+
/** Any other `createRuntime` option (limits, connections, schedules…), or a different value for one of the defaults. */
|
|
35
35
|
runtime?: Partial<Omit<RuntimeConfig<P, RC>, "storage" | "agents" | "context">>;
|
|
36
|
-
/**
|
|
36
|
+
/** Any other `createLatchHandler` option, such as `basePath`, `connections` or `cronSecret`. */
|
|
37
37
|
handler?: Partial<Omit<LatchHandlerConfig<P>, "runtime" | "resolveContext">>;
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
39
|
+
* How often to call `runtime.cron()` in this process, in ms, or `false` for
|
|
40
|
+
* never. Off on serverless (when `VERCEL` or `AWS_LAMBDA_FUNCTION_NAME` is
|
|
41
|
+
* set), where nothing runs between requests: call `runtime.cron()` from a
|
|
42
|
+
* cron route instead.
|
|
43
|
+
*
|
|
44
|
+
* @default 30000 on a long-running server
|
|
43
45
|
*/
|
|
44
46
|
cronIntervalMs?: number | false;
|
|
45
47
|
}
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEtG,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG9F;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO;IAC7C,0GAA0G;IAC1G,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B;;;;OAIG;IAEH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1H,6EAA6E;IAC7E,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACxD,0IAA0I;IAC1I,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,6IAA6I;IAC7I,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,MAAM,CAAC;IACxC,wHAAwH;IACxH,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;IAChF,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAC7E;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,qDAAqD;IACrD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,6CAA6C;IAC7C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAQD,wBAAsB,cAAc,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAoDtG"}
|
package/dist/app.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createIntervalScheduler, createRuntime,
|
|
1
|
+
import { createIntervalScheduler, createRuntime, } from "@intentface/latch-core";
|
|
2
2
|
import { loadModelCatalog, providerDefaults } from "@intentface/latch-core/models";
|
|
3
3
|
import { defaultHarnessTools } from "@intentface/latch-core/harness";
|
|
4
4
|
import { createLatchHandler } from "./handler.js";
|
|
@@ -11,7 +11,8 @@ export async function createLatchApp(cfg) {
|
|
|
11
11
|
const agents = typeof cfg.agents === "function" ? cfg.agents(models) : cfg.agents;
|
|
12
12
|
const runtime = createRuntime({
|
|
13
13
|
storage: cfg.storage,
|
|
14
|
-
|
|
14
|
+
// Left out, the runtime builds an empty context.
|
|
15
|
+
context: cfg.context,
|
|
15
16
|
agents,
|
|
16
17
|
// Resume-after-crash on by default: it costs a lease heartbeat per turn
|
|
17
18
|
// and is what makes `cron()`'s sweep half do anything.
|
|
@@ -25,8 +26,10 @@ export async function createLatchApp(cfg) {
|
|
|
25
26
|
runtime,
|
|
26
27
|
resolveContext: cfg.resolveContext,
|
|
27
28
|
// The system-wide cron route is unauthenticated — enabled only when a
|
|
28
|
-
// secret is set (the handler 404s it otherwise).
|
|
29
|
-
|
|
29
|
+
// secret is set (the handler 404s it otherwise). CRON_SECRET is the one
|
|
30
|
+
// Vercel sends to its crons, so on Vercel a cron in vercel.json pointing
|
|
31
|
+
// at cron/run is all it takes.
|
|
32
|
+
cronSecret: env("LATCH_CRON_SECRET") ?? env("CRON_SECRET"),
|
|
30
33
|
...cfg.handler,
|
|
31
34
|
});
|
|
32
35
|
let scheduler;
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,aAAa,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,aAAa,GAOd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAqB,MAAM,+BAA+B,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAA8C,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AA0DlD,yGAAyG;AACzG,MAAM,GAAG,GAAG,CAAC,IAAY,EAAsB,EAAE,CAC9C,UAAyE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAElG,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAkB,GAA0B;IAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAElF,MAAM,OAAO,GAAG,aAAa,CAAQ;QACnC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,iDAAiD;QACjD,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM;QACN,wEAAwE;QACxE,uDAAuD;QACvD,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7B,IAAI,EAAE,qBAAqB,EAAE;QAC7B,GAAG,gBAAgB,CAAQ,MAAM,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;QACtE,YAAY,EAAE,mBAAmB,EAAE;QACnC,GAAG,GAAG,CAAC,OAAO;KACf,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,kBAAkB,CAAI;QACpC,OAAO;QACP,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,sEAAsE;QACtE,wEAAwE;QACxE,yEAAyE;QACzE,+BAA+B;QAC/B,UAAU,EAAE,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC;QAC1D,GAAG,GAAG,CAAC,OAAO;KACf,CAAC,CAAC;IAEH,IAAI,SAAgC,CAAC;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,SAAS,GAAG,uBAAuB,CAAC;YAClC,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;oBAAE,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACzD,CAAC,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;QACN,SAAS;QACT,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/handler.d.ts
CHANGED
|
@@ -2,83 +2,80 @@ import type { Runtime } from "@intentface/latch-core";
|
|
|
2
2
|
import type { McpConnections } from "@intentface/latch-mcp";
|
|
3
3
|
export interface LatchHandlerConfig<P> {
|
|
4
4
|
/**
|
|
5
|
-
* The runtime
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* cron/run` (no principal) requires a static runtime OR a `cronRun` tick in
|
|
10
|
-
* this config (the resolver-based setup's system-wide sweep).
|
|
5
|
+
* The runtime the routes call. For a database per customer, pass a function
|
|
6
|
+
* instead: it gets the principal from `resolveContext` and returns that
|
|
7
|
+
* customer's runtime. In that case also set `cronRun`, because the cron
|
|
8
|
+
* route has no principal to pick a runtime with.
|
|
11
9
|
*/
|
|
12
10
|
runtime: Runtime<P> | ((principal: P) => Runtime<P> | Promise<Runtime<P>>);
|
|
13
11
|
/**
|
|
14
|
-
*
|
|
12
|
+
* Your login: turns a request into the principal, or `null` for a `401`.
|
|
15
13
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* A callback whose state carries no pin is rejected as expired.
|
|
14
|
+
* Not used when a sign-in to a connection returns (the OAuth callback): the
|
|
15
|
+
* principal that started the sign-in is saved with it and restored with
|
|
16
|
+
* `reconstructPrincipal`, so whatever session the returning browser has
|
|
17
|
+
* can't change whose account the credentials are saved to.
|
|
21
18
|
*/
|
|
22
19
|
resolveContext: (request: Request) => P | null | Promise<P | null>;
|
|
23
20
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* consulted. Override to validate (e.g. re-check org membership) or
|
|
29
|
-
* re-hydrate; return null to reject the callback (401). Default: cast.
|
|
21
|
+
* Restores the principal that started a connection sign-in, when the sign-in
|
|
22
|
+
* returns. Check it's still valid here (for example, still a member);
|
|
23
|
+
* return `null` to refuse with a `401`. By default the saved principal is
|
|
24
|
+
* used as is.
|
|
30
25
|
*/
|
|
31
26
|
reconstructPrincipal?: (identity: unknown, request: Request) => P | null | Promise<P | null>;
|
|
32
27
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
28
|
+
* How long a user has to finish signing in to a connection. A later return
|
|
29
|
+
* redirects with `?error=flow_expired`.
|
|
30
|
+
*
|
|
31
|
+
* @default 30 minutes
|
|
36
32
|
*/
|
|
37
33
|
oauthFlowMaxAgeMs?: number;
|
|
38
34
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
35
|
+
* The services users can connect, from `createMcpConnections`. Adds the
|
|
36
|
+
* routes to list, sign in to, test and disconnect them. Pass a function to
|
|
37
|
+
* give each customer their own set.
|
|
42
38
|
*/
|
|
43
39
|
connections?: McpConnections<P> | ((principal: P) => McpConnections<P> | Promise<McpConnections<P>>);
|
|
44
|
-
/**
|
|
45
|
-
* Called after a connection is successfully authorized (both the IdP callback
|
|
46
|
-
* and the already-authorized short-circuit in `authorize`). A consumer can use
|
|
47
|
-
* it to flip its own catalog/connector state to active.
|
|
48
|
-
*/
|
|
40
|
+
/** Called after a user connects a service, including when they were already connected. */
|
|
49
41
|
onConnected?: (principal: P, connectionName: string) => void | Promise<void>;
|
|
50
42
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* and at most an HTTP status, and hand the real error here. Without this the
|
|
56
|
-
* detail is simply lost; wire it to your logger.
|
|
43
|
+
* Receives errors the client is only told about briefly. A connection's
|
|
44
|
+
* errors can quote the other server's response, so the client gets a short
|
|
45
|
+
* code and the full error comes here. Wire it to your logger, or the detail
|
|
46
|
+
* is lost.
|
|
57
47
|
*/
|
|
58
48
|
onError?: (error: unknown, info: {
|
|
59
49
|
route: string;
|
|
60
50
|
name?: string;
|
|
61
51
|
}) => void | Promise<void>;
|
|
62
52
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
53
|
+
* The query parameter that tells your page which service was just connected,
|
|
54
|
+
* after a sign-in returns: `?connected=linear`.
|
|
55
|
+
*
|
|
56
|
+
* @default "connected"
|
|
65
57
|
*/
|
|
66
58
|
connectedParam?: string;
|
|
67
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Where the handler is mounted, for example `"/api/latch"`.
|
|
61
|
+
*
|
|
62
|
+
* @default "/"
|
|
63
|
+
*/
|
|
68
64
|
basePath?: string;
|
|
69
65
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
66
|
+
* Turns on `cron/run`, which calls `runtime.cron()` for every customer:
|
|
67
|
+
* fires due schedules and finishes interrupted answers. Requests must carry
|
|
68
|
+
* this secret, as `Authorization: Bearer <secret>` or in the
|
|
69
|
+
* `x-latch-cron-secret` header, with `GET` or `POST`. That means Vercel Cron
|
|
70
|
+
* can call it directly: set this to `process.env.CRON_SECRET` and point
|
|
71
|
+
* `vercel.json` at the route. Leave it out and the route doesn't exist.
|
|
74
72
|
*/
|
|
75
73
|
cronSecret?: string;
|
|
76
74
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* stalled runs reaped and resumed, in one call.
|
|
75
|
+
* What `POST /cron/run` does. Needed with a database per customer: call
|
|
76
|
+
* `cron()` on each customer's runtime.
|
|
77
|
+
*
|
|
78
|
+
* @default `runtime.cron()`
|
|
82
79
|
*/
|
|
83
80
|
cronRun?: () => Promise<unknown>;
|
|
84
81
|
}
|
package/dist/handler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA0E5D,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA0E5D,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC;;;;;OAKG;IACH,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E;;;;;;;OAOG;IACH,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACnE;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CACrB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,KACb,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EACR,cAAc,CAAC,CAAC,CAAC,GACjB,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,0FAA0F;IAC1F,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;AAyInC,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,YAAY,CA4Yd"}
|
package/dist/handler.js
CHANGED
|
@@ -63,6 +63,25 @@ function connectionFailure(error, fallback) {
|
|
|
63
63
|
const status = /\b(?:HTTP|status)\s(\d{3})\b/.exec(message)?.[1];
|
|
64
64
|
return { error: fallback, ...(status ? { status: Number(status) } : {}) };
|
|
65
65
|
}
|
|
66
|
+
/** The secret a cron request carries: a bearer token, or our own header. */
|
|
67
|
+
function cronSecretOf(request) {
|
|
68
|
+
// The scheme name is case-insensitive (RFC 9110); the token is not.
|
|
69
|
+
const bearer = request.headers.get("authorization")?.match(/^bearer\s+(.+)$/i);
|
|
70
|
+
if (bearer)
|
|
71
|
+
return bearer[1];
|
|
72
|
+
return request.headers.get("x-latch-cron-secret");
|
|
73
|
+
}
|
|
74
|
+
/** Compares in time that doesn't depend on where the strings first differ. */
|
|
75
|
+
function sameSecret(given, expected) {
|
|
76
|
+
if (given === null)
|
|
77
|
+
return false;
|
|
78
|
+
const a = new TextEncoder().encode(given);
|
|
79
|
+
const b = new TextEncoder().encode(expected);
|
|
80
|
+
let diff = a.length ^ b.length;
|
|
81
|
+
for (let i = 0; i < b.length; i++)
|
|
82
|
+
diff |= (a[i] ?? 0) ^ b[i];
|
|
83
|
+
return diff === 0;
|
|
84
|
+
}
|
|
66
85
|
const json = (data, status = 200) => new Response(JSON.stringify(data), {
|
|
67
86
|
status,
|
|
68
87
|
headers: { "content-type": "application/json" },
|
|
@@ -516,13 +535,14 @@ export function createLatchHandler(config) {
|
|
|
516
535
|
return json({ ok: true });
|
|
517
536
|
}
|
|
518
537
|
}
|
|
519
|
-
//
|
|
538
|
+
// cron/run — system-wide tick: fire ALL tenants' due schedules, then
|
|
520
539
|
// reap + resume stalled runs. Host-guarded by `cronSecret`, NOT user auth.
|
|
521
|
-
// Disabled if no secret set.
|
|
522
|
-
|
|
540
|
+
// Disabled if no secret set. GET as well as POST, and a bearer token as
|
|
541
|
+
// well as our header, because that's how Vercel Cron calls a URL.
|
|
542
|
+
if (seg[0] === "cron" && seg[1] === "run" && (method === "POST" || method === "GET")) {
|
|
523
543
|
if (!config.cronSecret)
|
|
524
544
|
return json({ error: "cron route disabled" }, 404);
|
|
525
|
-
if (request
|
|
545
|
+
if (!sameSecret(cronSecretOf(request), config.cronSecret)) {
|
|
526
546
|
return json({ error: "forbidden" }, 403);
|
|
527
547
|
}
|
|
528
548
|
// Host-supplied tick first — the only option for a resolver-based
|
package/dist/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LatchHandler } from "./handler.js";
|
|
3
|
+
/**
|
|
4
|
+
* The Latch handler for Node's `req` / `res`: Express, Fastify, NestJS, or a
|
|
5
|
+
* plain `http.createServer`. Request bodies and answers stream through; nothing
|
|
6
|
+
* is buffered.
|
|
7
|
+
*
|
|
8
|
+
* The returned function resolves `true` when it answered the request and
|
|
9
|
+
* `false` when the path isn't a Latch route, so your app can carry on:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const latch = toNodeHandler(createLatchHandler({ runtime, resolveContext, basePath: "/api/latch" }));
|
|
13
|
+
* app.all("/api/latch/*", async (req, res, next) => {
|
|
14
|
+
* if (!(await latch(req, res))) next();
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* On Fastify, and NestJS on Fastify, pass the raw objects, and the body if
|
|
19
|
+
* Fastify already parsed it: `latch(request.raw, reply.raw, request.body)`.
|
|
20
|
+
* Better still, give the Latch route a passthrough content-type parser so the
|
|
21
|
+
* body streams (see the docs).
|
|
22
|
+
*
|
|
23
|
+
* It rejects if the answer's stream fails partway (the response is cut off);
|
|
24
|
+
* a client that leaves mid-answer is not an error.
|
|
25
|
+
*/
|
|
26
|
+
export declare function toNodeHandler(handler: LatchHandler): (req: IncomingMessage, res: ServerResponse, parsedBody?: unknown) => Promise<boolean>;
|
|
27
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,GACpB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAOvF"}
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import { pipeline } from "node:stream/promises";
|
|
3
|
+
/**
|
|
4
|
+
* The Latch handler for Node's `req` / `res`: Express, Fastify, NestJS, or a
|
|
5
|
+
* plain `http.createServer`. Request bodies and answers stream through; nothing
|
|
6
|
+
* is buffered.
|
|
7
|
+
*
|
|
8
|
+
* The returned function resolves `true` when it answered the request and
|
|
9
|
+
* `false` when the path isn't a Latch route, so your app can carry on:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const latch = toNodeHandler(createLatchHandler({ runtime, resolveContext, basePath: "/api/latch" }));
|
|
13
|
+
* app.all("/api/latch/*", async (req, res, next) => {
|
|
14
|
+
* if (!(await latch(req, res))) next();
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* On Fastify, and NestJS on Fastify, pass the raw objects, and the body if
|
|
19
|
+
* Fastify already parsed it: `latch(request.raw, reply.raw, request.body)`.
|
|
20
|
+
* Better still, give the Latch route a passthrough content-type parser so the
|
|
21
|
+
* body streams (see the docs).
|
|
22
|
+
*
|
|
23
|
+
* It rejects if the answer's stream fails partway (the response is cut off);
|
|
24
|
+
* a client that leaves mid-answer is not an error.
|
|
25
|
+
*/
|
|
26
|
+
export function toNodeHandler(handler) {
|
|
27
|
+
return async (req, res, parsedBody) => {
|
|
28
|
+
const response = await handler(toWebRequest(req, parsedBody));
|
|
29
|
+
if (!response)
|
|
30
|
+
return false;
|
|
31
|
+
await writeNodeResponse(response, res);
|
|
32
|
+
return true;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Node request → Web Request, streaming the body. */
|
|
36
|
+
function toWebRequest(req, parsedBody) {
|
|
37
|
+
const host = req.headers.host ?? "localhost";
|
|
38
|
+
// A proxy chain sends "https,http": the first is what the client used.
|
|
39
|
+
// Without a proxy, the socket says whether this connection is TLS.
|
|
40
|
+
const forwarded = req.headers["x-forwarded-proto"];
|
|
41
|
+
const proto = (Array.isArray(forwarded) ? forwarded[0] : forwarded)?.split(",")[0]?.trim() ||
|
|
42
|
+
(req.socket?.encrypted ? "https" : "http");
|
|
43
|
+
const url = new URL(req.url ?? "/", `${proto}://${host}`);
|
|
44
|
+
const headers = new Headers();
|
|
45
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
46
|
+
if (Array.isArray(value))
|
|
47
|
+
for (const v of value)
|
|
48
|
+
headers.append(key, v);
|
|
49
|
+
else if (value !== undefined)
|
|
50
|
+
headers.set(key, value);
|
|
51
|
+
}
|
|
52
|
+
const method = req.method ?? "GET";
|
|
53
|
+
return new Request(url, {
|
|
54
|
+
method,
|
|
55
|
+
headers,
|
|
56
|
+
body: method === "GET" || method === "HEAD" ? undefined : bodyOf(req, parsedBody),
|
|
57
|
+
duplex: "half",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The request body: the stream, unless a body parser read it first
|
|
62
|
+
* (`express.json()`, Fastify's default parser). Then it's what the parser left,
|
|
63
|
+
* on `req.body` or passed in, encoded again for the request's content type.
|
|
64
|
+
*/
|
|
65
|
+
function bodyOf(req, given) {
|
|
66
|
+
// Fastify's passthrough parser hands the stream itself back as the body.
|
|
67
|
+
const passed = given instanceof Readable ? undefined : given;
|
|
68
|
+
if (passed === undefined && !req.readableEnded)
|
|
69
|
+
return lazyBodyOf(req);
|
|
70
|
+
const fromParser = passed ?? req.body;
|
|
71
|
+
if (fromParser === undefined) {
|
|
72
|
+
throw new Error("The request body was already read and nothing was kept: mount the Latch route before your body parser.");
|
|
73
|
+
}
|
|
74
|
+
if (typeof fromParser === "string" || fromParser instanceof Uint8Array)
|
|
75
|
+
return fromParser;
|
|
76
|
+
const type = String(req.headers["content-type"] ?? "").toLowerCase();
|
|
77
|
+
if (type.includes("application/x-www-form-urlencoded"))
|
|
78
|
+
return formOf(fromParser);
|
|
79
|
+
if (type === "" || type.includes("json"))
|
|
80
|
+
return JSON.stringify(fromParser);
|
|
81
|
+
throw new Error(`The request body was already parsed (${type}) and can't be sent on as it arrived: ` +
|
|
82
|
+
"mount the Latch route before your body parser.");
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The request's body as a Web stream that doesn't touch `req` until something
|
|
86
|
+
* reads it. A route Latch declines leaves the body unread, for the host's next
|
|
87
|
+
* handler. (`Readable.toWeb` starts reading as soon as it's called.)
|
|
88
|
+
*/
|
|
89
|
+
function lazyBodyOf(req) {
|
|
90
|
+
let reader;
|
|
91
|
+
return new ReadableStream({
|
|
92
|
+
async pull(controller) {
|
|
93
|
+
reader ??= Readable.toWeb(req).getReader();
|
|
94
|
+
const { done, value } = await reader.read();
|
|
95
|
+
if (done)
|
|
96
|
+
controller.close();
|
|
97
|
+
else
|
|
98
|
+
controller.enqueue(value);
|
|
99
|
+
},
|
|
100
|
+
cancel: (reason) => reader?.cancel(reason),
|
|
101
|
+
},
|
|
102
|
+
// Pull only when read: the default high-water mark of 1 pulls at once.
|
|
103
|
+
{ highWaterMark: 0 });
|
|
104
|
+
}
|
|
105
|
+
/** A parsed form (`{ a: "1", b: ["2", "3"] }`) as form-encoded text again. */
|
|
106
|
+
function formOf(parsed) {
|
|
107
|
+
const form = new URLSearchParams();
|
|
108
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
109
|
+
for (const v of Array.isArray(value) ? value : [value]) {
|
|
110
|
+
if (typeof v === "object" && v !== null) {
|
|
111
|
+
throw new Error("The form body was parsed into nested objects: mount the Latch route before your body parser.");
|
|
112
|
+
}
|
|
113
|
+
form.append(key, String(v));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return form;
|
|
117
|
+
}
|
|
118
|
+
/** Web Response → Node response, streaming. */
|
|
119
|
+
async function writeNodeResponse(response, res) {
|
|
120
|
+
res.statusCode = response.status;
|
|
121
|
+
response.headers.forEach((value, key) => {
|
|
122
|
+
// Headers joins several Set-Cookie values into one, which breaks them.
|
|
123
|
+
if (key !== "set-cookie")
|
|
124
|
+
res.setHeader(key, value);
|
|
125
|
+
});
|
|
126
|
+
const cookies = response.headers.getSetCookie();
|
|
127
|
+
if (cookies.length > 0)
|
|
128
|
+
res.setHeader("set-cookie", cookies);
|
|
129
|
+
if (!response.body) {
|
|
130
|
+
res.end();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// pipeline, not pipe: on an error, or when the client leaves, it closes both
|
|
134
|
+
// ends. A bare pipe leaves the error unhandled, and that can take the process
|
|
135
|
+
// down. The turn itself carries on and is saved on the server either way.
|
|
136
|
+
try {
|
|
137
|
+
await pipeline(Readable.fromWeb(response.body), res);
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
// The client leaving isn't a failure; the answer's own stream failing is.
|
|
141
|
+
if (!CLIENT_LEFT.has(e.code ?? ""))
|
|
142
|
+
throw e;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** How a write fails when the client has gone. */
|
|
146
|
+
const CLIENT_LEFT = new Set(["ERR_STREAM_PREMATURE_CLOSE", "ECONNRESET", "EPIPE"]);
|
|
147
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intentface/latch-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "The mountable Latch HTTP surface — one framework-agnostic Web handler (chat, approvals, lists, MCP connection OAuth). Hono adapter in the /hono subpath.",
|
|
3
|
+
"version": "0.18.0",
|
|
4
|
+
"description": "The mountable Latch HTTP surface — one framework-agnostic Web handler (chat, approvals, lists, MCP connection OAuth). Hono adapter in the /hono subpath, Node (Express, Fastify, NestJS) in /node.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
7
7
|
"ai-sdk",
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"llm",
|
|
10
10
|
"http",
|
|
11
11
|
"hono",
|
|
12
|
-
"webhooks"
|
|
12
|
+
"webhooks",
|
|
13
|
+
"express"
|
|
13
14
|
],
|
|
14
15
|
"license": "MIT",
|
|
15
16
|
"type": "module",
|
|
@@ -24,6 +25,10 @@
|
|
|
24
25
|
"./hono": {
|
|
25
26
|
"types": "./dist/hono.d.ts",
|
|
26
27
|
"import": "./dist/hono.js"
|
|
28
|
+
},
|
|
29
|
+
"./node": {
|
|
30
|
+
"types": "./dist/node.d.ts",
|
|
31
|
+
"import": "./dist/node.js"
|
|
27
32
|
}
|
|
28
33
|
},
|
|
29
34
|
"files": [
|
|
@@ -36,8 +41,8 @@
|
|
|
36
41
|
},
|
|
37
42
|
"dependencies": {
|
|
38
43
|
"croner": "^10.0.1",
|
|
39
|
-
"@intentface/latch-core": "^0.
|
|
40
|
-
"@intentface/latch-mcp": "^0.
|
|
44
|
+
"@intentface/latch-core": "^0.18.0",
|
|
45
|
+
"@intentface/latch-mcp": "^0.18.0"
|
|
41
46
|
},
|
|
42
47
|
"peerDependencies": {
|
|
43
48
|
"ai": ">=7.0.0",
|
|
@@ -52,7 +57,8 @@
|
|
|
52
57
|
"ai": "^7.0.106",
|
|
53
58
|
"hono": "^4.6.0",
|
|
54
59
|
"typescript": "^5.7.0",
|
|
55
|
-
"vitest": "^4"
|
|
60
|
+
"vitest": "^4",
|
|
61
|
+
"@types/node": "^22"
|
|
56
62
|
},
|
|
57
63
|
"repository": {
|
|
58
64
|
"type": "git",
|
|
@@ -60,7 +66,7 @@
|
|
|
60
66
|
"directory": "packages/server"
|
|
61
67
|
},
|
|
62
68
|
"scripts": {
|
|
63
|
-
"build": "tsc -p tsconfig.json",
|
|
69
|
+
"build": "tsc -p tsconfig.build.json",
|
|
64
70
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
65
71
|
"test": "vitest run"
|
|
66
72
|
}
|
package/dist/handler.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler.test.d.ts","sourceRoot":"","sources":["../src/handler.test.ts"],"names":[],"mappings":""}
|
package/dist/handler.test.js
DELETED
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { createLatchHandler } from "./handler.js";
|
|
3
|
-
/** Mirror of oauth.ts's payload half: `<csrf>.<b64url(JSON)>`. */
|
|
4
|
-
function encodeState(payload) {
|
|
5
|
-
const s = JSON.stringify(payload);
|
|
6
|
-
let bin = "";
|
|
7
|
-
for (const ch of new TextEncoder().encode(s))
|
|
8
|
-
bin += String.fromCharCode(ch);
|
|
9
|
-
const b64 = btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
10
|
-
return `deadbeef.${b64}`;
|
|
11
|
-
}
|
|
12
|
-
function build(opts) {
|
|
13
|
-
const start = vi.fn(async (_p, _o) => ({
|
|
14
|
-
status: "redirect",
|
|
15
|
-
authorizationUrl: "https://idp.example/authorize",
|
|
16
|
-
}));
|
|
17
|
-
const finish = vi.fn(async (_p, _params) => ({
|
|
18
|
-
status: "authorized",
|
|
19
|
-
}));
|
|
20
|
-
const oauth = { isAuthorized: async () => false, start, finish, provider: () => ({}) };
|
|
21
|
-
const conns = {
|
|
22
|
-
oauth: (name) => (name === "loredex" ? oauth : undefined),
|
|
23
|
-
status: async () => [],
|
|
24
|
-
testTools: async () => [],
|
|
25
|
-
};
|
|
26
|
-
const resolveContext = vi.fn(opts?.resolveContext ?? (() => ({ orgId: "org_a", userId: "u1" })));
|
|
27
|
-
const handler = createLatchHandler({
|
|
28
|
-
runtime: {},
|
|
29
|
-
connections: conns,
|
|
30
|
-
basePath: "/api/latch",
|
|
31
|
-
resolveContext,
|
|
32
|
-
reconstructPrincipal: opts?.reconstructPrincipal,
|
|
33
|
-
oauthFlowMaxAgeMs: opts?.oauthFlowMaxAgeMs,
|
|
34
|
-
});
|
|
35
|
-
return { handler, start, finish, resolveContext };
|
|
36
|
-
}
|
|
37
|
-
const authorize = (q = "") => new Request(`https://app.example/api/latch/connections/loredex/authorize${q}`);
|
|
38
|
-
const callback = (state, code = "abc") => new Request(`https://app.example/api/latch/connections/loredex/callback?code=${code}&state=${encodeURIComponent(state)}`);
|
|
39
|
-
describe("authorize", () => {
|
|
40
|
-
it("pins the resolved principal (+ iat) into the flow state", async () => {
|
|
41
|
-
const { handler, start } = build();
|
|
42
|
-
const res = await handler(authorize("?returnTo=/chat/c1"));
|
|
43
|
-
expect(res?.status).toBe(302);
|
|
44
|
-
const state = start.mock.calls[0][1]?.state;
|
|
45
|
-
expect(state.returnTo).toBe("/chat/c1");
|
|
46
|
-
const pin = state.__latch;
|
|
47
|
-
expect(pin.p).toEqual({ orgId: "org_a", userId: "u1" });
|
|
48
|
-
expect(typeof pin.iat).toBe("number");
|
|
49
|
-
expect(Math.abs(Date.now() - pin.iat)).toBeLessThan(5_000);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe("callback with a pinned principal", () => {
|
|
53
|
-
const pinnedState = (iat = Date.now()) => encodeState({
|
|
54
|
-
returnTo: "/chat/c1",
|
|
55
|
-
__latch: { p: { orgId: "org_pinned", userId: "u_pinned" }, iat },
|
|
56
|
-
});
|
|
57
|
-
it("rebuilds identity from the pin — the session is never consulted", async () => {
|
|
58
|
-
const { handler, finish, resolveContext } = build({
|
|
59
|
-
// A live session would resolve to a DIFFERENT principal (the incident
|
|
60
|
-
// shape: personal tenant). It must not be asked at all.
|
|
61
|
-
resolveContext: () => {
|
|
62
|
-
throw new Error("resolveContext must not run on a pinned callback");
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
const res = await handler(callback(pinnedState()));
|
|
66
|
-
expect(res?.status).toBe(302);
|
|
67
|
-
expect(res?.headers.get("location")).toContain("connected=loredex");
|
|
68
|
-
expect(resolveContext).not.toHaveBeenCalled();
|
|
69
|
-
// finish — and therefore the token write — ran under the PINNED principal.
|
|
70
|
-
expect(finish.mock.calls[0][0]).toEqual({ orgId: "org_pinned", userId: "u_pinned" });
|
|
71
|
-
});
|
|
72
|
-
it("routes the pin through reconstructPrincipal and 401s on null", async () => {
|
|
73
|
-
const seen = [];
|
|
74
|
-
const { handler, finish } = build({
|
|
75
|
-
reconstructPrincipal: (identity) => {
|
|
76
|
-
seen.push(identity);
|
|
77
|
-
return null; // e.g. the user is no longer an org member
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
const res = await handler(callback(pinnedState()));
|
|
81
|
-
expect(res?.status).toBe(401);
|
|
82
|
-
expect(seen).toEqual([{ orgId: "org_pinned", userId: "u_pinned" }]);
|
|
83
|
-
expect(finish).not.toHaveBeenCalled();
|
|
84
|
-
});
|
|
85
|
-
it("rejects a stale pin with ?error=flow_expired", async () => {
|
|
86
|
-
const { handler, finish } = build({ oauthFlowMaxAgeMs: 60_000 });
|
|
87
|
-
const res = await handler(callback(pinnedState(Date.now() - 120_000)));
|
|
88
|
-
expect(res?.status).toBe(302);
|
|
89
|
-
const loc = res?.headers.get("location") ?? "";
|
|
90
|
-
expect(loc).toContain("error=flow_expired");
|
|
91
|
-
expect(loc.startsWith("/chat/c1")).toBe(true);
|
|
92
|
-
expect(finish).not.toHaveBeenCalled();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe("callback without a pin", () => {
|
|
96
|
-
it.each([
|
|
97
|
-
["no state param", "https://app.example/api/latch/connections/loredex/callback?code=abc"],
|
|
98
|
-
["malformed state", "https://app.example/api/latch/connections/loredex/callback?code=abc&state=not-a-state"],
|
|
99
|
-
])("%s is rejected as expired and never reaches the session", async (_label, href) => {
|
|
100
|
-
const { handler, finish, resolveContext } = build({
|
|
101
|
-
resolveContext: () => {
|
|
102
|
-
throw new Error("resolveContext must not run on any callback");
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
const res = await handler(new Request(href));
|
|
106
|
-
expect(res?.status).toBe(302);
|
|
107
|
-
const loc = res?.headers.get("location") ?? "";
|
|
108
|
-
expect(loc.startsWith("/")).toBe(true);
|
|
109
|
-
expect(loc).toContain("error=flow_expired");
|
|
110
|
-
expect(resolveContext).not.toHaveBeenCalled();
|
|
111
|
-
expect(finish).not.toHaveBeenCalled();
|
|
112
|
-
});
|
|
113
|
-
it("is rejected as expired — the session is never a stand-in for a flow", async () => {
|
|
114
|
-
const { handler, finish, resolveContext } = build({
|
|
115
|
-
resolveContext: () => {
|
|
116
|
-
throw new Error("resolveContext must not run on any callback");
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
const res = await handler(callback(encodeState({ returnTo: "/x" })));
|
|
120
|
-
expect(res?.status).toBe(302);
|
|
121
|
-
const loc = res?.headers.get("location") ?? "";
|
|
122
|
-
expect(loc.startsWith("/x")).toBe(true);
|
|
123
|
-
expect(loc).toContain("error=flow_expired");
|
|
124
|
-
expect(resolveContext).not.toHaveBeenCalled();
|
|
125
|
-
expect(finish).not.toHaveBeenCalled();
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
function buildRoutes(opts) {
|
|
129
|
-
const schedule = vi.fn(async (input) => ({
|
|
130
|
-
id: "sch_1",
|
|
131
|
-
...input,
|
|
132
|
-
}));
|
|
133
|
-
const runScheduleNow = vi.fn(async (_i) => opts?.runNow ?? true);
|
|
134
|
-
const unschedule = vi.fn(async (_i) => { });
|
|
135
|
-
const listSchedules = vi.fn(async () => opts?.schedules ?? []);
|
|
136
|
-
const listRuns = vi.fn(async () => [
|
|
137
|
-
{
|
|
138
|
-
id: "run_1",
|
|
139
|
-
chatId: "chat_1",
|
|
140
|
-
agent: "briefer",
|
|
141
|
-
status: "awaiting_input",
|
|
142
|
-
identity: { orgId: "org_a", userId: "u1", plan: "enterprise" },
|
|
143
|
-
costTotal: 0.19,
|
|
144
|
-
startedAt: 1,
|
|
145
|
-
},
|
|
146
|
-
]);
|
|
147
|
-
const handler = createLatchHandler({
|
|
148
|
-
runtime: { schedule, runScheduleNow, unschedule, listSchedules, listRuns },
|
|
149
|
-
connections: { oauth: () => undefined, status: async () => [], testTools: async () => [] },
|
|
150
|
-
basePath: "/api/latch",
|
|
151
|
-
resolveContext: () => ({ orgId: "org_a", userId: "u1" }),
|
|
152
|
-
});
|
|
153
|
-
return { handler, schedule, runScheduleNow, unschedule, listSchedules };
|
|
154
|
-
}
|
|
155
|
-
const post = (path, body) => new Request(`https://app.example/api/latch/${path}`, {
|
|
156
|
-
method: "POST",
|
|
157
|
-
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
158
|
-
});
|
|
159
|
-
const get = (path) => new Request(`https://app.example/api/latch/${path}`);
|
|
160
|
-
describe("POST /schedules", () => {
|
|
161
|
-
it("forwards delivery and onParked to runtime.schedule", async () => {
|
|
162
|
-
const { handler, schedule } = buildRoutes();
|
|
163
|
-
const res = await handler(post("schedules", {
|
|
164
|
-
agent: "briefer",
|
|
165
|
-
cron: "0 8 * * *",
|
|
166
|
-
timezone: "Europe/Helsinki",
|
|
167
|
-
prompt: "morning brief",
|
|
168
|
-
delivery: { kind: "slack", appId: "A1", channel: "C1" },
|
|
169
|
-
onParked: "fire",
|
|
170
|
-
}));
|
|
171
|
-
expect(res?.status).toBe(200);
|
|
172
|
-
const passed = schedule.mock.calls[0][0];
|
|
173
|
-
expect(passed.delivery).toEqual({ kind: "slack", appId: "A1", channel: "C1" });
|
|
174
|
-
expect(passed.onParked).toBe("fire");
|
|
175
|
-
expect(passed.timezone).toBe("Europe/Helsinki");
|
|
176
|
-
// Echoed back, so a caller can see what actually stuck.
|
|
177
|
-
expect((await res.json()).schedule.delivery).toEqual({
|
|
178
|
-
kind: "slack",
|
|
179
|
-
appId: "A1",
|
|
180
|
-
channel: "C1",
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
it("omits both when unset — no invented defaults", async () => {
|
|
184
|
-
const { handler, schedule } = buildRoutes();
|
|
185
|
-
await handler(post("schedules", { agent: "briefer", cron: null, prompt: "brief" }));
|
|
186
|
-
const passed = schedule.mock.calls[0][0];
|
|
187
|
-
expect(passed.delivery).toBeUndefined();
|
|
188
|
-
expect(passed.onParked).toBeUndefined();
|
|
189
|
-
});
|
|
190
|
-
it("400s an unknown onParked instead of silently defaulting it", async () => {
|
|
191
|
-
const { handler, schedule } = buildRoutes();
|
|
192
|
-
const res = await handler(post("schedules", { agent: "briefer", cron: null, prompt: "b", onParked: "skipp" }));
|
|
193
|
-
expect(res?.status).toBe(400);
|
|
194
|
-
expect(schedule).not.toHaveBeenCalled();
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
describe("GET /schedules/:id and POST /schedules/:id/run-now", () => {
|
|
198
|
-
it("returns one of the caller's schedules", async () => {
|
|
199
|
-
const { handler } = buildRoutes({
|
|
200
|
-
schedules: [{ id: "sch_1", agent: "briefer", prompt: "a" }],
|
|
201
|
-
});
|
|
202
|
-
const res = await handler(get("schedules/sch_1"));
|
|
203
|
-
expect(res?.status).toBe(200);
|
|
204
|
-
expect((await res.json()).schedule.id).toBe("sch_1");
|
|
205
|
-
});
|
|
206
|
-
it("404s an id that isn't in the caller's own list (another tenant's included)", async () => {
|
|
207
|
-
const { handler } = buildRoutes({ schedules: [] });
|
|
208
|
-
expect((await handler(get("schedules/sch_other")))?.status).toBe(404);
|
|
209
|
-
});
|
|
210
|
-
it("arms run-now through the runtime, and 404s a spent one-shot", async () => {
|
|
211
|
-
const { handler, runScheduleNow } = buildRoutes();
|
|
212
|
-
expect((await handler(post("schedules/sch_1/run-now")))?.status).toBe(200);
|
|
213
|
-
expect(runScheduleNow.mock.calls[0][0]).toEqual({
|
|
214
|
-
principal: { orgId: "org_a", userId: "u1" },
|
|
215
|
-
id: "sch_1",
|
|
216
|
-
});
|
|
217
|
-
const spent = buildRoutes({ runNow: false });
|
|
218
|
-
expect((await spent.handler(post("schedules/sch_1/run-now")))?.status).toBe(404);
|
|
219
|
-
});
|
|
220
|
-
it("still deletes on DELETE /schedules/:id", async () => {
|
|
221
|
-
const { handler, unschedule } = buildRoutes();
|
|
222
|
-
const res = await handler(new Request("https://app.example/api/latch/schedules/sch_1", { method: "DELETE" }));
|
|
223
|
-
expect(res?.status).toBe(200);
|
|
224
|
-
expect(unschedule).toHaveBeenCalled();
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
describe("GET /runs", () => {
|
|
228
|
-
it("strips the identity blob — the principal is server state, not a payload", async () => {
|
|
229
|
-
const { handler } = buildRoutes();
|
|
230
|
-
const res = await handler(get("runs"));
|
|
231
|
-
const { runs } = (await res.json());
|
|
232
|
-
expect(runs).toHaveLength(1);
|
|
233
|
-
expect("identity" in runs[0]).toBe(false);
|
|
234
|
-
// Everything a cost/usage UI actually needs still comes through.
|
|
235
|
-
expect(runs[0]).toMatchObject({ id: "run_1", chatId: "chat_1", costTotal: 0.19 });
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe("POST /agents/:agent/:id with a message the runtime refuses", () => {
|
|
239
|
-
it("answers 400 invalid_message instead of a 500", async () => {
|
|
240
|
-
const { InvalidMessageError } = await import("@intentface/latch-core");
|
|
241
|
-
const handleChat = vi.fn(async () => {
|
|
242
|
-
throw new InvalidMessageError('a chat message must be a user message, not "assistant"');
|
|
243
|
-
});
|
|
244
|
-
const handler = createLatchHandler({
|
|
245
|
-
runtime: { handleChat },
|
|
246
|
-
connections: { oauth: () => undefined, status: async () => [], testTools: async () => [] },
|
|
247
|
-
basePath: "/api/latch",
|
|
248
|
-
resolveContext: () => ({ orgId: "org_a", userId: "u1" }),
|
|
249
|
-
});
|
|
250
|
-
const res = (await handler(post("agents/assistant/chat_1", { message: { id: "m1", role: "assistant", parts: [{ type: "text", text: "x" }] } })));
|
|
251
|
-
expect(res.status).toBe(400);
|
|
252
|
-
expect(await res.json()).toMatchObject({ code: "invalid_message" });
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
describe("POST /agents/:agent/:id with useChat's default body ({ messages })", () => {
|
|
256
|
-
function route() {
|
|
257
|
-
const handleChat = vi.fn(async (_input) => new Response("ok"));
|
|
258
|
-
const handler = createLatchHandler({
|
|
259
|
-
runtime: { handleChat },
|
|
260
|
-
connections: { oauth: () => undefined, status: async () => [], testTools: async () => [] },
|
|
261
|
-
basePath: "/api/latch",
|
|
262
|
-
resolveContext: () => ({ orgId: "org_a", userId: "u1" }),
|
|
263
|
-
});
|
|
264
|
-
return { handler, handleChat };
|
|
265
|
-
}
|
|
266
|
-
it("passes the newest message on with its id and attachments", async () => {
|
|
267
|
-
const { handler, handleChat } = route();
|
|
268
|
-
const newest = {
|
|
269
|
-
id: "m2",
|
|
270
|
-
role: "user",
|
|
271
|
-
parts: [
|
|
272
|
-
{ type: "file", mediaType: "image/png", url: "data:image/png;base64,AAAA" },
|
|
273
|
-
{ type: "text", text: "what is this?" },
|
|
274
|
-
],
|
|
275
|
-
};
|
|
276
|
-
await handler(post("agents/assistant/chat_1", { id: "chat_1", trigger: "submit-message", messages: [{ id: "m1", role: "user", parts: [{ type: "text", text: "earlier" }] }, newest] }));
|
|
277
|
-
expect(handleChat.mock.calls[0][0].message).toEqual(newest);
|
|
278
|
-
});
|
|
279
|
-
it("passes useChat's approval answers on unchanged, for the runtime to read", async () => {
|
|
280
|
-
const { handler, handleChat } = route();
|
|
281
|
-
const answers = { id: "a1", role: "assistant", parts: [{ type: "tool-refund", toolCallId: "t1", state: "approval-responded", input: {}, approval: { id: "ap1", approved: true } }] };
|
|
282
|
-
await handler(post("agents/assistant/chat_1", { messages: [answers] }));
|
|
283
|
-
expect(handleChat.mock.calls[0][0].message).toEqual(answers);
|
|
284
|
-
});
|
|
285
|
-
it("still builds a message from { text }", async () => {
|
|
286
|
-
const { handler, handleChat } = route();
|
|
287
|
-
await handler(post("agents/assistant/chat_1", { text: "hello" }));
|
|
288
|
-
expect(handleChat.mock.calls[0][0].message).toMatchObject({ role: "user", parts: [{ type: "text", text: "hello" }] });
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
describe("POST /agents/:agent/:id regenerating or editing an earlier question", () => {
|
|
292
|
-
it("answers 409 rewind_not_supported", async () => {
|
|
293
|
-
const { RewindNotSupportedError } = await import("@intentface/latch-core");
|
|
294
|
-
const handleChat = vi.fn(async () => {
|
|
295
|
-
throw new RewindNotSupportedError("m1");
|
|
296
|
-
});
|
|
297
|
-
const handler = createLatchHandler({
|
|
298
|
-
runtime: { handleChat },
|
|
299
|
-
connections: { oauth: () => undefined, status: async () => [], testTools: async () => [] },
|
|
300
|
-
basePath: "/api/latch",
|
|
301
|
-
resolveContext: () => ({ orgId: "org_a", userId: "u1" }),
|
|
302
|
-
});
|
|
303
|
-
const res = (await handler(post("agents/assistant/chat_1", { message: { id: "m1", role: "user", parts: [{ type: "text", text: "x" }] } })));
|
|
304
|
-
expect(res.status).toBe(409);
|
|
305
|
-
expect(await res.json()).toMatchObject({ code: "rewind_not_supported" });
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
describe("POST /agents/:agent/:id with params", () => {
|
|
309
|
-
function route(impl) {
|
|
310
|
-
const handleChat = vi.fn(impl);
|
|
311
|
-
const handler = createLatchHandler({
|
|
312
|
-
runtime: { handleChat },
|
|
313
|
-
connections: { oauth: () => undefined, status: async () => [], testTools: async () => [] },
|
|
314
|
-
basePath: "/api/latch",
|
|
315
|
-
resolveContext: () => ({ orgId: "org_a", userId: "u1" }),
|
|
316
|
-
});
|
|
317
|
-
return { handler, handleChat };
|
|
318
|
-
}
|
|
319
|
-
const message = { id: "m1", role: "user", parts: [{ type: "text", text: "x" }] };
|
|
320
|
-
it("passes body.params to the runtime, and nothing when absent", async () => {
|
|
321
|
-
const { handler, handleChat } = route(async () => new Response("ok"));
|
|
322
|
-
await handler(post("agents/support/chat_1", { message, params: { ticketId: "T-9" } }));
|
|
323
|
-
await handler(post("agents/support/chat_1", { message }));
|
|
324
|
-
expect(handleChat.mock.calls[0][0].params).toEqual({ ticketId: "T-9" });
|
|
325
|
-
expect("params" in handleChat.mock.calls[1][0]).toBe(false);
|
|
326
|
-
});
|
|
327
|
-
it("answers 400 invalid_params and 409 params_fixed", async () => {
|
|
328
|
-
const { InvalidParamsError, ParamsFixedError } = await import("@intentface/latch-core");
|
|
329
|
-
const invalid = route(async () => {
|
|
330
|
-
throw new InvalidParamsError('params for "support" don\'t match its schema');
|
|
331
|
-
});
|
|
332
|
-
const bad = (await invalid.handler(post("agents/support/chat_1", { message, params: {} })));
|
|
333
|
-
expect(bad.status).toBe(400);
|
|
334
|
-
expect(await bad.json()).toMatchObject({ code: "invalid_params" });
|
|
335
|
-
const fixed = route(async () => {
|
|
336
|
-
throw new ParamsFixedError("chat_1");
|
|
337
|
-
});
|
|
338
|
-
const changed = (await fixed.handler(post("agents/support/chat_1", { message, params: { ticketId: "T-10" } })));
|
|
339
|
-
expect(changed.status).toBe(409);
|
|
340
|
-
expect(await changed.json()).toMatchObject({ code: "params_fixed" });
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
//# sourceMappingURL=handler.test.js.map
|
package/dist/handler.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../src/handler.test.ts"],"names":[],"mappings":"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"}
|