@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.
- package/dist/adapters/node/index.d.ts +3 -3
- package/dist/adapters/node/index.d.ts.map +1 -1
- package/dist/adapters/node/index.js +2 -3
- package/dist/adapters/node/index.js.map +1 -1
- package/dist/adapters/node/kv.d.ts +0 -1
- package/dist/adapters/node/kv.d.ts.map +1 -1
- package/dist/adapters/node/kv.js +0 -17
- package/dist/adapters/node/kv.js.map +1 -1
- package/dist/adapters/node/presence.d.ts +18 -0
- package/dist/adapters/node/presence.d.ts.map +1 -1
- package/dist/adapters/node/presence.js +82 -0
- package/dist/adapters/node/presence.js.map +1 -1
- package/dist/adapters/node/realtime.d.ts +4 -0
- package/dist/adapters/node/realtime.d.ts.map +1 -1
- package/dist/adapters/node/realtime.js +32 -5
- package/dist/adapters/node/realtime.js.map +1 -1
- package/dist/db/migrations/0077_drop_workspace_plan.sql +4 -0
- package/dist/db/schema.d.ts +2 -21
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +0 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/a2a.d.ts +3 -0
- package/dist/engine/a2a.d.ts.map +1 -1
- package/dist/engine/a2a.js +1 -0
- package/dist/engine/a2a.js.map +1 -1
- package/dist/engine/action.d.ts +14 -9
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +335 -74
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/agent.d.ts +9 -3
- package/dist/engine/agent.d.ts.map +1 -1
- package/dist/engine/agent.js +21 -3
- package/dist/engine/agent.js.map +1 -1
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +4 -0
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/eventDelivery.d.ts +1 -1
- package/dist/engine/inboundWebhook.d.ts +10 -0
- package/dist/engine/inboundWebhook.d.ts.map +1 -1
- package/dist/engine/inboundWebhook.js +30 -4
- package/dist/engine/inboundWebhook.js.map +1 -1
- package/dist/engine/inbox.d.ts.map +1 -1
- package/dist/engine/inbox.js +17 -0
- package/dist/engine/inbox.js.map +1 -1
- package/dist/engine/invocationClaim.d.ts +32 -0
- package/dist/engine/invocationClaim.d.ts.map +1 -0
- package/dist/engine/invocationClaim.js +42 -0
- package/dist/engine/invocationClaim.js.map +1 -0
- package/dist/engine/messageMetadata.d.ts +2 -0
- package/dist/engine/messageMetadata.d.ts.map +1 -1
- package/dist/engine/messageMetadata.js +3 -2
- package/dist/engine/messageMetadata.js.map +1 -1
- package/dist/engine/node.d.ts +12 -2
- package/dist/engine/node.d.ts.map +1 -1
- package/dist/engine/node.js +83 -4
- package/dist/engine/node.js.map +1 -1
- package/dist/engine/presence.d.ts +173 -1
- package/dist/engine/presence.d.ts.map +1 -1
- package/dist/engine/presence.js +81 -4
- package/dist/engine/presence.js.map +1 -1
- package/dist/engine/registrationAdmission.d.ts +40 -0
- package/dist/engine/registrationAdmission.d.ts.map +1 -0
- package/dist/engine/registrationAdmission.js +78 -0
- package/dist/engine/registrationAdmission.js.map +1 -0
- package/dist/engine/taskInvocation.d.ts +1 -1
- package/dist/engine/workspace.d.ts +26 -3
- package/dist/engine/workspace.d.ts.map +1 -1
- package/dist/engine/workspace.js +108 -8
- package/dist/engine/workspace.js.map +1 -1
- package/dist/engine/workspaceDeliveryPolicy.d.ts +1 -2
- package/dist/engine/workspaceDeliveryPolicy.d.ts.map +1 -1
- package/dist/engine/workspaceDeliveryPolicy.js +2 -5
- package/dist/engine/workspaceDeliveryPolicy.js.map +1 -1
- package/dist/engine/workspaceDrain.d.ts +38 -0
- package/dist/engine/workspaceDrain.d.ts.map +1 -0
- package/dist/engine/workspaceDrain.js +202 -0
- package/dist/engine/workspaceDrain.js.map +1 -0
- package/dist/engine.d.ts +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +30 -2
- package/dist/engine.js.map +1 -1
- package/dist/entrypoints/node.d.ts +2 -2
- package/dist/entrypoints/node.d.ts.map +1 -1
- package/dist/entrypoints/node.js +1 -1
- package/dist/entrypoints/node.js.map +1 -1
- package/dist/env.d.ts +5 -5
- package/dist/env.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/admissionError.d.ts +11 -0
- package/dist/lib/admissionError.d.ts.map +1 -0
- package/dist/lib/admissionError.js +14 -0
- package/dist/lib/admissionError.js.map +1 -0
- package/dist/lib/engineDiagnostics.d.ts +26 -0
- package/dist/lib/engineDiagnostics.d.ts.map +1 -0
- package/dist/lib/engineDiagnostics.js +100 -0
- package/dist/lib/engineDiagnostics.js.map +1 -0
- package/dist/lib/httpError.d.ts.map +1 -1
- package/dist/lib/httpError.js +9 -4
- package/dist/lib/httpError.js.map +1 -1
- package/dist/middleware/admission.d.ts +49 -0
- package/dist/middleware/admission.d.ts.map +1 -0
- package/dist/middleware/admission.js +100 -0
- package/dist/middleware/admission.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +2 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -1
- package/dist/middleware/rateLimit.js +29 -25
- package/dist/middleware/rateLimit.js.map +1 -1
- package/dist/ports/admission.d.ts +80 -0
- package/dist/ports/admission.d.ts.map +1 -0
- package/dist/ports/admission.js +2 -0
- package/dist/ports/admission.js.map +1 -0
- package/dist/ports/diagnostics.d.ts +42 -0
- package/dist/ports/diagnostics.d.ts.map +1 -0
- package/dist/ports/diagnostics.js +13 -0
- package/dist/ports/diagnostics.js.map +1 -0
- package/dist/ports/index.d.ts +18 -4
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/kv.d.ts +1 -16
- package/dist/ports/kv.d.ts.map +1 -1
- package/dist/ports/presence.d.ts +14 -0
- package/dist/ports/presence.d.ts.map +1 -1
- package/dist/ports/realtime.d.ts +18 -0
- package/dist/ports/realtime.d.ts.map +1 -1
- package/dist/ports/realtime.js.map +1 -1
- package/dist/ports/workspaceDelivery.d.ts +3 -4
- package/dist/ports/workspaceDelivery.d.ts.map +1 -1
- package/dist/routes/a2a.d.ts.map +1 -1
- package/dist/routes/a2a.js +2 -0
- package/dist/routes/a2a.js.map +1 -1
- package/dist/routes/action.js +3 -0
- package/dist/routes/action.js.map +1 -1
- package/dist/routes/agent.d.ts.map +1 -1
- package/dist/routes/agent.js +5 -1
- package/dist/routes/agent.js.map +1 -1
- package/dist/routes/dm.js +3 -3
- package/dist/routes/dm.js.map +1 -1
- package/dist/routes/groupDm.js +3 -3
- package/dist/routes/groupDm.js.map +1 -1
- package/dist/routes/inboundWebhook.js +8 -0
- package/dist/routes/inboundWebhook.js.map +1 -1
- package/dist/routes/message.js +3 -3
- package/dist/routes/message.js.map +1 -1
- package/dist/routes/node.d.ts.map +1 -1
- package/dist/routes/node.js +2 -1
- package/dist/routes/node.js.map +1 -1
- package/dist/routes/thread.js +3 -3
- package/dist/routes/thread.js.map +1 -1
- package/dist/routes/workspace.js +10 -2
- package/dist/routes/workspace.js.map +1 -1
- package/package.json +3 -3
- package/dist/engine/usage.d.ts +0 -35
- package/dist/engine/usage.d.ts.map +0 -1
- package/dist/engine/usage.js +0 -59
- package/dist/engine/usage.js.map +0 -1
- package/dist/lib/planLimitError.d.ts +0 -26
- package/dist/lib/planLimitError.d.ts.map +0 -1
- package/dist/lib/planLimitError.js +0 -16
- package/dist/lib/planLimitError.js.map +0 -1
- package/dist/middleware/planLimits.d.ts +0 -36
- package/dist/middleware/planLimits.d.ts.map +0 -1
- package/dist/middleware/planLimits.js +0 -190
- package/dist/middleware/planLimits.js.map +0 -1
- package/dist/middleware/usageTracker.d.ts +0 -3
- package/dist/middleware/usageTracker.d.ts.map +0 -1
- package/dist/middleware/usageTracker.js +0 -11
- package/dist/middleware/usageTracker.js.map +0 -1
- package/dist/ports/entitlements.d.ts +0 -65
- package/dist/ports/entitlements.d.ts.map +0 -1
- package/dist/ports/entitlements.js +0 -2
- package/dist/ports/entitlements.js.map +0 -1
- package/dist/providers/static-entitlements.d.ts +0 -25
- package/dist/providers/static-entitlements.d.ts.map +0 -1
- package/dist/providers/static-entitlements.js +0 -55
- 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;
|
|
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 {
|
|
5
|
+
import { admissionDeniedResponse, reportCommitted, resolveAdmission } from './admission.js';
|
|
5
6
|
import { presenceRefresh } from './presenceRefresh.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACrH,OAAO,EAAE,
|
|
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 @@
|
|
|
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"}
|
package/dist/ports/index.d.ts
CHANGED
|
@@ -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,
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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":"AAAA;;;;;;;;;;;;GAYG;AACH,YAAY,EACV,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,KAAK,GACN,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ports/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/ports/kv.d.ts
CHANGED
|
@@ -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`)
|
|
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
|
package/dist/ports/kv.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/ports/kv.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/ports/presence.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/ports/realtime.d.ts
CHANGED
|
@@ -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;
|
|
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
|
|
21
|
-
*
|
|
22
|
-
* static `cap`/`workspaces` fields, so a host
|
|
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
|