@relaycast/engine 8.10.0 → 8.11.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/kv.d.ts +1 -1
- package/dist/adapters/node/kv.d.ts.map +1 -1
- package/dist/adapters/node/kv.js +9 -4
- package/dist/adapters/node/kv.js.map +1 -1
- package/dist/adapters/node/rate-limit.d.ts.map +1 -1
- package/dist/adapters/node/rate-limit.js +10 -5
- package/dist/adapters/node/rate-limit.js.map +1 -1
- package/dist/db/migrations/0060_durable_task_invocations.sql +7 -0
- package/dist/db/migrations/0061_messages_workspace_length_id_index.sql +7 -0
- package/dist/db/schema.d.ts +51 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +3 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/action.d.ts +30 -0
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +33 -3
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/inbox.d.ts.map +1 -1
- package/dist/engine/inbox.js +73 -27
- package/dist/engine/inbox.js.map +1 -1
- package/dist/engine/node.d.ts +10 -0
- package/dist/engine/node.d.ts.map +1 -1
- package/dist/engine/node.js +20 -0
- package/dist/engine/node.js.map +1 -1
- package/dist/engine/nodeProvider.d.ts.map +1 -1
- package/dist/engine/nodeProvider.js +5 -1
- package/dist/engine/nodeProvider.js.map +1 -1
- package/dist/engine/taskInvocation.d.ts +110 -0
- package/dist/engine/taskInvocation.d.ts.map +1 -0
- package/dist/engine/taskInvocation.js +141 -0
- package/dist/engine/taskInvocation.js.map +1 -0
- package/dist/engine/usage.d.ts +17 -8
- package/dist/engine/usage.d.ts.map +1 -1
- package/dist/engine/usage.js +35 -18
- package/dist/engine/usage.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/throttle.d.ts +20 -0
- package/dist/lib/throttle.d.ts.map +1 -0
- package/dist/lib/throttle.js +28 -0
- package/dist/lib/throttle.js.map +1 -0
- package/dist/middleware/planLimits.d.ts.map +1 -1
- package/dist/middleware/planLimits.js +22 -1
- package/dist/middleware/planLimits.js.map +1 -1
- package/dist/middleware/rateLimit.d.ts.map +1 -1
- package/dist/middleware/rateLimit.js +17 -3
- package/dist/middleware/rateLimit.js.map +1 -1
- package/dist/ports/entitlements.d.ts +8 -0
- package/dist/ports/entitlements.d.ts.map +1 -1
- package/dist/ports/kv.d.ts +7 -1
- package/dist/ports/kv.d.ts.map +1 -1
- package/dist/ports/rate-limit.d.ts +5 -0
- package/dist/ports/rate-limit.d.ts.map +1 -1
- package/dist/providers/static-entitlements.d.ts +4 -2
- package/dist/providers/static-entitlements.d.ts.map +1 -1
- package/dist/providers/static-entitlements.js +8 -4
- package/dist/providers/static-entitlements.js.map +1 -1
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +25 -22
- package/dist/routes/workspace.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/engine/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAW,iBAAiB,EAAoE,MAAM,iBAAiB,CAAC;AAQ/H,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/engine/action.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/action.js
CHANGED
|
@@ -12,6 +12,7 @@ import { runAtomic, runAtomicWrites } from '../ports/database.js';
|
|
|
12
12
|
import { claimSpawnNode, chooseNodeForAction, isNodeLive, releaseNodeCapacity, reserveNodeCapacity } from './placement.js';
|
|
13
13
|
import { DEFAULT_PROVIDER_NAME, capacityProviderName, getProvider, isProviderLive } from './nodeProvider.js';
|
|
14
14
|
import { AGENT_TOKEN_HASH_PATTERN } from '@relaycast/types';
|
|
15
|
+
import { createTaskState, expireTaskInvocation, expireTaskInvocations, taskExecution } from './taskInvocation.js';
|
|
15
16
|
const OPEN_INVOCATION_STATUSES = ['pending', 'dispatched', 'invoked'];
|
|
16
17
|
const REPLAYED_INVOCATION = Symbol('replayed-action-invocation');
|
|
17
18
|
export const ACTION_DISPATCH_TIMEOUT_MS = 30_000;
|
|
@@ -424,6 +425,9 @@ export async function deleteAction(db, workspaceId, name, options = {}) {
|
|
|
424
425
|
return deleted;
|
|
425
426
|
}
|
|
426
427
|
async function createInvocation(db, workspaceId, action, data) {
|
|
428
|
+
if (action?.executionMode === 'task' && !data.invocation_id) {
|
|
429
|
+
throw codedError('Task actions require the idempotent action invoke route', 'task_idempotency_required', 400);
|
|
430
|
+
}
|
|
427
431
|
const invocationId = data.invocation_id ?? `inv_${generateId()}`;
|
|
428
432
|
const expectedActionName = action?.name ?? data.action_name ?? 'spawn';
|
|
429
433
|
const [created] = await db
|
|
@@ -439,6 +443,7 @@ async function createInvocation(db, workspaceId, action, data) {
|
|
|
439
443
|
handlerAgentId: data.handler_agent_id ?? action?.handlerAgentId ?? null,
|
|
440
444
|
handlerNodeId: data.handler_node_id ?? action?.handlerNodeId ?? null,
|
|
441
445
|
input: data.input ?? {},
|
|
446
|
+
taskState: action?.executionMode === 'task' ? createTaskState(data.input ?? {}) : null,
|
|
442
447
|
status: data.status ?? 'pending',
|
|
443
448
|
})
|
|
444
449
|
.onConflictDoNothing()
|
|
@@ -1036,10 +1041,25 @@ async function dispatchRelease(args) {
|
|
|
1036
1041
|
?? activeBindings.find((binding) => binding.nodeId === implicitDirectNodeId)?.nodeId
|
|
1037
1042
|
?? activeBindings[0]?.nodeId
|
|
1038
1043
|
?? (agent.locationType === 'via_node' ? agent.locationNodeId : null);
|
|
1039
|
-
|
|
1044
|
+
// An implicit direct node has no provider row and the Cloudflare edge adapter
|
|
1045
|
+
// cannot see the DO, so `isHandlerConnectionLive` reports it connected. For a
|
|
1046
|
+
// guarded release the node row is the only liveness signal: a never-attached
|
|
1047
|
+
// ghost (status 'offline', null heartbeat) can never accept the dispatch and
|
|
1048
|
+
// must complete locally; a connected real direct node is 'online' with a fresh
|
|
1049
|
+
// heartbeat and keeps the existing dispatch fence. Scoped to the implicit
|
|
1050
|
+
// direct node so all other node/legacy semantics are unchanged.
|
|
1051
|
+
let hostLive = !!registry
|
|
1040
1052
|
&& !!nodeId
|
|
1041
1053
|
&& await isHandlerConnectionLive(args.db, registry, args.workspaceId, nodeId, agent.providerName);
|
|
1042
|
-
if (
|
|
1054
|
+
if (hostLive && nodeId === implicitDirectNodeId) {
|
|
1055
|
+
const [directNode] = await args.db
|
|
1056
|
+
.select({ status: nodes.status, lastHeartbeatAt: nodes.lastHeartbeatAt })
|
|
1057
|
+
.from(nodes)
|
|
1058
|
+
.where(and(eq(nodes.workspaceId, args.workspaceId), eq(nodes.id, nodeId)));
|
|
1059
|
+
if (!directNode || !isNodeLive(directNode))
|
|
1060
|
+
hostLive = false;
|
|
1061
|
+
}
|
|
1062
|
+
if (!hostLive || !registry) {
|
|
1043
1063
|
return input.delete_agent === true ? completeLocally() : failClosed();
|
|
1044
1064
|
}
|
|
1045
1065
|
// Release is a capacity operation handled by the provider hosting the agent.
|
|
@@ -1340,6 +1360,9 @@ export async function invokeAction(db, workspaceId, actionName, data, options =
|
|
|
1340
1360
|
}
|
|
1341
1361
|
}
|
|
1342
1362
|
// Check availableTo access control — deny if caller is absent OR not in the list
|
|
1363
|
+
if (action?.executionMode === 'task' && (!action.handlerNodeId || options.idempotencyKey === undefined)) {
|
|
1364
|
+
throw codedError('Task actions require a node handler and Idempotency-Key', 'task_idempotency_required', 400);
|
|
1365
|
+
}
|
|
1343
1366
|
if (action?.availableTo && action.availableTo.length > 0) {
|
|
1344
1367
|
if (!data.caller_name || !action.availableTo.includes(data.caller_name)) {
|
|
1345
1368
|
const who = data.caller_name ? `Agent "${data.caller_name}"` : 'Caller';
|
|
@@ -1580,6 +1603,7 @@ function publicInvocation(row) {
|
|
|
1580
1603
|
dispatched_at: row.dispatchedAt?.toISOString() ?? null,
|
|
1581
1604
|
created_at: row.createdAt.toISOString(),
|
|
1582
1605
|
completed_at: row.completedAt?.toISOString() ?? null,
|
|
1606
|
+
...(row.taskState ? { task_execution: taskExecution(row) } : {}),
|
|
1583
1607
|
};
|
|
1584
1608
|
}
|
|
1585
1609
|
async function completeGuardedReleaseNodeInvocation(db, workspaceId, nodeId, providerName, invocation, data, deps) {
|
|
@@ -1986,11 +2010,13 @@ async function claimRegisteredActionHandoff(db, args) {
|
|
|
1986
2010
|
actionId: actionInvocations.actionId,
|
|
1987
2011
|
actionName: actionInvocations.actionName,
|
|
1988
2012
|
dispatchAttempts: actionInvocations.dispatchAttempts,
|
|
2013
|
+
taskState: actionInvocations.taskState,
|
|
1989
2014
|
});
|
|
1990
2015
|
return claimed?.actionId ? {
|
|
1991
2016
|
actionId: claimed.actionId,
|
|
1992
2017
|
actionName: claimed.actionName,
|
|
1993
2018
|
dispatchAttempts: claimed.dispatchAttempts,
|
|
2019
|
+
taskState: claimed.taskState,
|
|
1994
2020
|
} : null;
|
|
1995
2021
|
}
|
|
1996
2022
|
async function bindInvocationToRegisteredNodeAction(db, args) {
|
|
@@ -2147,6 +2173,9 @@ async function dispatchNodeInvocation(args) {
|
|
|
2147
2173
|
return { accepted: false, pending: false, sent: false, settled };
|
|
2148
2174
|
}
|
|
2149
2175
|
}
|
|
2176
|
+
if (registeredNodeClaim?.taskState) {
|
|
2177
|
+
frame.task_execution = taskExecution({ id: args.invocationId, ...registeredNodeClaim });
|
|
2178
|
+
}
|
|
2150
2179
|
const sent = args.agent && args.actionId
|
|
2151
2180
|
? await (args.registry.sendAuthorizedActionToProvider?.(args.workspaceId, args.nodeId, args.providerName, frame, {
|
|
2152
2181
|
kind: 'agent-action-v1',
|
|
@@ -2848,6 +2877,7 @@ async function failNeverDispatchedInvocationRows(db, workspaceId, invocationIds,
|
|
|
2848
2877
|
.returning();
|
|
2849
2878
|
}
|
|
2850
2879
|
export async function sweepTimedOutInvocations(db, registry, opts = {}) {
|
|
2880
|
+
await expireTaskInvocations(db);
|
|
2851
2881
|
const sweepOpts = typeof opts === 'number' || opts === null ? {} : opts;
|
|
2852
2882
|
const timeoutMs = typeof opts === 'number' ? opts : sweepOpts.timeoutMs ?? ACTION_DISPATCH_TIMEOUT_MS;
|
|
2853
2883
|
await failUnreachableAgentInvocations(db, registry, sweepOpts.handlerUnreachableTtlMs ?? ACTION_HANDLER_UNREACHABLE_TTL_MS, sweepOpts.completionDeps);
|
|
@@ -2886,6 +2916,6 @@ export async function getInvocation(db, workspaceId, actionName, invocationId) {
|
|
|
2886
2916
|
.where(and(eq(actionInvocations.workspaceId, workspaceId), eq(actionInvocations.id, invocationId), eq(actionInvocations.actionName, actionName)));
|
|
2887
2917
|
if (!row)
|
|
2888
2918
|
return null;
|
|
2889
|
-
return publicInvocation(row);
|
|
2919
|
+
return publicInvocation(await expireTaskInvocation(db, row));
|
|
2890
2920
|
}
|
|
2891
2921
|
//# sourceMappingURL=action.js.map
|