@relaycast/engine 11.1.1 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/adapters/node/index.d.ts +3 -3
  2. package/dist/adapters/node/index.d.ts.map +1 -1
  3. package/dist/adapters/node/index.js +2 -3
  4. package/dist/adapters/node/index.js.map +1 -1
  5. package/dist/adapters/node/kv.d.ts +0 -1
  6. package/dist/adapters/node/kv.d.ts.map +1 -1
  7. package/dist/adapters/node/kv.js +0 -17
  8. package/dist/adapters/node/kv.js.map +1 -1
  9. package/dist/adapters/node/presence.d.ts +18 -0
  10. package/dist/adapters/node/presence.d.ts.map +1 -1
  11. package/dist/adapters/node/presence.js +82 -0
  12. package/dist/adapters/node/presence.js.map +1 -1
  13. package/dist/adapters/node/realtime.d.ts +4 -0
  14. package/dist/adapters/node/realtime.d.ts.map +1 -1
  15. package/dist/adapters/node/realtime.js +32 -5
  16. package/dist/adapters/node/realtime.js.map +1 -1
  17. package/dist/db/migrations/0077_drop_workspace_plan.sql +4 -0
  18. package/dist/db/schema.d.ts +2 -21
  19. package/dist/db/schema.d.ts.map +1 -1
  20. package/dist/db/schema.js +0 -1
  21. package/dist/db/schema.js.map +1 -1
  22. package/dist/engine/a2a.d.ts +3 -0
  23. package/dist/engine/a2a.d.ts.map +1 -1
  24. package/dist/engine/a2a.js +1 -0
  25. package/dist/engine/a2a.js.map +1 -1
  26. package/dist/engine/action.d.ts +14 -9
  27. package/dist/engine/action.d.ts.map +1 -1
  28. package/dist/engine/action.js +335 -74
  29. package/dist/engine/action.js.map +1 -1
  30. package/dist/engine/agent.d.ts +9 -3
  31. package/dist/engine/agent.d.ts.map +1 -1
  32. package/dist/engine/agent.js +21 -3
  33. package/dist/engine/agent.js.map +1 -1
  34. package/dist/engine/delivery.d.ts.map +1 -1
  35. package/dist/engine/delivery.js +4 -0
  36. package/dist/engine/delivery.js.map +1 -1
  37. package/dist/engine/eventDelivery.d.ts +1 -1
  38. package/dist/engine/inboundWebhook.d.ts +10 -0
  39. package/dist/engine/inboundWebhook.d.ts.map +1 -1
  40. package/dist/engine/inboundWebhook.js +30 -4
  41. package/dist/engine/inboundWebhook.js.map +1 -1
  42. package/dist/engine/inbox.d.ts.map +1 -1
  43. package/dist/engine/inbox.js +17 -0
  44. package/dist/engine/inbox.js.map +1 -1
  45. package/dist/engine/invocationClaim.d.ts +32 -0
  46. package/dist/engine/invocationClaim.d.ts.map +1 -0
  47. package/dist/engine/invocationClaim.js +42 -0
  48. package/dist/engine/invocationClaim.js.map +1 -0
  49. package/dist/engine/messageMetadata.d.ts +2 -0
  50. package/dist/engine/messageMetadata.d.ts.map +1 -1
  51. package/dist/engine/messageMetadata.js +3 -2
  52. package/dist/engine/messageMetadata.js.map +1 -1
  53. package/dist/engine/node.d.ts +12 -2
  54. package/dist/engine/node.d.ts.map +1 -1
  55. package/dist/engine/node.js +83 -4
  56. package/dist/engine/node.js.map +1 -1
  57. package/dist/engine/presence.d.ts +173 -1
  58. package/dist/engine/presence.d.ts.map +1 -1
  59. package/dist/engine/presence.js +81 -4
  60. package/dist/engine/presence.js.map +1 -1
  61. package/dist/engine/registrationAdmission.d.ts +40 -0
  62. package/dist/engine/registrationAdmission.d.ts.map +1 -0
  63. package/dist/engine/registrationAdmission.js +78 -0
  64. package/dist/engine/registrationAdmission.js.map +1 -0
  65. package/dist/engine/taskInvocation.d.ts +1 -1
  66. package/dist/engine/workspace.d.ts +26 -3
  67. package/dist/engine/workspace.d.ts.map +1 -1
  68. package/dist/engine/workspace.js +108 -8
  69. package/dist/engine/workspace.js.map +1 -1
  70. package/dist/engine/workspaceDeliveryPolicy.d.ts +1 -2
  71. package/dist/engine/workspaceDeliveryPolicy.d.ts.map +1 -1
  72. package/dist/engine/workspaceDeliveryPolicy.js +2 -5
  73. package/dist/engine/workspaceDeliveryPolicy.js.map +1 -1
  74. package/dist/engine/workspaceDrain.d.ts +38 -0
  75. package/dist/engine/workspaceDrain.d.ts.map +1 -0
  76. package/dist/engine/workspaceDrain.js +202 -0
  77. package/dist/engine/workspaceDrain.js.map +1 -0
  78. package/dist/engine.d.ts +1 -1
  79. package/dist/engine.d.ts.map +1 -1
  80. package/dist/engine.js +30 -2
  81. package/dist/engine.js.map +1 -1
  82. package/dist/entrypoints/node.d.ts +2 -2
  83. package/dist/entrypoints/node.d.ts.map +1 -1
  84. package/dist/entrypoints/node.js +1 -1
  85. package/dist/entrypoints/node.js.map +1 -1
  86. package/dist/env.d.ts +5 -5
  87. package/dist/env.d.ts.map +1 -1
  88. package/dist/index.d.ts +4 -4
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +5 -6
  91. package/dist/index.js.map +1 -1
  92. package/dist/lib/admissionError.d.ts +11 -0
  93. package/dist/lib/admissionError.d.ts.map +1 -0
  94. package/dist/lib/admissionError.js +14 -0
  95. package/dist/lib/admissionError.js.map +1 -0
  96. package/dist/lib/engineDiagnostics.d.ts +26 -0
  97. package/dist/lib/engineDiagnostics.d.ts.map +1 -0
  98. package/dist/lib/engineDiagnostics.js +100 -0
  99. package/dist/lib/engineDiagnostics.js.map +1 -0
  100. package/dist/lib/httpError.d.ts.map +1 -1
  101. package/dist/lib/httpError.js +9 -4
  102. package/dist/lib/httpError.js.map +1 -1
  103. package/dist/middleware/admission.d.ts +49 -0
  104. package/dist/middleware/admission.d.ts.map +1 -0
  105. package/dist/middleware/admission.js +100 -0
  106. package/dist/middleware/admission.js.map +1 -0
  107. package/dist/middleware/rateLimit.d.ts +2 -0
  108. package/dist/middleware/rateLimit.d.ts.map +1 -1
  109. package/dist/middleware/rateLimit.js +29 -25
  110. package/dist/middleware/rateLimit.js.map +1 -1
  111. package/dist/ports/admission.d.ts +80 -0
  112. package/dist/ports/admission.d.ts.map +1 -0
  113. package/dist/ports/admission.js +2 -0
  114. package/dist/ports/admission.js.map +1 -0
  115. package/dist/ports/diagnostics.d.ts +42 -0
  116. package/dist/ports/diagnostics.d.ts.map +1 -0
  117. package/dist/ports/diagnostics.js +13 -0
  118. package/dist/ports/diagnostics.js.map +1 -0
  119. package/dist/ports/index.d.ts +18 -4
  120. package/dist/ports/index.d.ts.map +1 -1
  121. package/dist/ports/index.js.map +1 -1
  122. package/dist/ports/kv.d.ts +1 -16
  123. package/dist/ports/kv.d.ts.map +1 -1
  124. package/dist/ports/presence.d.ts +14 -0
  125. package/dist/ports/presence.d.ts.map +1 -1
  126. package/dist/ports/realtime.d.ts +18 -0
  127. package/dist/ports/realtime.d.ts.map +1 -1
  128. package/dist/ports/realtime.js.map +1 -1
  129. package/dist/ports/workspaceDelivery.d.ts +3 -4
  130. package/dist/ports/workspaceDelivery.d.ts.map +1 -1
  131. package/dist/routes/a2a.d.ts.map +1 -1
  132. package/dist/routes/a2a.js +2 -0
  133. package/dist/routes/a2a.js.map +1 -1
  134. package/dist/routes/action.js +3 -0
  135. package/dist/routes/action.js.map +1 -1
  136. package/dist/routes/agent.d.ts.map +1 -1
  137. package/dist/routes/agent.js +5 -1
  138. package/dist/routes/agent.js.map +1 -1
  139. package/dist/routes/dm.js +3 -3
  140. package/dist/routes/dm.js.map +1 -1
  141. package/dist/routes/groupDm.js +3 -3
  142. package/dist/routes/groupDm.js.map +1 -1
  143. package/dist/routes/inboundWebhook.js +8 -0
  144. package/dist/routes/inboundWebhook.js.map +1 -1
  145. package/dist/routes/message.js +3 -3
  146. package/dist/routes/message.js.map +1 -1
  147. package/dist/routes/node.d.ts.map +1 -1
  148. package/dist/routes/node.js +2 -1
  149. package/dist/routes/node.js.map +1 -1
  150. package/dist/routes/thread.js +3 -3
  151. package/dist/routes/thread.js.map +1 -1
  152. package/dist/routes/workspace.js +10 -2
  153. package/dist/routes/workspace.js.map +1 -1
  154. package/package.json +3 -3
  155. package/dist/engine/usage.d.ts +0 -35
  156. package/dist/engine/usage.d.ts.map +0 -1
  157. package/dist/engine/usage.js +0 -59
  158. package/dist/engine/usage.js.map +0 -1
  159. package/dist/lib/planLimitError.d.ts +0 -26
  160. package/dist/lib/planLimitError.d.ts.map +0 -1
  161. package/dist/lib/planLimitError.js +0 -16
  162. package/dist/lib/planLimitError.js.map +0 -1
  163. package/dist/middleware/planLimits.d.ts +0 -36
  164. package/dist/middleware/planLimits.d.ts.map +0 -1
  165. package/dist/middleware/planLimits.js +0 -190
  166. package/dist/middleware/planLimits.js.map +0 -1
  167. package/dist/middleware/usageTracker.d.ts +0 -3
  168. package/dist/middleware/usageTracker.d.ts.map +0 -1
  169. package/dist/middleware/usageTracker.js +0 -11
  170. package/dist/middleware/usageTracker.js.map +0 -1
  171. package/dist/ports/entitlements.d.ts +0 -65
  172. package/dist/ports/entitlements.d.ts.map +0 -1
  173. package/dist/ports/entitlements.js +0 -2
  174. package/dist/ports/entitlements.js.map +0 -1
  175. package/dist/providers/static-entitlements.d.ts +0 -25
  176. package/dist/providers/static-entitlements.d.ts.map +0 -1
  177. package/dist/providers/static-entitlements.js +0 -55
  178. package/dist/providers/static-entitlements.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ import { createMiddleware } from 'hono/factory';
2
+ import { createRegistrationAdmission } from '../engine/registrationAdmission.js';
3
+ import { AdmissionDeniedError } from '../lib/admissionError.js';
4
+ import { getRequestLogger, toErrorDetails } from '../lib/logger.js';
5
+ import { setRetryContract } from '../lib/throttle.js';
6
+ import { runInBackground } from '../routes/background.js';
7
+ /**
8
+ * Ask the host whether `action` may proceed. No hook, or a hook that throws,
9
+ * admits it: a host's metering outage must not take messaging down.
10
+ */
11
+ export async function resolveAdmission(c, workspace, action) {
12
+ const admission = c.get('engine').admission;
13
+ if (!admission?.admit)
14
+ return null;
15
+ try {
16
+ return (await admission.admit({ workspace, action })) ?? null;
17
+ }
18
+ catch (error) {
19
+ getRequestLogger(c, 'admission').warn('admission hook failed; admitting request', {
20
+ action,
21
+ ...toErrorDetails(error),
22
+ });
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Render a denial as the error envelope, with `Retry-After` when the host gave
28
+ * one. Without `retryAt` no retry clears the denial, so the per-minute reset
29
+ * `rateLimit` already set is withdrawn rather than advertised.
30
+ */
31
+ export function admissionDeniedResponse(c, denial) {
32
+ if (denial.retryAt !== undefined && Number.isFinite(denial.retryAt)) {
33
+ setRetryContract(c, denial.retryAt);
34
+ }
35
+ else {
36
+ c.header('X-RateLimit-Reset', undefined);
37
+ c.header('Retry-After', undefined);
38
+ }
39
+ return c.json({ ok: false, error: { ...denial.details, code: denial.code, message: denial.message } }, denial.status);
40
+ }
41
+ /** Report a successful, non-replayed action to the host without holding the response. */
42
+ export function reportCommitted(c, workspace, action) {
43
+ const admission = c.get('engine').admission;
44
+ if (!admission?.committed)
45
+ return;
46
+ if (c.res.status < 200 || c.res.status >= 300)
47
+ return;
48
+ if (c.res.headers.get('Idempotency-Replayed') === 'true')
49
+ return;
50
+ runInBackground(c, Promise.resolve().then(() => admission.committed({ workspace, action })), `admission committed: ${action}`);
51
+ }
52
+ /**
53
+ * Admit message sends through the host's `message` hook.
54
+ *
55
+ * Mounted after `rateLimit` on the routes that create a message (channel post,
56
+ * DM, group DM, thread reply). Idempotency is preserved: a denied request
57
+ * without an `Idempotency-Key` is refused here; a keyed one reaches the route
58
+ * so a replay of an earlier successful send still returns its stored receipt,
59
+ * and the route refuses only a fresh send ({@link assertMessageAdmitted},
60
+ * called inside the idempotent operation). Only a fresh successful send is
61
+ * reported as committed.
62
+ */
63
+ export const admitMessage = createMiddleware(async (c, next) => {
64
+ const workspace = c.get('workspace');
65
+ if (!workspace || !c.get('engine').admission) {
66
+ await next();
67
+ return;
68
+ }
69
+ const denial = await resolveAdmission(c, workspace, 'message');
70
+ if (denial) {
71
+ if (!c.req.header('Idempotency-Key'))
72
+ return admissionDeniedResponse(c, denial);
73
+ c.set('messageAdmissionDenial', denial);
74
+ }
75
+ await next();
76
+ reportCommitted(c, workspace, 'message');
77
+ });
78
+ /**
79
+ * Refuse a fresh send when `admitMessage` found it denied. Call it first inside
80
+ * a message route's idempotent `operation`, which runs only for a new send —
81
+ * never for a replay of a stored receipt.
82
+ */
83
+ export function assertMessageAdmitted(c) {
84
+ const denial = c.get('messageAdmissionDenial');
85
+ if (denial)
86
+ throw new AdmissionDeniedError(denial);
87
+ }
88
+ /**
89
+ * The registration admission for the authenticated workspace, or `undefined`
90
+ * when the host has no `admit` hook. Pass it to the node and agent
91
+ * registration paths, which consult it only for a NEW registration.
92
+ */
93
+ export function registrationAdmission(c) {
94
+ return createRegistrationAdmission({
95
+ db: c.get('db'),
96
+ admission: c.get('engine').admission,
97
+ workspace: c.get('workspace'),
98
+ });
99
+ }
100
+ //# sourceMappingURL=admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.js","sourceRoot":"","sources":["../../src/middleware/admission.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { AppEnv } from '../env.js';
2
+ /** Per-workspace requests-per-minute ceiling when the host configures none. */
3
+ export declare const DEFAULT_RATE_LIMIT_PER_MINUTE = 30000;
2
4
  export declare const ROUTE_MULTIPLIERS: Record<string, number>;
3
5
  export declare function getRouteKey(method: string, path: string): string | null;
4
6
  export declare const rateLimit: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAcxC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmCpD,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BvE;AAED,eAAO,MAAM,SAAS,gEAuDpB,CAAC"}
1
+ {"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAOxC,+EAA+E;AAC/E,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAQpD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmCpD,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BvE;AAED,eAAO,MAAM,SAAS,gEAyDpB,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import { createMiddleware } from 'hono/factory';
2
2
  import { jsonError } from '../lib/httpResponse.js';
3
+ import { getRequestLogger, toErrorDetails } from '../lib/logger.js';
3
4
  import { RATE_LIMIT_WINDOW_MS, rateLimitWindow, rateLimitWindowResetAt, setRetryContract } from '../lib/throttle.js';
4
- import { checkPlanLimit } from './planLimits.js';
5
+ import { admissionDeniedResponse, reportCommitted, resolveAdmission } from './admission.js';
5
6
  import { presenceRefresh } from './presenceRefresh.js';
6
- import { usageTracker } from './usageTracker.js';
7
- // Conservative per-minute ceiling applied when the entitlements lookup fails,
8
- // so an entitlements outage degrades to a safe default rather than no limit.
9
- const FALLBACK_RATE_PER_MIN = 300;
10
- const checkApiCallPlanLimit = checkPlanLimit('api_calls');
7
+ /** Per-workspace requests-per-minute ceiling when the host configures none. */
8
+ export const DEFAULT_RATE_LIMIT_PER_MINUTE = 30_000;
9
+ function validRatePerMinute(value) {
10
+ return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined;
11
+ }
11
12
  // Per-route rate limit multipliers (fraction of the global per-minute limit).
12
13
  // POST endpoints get tighter limits, GET endpoints get looser.
13
14
  export const ROUTE_MULTIPLIERS = {
@@ -83,29 +84,27 @@ export const rateLimit = createMiddleware(async (c, next) => {
83
84
  await next();
84
85
  return;
85
86
  }
86
- let planAllowed = false;
87
- const planResponse = await checkApiCallPlanLimit(c, async () => {
88
- planAllowed = true;
89
- });
90
- if (!planAllowed) {
91
- return planResponse;
92
- }
93
- const { entitlements, rateLimiter } = c.get('engine');
87
+ const { admission, config, rateLimiter } = c.get('engine');
94
88
  // Apply route-specific multiplier if applicable
95
89
  const routeKey = getRouteKey(c.req.method, c.req.path);
96
90
  // The rate limiter port is not workspace-scoped, so the workspace id is part
97
91
  // of the bucket key (the Cloudflare adapter previously scoped via the DO id).
98
92
  const now = Date.now();
99
93
  const bucketKey = `${workspace.id}:${routeKey ?? 'global'}:${rateLimitWindow(now)}`;
100
- // Resolve the per-minute limit. If entitlements are unavailable, fall back to
101
- // a conservative default and still enforce it — an entitlements outage must
102
- // NOT translate into unlimited throughput.
103
- let globalLimit;
104
- try {
105
- globalLimit = (await entitlements.getLimits(workspace)).rate_per_min;
106
- }
107
- catch {
108
- globalLimit = FALLBACK_RATE_PER_MIN;
94
+ // An invalid ceiling (config or hook) or a failing hook degrades to the next
95
+ // valid one, never to no limit or to refusing everything.
96
+ let globalLimit = validRatePerMinute(config.rateLimitPerMinute) ?? DEFAULT_RATE_LIMIT_PER_MINUTE;
97
+ if (admission?.rateLimitPerMinute) {
98
+ try {
99
+ globalLimit = validRatePerMinute(await admission.rateLimitPerMinute(workspace)) ?? globalLimit;
100
+ }
101
+ catch (error) {
102
+ // A failing ceiling hook keeps the configured limit. Log it: the same
103
+ // outage is why admit() fails open, and a silent fallback hides it.
104
+ getRequestLogger(c, 'admission').warn('admission rate limit hook failed; keeping configured ceiling', {
105
+ ...toErrorDetails(error),
106
+ });
107
+ }
109
108
  }
110
109
  const limit = routeKey ? Math.ceil(globalLimit * ROUTE_MULTIPLIERS[routeKey]) : globalLimit;
111
110
  try {
@@ -118,14 +117,19 @@ export const rateLimit = createMiddleware(async (c, next) => {
118
117
  // Transient by construction: the bucket is keyed to this minute, so the
119
118
  // advertised wait is the real one.
120
119
  setRetryContract(c, resetAt, now);
121
- return jsonError(c, 'rate_limit_exceeded', `Rate limit exceeded. ${limit} requests per minute allowed for ${workspace.plan} plan.`, 429);
120
+ return jsonError(c, 'rate_limit_exceeded', `Rate limit exceeded. ${limit} requests per minute allowed.`, 429);
122
121
  }
123
122
  }
124
123
  catch {
125
124
  // Only the limiter backend failing is fail-open — a transient infra hiccup
126
125
  // shouldn't 500 the request (the limit was still computed above).
127
126
  }
127
+ // After the bucket, so a flood is throttled without reaching host admission.
128
+ const denial = await resolveAdmission(c, workspace, 'request');
129
+ if (denial)
130
+ return admissionDeniedResponse(c, denial);
128
131
  await presenceRefresh(c, async () => { });
129
- return usageTracker(c, next);
132
+ await next();
133
+ reportCommitted(c, workspace, 'request');
130
134
  });
131
135
  //# sourceMappingURL=rateLimit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { Workspace } from './auth.js';
2
+ /**
3
+ * A new registration a host can cap.
4
+ *
5
+ * - `register_device`: a host-enrolled node (`POST /v1/nodes`, any role or
6
+ * transport). An agent's implicit direct node is its own WebSocket, not a
7
+ * device, and is never admitted as one.
8
+ * - `register_agent`: a new non-human identity (`POST /v1/agents`, a new A2A
9
+ * proxy, or a node's `agent.register` frame).
10
+ * - `register_human`: a new `type: human` identity.
11
+ *
12
+ * Re-enrolling an established node or re-registering an established name is
13
+ * not a new registration and is never admitted as one.
14
+ */
15
+ export type RegistrationAdmissionAction = 'register_device' | 'register_agent' | 'register_human';
16
+ /**
17
+ * What an admitted request is about to do.
18
+ *
19
+ * - `request`: any authenticated, rate-limited request.
20
+ * - `message`: a message send (channel post, DM, group DM, thread reply).
21
+ * - a {@link RegistrationAdmissionAction}: a new device or identity.
22
+ */
23
+ export type AdmissionAction = 'request' | 'message' | RegistrationAdmissionAction;
24
+ export interface AdmissionContext {
25
+ workspace: Workspace;
26
+ action: AdmissionAction;
27
+ /**
28
+ * Set for a registration action: how many of that kind the workspace has
29
+ * registered now, before this one. Released identities hold no slot.
30
+ */
31
+ registered?: number;
32
+ }
33
+ /**
34
+ * A host refusal, rendered as `{ ok: false, error: { code, message, ...details } }`
35
+ * with `status`.
36
+ */
37
+ export interface AdmissionDenial {
38
+ /** HTTP status, 4xx. */
39
+ status: number;
40
+ code: string;
41
+ message: string;
42
+ /** Additive fields on `error`, e.g. the limit that was reached. */
43
+ details?: Record<string, unknown>;
44
+ /**
45
+ * Unix ms at which retrying can succeed; sets `Retry-After`. Omit when no
46
+ * retry clears the refusal.
47
+ */
48
+ retryAt?: number;
49
+ }
50
+ /**
51
+ * Host hooks for admitting and metering workspace activity.
52
+ *
53
+ * The engine enforces no quotas of its own. A host that bills or meters
54
+ * (the hosted product) implements these; self-host passes none, and every
55
+ * request is admitted. Every hook is optional, and a hook that throws admits
56
+ * the request.
57
+ */
58
+ export interface AdmissionHooks {
59
+ /**
60
+ * Decide whether an action may proceed. Return a denial to refuse it, or
61
+ * `null`/`undefined` to admit it.
62
+ *
63
+ * A `message` denial on a request carrying an `Idempotency-Key` refuses only
64
+ * a fresh send: a replay of an earlier successful send still returns its
65
+ * stored receipt.
66
+ */
67
+ admit?(ctx: AdmissionContext): Promise<AdmissionDenial | null | undefined>;
68
+ /**
69
+ * Called after an admitted `request` or `message` succeeds (2xx, not an
70
+ * idempotent replay). The response does not wait on it. Registrations are
71
+ * not reported: `registered` is a live count.
72
+ */
73
+ committed?(ctx: AdmissionContext): Promise<void>;
74
+ /**
75
+ * The workspace's requests-per-minute ceiling. Falls back to
76
+ * `EngineConfig.rateLimitPerMinute` when absent or failing.
77
+ */
78
+ rateLimitPerMinute?(workspace: Workspace): Promise<number>;
79
+ }
80
+ //# sourceMappingURL=admission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/ports/admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,2BAA2B,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,KAAK,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAE3E;;;;OAIG;IACH,SAAS,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD;;;OAGG;IACH,kBAAkB,CAAC,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.js","sourceRoot":"","sources":["../../src/ports/admission.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Operational diagnostics: how long the engine's expensive database operations
3
+ * take, and how far long-running cleanups have progressed. Distinct from
4
+ * `TelemetrySink`, which carries domain observations. Hosts decide whether and
5
+ * where to export these; the default is to drop them.
6
+ *
7
+ * The engine cannot see per-statement database cost (rows read/written) through
8
+ * its query builder, so it only reports operation-level timing. A host that can
9
+ * (for example a D1 binding wrapper) attributes each statement to the operation
10
+ * in flight with `currentEngineOperation()`.
11
+ */
12
+ /** Stable, low-cardinality names for the engine operations worth timing. */
13
+ export type EngineOperationLabel = 'inbox.get' | 'deliveries.list' | 'workspace.delete' | 'invocations.sweep' | 'backfill.mention_fts';
14
+ export interface EngineOperationScope {
15
+ label: EngineOperationLabel;
16
+ workspaceId?: string;
17
+ }
18
+ export interface EngineOperationSample extends EngineOperationScope {
19
+ durationMs: number;
20
+ outcome: 'ok' | 'error';
21
+ /** `error.name` only — never the message, which may carry tenant data. */
22
+ errorName?: string;
23
+ }
24
+ export type EngineProgressOperation = 'workspace.delete' | 'backfill.mention_fts';
25
+ export interface EngineProgressSample {
26
+ operation: EngineProgressOperation;
27
+ workspaceId?: string;
28
+ phase: 'started' | 'batch' | 'completed' | 'failed';
29
+ /** For a workspace delete: the table this batch drained. */
30
+ table?: string;
31
+ /** Rows processed by this batch. */
32
+ rows?: number;
33
+ /** Rows still to process, when cheaply known; otherwise null. */
34
+ remaining?: number | null;
35
+ durationMs?: number;
36
+ }
37
+ /** Callbacks may be async; a throw or rejection is contained and never affects the engine. */
38
+ export interface EngineDiagnostics {
39
+ operation?(sample: EngineOperationSample): void | Promise<void>;
40
+ progress?(sample: EngineProgressSample): void | Promise<void>;
41
+ }
42
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/ports/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC;IACxB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,uBAAuB,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;IACpD,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,8FAA8F;AAC9F,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Operational diagnostics: how long the engine's expensive database operations
3
+ * take, and how far long-running cleanups have progressed. Distinct from
4
+ * `TelemetrySink`, which carries domain observations. Hosts decide whether and
5
+ * where to export these; the default is to drop them.
6
+ *
7
+ * The engine cannot see per-statement database cost (rows read/written) through
8
+ * its query builder, so it only reports operation-level timing. A host that can
9
+ * (for example a D1 binding wrapper) attributes each statement to the operation
10
+ * in flight with `currentEngineOperation()`.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/ports/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -9,7 +9,7 @@
9
9
  * - **Ports** — infrastructure the engine needs (db, realtime, presence, rate
10
10
  * limiting, file blobs, key/value).
11
11
  * - **Providers** — the open-core "hosting" seam the cloud layer overrides
12
- * (auth, entitlements/billing, telemetry). Each ships an OSS default.
12
+ * (auth, admission, telemetry). Each ships an OSS default or is optional.
13
13
  */
14
14
  export type { EngineDb, TransactionCapability, BatchCapability, AtomicWrite, AtomicWriteBuilder, AtomicWriteInput, } from './database.js';
15
15
  export { runAtomic, runAtomicWrites } from './database.js';
@@ -21,10 +21,11 @@ export type { FileStorage } from './files.js';
21
21
  export type { KeyValueStore } from './kv.js';
22
22
  export type { EventQueue, QueuedEvent } from './event-queue.js';
23
23
  export type { AuthProvider, AuthResult, AuthRequire, Workspace, Agent, } from './auth.js';
24
- export type { EntitlementsProvider, PlanLimits, UpgradeGuidance, UsageMetric, } from './entitlements.js';
24
+ export type { AdmissionAction, AdmissionContext, AdmissionDenial, AdmissionHooks, RegistrationAdmissionAction, } from './admission.js';
25
25
  export { ENGINE_OBSERVATION_FACTS } from './telemetry.js';
26
26
  export type { TelemetrySink, TelemetryEvent, EngineObservation, EngineObservationKind, EngineObservationFacts } from './telemetry.js';
27
27
  export type { EngineLogRecord, EngineLogExport } from './logging.js';
28
+ export type { EngineDiagnostics, EngineOperationLabel, EngineOperationSample, EngineOperationScope, EngineProgressOperation, EngineProgressSample, } from './diagnostics.js';
28
29
  import type { EngineDb } from './database.js';
29
30
  import type { RealtimeBus, ConnectionRegistry, NodeConnectionRegistry } from './realtime.js';
30
31
  import type { PresenceTracker } from './presence.js';
@@ -33,8 +34,9 @@ import type { FileStorage } from './files.js';
33
34
  import type { KeyValueStore } from './kv.js';
34
35
  import type { EventQueue } from './event-queue.js';
35
36
  import type { AuthProvider } from './auth.js';
36
- import type { EntitlementsProvider } from './entitlements.js';
37
+ import type { AdmissionHooks } from './admission.js';
37
38
  import type { TelemetrySink } from './telemetry.js';
39
+ import type { EngineDiagnostics } from './diagnostics.js';
38
40
  import type { EngineLogExport } from './logging.js';
39
41
  /** Infrastructure ports the engine reads off the request context. */
40
42
  export interface EnginePorts {
@@ -51,8 +53,15 @@ export interface EnginePorts {
51
53
  /** The open-core hosting seam — each has an OSS default in `../auth`, etc. */
52
54
  export interface EngineProviders {
53
55
  auth: AuthProvider;
54
- entitlements: EntitlementsProvider;
56
+ /** Host admission and metering hooks. Omitted: every request is admitted. */
57
+ admission?: AdmissionHooks;
55
58
  telemetry?: TelemetrySink;
59
+ /**
60
+ * Operation timing and cleanup progress (see `ports/diagnostics.ts`).
61
+ * Optional. When absent, samples go to the host fallback set with
62
+ * `configureEngineDiagnostics()`, and are dropped only if neither is set.
63
+ */
64
+ diagnostics?: EngineDiagnostics;
56
65
  }
57
66
  /** Everything `createEngine` needs. */
58
67
  export interface EngineDeps extends EnginePorts, EngineProviders {
@@ -102,6 +111,11 @@ export interface EngineConfig {
102
111
  * narrowly scoped recovery capability and the secret remains server-only.
103
112
  */
104
113
  workspaceBootstrapProofRequired?: boolean;
114
+ /**
115
+ * Per-workspace requests-per-minute ceiling. Default 30,000.
116
+ * `AdmissionHooks.rateLimitPerMinute` overrides it per workspace.
117
+ */
118
+ rateLimitPerMinute?: number;
105
119
  /**
106
120
  * Opt-in for the self-serve `POST /v1/workspace/rotate-key` route. Defaults
107
121
  * to disabled: the route mints a live workspace credential, so a deployment
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAS3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAmB7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAS3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAoB7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Key/value store port — replaces the Cloudflare KV namespace.
3
3
  *
4
- * Used for idempotency records/locks (`middleware/idempotency.ts`) and plan-usage
5
- * counters (`middleware/planLimits.ts`, `middleware/usageTracker.ts`). The surface
4
+ * Used for idempotency records/locks (`middleware/idempotency.ts`). The surface
6
5
  * is intentionally the small subset of `KVNamespace` the engine actually calls, so
7
6
  * a Cloudflare `KVNamespace` is structurally assignable to it. The Node adapter
8
7
  * implements it with an in-memory map (TTL via timestamps) or a SQLite table.
@@ -13,19 +12,5 @@ export interface KeyValueStore {
13
12
  expirationTtl?: number;
14
13
  }): Promise<void>;
15
14
  delete(key: string): Promise<void>;
16
- /**
17
- * Atomically add `delta` to the integer value at `key` (treating a missing or
18
- * non-numeric value as 0) and return the new total. Exists because usage
19
- * counters were previously a racy get→parse→put read-modify-write that lost
20
- * concurrent increments. Adapters must implement this without a lost-update
21
- * window (the Cloudflare adapter routes it through a Durable Object).
22
- *
23
- * `ttlSeconds` sets the expiry when the key is first created (an existing
24
- * key keeps its expiry, so a counter isn't extended by its own traffic).
25
- * Adapters that can't express a TTL may ignore it: period-scoped counters
26
- * carry their period in the key, so ignoring it only leaks a dead key rather
27
- * than breaking the reset.
28
- */
29
- increment(key: string, delta: number, ttlSeconds?: number): Promise<number>;
30
15
  }
31
16
  //# sourceMappingURL=kv.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/ports/kv.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7E"}
1
+ {"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/ports/kv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC"}
@@ -12,5 +12,19 @@ export interface PresenceTracker {
12
12
  disconnect(workspaceId: string, agentId: string, agentName?: string): Promise<void>;
13
13
  /** Return the agent IDs currently considered online for a workspace. */
14
14
  getOnline(workspaceId: string): Promise<string[]>;
15
+ /**
16
+ * Agents that called disconnect and have not heartbeated since.
17
+ * Node-derived presence must not put these ids back online. A host that
18
+ * omits this treats disconnect as tracker-only, which cannot override
19
+ * node liveness.
20
+ */
21
+ explicitlyDisconnected?(workspaceId: string): Promise<readonly string[]>;
22
+ /**
23
+ * Forget an explicit disconnect so node liveness can count the agent again.
24
+ * {@link heartbeat} does this itself. Called when a node newly routes an
25
+ * agent that had left, and when `agent.recover` restores one, including a
26
+ * presence-only disconnect whose binding was still active.
27
+ */
28
+ clearExplicitDisconnect?(workspaceId: string, agentId: string): Promise<void>;
15
29
  }
16
30
  //# sourceMappingURL=presence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/ports/presence.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnF,+DAA+D;IAC/D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF,wEAAwE;IACxE,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/ports/presence.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnF,+DAA+D;IAC/D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF,wEAAwE;IACxE,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAElD;;;;;OAKG;IACH,sBAAsB,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAEzE;;;;;OAKG;IACH,uBAAuB,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E"}
@@ -73,6 +73,24 @@ export interface AgentActionProviderAuthorization {
73
73
  handlerAgentId: string;
74
74
  /** False when a queued attempt was already counted before this delivery. */
75
75
  recordAttempt: boolean;
76
+ /** Queue the claim as pending. Absent means a live dispatched attempt. */
77
+ pending?: boolean;
78
+ /**
79
+ * Deadline to store. An unset deadline stays unset when this claim changes
80
+ * the attempt count or the status, so a queued row stays due for drain.
81
+ */
82
+ retryAfterAt?: Date | null;
83
+ /**
84
+ * Status the caller observed. A timeout or `handler_unavailable` retry passes
85
+ * `dispatched` or `invoked`. Absent means a fresh `pending` row.
86
+ */
87
+ claimStatus?: 'pending' | 'dispatched' | 'invoked';
88
+ /** `retry_after_at` the caller observed. Absent means it was unset. */
89
+ observedRetryAfterAt?: Date | null;
90
+ /** `dispatch_attempts` the caller observed. Absent means zero. */
91
+ observedDispatchAttempts?: number;
92
+ /** Stamp `spawn_reserved_at` when this caller holds a capacity reservation. */
93
+ reservationHeld?: boolean;
76
94
  /** Optional lost-node retry generation; the socket owner must CAS it. */
77
95
  expectedNodeLivenessRevision?: number;
78
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgSH,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAC1C,QAAgC,EAChC,WAAmB,EACnB,MAAc,EACd,YAAoB,EACpB,OAAe;IAEf,OAAO,QAAQ,CAAC,4BAA4B,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;AACrG,CAAC"}
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkTH,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAC1C,QAAgC,EAChC,WAAmB,EACnB,MAAc,EACd,YAAoB,EACpB,OAAe;IAEf,OAAO,QAAQ,CAAC,4BAA4B,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;AACrG,CAAC"}
@@ -17,15 +17,14 @@ export interface WorkspaceDeliveryPolicyConfig {
17
17
  reserve?: number;
18
18
  } | undefined>;
19
19
  /**
20
- * Server-only async resolver for dynamic, request-time plans (e.g. a
21
- * KV-backed effective plan lookup). When present it takes precedence over the
22
- * static `cap`/`workspaces` fields, so a host whose plan is async does not
20
+ * Server-only async resolver for a dynamic, request-time policy (e.g. one
21
+ * keyed by the host's own tier for the workspace). When present it takes
22
+ * precedence over the static `cap`/`workspaces` fields, so a host does not
23
23
  * have to flatten every workspace into static config. Never source this from
24
24
  * a client request.
25
25
  */
26
26
  resolve?: (workspace: {
27
27
  id: string;
28
- plan: string;
29
28
  }) => Promise<WorkspaceDeliveryPolicy | undefined>;
30
29
  }
31
30
  //# sourceMappingURL=workspaceDelivery.d.ts.map