@relaycast/engine 12.2.0 → 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/0078_dm_participant_read_cursor.sql +15 -0
- package/dist/db/migrations/0079_credential_upgrades.sql +17 -0
- package/dist/db/schema.d.ts +183 -2
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +23 -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/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +70 -31
- package/dist/engine/delivery.js.map +1 -1
- 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/inbox.d.ts.map +1 -1
- package/dist/engine/inbox.js +10 -5
- package/dist/engine/inbox.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/receipt.d.ts +100 -0
- package/dist/engine/receipt.d.ts.map +1 -1
- package/dist/engine/receipt.js +12 -0
- package/dist/engine/receipt.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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internalAdmin.js","sourceRoot":"","sources":["../../src/engine/internalAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocationCompletion.d.ts","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"invocationCompletion.d.ts","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,GAAG,QAAQ,CAAC,CAAC;AAE3H,KAAK,gBAAgB,GAAG;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAWF,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,wBAAwB,EAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAqCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGlE;AAeD,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,wBAAwB,GAAG,UAAU,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,wBAAwB,EAC9B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,cAAc,GAAG,cAAc,CAAC;AAErF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,GAAG,UAAU,GAAG,cAAc,CAAC,EACxE,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAqDf"}
|
|
@@ -5,6 +5,7 @@ import { enqueueEvent } from './eventQueue.js';
|
|
|
5
5
|
import { actionInvocations, nodes } from '../db/schema.js';
|
|
6
6
|
import { sendNodeDeliveriesToAgents } from './nodeDeliver.js';
|
|
7
7
|
import { appendAndPublishWorkspaceEvent, appendAndPublishWorkspaceEventWhen } from './workspaceEvents.js';
|
|
8
|
+
import { ephemeralEventFetch } from '../ports/index.js';
|
|
8
9
|
function buildEvent(type, workspaceId, data) {
|
|
9
10
|
return {
|
|
10
11
|
type,
|
|
@@ -32,7 +33,7 @@ export async function emitInvocationCompletionEffects(deps, workspaceId, result)
|
|
|
32
33
|
workspaceId,
|
|
33
34
|
environment: deps.config?.environment,
|
|
34
35
|
httpPushProxy: deps.config?.httpPushProxy,
|
|
35
|
-
|
|
36
|
+
ephemeralEventFetch: ephemeralEventFetch(deps.config),
|
|
36
37
|
}, {
|
|
37
38
|
agentIds: [result.caller_id],
|
|
38
39
|
event: eventType,
|
|
@@ -129,7 +130,7 @@ export async function emitAgentExitedEffects(deps, workspaceId, input) {
|
|
|
129
130
|
workspaceId,
|
|
130
131
|
environment: deps.config?.environment,
|
|
131
132
|
httpPushProxy: deps.config?.httpPushProxy,
|
|
132
|
-
|
|
133
|
+
ephemeralEventFetch: ephemeralEventFetch(deps.config),
|
|
133
134
|
}, {
|
|
134
135
|
agentIds: [callerId],
|
|
135
136
|
event: eventType,
|
|
@@ -160,15 +161,32 @@ export async function emitNodeStatusEffects(deps, workspaceId, input) {
|
|
|
160
161
|
const event = buildEvent(eventType, workspaceId, eventData);
|
|
161
162
|
const payload = transformForClient(event);
|
|
162
163
|
if (input.status === 'offline' && input.claimRevision !== undefined) {
|
|
163
|
-
const appended = await appendAndPublishWorkspaceEventWhen({ db: deps.db, realtime: deps.realtime }, workspaceId, { type: eventType, payload },
|
|
164
|
+
const appended = await appendAndPublishWorkspaceEventWhen({ db: deps.db, realtime: deps.realtime }, workspaceId, { type: eventType, payload },
|
|
165
|
+
// Two writers can finish one claim (a forced delete completes another
|
|
166
|
+
// isolate's claim tail), so the transition is also skipped when the
|
|
167
|
+
// newest status event for the node since the claim (the row's
|
|
168
|
+
// heartbeat) is already offline. Part of the same INSERT, so the check
|
|
169
|
+
// is atomic; ordered by seq, so a reconnect's online event in between
|
|
170
|
+
// still lets a later offline through.
|
|
171
|
+
sql `EXISTS (
|
|
164
172
|
SELECT 1 FROM ${nodes}
|
|
165
173
|
WHERE ${nodes.workspaceId} = ${workspaceId}
|
|
166
174
|
AND ${nodes.id} = ${input.nodeId}
|
|
167
175
|
AND ${nodes.status} = 'offline'
|
|
168
176
|
AND ${nodes.livenessRevision} = ${input.claimRevision}
|
|
177
|
+
AND COALESCE((
|
|
178
|
+
SELECT we.type FROM workspace_events AS we INDEXED BY idx_workspace_events_created
|
|
179
|
+
WHERE we.workspace_id = ${workspaceId}
|
|
180
|
+
AND we.created_at >= ${nodes.lastHeartbeatAt}
|
|
181
|
+
AND we.type IN ('node.status.online', 'node.status.offline')
|
|
182
|
+
AND json_extract(we.payload, '$.node_id') = ${input.nodeId}
|
|
183
|
+
ORDER BY we.seq DESC
|
|
184
|
+
LIMIT 1
|
|
185
|
+
), '') <> 'node.status.offline'
|
|
169
186
|
)`);
|
|
170
|
-
// A reconnect won the database race
|
|
171
|
-
// publishing this older offline transition afterward would invert
|
|
187
|
+
// A reconnect won the database race (its online event is authoritative;
|
|
188
|
+
// publishing this older offline transition afterward would invert
|
|
189
|
+
// history), or this transition is already published.
|
|
172
190
|
if (!appended)
|
|
173
191
|
return;
|
|
174
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocationCompletion.js","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,kCAAkC,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"invocationCompletion.js","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/node.d.ts
CHANGED
|
@@ -87,7 +87,8 @@ export declare function createNodeToken(db: Db, workspaceId: string, data: {
|
|
|
87
87
|
expectedTokenHash?: string;
|
|
88
88
|
directAgentId?: string;
|
|
89
89
|
rotationRecovery?: {
|
|
90
|
-
|
|
90
|
+
/** The deterministic replacement, under each tag the deployment knows (current first). */
|
|
91
|
+
replacementTokens: readonly string[];
|
|
91
92
|
idempotencyKeyHash: string;
|
|
92
93
|
requestDigest: string;
|
|
93
94
|
};
|
|
@@ -441,6 +442,8 @@ export declare function settleNodeOffline(db: Db, registry: NodeConnectionRegist
|
|
|
441
442
|
};
|
|
442
443
|
deps?: InvocationCompletionDeps;
|
|
443
444
|
reason?: NodeOfflineReason;
|
|
445
|
+
/** Return covered attempts to pending instead of resending them (see detachInvocationsFromLostNode). */
|
|
446
|
+
detachOnly?: boolean;
|
|
444
447
|
}): Promise<boolean>;
|
|
445
448
|
export declare function markNodeOffline(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string, effects?: {
|
|
446
449
|
deps?: InvocationCompletionDeps;
|
|
@@ -547,6 +550,40 @@ export declare function completeBoundAgentDelivery(db: Db, registry: NodeConnect
|
|
|
547
550
|
providerName: string;
|
|
548
551
|
}): Promise<void>;
|
|
549
552
|
export declare function unbindAgentFromNode(db: Db, workspaceId: string, nodeName: string, agentName: string): Promise<boolean>;
|
|
553
|
+
export type DeleteNodeResult = {
|
|
554
|
+
ok: true;
|
|
555
|
+
id: string;
|
|
556
|
+
name: string;
|
|
557
|
+
cascadedActions: number;
|
|
558
|
+
} | {
|
|
559
|
+
ok: false;
|
|
560
|
+
code: 'node_not_found' | 'node_online' | 'node_has_actions' | 'node_delete_conflict';
|
|
561
|
+
};
|
|
562
|
+
/**
|
|
563
|
+
* Delete one node by its resolved id. Callers resolve a path's id-or-name
|
|
564
|
+
* once, before taking the node lock; looking the name up again here could
|
|
565
|
+
* land on a different node whose name equals this id after a concurrent
|
|
566
|
+
* delete.
|
|
567
|
+
*
|
|
568
|
+
* Unforced, an online node or one hosting actions is refused. Every write is
|
|
569
|
+
* then conditioned on the node state those checks saw, because the node lock
|
|
570
|
+
* only serializes this isolate:
|
|
571
|
+
* - a node whose row still reads online is taken offline through the same
|
|
572
|
+
* claim + claim-scoped settle a lost connection uses, so its hosted agents
|
|
573
|
+
* lose liveness and open invocations are rescheduled while the node and its
|
|
574
|
+
* actions still exist to route them. A lost claim means another isolate
|
|
575
|
+
* refreshed the node; nothing has been touched and the result is
|
|
576
|
+
* `node_delete_conflict`.
|
|
577
|
+
* - the unforced DELETE matches only the liveness epoch the checks (or the
|
|
578
|
+
* claim) observed, with no hosted action, so a heartbeat, registration or
|
|
579
|
+
* action registration landing in between leaves the row in place.
|
|
580
|
+
* The delete itself is one atomic write group: open invocations still bound
|
|
581
|
+
* to the node or its actions fail with `node_deleted` (as deleteAction does),
|
|
582
|
+
* agents still located on it lose liveness, and its actions and row go.
|
|
583
|
+
*/
|
|
584
|
+
export declare function deleteNode(db: Db, deps: InvocationCompletionDeps, workspaceId: string, nodeId: string, opts?: {
|
|
585
|
+
force?: boolean;
|
|
586
|
+
}): Promise<DeleteNodeResult>;
|
|
550
587
|
export declare function listNodeAgents(db: Db, workspaceId: string, nodeName: string): Promise<{
|
|
551
588
|
created_at: string;
|
|
552
589
|
updated_at: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/engine/node.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAEzB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/engine/node.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/node.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { nodeMayOwn, providerLive, filterAsync, nodeLivenessAuthority, inspectNodeLiveness, snapshotOnline } from './nodeLiveness.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { invalidateChannelCache } from './cache.js';
|
|
4
|
-
import { and, asc, eq, exists, gt, gte, inArray, isNotNull, isNull, lt, lte, ne, notExists, or, sql } from 'drizzle-orm';
|
|
4
|
+
import { and, asc, eq, exists, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notExists, or, sql } from 'drizzle-orm';
|
|
5
5
|
import { FLEET_ACTION_CALLER_METADATA_KEY, FLEET_ACTION_CALLER_METADATA_VERSION, FLEET_DELIVERY_CURSOR_CAPABILITY, NODE_REGISTRATION_CONTRACT_V1, parseFleetBrokerToRelaycastMessage, } from '@relaycast/types';
|
|
6
|
-
import { actionInvocations, agents, agentNodeBindings, channelMembers, channels, nodeProviders, nodes, workspaces } from '../db/schema.js';
|
|
6
|
+
import { actionInvocations, actions, agents, agentNodeBindings, channelMembers, channels, nodeProviders, nodes, workspaces } from '../db/schema.js';
|
|
7
7
|
import { isWorkspaceExpired, WORKSPACE_EXPIRED_CODE, WORKSPACE_EXPIRED_MESSAGE } from '../auth/workspaceExpiry.js';
|
|
8
8
|
import { randomHex, sha256Hex } from '../lib/crypto.js';
|
|
9
9
|
import { codedError } from '../lib/httpError.js';
|
|
@@ -17,9 +17,10 @@ import { rotateAgentIdentity } from './agentIdentity.js';
|
|
|
17
17
|
import { isNodeLive, isReusableForMachineMatch, nodeHasCapacity, NODE_LIVENESS_TTL_MS } from './placement.js';
|
|
18
18
|
import { DEFAULT_PROVIDER_NAME, assertActionTaskMode, capabilityKind, heartbeatProvider, isProviderLive, markProviderOffline, materializeProviderActions, providerActionsMaterialized, recomputeNodeAggregate, refreshNodeAggregate, removeProvider, upsertProvider, } from './nodeProvider.js';
|
|
19
19
|
import { serializeNodeOp } from './nodeLock.js';
|
|
20
|
-
import { ACTION_DISPATCH_TIMEOUT_MS, completeNodeInvocation, dispatchCapacitySpawn, rescheduleInvocationsForLostNode, rescheduleNodeInvocation, } from './action.js';
|
|
20
|
+
import { ACTION_DISPATCH_TIMEOUT_MS, completeNodeInvocation, detachInvocationsFromLostNode, dispatchCapacitySpawn, emitFailedInvocationEffects, rescheduleInvocationsForLostNode, rescheduleNodeInvocation, } from './action.js';
|
|
21
21
|
import { emitInvocationCompletionEffects, emitAgentExitedEffects, emitNodeStatusEffects, fleetInvocationId } from './invocationCompletion.js';
|
|
22
22
|
import { ackDeliveriesUpToSeq, deliverPendingToNode } from './delivery.js';
|
|
23
|
+
import { issueCredential } from '../auth/credentials.js';
|
|
23
24
|
const NODE_ROTATION_RECOVERY_TTL_MS = 24 * 60 * 60 * 1_000;
|
|
24
25
|
function resolveProviderIdentity(message, connectionId) {
|
|
25
26
|
if (message.provider)
|
|
@@ -311,7 +312,7 @@ function normalizeLegacyAdapter(adapter) {
|
|
|
311
312
|
return adapter;
|
|
312
313
|
}
|
|
313
314
|
export async function createNodeToken(db, workspaceId, data, authorization = {}) {
|
|
314
|
-
const token = authorization.rotationRecovery?.
|
|
315
|
+
const token = authorization.rotationRecovery?.replacementTokens[0] ?? await issueCredential(db, 'node', workspaceId);
|
|
315
316
|
const tokenHash = await sha256Hex(token);
|
|
316
317
|
const name = data.name.startsWith('#') ? data.name.slice(1) : data.name;
|
|
317
318
|
// Reject names that are empty or still #-prefixed after normalization: an
|
|
@@ -372,16 +373,26 @@ export async function createNodeToken(db, workspaceId, data, authorization = {})
|
|
|
372
373
|
&& existing.id === directNodeIdForAgent(authorization.directAgentId)
|
|
373
374
|
&& existing.role === 'direct';
|
|
374
375
|
const recovery = authorization.rotationRecovery;
|
|
376
|
+
// A replay returns the replacement the first attempt committed, whichever
|
|
377
|
+
// tag it carries; a new rotation mints under the current one.
|
|
378
|
+
const replacements = recovery
|
|
379
|
+
? await Promise.all(recovery.replacementTokens.map(async (replacement) => ({ token: replacement, hash: await sha256Hex(replacement) })))
|
|
380
|
+
: [];
|
|
381
|
+
/** The replacement token a row committed by this keyed rotation holds, if it is one. */
|
|
382
|
+
const replayedToken = (candidate) => {
|
|
383
|
+
const committed = replacements.find((replacement) => replacement.hash === candidate.tokenHash);
|
|
384
|
+
return committed && isIdempotentRotationReplay(candidate) ? committed.token : undefined;
|
|
385
|
+
};
|
|
375
386
|
const isIdempotentRotationReplay = (candidate) => hasPresentedTokenProof
|
|
376
387
|
&& recovery !== undefined
|
|
377
|
-
&& candidate.tokenHash === tokenHash
|
|
378
388
|
&& candidate.previousTokenHash === authorization.expectedTokenHash
|
|
379
389
|
&& candidate.rotationIdempotencyKeyHash === recovery.idempotencyKeyHash
|
|
380
390
|
&& candidate.rotationRequestDigest === recovery.requestDigest
|
|
381
391
|
&& candidate.previousTokenExpiresAt !== null
|
|
382
392
|
&& candidate.previousTokenExpiresAt.getTime() > now.getTime();
|
|
383
|
-
|
|
384
|
-
|
|
393
|
+
const replayed = replayedToken(existing);
|
|
394
|
+
if (replayed) {
|
|
395
|
+
return { ...publicNode(existing), token: replayed };
|
|
385
396
|
}
|
|
386
397
|
if (!hasPresentedTokenProof && !authorizedDirectNode) {
|
|
387
398
|
throw codedError('Node already exists; its current node token is required to rotate or modify it', 'node_token_proof_required', 409);
|
|
@@ -436,8 +447,9 @@ export async function createNodeToken(db, workspaceId, data, authorization = {})
|
|
|
436
447
|
// either update runs. If the other request committed this exact keyed
|
|
437
448
|
// rotation, recover its result instead of returning a spurious conflict.
|
|
438
449
|
const winner = recovery ? await getNodeById(db, workspaceId, existing.id) : null;
|
|
439
|
-
|
|
440
|
-
|
|
450
|
+
const replayedByWinner = winner ? replayedToken(winner) : undefined;
|
|
451
|
+
if (winner && replayedByWinner) {
|
|
452
|
+
return { ...publicNode(winner), token: replayedByWinner };
|
|
441
453
|
}
|
|
442
454
|
throw codedError('Node token changed before enrollment completed; retry with the current node token', 'node_token_proof_required', 409);
|
|
443
455
|
}
|
|
@@ -957,7 +969,12 @@ export async function settleNodeOffline(db, registry, workspaceId, nodeId, opts
|
|
|
957
969
|
.where(and(eq(agents.workspaceId, workspaceId), eq(agents.status, 'offline'), isNotNull(agents.statusBeforeLivenessLoss), eq(agents.locationType, 'via_node'), eq(agents.locationNodeId, nodeId), ...(claimRevision !== undefined
|
|
958
970
|
? [lt(agents.nodeLivenessRevision, claimRevision)]
|
|
959
971
|
: [])));
|
|
960
|
-
|
|
972
|
+
if (opts.detachOnly && claimRevision !== undefined) {
|
|
973
|
+
await detachInvocationsFromLostNode(db, workspaceId, nodeId, { claimRevision });
|
|
974
|
+
}
|
|
975
|
+
else {
|
|
976
|
+
await rescheduleInvocationsForLostNode(db, registry, workspaceId, nodeId, { claimRevision });
|
|
977
|
+
}
|
|
961
978
|
if (opts.deps && opts.before && opts.before.status === 'online') {
|
|
962
979
|
await emitNodeStatusEffects(opts.deps, workspaceId, {
|
|
963
980
|
status: 'offline',
|
|
@@ -1622,6 +1639,144 @@ export async function unbindAgentFromNode(db, workspaceId, nodeName, agentName)
|
|
|
1622
1639
|
return true;
|
|
1623
1640
|
});
|
|
1624
1641
|
}
|
|
1642
|
+
/** A forced delete re-claims a node a live heartbeat keeps refreshing at most this often. */
|
|
1643
|
+
const FORCED_DELETE_CLAIM_ATTEMPTS = 3;
|
|
1644
|
+
/**
|
|
1645
|
+
* Delete one node by its resolved id. Callers resolve a path's id-or-name
|
|
1646
|
+
* once, before taking the node lock; looking the name up again here could
|
|
1647
|
+
* land on a different node whose name equals this id after a concurrent
|
|
1648
|
+
* delete.
|
|
1649
|
+
*
|
|
1650
|
+
* Unforced, an online node or one hosting actions is refused. Every write is
|
|
1651
|
+
* then conditioned on the node state those checks saw, because the node lock
|
|
1652
|
+
* only serializes this isolate:
|
|
1653
|
+
* - a node whose row still reads online is taken offline through the same
|
|
1654
|
+
* claim + claim-scoped settle a lost connection uses, so its hosted agents
|
|
1655
|
+
* lose liveness and open invocations are rescheduled while the node and its
|
|
1656
|
+
* actions still exist to route them. A lost claim means another isolate
|
|
1657
|
+
* refreshed the node; nothing has been touched and the result is
|
|
1658
|
+
* `node_delete_conflict`.
|
|
1659
|
+
* - the unforced DELETE matches only the liveness epoch the checks (or the
|
|
1660
|
+
* claim) observed, with no hosted action, so a heartbeat, registration or
|
|
1661
|
+
* action registration landing in between leaves the row in place.
|
|
1662
|
+
* The delete itself is one atomic write group: open invocations still bound
|
|
1663
|
+
* to the node or its actions fail with `node_deleted` (as deleteAction does),
|
|
1664
|
+
* agents still located on it lose liveness, and its actions and row go.
|
|
1665
|
+
*/
|
|
1666
|
+
export async function deleteNode(db, deps, workspaceId, nodeId, opts = {}) {
|
|
1667
|
+
const registry = deps.nodeConnections;
|
|
1668
|
+
const node = await getNodeById(db, workspaceId, nodeId);
|
|
1669
|
+
if (!node)
|
|
1670
|
+
return { ok: false, code: 'node_not_found' };
|
|
1671
|
+
const now = Date.now();
|
|
1672
|
+
const hostedActions = and(eq(actions.workspaceId, workspaceId), eq(actions.handlerNodeId, node.id));
|
|
1673
|
+
if (!opts.force) {
|
|
1674
|
+
const heartbeat = node.lastHeartbeatAt?.getTime();
|
|
1675
|
+
if (isNodeLive(node, now)
|
|
1676
|
+
// A heartbeat skewed into the future may belong to a running host.
|
|
1677
|
+
|| (heartbeat !== undefined && heartbeat > now)
|
|
1678
|
+
|| registry.isNodeConnected(workspaceId, node.id)) {
|
|
1679
|
+
return { ok: false, code: 'node_online' };
|
|
1680
|
+
}
|
|
1681
|
+
const [hosted] = await db.select({ id: actions.id }).from(actions).where(hostedActions).limit(1);
|
|
1682
|
+
if (hosted)
|
|
1683
|
+
return { ok: false, code: 'node_has_actions' };
|
|
1684
|
+
}
|
|
1685
|
+
let current = node;
|
|
1686
|
+
let epoch = { lastHeartbeatAt: node.lastHeartbeatAt, livenessRevision: node.livenessRevision };
|
|
1687
|
+
let claimedHere = false;
|
|
1688
|
+
for (let attempt = 1; current.status === 'online'; attempt++) {
|
|
1689
|
+
const claim = await claimNodeOffline(db, workspaceId, current.id, epoch);
|
|
1690
|
+
if (claim) {
|
|
1691
|
+
await settleNodeOffline(db, registry, workspaceId, current.id, {
|
|
1692
|
+
claimRevision: claim.claimRevision,
|
|
1693
|
+
before: { status: 'online', name: current.name },
|
|
1694
|
+
deps,
|
|
1695
|
+
reason: 'deregistered',
|
|
1696
|
+
});
|
|
1697
|
+
epoch = { lastHeartbeatAt: claim.claimAt, livenessRevision: claim.claimRevision };
|
|
1698
|
+
claimedHere = true;
|
|
1699
|
+
break;
|
|
1700
|
+
}
|
|
1701
|
+
// Unforced, a lost claim means the node changed after the checks. Forced,
|
|
1702
|
+
// the delete goes ahead regardless, against the fresh row.
|
|
1703
|
+
if (!opts.force)
|
|
1704
|
+
return { ok: false, code: 'node_delete_conflict' };
|
|
1705
|
+
const reread = await getNodeById(db, workspaceId, node.id);
|
|
1706
|
+
if (!reread)
|
|
1707
|
+
return { ok: false, code: 'node_not_found' };
|
|
1708
|
+
current = reread;
|
|
1709
|
+
epoch = { lastHeartbeatAt: reread.lastHeartbeatAt, livenessRevision: reread.livenessRevision };
|
|
1710
|
+
if (current.status === 'online' && attempt >= FORCED_DELETE_CLAIM_ATTEMPTS) {
|
|
1711
|
+
return { ok: false, code: 'node_delete_conflict' };
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
// An offline row this call did not claim may belong to another writer's
|
|
1715
|
+
// claim (a disconnect, or a concurrent delete on another isolate) whose
|
|
1716
|
+
// settle tail has not run yet; the delete would erase the references that
|
|
1717
|
+
// tail needs and the epoch its event is conditioned on. A claimer runs its
|
|
1718
|
+
// tail right after claiming, so only a recent claim (its time is the row's
|
|
1719
|
+
// heartbeat) can still be pending. Finish it here: the tail's writes are
|
|
1720
|
+
// scoped to the claim revision and CAS-guarded, and the emit publishes the
|
|
1721
|
+
// transition only if the claimer has not. It only detaches the claim's open
|
|
1722
|
+
// attempts: the claimer may be resending them now, and a second sender could
|
|
1723
|
+
// put one spawn on two nodes.
|
|
1724
|
+
const claimedAt = current.lastHeartbeatAt?.getTime();
|
|
1725
|
+
if (!claimedHere && claimedAt !== undefined && Date.now() - claimedAt <= NODE_LIVENESS_TTL_MS) {
|
|
1726
|
+
await settleNodeOffline(db, registry, workspaceId, current.id, {
|
|
1727
|
+
claimRevision: current.livenessRevision,
|
|
1728
|
+
detachOnly: true,
|
|
1729
|
+
});
|
|
1730
|
+
await emitNodeStatusEffects(deps, workspaceId, {
|
|
1731
|
+
status: 'offline',
|
|
1732
|
+
nodeId: current.id,
|
|
1733
|
+
nodeName: current.name,
|
|
1734
|
+
reason: 'deregistered',
|
|
1735
|
+
claimRevision: current.livenessRevision,
|
|
1736
|
+
});
|
|
1737
|
+
}
|
|
1738
|
+
const thisNode = and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, node.id));
|
|
1739
|
+
const deletable = opts.force
|
|
1740
|
+
? thisNode
|
|
1741
|
+
: and(thisNode, ne(nodes.status, 'online'), eq(nodes.livenessRevision, epoch.livenessRevision), epoch.lastHeartbeatAt === null
|
|
1742
|
+
? isNull(nodes.lastHeartbeatAt)
|
|
1743
|
+
: eq(nodes.lastHeartbeatAt, epoch.lastHeartbeatAt), notExists(db.select({ id: actions.id }).from(actions).where(hostedActions)));
|
|
1744
|
+
// Every statement below is conditioned on the node DELETE still matching,
|
|
1745
|
+
// and the group commits as one unit (a transaction, or a D1 batch), so a
|
|
1746
|
+
// conflict leaves no partial cleanup and a commit leaves no open reference
|
|
1747
|
+
// the FKs have already erased.
|
|
1748
|
+
const nodeStillDeletable = exists(db.select({ id: nodes.id }).from(nodes).where(deletable));
|
|
1749
|
+
const lostAt = new Date();
|
|
1750
|
+
const results = await runAtomicWrites(db, (w) => [
|
|
1751
|
+
// Open work bound to the node or one of its actions has nothing left to
|
|
1752
|
+
// complete it. Runs first, while both references are still set. `running`
|
|
1753
|
+
// is an accepted task, which only its dispatching node may complete.
|
|
1754
|
+
// A native spawn or builtin that has never been sent is pinned to the
|
|
1755
|
+
// handler_node_id snapshot (not an FK) and still waits on this node. Once
|
|
1756
|
+
// sent, that snapshot is only a 201 record: the settle may have unpinned
|
|
1757
|
+
// the row for placement elsewhere.
|
|
1758
|
+
w.update(actionInvocations)
|
|
1759
|
+
.set({ status: 'failed', error: 'node_deleted', completedAt: lostAt, spawnReservedAt: null })
|
|
1760
|
+
.where(and(eq(actionInvocations.workspaceId, workspaceId), inArray(actionInvocations.status, ['pending', 'dispatched', 'invoked', 'running']), or(eq(actionInvocations.dispatchedNodeId, node.id), inArray(actionInvocations.actionId, w.select({ id: actions.id }).from(actions).where(hostedActions)), and(eq(actionInvocations.handlerNodeId, node.id), isNull(actionInvocations.dispatchedNodeId), isNull(actionInvocations.actionId), eq(actionInvocations.dispatchAttempts, 0), or(eq(actionInvocations.invocationOrigin, 'builtin'), eq(actionInvocations.actionName, 'spawn'), like(actionInvocations.actionName, 'spawn:%')))), nodeStillDeletable))
|
|
1761
|
+
.returning(),
|
|
1762
|
+
// An agent bound to an offline node is still active; losing the node's
|
|
1763
|
+
// row would leave it active with no route.
|
|
1764
|
+
w.update(agents)
|
|
1765
|
+
.set({ ...agentLivenessLoss(), lastSeen: lostAt })
|
|
1766
|
+
.where(and(eq(agents.workspaceId, workspaceId), eq(agents.locationNodeId, node.id), ne(agents.status, 'offline'), ne(agents.status, RELEASED_AGENT_STATUS), nodeStillDeletable)),
|
|
1767
|
+
// Deleted explicitly rather than by cascade so the count reports the rows
|
|
1768
|
+
// actually removed.
|
|
1769
|
+
w.delete(actions).where(and(hostedActions, nodeStillDeletable)).returning({ id: actions.id }),
|
|
1770
|
+
w.delete(nodes).where(deletable).returning({ id: nodes.id }),
|
|
1771
|
+
], { requireAtomic: true });
|
|
1772
|
+
const [failed, , removedActions, deleted] = results;
|
|
1773
|
+
if (deleted.length === 0) {
|
|
1774
|
+
const stillThere = await getNodeById(db, workspaceId, node.id);
|
|
1775
|
+
return { ok: false, code: stillThere ? 'node_delete_conflict' : 'node_not_found' };
|
|
1776
|
+
}
|
|
1777
|
+
await emitFailedInvocationEffects(deps, workspaceId, failed);
|
|
1778
|
+
return { ok: true, id: node.id, name: node.name, cascadedActions: removedActions.length };
|
|
1779
|
+
}
|
|
1625
1780
|
export async function listNodeAgents(db, workspaceId, nodeName) {
|
|
1626
1781
|
const node = await getNodeByName(db, workspaceId, nodeName);
|
|
1627
1782
|
if (!node)
|
|
@@ -1730,7 +1885,7 @@ export async function registerAgentViaNode(db, workspaceId, nodeId, providerName
|
|
|
1730
1885
|
throw codedError(`Agent "${message.name}" already exists; use agent.recover with proof of the immutable id`, 'agent_already_exists', 409);
|
|
1731
1886
|
}
|
|
1732
1887
|
const [generalChannel] = channelRows;
|
|
1733
|
-
const token =
|
|
1888
|
+
const token = await issueCredential(db, 'agent', workspaceId);
|
|
1734
1889
|
const tokenHash = await sha256Hex(token);
|
|
1735
1890
|
const now = new Date().toISOString();
|
|
1736
1891
|
const agentId = generateId();
|