@opengeni/db 6.0.0 → 6.0.1-canary.35916963870001
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/browser-sessions.d.ts +18 -0
- package/dist/canonical-human-identities.js +3 -3
- package/dist/capability-reconciliation.js +2 -2
- package/dist/child-read-reconciliation.d.ts +35 -0
- package/dist/{chunk-SYKHLPTK.js → chunk-25XT2B2Y.js} +2 -2
- package/dist/{chunk-G32NVMRJ.js → chunk-3B4AAHKA.js} +12 -8
- package/dist/{chunk-G32NVMRJ.js.map → chunk-3B4AAHKA.js.map} +1 -1
- package/dist/{chunk-CDAT6EKW.js → chunk-GR62JL3M.js} +3 -3
- package/dist/{chunk-AJA2ZIUW.js → chunk-GVDXDCVS.js} +2 -2
- package/dist/{chunk-PJI4MUZ7.js → chunk-H65VDGZ4.js} +4 -4
- package/dist/{chunk-RIYHP2WU.js → chunk-HN7TYFOX.js} +2 -2
- package/dist/{chunk-ZPJ6V2VG.js → chunk-HZH6UE5Z.js} +2 -2
- package/dist/{chunk-MN5PZMEK.js → chunk-IIPWNNVR.js} +908 -801
- package/dist/chunk-IIPWNNVR.js.map +1 -0
- package/dist/{chunk-CJI6G254.js → chunk-LKDCYHOC.js} +2 -2
- package/dist/{chunk-7JCDSMX2.js → chunk-SBGGZAB6.js} +2 -2
- package/dist/{chunk-XIXVVBW2.js → chunk-SRAMNVHT.js} +19 -1
- package/dist/chunk-SRAMNVHT.js.map +1 -0
- package/dist/{chunk-RL2MUXM3.js → chunk-W7FYI6GN.js} +2 -2
- package/dist/{chunk-GABXCG3N.js → chunk-YGJLAIRL.js} +18 -6
- package/dist/chunk-YGJLAIRL.js.map +1 -0
- package/dist/{chunk-LVY33EWL.js → chunk-YIXBA64E.js} +3 -3
- package/dist/connect-attempts.js +3 -3
- package/dist/editable-artifact-durable-export.js +2 -2
- package/dist/editable-artifacts.js +3 -3
- package/dist/index.d.ts +99 -19
- package/dist/index.js +7192 -6401
- package/dist/index.js.map +1 -1
- package/dist/integration-oauth-pending-states.d.ts +14 -0
- package/dist/knowledge-entries.d.ts +2 -0
- package/dist/knowledge-indexing.d.ts +17 -0
- package/dist/managed-auth-session-sets.js +3 -3
- package/dist/managed-user-setup.d.ts +1 -0
- package/dist/mcp-operations.js +2 -2
- package/dist/new-session-drafts.d.ts +2 -1
- package/dist/organization-integration-policy.js +3 -3
- package/dist/organization-membership-lifecycle.d.ts +1 -0
- package/dist/provision-roles.js +1 -1
- package/dist/retained-provider-commands.d.ts +4 -2
- package/dist/retained-provider-commands.js +6 -6
- package/dist/runtime-posture.d.ts +3 -3
- package/dist/schema.d.ts +168 -8
- package/dist/schema.js +3 -1
- package/dist/session-background-commands.js +4 -4
- package/dist/session-command-output.js +5 -5
- package/dist/session-event-slices.js +3 -3
- package/dist/session-mcp-credential-rotation.js +4 -4
- package/dist/session-meaningful-events.d.ts +15 -0
- package/dist/session-tenancy.js +3 -3
- package/dist/skills.d.ts +2 -0
- package/dist/video-generation.js +3 -3
- package/dist/workspace-tool-defaults.js +4 -4
- package/drizzle/0503_session_meaningful_attention.sql +81 -0
- package/drizzle/0504_skill_folder_limits.sql +26 -0
- package/drizzle/0505_workspace_control_revision_frontier.sql +37 -0
- package/drizzle/0506_background_command_text.sql +3 -0
- package/drizzle/0507_integration_oauth_pending_states.sql +27 -0
- package/drizzle/0508_deadline_command_workspace_capture.sql +75 -0
- package/drizzle/0509_verified_signup_trial_credits.sql +76 -0
- package/drizzle/0510_knowledge_index_funding_wait.sql +174 -0
- package/drizzle/0511_knowledge_visible_index_status.sql +56 -0
- package/package.json +6 -6
- package/src/browser-sessions.ts +6 -1
- package/src/child-read-reconciliation.ts +170 -0
- package/src/index.ts +1144 -311
- package/src/integration-oauth-pending-states.ts +52 -0
- package/src/knowledge-entries.ts +43 -2
- package/src/knowledge-indexing.ts +79 -1
- package/src/managed-user-setup.ts +18 -1
- package/src/new-session-drafts.ts +4 -2
- package/src/organization-membership-lifecycle.ts +11 -0
- package/src/provision-roles.ts +12 -0
- package/src/retained-provider-commands.ts +16 -6
- package/src/runtime-posture.ts +6 -0
- package/src/schema.ts +38 -3
- package/src/session-background-commands.ts +8 -2
- package/src/session-meaningful-events.ts +97 -0
- package/src/skills.ts +14 -1
- package/dist/chunk-GABXCG3N.js.map +0 -1
- package/dist/chunk-MN5PZMEK.js.map +0 -1
- package/dist/chunk-XIXVVBW2.js.map +0 -1
- /package/dist/{chunk-SYKHLPTK.js.map → chunk-25XT2B2Y.js.map} +0 -0
- /package/dist/{chunk-CDAT6EKW.js.map → chunk-GR62JL3M.js.map} +0 -0
- /package/dist/{chunk-AJA2ZIUW.js.map → chunk-GVDXDCVS.js.map} +0 -0
- /package/dist/{chunk-PJI4MUZ7.js.map → chunk-H65VDGZ4.js.map} +0 -0
- /package/dist/{chunk-RIYHP2WU.js.map → chunk-HN7TYFOX.js.map} +0 -0
- /package/dist/{chunk-ZPJ6V2VG.js.map → chunk-HZH6UE5Z.js.map} +0 -0
- /package/dist/{chunk-CJI6G254.js.map → chunk-LKDCYHOC.js.map} +0 -0
- /package/dist/{chunk-7JCDSMX2.js.map → chunk-SBGGZAB6.js.map} +0 -0
- /package/dist/{chunk-RL2MUXM3.js.map → chunk-W7FYI6GN.js.map} +0 -0
- /package/dist/{chunk-LVY33EWL.js.map → chunk-YIXBA64E.js.map} +0 -0
|
@@ -152,6 +152,24 @@ export type BrowserSessionNetworkRouteAuthority = {
|
|
|
152
152
|
configuration: NetworkRouteConfigurationValue;
|
|
153
153
|
consistency: NetworkRouteConsistencyValue;
|
|
154
154
|
};
|
|
155
|
+
/** Legacy resources predate permission control; absence must never advertise support. */
|
|
156
|
+
export declare function readStoredBrowserCapabilities(value: Record<string, unknown>): {
|
|
157
|
+
semanticObservation: boolean;
|
|
158
|
+
screenshots: boolean;
|
|
159
|
+
liveFrames: boolean;
|
|
160
|
+
humanInput: boolean;
|
|
161
|
+
tabs: boolean;
|
|
162
|
+
downloads: boolean;
|
|
163
|
+
uploads: boolean;
|
|
164
|
+
clipboard: boolean;
|
|
165
|
+
permissions: boolean;
|
|
166
|
+
diagnostics: boolean;
|
|
167
|
+
rawCdp: boolean;
|
|
168
|
+
linkedComputer: boolean;
|
|
169
|
+
privateCheckpoint: boolean;
|
|
170
|
+
identityPublication: boolean;
|
|
171
|
+
parallelTargets: boolean;
|
|
172
|
+
};
|
|
155
173
|
export declare function browserSessionCreateRequestDigest(input: PrepareBrowserSessionCreateInput): string;
|
|
156
174
|
export declare function listBrowserSessions(db: Database, input: {
|
|
157
175
|
accountId: string;
|
|
@@ -11,9 +11,9 @@ import {
|
|
|
11
11
|
getCanonicalHumanIdentityProjection,
|
|
12
12
|
synchronizeCanonicalHumanLoginBindings,
|
|
13
13
|
validateCanonicalHumanSession
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-W7FYI6GN.js";
|
|
15
|
+
import "./chunk-LKDCYHOC.js";
|
|
16
|
+
import "./chunk-IIPWNNVR.js";
|
|
17
17
|
import "./chunk-S2TZ3F4L.js";
|
|
18
18
|
import "./chunk-PZ5AY32C.js";
|
|
19
19
|
export {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Decode a stored row exactly once, by its own out-of-band version. Removing
|
|
2
|
+
* the version at this boundary prevents literal marker text being decoded again
|
|
3
|
+
* after the logical payload is placed inside a separately versioned receipt. */
|
|
4
|
+
export declare function logicalChildReadEvent<T extends {
|
|
5
|
+
payload: unknown;
|
|
6
|
+
payloadCodecVersion: number | null;
|
|
7
|
+
}>(row: T): Omit<T, "payloadCodecVersion">;
|
|
8
|
+
/** Rows arrive newest first from the bounded indexed query. Budget what the
|
|
9
|
+
* parent actually reads, not the PostgreSQL string compatibility encoding. */
|
|
10
|
+
export declare function boundedChildLifecycleEvidence(rows: readonly {
|
|
11
|
+
sequence: number;
|
|
12
|
+
type: string;
|
|
13
|
+
payload: unknown;
|
|
14
|
+
payloadCodecVersion: number | null;
|
|
15
|
+
}[]): Array<{
|
|
16
|
+
sequence: number;
|
|
17
|
+
type: string;
|
|
18
|
+
payload: unknown;
|
|
19
|
+
}>;
|
|
20
|
+
type RecordValue = Record<string, unknown>;
|
|
21
|
+
/** Historical tool output is a potentially lossy audit lane. Accept only known
|
|
22
|
+
* complete envelopes, then compare each returned item with its retained source.
|
|
23
|
+
* Tool names, cursors and terminal status are never content evidence alone. */
|
|
24
|
+
export declare function historicalChildReadItems(name: unknown, argsValue: unknown, outputValue: unknown): Array<{
|
|
25
|
+
sessionId: string;
|
|
26
|
+
item: RecordValue;
|
|
27
|
+
view: string;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function historicalChildReadMatches(candidate: ReturnType<typeof historicalChildReadItems>[number], event: {
|
|
30
|
+
id: string;
|
|
31
|
+
sequence: number;
|
|
32
|
+
type: string;
|
|
33
|
+
payload: unknown;
|
|
34
|
+
}): boolean;
|
|
35
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
rawRows,
|
|
3
3
|
withRlsContext
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LKDCYHOC.js";
|
|
5
5
|
|
|
6
6
|
// src/editable-artifacts.ts
|
|
7
7
|
import { createHash } from "crypto";
|
|
@@ -3541,4 +3541,4 @@ export {
|
|
|
3541
3541
|
PostgresEditableArtifactLiveReadStore,
|
|
3542
3542
|
transactionallyAuthorizeEditableArtifactActor
|
|
3543
3543
|
};
|
|
3544
|
-
//# sourceMappingURL=chunk-
|
|
3544
|
+
//# sourceMappingURL=chunk-25XT2B2Y.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
appendSessionCommandOutput
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-H65VDGZ4.js";
|
|
4
4
|
import {
|
|
5
5
|
lockSessionEventWriteRows
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YGJLAIRL.js";
|
|
7
7
|
import {
|
|
8
8
|
withRlsContext,
|
|
9
9
|
withSessionActivityRlsContext
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-LKDCYHOC.js";
|
|
11
11
|
import {
|
|
12
12
|
sandboxRetainedProcesses
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-IIPWNNVR.js";
|
|
14
14
|
|
|
15
15
|
// src/retained-provider-commands.ts
|
|
16
16
|
import { and, eq, sql } from "drizzle-orm";
|
|
@@ -242,7 +242,7 @@ async function retainedProcessCancellationRequested(db, scope) {
|
|
|
242
242
|
async function requestRetainedProcessDeadlineCancellation(db, scope) {
|
|
243
243
|
return withRlsContext(db, scope, async (tx) => {
|
|
244
244
|
const [row] = await tx.select().from(sandboxRetainedProcesses).where(processWhere(scope)).for("update").limit(1);
|
|
245
|
-
if (!row || row.state !== "active" ||
|
|
245
|
+
if (!row || row.state !== "active" || row.providerBackend !== "modal" || row.routeTargetId !== null)
|
|
246
246
|
return false;
|
|
247
247
|
const [lease] = await tx.execute(sql`
|
|
248
248
|
select id from sandbox_leases where id = ${row.leaseId}
|
|
@@ -252,8 +252,12 @@ async function requestRetainedProcessDeadlineCancellation(db, scope) {
|
|
|
252
252
|
and rotation_requested_at is not null and rotation_reason = 'provider_deadline' for update
|
|
253
253
|
`);
|
|
254
254
|
if (!lease) return false;
|
|
255
|
-
if (!row.cancellationRequestedAt)
|
|
256
|
-
await tx.update(sandboxRetainedProcesses).set({
|
|
255
|
+
if (!row.deadlineCancellationRequestedAt || !row.cancellationRequestedAt) {
|
|
256
|
+
await tx.update(sandboxRetainedProcesses).set({
|
|
257
|
+
...!row.cancellationRequestedAt ? { cancellationRequestedAt: sql`now()`, cancellationReason: "provider_deadline" } : {},
|
|
258
|
+
...!row.deadlineCancellationRequestedAt ? { deadlineCancellationRequestedAt: sql`now()` } : {}
|
|
259
|
+
}).where(processWhere(scope));
|
|
260
|
+
}
|
|
257
261
|
return true;
|
|
258
262
|
});
|
|
259
263
|
}
|
|
@@ -273,4 +277,4 @@ export {
|
|
|
273
277
|
retainedProcessCancellationRequested,
|
|
274
278
|
requestRetainedProcessDeadlineCancellation
|
|
275
279
|
};
|
|
276
|
-
//# sourceMappingURL=chunk-
|
|
280
|
+
//# sourceMappingURL=chunk-3B4AAHKA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/retained-provider-commands.ts"],"sourcesContent":["import { and, eq, sql } from \"drizzle-orm\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport {\n SandboxProviderCommand,\n ModalRouterProviderCommand,\n CommandSupervisionReceipt,\n type SessionEvent,\n} from \"@opengeni/contracts\";\nimport { withRlsContext, withSessionActivityRlsContext, type Database } from \"./database\";\nimport { lockSessionEventWriteRows } from \"./session-control\";\nimport { appendSessionCommandOutput } from \"./session-command-output\";\nimport * as schema from \"./schema\";\n\nexport type ProcessScope = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n processId: string;\n};\n\n/** Bound to an already-authorized exact process scope by runtime wiring. */\nexport function retainedProviderCommandPersistence(\n db: Database,\n scope: ProcessScope,\n publish?: (events: SessionEvent[]) => Promise<void>,\n) {\n return {\n recordSupervisionReceipt: (receipt: SupervisionReceipt) =>\n recordRetainedSupervisionReceipt(db, scope, receipt),\n loadSupervisionReceipt: () => loadRetainedSupervisionReceipt(db, scope),\n requestCancellation: (reason: \"provider_deadline\" | \"explicit_stop\") =>\n requestRetainedProcessCancellation(db, scope, reason),\n cancellationRequested: () => retainedProcessCancellationRequested(db, scope),\n load: () => getRetainedProviderCommand(db, scope),\n acknowledge: (command: SandboxProviderCommand) =>\n acknowledgeRetainedProviderOutput(db, scope, command),\n reserveInput: (byteLength?: number) => reserveRetainedProviderInput(db, scope, byteLength),\n captureRouterPage: async (page: RetainedRouterOutputPage) => {\n const result = await captureRetainedRouterOutput(db, scope, page);\n // A committed capture is authoritative even if live fanout fails.\n if (result.events.length && publish) await publish(result.events).catch(() => undefined);\n return { command: result.command, captured: result.captured };\n },\n };\n}\n\nfunction processWhere(scope: ProcessScope) {\n return and(\n eq(schema.sandboxRetainedProcesses.accountId, scope.accountId),\n eq(schema.sandboxRetainedProcesses.workspaceId, scope.workspaceId),\n eq(schema.sandboxRetainedProcesses.sessionId, scope.sessionId),\n eq(schema.sandboxRetainedProcesses.id, scope.processId),\n );\n}\n\nfunction sameExecution(a: SandboxProviderCommand, b: SandboxProviderCommand): boolean {\n return (\n a.kind === b.kind &&\n a.sandboxId === b.sandboxId &&\n a.taskId === b.taskId &&\n a.execId === b.execId &&\n Boolean(a.pty) === Boolean(b.pty) &&\n isDeepStrictEqual(supervisionDescriptor(a), supervisionDescriptor(b))\n );\n}\n\n/** Promotion and the opaque provider locator commit together. Preserve the\n * existing durable-but-output-rejected promotion contract: its typed rejection\n * is rethrown only AFTER this outer transaction has committed the locator. */\nexport function createProviderCommandRetainer<Input extends ProcessScope, Process>(\n promote: (db: Database, input: Input) => Promise<Process>,\n recoverDurablePromotion: (error: unknown) => Process | null,\n) {\n return async function retainWorkspaceProviderCommand(\n db: Database,\n input: Input & { providerCommand?: SandboxProviderCommand | null },\n ): Promise<Process> {\n if (!input.providerCommand) return promote(db, input);\n const command = SandboxProviderCommand.parse(input.providerCommand);\n const result = await withRlsContext(db, input, async (tx) => {\n let process: Process;\n let rejection: unknown = null;\n try {\n process = await promote(tx, input);\n } catch (error) {\n const durable = recoverDurablePromotion(error);\n if (durable === null) throw error;\n process = durable;\n rejection = error;\n }\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(input))\n .for(\"update\")\n .limit(1);\n if (!row || row.providerBackend !== \"modal\" || row.providerInstanceId !== command.sandboxId)\n throw new Error(\"Provider command does not match its retained sandbox\");\n if (row.providerCommand) {\n if (!sameExecution(SandboxProviderCommand.parse(row.providerCommand), command))\n throw new Error(\"Retained process already has a different provider execution\");\n } else {\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ providerCommand: command })\n .where(processWhere(input));\n }\n return { process, rejection };\n });\n if (result.rejection) throw result.rejection;\n return result.process;\n };\n}\n\nexport async function getRetainedProviderCommand(\n db: Database,\n scope: ProcessScope,\n): Promise<SandboxProviderCommand | null> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select({ command: schema.sandboxRetainedProcesses.providerCommand })\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .limit(1);\n return row?.command ? SandboxProviderCommand.parse(row.command) : null;\n });\n}\n\n/** Call only after all output in this provider page has been durably captured.\n * A stale acknowledgment cannot roll back a cursor or erase terminal evidence. */\nexport async function acknowledgeRetainedProviderOutput(\n db: Database,\n scope: ProcessScope,\n candidate: SandboxProviderCommand,\n): Promise<SandboxProviderCommand> {\n const next = SandboxProviderCommand.parse(candidate);\n if (next.kind !== \"modal-control-v1\")\n throw new Error(\"Byte-offset command output requires atomic capture\");\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand) throw new Error(\"Retained provider command is unavailable\");\n const previous = SandboxProviderCommand.parse(row.providerCommand);\n if (previous.kind !== \"modal-control-v1\")\n throw new Error(\"Legacy acknowledgment cannot advance byte-offset output\");\n if (!sameExecution(previous, next))\n throw new Error(\"Output acknowledgment changed provider execution identity\");\n const merged = structuredClone(previous);\n for (const stream of [\"stdout\", \"stderr\"] as const) {\n const oldCursor = previous.streams[stream];\n const newCursor = next.streams[stream];\n if (newCursor.batchIndex < oldCursor.batchIndex) continue;\n if (\n (newCursor.batchIndex === oldCursor.batchIndex || oldCursor.exitCode !== null) &&\n !isDeepStrictEqual(oldCursor, newCursor)\n )\n throw new Error(\"Provider output acknowledgment conflicts with retained evidence\");\n merged.streams[stream] = newCursor;\n }\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ providerCommand: merged })\n .where(processWhere(scope));\n return merged;\n });\n}\n\nexport type RetainedRouterOutputPage = {\n expected: ModalRouterProviderCommand;\n command: ModalRouterProviderCommand;\n stdout: string;\n stderr: string;\n};\n\nexport function validateRouterOutputAdvance(page: RetainedRouterOutputPage): void {\n const before = ModalRouterProviderCommand.parse(page.expected);\n const after = ModalRouterProviderCommand.parse(page.command);\n if (!sameExecution(before, after)) throw new Error(\"Output capture changed execution identity\");\n for (const stream of [\"stdout\", \"stderr\"] as const) {\n const oldCursor = before.streams[stream],\n cursor = after.streams[stream];\n if (\n cursor.byteOffset < oldCursor.byteOffset ||\n (oldCursor.eof && (!cursor.eof || cursor.byteOffset !== oldCursor.byteOffset)) ||\n (oldCursor.exitCode !== null && !isDeepStrictEqual(oldCursor, cursor))\n )\n throw new Error(\"Output capture cannot regress or rewrite terminal evidence\");\n if (\n cursor.byteOffset === oldCursor.byteOffset &&\n !(!oldCursor.eof && cursor.eof) &&\n (page[stream].length > 0 || cursor.utf8Remainder !== oldCursor.utf8Remainder)\n )\n throw new Error(\"Output without byte advancement requires the first EOF\");\n if (cursor.eof && cursor.utf8Remainder !== \"\")\n throw new Error(\"EOF must flush pending UTF-8 bytes\");\n if (Buffer.byteLength(page[stream]) > 4 * 1024 * 1024)\n throw new Error(\"Command output page exceeds its capture bound\");\n }\n}\n\n/** Capture and offsets commit atomically. The session lock is acquired before\n * the process lock, matching the event-write lock order. A concurrent reader\n * with a stale cursor discards its page and reloads; it never appends overlapping\n * output or silently advances the other reader's cursor. */\nexport async function captureRetainedRouterOutput(\n db: Database,\n scope: ProcessScope,\n page: RetainedRouterOutputPage,\n): Promise<{ command: ModalRouterProviderCommand; events: SessionEvent[]; captured: boolean }> {\n validateRouterOutputAdvance(page);\n return await withSessionActivityRlsContext(db, scope, async (tx) => {\n const locks = await lockSessionEventWriteRows(tx, {\n workspaceId: scope.workspaceId,\n sessionIds: [scope.sessionId],\n controlLock: \"share\",\n });\n if (locks.sessions[0]?.accountId !== scope.accountId)\n throw new Error(\"Command output session not found\");\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand || row.providerBackend !== \"modal\")\n throw new Error(\"Retained provider command is unavailable\");\n const current = ModalRouterProviderCommand.parse(row.providerCommand);\n if (!sameExecution(current, page.expected))\n throw new Error(\"Output capture does not own this execution\");\n if (!isDeepStrictEqual(current, page.expected))\n return { command: current, events: [], captured: false };\n const events: SessionEvent[] = [];\n for (const stream of [\"stdout\", \"stderr\"] as const) {\n const before = current.streams[stream],\n after = page.command.streams[stream];\n if (page[stream])\n events.push(\n ...(await appendSessionCommandOutput(tx, {\n ...scope,\n commandId: scope.processId,\n stream,\n streamFidelity: current.pty ? \"merged\" : \"separate\",\n chunkId: `modal-router:${current.execId}:${stream}:${before.byteOffset}:${after.byteOffset}:${after.eof ? 1 : 0}`,\n chunk: page[stream],\n })),\n );\n }\n if (supervisionDescriptor(page.command)) {\n await tx.execute(\n sql`select set_config('opengeni.supervised_output_capture_process_id', ${scope.processId}, true)`,\n );\n }\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({\n providerCommand: page.command,\n ...(supervisionDescriptor(page.command) &&\n page.command.streams.stdout.eof &&\n page.command.streams.stderr.eof &&\n page.command.streams.stdout.exitCode === 0 &&\n page.command.streams.stderr.exitCode === 0\n ? { supervisionOutputCaptured: true }\n : {}),\n })\n .where(processWhere(scope));\n if (supervisionDescriptor(page.command)) {\n await tx.execute(\n sql`select set_config('opengeni.supervised_output_capture_process_id', '', true)`,\n );\n }\n return { command: page.command, events, captured: true };\n });\n}\n\n/** Reserve a strictly increasing provider stdin index before dispatch. An\n * ambiguous send consumes its index and is never silently replayed. */\nexport async function reserveRetainedProviderInput(\n db: Database,\n scope: ProcessScope,\n byteLength?: number,\n): Promise<number> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand || row.state !== \"active\")\n throw new Error(\"Active retained provider command is unavailable\");\n if (row.cancellationRequestedAt || row.supervisionReceipt)\n throw new Error(\"Retained command input is closed\");\n const router = row.providerCommand.kind === \"modal-router-v1\";\n if (router && (!Number.isSafeInteger(byteLength) || byteLength! <= 0))\n throw new Error(\"Byte-offset stdin requires a positive byte reservation\");\n const index = row.providerCommandInputIndex + (router ? byteLength! : 1);\n if (!Number.isSafeInteger(index)) throw new Error(\"Provider stdin sequence exhausted\");\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ providerCommandInputIndex: index })\n .where(processWhere(scope));\n return router ? row.providerCommandInputIndex : index;\n });\n}\n\nexport type SupervisionReceipt = CommandSupervisionReceipt;\n\nfunction supervisionDescriptor(command: SandboxProviderCommand) {\n return command.kind === \"modal-router-v1\" ? command.supervision : undefined;\n}\n\n/** Fail before provider start, not after discovering an unprotected DB at retention. */\nexport async function supervisedCommandProtocolReady(db: Database): Promise<boolean> {\n const [row] = await db.execute<{ ready: boolean }>(sql`\n select count(*) = 5 as ready from pg_catalog.pg_trigger\n where (tgrelid, tgname) in (\n ('sandbox_retained_processes'::regclass, 'supervised_command_guard'),\n ('sandbox_retained_processes'::regclass, 'supervised_provider_loss_commit_guard'),\n ('sandbox_workspace_mutation_admissions'::regclass, 'supervised_command_admission_guard'),\n ('sandbox_lease_holders'::regclass, 'supervised_command_holder_guard'),\n ('sandbox_leases'::regclass, 'supervised_command_capture_guard')\n ) and tgenabled in ('O', 'A') and not tgisinternal\n `);\n return row?.ready === true;\n}\n\n/** Only an authenticated control-channel receipt; never parsed stdout/stderr.\n * ACK the supervisor only after this transaction returns successfully. */\nexport async function recordRetainedSupervisionReceipt(\n db: Database,\n scope: ProcessScope,\n receipt: SupervisionReceipt,\n): Promise<void> {\n const proof = CommandSupervisionReceipt.parse(receipt);\n await withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand || !supervisionDescriptor(row.providerCommand))\n throw new Error(\"Supervised retained command is unavailable\");\n // Trigger validates invocation binding, immutable replay and unsettled input.\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ supervisionReceipt: proof })\n .where(processWhere(scope));\n });\n}\n\nexport async function loadRetainedSupervisionReceipt(\n db: Database,\n scope: ProcessScope,\n): Promise<SupervisionReceipt | null> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select({ receipt: schema.sandboxRetainedProcesses.supervisionReceipt })\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .limit(1);\n if (!row) throw new Error(\"Retained command is unavailable\");\n return row.receipt ? CommandSupervisionReceipt.parse(row.receipt) : null;\n });\n}\n\nexport async function requestRetainedProcessCancellation(\n db: Database,\n scope: ProcessScope,\n reason: \"provider_deadline\" | \"explicit_stop\",\n): Promise<void> {\n if (reason !== \"provider_deadline\" && reason !== \"explicit_stop\")\n throw new Error(\"Invalid cancellation reason\");\n await withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row) throw new Error(\"Retained command is unavailable\");\n if (row.cancellationRequestedAt || row.state !== \"active\") return;\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ cancellationRequestedAt: new Date(), cancellationReason: reason })\n .where(processWhere(scope));\n });\n}\n\nexport async function retainedProcessCancellationRequested(\n db: Database,\n scope: ProcessScope,\n): Promise<boolean> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select({ at: schema.sandboxRetainedProcesses.cancellationRequestedAt })\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .limit(1);\n if (!row) throw new Error(\"Retained command is unavailable\");\n return row.at !== null;\n });\n}\n\n/** Called by the reaper for an exact retained command. Ordinary completed turns\n * are intentionally irrelevant. Lock order remains process -> lease. */\nexport async function requestRetainedProcessDeadlineCancellation(\n db: Database,\n scope: ProcessScope,\n): Promise<boolean> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (\n !row ||\n row.state !== \"active\" ||\n !row.providerCommand ||\n !supervisionDescriptor(row.providerCommand)\n )\n return false;\n const [lease] = await tx.execute<{ id: string }>(sql`\n select id from sandbox_leases where id = ${row.leaseId}\n and account_id = ${row.accountId} and workspace_id = ${row.workspaceId}\n and sandbox_group_id = ${row.sandboxGroupId} and lease_epoch = ${row.leaseEpoch}\n and backend = ${row.providerBackend} and instance_id = ${row.providerInstanceId}\n and rotation_requested_at is not null and rotation_reason = 'provider_deadline' for update\n `);\n if (!lease) return false;\n if (!row.cancellationRequestedAt)\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ cancellationRequestedAt: new Date(), cancellationReason: \"provider_deadline\" })\n .where(processWhere(scope));\n return true;\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/retained-provider-commands.ts"],"sourcesContent":["import { and, eq, sql } from \"drizzle-orm\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport {\n SandboxProviderCommand,\n ModalRouterProviderCommand,\n CommandSupervisionReceipt,\n type SessionEvent,\n} from \"@opengeni/contracts\";\nimport { withRlsContext, withSessionActivityRlsContext, type Database } from \"./database\";\nimport { lockSessionEventWriteRows } from \"./session-control\";\nimport { appendSessionCommandOutput } from \"./session-command-output\";\nimport * as schema from \"./schema\";\n\nexport type ProcessScope = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n processId: string;\n};\n\n/** Bound to an already-authorized exact process scope by runtime wiring. */\nexport function retainedProviderCommandPersistence(\n db: Database,\n scope: ProcessScope,\n publish?: (events: SessionEvent[]) => Promise<void>,\n) {\n return {\n recordSupervisionReceipt: (receipt: SupervisionReceipt) =>\n recordRetainedSupervisionReceipt(db, scope, receipt),\n loadSupervisionReceipt: () => loadRetainedSupervisionReceipt(db, scope),\n requestCancellation: (reason: \"provider_deadline\" | \"explicit_stop\") =>\n requestRetainedProcessCancellation(db, scope, reason),\n cancellationRequested: () => retainedProcessCancellationRequested(db, scope),\n load: () => getRetainedProviderCommand(db, scope),\n acknowledge: (command: SandboxProviderCommand) =>\n acknowledgeRetainedProviderOutput(db, scope, command),\n reserveInput: (byteLength?: number) => reserveRetainedProviderInput(db, scope, byteLength),\n captureRouterPage: async (page: RetainedRouterOutputPage) => {\n const result = await captureRetainedRouterOutput(db, scope, page);\n // A committed capture is authoritative even if live fanout fails.\n if (result.events.length && publish) await publish(result.events).catch(() => undefined);\n return { command: result.command, captured: result.captured };\n },\n };\n}\n\nfunction processWhere(scope: ProcessScope) {\n return and(\n eq(schema.sandboxRetainedProcesses.accountId, scope.accountId),\n eq(schema.sandboxRetainedProcesses.workspaceId, scope.workspaceId),\n eq(schema.sandboxRetainedProcesses.sessionId, scope.sessionId),\n eq(schema.sandboxRetainedProcesses.id, scope.processId),\n );\n}\n\nfunction sameExecution(a: SandboxProviderCommand, b: SandboxProviderCommand): boolean {\n return (\n a.kind === b.kind &&\n a.sandboxId === b.sandboxId &&\n a.taskId === b.taskId &&\n a.execId === b.execId &&\n Boolean(a.pty) === Boolean(b.pty) &&\n isDeepStrictEqual(supervisionDescriptor(a), supervisionDescriptor(b))\n );\n}\n\n/** Promotion and the opaque provider locator commit together. Preserve the\n * existing durable-but-output-rejected promotion contract: its typed rejection\n * is rethrown only AFTER this outer transaction has committed the locator. */\nexport function createProviderCommandRetainer<Input extends ProcessScope, Process>(\n promote: (db: Database, input: Input) => Promise<Process>,\n recoverDurablePromotion: (error: unknown) => Process | null,\n) {\n return async function retainWorkspaceProviderCommand(\n db: Database,\n input: Input & { providerCommand?: SandboxProviderCommand | null },\n ): Promise<Process> {\n if (!input.providerCommand) return promote(db, input);\n const command = SandboxProviderCommand.parse(input.providerCommand);\n const result = await withRlsContext(db, input, async (tx) => {\n let process: Process;\n let rejection: unknown = null;\n try {\n process = await promote(tx, input);\n } catch (error) {\n const durable = recoverDurablePromotion(error);\n if (durable === null) throw error;\n process = durable;\n rejection = error;\n }\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(input))\n .for(\"update\")\n .limit(1);\n if (!row || row.providerBackend !== \"modal\" || row.providerInstanceId !== command.sandboxId)\n throw new Error(\"Provider command does not match its retained sandbox\");\n if (row.providerCommand) {\n if (!sameExecution(SandboxProviderCommand.parse(row.providerCommand), command))\n throw new Error(\"Retained process already has a different provider execution\");\n } else {\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ providerCommand: command })\n .where(processWhere(input));\n }\n return { process, rejection };\n });\n if (result.rejection) throw result.rejection;\n return result.process;\n };\n}\n\nexport async function getRetainedProviderCommand(\n db: Database,\n scope: ProcessScope,\n): Promise<SandboxProviderCommand | null> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select({ command: schema.sandboxRetainedProcesses.providerCommand })\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .limit(1);\n return row?.command ? SandboxProviderCommand.parse(row.command) : null;\n });\n}\n\n/** Call only after all output in this provider page has been durably captured.\n * A stale acknowledgment cannot roll back a cursor or erase terminal evidence. */\nexport async function acknowledgeRetainedProviderOutput(\n db: Database,\n scope: ProcessScope,\n candidate: SandboxProviderCommand,\n): Promise<SandboxProviderCommand> {\n const next = SandboxProviderCommand.parse(candidate);\n if (next.kind !== \"modal-control-v1\")\n throw new Error(\"Byte-offset command output requires atomic capture\");\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand) throw new Error(\"Retained provider command is unavailable\");\n const previous = SandboxProviderCommand.parse(row.providerCommand);\n if (previous.kind !== \"modal-control-v1\")\n throw new Error(\"Legacy acknowledgment cannot advance byte-offset output\");\n if (!sameExecution(previous, next))\n throw new Error(\"Output acknowledgment changed provider execution identity\");\n const merged = structuredClone(previous);\n for (const stream of [\"stdout\", \"stderr\"] as const) {\n const oldCursor = previous.streams[stream];\n const newCursor = next.streams[stream];\n if (newCursor.batchIndex < oldCursor.batchIndex) continue;\n if (\n (newCursor.batchIndex === oldCursor.batchIndex || oldCursor.exitCode !== null) &&\n !isDeepStrictEqual(oldCursor, newCursor)\n )\n throw new Error(\"Provider output acknowledgment conflicts with retained evidence\");\n merged.streams[stream] = newCursor;\n }\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ providerCommand: merged })\n .where(processWhere(scope));\n return merged;\n });\n}\n\nexport type RetainedRouterOutputPage = {\n expected: ModalRouterProviderCommand;\n command: ModalRouterProviderCommand;\n stdout: string;\n stderr: string;\n};\n\nexport function validateRouterOutputAdvance(page: RetainedRouterOutputPage): void {\n const before = ModalRouterProviderCommand.parse(page.expected);\n const after = ModalRouterProviderCommand.parse(page.command);\n if (!sameExecution(before, after)) throw new Error(\"Output capture changed execution identity\");\n for (const stream of [\"stdout\", \"stderr\"] as const) {\n const oldCursor = before.streams[stream],\n cursor = after.streams[stream];\n if (\n cursor.byteOffset < oldCursor.byteOffset ||\n (oldCursor.eof && (!cursor.eof || cursor.byteOffset !== oldCursor.byteOffset)) ||\n (oldCursor.exitCode !== null && !isDeepStrictEqual(oldCursor, cursor))\n )\n throw new Error(\"Output capture cannot regress or rewrite terminal evidence\");\n if (\n cursor.byteOffset === oldCursor.byteOffset &&\n !(!oldCursor.eof && cursor.eof) &&\n (page[stream].length > 0 || cursor.utf8Remainder !== oldCursor.utf8Remainder)\n )\n throw new Error(\"Output without byte advancement requires the first EOF\");\n if (cursor.eof && cursor.utf8Remainder !== \"\")\n throw new Error(\"EOF must flush pending UTF-8 bytes\");\n if (Buffer.byteLength(page[stream]) > 4 * 1024 * 1024)\n throw new Error(\"Command output page exceeds its capture bound\");\n }\n}\n\n/** Capture and offsets commit atomically. The session lock is acquired before\n * the process lock, matching the event-write lock order. A concurrent reader\n * with a stale cursor discards its page and reloads; it never appends overlapping\n * output or silently advances the other reader's cursor. */\nexport async function captureRetainedRouterOutput(\n db: Database,\n scope: ProcessScope,\n page: RetainedRouterOutputPage,\n): Promise<{ command: ModalRouterProviderCommand; events: SessionEvent[]; captured: boolean }> {\n validateRouterOutputAdvance(page);\n return await withSessionActivityRlsContext(db, scope, async (tx) => {\n const locks = await lockSessionEventWriteRows(tx, {\n workspaceId: scope.workspaceId,\n sessionIds: [scope.sessionId],\n controlLock: \"share\",\n });\n if (locks.sessions[0]?.accountId !== scope.accountId)\n throw new Error(\"Command output session not found\");\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand || row.providerBackend !== \"modal\")\n throw new Error(\"Retained provider command is unavailable\");\n const current = ModalRouterProviderCommand.parse(row.providerCommand);\n if (!sameExecution(current, page.expected))\n throw new Error(\"Output capture does not own this execution\");\n if (!isDeepStrictEqual(current, page.expected))\n return { command: current, events: [], captured: false };\n const events: SessionEvent[] = [];\n for (const stream of [\"stdout\", \"stderr\"] as const) {\n const before = current.streams[stream],\n after = page.command.streams[stream];\n if (page[stream])\n events.push(\n ...(await appendSessionCommandOutput(tx, {\n ...scope,\n commandId: scope.processId,\n stream,\n streamFidelity: current.pty ? \"merged\" : \"separate\",\n chunkId: `modal-router:${current.execId}:${stream}:${before.byteOffset}:${after.byteOffset}:${after.eof ? 1 : 0}`,\n chunk: page[stream],\n })),\n );\n }\n if (supervisionDescriptor(page.command)) {\n await tx.execute(\n sql`select set_config('opengeni.supervised_output_capture_process_id', ${scope.processId}, true)`,\n );\n }\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({\n providerCommand: page.command,\n ...(supervisionDescriptor(page.command) &&\n page.command.streams.stdout.eof &&\n page.command.streams.stderr.eof &&\n page.command.streams.stdout.exitCode === 0 &&\n page.command.streams.stderr.exitCode === 0\n ? { supervisionOutputCaptured: true }\n : {}),\n })\n .where(processWhere(scope));\n if (supervisionDescriptor(page.command)) {\n await tx.execute(\n sql`select set_config('opengeni.supervised_output_capture_process_id', '', true)`,\n );\n }\n return { command: page.command, events, captured: true };\n });\n}\n\n/** Reserve a strictly increasing provider stdin index before dispatch. An\n * ambiguous send consumes its index and is never silently replayed. */\nexport async function reserveRetainedProviderInput(\n db: Database,\n scope: ProcessScope,\n byteLength?: number,\n): Promise<number> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand || row.state !== \"active\")\n throw new Error(\"Active retained provider command is unavailable\");\n if (row.cancellationRequestedAt || row.supervisionReceipt)\n throw new Error(\"Retained command input is closed\");\n const router = row.providerCommand.kind === \"modal-router-v1\";\n if (router && (!Number.isSafeInteger(byteLength) || byteLength! <= 0))\n throw new Error(\"Byte-offset stdin requires a positive byte reservation\");\n const index = row.providerCommandInputIndex + (router ? byteLength! : 1);\n if (!Number.isSafeInteger(index)) throw new Error(\"Provider stdin sequence exhausted\");\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ providerCommandInputIndex: index })\n .where(processWhere(scope));\n return router ? row.providerCommandInputIndex : index;\n });\n}\n\nexport type SupervisionReceipt = CommandSupervisionReceipt;\n\nfunction supervisionDescriptor(command: SandboxProviderCommand) {\n return command.kind === \"modal-router-v1\" ? command.supervision : undefined;\n}\n\n/** Fail before provider start, not after discovering an unprotected DB at retention. */\nexport async function supervisedCommandProtocolReady(db: Database): Promise<boolean> {\n const [row] = await db.execute<{ ready: boolean }>(sql`\n select count(*) = 5 as ready from pg_catalog.pg_trigger\n where (tgrelid, tgname) in (\n ('sandbox_retained_processes'::regclass, 'supervised_command_guard'),\n ('sandbox_retained_processes'::regclass, 'supervised_provider_loss_commit_guard'),\n ('sandbox_workspace_mutation_admissions'::regclass, 'supervised_command_admission_guard'),\n ('sandbox_lease_holders'::regclass, 'supervised_command_holder_guard'),\n ('sandbox_leases'::regclass, 'supervised_command_capture_guard')\n ) and tgenabled in ('O', 'A') and not tgisinternal\n `);\n return row?.ready === true;\n}\n\n/** Only an authenticated control-channel receipt; never parsed stdout/stderr.\n * ACK the supervisor only after this transaction returns successfully. */\nexport async function recordRetainedSupervisionReceipt(\n db: Database,\n scope: ProcessScope,\n receipt: SupervisionReceipt,\n): Promise<void> {\n const proof = CommandSupervisionReceipt.parse(receipt);\n await withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row?.providerCommand || !supervisionDescriptor(row.providerCommand))\n throw new Error(\"Supervised retained command is unavailable\");\n // Trigger validates invocation binding, immutable replay and unsettled input.\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ supervisionReceipt: proof })\n .where(processWhere(scope));\n });\n}\n\nexport async function loadRetainedSupervisionReceipt(\n db: Database,\n scope: ProcessScope,\n): Promise<SupervisionReceipt | null> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select({ receipt: schema.sandboxRetainedProcesses.supervisionReceipt })\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .limit(1);\n if (!row) throw new Error(\"Retained command is unavailable\");\n return row.receipt ? CommandSupervisionReceipt.parse(row.receipt) : null;\n });\n}\n\nexport async function requestRetainedProcessCancellation(\n db: Database,\n scope: ProcessScope,\n reason: \"provider_deadline\" | \"explicit_stop\",\n): Promise<void> {\n if (reason !== \"provider_deadline\" && reason !== \"explicit_stop\")\n throw new Error(\"Invalid cancellation reason\");\n await withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (!row) throw new Error(\"Retained command is unavailable\");\n if (row.cancellationRequestedAt || row.state !== \"active\") return;\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ cancellationRequestedAt: new Date(), cancellationReason: reason })\n .where(processWhere(scope));\n });\n}\n\nexport async function retainedProcessCancellationRequested(\n db: Database,\n scope: ProcessScope,\n): Promise<boolean> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select({ at: schema.sandboxRetainedProcesses.cancellationRequestedAt })\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .limit(1);\n if (!row) throw new Error(\"Retained command is unavailable\");\n return row.at !== null;\n });\n}\n\n/** Record deadline cancellation for an exact retained Modal command. Legacy\n * PTY callers send Ctrl-C first because cancellation fences stdin; non-PTY\n * callers only probe, since Ctrl-C would be data. An earlier explicit stop\n * remains immutable; the deadline uses its own clock. Lock order: process -> lease. */\nexport async function requestRetainedProcessDeadlineCancellation(\n db: Database,\n scope: ProcessScope,\n): Promise<boolean> {\n return withRlsContext(db, scope, async (tx) => {\n const [row] = await tx\n .select()\n .from(schema.sandboxRetainedProcesses)\n .where(processWhere(scope))\n .for(\"update\")\n .limit(1);\n if (\n !row ||\n row.state !== \"active\" ||\n row.providerBackend !== \"modal\" ||\n row.routeTargetId !== null\n )\n return false;\n const [lease] = await tx.execute<{ id: string }>(sql`\n select id from sandbox_leases where id = ${row.leaseId}\n and account_id = ${row.accountId} and workspace_id = ${row.workspaceId}\n and sandbox_group_id = ${row.sandboxGroupId} and lease_epoch = ${row.leaseEpoch}\n and backend = ${row.providerBackend} and instance_id = ${row.providerInstanceId}\n and rotation_requested_at is not null and rotation_reason = 'provider_deadline' for update\n `);\n if (!lease) return false;\n if (!row.deadlineCancellationRequestedAt || !row.cancellationRequestedAt) {\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({\n ...(!row.cancellationRequestedAt\n ? { cancellationRequestedAt: sql`now()`, cancellationReason: \"provider_deadline\" }\n : {}),\n ...(!row.deadlineCancellationRequestedAt\n ? { deadlineCancellationRequestedAt: sql`now()` }\n : {}),\n })\n .where(processWhere(scope));\n }\n return true;\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
rawRows,
|
|
3
3
|
withWorkspaceRls
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LKDCYHOC.js";
|
|
5
5
|
import {
|
|
6
6
|
sessionEvents,
|
|
7
7
|
sessionTurns
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IIPWNNVR.js";
|
|
9
9
|
import {
|
|
10
10
|
LOSSLESS_JSON_STRING_PREFIX,
|
|
11
11
|
fromPostgresLosslessJson
|
|
@@ -244,4 +244,4 @@ export {
|
|
|
244
244
|
readSessionMessageSliceInScope,
|
|
245
245
|
listSessionEventSlices
|
|
246
246
|
};
|
|
247
|
-
//# sourceMappingURL=chunk-
|
|
247
|
+
//# sourceMappingURL=chunk-GR62JL3M.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
rawRows,
|
|
3
3
|
withWorkspaceSubjectRls
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LKDCYHOC.js";
|
|
5
5
|
|
|
6
6
|
// src/connect-attempts.ts
|
|
7
7
|
import { createHash } from "crypto";
|
|
@@ -216,4 +216,4 @@ export {
|
|
|
216
216
|
claimConnectOperation,
|
|
217
217
|
finishConnectOperation
|
|
218
218
|
};
|
|
219
|
-
//# sourceMappingURL=chunk-
|
|
219
|
+
//# sourceMappingURL=chunk-GVDXDCVS.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
lockSessionEventWriteRows
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YGJLAIRL.js";
|
|
4
4
|
import {
|
|
5
5
|
withSessionActivityRlsContext
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-LKDCYHOC.js";
|
|
7
7
|
import {
|
|
8
8
|
sandboxRetainedProcesses,
|
|
9
9
|
sessionBackgroundCommands,
|
|
10
10
|
sessionEvents,
|
|
11
11
|
sessions
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-IIPWNNVR.js";
|
|
13
13
|
import {
|
|
14
14
|
fromPostgresLosslessJson,
|
|
15
15
|
withLosslessContentWriteVersion
|
|
@@ -128,4 +128,4 @@ async function appendSessionCommandOutput(db, input) {
|
|
|
128
128
|
export {
|
|
129
129
|
appendSessionCommandOutput
|
|
130
130
|
};
|
|
131
|
-
//# sourceMappingURL=chunk-
|
|
131
|
+
//# sourceMappingURL=chunk-H65VDGZ4.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
withWorkspaceRls,
|
|
6
6
|
withWorkspaceSubjectRls,
|
|
7
7
|
withWorkspaceSubjectSessionActivityRls
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-LKDCYHOC.js";
|
|
9
9
|
|
|
10
10
|
// src/session-tenancy.ts
|
|
11
11
|
import { createHash } from "crypto";
|
|
@@ -502,4 +502,4 @@ export {
|
|
|
502
502
|
forkSessionContent,
|
|
503
503
|
replayAppliedSessionFork
|
|
504
504
|
};
|
|
505
|
-
//# sourceMappingURL=chunk-
|
|
505
|
+
//# sourceMappingURL=chunk-HN7TYFOX.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
rlsContextForWorkspace,
|
|
7
7
|
setSubjectRlsContext,
|
|
8
8
|
withRlsContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-LKDCYHOC.js";
|
|
10
10
|
|
|
11
11
|
// src/organization-integration-policy.ts
|
|
12
12
|
import {
|
|
@@ -153,4 +153,4 @@ export {
|
|
|
153
153
|
withOrganizationIntegrationPolicyFence,
|
|
154
154
|
withOrganizationIntegrationAcquisition
|
|
155
155
|
};
|
|
156
|
-
//# sourceMappingURL=chunk-
|
|
156
|
+
//# sourceMappingURL=chunk-HZH6UE5Z.js.map
|