@relaycast/engine 12.2.1 → 12.4.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 +1 -0
- package/dist/engine/agent.d.ts.map +1 -1
- package/dist/engine/agent.js +51 -11
- 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/nodeLiveness.d.ts +7 -0
- package/dist/engine/nodeLiveness.d.ts.map +1 -1
- package/dist/engine/nodeLiveness.js +21 -0
- package/dist/engine/nodeLiveness.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/agent.d.ts.map +1 -1
- package/dist/routes/agent.js +33 -2
- package/dist/routes/agent.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,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
|
|
@@ -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":"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,EAA8B,MAAM,EAA8D,KAAK,EAAc,MAAM,iBAAiB,CAAC;AAIpJ,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,KAAK,EAAgC,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AA8BnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAI7F,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACnC,KAAK,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AACzC,KAAK,QAAQ,GAAG,OAAO,MAAM,CAAC,YAAY,CAAC;AAC3C,KAAK,QAAQ,GAAG,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC;AAC5C,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAIpC,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,sBAAsB,CAAC;IACjC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC;CACb;AAUD,KAAK,cAAc,GAAG,MAAM,GAAG,eAAe,CAAC;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,8BAA8B,iBAAiB,CAAC;AAE7D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AA8ED,eAAO,MAAM,4BAA4B,WAAW,CAAC;AAoJrD,iBAAS,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8B9H;AAyDD,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,aAAa,GAAE;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE;QACjB,0FAA0F;QAC1F,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;QACrC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiMP;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGjE;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAO5E;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAM5E;AASD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,iBAAiB,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuD3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAMzG;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAClH,iBAAiB,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAyB3B;AAWD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACpC,UAAU,EAAE,yBAAyB,EAAE,CAAC;IACxC,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAqG7B;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,yBAAyB,EAIlC,SAAS,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2I3C;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;IAAE,eAAe,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAqD7E;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IACJ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,wGAAwG;IACxG,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,GACL,OAAO,CAAC,OAAO,CAAC,CA+DlB;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,iBA2B1E;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,uBAAuB,EAAE,OAAO,EAChC,IAAI,CAAC,EAAE,wBAAwB,iBAoChC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,wBAAwB,iBA8DhC;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,IAAI,CAAC,EAAE,wBAAwB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAwRD,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,gBAAgB,CAAC,EACvD,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAG7E;AA+ID,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,iBAahB;AAED,iBAAS,gBAAgB,CAAC,GAAG,EAAE;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;;;;;;;;;;;;;;EAqBA;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,OAAO,CAAC;IACT,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC7C,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE,CAAC,CA6ID;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,oBA6BzG;AAKD,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,GAAG,kBAAkB,GAAG,sBAAsB,CAAA;CAAE,CAAC;AAExG;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,wBAAwB,EAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAqJ3B;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;YA2BjF;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,yBAAyB,EAClC,OAAO,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,qBAAqB,CAAA;CAAO,GAC7F,OAAO,CAAC,sBAAsB,CAAC,CA8QjC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,wBAAwB,EACjC,OAAO,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClD,OAAO,CAAC,sBAAsB,CAAC,CAyHjC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,IAAI,CAAC,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;UAmDhC;AAsDD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,mBAAmB,EAAE,EACtC,cAAc,CAAC,EAAE,wBAAwB;;;;;;;;;;GAma1C;AAED,gFAAgF;AAChF,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,EAAE,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AA0FD,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA+C/B;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAG5E;AAoID,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,4BAA4B,iBA8ehF"}
|