@relaycast/engine 12.2.1 → 12.3.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/actor/credential-tag.d.ts +14 -0
- package/dist/adapters/actor/credential-tag.d.ts.map +1 -0
- package/dist/adapters/actor/credential-tag.js +30 -0
- package/dist/adapters/actor/credential-tag.js.map +1 -0
- package/dist/adapters/actor/database.d.ts +50 -0
- package/dist/adapters/actor/database.d.ts.map +1 -0
- package/dist/adapters/actor/database.js +86 -0
- package/dist/adapters/actor/database.js.map +1 -0
- package/dist/adapters/actor/ephemeral-outbox.d.ts +16 -0
- package/dist/adapters/actor/ephemeral-outbox.d.ts.map +1 -0
- package/dist/adapters/actor/ephemeral-outbox.js +53 -0
- package/dist/adapters/actor/ephemeral-outbox.js.map +1 -0
- package/dist/adapters/actor/event-queue.d.ts +23 -0
- package/dist/adapters/actor/event-queue.d.ts.map +1 -0
- package/dist/adapters/actor/event-queue.js +31 -0
- package/dist/adapters/actor/event-queue.js.map +1 -0
- package/dist/adapters/actor/files.d.ts +66 -0
- package/dist/adapters/actor/files.d.ts.map +1 -0
- package/dist/adapters/actor/files.js +83 -0
- package/dist/adapters/actor/files.js.map +1 -0
- package/dist/adapters/actor/http.d.ts +19 -0
- package/dist/adapters/actor/http.d.ts.map +1 -0
- package/dist/adapters/actor/http.js +2 -0
- package/dist/adapters/actor/http.js.map +1 -0
- package/dist/adapters/actor/index.d.ts +90 -0
- package/dist/adapters/actor/index.d.ts.map +1 -0
- package/dist/adapters/actor/index.js +299 -0
- package/dist/adapters/actor/index.js.map +1 -0
- package/dist/adapters/actor/kv.d.ts +21 -0
- package/dist/adapters/actor/kv.d.ts.map +1 -0
- package/dist/adapters/actor/kv.js +33 -0
- package/dist/adapters/actor/kv.js.map +1 -0
- package/dist/adapters/actor/migrations.d.ts +15 -0
- package/dist/adapters/actor/migrations.d.ts.map +1 -0
- package/dist/adapters/actor/migrations.generated.d.ts +5 -0
- package/dist/adapters/actor/migrations.generated.d.ts.map +1 -0
- package/dist/adapters/actor/migrations.generated.js +842 -0
- package/dist/adapters/actor/migrations.generated.js.map +1 -0
- package/dist/adapters/actor/migrations.js +32 -0
- package/dist/adapters/actor/migrations.js.map +1 -0
- package/dist/adapters/node/files.d.ts +2 -0
- package/dist/adapters/node/files.d.ts.map +1 -1
- package/dist/adapters/node/files.js +31 -3
- package/dist/adapters/node/files.js.map +1 -1
- package/dist/adapters/node/index.js +1 -1
- package/dist/adapters/node/index.js.map +1 -1
- package/dist/auth/credentialTags.d.ts +43 -0
- package/dist/auth/credentialTags.d.ts.map +1 -0
- package/dist/auth/credentialTags.js +106 -0
- package/dist/auth/credentialTags.js.map +1 -0
- package/dist/auth/credentials.d.ts +103 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +147 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/index.d.ts +7 -4
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +115 -61
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/tokenKind.d.ts +17 -26
- package/dist/auth/tokenKind.d.ts.map +1 -1
- package/dist/auth/tokenKind.js +17 -46
- package/dist/auth/tokenKind.js.map +1 -1
- package/dist/auth/workspaceExpiry.d.ts +2 -0
- package/dist/auth/workspaceExpiry.d.ts.map +1 -1
- package/dist/auth/workspaceExpiry.js +7 -0
- package/dist/auth/workspaceExpiry.js.map +1 -1
- package/dist/bin/secretEnv.d.ts +17 -0
- package/dist/bin/secretEnv.d.ts.map +1 -0
- package/dist/bin/secretEnv.js +33 -0
- package/dist/bin/secretEnv.js.map +1 -0
- package/dist/bin/serve.js +42 -4
- package/dist/bin/serve.js.map +1 -1
- package/dist/config/credentialEnv.d.ts +19 -0
- package/dist/config/credentialEnv.d.ts.map +1 -0
- package/dist/config/credentialEnv.js +53 -0
- package/dist/config/credentialEnv.js.map +1 -0
- package/dist/db/migrations/0079_credential_upgrades.sql +17 -0
- package/dist/db/schema.d.ts +164 -2
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +20 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/a2a.d.ts +1 -1
- package/dist/engine/a2a.d.ts.map +1 -1
- package/dist/engine/a2a.js +2 -2
- package/dist/engine/a2a.js.map +1 -1
- package/dist/engine/a2aEgress.d.ts +3 -2
- package/dist/engine/a2aEgress.d.ts.map +1 -1
- package/dist/engine/a2aEgress.js +5 -4
- package/dist/engine/a2aEgress.js.map +1 -1
- package/dist/engine/action.d.ts +12 -0
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +45 -1
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/agent.d.ts.map +1 -1
- package/dist/engine/agent.js +2 -1
- package/dist/engine/agent.js.map +1 -1
- package/dist/engine/agentIdentity.d.ts.map +1 -1
- package/dist/engine/agentIdentity.js +2 -1
- package/dist/engine/agentIdentity.js.map +1 -1
- package/dist/engine/credentialUpgrade.d.ts +48 -0
- package/dist/engine/credentialUpgrade.d.ts.map +1 -0
- package/dist/engine/credentialUpgrade.js +176 -0
- package/dist/engine/credentialUpgrade.js.map +1 -0
- package/dist/engine/eventDispatch.d.ts.map +1 -1
- package/dist/engine/eventDispatch.js +3 -2
- package/dist/engine/eventDispatch.js.map +1 -1
- package/dist/engine/eventSubscription.d.ts +4 -4
- package/dist/engine/file.d.ts +8 -0
- package/dist/engine/file.d.ts.map +1 -1
- package/dist/engine/file.js +18 -5
- package/dist/engine/file.js.map +1 -1
- package/dist/engine/inboundWebhook.d.ts +2 -0
- package/dist/engine/inboundWebhook.d.ts.map +1 -1
- package/dist/engine/inboundWebhook.js +10 -4
- package/dist/engine/inboundWebhook.js.map +1 -1
- package/dist/engine/internalAdmin.d.ts +80 -0
- package/dist/engine/internalAdmin.d.ts.map +1 -0
- package/dist/engine/internalAdmin.js +329 -0
- package/dist/engine/internalAdmin.js.map +1 -0
- package/dist/engine/invocationCompletion.d.ts.map +1 -1
- package/dist/engine/invocationCompletion.js +23 -5
- package/dist/engine/invocationCompletion.js.map +1 -1
- package/dist/engine/node.d.ts +38 -1
- package/dist/engine/node.d.ts.map +1 -1
- package/dist/engine/node.js +166 -11
- package/dist/engine/node.js.map +1 -1
- package/dist/engine/nodeContext.d.ts +2 -1
- package/dist/engine/nodeContext.d.ts.map +1 -1
- package/dist/engine/nodeContext.js +1 -1
- package/dist/engine/nodeContext.js.map +1 -1
- package/dist/engine/nodeDeliver.d.ts +2 -1
- package/dist/engine/nodeDeliver.d.ts.map +1 -1
- package/dist/engine/nodeDeliver.js +1 -1
- package/dist/engine/nodeDeliver.js.map +1 -1
- package/dist/engine/observerToken.d.ts +4 -0
- package/dist/engine/observerToken.d.ts.map +1 -1
- package/dist/engine/observerToken.js +14 -5
- package/dist/engine/observerToken.js.map +1 -1
- package/dist/engine/taskInvocation.d.ts +1 -1
- package/dist/engine/tokenRotate.d.ts.map +1 -1
- package/dist/engine/tokenRotate.js +4 -3
- package/dist/engine/tokenRotate.js.map +1 -1
- package/dist/engine/workspace.d.ts +8 -2
- package/dist/engine/workspace.d.ts.map +1 -1
- package/dist/engine/workspace.js +70 -21
- package/dist/engine/workspace.js.map +1 -1
- package/dist/engine/wsAuth.d.ts.map +1 -1
- package/dist/engine/wsAuth.js +14 -3
- package/dist/engine/wsAuth.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +31 -0
- package/dist/engine.js.map +1 -1
- package/dist/entrypoints/node.d.ts +3 -1
- package/dist/entrypoints/node.d.ts.map +1 -1
- package/dist/entrypoints/node.js +33 -1
- package/dist/entrypoints/node.js.map +1 -1
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/gateway.d.ts +11 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +16 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/credentialNotice.d.ts +32 -0
- package/dist/lib/credentialNotice.d.ts.map +1 -0
- package/dist/lib/credentialNotice.js +76 -0
- package/dist/lib/credentialNotice.js.map +1 -0
- package/dist/lib/fileTokens.d.ts +30 -0
- package/dist/lib/fileTokens.d.ts.map +1 -0
- package/dist/lib/fileTokens.js +76 -0
- package/dist/lib/fileTokens.js.map +1 -0
- package/dist/lib/httpError.d.ts +1 -1
- package/dist/lib/httpResponse.d.ts +6 -6
- package/dist/middleware/admission.d.ts +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +22 -31
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/idempotency.d.ts +1 -1
- package/dist/middleware/logger.d.ts.map +1 -1
- package/dist/middleware/logger.js +4 -1
- package/dist/middleware/logger.js.map +1 -1
- package/dist/ports/database.d.ts.map +1 -1
- package/dist/ports/database.js +8 -2
- package/dist/ports/database.js.map +1 -1
- package/dist/ports/files.d.ts +7 -1
- package/dist/ports/files.d.ts.map +1 -1
- package/dist/ports/index.d.ts +64 -1
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +4 -0
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/telemetry.d.ts +1 -0
- package/dist/ports/telemetry.d.ts.map +1 -1
- package/dist/ports/telemetry.js +1 -0
- package/dist/ports/telemetry.js.map +1 -1
- package/dist/routes/action.d.ts.map +1 -1
- package/dist/routes/action.js +2 -1
- package/dist/routes/action.js.map +1 -1
- package/dist/routes/credential.d.ts +4 -0
- package/dist/routes/credential.d.ts.map +1 -0
- package/dist/routes/credential.js +97 -0
- package/dist/routes/credential.js.map +1 -0
- package/dist/routes/file.js +10 -4
- package/dist/routes/file.js.map +1 -1
- package/dist/routes/inboundWebhook.d.ts.map +1 -1
- package/dist/routes/inboundWebhook.js +11 -2
- package/dist/routes/inboundWebhook.js.map +1 -1
- package/dist/routes/internal.d.ts +14 -0
- package/dist/routes/internal.d.ts.map +1 -0
- package/dist/routes/internal.js +157 -0
- package/dist/routes/internal.js.map +1 -0
- package/dist/routes/node.d.ts.map +1 -1
- package/dist/routes/node.js +44 -2
- package/dist/routes/node.js.map +1 -1
- package/dist/routes/observerToken.js +1 -1
- package/dist/routes/observerToken.js.map +1 -1
- package/dist/routes/reaction.d.ts.map +1 -1
- package/dist/routes/reaction.js +3 -2
- package/dist/routes/reaction.js.map +1 -1
- package/dist/routes/receipt.d.ts.map +1 -1
- package/dist/routes/receipt.js +2 -1
- package/dist/routes/receipt.js.map +1 -1
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +12 -1
- package/dist/routes/workspace.js.map +1 -1
- package/package.json +12 -3
package/dist/engine/file.js
CHANGED
|
@@ -2,9 +2,20 @@ import { eq, and, ne, sql } from 'drizzle-orm';
|
|
|
2
2
|
import { files, agents } from '../db/schema.js';
|
|
3
3
|
import { generateId } from './snowflake.js';
|
|
4
4
|
import { codedError } from '../lib/httpError.js';
|
|
5
|
+
/**
|
|
6
|
+
* The object name of a file in storage: its id plus at most a short
|
|
7
|
+
* alphanumeric extension from the client filename. Storage keys are
|
|
8
|
+
* `<workspace_id>/<file_id>/<object_name>`; the client's filename never
|
|
9
|
+
* appears in them (it lives only in file metadata), so a key cannot traverse,
|
|
10
|
+
* exceed a filesystem name limit, or depend on the filename's encoding.
|
|
11
|
+
*/
|
|
12
|
+
export function storageObjectName(fileId, filename) {
|
|
13
|
+
const extension = /\.([A-Za-z0-9]{1,10})$/.exec(filename)?.[1]?.toLowerCase();
|
|
14
|
+
return extension ? `${fileId}.${extension}` : fileId;
|
|
15
|
+
}
|
|
5
16
|
export async function createUpload(db, storage, workspaceId, agentId, data) {
|
|
6
17
|
const id = generateId();
|
|
7
|
-
const storageKey = `${workspaceId}/${id}/${data.filename}`;
|
|
18
|
+
const storageKey = `${workspaceId}/${id}/${storageObjectName(id, data.filename)}`;
|
|
8
19
|
// Sign the upload URL before persisting, so a storage error doesn't leave an
|
|
9
20
|
// orphaned `pending` row behind.
|
|
10
21
|
const { uploadUrl, expiresAt } = await storage.createUploadUrl({
|
|
@@ -41,15 +52,17 @@ export async function completeUpload(db, storage, workspaceId, fileId, agentId)
|
|
|
41
52
|
if (!file || file.uploadedBy !== agentId || file.status !== 'pending') {
|
|
42
53
|
return null;
|
|
43
54
|
}
|
|
44
|
-
// A completed file is attachable, so its bytes must actually be stored
|
|
45
|
-
//
|
|
46
|
-
|
|
55
|
+
// A completed file is attachable, so its bytes must actually be stored, and
|
|
56
|
+
// exactly as many as the upload declared.
|
|
57
|
+
const sizeBytes = file.sizeBytes;
|
|
47
58
|
if (storage.statObject) {
|
|
48
59
|
const stored = await storage.statObject({ storageKey: file.storageKey });
|
|
49
60
|
if (!stored || stored.sizeBytes === 0) {
|
|
50
61
|
throw codedError('Upload not received: PUT the file bytes to upload_url before completing', 'upload_incomplete', 409);
|
|
51
62
|
}
|
|
52
|
-
|
|
63
|
+
if (stored.sizeBytes !== sizeBytes) {
|
|
64
|
+
throw codedError(`Stored ${stored.sizeBytes} bytes, but the upload declared ${sizeBytes}`, 'upload_size_mismatch', 409);
|
|
65
|
+
}
|
|
53
66
|
}
|
|
54
67
|
// Generate the URL before flipping status, so a transient storage error keeps
|
|
55
68
|
// completeUpload retry-safe (the row stays `pending` rather than `complete`).
|
package/dist/engine/file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/engine/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAM,EACN,OAAoB,EACpB,WAAmB,EACnB,OAAe,EACf,IAAoE;IAEpE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,GAAG,WAAW,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/engine/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,6 +55,8 @@ export declare function triggerWebhook(db: Db, webhookId: string, token: string
|
|
|
55
55
|
}): Promise<{
|
|
56
56
|
_deliveries: import("./deliveryWrites.js").DeliveryFanoutRecord[];
|
|
57
57
|
_delivery_rejections: import("./deliveryWrites.js").DeliveryRejectionRecord[];
|
|
58
|
+
/** Whether the bearer token authenticated the call (the webhook requires one). */
|
|
59
|
+
_token_verified: boolean;
|
|
58
60
|
message_id: string;
|
|
59
61
|
agent_id: string;
|
|
60
62
|
webhook_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inboundWebhook.d.ts","sourceRoot":"","sources":["../../src/engine/inboundWebhook.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAS5C,OAAO,EAAwF,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9I,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"inboundWebhook.d.ts","sourceRoot":"","sources":["../../src/engine/inboundWebhook.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAS5C,OAAO,EAAwF,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9I,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAK5E,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAwCnC,wBAAsB,aAAa,CACjC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACvB,SAAS,CAAC,EAAE,MAAM;;;;;;;;GAkCnB;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM;;;;;;;;;;;KA4B7D;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;UAyB9E;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,oBAOjF;AAUD,iFAAiF;AACjF,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAGnD,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAQ5E;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,EACD,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC;IACnE,uBAAuB,CAAC,EAAE,uBAAuB,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,uBAAuB,GAAG,SAAS,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC,CAAC;CAC9J;;;IAoHJ,kFAAkF;;;;;;;;;;;;;UAcrF;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,EACD,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,aAAa,CAAC;IAAC,uBAAuB,CAAC,EAAE,uBAAuB,CAAA;CAAO;;;;;;;;;;;;GAoG7F"}
|
|
@@ -2,7 +2,7 @@ import { prepareAuthorityFanout } from './deliveryWrites.js';
|
|
|
2
2
|
import { eq, and } from 'drizzle-orm';
|
|
3
3
|
import { webhooks, channels, messages, agents, workspaces } from '../db/schema.js';
|
|
4
4
|
import { isWorkspaceExpired } from '../auth/workspaceExpiry.js';
|
|
5
|
-
import {
|
|
5
|
+
import { sha256Hex } from '../lib/crypto.js';
|
|
6
6
|
import { codedError } from '../lib/httpError.js';
|
|
7
7
|
import { generateId } from './snowflake.js';
|
|
8
8
|
import { inboundWebhookMessageMetadata, sanitizeUserMessageMetadata, WEBHOOK_AGENT_NAME } from './messageMetadata.js';
|
|
@@ -10,6 +10,8 @@ import { runAtomicWrites, databaseConstraintKind } from '../ports/database.js';
|
|
|
10
10
|
import { buildChannelDeliveryWrite, fetchChannelDeliveryOutcomes } from './deliveryWrites.js';
|
|
11
11
|
import { DEFAULT_MAILBOX_DEPTH_CAP, DEFAULT_MAILBOX_TTL_MS, DEFAULT_OFFLINE_FANOUT_EXCLUDE_MS } from './mailboxConfig.js';
|
|
12
12
|
import { buildMessageSessionWrite, requireSessionRefFromMetadata } from './sessionMessages.js';
|
|
13
|
+
import { issueCredential } from '../auth/credentials.js';
|
|
14
|
+
import { upgradedLegacyCredential } from './credentialUpgrade.js';
|
|
13
15
|
async function ensureWebhookAgent(db, workspaceId) {
|
|
14
16
|
const [existing] = await db
|
|
15
17
|
.select({ id: agents.id })
|
|
@@ -17,7 +19,7 @@ async function ensureWebhookAgent(db, workspaceId) {
|
|
|
17
19
|
.where(and(eq(agents.workspaceId, workspaceId), eq(agents.name, WEBHOOK_AGENT_NAME)));
|
|
18
20
|
if (existing)
|
|
19
21
|
return existing.id;
|
|
20
|
-
const token =
|
|
22
|
+
const token = await issueCredential(db, 'agent', workspaceId);
|
|
21
23
|
const tokenHash = await sha256Hex(token);
|
|
22
24
|
const agentId = generateId();
|
|
23
25
|
await db
|
|
@@ -44,7 +46,7 @@ async function ensureWebhookAgent(db, workspaceId) {
|
|
|
44
46
|
}
|
|
45
47
|
export async function createWebhook(db, workspaceId, channelId, data, createdBy) {
|
|
46
48
|
const id = `wh_${generateId()}`;
|
|
47
|
-
const token =
|
|
49
|
+
const token = await issueCredential(db, 'webhook', workspaceId);
|
|
48
50
|
const tokenHash = await sha256Hex(token);
|
|
49
51
|
const postingAgentId = createdBy ?? await ensureWebhookAgent(db, workspaceId);
|
|
50
52
|
const [webhook] = await db
|
|
@@ -177,7 +179,9 @@ export async function triggerWebhook(db, webhookId, token, data, options = {}) {
|
|
|
177
179
|
throw codedError('Webhook bearer token required', 'webhook_token_required', 401);
|
|
178
180
|
}
|
|
179
181
|
const tokenHash = await sha256Hex(token);
|
|
180
|
-
|
|
182
|
+
// An upgraded legacy token works during its grace (`POST /v1/credentials/upgrade`).
|
|
183
|
+
if (tokenHash !== webhook.tokenHash
|
|
184
|
+
&& (await upgradedLegacyCredential(db, 'webhook', tokenHash))?.principalId !== webhook.id) {
|
|
181
185
|
throw codedError('Invalid webhook bearer token', 'webhook_token_invalid', 401);
|
|
182
186
|
}
|
|
183
187
|
}
|
|
@@ -259,6 +263,8 @@ export async function triggerWebhook(db, webhookId, token, data, options = {}) {
|
|
|
259
263
|
return {
|
|
260
264
|
_deliveries: outcomes.deliveries,
|
|
261
265
|
_delivery_rejections: outcomes.rejections,
|
|
266
|
+
/** Whether the bearer token authenticated the call (the webhook requires one). */
|
|
267
|
+
_token_verified: webhook.tokenHash !== null,
|
|
262
268
|
message_id: message.id,
|
|
263
269
|
agent_id: message.agentId,
|
|
264
270
|
webhook_id: webhook.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inboundWebhook.js","sourceRoot":"","sources":["../../src/engine/inboundWebhook.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"inboundWebhook.js","sourceRoot":"","sources":["../../src/engine/inboundWebhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { getDb } from '../db/index.js';
|
|
2
|
+
type Db = ReturnType<typeof getDb>;
|
|
3
|
+
/**
|
|
4
|
+
* Capability advertisement for a control plane driving the internal admin API.
|
|
5
|
+
*
|
|
6
|
+
* The `workspace_key_push` block is the hosted gateway's contract verbatim, so
|
|
7
|
+
* a control plane's pre-rotation capability gate passes unchanged. On the
|
|
8
|
+
* self-host engine every key fence lives in the same SQLite row and there is
|
|
9
|
+
* no auth cache, so `revocation_markers` is satisfied by the previous-key slot
|
|
10
|
+
* itself: a superseded key stops authenticating the moment its slot expires,
|
|
11
|
+
* with no KV marker to arm or repair.
|
|
12
|
+
*
|
|
13
|
+
* `workspace_admin` is a self-host extension (absent on the hosted gateway):
|
|
14
|
+
* `create` advertises POST /internal/workspaces and `server_minted_key` that
|
|
15
|
+
* POST /internal/workspaces/:id/api-key may omit `api_key` to have the engine
|
|
16
|
+
* mint the replacement.
|
|
17
|
+
*/
|
|
18
|
+
export declare const INTERNAL_CAPABILITIES: {
|
|
19
|
+
readonly workspace_key_push: {
|
|
20
|
+
readonly generation_cas: true;
|
|
21
|
+
readonly generation_required_once_fenced: true;
|
|
22
|
+
readonly grace_ms: true;
|
|
23
|
+
readonly max_grace_ms: 3600000;
|
|
24
|
+
readonly revocation_markers: true;
|
|
25
|
+
readonly previous_key_slot: true;
|
|
26
|
+
};
|
|
27
|
+
readonly workspace_admin: {
|
|
28
|
+
readonly create: true;
|
|
29
|
+
readonly delete: true;
|
|
30
|
+
readonly server_minted_key: true;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export interface InternalWorkspaceDeletionFence {
|
|
34
|
+
commit(): void;
|
|
35
|
+
release(): void;
|
|
36
|
+
}
|
|
37
|
+
export declare function beginInternalWorkspaceDeletion(db: Db, workspaceId: string): InternalWorkspaceDeletionFence;
|
|
38
|
+
/** Minimum length of `config.internalSecret` (e.g. `openssl rand -hex 32` is 64). */
|
|
39
|
+
export declare const MIN_INTERNAL_SECRET_LENGTH = 32;
|
|
40
|
+
/**
|
|
41
|
+
* Throw when a configured internal secret is too short to be a credential.
|
|
42
|
+
* Unset/empty is fine (the admin API stays disabled).
|
|
43
|
+
*/
|
|
44
|
+
export declare function assertInternalSecretStrength(secret: string | undefined): void;
|
|
45
|
+
export interface PushWorkspaceKeyInput {
|
|
46
|
+
/** Caller-minted `rk_live_` key. Omitted → the engine mints one (self-host extension). */
|
|
47
|
+
apiKey?: string;
|
|
48
|
+
keyGeneration?: number;
|
|
49
|
+
graceMs?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface PushWorkspaceKeyResult {
|
|
52
|
+
created: boolean;
|
|
53
|
+
workspaceId: string;
|
|
54
|
+
apiKeyGeneration: number;
|
|
55
|
+
/** Present only when the engine minted the key; returned exactly once. */
|
|
56
|
+
mintedApiKey?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Register or rotate a workspace's API key on behalf of a trusted control
|
|
60
|
+
* plane — the self-host port of the hosted gateway's
|
|
61
|
+
* `POST /internal/workspaces/:id/api-key`.
|
|
62
|
+
*
|
|
63
|
+
* Semantics (identical to hosted where they overlap):
|
|
64
|
+
* - UPSERT: a missing workspace is created with `id = name = :id` (plus its
|
|
65
|
+
* `#general` channel) when the caller supplies the key. A server-minted
|
|
66
|
+
* rotation of a missing workspace is 404 instead — create it explicitly.
|
|
67
|
+
* - Re-pushing the live key is idempotent at any generation; a higher
|
|
68
|
+
* generation bumps the stored fence.
|
|
69
|
+
* - A hash-changing push carrying `key_generation` commits only through a CAS
|
|
70
|
+
* on (current hash, generation < N); a stale or out-of-order write is 409
|
|
71
|
+
* `stale_key_generation`. The superseded key keeps authenticating for
|
|
72
|
+
* `grace_ms` (default 0: dead immediately).
|
|
73
|
+
* - Once fenced (generation > 0), generationless hash changes are 409
|
|
74
|
+
* `key_generation_required`.
|
|
75
|
+
* - Server-minted rotation (no `api_key`) always fences: it uses
|
|
76
|
+
* `key_generation` when given, otherwise stored generation + 1.
|
|
77
|
+
*/
|
|
78
|
+
export declare function pushWorkspaceKey(db: Db, workspaceId: string, input: PushWorkspaceKeyInput): Promise<PushWorkspaceKeyResult>;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=internalAdmin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internalAdmin.d.ts","sourceRoot":"","sources":["../../src/engine/internalAdmin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAS5C,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;CAcxB,CAAC;AAuBX,MAAM,WAAW,8BAA8B;IAC7C,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,GAClB,8BAA8B,CAiBhC;AAQD,qFAAqF;AACrF,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAY7E;AAED,MAAM,WAAW,qBAAqB;IACpC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAkGD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA0KjC"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { and, eq, exists, gt, lt, ne, notExists, or, sql } from 'drizzle-orm';
|
|
2
|
+
import { alias } from 'drizzle-orm/sqlite-core';
|
|
3
|
+
import { channels, workspaces } from '../db/schema.js';
|
|
4
|
+
import { sha256Hex } from '../lib/crypto.js';
|
|
5
|
+
import { issueCredential } from '../auth/credentials.js';
|
|
6
|
+
import { codedError } from '../lib/httpError.js';
|
|
7
|
+
import { runAtomicWrites } from '../ports/database.js';
|
|
8
|
+
import { generateId } from './snowflake.js';
|
|
9
|
+
import { WORKSPACE_KEY_MAX_GRACE_MS } from './tokenRotate.js';
|
|
10
|
+
/**
|
|
11
|
+
* Capability advertisement for a control plane driving the internal admin API.
|
|
12
|
+
*
|
|
13
|
+
* The `workspace_key_push` block is the hosted gateway's contract verbatim, so
|
|
14
|
+
* a control plane's pre-rotation capability gate passes unchanged. On the
|
|
15
|
+
* self-host engine every key fence lives in the same SQLite row and there is
|
|
16
|
+
* no auth cache, so `revocation_markers` is satisfied by the previous-key slot
|
|
17
|
+
* itself: a superseded key stops authenticating the moment its slot expires,
|
|
18
|
+
* with no KV marker to arm or repair.
|
|
19
|
+
*
|
|
20
|
+
* `workspace_admin` is a self-host extension (absent on the hosted gateway):
|
|
21
|
+
* `create` advertises POST /internal/workspaces and `server_minted_key` that
|
|
22
|
+
* POST /internal/workspaces/:id/api-key may omit `api_key` to have the engine
|
|
23
|
+
* mint the replacement.
|
|
24
|
+
*/
|
|
25
|
+
export const INTERNAL_CAPABILITIES = {
|
|
26
|
+
workspace_key_push: {
|
|
27
|
+
generation_cas: true,
|
|
28
|
+
generation_required_once_fenced: true,
|
|
29
|
+
grace_ms: true,
|
|
30
|
+
max_grace_ms: WORKSPACE_KEY_MAX_GRACE_MS,
|
|
31
|
+
revocation_markers: true,
|
|
32
|
+
previous_key_slot: true,
|
|
33
|
+
},
|
|
34
|
+
workspace_admin: {
|
|
35
|
+
create: true,
|
|
36
|
+
delete: true,
|
|
37
|
+
server_minted_key: true,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const internalDeletionFences = new WeakMap();
|
|
41
|
+
function deletionFences(db) {
|
|
42
|
+
const key = db;
|
|
43
|
+
const existing = internalDeletionFences.get(key);
|
|
44
|
+
if (existing)
|
|
45
|
+
return existing;
|
|
46
|
+
const created = new Map();
|
|
47
|
+
internalDeletionFences.set(key, created);
|
|
48
|
+
return created;
|
|
49
|
+
}
|
|
50
|
+
export function beginInternalWorkspaceDeletion(db, workspaceId) {
|
|
51
|
+
const fences = deletionFences(db);
|
|
52
|
+
const state = fences.get(workspaceId) ?? { active: 0, tombstoned: false };
|
|
53
|
+
state.active += 1;
|
|
54
|
+
fences.set(workspaceId, state);
|
|
55
|
+
let settled = false;
|
|
56
|
+
const settle = (committed) => {
|
|
57
|
+
if (settled)
|
|
58
|
+
return;
|
|
59
|
+
settled = true;
|
|
60
|
+
state.active -= 1;
|
|
61
|
+
if (committed)
|
|
62
|
+
state.tombstoned = true;
|
|
63
|
+
if (state.active === 0 && !state.tombstoned)
|
|
64
|
+
fences.delete(workspaceId);
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
commit: () => settle(true),
|
|
68
|
+
release: () => settle(false),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function assertInternalWorkspaceWritable(db, workspaceId) {
|
|
72
|
+
if (deletionFences(db).has(workspaceId)) {
|
|
73
|
+
throw codedError('Workspace is being deleted', 'workspace_deleted', 410);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Minimum length of `config.internalSecret` (e.g. `openssl rand -hex 32` is 64). */
|
|
77
|
+
export const MIN_INTERNAL_SECRET_LENGTH = 32;
|
|
78
|
+
/**
|
|
79
|
+
* Throw when a configured internal secret is too short to be a credential.
|
|
80
|
+
* Unset/empty is fine (the admin API stays disabled).
|
|
81
|
+
*/
|
|
82
|
+
export function assertInternalSecretStrength(secret) {
|
|
83
|
+
if (secret === undefined || secret === '')
|
|
84
|
+
return;
|
|
85
|
+
if (secret !== secret.trim()) {
|
|
86
|
+
// The route trims the presented bearer, so a padded secret could never match.
|
|
87
|
+
throw new Error('RELAYCAST_INTERNAL_SECRET must not have leading or trailing whitespace');
|
|
88
|
+
}
|
|
89
|
+
if (secret.length < MIN_INTERNAL_SECRET_LENGTH) {
|
|
90
|
+
throw new Error(`RELAYCAST_INTERNAL_SECRET must be at least ${MIN_INTERNAL_SECRET_LENGTH} characters ` +
|
|
91
|
+
'(generate one with `openssl rand -hex 32`)');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function staleGeneration(workspaceId, requested, stored) {
|
|
95
|
+
return codedError(`key_generation ${requested} does not beat the stored generation ${stored} for workspace ` +
|
|
96
|
+
`${workspaceId}; the push is stale and was not applied`, 'stale_key_generation', 409);
|
|
97
|
+
}
|
|
98
|
+
function isUniqueConstraintError(err) {
|
|
99
|
+
const seen = new Set();
|
|
100
|
+
let cause = err;
|
|
101
|
+
while (cause && typeof cause === 'object' && !seen.has(cause)) {
|
|
102
|
+
seen.add(cause);
|
|
103
|
+
const e = cause;
|
|
104
|
+
if (e.code === 'SQLITE_CONSTRAINT_UNIQUE' || e.code === 'SQLITE_CONSTRAINT_PRIMARYKEY')
|
|
105
|
+
return true;
|
|
106
|
+
if (typeof e.message === 'string' && e.message.toLowerCase().includes('unique constraint failed'))
|
|
107
|
+
return true;
|
|
108
|
+
cause = e.cause;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A server-minted key in the deployment's credential family. A deployment
|
|
114
|
+
* that mints `ar_` credentials admits only snowflake workspace ids (the route
|
|
115
|
+
* checks before writing; `issueCredential` refuses as the backstop).
|
|
116
|
+
*/
|
|
117
|
+
function mintWorkspaceKey(db, workspaceId) {
|
|
118
|
+
return issueCredential(db, 'workspace', workspaceId);
|
|
119
|
+
}
|
|
120
|
+
/** The create batch's ownership guard tripped (see pushWorkspaceKey). */
|
|
121
|
+
function isKeyGuardViolation(err) {
|
|
122
|
+
const seen = new Set();
|
|
123
|
+
let cause = err;
|
|
124
|
+
while (cause && typeof cause === 'object' && !seen.has(cause)) {
|
|
125
|
+
seen.add(cause);
|
|
126
|
+
const e = cause;
|
|
127
|
+
if (typeof e.message === 'string' && /NOT NULL constraint failed: channels\.workspace_id/i.test(e.message))
|
|
128
|
+
return true;
|
|
129
|
+
cause = e.cause;
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
async function readKeyRow(db, workspaceId) {
|
|
134
|
+
const [row] = await db
|
|
135
|
+
.select({ id: workspaces.id, apiKeyHash: workspaces.apiKeyHash, apiKeyGeneration: workspaces.apiKeyGeneration })
|
|
136
|
+
.from(workspaces)
|
|
137
|
+
.where(eq(workspaces.id, workspaceId));
|
|
138
|
+
return row;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Rows of *other* workspaces that hold `apiKeyHash` as a credential that still
|
|
142
|
+
* authenticates — their current key, or a previous key inside its grace
|
|
143
|
+
* window. Authentication resolves current-slot matches before previous-slot
|
|
144
|
+
* matches, so binding a key that is live in another workspace's grace slot
|
|
145
|
+
* would silently move that workspace's callers onto this one.
|
|
146
|
+
*/
|
|
147
|
+
function liveElsewhereQuery(db, apiKeyHash, workspaceId) {
|
|
148
|
+
const other = alias(workspaces, 'other_workspace');
|
|
149
|
+
return db
|
|
150
|
+
.select({ id: other.id })
|
|
151
|
+
.from(other)
|
|
152
|
+
.where(and(ne(other.id, workspaceId), or(eq(other.apiKeyHash, apiKeyHash), and(eq(other.previousApiKeyHash, apiKeyHash), gt(other.previousApiKeyExpiresAt, new Date())))));
|
|
153
|
+
}
|
|
154
|
+
async function keyOwnedElsewhere(db, apiKeyHash, workspaceId) {
|
|
155
|
+
const [owner] = await liveElsewhereQuery(db, apiKeyHash, workspaceId).limit(1);
|
|
156
|
+
return Boolean(owner);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The same ownership invariant as a guard on the key-changing UPDATE, so a
|
|
160
|
+
* concurrent rotation elsewhere cannot slip in between the pre-check and the
|
|
161
|
+
* write.
|
|
162
|
+
*/
|
|
163
|
+
function keyFreeElsewhere(db, apiKeyHash, workspaceId) {
|
|
164
|
+
return notExists(liveElsewhereQuery(db, apiKeyHash, workspaceId));
|
|
165
|
+
}
|
|
166
|
+
function keyConflict() {
|
|
167
|
+
return codedError('api_key is already bound to a different workspace', 'api_key_conflict', 409);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Register or rotate a workspace's API key on behalf of a trusted control
|
|
171
|
+
* plane — the self-host port of the hosted gateway's
|
|
172
|
+
* `POST /internal/workspaces/:id/api-key`.
|
|
173
|
+
*
|
|
174
|
+
* Semantics (identical to hosted where they overlap):
|
|
175
|
+
* - UPSERT: a missing workspace is created with `id = name = :id` (plus its
|
|
176
|
+
* `#general` channel) when the caller supplies the key. A server-minted
|
|
177
|
+
* rotation of a missing workspace is 404 instead — create it explicitly.
|
|
178
|
+
* - Re-pushing the live key is idempotent at any generation; a higher
|
|
179
|
+
* generation bumps the stored fence.
|
|
180
|
+
* - A hash-changing push carrying `key_generation` commits only through a CAS
|
|
181
|
+
* on (current hash, generation < N); a stale or out-of-order write is 409
|
|
182
|
+
* `stale_key_generation`. The superseded key keeps authenticating for
|
|
183
|
+
* `grace_ms` (default 0: dead immediately).
|
|
184
|
+
* - Once fenced (generation > 0), generationless hash changes are 409
|
|
185
|
+
* `key_generation_required`.
|
|
186
|
+
* - Server-minted rotation (no `api_key`) always fences: it uses
|
|
187
|
+
* `key_generation` when given, otherwise stored generation + 1.
|
|
188
|
+
*/
|
|
189
|
+
export async function pushWorkspaceKey(db, workspaceId, input) {
|
|
190
|
+
assertInternalWorkspaceWritable(db, workspaceId);
|
|
191
|
+
const minted = input.apiKey === undefined;
|
|
192
|
+
const apiKey = input.apiKey ?? await mintWorkspaceKey(db, workspaceId);
|
|
193
|
+
const apiKeyHash = await sha256Hex(apiKey);
|
|
194
|
+
const { graceMs } = input;
|
|
195
|
+
let keyGeneration = input.keyGeneration;
|
|
196
|
+
// A server-minted rotation without key_generation fences at stored + 1,
|
|
197
|
+
// re-derived from each fresh read so a lost race retries instead of
|
|
198
|
+
// reporting a stale generation the caller never sent.
|
|
199
|
+
const derivedGeneration = minted && input.keyGeneration === undefined;
|
|
200
|
+
let row = await readKeyRow(db, workspaceId);
|
|
201
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
202
|
+
assertInternalWorkspaceWritable(db, workspaceId);
|
|
203
|
+
if (!row) {
|
|
204
|
+
if (minted)
|
|
205
|
+
throw codedError('Workspace not found', 'workspace_not_found', 404);
|
|
206
|
+
if (await keyOwnedElsewhere(db, apiKeyHash, workspaceId))
|
|
207
|
+
throw keyConflict();
|
|
208
|
+
const generation = keyGeneration ?? 0;
|
|
209
|
+
// Re-check after the awaits above: a delete may have claimed the id.
|
|
210
|
+
assertInternalWorkspaceWritable(db, workspaceId);
|
|
211
|
+
try {
|
|
212
|
+
await runAtomicWrites(db, (writeDb) => [
|
|
213
|
+
writeDb.insert(workspaces).values({
|
|
214
|
+
id: workspaceId,
|
|
215
|
+
name: workspaceId,
|
|
216
|
+
apiKeyHash,
|
|
217
|
+
apiKeyGeneration: generation,
|
|
218
|
+
}),
|
|
219
|
+
// Ownership guard inside the batch: if another workspace took this
|
|
220
|
+
// key (current slot, or a previous slot still in grace) after the
|
|
221
|
+
// pre-check, the NULL workspace_id fails NOT NULL and the whole
|
|
222
|
+
// batch, including the workspace insert, rolls back.
|
|
223
|
+
writeDb.insert(channels).values({
|
|
224
|
+
id: generateId(),
|
|
225
|
+
workspaceId: sql `(CASE WHEN ${exists(liveElsewhereQuery(writeDb, apiKeyHash, workspaceId))} THEN NULL ELSE ${workspaceId} END)`,
|
|
226
|
+
name: 'general',
|
|
227
|
+
topic: 'General discussion',
|
|
228
|
+
}),
|
|
229
|
+
], { requireAtomic: true });
|
|
230
|
+
return { created: true, workspaceId, apiKeyGeneration: generation };
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
if (isKeyGuardViolation(error))
|
|
234
|
+
throw keyConflict();
|
|
235
|
+
if (!isUniqueConstraintError(error))
|
|
236
|
+
throw error;
|
|
237
|
+
// A concurrent push created the row — re-decide against it. Otherwise
|
|
238
|
+
// the key hash collided with another workspace.
|
|
239
|
+
const fresh = await readKeyRow(db, workspaceId);
|
|
240
|
+
if (!fresh)
|
|
241
|
+
throw keyConflict();
|
|
242
|
+
row = fresh;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const stored = row.apiKeyGeneration ?? 0;
|
|
247
|
+
if (row.apiKeyHash === apiKeyHash) {
|
|
248
|
+
// Idempotent re-push of the live key; a higher generation bumps the fence.
|
|
249
|
+
if (keyGeneration !== undefined && keyGeneration > stored) {
|
|
250
|
+
assertInternalWorkspaceWritable(db, workspaceId);
|
|
251
|
+
const bumped = await db
|
|
252
|
+
.update(workspaces)
|
|
253
|
+
.set({ apiKeyGeneration: keyGeneration })
|
|
254
|
+
.where(and(eq(workspaces.id, row.id), eq(workspaces.apiKeyHash, apiKeyHash), lt(workspaces.apiKeyGeneration, keyGeneration)))
|
|
255
|
+
.returning({ id: workspaces.id });
|
|
256
|
+
if (bumped.length === 0) {
|
|
257
|
+
row = await readKeyRow(db, workspaceId);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
return { created: false, workspaceId, apiKeyGeneration: keyGeneration };
|
|
261
|
+
}
|
|
262
|
+
return { created: false, workspaceId, apiKeyGeneration: stored };
|
|
263
|
+
}
|
|
264
|
+
if (await keyOwnedElsewhere(db, apiKeyHash, workspaceId))
|
|
265
|
+
throw keyConflict();
|
|
266
|
+
if (derivedGeneration) {
|
|
267
|
+
if (stored >= Number.MAX_SAFE_INTEGER) {
|
|
268
|
+
throw codedError(`workspace ${workspaceId} is at the maximum api_key_generation; it cannot be rotated further`, 'key_generation_exhausted', 409);
|
|
269
|
+
}
|
|
270
|
+
keyGeneration = stored + 1;
|
|
271
|
+
}
|
|
272
|
+
if (keyGeneration === undefined) {
|
|
273
|
+
if (stored > 0) {
|
|
274
|
+
throw codedError(`workspace ${workspaceId} is fenced at api_key_generation ${stored}; ` +
|
|
275
|
+
'pushes that change the key must carry key_generation greater than that', 'key_generation_required', 409);
|
|
276
|
+
}
|
|
277
|
+
assertInternalWorkspaceWritable(db, workspaceId);
|
|
278
|
+
const applied = await db
|
|
279
|
+
.update(workspaces)
|
|
280
|
+
.set({ apiKeyHash })
|
|
281
|
+
.where(and(eq(workspaces.id, row.id), eq(workspaces.apiKeyHash, row.apiKeyHash), eq(workspaces.apiKeyGeneration, 0), keyFreeElsewhere(db, apiKeyHash, row.id)))
|
|
282
|
+
.returning({ id: workspaces.id });
|
|
283
|
+
if (applied.length === 0) {
|
|
284
|
+
row = await readKeyRow(db, workspaceId);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
return { created: false, workspaceId, apiKeyGeneration: 0 };
|
|
288
|
+
}
|
|
289
|
+
if (keyGeneration <= stored)
|
|
290
|
+
throw staleGeneration(workspaceId, keyGeneration, stored);
|
|
291
|
+
const grace = graceMs ?? 0;
|
|
292
|
+
// Zero grace (compromise) leaves no authenticatable previous slot: the
|
|
293
|
+
// auth lookup requires a strictly-future expiry, and null never matches.
|
|
294
|
+
const previousExpiresAt = grace === 0 ? null : new Date(Date.now() + grace);
|
|
295
|
+
assertInternalWorkspaceWritable(db, workspaceId);
|
|
296
|
+
const applied = await db
|
|
297
|
+
.update(workspaces)
|
|
298
|
+
.set({
|
|
299
|
+
apiKeyHash,
|
|
300
|
+
apiKeyGeneration: keyGeneration,
|
|
301
|
+
previousApiKeyHash: row.apiKeyHash,
|
|
302
|
+
previousApiKeyExpiresAt: previousExpiresAt,
|
|
303
|
+
})
|
|
304
|
+
.where(and(eq(workspaces.id, row.id), eq(workspaces.apiKeyHash, row.apiKeyHash), lt(workspaces.apiKeyGeneration, keyGeneration), keyFreeElsewhere(db, apiKeyHash, row.id)))
|
|
305
|
+
.returning({ id: workspaces.id });
|
|
306
|
+
if (applied.length === 0) {
|
|
307
|
+
const fresh = await readKeyRow(db, workspaceId);
|
|
308
|
+
// A concurrent push of the same key won. Done only if its generation
|
|
309
|
+
// already covers ours; otherwise loop so the idempotent branch bumps
|
|
310
|
+
// the fence to the requested generation.
|
|
311
|
+
if (fresh && fresh.apiKeyHash === apiKeyHash && keyGeneration <= fresh.apiKeyGeneration) {
|
|
312
|
+
return { created: false, workspaceId, apiKeyGeneration: fresh.apiKeyGeneration };
|
|
313
|
+
}
|
|
314
|
+
if (fresh && !derivedGeneration && keyGeneration <= fresh.apiKeyGeneration) {
|
|
315
|
+
throw staleGeneration(workspaceId, keyGeneration, fresh.apiKeyGeneration);
|
|
316
|
+
}
|
|
317
|
+
row = fresh;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
created: false,
|
|
322
|
+
workspaceId,
|
|
323
|
+
apiKeyGeneration: keyGeneration,
|
|
324
|
+
...(minted ? { mintedApiKey: apiKey } : {}),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
throw codedError(`Concurrent key writes are contending workspace ${workspaceId}; retry`, 'key_write_conflict', 409);
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=internalAdmin.js.map
|