@parlor/server 0.1.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAIZ,MAAM,cAAc,CAAC;AAMtB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAC/B,GAAG,EAAE,CAAC,OAAO,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,EAAE,EAAE,CAAC,MAAM,CAAC;CAC8C,CAAC;AAI7D,kGAAkG;AAClG,MAAM,mBAAmB,GAAyB,IAAI,GAAG,CAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAShF,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,MAAc,EAAE,SAAkB;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,CAAC,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChF,OAAQ,YAAY,CAAC,OAAO,CAA6B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,OAAU,EACV,SAAkB;IAElB,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;QAAE,OAAO,MAA8B,CAAC;IAC9E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,IAAI,IAAI,KAAK,WAAW;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IACrF,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,yBAAyB,OAAO,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,KAAmB,EACnB,SAAkB;IAElB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,MAAM,MAAM,GAAI,KAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,6BAA6B,CAAC,CAAC;IACxF,OAAO,MAAqB,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAIZ,MAAM,cAAc,CAAC;AAMtB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAC/B,GAAG,EAAE,CAAC,OAAO,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,EAAE,EAAE,CAAC,MAAM,CAAC;CAC8C,CAAC;AAI7D,kGAAkG;AAClG,MAAM,mBAAmB,GAAyB,IAAI,GAAG,CAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAShF,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,MAAc,EAAE,SAAkB;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,CAAC,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChF,OAAQ,YAAY,CAAC,OAAO,CAA6B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,OAAU,EACV,SAAkB;IAElB,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;QAAE,OAAO,MAA8B,CAAC;IAC9E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,IAAI,IAAI,KAAK,WAAW;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IACrF,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,yBAAyB,OAAO,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,KAAmB,EACnB,SAAkB;IAElB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,MAAM,MAAM,GAAI,KAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,6BAA6B,CAAC,CAAC;IACxF,OAAO,MAAqB,CAAC;AAC/B,CAAC","sourcesContent":["import {\n ActionError,\n type AuthenticatedPrincipal,\n type Principal,\n type PrincipalKind,\n} from \"@parlor/core\";\n\nimport type { Caller } from \"./caller.js\";\n\ntype SignedInKind = AuthenticatedPrincipal[\"kind\"];\n\nexport const ROUTE_ACCESS = {\n manifest: [\"user\", \"agent\"],\n actions: [\"user\", \"agent\"],\n pluginActions: [\"user\", \"host\"],\n mcp: [\"agent\"],\n sync: [\"user\", \"host\"],\n channels: [\"user\"],\n ui: [\"user\"],\n} as const satisfies Record<string, readonly SignedInKind[]>;\n\nexport type Surface = keyof typeof ROUTE_ACCESS;\n\n/** Reached by anonymous callers even under an enforcing provider; each action checks `public`. */\nconst OPEN_WHEN_ENFORCING: ReadonlySet<Surface> = new Set<Surface>([\"actions\"]);\n\n/** An anonymous caller reaches every surface while no enforcing provider is installed. */\nexport type KindsOf<S extends Surface> = \"anonymous\" | (typeof ROUTE_ACCESS)[S][number];\n\nexport type CallerOf<K extends PrincipalKind> = Caller & {\n readonly principal: Extract<Principal, { readonly kind: K }>;\n};\n\nexport function admits(surface: Surface, caller: Caller, enforcing: boolean): boolean {\n const { kind } = caller.principal;\n if (kind === \"anonymous\") return !enforcing || OPEN_WHEN_ENFORCING.has(surface);\n return (ROUTE_ACCESS[surface] as readonly SignedInKind[]).includes(kind);\n}\n\n/**\n * Narrows a caller to the kinds a surface admits, or refuses it: `unauthenticated` for an\n * anonymous caller, `forbidden` for a signed-in principal of another kind.\n */\nexport function requireSurface<S extends Surface>(\n caller: Caller,\n surface: S,\n enforcing: boolean,\n): CallerOf<KindsOf<S>> {\n if (admits(surface, caller, enforcing)) return caller as CallerOf<KindsOf<S>>;\n const { kind } = caller.principal;\n if (kind === \"anonymous\") throw new ActionError(\"unauthenticated\", \"Sign in first.\");\n throw new ActionError(\"forbidden\", `A ${kind} principal cannot use ${surface}.`);\n}\n\nexport function requireAccess<K extends PrincipalKind>(\n caller: Caller,\n kinds: readonly K[],\n enforcing: boolean,\n): CallerOf<K> {\n const { kind } = caller.principal;\n const listed = (kinds as readonly PrincipalKind[]).includes(kind);\n if (kind === \"anonymous\" && (enforcing || !listed)) {\n throw new ActionError(\"unauthenticated\", \"Sign in first.\");\n }\n if (!listed) throw new ActionError(\"forbidden\", `A ${kind} principal cannot use this.`);\n return caller as CallerOf<K>;\n}\n"]}
package/dist/actions.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { ConfirmationOutcome, ConfirmationRequest } from "@parlor/agent-ui/
3
3
  import { type ActionMap, type ActionSource, type DataProvider } from "@parlor/core";
4
4
  import { type ActionRegistry, type InvokeResult } from "@parlor/core/registry";
5
5
  import { type Surface } from "./access.js";
6
- import { type CallerResolver } from "./caller.js";
6
+ import { type Caller, type CallerResolver } from "./caller.js";
7
7
  import type { ActionAudit } from "./plugin.js";
8
8
  import { type ScopeResolver } from "./scope.js";
9
9
  export { clientOf, sourceOf } from "./caller.js";
@@ -18,6 +18,8 @@ export interface ActionRunnerOptions<T extends ActionMap> {
18
18
  readonly onClient?: ((clientId: string | undefined, audience: string) => void) | undefined;
19
19
  readonly confirm?: Confirm | undefined;
20
20
  readonly audit?: ((record: ActionAudit) => void) | undefined;
21
+ /** Throws for a caller the surface admits but the actions' owner does not; audited like any refusal. */
22
+ readonly admit?: ((caller: Caller) => Promise<void>) | undefined;
21
23
  /** Awaited before every call, so it must memoize; defaults to creating the sync tables. */
22
24
  readonly ready?: (() => Promise<void>) | undefined;
23
25
  }
@@ -26,9 +28,15 @@ export interface RunOptions {
26
28
  readonly origin?: AgentOrigin | undefined;
27
29
  /** Refuses callers the surface does not admit, inside the call so the refusal is audited. */
28
30
  readonly surface?: Surface | undefined;
31
+ /** Also answer the sync cursor a read's result reflects, for a client that keeps it fresh. */
32
+ readonly cursor?: boolean | undefined;
33
+ }
34
+ export interface ActionRun extends InvokeResult {
35
+ /** Set for a read with `cursor`: every sync event of the caller's streams up to it is in `data`. */
36
+ readonly cursor?: string | undefined;
29
37
  }
30
38
  export interface ActionRunner {
31
- run(name: string, input: unknown, request: Request | undefined, source: ActionSource, options?: RunOptions): Promise<InvokeResult>;
39
+ run(name: string, input: unknown, request: Request | undefined, source: ActionSource, options?: RunOptions): Promise<ActionRun>;
32
40
  ready(): Promise<void>;
33
41
  }
34
42
  export declare function createActionRunner<T extends ActionMap>(options: ActionRunnerOptions<T>): ActionRunner;
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,YAAY,EACjB,KAAK,YAAY,EAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAEL,KAAK,cAAc,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAErF,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,SAAS;IACtD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EACd,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAC1D,SAAS,CAAC;IACd,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7D,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACpD;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAsED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,SAAS,EACpD,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,YAAY,CAiHd"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
package/dist/actions.js CHANGED
@@ -1,6 +1,7 @@
1
- import { ActionError, ANONYMOUS, } from "@parlor/core";
1
+ import { ActionError, ANONYMOUS, isMutating, } from "@parlor/core";
2
2
  import { invokeAction, } from "@parlor/core/registry";
3
- import { createPruner, ensureSyncTables, recordSyncEvent, } from "@parlor/sync/server";
3
+ import { encodeCursor } from "@parlor/sync";
4
+ import { createPruner, ensureSyncTables, readSyncCursor, recordSyncEvent, } from "@parlor/sync/server";
4
5
  import { requireSurface } from "./access.js";
5
6
  import { AuthFailure } from "./auth.js";
6
7
  import { createCallerResolver, sourceFor, } from "./caller.js";
@@ -49,7 +50,7 @@ const INTERNAL_CALLER = {
49
50
  clientId: undefined,
50
51
  };
51
52
  export function createActionRunner(options) {
52
- const { actions, scope, database, sync, onClient, confirm, audit } = options;
53
+ const { actions, scope, database, sync, onClient, confirm, audit, admit } = options;
53
54
  const callers = options.callers ?? createCallerResolver(undefined, scope);
54
55
  const pruner = sync && database ? createPruner(database) : undefined;
55
56
  let prepared;
@@ -61,14 +62,23 @@ export function createActionRunner(options) {
61
62
  : Promise.resolve();
62
63
  return prepared;
63
64
  });
65
+ const cursorBefore = async (name, caller) => {
66
+ const action = actions.get(name);
67
+ if (!sync || !database || !action?.reads || isMutating(action))
68
+ return undefined;
69
+ const streams = caller.audience === caller.scope ? [caller.scope] : [caller.scope, caller.audience];
70
+ return encodeCursor(await readSyncCursor(database.read(), streams));
71
+ };
64
72
  const invoke = async (name, input, request, caller, source, runOptions, trace) => {
65
73
  if (runOptions.surface)
66
74
  requireSurface(caller, runOptions.surface, callers.enforcing);
75
+ await admit?.(caller);
67
76
  const client = caller.clientId;
68
77
  onClient?.(client, caller.audience);
69
78
  const signal = runOptions.signal ?? request?.signal;
70
79
  const resolvedScope = caller.scope;
71
- const result = await invokeAction(actions, name, input, { scope: resolvedScope, source, principal: caller.principal, signal }, {
80
+ const cursor = runOptions.cursor ? await cursorBefore(name, caller) : undefined;
81
+ const result = await invokeAction(actions, name, input, { scope: resolvedScope, source, principal: caller.principal, signal, request }, {
72
82
  data: database,
73
83
  enforcing: callers.enforcing,
74
84
  onRun: () => {
@@ -100,7 +110,7 @@ export function createActionRunner(options) {
100
110
  });
101
111
  if (result.writes.length > 0)
102
112
  pruner?.touch();
103
- return result;
113
+ return cursor === undefined ? result : { ...result, cursor };
104
114
  };
105
115
  return {
106
116
  ready,
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAEX,SAAS,GAIV,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,YAAY,GAGb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAEhB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAGL,oBAAoB,EACpB,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA+CjD,SAAS,QAAQ,CAAC,MAAoB,EAAE,SAAoB;IAC1D,MAAM,GAAG,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,OAAO,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAU;IAClC,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ;YACzC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;YACvE,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;QACD,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,UAAU;gBACb,OAAO;YACT,KAAK,UAAU;gBACb,MAAM,IAAI,WAAW,CACnB,UAAU,EACV,qBAAqB,IAAI,+DAA+D,CACzF,CAAC;YACJ,KAAK,SAAS;gBACZ,MAAM,IAAI,WAAW,CACnB,sBAAsB,EACtB,oCAAoC,IAAI,eAAe,CACxD,CAAC;YACJ,KAAK,aAAa;gBAChB,MAAM,IAAI,WAAW,CACnB,0BAA0B,EAC1B,2CAA2C,IAAI,gDAAgD,CAChG,CAAC;YACJ,KAAK,UAAU;gBACb,MAAM,IAAI,WAAW,CACnB,0BAA0B,EAC1B,kDAAkD,IAAI,0FAA0F,CACjJ,CAAC;YACJ,KAAK,WAAW;gBACd,MAAM,CACJ,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CACjF,CAAC;QACN,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAW;IAC9B,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,aAAa;IACpB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,OAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,IAAI,QAAmC,CAAC;IACxC,MAAM,KAAK,GACT,OAAO,CAAC,KAAK;QACb,CAAC,GAAG,EAAE;YACJ,QAAQ;gBACN,IAAI,IAAI,QAAQ;oBACd,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAkB,CAAC;oBACnD,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IAEL,MAAM,MAAM,GAAG,KAAK,EAClB,IAAY,EACZ,KAAc,EACd,OAA4B,EAC5B,MAAc,EACd,MAAoB,EACpB,UAAsB,EACtB,KAAY,EACW,EAAE;QACzB,IAAI,UAAU,CAAC,OAAO;YAAE,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,CAAC;QACpD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,OAAO,EACP,IAAI,EACJ,KAAK,EACL,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EACrE;YACE,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,GAAG,EAAE;gBACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACtB,CAAC;YACD,OAAO,EAAE,OAAO;gBACd,CAAC,CAAC,gBAAgB,CAAC;oBACf,OAAO;oBACP,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;wBACnB,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;oBAC9B,CAAC;oBACD,KAAK,EAAE,MAAM,CAAC,QAAQ;oBACtB,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,MAAM;iBACP,CAAC;gBACJ,CAAC,CAAC,SAAS;YACb,OAAO,EACL,IAAI,IAAI,QAAQ;gBACd,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;oBAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO;oBAC9B,MAAM,eAAe,CAAC,EAAkB,EAAE;wBACxC,KAAK,EAAE,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa;wBACnE,IAAI;wBACJ,MAAM,EAAE,MAAM;qBACf,CAAC,CAAC;gBACL,CAAC;gBACH,CAAC,CAAC,SAAS;SAChB,CACF,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,EAAE;YACvD,MAAM,KAAK,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;YAClE,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAU,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,CAAC,KAAK;gBAAE,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YACnF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,KAAK,EAAE,OAA+B,EAAE,EAAE;gBACvD,IAAI,CAAC;oBACH,KAAK,CAAC;wBACJ,EAAE;wBACF,MAAM,EAAE,IAAI;wBACZ,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,MAAM;wBACN,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,WAAW,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC;wBAChC,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,OAAO;wBACP,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACpE,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,UAAU,EACV,KAAK,CACN,CAAC;gBACF,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAOD,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACpD,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,iBAAiB,CAAC;IAC3D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,WAAW,CAAC;IAC9E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAc;IAClC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentOrigin } from \"@parlor/agent-ui\";\nimport type { ConfirmationOutcome, ConfirmationRequest } from \"@parlor/agent-ui/server\";\nimport {\n ActionError,\n type ActionMap,\n ANONYMOUS,\n type ActionSource,\n type DataProvider,\n isMutating,\n type Principal,\n} from \"@parlor/core\";\nimport {\n type ActionRegistry,\n invokeAction,\n type InvokeResult,\n type PreparedCall,\n} from \"@parlor/core/registry\";\nimport { encodeCursor } from \"@parlor/sync\";\nimport {\n createPruner,\n ensureSyncTables,\n readSyncCursor,\n recordSyncEvent,\n type SyncDatabase,\n} from \"@parlor/sync/server\";\n\nimport { requireSurface, type Surface } from \"./access.js\";\nimport { AuthFailure } from \"./auth.js\";\nimport {\n type Caller,\n type CallerResolver,\n createCallerResolver,\n sourceFor,\n} from \"./caller.js\";\nimport type { ActionAudit, ConfirmationAnswer } from \"./plugin.js\";\nimport { DEFAULT_SCOPE, type ScopeResolver } from \"./scope.js\";\n\nexport { clientOf, sourceOf } from \"./caller.js\";\n\nexport type Confirm = (request: ConfirmationRequest) => Promise<ConfirmationOutcome>;\n\nexport interface ActionRunnerOptions<T extends ActionMap> {\n readonly actions: ActionRegistry<T>;\n readonly scope: ScopeResolver;\n readonly database?: DataProvider | undefined;\n readonly sync: boolean;\n /** Resolves each request's identity once; without it every caller is anonymous. */\n readonly callers?: CallerResolver | undefined;\n readonly onClient?:\n | ((clientId: string | undefined, audience: string) => void)\n | undefined;\n readonly confirm?: Confirm | undefined;\n readonly audit?: ((record: ActionAudit) => void) | undefined;\n /** Throws for a caller the surface admits but the actions' owner does not; audited like any refusal. */\n readonly admit?: ((caller: Caller) => Promise<void>) | undefined;\n /** Awaited before every call, so it must memoize; defaults to creating the sync tables. */\n readonly ready?: (() => Promise<void>) | undefined;\n}\n\nexport interface RunOptions {\n readonly signal?: AbortSignal | undefined;\n readonly origin?: AgentOrigin | undefined;\n /** Refuses callers the surface does not admit, inside the call so the refusal is audited. */\n readonly surface?: Surface | undefined;\n /** Also answer the sync cursor a read's result reflects, for a client that keeps it fresh. */\n readonly cursor?: boolean | undefined;\n}\n\nexport interface ActionRun extends InvokeResult {\n /** Set for a read with `cursor`: every sync event of the caller's streams up to it is in `data`. */\n readonly cursor?: string | undefined;\n}\n\nexport interface ActionRunner {\n run(\n name: string,\n input: unknown,\n request: Request | undefined,\n source: ActionSource,\n options?: RunOptions,\n ): Promise<ActionRun>;\n ready(): Promise<void>;\n}\n\ninterface Gate {\n readonly confirm: Confirm;\n readonly answered: (answer: ConfirmationAnswer) => void;\n readonly scope: string;\n readonly clientId: string | undefined;\n readonly origin: AgentOrigin | undefined;\n readonly signal: AbortSignal | undefined;\n}\n\nfunction originOf(source: ActionSource, principal: Principal): AgentOrigin {\n const via = source === \"agent\" ? \"agent\" : \"mcp\";\n return principal.kind === \"agent\" ? { via, name: principal.agent.name } : { via };\n}\n\nfunction confirmationGate(gate: Gate): (call: PreparedCall) => Promise<void> {\n return async ({ action, name, input, ctx }) => {\n const turn = ctx.principal?.kind === \"agent\" ? ctx.principal.turn : undefined;\n const outcome = await gate.confirm({\n scope: gate.scope,\n clientId: turn?.clientId ?? gate.clientId,\n ...(turn ? { thread: { threadId: turn.threadId, turnId: turn.turnId } } : {}),\n action: name,\n description: action.description,\n input,\n origin: gate.origin ?? originOf(ctx.source, ctx.principal ?? ANONYMOUS),\n signal: gate.signal,\n });\n if (outcome !== \"cancelled\") {\n gate.answered(outcome === \"shutdown\" ? \"unavailable\" : outcome);\n }\n switch (outcome) {\n case \"approved\":\n return;\n case \"declined\":\n throw new ActionError(\n \"declined\",\n `The user declined ${name} in the app; nothing ran. Do not retry unless they ask again.`,\n );\n case \"timeout\":\n throw new ActionError(\n \"confirmation_timeout\",\n `The user did not answer in time; ${name} did not run.`,\n );\n case \"unavailable\":\n throw new ActionError(\n \"confirmation_unavailable\",\n `No open app can ask the user to confirm ${name}. Ask the user to do it in the app themselves.`,\n );\n case \"shutdown\":\n throw new ActionError(\n \"confirmation_unavailable\",\n `The server shut down before the user answered; ${name} did not run. Try again once it is back, or ask the user to do it in the app themselves.`,\n );\n case \"cancelled\":\n throw (\n gate.signal?.reason ?? new DOMException(\"The call was cancelled.\", \"AbortError\")\n );\n }\n };\n}\n\nconst INTERNAL_CALLER: Caller = {\n principal: ANONYMOUS,\n scope: DEFAULT_SCOPE,\n audience: DEFAULT_SCOPE,\n clientId: undefined,\n};\n\nexport function createActionRunner<T extends ActionMap>(\n options: ActionRunnerOptions<T>,\n): ActionRunner {\n const { actions, scope, database, sync, onClient, confirm, audit, admit } = options;\n const callers = options.callers ?? createCallerResolver(undefined, scope);\n const pruner = sync && database ? createPruner(database) : undefined;\n let prepared: Promise<void> | undefined;\n const ready =\n options.ready ??\n (() => {\n prepared ??=\n sync && database\n ? ensureSyncTables(database.read() as SyncDatabase)\n : Promise.resolve();\n return prepared;\n });\n\n const cursorBefore = async (\n name: string,\n caller: Caller,\n ): Promise<string | undefined> => {\n const action = actions.get(name);\n if (!sync || !database || !action?.reads || isMutating(action)) return undefined;\n const streams =\n caller.audience === caller.scope ? [caller.scope] : [caller.scope, caller.audience];\n return encodeCursor(await readSyncCursor(database.read() as SyncDatabase, streams));\n };\n\n const invoke = async (\n name: string,\n input: unknown,\n request: Request | undefined,\n caller: Caller,\n source: ActionSource,\n runOptions: RunOptions,\n trace: Trace,\n ): Promise<ActionRun> => {\n if (runOptions.surface) requireSurface(caller, runOptions.surface, callers.enforcing);\n await admit?.(caller);\n const client = caller.clientId;\n onClient?.(client, caller.audience);\n const signal = runOptions.signal ?? request?.signal;\n const resolvedScope = caller.scope;\n const cursor = runOptions.cursor ? await cursorBefore(name, caller) : undefined;\n const result = await invokeAction(\n actions,\n name,\n input,\n { scope: resolvedScope, source, principal: caller.principal, signal, request },\n {\n data: database,\n enforcing: callers.enforcing,\n onRun: () => {\n trace.stage = \"ran\";\n },\n confirm: confirm\n ? confirmationGate({\n confirm,\n answered: (answer) => {\n trace.confirmation = answer;\n },\n scope: caller.audience,\n clientId: client,\n origin: runOptions.origin,\n signal,\n })\n : undefined,\n onWrite:\n sync && database\n ? async ({ action, tags, tx }) => {\n if (tags.length === 0) return;\n await recordSyncEvent(tx as SyncDatabase, {\n scope: action.notifies === \"user\" ? caller.audience : resolvedScope,\n tags,\n source: client,\n });\n }\n : undefined,\n },\n );\n if (result.writes.length > 0) pruner?.touch();\n return cursor === undefined ? result : { ...result, cursor };\n };\n\n return {\n ready,\n async run(name, input, request, declared, runOptions = {}) {\n await ready();\n const caller = request ? await callers(request) : INTERNAL_CALLER;\n const source = sourceFor(declared, caller, callers.enforcing);\n const trace: Trace = { stage: \"refused\", confirmation: undefined };\n if (!audit) return invoke(name, input, request, caller, source, runOptions, trace);\n const at = Date.now();\n const record = async (outcome: ActionAudit[\"outcome\"]) => {\n try {\n audit({\n at,\n action: name,\n principal: caller.principal,\n source,\n scope: caller.scope,\n inputDigest: await digest(input),\n stage: trace.stage,\n outcome,\n ...(trace.confirmation ? { confirmation: trace.confirmation } : {}),\n });\n } catch (error) {\n console.error(\"[parlor] audit failed:\", error);\n }\n };\n try {\n const result = await invoke(\n name,\n input,\n request,\n caller,\n source,\n runOptions,\n trace,\n );\n await record(\"ok\");\n return result;\n } catch (error) {\n await record(outcomeOf(error));\n throw error;\n }\n },\n };\n}\n\ninterface Trace {\n stage: ActionAudit[\"stage\"];\n confirmation: ConfirmationAnswer | undefined;\n}\n\nfunction outcomeOf(error: unknown): ActionAudit[\"outcome\"] {\n if (error instanceof ActionError) return error.code;\n if (error instanceof AuthFailure) return \"unauthenticated\";\n if (error instanceof Error && error.name === \"AbortError\") return \"cancelled\";\n return \"internal\";\n}\n\nasync function digest(input: unknown): Promise<string> {\n const bytes = new TextEncoder().encode(JSON.stringify(input ?? null));\n const hash = await crypto.subtle.digest(\"SHA-256\", bytes);\n return [...new Uint8Array(hash)].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n"]}
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAoDA,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AA4DnD,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB,MAAM;IAFC,IAAI,GAAG,aAAa,CAAC;IACvC,YACW,MAAyB,EAClC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;IAIjB,CAAC;CACF"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAoDA,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AA4DnD,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB,MAAM;IAFC,IAAI,GAAG,aAAa,CAAC;IACvC,YACW,MAAyB,EAClC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;IAIjB,CAAC;CACF","sourcesContent":["import type {\n AuthenticatedPrincipal,\n DeviceId,\n GrantId,\n HostPrincipal,\n Principal,\n ThreadId,\n TurnId,\n UserId,\n} from \"@parlor/core\";\n\nimport type { ServerPlugin } from \"./plugin.js\";\n\n/**\n * Where identity comes from. The server calls `authenticate` once per request and hands\n * the principal to actions, MCP, sync and agent UI. It installs like any plugin, first.\n */\nexport interface AuthProvider extends ServerPlugin {\n /**\n * When true, an anonymous caller is refused by non-public actions, by MCP (with\n * `challenge`) and by `/ui`, and `x-parlor-source` no longer decides an action's source.\n */\n readonly enforcing: boolean;\n /**\n * Missing credentials resolve to `anonymous`. Present but invalid, expired or revoked\n * credentials throw `AuthFailure`, which every surface answers with 401.\n */\n authenticate(request: Request): Promise<Principal>;\n /** The 401 an MCP client reads to discover the authorization server (RFC 9728). */\n challenge(request: Request): Response;\n /**\n * Aborts when the session or grant behind the principal is revoked. Held connections\n * (sync streams) close on it.\n */\n revoked(principal: AuthenticatedPrincipal): AbortSignal;\n /**\n * Mints the turn token an inline agent's MCP calls carry while one chat turn runs,\n * bound to the host's grant. Optional so providers written before chat still compile;\n * `chat()` refuses to start on a provider without it.\n */\n delegate?(host: HostPrincipal, turn: TurnDelegation): Promise<Delegation>;\n /**\n * Whether the host grant still holds. Lists of computers drop a grant that answers\n * false at once, without waiting for the host to notice. Absent means every grant holds.\n */\n hostActive?(grantId: GrantId): Promise<boolean>;\n /** A device's public keys as the account registered them, for prompt and answer signatures. */\n device?(userId: UserId, deviceId: DeviceId): Promise<DeviceKeys | undefined>;\n /** Who the agent works for, for the turn's context block. */\n account?(userId: UserId): Promise<AccountProfile | undefined>;\n}\n\n/** Announced when a computer's grant is added or removed; whatever lists computers reads it. */\nexport const HOST_GRANTS_TAG = \"parlor_auth_hosts\";\n\nexport interface TurnDelegation {\n readonly threadId: ThreadId;\n readonly turnId: TurnId;\n readonly clientId: string;\n readonly agent: string;\n readonly ttlMs: number;\n}\n\nexport interface Delegation {\n readonly token: string;\n readonly expiresAt: number;\n}\n\nexport interface DeviceKeys {\n readonly id: DeviceId;\n readonly name: string;\n readonly platform: string;\n readonly signingKey: JsonWebKey;\n readonly presenceKey?: PresenceKey | undefined;\n /** Linked devices' signed word that this one is the user's; each computer checks them itself. */\n readonly vouches?: readonly DeviceVouch[] | undefined;\n}\n\n/** A `VouchStatement` as the voucher signed it, with its presence key. */\nexport interface DeviceVouch {\n readonly voucher: DeviceId;\n readonly commitment: string;\n readonly at: number;\n readonly signature: {\n readonly keyId: string;\n readonly presence: \"none\" | \"user\";\n readonly format: \"es256-raw\" | \"webauthn\";\n readonly signature: string;\n readonly authenticatorData?: string | undefined;\n readonly clientDataJSON?: string | undefined;\n };\n}\n\nexport type PresenceKey =\n | {\n readonly format: \"webauthn\";\n readonly credentialId: string;\n readonly rpId: string;\n readonly publicKey: JsonWebKey;\n }\n | {\n readonly format: \"es256-raw\";\n readonly keyId: string;\n readonly publicKey: JsonWebKey;\n };\n\nexport interface AccountProfile {\n readonly name: string;\n readonly email?: string | undefined;\n}\n\nexport type AuthFailureReason = \"invalid\" | \"expired\" | \"revoked\";\n\nexport class AuthFailure extends Error {\n override readonly name = \"AuthFailure\";\n constructor(\n readonly reason: AuthFailureReason,\n message: string,\n ) {\n super(message);\n }\n}\n"]}
package/dist/body.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgB,EAChB,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,UAAU;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;QACzB,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;YACtB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgB,EAChB,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,UAAU;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;QACzB,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;YACtB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACjC,CAAC","sourcesContent":["/**\n * The request body as text, or undefined once it passes `limitBytes`. A declared\n * `Content-Length` over the limit is refused unread; otherwise the stream is read chunk by\n * chunk and cancelled the moment the bytes read pass the limit.\n */\nexport async function readBoundedText(\n request: Request,\n limitBytes: number,\n): Promise<string | undefined> {\n const declared = Number(request.headers.get(\"content-length\"));\n if (declared > limitBytes) return undefined;\n const reader = request.body?.getReader();\n if (!reader) return \"\";\n const decoder = new TextDecoder();\n let text = \"\";\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > limitBytes) {\n await reader.cancel();\n return undefined;\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"caller.js","sourceRoot":"","sources":["../src/caller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACL,SAAS,EAGT,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAiB7D,MAAM,OAAO,GAAwB,IAAI,GAAG,CAAe;IACzD,IAAI;IACJ,OAAO;IACP,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAuB,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,QAAsB,EACtB,MAAc,EACd,SAAkB;IAElB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,SAAS;QACxD,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAClC,IAA8B,EAC9B,KAAoB,EACpB,OAA6B;IAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAA4B,CAAC;IACxD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAgB,EAAmB,EAAE;QAC1D,IAAI,IAAI;YAAE,MAAM,OAAO,EAAE,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,OAAO;YACL,SAAS;YACT,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC;YAC9C,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;SAC5B,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,OAAgB,EAAE,EAAE;QACnB,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,CACxC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"caller.js","sourceRoot":"","sources":["../src/caller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACL,SAAS,EAGT,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAiB7D,MAAM,OAAO,GAAwB,IAAI,GAAG,CAAe;IACzD,IAAI;IACJ,OAAO;IACP,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAuB,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,QAAsB,EACtB,MAAc,EACd,SAAkB;IAElB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,SAAS;QACxD,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAClC,IAA8B,EAC9B,KAAoB,EACpB,OAA6B;IAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAA4B,CAAC;IACxD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAgB,EAAmB,EAAE;QAC1D,IAAI,IAAI;YAAE,MAAM,OAAO,EAAE,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,OAAO;YACL,SAAS;YACT,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC;YAC9C,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;SAC5B,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,OAAgB,EAAE,EAAE;QACnB,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,CACxC,CAAC;AACJ,CAAC","sourcesContent":["import { audienceOf } from \"@parlor/agent-ui/server\";\nimport {\n ANONYMOUS,\n type ActionSource,\n type Principal,\n sourceOfPrincipal,\n} from \"@parlor/core\";\n\nimport type { AuthProvider } from \"./auth.js\";\nimport { CLIENT_HEADER, SOURCE_HEADER } from \"./protocol.js\";\nimport type { ScopeResolver } from \"./scope.js\";\n\nexport interface Caller {\n readonly principal: Principal;\n readonly scope: string;\n /** Scope plus user: whose screens this caller may see and drive (`audienceOf`). */\n readonly audience: string;\n /** The tab or app the request came from: a routing hint, never an identity. */\n readonly clientId: string | undefined;\n}\n\nexport interface CallerResolver {\n (request: Request): Promise<Caller>;\n readonly enforcing: boolean;\n}\n\nconst SOURCES: ReadonlySet<string> = new Set<ActionSource>([\n \"ui\",\n \"agent\",\n \"http\",\n \"mcp\",\n]);\n\nexport function sourceOf(request: Request): ActionSource {\n const header = request.headers.get(SOURCE_HEADER);\n return header && SOURCES.has(header) ? (header as ActionSource) : \"http\";\n}\n\nexport function clientOf(request: Request): string | undefined {\n return request.headers.get(CLIENT_HEADER) ?? undefined;\n}\n\nexport function sourceFor(\n declared: ActionSource,\n caller: Caller,\n enforcing: boolean,\n): ActionSource {\n return caller.principal.kind === \"anonymous\" && !enforcing\n ? declared\n : sourceOfPrincipal(caller.principal);\n}\n\n/** `prepare` runs before the provider sees a request, so its tables exist by then. */\nexport function createCallerResolver(\n auth: AuthProvider | undefined,\n scope: ScopeResolver,\n prepare?: () => Promise<void>,\n): CallerResolver {\n const callers = new WeakMap<Request, Promise<Caller>>();\n const resolve = async (request: Request): Promise<Caller> => {\n if (auth) await prepare?.();\n const principal = auth ? await auth.authenticate(request) : ANONYMOUS;\n const resolvedScope = await scope(request, principal);\n return {\n principal,\n scope: resolvedScope,\n audience: audienceOf(resolvedScope, principal),\n clientId: clientOf(request),\n };\n };\n return Object.assign(\n (request: Request) => {\n let caller = callers.get(request);\n if (!caller) {\n caller = resolve(request);\n callers.set(request, caller);\n }\n return caller;\n },\n { enforcing: auth?.enforcing === true },\n );\n}\n"]}
package/dist/cors.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAgB,UAAU,EAAE,MAAM,IAAI,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,gBAAgB,GAAG,sDAAsD,CAAC;AAMhF,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,KAAK,GAAiC,EAAE;IAExC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAM,GAAe,EAAE;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,OAAO,CAAC,KAAc,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE;YAClC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;YAClD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;YACnC,YAAY,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,CAAC;YAC7E,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;YACvE,SAAS,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAC/B,CAAC,CAAC;QACH,OAAO,SAAS,IAAI,SAAS,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAgB,UAAU,EAAE,MAAM,IAAI,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,gBAAgB,GAAG,sDAAsD,CAAC;AAMhF,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,KAAK,GAAiC,EAAE;IAExC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAM,GAAe,EAAE;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,OAAO,CAAC,KAAc,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE;YAClC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;YAClD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;YACnC,YAAY,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,CAAC;YAC7E,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;YACvE,SAAS,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAC/B,CAAC,CAAC;QACH,OAAO,SAAS,IAAI,SAAS,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { SHELL_ORIGINS } from \"@parlor/core\";\nimport { type H3Event, handleCors } from \"h3\";\n\nimport { CLIENT_HEADER, SESSION_TOKEN_HEADER, SOURCE_HEADER } from \"./protocol.js\";\n\nexport { SHELL_ORIGINS };\n\nconst LOCAL_DEV_ORIGIN = /^https?:\\/\\/(localhost|127\\.0\\.0\\.1|\\[::1\\])(:\\d+)?$/;\n\nexport interface CorsConfig {\n readonly origins?: readonly (string | RegExp)[] | undefined;\n}\n\nexport function isAllowedOrigin(\n origin: string,\n extra: readonly (string | RegExp)[] = [],\n) {\n if (SHELL_ORIGINS.includes(origin) || LOCAL_DEV_ORIGIN.test(origin)) return true;\n return extra.some((rule) =>\n typeof rule === \"string\" ? rule === origin : rule.test(origin),\n );\n}\n\nexport function corsMiddleware(config: CorsConfig = {}) {\n const extra = config.origins ?? [];\n return (event: H3Event) => {\n const preflight = handleCors(event, {\n origin: (origin) => isAllowedOrigin(origin, extra),\n methods: [\"GET\", \"POST\", \"OPTIONS\"],\n allowHeaders: [\"content-type\", \"authorization\", SOURCE_HEADER, CLIENT_HEADER],\n credentials: true,\n exposeHeaders: [\"content-type\", \"content-length\", SESSION_TOKEN_HEADER],\n preflight: { statusCode: 204 },\n });\n return preflight || undefined;\n };\n}\n"]}
@@ -31,6 +31,10 @@ export interface ServerOptions<T extends ActionMap> {
31
31
  readonly agentUi?: AgentUiOptions | false | undefined;
32
32
  }
33
33
  export interface FrameworkServer {
34
+ /**
35
+ * Hands the server the app's page routes, called by the host before the first request.
36
+ * Throws when a page route would take a document request meant for an absolute route.
37
+ */
34
38
  readonly installUiManifest?: ((source: UiManifestSource) => void) | undefined;
35
39
  readonly fetch: (request: Request) => Promise<Response>;
36
40
  readonly close: () => Promise<void>;
@@ -1 +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"}
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAInB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,SAAS,EAEd,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,EAMV,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;;;OAGG;IACH,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;AAmND,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAC9C,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,eAAe,CA0RjB"}
@@ -1,5 +1,6 @@
1
+ import { pagePattern, UNROUTED_HEADER } from "@parlor/agent-ui";
1
2
  import { createAgentUi, registerAgentUiRoutes, } from "@parlor/agent-ui/server";
2
- import { ActionError, } from "@parlor/core";
3
+ import { ActionError, ANONYMOUS, } from "@parlor/core";
3
4
  import { ensureSyncTables, recordSyncEvent, registerSyncRoutes, SyncHub, } from "@parlor/sync/server";
4
5
  import { H3, readBody } from "h3";
5
6
  import { admits, requireAccess, requireSurface } from "./access.js";
@@ -66,6 +67,56 @@ function checkPlugins(plugins, database) {
66
67
  }
67
68
  }
68
69
  }
70
+ const isAbsolute = (route) => route.absolute === true || route.path.startsWith("/.well-known/");
71
+ function mountRoutes(runtimes, basePath) {
72
+ const mounted = [];
73
+ const owners = new Map();
74
+ for (const { plugin, runtime } of runtimes) {
75
+ for (const route of runtime.routes ?? []) {
76
+ if (!isAbsolute(route)) {
77
+ mounted.push({
78
+ plugin: plugin.name,
79
+ route,
80
+ path: `${basePath}/${plugin.name}${route.path}`,
81
+ });
82
+ continue;
83
+ }
84
+ const { method, path } = route;
85
+ if (route.absolute && /[:*]/.test(path)) {
86
+ throw new Error(`The "${plugin.name}" plugin's absolute route ${method} ${path} must be a static path.`);
87
+ }
88
+ if (path === basePath || path.startsWith(`${basePath}/`)) {
89
+ throw new Error(`The "${plugin.name}" plugin's absolute route ${method} ${path} is under ${basePath}, which the framework serves.`);
90
+ }
91
+ const key = `${method} ${path}`;
92
+ const owner = owners.get(key);
93
+ if (owner !== undefined) {
94
+ throw new Error(owner === plugin.name
95
+ ? `The "${owner}" plugin serves ${key} twice.`
96
+ : `The "${owner}" and "${plugin.name}" plugins both serve ${key}.`);
97
+ }
98
+ owners.set(key, plugin.name);
99
+ mounted.push({ plugin: plugin.name, route, path });
100
+ }
101
+ }
102
+ return mounted;
103
+ }
104
+ function refuseShadowedRoutes(manifest, routes) {
105
+ if (!manifest)
106
+ return;
107
+ const pages = manifest.routes.map((page) => ({
108
+ page,
109
+ pattern: pagePattern(page.path),
110
+ }));
111
+ for (const { plugin, route } of routes) {
112
+ if (!route.absolute || route.method !== "GET")
113
+ continue;
114
+ const shadow = pages.find(({ pattern }) => pattern.test(route.path));
115
+ if (shadow) {
116
+ throw new Error(`The "${plugin}" plugin's absolute route GET ${route.path} is also matched by the page route ${shadow.page.path}, so a browser opening it would get the page. Move one of them.`);
117
+ }
118
+ }
119
+ }
69
120
  function auditAll(runtimes) {
70
121
  const hooks = runtimes.filter((runtime) => runtime.audit);
71
122
  if (hooks.length === 0)
@@ -75,6 +126,42 @@ function auditAll(runtimes) {
75
126
  runtime.audit?.(record);
76
127
  };
77
128
  }
129
+ async function allowedBy({ runtime }, caller) {
130
+ return !runtime.allows || (await runtime.allows(caller));
131
+ }
132
+ function admitterOf(installed) {
133
+ return async (caller) => {
134
+ if (await allowedBy(installed, caller))
135
+ return;
136
+ throw new ActionError("forbidden", `This account cannot use ${installed.plugin.name}.`);
137
+ };
138
+ }
139
+ /** Joins a connection to `channel` only once the plugin admits its holder. */
140
+ function gatedChannel(installed, channel) {
141
+ if (!installed.runtime.allows)
142
+ return channel;
143
+ return {
144
+ event: channel.event,
145
+ connect(connection) {
146
+ let detach;
147
+ let left = false;
148
+ allowedBy(installed, {
149
+ principal: connection.principal ?? ANONYMOUS,
150
+ scope: connection.scope,
151
+ }).then((allowed) => {
152
+ if (allowed && !left && !connection.closed?.aborted) {
153
+ detach = channel.connect(connection);
154
+ }
155
+ }, (error) => {
156
+ console.error(`[parlor] ${installed.plugin.name}: access check failed:`, error);
157
+ });
158
+ return () => {
159
+ left = true;
160
+ detach?.();
161
+ };
162
+ },
163
+ };
164
+ }
78
165
  function guard(callers, surface) {
79
166
  return async (request) => requireSurface(await callers(request), surface, callers.enforcing);
80
167
  }
@@ -101,11 +188,14 @@ export function createServer(options) {
101
188
  checkPlugins(installed, database);
102
189
  let prepared;
103
190
  const ready = () => (prepared ??= (async () => {
104
- if (!database)
105
- return;
106
- if (syncEnabled)
107
- await ensureSyncTables(database.read());
108
- await applyMigrations(database, installed);
191
+ if (database) {
192
+ await database.prepare?.();
193
+ if (syncEnabled)
194
+ await ensureSyncTables(database.read());
195
+ await applyMigrations(database, installed);
196
+ }
197
+ for (const { runtime } of runtimes)
198
+ runtime.start?.();
109
199
  })());
110
200
  const callers = createCallerResolver(auth, scope, ready);
111
201
  const host = {
@@ -114,6 +204,10 @@ export function createServer(options) {
114
204
  ...(auth ? { auth } : {}),
115
205
  authMisconfigured: "auth" in options && auth === undefined,
116
206
  callerOf: callers,
207
+ allows: async (name, caller) => {
208
+ const entry = runtimes.find(({ plugin }) => plugin.name === name);
209
+ return entry === undefined || (await allowedBy(entry, caller));
210
+ },
117
211
  ready,
118
212
  announce: async (target, tags, within) => {
119
213
  if (!syncEnabled || !database || tags.length === 0)
@@ -126,7 +220,11 @@ export function createServer(options) {
126
220
  await database.transaction((tx) => recordSyncEvent(tx, { scope: target, tags }));
127
221
  },
128
222
  };
129
- const runtimes = installed.map((plugin) => ({ plugin, runtime: plugin.setup(host) }));
223
+ const runtimes = installed.map((plugin) => ({
224
+ plugin,
225
+ runtime: plugin.setup(host),
226
+ }));
227
+ const routes = mountRoutes(runtimes, basePath);
130
228
  const audit = auditAll(runtimes.map(({ runtime }) => runtime));
131
229
  const agentUi = agentUiOptions === false
132
230
  ? undefined
@@ -134,7 +232,7 @@ export function createServer(options) {
134
232
  ...agentUiOptions,
135
233
  audience: async (request) => (await callers(request)).audience,
136
234
  });
137
- const runnerFor = (registry) => createActionRunner({
235
+ const runnerFor = (registry, admit) => createActionRunner({
138
236
  actions: registry,
139
237
  scope,
140
238
  callers,
@@ -143,6 +241,7 @@ export function createServer(options) {
143
241
  onClient: agentUi?.touch,
144
242
  confirm: agentUi?.confirm,
145
243
  audit,
244
+ admit,
146
245
  ready,
147
246
  });
148
247
  const runner = runnerFor(actions);
@@ -176,51 +275,53 @@ export function createServer(options) {
176
275
  });
177
276
  const result = await runner.run(name, input, event.req, sourceOf(event.req), {
178
277
  surface: "actions",
278
+ cursor: true,
179
279
  });
180
- return { data: result.data, tags: result.reads };
280
+ return { data: result.data, tags: result.reads, cursor: result.cursor };
181
281
  }
182
282
  catch (error) {
183
283
  return errorBody(event, error);
184
284
  }
185
285
  });
186
- const handleRoute = async (route, request) => {
286
+ const handleRoute = async (route, request, admit) => {
187
287
  if (route.access === "public")
188
288
  return route.handle(request);
189
289
  const caller = requireAccess(await callers(request), route.access, callers.enforcing);
290
+ await admit(caller);
190
291
  return route.handle(request, caller);
191
292
  };
192
- for (const { plugin, runtime } of runtimes) {
193
- const root = `${basePath}/${plugin.name}`;
293
+ const admitters = new Map(runtimes.map((entry) => [entry.plugin.name, admitterOf(entry)]));
294
+ for (const entry of runtimes) {
295
+ const { plugin, runtime } = entry;
194
296
  if (runtime.actions) {
195
- const pluginRunner = runnerFor(runtime.actions);
196
- app.post(`${root}/actions/:name`, async (event) => {
297
+ const admit = admitters.get(plugin.name);
298
+ const pluginRunner = runnerFor(runtime.actions, runtime.allows ? admit : undefined);
299
+ app.post(`${basePath}/${plugin.name}/actions/:name`, async (event) => {
197
300
  const name = event.context.params?.name ?? "";
198
301
  try {
199
302
  const input = await readBody(event).catch(() => {
200
303
  throw new ActionError("invalid_input", "Request body must be JSON");
201
304
  });
202
- const result = await pluginRunner.run(name, input, event.req, sourceOf(event.req), { surface: "pluginActions" });
203
- return { data: result.data, tags: result.reads };
305
+ const result = await pluginRunner.run(name, input, event.req, sourceOf(event.req), { surface: "pluginActions", cursor: true });
306
+ return { data: result.data, tags: result.reads, cursor: result.cursor };
204
307
  }
205
308
  catch (error) {
206
309
  return errorBody(event, error);
207
310
  }
208
311
  });
209
312
  }
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
- }
313
+ }
314
+ for (const { plugin, route, path } of routes) {
315
+ const admit = admitters.get(plugin);
316
+ app.on(route.method, path, async (event) => {
317
+ try {
318
+ await ready();
319
+ return await handleRoute(route, event.req, admit);
320
+ }
321
+ catch (error) {
322
+ return errorResponse(error);
323
+ }
324
+ });
224
325
  }
225
326
  if (mcp !== false) {
226
327
  const mcpApp = appName
@@ -279,7 +380,7 @@ export function createServer(options) {
279
380
  pollIntervalMs: syncOptions?.pollIntervalMs,
280
381
  channels: [
281
382
  ...(agentUi ? [agentUi.channel] : []),
282
- ...runtimes.flatMap(({ runtime }) => runtime.channel ? [runtime.channel] : []),
383
+ ...runtimes.flatMap((entry) => entry.runtime.channel ? [gatedChannel(entry, entry.runtime.channel)] : []),
283
384
  ],
284
385
  clientId: clientOf,
285
386
  });
@@ -293,10 +394,16 @@ export function createServer(options) {
293
394
  clientId: clientOf,
294
395
  });
295
396
  }
397
+ app.all("/**", (event) => {
398
+ const response = errorResponse(new ActionError("not_found", `No route for ${event.req.method} ${event.url.pathname}`));
399
+ response.headers.set(UNROUTED_HEADER, "1");
400
+ return response;
401
+ });
296
402
  return {
297
- ...(agentUi
298
- ? { installUiManifest: (source) => agentUi.install(source) }
299
- : {}),
403
+ installUiManifest: (source) => {
404
+ refuseShadowedRoutes(source(), routes);
405
+ agentUi?.install(source);
406
+ },
300
407
  fetch: (request) => {
301
408
  const response = Promise.resolve(app.fetch(request));
302
409
  const settled = () => void inflight.delete(response);
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,qBAAqB,GAEtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,WAAW,GAIZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAElB,OAAO,GAER,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAgB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAClF,OAAO,EAAqB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,WAAW,EAAqB,MAAM,WAAW,CAAC;AAC3D,OAAO,EAGL,QAAQ,EACR,oBAAoB,EACpB,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAQnE,OAAO,EAAE,iBAAiB,EAAiB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAqC9D,MAAM,cAAc,GAAG;IACrB,SAAS,EAAE,GAAG;IACd,aAAa,EAAE,GAAG;IAClB,QAAQ,EAAE,GAAG;IACb,oBAAoB,EAAE,GAAG;IACzB,wBAAwB,EAAE,GAAG;IAC7B,eAAe,EAAE,GAAG;IACpB,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;CACqC,CAAC;AAErD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AAE1F,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,KAAK,YAAY,WAAW;QAC9B,OAAO,IAAI,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IACrE,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAc;IAC/C,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE;QACzC,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC;KACzC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,SAAS;IACT,UAAU;IACV,KAAK;IACL,MAAM;IACN,IAAI;CACL,CAAC,CAAC;AAEH,SAAS,YAAY,CACnB,OAAgC,EAChC,QAAkC;IAElC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7D,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CACf,QAAkC;IAElC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,KAAK,MAAM,OAAO,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,OAAuB,EAAE,OAAgB;IACtD,OAAO,KAAK,EAAE,OAAgB,EAAmB,EAAE,CACjD,cAAc,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,YAAY,CAAC,OAAuB,EAAE,OAAgB;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,KAAK,EAAE,KAAc,EAAiC,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAyB;IAEzB,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,YAAY,EACpB,OAAO,GAAG,EAAE,EACZ,QAAQ,GAAG,iBAAiB,EAC5B,IAAI,GAAG,EAAE,EACT,QAAQ,EACR,GAAG,GAAG,EAAE,EACR,IAAI,GAAG,EAAE,EACT,OAAO,EAAE,cAAc,GAAG,EAAE,GAC7B,GAAG,OAAO,CAAC;IACZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtF,MAAM,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,WAAW,GAAG,WAAW,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC;IACxE,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;IACxD,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,QAAmC,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,CAAC,QAAQ,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,WAAW;YAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAkB,CAAC,CAAC;QACzE,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC,CAAC;IACR,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,IAAI,GAAe;QACvB,QAAQ;QACR,QAAQ;QACR,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,iBAAiB,EAAE,MAAM,IAAI,OAAO,IAAI,IAAI,KAAK,SAAS;QAC1D,QAAQ,EAAE,OAAO;QACjB,KAAK;QACL,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YACvC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC3D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,eAAe,CAAC,MAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,MAAM,KAAK,EAAE,CAAC;YACd,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChC,eAAe,CAAC,EAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC7D,CAAC;QACJ,CAAC;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GACX,cAAc,KAAK,KAAK;QACtB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,aAAa,CAAC;YACZ,GAAG,cAAc;YACjB,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;SAC/D,CAAC,CAAC;IACT,MAAM,SAAS,GAAG,CAAC,QAAwB,EAAgB,EAAE,CAC3D,kBAAkB,CAAC;QACjB,OAAO,EAAE,QAAQ;QACjB,KAAK;QACL,OAAO;QACP,QAAQ;QACR,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,OAAO,EAAE,KAAK;QACxB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,KAAK;QACL,KAAK;KACN,CAAC,CAAC;IACL,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,IAAI,OAAkC,CAAC;IAEvC,IAAI,IAAI,KAAK,KAAK;QAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,WAAW,EAAE,KAAK,EAAE,KAAK,EAA0B,EAAE;QACtE,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,OAAO,GAAoB;YAC/B,QAAQ,EAAE,gBAAgB;YAC1B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;YAAE,OAAO,OAAO,CAAC;QACnE,MAAM,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7C,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC3E,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,KAAK,EAAE,KAAqB,EAAE,OAAgB,EAAE,EAAE;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACtF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAChD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC9C,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC7C,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;oBACtE,CAAC,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CACnC,IAAI,EACJ,KAAK,EACL,KAAK,CAAC,GAAG,EACT,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EACnB,EAAE,OAAO,EAAE,eAAe,EAAE,CAC7B,CAAC;oBACF,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;gBACnD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;gBACjD,CAAC,CAAC,KAAK,CAAC,IAAI;gBACZ,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACtB,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACzC,IAAI,CAAC;oBACH,MAAM,KAAK,EAAE,CAAC;oBACd,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,OAAO;YACpB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAO;gBACb,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB;oBACpC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;oBACrD,CAAC,CAAC,EAAE,CAAC;aACR;YACH,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,OAAO;YACP,MAAM;YACN,OAAO;YACP,OAAO;YACP,GAAG,EAAE,MAAM;YACX,GAAG,GAAG;SACP,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM,UAAU,GACd,OAAO,CAAC,IAAI,KAAK,iBAAiB;oBAClC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAC5B,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAC5C,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC,CAAC;gBACL,OAAO,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACnC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,kBAAkB,CAAC,GAAG,EAAE;YACtB,QAAQ;YACR,IAAI,EAAE,QAAQ;YACd,GAAG;YACH,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YACxD,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;YAC9D,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;gBAC7B,OAAO;oBACL,SAAS;oBACT,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;oBACvD,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW;wBACxC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;wBACtC,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,WAAW,EAAE,SAAS;YACjC,cAAc,EAAE,WAAW,EAAE,cAAc;YAC3C,QAAQ,EAAE;gBACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAmB,EAAE,CACnD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CACzC;aACF;YACD,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,qBAAqB,CAAC,GAAG,EAAE;YACzB,QAAQ;YACR,OAAO;YACP,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;YAC9D,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,GAAG,CAAC,OAAO;YACT,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,MAAwB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC9E,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CACV,CAAC,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC;YACjB,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3E,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { pagePattern, UNROUTED_HEADER } from \"@parlor/agent-ui\";\nimport {\n type AgentUiOptions,\n createAgentUi,\n registerAgentUiRoutes,\n type UiManifestInput,\n type UiManifestSource,\n} from \"@parlor/agent-ui/server\";\nimport {\n ActionError,\n type ActionErrorCode,\n type ActionMap,\n ANONYMOUS,\n type DataProvider,\n} from \"@parlor/core\";\nimport type { ActionRegistry } from \"@parlor/core/registry\";\nimport type { ServerChannel } from \"@parlor/sync\";\nimport {\n ensureSyncTables,\n recordSyncEvent,\n registerSyncRoutes,\n type SyncDatabase,\n SyncHub,\n type SyncTransport,\n} from \"@parlor/sync/server\";\nimport { H3, type H3Event, readBody } from \"h3\";\n\nimport { admits, requireAccess, requireSurface, type Surface } from \"./access.js\";\nimport { type ActionRunner, createActionRunner } from \"./actions.js\";\nimport { AuthFailure, type AuthProvider } from \"./auth.js\";\nimport {\n type Caller,\n type CallerResolver,\n clientOf,\n createCallerResolver,\n sourceOf,\n} from \"./caller.js\";\nimport { type CorsConfig, corsMiddleware } from \"./cors.js\";\nimport { devAuth } from \"./dev-auth.js\";\nimport { createMcpHandler } from \"./mcp.js\";\nimport { applyMigrations, checkMigrations } from \"./migrations.js\";\nimport type {\n ActionAudit,\n AnyPluginRoute,\n PluginCaller,\n PluginHost,\n PluginRuntime,\n ServerPlugin,\n} from \"./plugin.js\";\nimport { DEFAULT_BASE_PATH, type Manifest, PROTOCOL_VERSION } from \"./protocol.js\";\nimport { defaultScope, type ScopeResolver } from \"./scope.js\";\n\nexport interface SyncOptions {\n readonly transport?: SyncTransport | undefined;\n readonly pollIntervalMs?: number | undefined;\n}\n\nexport interface ServerOptions<T extends ActionMap> {\n readonly actions: ActionRegistry<T>;\n readonly scope?: ScopeResolver | undefined;\n /**\n * Without it every caller is anonymous, the action source is the `x-parlor-source`\n * header, and confirmations are a UX guard.\n */\n readonly auth?: AuthProvider | undefined;\n /** Framework features with their own tables and routes, installed after `auth`. */\n readonly plugins?: readonly ServerPlugin[] | undefined;\n readonly basePath?: string | undefined;\n readonly cors?: CorsConfig | false | undefined;\n readonly database?: DataProvider | undefined;\n readonly mcp?:\n | { readonly name?: string | undefined; readonly version?: string | undefined }\n | false\n | undefined;\n readonly sync?: SyncOptions | false | undefined;\n readonly agentUi?: AgentUiOptions | false | undefined;\n}\n\ntype ManifestSummary = Pick<Manifest, \"protocol\" | \"app\">;\ntype ManifestReply = Manifest | ManifestSummary | Response;\n\nexport interface FrameworkServer {\n /**\n * Hands the server the app's page routes, called by the host before the first request.\n * Throws when a page route would take a document request meant for an absolute route.\n */\n readonly installUiManifest?: ((source: UiManifestSource) => void) | undefined;\n readonly fetch: (request: Request) => Promise<Response>;\n readonly close: () => Promise<void>;\n}\n\nconst STATUS_BY_CODE = {\n not_found: 404,\n invalid_input: 400,\n declined: 403,\n confirmation_timeout: 504,\n confirmation_unavailable: 503,\n unauthenticated: 401,\n forbidden: 403,\n internal: 500,\n} as const satisfies Record<ActionErrorCode, number>;\n\nconst isAbort = (error: unknown) => error instanceof Error && error.name === \"AbortError\";\n\nfunction toActionError(error: unknown): ActionError {\n if (error instanceof ActionError) return error;\n if (error instanceof AuthFailure)\n return new ActionError(\"unauthenticated\", error.message);\n if (!isAbort(error)) console.error(\"[parlor] action failed:\", error);\n return new ActionError(\"internal\", \"Internal error\", { cause: error });\n}\n\nfunction errorBody(event: H3Event, error: unknown) {\n const actionError = toActionError(error);\n event.res.status = STATUS_BY_CODE[actionError.code];\n return actionError.toBody();\n}\n\nfunction errorResponse(error: unknown): Response {\n const actionError = toActionError(error);\n return Response.json(actionError.toBody(), {\n status: STATUS_BY_CODE[actionError.code],\n });\n}\n\nconst PLUGIN_NAME = /^[a-z][a-z0-9-]*$/;\nconst RESERVED_NAMES: ReadonlySet<string> = new Set([\n \"actions\",\n \"manifest\",\n \"mcp\",\n \"sync\",\n \"ui\",\n]);\n\nfunction checkPlugins(\n plugins: readonly ServerPlugin[],\n database: DataProvider | undefined,\n): void {\n const names = new Set<string>();\n for (const plugin of plugins) {\n if (!PLUGIN_NAME.test(plugin.name) || RESERVED_NAMES.has(plugin.name)) {\n throw new Error(`\"${plugin.name}\" cannot name a plugin.`);\n }\n if (names.has(plugin.name))\n throw new Error(`Two plugins are named \"${plugin.name}\".`);\n names.add(plugin.name);\n checkMigrations(plugin);\n if (plugin.migrations?.length && !database) {\n throw new Error(`The \"${plugin.name}\" plugin needs a database.`);\n }\n }\n}\n\ninterface MountedRoute {\n readonly plugin: string;\n readonly route: AnyPluginRoute;\n readonly path: string;\n}\n\nconst isAbsolute = (route: AnyPluginRoute) =>\n route.absolute === true || route.path.startsWith(\"/.well-known/\");\n\nfunction mountRoutes(\n runtimes: readonly { readonly plugin: ServerPlugin; readonly runtime: PluginRuntime }[],\n basePath: string,\n): MountedRoute[] {\n const mounted: MountedRoute[] = [];\n const owners = new Map<string, string>();\n for (const { plugin, runtime } of runtimes) {\n for (const route of runtime.routes ?? []) {\n if (!isAbsolute(route)) {\n mounted.push({\n plugin: plugin.name,\n route,\n path: `${basePath}/${plugin.name}${route.path}`,\n });\n continue;\n }\n const { method, path } = route;\n if (route.absolute && /[:*]/.test(path)) {\n throw new Error(\n `The \"${plugin.name}\" plugin's absolute route ${method} ${path} must be a static path.`,\n );\n }\n if (path === basePath || path.startsWith(`${basePath}/`)) {\n throw new Error(\n `The \"${plugin.name}\" plugin's absolute route ${method} ${path} is under ${basePath}, which the framework serves.`,\n );\n }\n const key = `${method} ${path}`;\n const owner = owners.get(key);\n if (owner !== undefined) {\n throw new Error(\n owner === plugin.name\n ? `The \"${owner}\" plugin serves ${key} twice.`\n : `The \"${owner}\" and \"${plugin.name}\" plugins both serve ${key}.`,\n );\n }\n owners.set(key, plugin.name);\n mounted.push({ plugin: plugin.name, route, path });\n }\n }\n return mounted;\n}\n\nfunction refuseShadowedRoutes(\n manifest: UiManifestInput | undefined,\n routes: readonly MountedRoute[],\n): void {\n if (!manifest) return;\n const pages = manifest.routes.map((page) => ({\n page,\n pattern: pagePattern(page.path),\n }));\n for (const { plugin, route } of routes) {\n if (!route.absolute || route.method !== \"GET\") continue;\n const shadow = pages.find(({ pattern }) => pattern.test(route.path));\n if (shadow) {\n throw new Error(\n `The \"${plugin}\" plugin's absolute route GET ${route.path} is also matched by the page route ${shadow.page.path}, so a browser opening it would get the page. Move one of them.`,\n );\n }\n }\n}\n\nfunction auditAll(\n runtimes: readonly PluginRuntime[],\n): ((record: ActionAudit) => void) | undefined {\n const hooks = runtimes.filter((runtime) => runtime.audit);\n if (hooks.length === 0) return undefined;\n return (record) => {\n for (const runtime of hooks) runtime.audit?.(record);\n };\n}\n\ninterface Installed {\n readonly plugin: ServerPlugin;\n readonly runtime: PluginRuntime;\n}\n\nasync function allowedBy({ runtime }: Installed, caller: PluginCaller): Promise<boolean> {\n return !runtime.allows || (await runtime.allows(caller));\n}\n\nfunction admitterOf(installed: Installed) {\n return async (caller: PluginCaller): Promise<void> => {\n if (await allowedBy(installed, caller)) return;\n throw new ActionError(\n \"forbidden\",\n `This account cannot use ${installed.plugin.name}.`,\n );\n };\n}\n\n/** Joins a connection to `channel` only once the plugin admits its holder. */\nfunction gatedChannel(installed: Installed, channel: ServerChannel): ServerChannel {\n if (!installed.runtime.allows) return channel;\n return {\n event: channel.event,\n connect(connection) {\n let detach: (() => void) | undefined;\n let left = false;\n allowedBy(installed, {\n principal: connection.principal ?? ANONYMOUS,\n scope: connection.scope,\n }).then(\n (allowed) => {\n if (allowed && !left && !connection.closed?.aborted) {\n detach = channel.connect(connection);\n }\n },\n (error: unknown) => {\n console.error(`[parlor] ${installed.plugin.name}: access check failed:`, error);\n },\n );\n return () => {\n left = true;\n detach?.();\n };\n },\n };\n}\n\nfunction guard(callers: CallerResolver, surface: Surface) {\n return async (request: Request): Promise<Caller> =>\n requireSurface(await callers(request), surface, callers.enforcing);\n}\n\nfunction refuseUnless(callers: CallerResolver, surface: Surface) {\n const check = guard(callers, surface);\n return async (event: H3Event): Promise<Response | undefined> => {\n try {\n await check(event.req);\n return undefined;\n } catch (error) {\n return errorResponse(error);\n }\n };\n}\n\nexport function createServer<T extends ActionMap>(\n options: ServerOptions<T>,\n): FrameworkServer {\n const {\n actions,\n scope = defaultScope,\n plugins = [],\n basePath = DEFAULT_BASE_PATH,\n cors = {},\n database,\n mcp = {},\n sync = {},\n agentUi: agentUiOptions = {},\n } = options;\n const auth = options.auth ?? (process.env.PARLOR_DEV === \"1\" ? devAuth() : undefined);\n const app = new H3();\n const appName = process.env.PARLOR_APP_NAME || undefined;\n const syncOptions = sync === false ? undefined : sync;\n const syncEnabled = syncOptions !== undefined && database !== undefined;\n const installed = [...(auth ? [auth] : []), ...plugins];\n checkPlugins(installed, database);\n let prepared: Promise<void> | undefined;\n const ready = () =>\n (prepared ??= (async () => {\n if (database) {\n await database.prepare?.();\n if (syncEnabled) await ensureSyncTables(database.read() as SyncDatabase);\n await applyMigrations(database, installed);\n }\n for (const { runtime } of runtimes) runtime.start?.();\n })());\n const callers = createCallerResolver(auth, scope, ready);\n const host: PluginHost = {\n basePath,\n database,\n ...(auth ? { auth } : {}),\n authMisconfigured: \"auth\" in options && auth === undefined,\n callerOf: callers,\n allows: async (name, caller) => {\n const entry = runtimes.find(({ plugin }) => plugin.name === name);\n return entry === undefined || (await allowedBy(entry, caller));\n },\n ready,\n announce: async (target, tags, within) => {\n if (!syncEnabled || !database || tags.length === 0) return;\n if (within !== undefined) {\n await recordSyncEvent(within as SyncDatabase, { scope: target, tags });\n return;\n }\n await ready();\n await database.transaction((tx) =>\n recordSyncEvent(tx as SyncDatabase, { scope: target, tags }),\n );\n },\n };\n const runtimes: Installed[] = installed.map((plugin) => ({\n plugin,\n runtime: plugin.setup(host),\n }));\n const routes = mountRoutes(runtimes, basePath);\n const audit = auditAll(runtimes.map(({ runtime }) => runtime));\n const agentUi =\n agentUiOptions === false\n ? undefined\n : createAgentUi({\n ...agentUiOptions,\n audience: async (request) => (await callers(request)).audience,\n });\n const runnerFor = (\n registry: ActionRegistry,\n admit?: (caller: Caller) => Promise<void>,\n ): ActionRunner =>\n createActionRunner({\n actions: registry,\n scope,\n callers,\n database,\n sync: syncEnabled,\n onClient: agentUi?.touch,\n confirm: agentUi?.confirm,\n audit,\n admit,\n ready,\n });\n const runner = runnerFor(actions);\n const hub = database ? new SyncHub(database) : undefined;\n const inflight = new Set<Promise<unknown>>();\n let closing: Promise<void> | undefined;\n\n if (cors !== false) app.use(corsMiddleware(cors));\n\n app.get(`${basePath}/manifest`, async (event): Promise<ManifestReply> => {\n let caller: Caller;\n try {\n caller = await callers(event.req);\n } catch (error) {\n return errorResponse(error);\n }\n const summary: ManifestSummary = {\n protocol: PROTOCOL_VERSION,\n ...(appName ? { app: { name: appName } } : {}),\n };\n if (!admits(\"manifest\", caller, callers.enforcing)) return summary;\n const ui = agentUi?.manifest();\n return { ...summary, actions: actions.describe(), ...(ui ? { ui } : {}) };\n });\n\n app.post(`${basePath}/actions/:name`, async (event) => {\n const name = event.context.params?.name ?? \"\";\n try {\n const input = await readBody(event).catch(() => {\n throw new ActionError(\"invalid_input\", \"Request body must be JSON\");\n });\n const result = await runner.run(name, input, event.req, sourceOf(event.req), {\n surface: \"actions\",\n cursor: true,\n });\n return { data: result.data, tags: result.reads, cursor: result.cursor };\n } catch (error) {\n return errorBody(event, error);\n }\n });\n\n const handleRoute = async (\n route: AnyPluginRoute,\n request: Request,\n admit: (caller: PluginCaller) => Promise<void>,\n ) => {\n if (route.access === \"public\") return route.handle(request);\n const caller = requireAccess(await callers(request), route.access, callers.enforcing);\n await admit(caller);\n return route.handle(request, caller);\n };\n\n const admitters = new Map(\n runtimes.map((entry) => [entry.plugin.name, admitterOf(entry)]),\n );\n for (const entry of runtimes) {\n const { plugin, runtime } = entry;\n if (runtime.actions) {\n const admit = admitters.get(plugin.name)!;\n const pluginRunner = runnerFor(runtime.actions, runtime.allows ? admit : undefined);\n app.post(`${basePath}/${plugin.name}/actions/:name`, async (event) => {\n const name = event.context.params?.name ?? \"\";\n try {\n const input = await readBody(event).catch(() => {\n throw new ActionError(\"invalid_input\", \"Request body must be JSON\");\n });\n const result = await pluginRunner.run(\n name,\n input,\n event.req,\n sourceOf(event.req),\n { surface: \"pluginActions\", cursor: true },\n );\n return { data: result.data, tags: result.reads, cursor: result.cursor };\n } catch (error) {\n return errorBody(event, error);\n }\n });\n }\n }\n for (const { plugin, route, path } of routes) {\n const admit = admitters.get(plugin)!;\n app.on(route.method, path, async (event) => {\n try {\n await ready();\n return await handleRoute(route, event.req, admit);\n } catch (error) {\n return errorResponse(error);\n }\n });\n }\n\n if (mcp !== false) {\n const mcpApp = appName\n ? {\n name: appName,\n ...(process.env.PARLOR_APP_DESCRIPTION\n ? { description: process.env.PARLOR_APP_DESCRIPTION }\n : {}),\n }\n : undefined;\n const handler = createMcpHandler({\n actions,\n runner,\n agentUi,\n callers,\n app: mcpApp,\n ...mcp,\n });\n const guardMcp = guard(callers, \"mcp\");\n app.all(`${basePath}/mcp`, async (event) => {\n try {\n await guardMcp(event.req);\n } catch (error) {\n const refusal = toActionError(error);\n const challenged =\n refusal.code === \"unauthenticated\" ||\n (await callers(event.req).then(\n ({ principal }) => principal.kind === \"host\",\n () => false,\n ));\n return challenged && auth ? auth.challenge(event.req) : errorResponse(refusal);\n }\n return handler.fetch(event.req);\n });\n }\n\n if (syncEnabled && database && hub) {\n app.use(`${basePath}/sync/**`, refuseUnless(callers, \"sync\"));\n app.use(`${basePath}/sync/**`, async () => {\n await ready();\n });\n registerSyncRoutes(app, {\n basePath,\n data: database,\n hub,\n scope: async (request) => (await callers(request)).scope,\n audience: async (request) => (await callers(request)).audience,\n authority: async (request) => {\n const caller = await callers(request);\n const { principal } = caller;\n return {\n principal,\n channels: admits(\"channels\", caller, callers.enforcing),\n ...(auth && principal.kind !== \"anonymous\"\n ? { revoked: auth.revoked(principal) }\n : {}),\n };\n },\n transport: syncOptions?.transport,\n pollIntervalMs: syncOptions?.pollIntervalMs,\n channels: [\n ...(agentUi ? [agentUi.channel] : []),\n ...runtimes.flatMap((entry): ServerChannel[] =>\n entry.runtime.channel ? [gatedChannel(entry, entry.runtime.channel)] : [],\n ),\n ],\n clientId: clientOf,\n });\n }\n\n if (agentUi) {\n app.use(`${basePath}/ui`, refuseUnless(callers, \"ui\"));\n registerAgentUiRoutes(app, {\n basePath,\n agentUi,\n audience: async (request) => (await callers(request)).audience,\n clientId: clientOf,\n });\n }\n\n app.all(\"/**\", (event) => {\n const response = errorResponse(\n new ActionError(\n \"not_found\",\n `No route for ${event.req.method} ${event.url.pathname}`,\n ),\n );\n response.headers.set(UNROUTED_HEADER, \"1\");\n return response;\n });\n\n return {\n installUiManifest: (source) => {\n refuseShadowedRoutes(source(), routes);\n agentUi?.install(source);\n },\n fetch: (request) => {\n const response = Promise.resolve(app.fetch(request));\n const settled = () => void inflight.delete(response);\n inflight.add(response);\n response.then(settled, settled);\n return response;\n },\n close: () =>\n (closing ??= (async () => {\n agentUi?.close();\n await Promise.allSettled(runtimes.map(({ runtime }) => runtime.close?.()));\n await Promise.all([hub?.stop(), Promise.allSettled([...inflight])]);\n await database?.close?.();\n })()),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dev-auth.js","sourceRoot":"","sources":["../src/dev-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev-auth.js","sourceRoot":"","sources":["../src/dev-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\n\nimport {\n ANONYMOUS,\n type AgentPrincipal,\n asId,\n DEV_USER_ID,\n type HostPrincipal,\n type Principal,\n} from \"@parlor/core\";\n\nimport { AuthFailure, type AuthProvider, type TurnDelegation } from \"./auth.js\";\n\nexport const DEV_AUTH_PLUGIN = \"dev-auth\";\n\nexport { DEV_USER_ID };\n\n/** `POST /_parlor/dev-auth/host`: mints the dev host token for a loopback caller. */\nexport const DEV_HOST_PATH = \"/host\";\n\nexport interface DevAuthOptions {\n readonly secret?: Uint8Array | undefined;\n}\n\nconst HOST_TYP = \"parlor-dev-host+jwt\";\nconst TURN_TYP = \"parlor-turn+jwt\";\nconst HOST_AUDIENCE = \"parlor:host\";\nconst TURN_AUDIENCE = \"parlor:mcp\";\nconst DEV_GRANT = asId(\"grant\", \"dev\");\nconst DEV_HOST = asId(\"host\", \"dev\");\n\ninterface TurnClaims {\n readonly aud: typeof TURN_AUDIENCE;\n readonly sub: string;\n readonly hid: string;\n readonly thr: string;\n readonly trn: string;\n readonly cid: string;\n readonly agt: string;\n readonly iat: number;\n readonly exp: number;\n}\n\ntype Fields = Readonly<Record<string, unknown>>;\n\nconst encode = (value: unknown) =>\n Buffer.from(JSON.stringify(value)).toString(\"base64url\");\n\nfunction decode(segment: string | undefined): Fields | undefined {\n if (!segment) return undefined;\n try {\n const value: unknown = JSON.parse(Buffer.from(segment, \"base64url\").toString(\"utf8\"));\n return typeof value === \"object\" && value !== null ? (value as Fields) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isLoopback(ip: string | undefined): boolean {\n if (ip === undefined) return false;\n return ip === \"::1\" || ip.startsWith(\"127.\") || ip.startsWith(\"::ffff:127.\");\n}\n\nconst refuse = (message: string) =>\n Response.json({ error: { code: \"forbidden\", message } }, { status: 403 });\n\n/**\n * What `parlor dev` installs when the app has no auth provider. Not enforcing, so the\n * browser and external MCP clients keep today's anonymous, header-declared behavior; it\n * only adds the host and turn tokens the local inline agent needs. Both are signed with a\n * per-process secret, so restarting the server revokes them all.\n */\nexport function devAuth(options: DevAuthOptions = {}): AuthProvider {\n const secret = options.secret ?? randomBytes(32);\n const mac = (input: string) =>\n createHmac(\"sha256\", secret).update(input).digest(\"base64url\");\n const sign = (typ: string, claims: object) => {\n const input = `${encode({ alg: \"HS256\", typ })}.${encode(claims)}`;\n return `${input}.${mac(input)}`;\n };\n const verify = (token: string, typ: string): Fields | undefined => {\n const [header, payload, signature, ...rest] = token.split(\".\");\n if (rest.length > 0 || !header || !payload || !signature) return undefined;\n const expected = Buffer.from(mac(`${header}.${payload}`));\n const given = Buffer.from(signature);\n if (given.length !== expected.length || !timingSafeEqual(given, expected)) {\n return undefined;\n }\n return decode(header)?.typ === typ ? decode(payload) : undefined;\n };\n const typOf = (token: string) => decode(token.split(\".\")[0])?.typ;\n\n const hostOf = (token: string): HostPrincipal => {\n if (verify(token, HOST_TYP)?.aud !== HOST_AUDIENCE) {\n throw new AuthFailure(\"invalid\", \"This computer is not connected.\");\n }\n return { kind: \"host\", userId: DEV_USER_ID, grantId: DEV_GRANT, hostId: DEV_HOST };\n };\n\n const agentOf = (token: string): AgentPrincipal => {\n const claims = verify(token, TURN_TYP) as Partial<TurnClaims> | undefined;\n if (\n claims?.aud !== TURN_AUDIENCE ||\n typeof claims.exp !== \"number\" ||\n !claims.hid ||\n !claims.thr ||\n !claims.trn ||\n typeof claims.cid !== \"string\" ||\n !claims.agt\n ) {\n throw new AuthFailure(\"invalid\", \"The turn token is not valid.\");\n }\n if (claims.exp * 1000 <= Date.now()) {\n throw new AuthFailure(\"expired\", \"The turn is over.\");\n }\n return {\n kind: \"agent\",\n userId: DEV_USER_ID,\n grantId: DEV_GRANT,\n agent: { name: claims.agt, verified: true },\n turn: {\n threadId: asId(\"thread\", claims.thr),\n turnId: asId(\"turn\", claims.trn),\n hostId: asId(\"host\", claims.hid),\n clientId: claims.cid,\n },\n };\n };\n\n return {\n name: DEV_AUTH_PLUGIN,\n enforcing: false,\n setup: () => ({\n routes: [\n {\n method: \"POST\",\n path: DEV_HOST_PATH,\n access: \"public\",\n handle: async (request) => {\n if (request.headers.has(\"origin\")) {\n return refuse(\"The dev host token is not for web pages.\");\n }\n if (!isLoopback((request as Request & { readonly ip?: string }).ip)) {\n return refuse(\"The dev host token is only for this computer.\");\n }\n return Response.json({\n token: sign(HOST_TYP, { aud: HOST_AUDIENCE, hid: DEV_HOST }),\n hostId: DEV_HOST,\n });\n },\n },\n ],\n }),\n authenticate: async (request): Promise<Principal> => {\n const match = /^(\\w+)\\s+(\\S+)$/.exec(request.headers.get(\"authorization\") ?? \"\");\n const scheme = match?.[1]?.toLowerCase();\n const token = match?.[2];\n if (!token) return ANONYMOUS;\n if (scheme === \"parlorhost\") return hostOf(token);\n if (scheme === \"bearer\" && typOf(token) === TURN_TYP) return agentOf(token);\n return ANONYMOUS;\n },\n challenge: () =>\n Response.json(\n { error: { code: \"unauthenticated\", message: \"The turn is over.\" } },\n { status: 401 },\n ),\n revoked: () => new AbortController().signal,\n delegate: async (host: HostPrincipal, turn: TurnDelegation) => {\n const iat = Math.floor(Date.now() / 1000);\n const exp = iat + Math.ceil(turn.ttlMs / 1000);\n const claims: TurnClaims = {\n aud: TURN_AUDIENCE,\n sub: host.userId,\n hid: host.hostId,\n thr: turn.threadId,\n trn: turn.turnId,\n cid: turn.clientId,\n agt: turn.agent,\n iat,\n exp,\n };\n return { token: sign(TURN_TYP, claims), expiresAt: exp * 1000 };\n },\n };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
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";
2
+ export { type ActionRun, type ActionRunner, type Confirm, createActionRunner, type RunOptions, } from "./actions.js";
3
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
4
  export { readBoundedText } from "./body.js";
5
5
  export { REVOCATION_HORIZON_MS } from "./revocation-horizon.js";
@@ -8,7 +8,7 @@ export { type CorsConfig, isAllowedOrigin, SHELL_ORIGINS } from "./cors.js";
8
8
  export { createServer, type FrameworkServer, type ServerOptions, type SyncOptions, } from "./create-server.js";
9
9
  export { DEV_AUTH_PLUGIN, DEV_HOST_PATH, DEV_USER_ID, devAuth, type DevAuthOptions, } from "./dev-auth.js";
10
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";
11
+ export { type ActionAudit, type AnyPluginRoute, type ConfirmationAnswer, type Migration, type PluginCaller, type PluginHost, type PluginRoute, pluginRoute, type PluginRuntime, type PublicPluginRoute, type ServerPlugin, } from "./plugin.js";
12
12
  export { CLIENT_HEADER, DEFAULT_BASE_PATH, type Manifest, PROTOCOL_VERSION, SESSION_TOKEN_HEADER, SOURCE_HEADER, } from "./protocol.js";
13
13
  export { DEFAULT_SCOPE, defaultScope, type ScopeResolver } from "./scope.js";
14
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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,SAAS,EACd,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,YAAY,EACjB,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.map CHANGED
@@ -1 +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"}
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,EAIL,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,EAQL,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","sourcesContent":["export {\n type CallerOf,\n type KindsOf,\n requireAccess,\n requireSurface,\n ROUTE_ACCESS,\n type Surface,\n} from \"./access.js\";\nexport {\n type ActionRun,\n type ActionRunner,\n type Confirm,\n createActionRunner,\n type RunOptions,\n} from \"./actions.js\";\nexport {\n type AccountProfile,\n AuthFailure,\n type AuthFailureReason,\n type AuthProvider,\n type Delegation,\n type DeviceKeys,\n type DeviceVouch,\n HOST_GRANTS_TAG,\n type PresenceKey,\n type TurnDelegation,\n} from \"./auth.js\";\nexport { readBoundedText } from \"./body.js\";\nexport { REVOCATION_HORIZON_MS } from \"./revocation-horizon.js\";\nexport {\n type Caller,\n type CallerResolver,\n clientOf,\n createCallerResolver,\n sourceFor,\n sourceOf,\n} from \"./caller.js\";\nexport { type CorsConfig, isAllowedOrigin, SHELL_ORIGINS } from \"./cors.js\";\nexport {\n createServer,\n type FrameworkServer,\n type ServerOptions,\n type SyncOptions,\n} from \"./create-server.js\";\nexport {\n DEV_AUTH_PLUGIN,\n DEV_HOST_PATH,\n DEV_USER_ID,\n devAuth,\n type DevAuthOptions,\n} from \"./dev-auth.js\";\nexport { createMcpHandler, type McpOptions } from \"./mcp.js\";\nexport {\n type ActionAudit,\n type AnyPluginRoute,\n type ConfirmationAnswer,\n type Migration,\n type PluginCaller,\n type PluginHost,\n type PluginRoute,\n pluginRoute,\n type PluginRuntime,\n type PublicPluginRoute,\n type ServerPlugin,\n} from \"./plugin.js\";\nexport {\n CLIENT_HEADER,\n DEFAULT_BASE_PATH,\n type Manifest,\n PROTOCOL_VERSION,\n SESSION_TOKEN_HEADER,\n SOURCE_HEADER,\n} from \"./protocol.js\";\nexport { DEFAULT_SCOPE, defaultScope, type ScopeResolver } from \"./scope.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-calls.js","sourceRoot":"","sources":["../src/mcp-calls.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAQ;IACV,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE7D,KAAK,CAAC,GAAG,CACP,OAA4B,EAC5B,EAAa,EACb,OAA+B,EAC/B,IAAyC;QAEzC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAmB,CAAC;QACpE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAgB,EAAE,EAAa,EAAE,MAAe;QACrD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,YAAY,CAAU,CAAC;AAEvF,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,EAAa,EAAU,EAAE,CACxD,IAAI,CAAC,SAAS,CAAC;IACb,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACzE,EAAE;CACH,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-calls.js","sourceRoot":"","sources":["../src/mcp-calls.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAQ;IACV,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE7D,KAAK,CAAC,GAAG,CACP,OAA4B,EAC5B,EAAa,EACb,OAA+B,EAC/B,IAAyC;QAEzC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAmB,CAAC;QACpE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAgB,EAAE,EAAa,EAAE,MAAe;QACrD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,YAAY,CAAU,CAAC;AAEvF,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,EAAa,EAAU,EAAE,CACxD,IAAI,CAAC,SAAS,CAAC;IACb,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACzE,EAAE;CACH,CAAC,CAAC","sourcesContent":["import type { RequestId } from \"@modelcontextprotocol/server\";\n\nexport class McpCalls {\n readonly #inFlight = new Map<string, Set<AbortController>>();\n\n async run<T>(\n request: Request | undefined,\n id: RequestId,\n signals: readonly AbortSignal[],\n work: (signal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n if (!request) return work(AbortSignal.any([...signals]));\n const key = keyOf(request, id);\n const cancellation = new AbortController();\n const calls = this.#inFlight.get(key) ?? new Set<AbortController>();\n calls.add(cancellation);\n this.#inFlight.set(key, calls);\n try {\n return await work(AbortSignal.any([...signals, cancellation.signal]));\n } finally {\n calls.delete(cancellation);\n if (calls.size === 0) this.#inFlight.delete(key);\n }\n }\n\n cancel(request: Request, id: RequestId, reason: unknown): void {\n for (const call of this.#inFlight.get(keyOf(request, id)) ?? [])\n call.abort(reason ?? new DOMException(\"The call was cancelled.\", \"AbortError\"));\n }\n}\n\nconst IDENTIFYING_HEADERS = [\"authorization\", \"mcp-session-id\", \"user-agent\"] as const;\n\nconst keyOf = (request: Request, id: RequestId): string =>\n JSON.stringify([\n ...IDENTIFYING_HEADERS.map((header) => request.headers.get(header) ?? \"\"),\n id,\n ]);\n"]}
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CLIENT_INFO_META_KEY,\n type CallToolResult,\n createMcpHandler as createSdkHandler,\n type McpHttpHandler,\n type McpRequestContext,\n McpServer,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\nimport type { AgentOrigin, UiError } from \"@parlor/agent-ui\";\nimport { type AgentUi, UI_MANIFEST_RESOURCE, UiFailure } from \"@parlor/agent-ui/server\";\nimport {\n ActionError,\n type ActionErrorCode,\n type ActionMap,\n type AnyAction,\n isMutating,\n} from \"@parlor/core\";\nimport type { ActionRegistry } from \"@parlor/core/registry\";\n\nimport type { ActionRunner } from \"./actions.js\";\nimport type { CallerResolver } from \"./caller.js\";\nimport { McpCalls } from \"./mcp-calls.js\";\n\nexport interface McpOptions<T extends ActionMap> {\n readonly actions: ActionRegistry<T>;\n readonly runner: ActionRunner;\n readonly name?: string | undefined;\n readonly version?: string | undefined;\n /**\n * Which app these tools belong to, told to every MCP client, so an agent connected to\n * several Parlor apps keeps them apart.\n */\n readonly app?:\n | { readonly name: string; readonly description?: string | undefined }\n | undefined;\n readonly agentUi?: AgentUi | undefined;\n readonly callers?: CallerResolver | undefined;\n}\n\n/** The public origin first, then the one `parlor dev` serves the app on, then the request's. */\nfunction appOrigin(request: Request | undefined): string | undefined {\n const configured = process.env.PARLOR_ORIGIN || process.env.PARLOR_WEB_ORIGIN;\n if (configured) return new URL(configured).origin;\n return request ? new URL(request.url).origin : undefined;\n}\n\nexport function appIdentity(\n app: McpOptions<ActionMap>[\"app\"],\n origin: string | undefined,\n): string {\n const where = origin ? ` at ${origin}` : \"\";\n const what = app?.description ? ` ${app.description.trim()}` : \"\";\n const who = app ? app.name : \"this app\";\n return `These tools belong to ${who}${where}.${what} They act only on ${who}, as the signed-in user; any other app's tools are a separate server.`;\n}\n\nfunction toolResult(result: unknown): CallToolResult {\n const text = result === undefined ? \"ok\" : JSON.stringify(result, null, 2);\n return {\n content: [{ type: \"text\", text }],\n ...(result !== null && typeof result === \"object\" && !Array.isArray(result)\n ? { structuredContent: result as Record<string, unknown> }\n : {}),\n };\n}\n\ninterface ToolErrorBody {\n readonly code: UiError[\"code\"] | ActionErrorCode;\n readonly message: string;\n readonly issues?:\n | readonly { readonly path: string; readonly message: string }[]\n | undefined;\n}\n\nfunction errorBodyOf(error: unknown): ToolErrorBody {\n if (error instanceof UiFailure) return error.error;\n if (error instanceof ActionError) {\n return {\n code: error.code,\n message: error.message,\n ...(error.issues\n ? {\n issues: error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n })),\n }\n : {}),\n };\n }\n return { code: \"internal\", message: \"Internal error\" };\n}\n\nfunction toolError(error: unknown): CallToolResult {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: errorBodyOf(error) }, null, 2) },\n ],\n };\n}\n\n/**\n * The SDK answers bad arguments in plain text before the handler runs. A schema that lists\n * as the original but accepts anything leaves the check to the handler, which fails in the\n * one error body.\n */\nfunction unvalidated(schema: StandardSchemaWithJSON): StandardSchemaWithJSON {\n return { \"~standard\": { ...schema[\"~standard\"], validate: (value) => ({ value }) } };\n}\n\nfunction actionDescription(action: AnyAction): string {\n return action.confirm\n ? `${action.description} When an agent calls it, the user must approve it in the app first; the call waits for that answer and fails with declined, confirmation_timeout or confirmation_unavailable without running.`\n : action.description;\n}\n\nexport const PROGRESS_INTERVAL_MS = 10_000;\n\nasync function verifiedOrigin(\n callers: CallerResolver | undefined,\n request: Request | undefined,\n ctx: ServerContext,\n): Promise<AgentOrigin> {\n const caller = callers && request ? await callers(request) : undefined;\n const principal = caller?.principal;\n if (principal?.kind === \"agent\" && principal.turn) {\n return { via: \"agent\", name: principal.agent.name };\n }\n if (principal?.kind === \"agent\" && principal.agent.verified) {\n return { via: \"mcp\", name: principal.agent.name };\n }\n return originOf(ctx);\n}\n\nasync function turnClientOf(\n callers: CallerResolver | undefined,\n request: Request | undefined,\n): Promise<{ readonly clientId: string } | undefined> {\n const principal = callers && request ? (await callers(request)).principal : undefined;\n return principal?.kind === \"agent\" && principal.turn\n ? { clientId: principal.turn.clientId }\n : undefined;\n}\n\nexport function originOf(ctx: ServerContext): AgentOrigin {\n const envelope: Readonly<Record<string, unknown>> | undefined = ctx.mcpReq.envelope;\n const info = envelope?.[CLIENT_INFO_META_KEY];\n const name =\n typeof info === \"object\" && info !== null\n ? (info as { name?: unknown }).name\n : undefined;\n return typeof name === \"string\" && name !== \"\" ? { via: \"mcp\", name } : { via: \"mcp\" };\n}\n\nexport async function withProgress<T>(\n ctx: ServerContext,\n work: () => Promise<T>,\n intervalMs: number = PROGRESS_INTERVAL_MS,\n): Promise<T> {\n const progressToken = ctx.mcpReq._meta?.progressToken;\n if (progressToken === undefined) return work();\n let progress = 0;\n const timer = setInterval(() => {\n ctx.mcpReq\n .notify({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: ++progress,\n message: \"Waiting for the user to approve in the app\",\n },\n })\n .catch(() => {});\n }, intervalMs);\n try {\n return await work();\n } finally {\n clearInterval(timer);\n }\n}\n\nexport function createMcpHandler<T extends ActionMap>(\n options: McpOptions<T>,\n): McpHttpHandler {\n const {\n actions,\n runner,\n agentUi,\n callers,\n app,\n name = app?.name ?? \"parlor\",\n version = \"0.0.0\",\n } = options;\n\n const calls = new McpCalls();\n\n const inCall = <R>(\n ctx: McpRequestContext,\n toolCtx: ServerContext,\n work: (signal: AbortSignal) => Promise<R>,\n ): Promise<R> =>\n calls.run(\n ctx.requestInfo,\n toolCtx.mcpReq.id,\n [...(ctx.requestInfo ? [ctx.requestInfo.signal] : []), toolCtx.mcpReq.signal],\n work,\n );\n\n const factory = (ctx: McpRequestContext) => {\n const instructions = [\n appIdentity(app, appOrigin(ctx.requestInfo)),\n agentUi?.instructions(\"mcp\"),\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n const server = new McpServer(\n { name, version, ...(app ? { title: app.name } : {}) },\n { instructions },\n );\n server.server.setNotificationHandler(\"notifications/cancelled\", (notification) => {\n const { requestId, reason } = notification.params;\n if (ctx.requestInfo && requestId !== undefined)\n calls.cancel(ctx.requestInfo, requestId, reason);\n });\n for (const actionName of actions.names()) {\n const action = actions.get(actionName);\n if (!action) continue;\n server.registerTool(\n actionName,\n {\n description: actionDescription(action),\n inputSchema: unvalidated(action.input),\n annotations: { readOnlyHint: !isMutating(action) },\n },\n async (args, toolCtx) => {\n try {\n const origin = await verifiedOrigin(callers, ctx.requestInfo, toolCtx);\n const result = await inCall(ctx, toolCtx, (signal) => {\n const run = () =>\n runner.run(actionName, args, ctx.requestInfo, \"mcp\", { signal, origin });\n return action.confirm ? withProgress(toolCtx, run) : run();\n });\n return toolResult(result.data);\n } catch (error) {\n return toolError(error);\n }\n },\n );\n }\n const uiTools = agentUi?.tools(\"mcp\") ?? [];\n const uiManifest = uiTools.length > 0 ? agentUi?.manifest() : undefined;\n if (uiManifest) {\n server.registerResource(\n \"ui-manifest\",\n UI_MANIFEST_RESOURCE,\n {\n description:\n \"The app's pages and the views they show, with full JSON schemas for each view's value.\",\n mimeType: \"application/json\",\n },\n (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(uiManifest, null, 2),\n },\n ],\n }),\n );\n }\n for (const tool of uiTools) {\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: unvalidated(tool.input),\n annotations: { readOnlyHint: tool.readOnly },\n },\n async (args, toolCtx) => {\n try {\n const input = tool.input.safeParse(args);\n if (!input.success) {\n throw new ActionError(\"invalid_input\", `Invalid input for \"${tool.name}\"`, {\n issues: input.error.issues,\n });\n }\n return toolResult(\n await inCall(ctx, toolCtx, async (signal) =>\n tool.run(\n input.data,\n await agentUi!.contextFor(\n ctx.requestInfo,\n await verifiedOrigin(callers, ctx.requestInfo, toolCtx),\n signal,\n await turnClientOf(callers, ctx.requestInfo),\n ),\n ),\n ),\n );\n } catch (error) {\n if (!(error instanceof UiFailure))\n console.error(\"[parlor] UI tool failed:\", error);\n return toolError(error);\n }\n },\n );\n }\n return server;\n };\n\n return createSdkHandler(factory);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataProvider } from \"@parlor/core\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgDatabase, PgQueryResultHKT } from \"drizzle-orm/pg-core\";\n\nimport type { ServerPlugin } from \"./plugin.js\";\n\ntype Database = PgDatabase<PgQueryResultHKT>;\n\nconst MIGRATION_LOCK_KEY = 7_311_208;\n\nexport function checkMigrations(plugin: ServerPlugin): void {\n const seen = new Set<string>();\n for (const { id } of plugin.migrations ?? []) {\n if (!id.startsWith(`${plugin.name}/`)) {\n throw new Error(`Migration \"${id}\" must start with \"${plugin.name}/\".`);\n }\n if (seen.has(id)) throw new Error(`Migration \"${id}\" is listed twice.`);\n seen.add(id);\n }\n}\n\nconst DOLLAR_TAG = /^\\$[A-Za-z_]*\\$/;\n\n/**\n * PGlite refuses several commands in one prepared statement, so a migration is run one\n * statement at a time. Quotes, comments and dollar-quoted bodies may hold semicolons.\n */\nexport function splitStatements(script: string): string[] {\n const statements: string[] = [];\n let start = 0;\n let at = 0;\n const skipTo = (end: string) => {\n const close = script.indexOf(end, at);\n at = close === -1 ? script.length : close + end.length;\n };\n while (at < script.length) {\n const char = script[at]!;\n if (char === \"'\" || char === '\"') {\n at += 1;\n skipTo(char);\n } else if (script.startsWith(\"--\", at)) {\n skipTo(\"\\n\");\n } else if (script.startsWith(\"/*\", at)) {\n skipTo(\"*/\");\n } else if (char === \"$\" && DOLLAR_TAG.test(script.slice(at))) {\n const tag = DOLLAR_TAG.exec(script.slice(at))![0];\n at += tag.length;\n skipTo(tag);\n } else if (char === \";\") {\n statements.push(script.slice(start, at));\n at += 1;\n start = at;\n } else {\n at += 1;\n }\n }\n statements.push(script.slice(start));\n return statements.map((statement) => statement.trim()).filter(Boolean);\n}\n\nexport async function applyMigrations(\n database: DataProvider,\n plugins: readonly ServerPlugin[],\n): Promise<void> {\n const migrations = plugins.flatMap((plugin) => plugin.migrations ?? []);\n if (migrations.length === 0) return;\n await database.transaction(async (handle) => {\n const tx = handle as Database;\n await tx.execute(sql`select pg_advisory_xact_lock(${MIGRATION_LOCK_KEY})`);\n await tx.execute(sql`\n create table if not exists parlor_migrations (\n id text primary key,\n applied_at timestamptz not null default now()\n )`);\n const result = (await tx.execute(sql`select id from parlor_migrations`)) as\n | { rows?: { id: string }[] }\n | { id: string }[];\n const rows = Array.isArray(result) ? result : (result.rows ?? []);\n const applied = new Set(rows.map((row) => row.id));\n for (const migration of migrations) {\n if (applied.has(migration.id)) continue;\n for (const statement of splitStatements(migration.sql)) {\n await tx.execute(sql.raw(statement));\n }\n await tx.execute(sql`insert into parlor_migrations (id) values (${migration.id})`);\n }\n });\n}\n"]}
package/dist/plugin.d.ts CHANGED
@@ -6,7 +6,8 @@ import type { AuthProvider } from "./auth.js";
6
6
  import type { Caller } from "./caller.js";
7
7
  /**
8
8
  * A framework feature the app installs with `createServer({ plugins })`. It owns the
9
- * tables prefixed `parlor_<name>_` and every path under `/_parlor/<name>/`.
9
+ * tables prefixed `parlor_<name>_`, every path under `/_parlor/<name>/`, and the paths its
10
+ * absolute routes declare.
10
11
  */
11
12
  export interface ServerPlugin {
12
13
  readonly name: string;
@@ -28,9 +29,21 @@ export interface PluginRuntime {
28
29
  readonly routes?: readonly AnyPluginRoute[] | undefined;
29
30
  /** Called once per action call on every surface after it settles, whatever the outcome. */
30
31
  audit?(record: ActionAudit): void;
32
+ /**
33
+ * Starts the plugin's background work, such as timers. Called once, when the server is
34
+ * ready for its first request: some runtimes allow no timers while the app loads.
35
+ */
36
+ start?(): void;
37
+ /**
38
+ * Who may use the plugin. Everyone else gets `forbidden` from its actions and signed-in
39
+ * routes and never joins its channel. Absent admits whoever those surfaces admit.
40
+ */
41
+ allows?(caller: PluginCaller): boolean | Promise<boolean>;
31
42
  /** Runs before `close()` awaits in-flight requests, so it must end what it holds open. */
32
43
  close?(): void | Promise<void>;
33
44
  }
45
+ /** Who is asking: enough to look the user up, with no request to read. */
46
+ export type PluginCaller = Pick<Caller, "principal" | "scope">;
34
47
  export interface ActionAudit {
35
48
  readonly at: number;
36
49
  readonly action: string;
@@ -54,6 +67,11 @@ type SignedInKind = AuthenticatedPrincipal["kind"];
54
67
  export interface PluginRoute<K extends SignedInKind | "anonymous"> {
55
68
  readonly method: "GET" | "POST";
56
69
  readonly path: `/${string}`;
70
+ /**
71
+ * Serves `path` as is from the origin root instead of under `/_parlor/<plugin>/`, for URLs
72
+ * fixed outside the app, such as a payment provider's webhook. The path must be static.
73
+ */
74
+ readonly absolute?: boolean | undefined;
57
75
  readonly access: readonly K[];
58
76
  handle(request: Request, caller: CallerOf<K>): Promise<Response>;
59
77
  }
@@ -62,6 +80,8 @@ export interface PublicPluginRoute {
62
80
  readonly method: "GET" | "POST";
63
81
  /** Absolute when it starts with `/.well-known/`. */
64
82
  readonly path: `/${string}`;
83
+ /** See `PluginRoute.absolute`. */
84
+ readonly absolute?: boolean | undefined;
65
85
  readonly access: "public";
66
86
  handle(request: Request): Promise<Response>;
67
87
  }
@@ -76,6 +96,11 @@ export interface PluginHost {
76
96
  /** `createServer` got an `auth` key whose value is undefined: a sign-in setup that failed to configure. */
77
97
  readonly authMisconfigured?: boolean;
78
98
  callerOf(request: Request): Promise<Caller>;
99
+ /**
100
+ * Whether the installed plugin `name` admits `caller`, for a plugin that serves another
101
+ * one (auth pairs computers for chat). True when it is not installed or has no policy.
102
+ */
103
+ allows?(plugin: string, caller: PluginCaller): Promise<boolean>;
79
104
  /**
80
105
  * Resolves once the database holds every plugin's tables. Work a plugin starts on its own,
81
106
  * such as a timer, waits for it; request handlers need not, as the server awaits it first.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAsFA,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CACzB,KAAqB;IAErB,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA2GA,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CACzB,KAAqB;IAErB,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import type {\n ActionErrorCode,\n ActionSource,\n AuthenticatedPrincipal,\n DataProvider,\n Principal,\n Tag,\n} from \"@parlor/core\";\nimport type { ActionRegistry } from \"@parlor/core/registry\";\nimport type { ServerChannel } from \"@parlor/sync\";\n\nimport type { CallerOf } from \"./access.js\";\nimport type { AuthProvider } from \"./auth.js\";\nimport type { Caller } from \"./caller.js\";\n\n/**\n * A framework feature the app installs with `createServer({ plugins })`. It owns the\n * tables prefixed `parlor_<name>_`, every path under `/_parlor/<name>/`, and the paths its\n * absolute routes declare.\n */\nexport interface ServerPlugin {\n readonly name: string;\n readonly migrations?: readonly Migration[] | undefined;\n setup(host: PluginHost): PluginRuntime;\n}\n\n/** Applied once per database in list order. An applied id must never change. */\nexport interface Migration {\n readonly id: `${string}/${number}_${string}`;\n readonly sql: string;\n}\n\nexport interface PluginRuntime {\n /**\n * Served at `POST /_parlor/<plugin>/actions/<action>` through the same runner as the app's\n * actions, but never listed on MCP and never callable by an agent.\n */\n readonly actions?: ActionRegistry | undefined;\n readonly channel?: ServerChannel | undefined;\n readonly routes?: readonly AnyPluginRoute[] | undefined;\n /** Called once per action call on every surface after it settles, whatever the outcome. */\n audit?(record: ActionAudit): void;\n /**\n * Starts the plugin's background work, such as timers. Called once, when the server is\n * ready for its first request: some runtimes allow no timers while the app loads.\n */\n start?(): void;\n /**\n * Who may use the plugin. Everyone else gets `forbidden` from its actions and signed-in\n * routes and never joins its channel. Absent admits whoever those surfaces admit.\n */\n allows?(caller: PluginCaller): boolean | Promise<boolean>;\n /** Runs before `close()` awaits in-flight requests, so it must end what it holds open. */\n close?(): void | Promise<void>;\n}\n\n/** Who is asking: enough to look the user up, with no request to read. */\nexport type PluginCaller = Pick<Caller, \"principal\" | \"scope\">;\n\nexport interface ActionAudit {\n readonly at: number;\n readonly action: string;\n readonly principal: Principal;\n readonly source: ActionSource;\n readonly scope: string;\n /** SHA-256 of the input as received; the input itself is not kept. */\n readonly inputDigest: string;\n /** `ran` once `run` started; `refused` when the call stopped before it. */\n readonly stage: \"refused\" | \"ran\";\n readonly outcome: \"ok\" | \"cancelled\" | ActionErrorCode;\n readonly confirmation?: ConfirmationAnswer | undefined;\n}\n\nexport type ConfirmationAnswer = \"approved\" | \"declined\" | \"timeout\" | \"unavailable\";\n\ntype SignedInKind = AuthenticatedPrincipal[\"kind\"];\n\n/**\n * A plain route with no transaction or sync event. `access` decides who may call it and\n * types the caller its handler receives. An anonymous caller is admitted only when `access`\n * lists it and no enforcing auth provider is installed.\n */\nexport interface PluginRoute<K extends SignedInKind | \"anonymous\"> {\n readonly method: \"GET\" | \"POST\";\n readonly path: `/${string}`;\n /**\n * Serves `path` as is from the origin root instead of under `/_parlor/<plugin>/`, for URLs\n * fixed outside the app, such as a payment provider's webhook. The path must be static.\n */\n readonly absolute?: boolean | undefined;\n readonly access: readonly K[];\n handle(request: Request, caller: CallerOf<K>): Promise<Response>;\n}\n\n/** Callable by anyone, signed in or not: sign-in pages, OAuth endpoints. */\nexport interface PublicPluginRoute {\n readonly method: \"GET\" | \"POST\";\n /** Absolute when it starts with `/.well-known/`. */\n readonly path: `/${string}`;\n /** See `PluginRoute.absolute`. */\n readonly absolute?: boolean | undefined;\n readonly access: \"public\";\n handle(request: Request): Promise<Response>;\n}\n\nexport type AnyPluginRoute = PluginRoute<SignedInKind | \"anonymous\"> | PublicPluginRoute;\n\n/** Infers `K` from `access`, so the handler's caller type follows the list. */\nexport function pluginRoute<const K extends SignedInKind | \"anonymous\">(\n route: PluginRoute<K>,\n): PluginRoute<K> {\n return route;\n}\n\nexport interface PluginHost {\n readonly basePath: string;\n readonly database: DataProvider | undefined;\n /** The installed auth provider, for plugins that mint or look up credentials (chat). */\n readonly auth?: AuthProvider | undefined;\n /** `createServer` got an `auth` key whose value is undefined: a sign-in setup that failed to configure. */\n readonly authMisconfigured?: boolean;\n callerOf(request: Request): Promise<Caller>;\n /**\n * Whether the installed plugin `name` admits `caller`, for a plugin that serves another\n * one (auth pairs computers for chat). True when it is not installed or has no policy.\n */\n allows?(plugin: string, caller: PluginCaller): Promise<boolean>;\n /**\n * Resolves once the database holds every plugin's tables. Work a plugin starts on its own,\n * such as a timer, waits for it; request handlers need not, as the server awaits it first.\n */\n ready?(): Promise<void>;\n /**\n * Records a sync event for writes made outside an action's transaction, such as through\n * a library that holds its own connection. With `tx`, the event commits with that\n * transaction instead of its own. Does nothing when sync is off.\n */\n announce(scope: string, tags: readonly Tag[], tx?: unknown): Promise<void>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC","sourcesContent":["import type { UiManifest } from \"@parlor/agent-ui\";\nimport type { ActionDescriptor } from \"@parlor/core/registry\";\n\nexport const PROTOCOL_VERSION = 1;\nexport const DEFAULT_BASE_PATH = \"/_parlor\";\nexport const SOURCE_HEADER = \"x-parlor-source\";\nexport const CLIENT_HEADER = \"x-parlor-client\";\n/** A native shell reads its bearer session from this response header after signing in. */\nexport const SESSION_TOKEN_HEADER = \"set-auth-token\";\n\nexport interface Manifest {\n readonly protocol: typeof PROTOCOL_VERSION;\n /** What a pairing host shows locally; filled once the server knows the app's name. */\n readonly app?: { readonly name: string } | undefined;\n readonly actions: readonly ActionDescriptor[];\n readonly ui?: UiManifest | undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"revocation-horizon.js","sourceRoot":"","sources":["../src/revocation-horizon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"revocation-horizon.js","sourceRoot":"","sources":["../src/revocation-horizon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,MAAM,CAAC","sourcesContent":["/**\n * How long a revocation is remembered. Whatever it revokes must stop verifying within\n * this long, or the revocation is forgotten while the credential still works.\n */\nexport const REVOCATION_HORIZON_MS = 11 * 60_000;\n"]}
package/dist/scope.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtD,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CACjE,MAAM,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC"}
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtD,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CACjE,MAAM,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC","sourcesContent":["import { type Principal, userOf } from \"@parlor/core\";\n\n/** The tenant a request belongs to. Called once per request. */\nexport type ScopeResolver = (\n request: Request,\n principal: Principal,\n) => string | Promise<string>;\n\nexport const DEFAULT_SCOPE = \"default\";\n\nexport const defaultScope: ScopeResolver = (_request, principal) =>\n userOf(principal) ?? DEFAULT_SCOPE;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parlor/server",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "homepage": "https://cychien.github.io/parlor",
5
5
  "bugs": "https://github.com/cychien/parlor/issues",
6
6
  "license": "MIT",
@@ -24,9 +24,9 @@
24
24
  "drizzle-orm": "^0.45.4",
25
25
  "h3": "^2.0.1",
26
26
  "zod": "^4.6.5",
27
- "@parlor/agent-ui": "0.1.0",
28
- "@parlor/core": "0.1.0",
29
- "@parlor/sync": "0.1.0"
27
+ "@parlor/core": "0.2.0",
28
+ "@parlor/agent-ui": "0.2.0",
29
+ "@parlor/sync": "0.2.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@modelcontextprotocol/client": "^2.3.1",
@@ -34,7 +34,7 @@
34
34
  "srvx": "^1.0.5",
35
35
  "typescript": "^7.0.2",
36
36
  "vitest": "^5.0.3",
37
- "@parlor/data": "0.1.0"
37
+ "@parlor/data": "0.2.0"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "tsc -p tsconfig.json",