@parlor/server 0.0.0-stage → 0.1.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -2
  3. package/dist/access.d.ts +27 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +41 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/actions.d.ts +35 -0
  8. package/dist/actions.d.ts.map +1 -0
  9. package/dist/actions.js +159 -0
  10. package/dist/actions.js.map +1 -0
  11. package/dist/auth.d.ts +97 -0
  12. package/dist/auth.d.ts.map +1 -0
  13. package/dist/auth.js +11 -0
  14. package/dist/auth.js.map +1 -0
  15. package/dist/body.d.ts +7 -0
  16. package/dist/body.d.ts.map +1 -0
  17. package/dist/body.js +29 -0
  18. package/dist/body.js.map +1 -0
  19. package/dist/caller.d.ts +21 -0
  20. package/dist/caller.d.ts.map +1 -0
  21. package/dist/caller.js +46 -0
  22. package/dist/caller.js.map +1 -0
  23. package/dist/cors.d.ts +9 -0
  24. package/dist/cors.d.ts.map +1 -0
  25. package/dist/cors.js +25 -0
  26. package/dist/cors.js.map +1 -0
  27. package/dist/create-server.d.ts +39 -0
  28. package/dist/create-server.d.ts.map +1 -0
  29. package/dist/create-server.js +315 -0
  30. package/dist/create-server.js.map +1 -0
  31. package/dist/dev-auth.d.ts +17 -0
  32. package/dist/dev-auth.d.ts.map +1 -0
  33. package/dist/dev-auth.js +146 -0
  34. package/dist/dev-auth.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +14 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mcp-calls.d.ts +7 -0
  40. package/dist/mcp-calls.d.ts.map +1 -0
  41. package/dist/mcp-calls.js +30 -0
  42. package/dist/mcp-calls.js.map +1 -0
  43. package/dist/mcp.d.ts +29 -0
  44. package/dist/mcp.d.ts.map +1 -0
  45. package/dist/mcp.js +198 -0
  46. package/dist/mcp.js.map +1 -0
  47. package/dist/migrations.d.ts +10 -0
  48. package/dist/migrations.d.ts.map +1 -0
  49. package/dist/migrations.js +81 -0
  50. package/dist/migrations.js.map +1 -0
  51. package/dist/plugin.d.ts +92 -0
  52. package/dist/plugin.d.ts.map +1 -0
  53. package/dist/plugin.js +5 -0
  54. package/dist/plugin.js.map +1 -0
  55. package/dist/protocol.d.ts +18 -0
  56. package/dist/protocol.d.ts.map +1 -0
  57. package/dist/protocol.js +7 -0
  58. package/dist/protocol.js.map +1 -0
  59. package/dist/revocation-horizon.d.ts +6 -0
  60. package/dist/revocation-horizon.d.ts.map +1 -0
  61. package/dist/revocation-horizon.js +6 -0
  62. package/dist/revocation-horizon.js.map +1 -0
  63. package/dist/scope.d.ts +6 -0
  64. package/dist/scope.d.ts.map +1 -0
  65. package/dist/scope.js +4 -0
  66. package/dist/scope.js.map +1 -0
  67. package/package.json +41 -3
@@ -0,0 +1,39 @@
1
+ import { type AgentUiOptions, type UiManifestSource } from "@parlor/agent-ui/server";
2
+ import { type ActionMap, type DataProvider } from "@parlor/core";
3
+ import type { ActionRegistry } from "@parlor/core/registry";
4
+ import { type SyncTransport } from "@parlor/sync/server";
5
+ import { type AuthProvider } from "./auth.js";
6
+ import { type CorsConfig } from "./cors.js";
7
+ import type { ServerPlugin } from "./plugin.js";
8
+ import { type ScopeResolver } from "./scope.js";
9
+ export interface SyncOptions {
10
+ readonly transport?: SyncTransport | undefined;
11
+ readonly pollIntervalMs?: number | undefined;
12
+ }
13
+ export interface ServerOptions<T extends ActionMap> {
14
+ readonly actions: ActionRegistry<T>;
15
+ readonly scope?: ScopeResolver | undefined;
16
+ /**
17
+ * Without it every caller is anonymous, the action source is the `x-parlor-source`
18
+ * header, and confirmations are a UX guard.
19
+ */
20
+ readonly auth?: AuthProvider | undefined;
21
+ /** Framework features with their own tables and routes, installed after `auth`. */
22
+ readonly plugins?: readonly ServerPlugin[] | undefined;
23
+ readonly basePath?: string | undefined;
24
+ readonly cors?: CorsConfig | false | undefined;
25
+ readonly database?: DataProvider | undefined;
26
+ readonly mcp?: {
27
+ readonly name?: string | undefined;
28
+ readonly version?: string | undefined;
29
+ } | false | undefined;
30
+ readonly sync?: SyncOptions | false | undefined;
31
+ readonly agentUi?: AgentUiOptions | false | undefined;
32
+ }
33
+ export interface FrameworkServer {
34
+ readonly installUiManifest?: ((source: UiManifestSource) => void) | undefined;
35
+ readonly fetch: (request: Request) => Promise<Response>;
36
+ readonly close: () => Promise<void>;
37
+ }
38
+ export declare function createServer<T extends ActionMap>(options: ServerOptions<T>): FrameworkServer;
39
+ //# sourceMappingURL=create-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAQ3D,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,WAAW,CAAC;AAI5D,OAAO,KAAK,EAKV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS;IAChD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACzC,mFAAmF;IACnF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EACT;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAC7E,KAAK,GACL,SAAS,CAAC;IACd,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,KAAK,GAAG,SAAS,CAAC;CACvD;AAKD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9E,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AA2FD,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAC9C,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,eAAe,CAuPjB"}
@@ -0,0 +1,315 @@
1
+ import { createAgentUi, registerAgentUiRoutes, } from "@parlor/agent-ui/server";
2
+ import { ActionError, } from "@parlor/core";
3
+ import { ensureSyncTables, recordSyncEvent, registerSyncRoutes, SyncHub, } from "@parlor/sync/server";
4
+ import { H3, readBody } from "h3";
5
+ import { admits, requireAccess, requireSurface } from "./access.js";
6
+ import { createActionRunner } from "./actions.js";
7
+ import { AuthFailure } from "./auth.js";
8
+ import { clientOf, createCallerResolver, sourceOf, } from "./caller.js";
9
+ import { corsMiddleware } from "./cors.js";
10
+ import { devAuth } from "./dev-auth.js";
11
+ import { createMcpHandler } from "./mcp.js";
12
+ import { applyMigrations, checkMigrations } from "./migrations.js";
13
+ import { DEFAULT_BASE_PATH, PROTOCOL_VERSION } from "./protocol.js";
14
+ import { defaultScope } from "./scope.js";
15
+ const STATUS_BY_CODE = {
16
+ not_found: 404,
17
+ invalid_input: 400,
18
+ declined: 403,
19
+ confirmation_timeout: 504,
20
+ confirmation_unavailable: 503,
21
+ unauthenticated: 401,
22
+ forbidden: 403,
23
+ internal: 500,
24
+ };
25
+ const isAbort = (error) => error instanceof Error && error.name === "AbortError";
26
+ function toActionError(error) {
27
+ if (error instanceof ActionError)
28
+ return error;
29
+ if (error instanceof AuthFailure)
30
+ return new ActionError("unauthenticated", error.message);
31
+ if (!isAbort(error))
32
+ console.error("[parlor] action failed:", error);
33
+ return new ActionError("internal", "Internal error", { cause: error });
34
+ }
35
+ function errorBody(event, error) {
36
+ const actionError = toActionError(error);
37
+ event.res.status = STATUS_BY_CODE[actionError.code];
38
+ return actionError.toBody();
39
+ }
40
+ function errorResponse(error) {
41
+ const actionError = toActionError(error);
42
+ return Response.json(actionError.toBody(), {
43
+ status: STATUS_BY_CODE[actionError.code],
44
+ });
45
+ }
46
+ const PLUGIN_NAME = /^[a-z][a-z0-9-]*$/;
47
+ const RESERVED_NAMES = new Set([
48
+ "actions",
49
+ "manifest",
50
+ "mcp",
51
+ "sync",
52
+ "ui",
53
+ ]);
54
+ function checkPlugins(plugins, database) {
55
+ const names = new Set();
56
+ for (const plugin of plugins) {
57
+ if (!PLUGIN_NAME.test(plugin.name) || RESERVED_NAMES.has(plugin.name)) {
58
+ throw new Error(`"${plugin.name}" cannot name a plugin.`);
59
+ }
60
+ if (names.has(plugin.name))
61
+ throw new Error(`Two plugins are named "${plugin.name}".`);
62
+ names.add(plugin.name);
63
+ checkMigrations(plugin);
64
+ if (plugin.migrations?.length && !database) {
65
+ throw new Error(`The "${plugin.name}" plugin needs a database.`);
66
+ }
67
+ }
68
+ }
69
+ function auditAll(runtimes) {
70
+ const hooks = runtimes.filter((runtime) => runtime.audit);
71
+ if (hooks.length === 0)
72
+ return undefined;
73
+ return (record) => {
74
+ for (const runtime of hooks)
75
+ runtime.audit?.(record);
76
+ };
77
+ }
78
+ function guard(callers, surface) {
79
+ return async (request) => requireSurface(await callers(request), surface, callers.enforcing);
80
+ }
81
+ function refuseUnless(callers, surface) {
82
+ const check = guard(callers, surface);
83
+ return async (event) => {
84
+ try {
85
+ await check(event.req);
86
+ return undefined;
87
+ }
88
+ catch (error) {
89
+ return errorResponse(error);
90
+ }
91
+ };
92
+ }
93
+ export function createServer(options) {
94
+ const { actions, scope = defaultScope, plugins = [], basePath = DEFAULT_BASE_PATH, cors = {}, database, mcp = {}, sync = {}, agentUi: agentUiOptions = {}, } = options;
95
+ const auth = options.auth ?? (process.env.PARLOR_DEV === "1" ? devAuth() : undefined);
96
+ const app = new H3();
97
+ const appName = process.env.PARLOR_APP_NAME || undefined;
98
+ const syncOptions = sync === false ? undefined : sync;
99
+ const syncEnabled = syncOptions !== undefined && database !== undefined;
100
+ const installed = [...(auth ? [auth] : []), ...plugins];
101
+ checkPlugins(installed, database);
102
+ let prepared;
103
+ const ready = () => (prepared ??= (async () => {
104
+ if (!database)
105
+ return;
106
+ if (syncEnabled)
107
+ await ensureSyncTables(database.read());
108
+ await applyMigrations(database, installed);
109
+ })());
110
+ const callers = createCallerResolver(auth, scope, ready);
111
+ const host = {
112
+ basePath,
113
+ database,
114
+ ...(auth ? { auth } : {}),
115
+ authMisconfigured: "auth" in options && auth === undefined,
116
+ callerOf: callers,
117
+ ready,
118
+ announce: async (target, tags, within) => {
119
+ if (!syncEnabled || !database || tags.length === 0)
120
+ return;
121
+ if (within !== undefined) {
122
+ await recordSyncEvent(within, { scope: target, tags });
123
+ return;
124
+ }
125
+ await ready();
126
+ await database.transaction((tx) => recordSyncEvent(tx, { scope: target, tags }));
127
+ },
128
+ };
129
+ const runtimes = installed.map((plugin) => ({ plugin, runtime: plugin.setup(host) }));
130
+ const audit = auditAll(runtimes.map(({ runtime }) => runtime));
131
+ const agentUi = agentUiOptions === false
132
+ ? undefined
133
+ : createAgentUi({
134
+ ...agentUiOptions,
135
+ audience: async (request) => (await callers(request)).audience,
136
+ });
137
+ const runnerFor = (registry) => createActionRunner({
138
+ actions: registry,
139
+ scope,
140
+ callers,
141
+ database,
142
+ sync: syncEnabled,
143
+ onClient: agentUi?.touch,
144
+ confirm: agentUi?.confirm,
145
+ audit,
146
+ ready,
147
+ });
148
+ const runner = runnerFor(actions);
149
+ const hub = database ? new SyncHub(database) : undefined;
150
+ const inflight = new Set();
151
+ let closing;
152
+ if (cors !== false)
153
+ app.use(corsMiddleware(cors));
154
+ app.get(`${basePath}/manifest`, async (event) => {
155
+ let caller;
156
+ try {
157
+ caller = await callers(event.req);
158
+ }
159
+ catch (error) {
160
+ return errorResponse(error);
161
+ }
162
+ const summary = {
163
+ protocol: PROTOCOL_VERSION,
164
+ ...(appName ? { app: { name: appName } } : {}),
165
+ };
166
+ if (!admits("manifest", caller, callers.enforcing))
167
+ return summary;
168
+ const ui = agentUi?.manifest();
169
+ return { ...summary, actions: actions.describe(), ...(ui ? { ui } : {}) };
170
+ });
171
+ app.post(`${basePath}/actions/:name`, async (event) => {
172
+ const name = event.context.params?.name ?? "";
173
+ try {
174
+ const input = await readBody(event).catch(() => {
175
+ throw new ActionError("invalid_input", "Request body must be JSON");
176
+ });
177
+ const result = await runner.run(name, input, event.req, sourceOf(event.req), {
178
+ surface: "actions",
179
+ });
180
+ return { data: result.data, tags: result.reads };
181
+ }
182
+ catch (error) {
183
+ return errorBody(event, error);
184
+ }
185
+ });
186
+ const handleRoute = async (route, request) => {
187
+ if (route.access === "public")
188
+ return route.handle(request);
189
+ const caller = requireAccess(await callers(request), route.access, callers.enforcing);
190
+ return route.handle(request, caller);
191
+ };
192
+ for (const { plugin, runtime } of runtimes) {
193
+ const root = `${basePath}/${plugin.name}`;
194
+ if (runtime.actions) {
195
+ const pluginRunner = runnerFor(runtime.actions);
196
+ app.post(`${root}/actions/:name`, async (event) => {
197
+ const name = event.context.params?.name ?? "";
198
+ try {
199
+ const input = await readBody(event).catch(() => {
200
+ throw new ActionError("invalid_input", "Request body must be JSON");
201
+ });
202
+ const result = await pluginRunner.run(name, input, event.req, sourceOf(event.req), { surface: "pluginActions" });
203
+ return { data: result.data, tags: result.reads };
204
+ }
205
+ catch (error) {
206
+ return errorBody(event, error);
207
+ }
208
+ });
209
+ }
210
+ for (const route of runtime.routes ?? []) {
211
+ const path = route.path.startsWith("/.well-known/")
212
+ ? route.path
213
+ : root + route.path;
214
+ app.on(route.method, path, async (event) => {
215
+ try {
216
+ await ready();
217
+ return await handleRoute(route, event.req);
218
+ }
219
+ catch (error) {
220
+ return errorResponse(error);
221
+ }
222
+ });
223
+ }
224
+ }
225
+ if (mcp !== false) {
226
+ const mcpApp = appName
227
+ ? {
228
+ name: appName,
229
+ ...(process.env.PARLOR_APP_DESCRIPTION
230
+ ? { description: process.env.PARLOR_APP_DESCRIPTION }
231
+ : {}),
232
+ }
233
+ : undefined;
234
+ const handler = createMcpHandler({
235
+ actions,
236
+ runner,
237
+ agentUi,
238
+ callers,
239
+ app: mcpApp,
240
+ ...mcp,
241
+ });
242
+ const guardMcp = guard(callers, "mcp");
243
+ app.all(`${basePath}/mcp`, async (event) => {
244
+ try {
245
+ await guardMcp(event.req);
246
+ }
247
+ catch (error) {
248
+ const refusal = toActionError(error);
249
+ const challenged = refusal.code === "unauthenticated" ||
250
+ (await callers(event.req).then(({ principal }) => principal.kind === "host", () => false));
251
+ return challenged && auth ? auth.challenge(event.req) : errorResponse(refusal);
252
+ }
253
+ return handler.fetch(event.req);
254
+ });
255
+ }
256
+ if (syncEnabled && database && hub) {
257
+ app.use(`${basePath}/sync/**`, refuseUnless(callers, "sync"));
258
+ app.use(`${basePath}/sync/**`, async () => {
259
+ await ready();
260
+ });
261
+ registerSyncRoutes(app, {
262
+ basePath,
263
+ data: database,
264
+ hub,
265
+ scope: async (request) => (await callers(request)).scope,
266
+ audience: async (request) => (await callers(request)).audience,
267
+ authority: async (request) => {
268
+ const caller = await callers(request);
269
+ const { principal } = caller;
270
+ return {
271
+ principal,
272
+ channels: admits("channels", caller, callers.enforcing),
273
+ ...(auth && principal.kind !== "anonymous"
274
+ ? { revoked: auth.revoked(principal) }
275
+ : {}),
276
+ };
277
+ },
278
+ transport: syncOptions?.transport,
279
+ pollIntervalMs: syncOptions?.pollIntervalMs,
280
+ channels: [
281
+ ...(agentUi ? [agentUi.channel] : []),
282
+ ...runtimes.flatMap(({ runtime }) => runtime.channel ? [runtime.channel] : []),
283
+ ],
284
+ clientId: clientOf,
285
+ });
286
+ }
287
+ if (agentUi) {
288
+ app.use(`${basePath}/ui`, refuseUnless(callers, "ui"));
289
+ registerAgentUiRoutes(app, {
290
+ basePath,
291
+ agentUi,
292
+ audience: async (request) => (await callers(request)).audience,
293
+ clientId: clientOf,
294
+ });
295
+ }
296
+ return {
297
+ ...(agentUi
298
+ ? { installUiManifest: (source) => agentUi.install(source) }
299
+ : {}),
300
+ fetch: (request) => {
301
+ const response = Promise.resolve(app.fetch(request));
302
+ const settled = () => void inflight.delete(response);
303
+ inflight.add(response);
304
+ response.then(settled, settled);
305
+ return response;
306
+ },
307
+ close: () => (closing ??= (async () => {
308
+ agentUi?.close();
309
+ await Promise.allSettled(runtimes.map(({ runtime }) => runtime.close?.()));
310
+ await Promise.all([hub?.stop(), Promise.allSettled([...inflight])]);
311
+ await database?.close?.();
312
+ })()),
313
+ };
314
+ }
315
+ //# sourceMappingURL=create-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { DEV_USER_ID } from "@parlor/core";
2
+ import { type AuthProvider } from "./auth.js";
3
+ export declare const DEV_AUTH_PLUGIN = "dev-auth";
4
+ export { DEV_USER_ID };
5
+ /** `POST /_parlor/dev-auth/host`: mints the dev host token for a loopback caller. */
6
+ export declare const DEV_HOST_PATH = "/host";
7
+ export interface DevAuthOptions {
8
+ readonly secret?: Uint8Array | undefined;
9
+ }
10
+ /**
11
+ * What `parlor dev` installs when the app has no auth provider. Not enforcing, so the
12
+ * browser and external MCP clients keep today's anonymous, header-declared behavior; it
13
+ * only adds the host and turn tokens the local inline agent needs. Both are signed with a
14
+ * per-process secret, so restarting the server revokes them all.
15
+ */
16
+ export declare function devAuth(options?: DevAuthOptions): AuthProvider;
17
+ //# sourceMappingURL=dev-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-auth.d.ts","sourceRoot":"","sources":["../src/dev-auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,WAAW,EAGZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAe,KAAK,YAAY,EAAuB,MAAM,WAAW,CAAC;AAEhF,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,qFAAqF;AACrF,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC1C;AA4CD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,YAAY,CAiHlE"}
@@ -0,0 +1,146 @@
1
+ import { createHmac, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { ANONYMOUS, asId, DEV_USER_ID, } from "@parlor/core";
3
+ import { AuthFailure } from "./auth.js";
4
+ export const DEV_AUTH_PLUGIN = "dev-auth";
5
+ export { DEV_USER_ID };
6
+ /** `POST /_parlor/dev-auth/host`: mints the dev host token for a loopback caller. */
7
+ export const DEV_HOST_PATH = "/host";
8
+ const HOST_TYP = "parlor-dev-host+jwt";
9
+ const TURN_TYP = "parlor-turn+jwt";
10
+ const HOST_AUDIENCE = "parlor:host";
11
+ const TURN_AUDIENCE = "parlor:mcp";
12
+ const DEV_GRANT = asId("grant", "dev");
13
+ const DEV_HOST = asId("host", "dev");
14
+ const encode = (value) => Buffer.from(JSON.stringify(value)).toString("base64url");
15
+ function decode(segment) {
16
+ if (!segment)
17
+ return undefined;
18
+ try {
19
+ const value = JSON.parse(Buffer.from(segment, "base64url").toString("utf8"));
20
+ return typeof value === "object" && value !== null ? value : undefined;
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ function isLoopback(ip) {
27
+ if (ip === undefined)
28
+ return false;
29
+ return ip === "::1" || ip.startsWith("127.") || ip.startsWith("::ffff:127.");
30
+ }
31
+ const refuse = (message) => Response.json({ error: { code: "forbidden", message } }, { status: 403 });
32
+ /**
33
+ * What `parlor dev` installs when the app has no auth provider. Not enforcing, so the
34
+ * browser and external MCP clients keep today's anonymous, header-declared behavior; it
35
+ * only adds the host and turn tokens the local inline agent needs. Both are signed with a
36
+ * per-process secret, so restarting the server revokes them all.
37
+ */
38
+ export function devAuth(options = {}) {
39
+ const secret = options.secret ?? randomBytes(32);
40
+ const mac = (input) => createHmac("sha256", secret).update(input).digest("base64url");
41
+ const sign = (typ, claims) => {
42
+ const input = `${encode({ alg: "HS256", typ })}.${encode(claims)}`;
43
+ return `${input}.${mac(input)}`;
44
+ };
45
+ const verify = (token, typ) => {
46
+ const [header, payload, signature, ...rest] = token.split(".");
47
+ if (rest.length > 0 || !header || !payload || !signature)
48
+ return undefined;
49
+ const expected = Buffer.from(mac(`${header}.${payload}`));
50
+ const given = Buffer.from(signature);
51
+ if (given.length !== expected.length || !timingSafeEqual(given, expected)) {
52
+ return undefined;
53
+ }
54
+ return decode(header)?.typ === typ ? decode(payload) : undefined;
55
+ };
56
+ const typOf = (token) => decode(token.split(".")[0])?.typ;
57
+ const hostOf = (token) => {
58
+ if (verify(token, HOST_TYP)?.aud !== HOST_AUDIENCE) {
59
+ throw new AuthFailure("invalid", "This computer is not connected.");
60
+ }
61
+ return { kind: "host", userId: DEV_USER_ID, grantId: DEV_GRANT, hostId: DEV_HOST };
62
+ };
63
+ const agentOf = (token) => {
64
+ const claims = verify(token, TURN_TYP);
65
+ if (claims?.aud !== TURN_AUDIENCE ||
66
+ typeof claims.exp !== "number" ||
67
+ !claims.hid ||
68
+ !claims.thr ||
69
+ !claims.trn ||
70
+ typeof claims.cid !== "string" ||
71
+ !claims.agt) {
72
+ throw new AuthFailure("invalid", "The turn token is not valid.");
73
+ }
74
+ if (claims.exp * 1000 <= Date.now()) {
75
+ throw new AuthFailure("expired", "The turn is over.");
76
+ }
77
+ return {
78
+ kind: "agent",
79
+ userId: DEV_USER_ID,
80
+ grantId: DEV_GRANT,
81
+ agent: { name: claims.agt, verified: true },
82
+ turn: {
83
+ threadId: asId("thread", claims.thr),
84
+ turnId: asId("turn", claims.trn),
85
+ hostId: asId("host", claims.hid),
86
+ clientId: claims.cid,
87
+ },
88
+ };
89
+ };
90
+ return {
91
+ name: DEV_AUTH_PLUGIN,
92
+ enforcing: false,
93
+ setup: () => ({
94
+ routes: [
95
+ {
96
+ method: "POST",
97
+ path: DEV_HOST_PATH,
98
+ access: "public",
99
+ handle: async (request) => {
100
+ if (request.headers.has("origin")) {
101
+ return refuse("The dev host token is not for web pages.");
102
+ }
103
+ if (!isLoopback(request.ip)) {
104
+ return refuse("The dev host token is only for this computer.");
105
+ }
106
+ return Response.json({
107
+ token: sign(HOST_TYP, { aud: HOST_AUDIENCE, hid: DEV_HOST }),
108
+ hostId: DEV_HOST,
109
+ });
110
+ },
111
+ },
112
+ ],
113
+ }),
114
+ authenticate: async (request) => {
115
+ const match = /^(\w+)\s+(\S+)$/.exec(request.headers.get("authorization") ?? "");
116
+ const scheme = match?.[1]?.toLowerCase();
117
+ const token = match?.[2];
118
+ if (!token)
119
+ return ANONYMOUS;
120
+ if (scheme === "parlorhost")
121
+ return hostOf(token);
122
+ if (scheme === "bearer" && typOf(token) === TURN_TYP)
123
+ return agentOf(token);
124
+ return ANONYMOUS;
125
+ },
126
+ challenge: () => Response.json({ error: { code: "unauthenticated", message: "The turn is over." } }, { status: 401 }),
127
+ revoked: () => new AbortController().signal,
128
+ delegate: async (host, turn) => {
129
+ const iat = Math.floor(Date.now() / 1000);
130
+ const exp = iat + Math.ceil(turn.ttlMs / 1000);
131
+ const claims = {
132
+ aud: TURN_AUDIENCE,
133
+ sub: host.userId,
134
+ hid: host.hostId,
135
+ thr: turn.threadId,
136
+ trn: turn.turnId,
137
+ cid: turn.clientId,
138
+ agt: turn.agent,
139
+ iat,
140
+ exp,
141
+ };
142
+ return { token: sign(TURN_TYP, claims), expiresAt: exp * 1000 };
143
+ },
144
+ };
145
+ }
146
+ //# sourceMappingURL=dev-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-auth.js","sourceRoot":"","sources":["../src/dev-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { type CallerOf, type KindsOf, requireAccess, requireSurface, ROUTE_ACCESS, type Surface, } from "./access.js";
2
+ export { type ActionRunner, type Confirm, createActionRunner, type RunOptions, } from "./actions.js";
3
+ export { type AccountProfile, AuthFailure, type AuthFailureReason, type AuthProvider, type Delegation, type DeviceKeys, type DeviceVouch, HOST_GRANTS_TAG, type PresenceKey, type TurnDelegation, } from "./auth.js";
4
+ export { readBoundedText } from "./body.js";
5
+ export { REVOCATION_HORIZON_MS } from "./revocation-horizon.js";
6
+ export { type Caller, type CallerResolver, clientOf, createCallerResolver, sourceFor, sourceOf, } from "./caller.js";
7
+ export { type CorsConfig, isAllowedOrigin, SHELL_ORIGINS } from "./cors.js";
8
+ export { createServer, type FrameworkServer, type ServerOptions, type SyncOptions, } from "./create-server.js";
9
+ export { DEV_AUTH_PLUGIN, DEV_HOST_PATH, DEV_USER_ID, devAuth, type DevAuthOptions, } from "./dev-auth.js";
10
+ export { createMcpHandler, type McpOptions } from "./mcp.js";
11
+ export { type ActionAudit, type AnyPluginRoute, type ConfirmationAnswer, type Migration, type PluginHost, type PluginRoute, pluginRoute, type PluginRuntime, type PublicPluginRoute, type ServerPlugin, } from "./plugin.js";
12
+ export { CLIENT_HEADER, DEFAULT_BASE_PATH, type Manifest, PROTOCOL_VERSION, SESSION_TOKEN_HEADER, SOURCE_HEADER, } from "./protocol.js";
13
+ export { DEFAULT_SCOPE, defaultScope, type ScopeResolver } from "./scope.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,KAAK,OAAO,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,kBAAkB,EAClB,KAAK,UAAU,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,cAAc,EACnB,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EACL,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,OAAO,EACP,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,KAAK,QAAQ,EACb,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { requireAccess, requireSurface, ROUTE_ACCESS, } from "./access.js";
2
+ export { createActionRunner, } from "./actions.js";
3
+ export { AuthFailure, HOST_GRANTS_TAG, } from "./auth.js";
4
+ export { readBoundedText } from "./body.js";
5
+ export { REVOCATION_HORIZON_MS } from "./revocation-horizon.js";
6
+ export { clientOf, createCallerResolver, sourceFor, sourceOf, } from "./caller.js";
7
+ export { isAllowedOrigin, SHELL_ORIGINS } from "./cors.js";
8
+ export { createServer, } from "./create-server.js";
9
+ export { DEV_AUTH_PLUGIN, DEV_HOST_PATH, DEV_USER_ID, devAuth, } from "./dev-auth.js";
10
+ export { createMcpHandler } from "./mcp.js";
11
+ export { pluginRoute, } from "./plugin.js";
12
+ export { CLIENT_HEADER, DEFAULT_BASE_PATH, PROTOCOL_VERSION, SESSION_TOKEN_HEADER, SOURCE_HEADER, } from "./protocol.js";
13
+ export { DEFAULT_SCOPE, defaultScope } from "./scope.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EACb,cAAc,EACd,YAAY,GAEb,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,kBAAkB,GAEnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,WAAW,EAMX,eAAe,GAGhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAGL,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAmB,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EACL,YAAY,GAIb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,OAAO,GAER,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAC;AAC7D,OAAO,EAOL,WAAW,GAIZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,iBAAiB,EAEjB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RequestId } from "@modelcontextprotocol/server";
2
+ export declare class McpCalls {
3
+ #private;
4
+ run<T>(request: Request | undefined, id: RequestId, signals: readonly AbortSignal[], work: (signal: AbortSignal) => Promise<T>): Promise<T>;
5
+ cancel(request: Request, id: RequestId, reason: unknown): void;
6
+ }
7
+ //# sourceMappingURL=mcp-calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-calls.d.ts","sourceRoot":"","sources":["../src/mcp-calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,qBAAa,QAAQ;;IAGb,GAAG,CAAC,CAAC,EACT,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAaZ;IAED,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAG7D;CACF"}
@@ -0,0 +1,30 @@
1
+ export class McpCalls {
2
+ #inFlight = new Map();
3
+ async run(request, id, signals, work) {
4
+ if (!request)
5
+ return work(AbortSignal.any([...signals]));
6
+ const key = keyOf(request, id);
7
+ const cancellation = new AbortController();
8
+ const calls = this.#inFlight.get(key) ?? new Set();
9
+ calls.add(cancellation);
10
+ this.#inFlight.set(key, calls);
11
+ try {
12
+ return await work(AbortSignal.any([...signals, cancellation.signal]));
13
+ }
14
+ finally {
15
+ calls.delete(cancellation);
16
+ if (calls.size === 0)
17
+ this.#inFlight.delete(key);
18
+ }
19
+ }
20
+ cancel(request, id, reason) {
21
+ for (const call of this.#inFlight.get(keyOf(request, id)) ?? [])
22
+ call.abort(reason ?? new DOMException("The call was cancelled.", "AbortError"));
23
+ }
24
+ }
25
+ const IDENTIFYING_HEADERS = ["authorization", "mcp-session-id", "user-agent"];
26
+ const keyOf = (request, id) => JSON.stringify([
27
+ ...IDENTIFYING_HEADERS.map((header) => request.headers.get(header) ?? ""),
28
+ id,
29
+ ]);
30
+ //# sourceMappingURL=mcp-calls.js.map