@opengeni/api-router 0.22.2 → 0.26.1
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/app.d.ts +2 -2
- package/dist/app.js +1 -1
- package/dist/auth/managed-auth.d.ts +0 -30
- package/dist/browser-controller-authority.d.ts +43 -0
- package/dist/browser-state-authority.d.ts +27 -0
- package/dist/{chunk-HWXJW5C7.js → chunk-JIKNR5YL.js} +27993 -14546
- package/dist/chunk-JIKNR5YL.js.map +1 -0
- package/dist/codemode.d.ts +23 -0
- package/dist/editable-artifact-live-hints.d.ts +11 -0
- package/dist/editable-artifact-native-kernel.d.ts +37 -0
- package/dist/editable-artifact-office-import.d.ts +22 -0
- package/dist/editable-artifact-production.d.ts +29 -0
- package/dist/editable-artifact-websocket.d.ts +49 -0
- package/dist/editable-artifact-workspace-files.d.ts +23 -0
- package/dist/github-browser-flow.d.ts +6 -0
- package/dist/http/cors.d.ts +1 -0
- package/dist/http/sse.d.ts +2 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1824 -30
- package/dist/index.js.map +1 -1
- package/dist/integrations/api-integrations.d.ts +24 -0
- package/dist/integrations/atlassian.d.ts +176 -0
- package/dist/integrations/github-skill-source.d.ts +5 -0
- package/dist/integrations/google-drive.d.ts +85 -0
- package/dist/integrations/oauth-client.d.ts +30 -1
- package/dist/integrations/provider-oauth.d.ts +19 -0
- package/dist/integrations/slack-bot.d.ts +4 -0
- package/dist/integrations/slack-interactions.d.ts +14 -2
- package/dist/integrations/social-api.d.ts +2 -1
- package/dist/mcp/editable-artifact-query-schema.d.ts +4 -0
- package/dist/mcp/editable-artifacts.d.ts +13 -0
- package/dist/mcp/receipts.d.ts +28 -0
- package/dist/mcp/scheduled-task-view.d.ts +518 -0
- package/dist/mcp/server.d.ts +14 -3
- package/dist/memory-slack-delivery.d.ts +9 -0
- package/dist/routes/api-integrations.d.ts +8 -0
- package/dist/routes/browser-identities.d.ts +5 -0
- package/dist/routes/browser-sessions.d.ts +6 -0
- package/dist/routes/company-profile.d.ts +3 -0
- package/dist/routes/computer-sessions.d.ts +6 -0
- package/dist/routes/editable-artifacts.d.ts +44 -0
- package/dist/routes/integration-features.d.ts +3 -0
- package/dist/routes/memory-slack-publications.d.ts +6 -0
- package/dist/routes/plugins.d.ts +8 -0
- package/dist/routes/sessions.d.ts +17 -2
- package/dist/routes/skills.d.ts +6 -0
- package/dist/routes/video-generation.d.ts +3 -0
- package/dist/sandbox/auth-callout.d.ts +2 -0
- package/dist/sandbox/channel-a.d.ts +59 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -1
- package/dist/sandbox/viewer.d.ts +4 -2
- package/dist/temporal-schedule-cleanup.d.ts +26 -0
- package/package.json +19 -14
- package/src/app.ts +277 -41
- package/src/auth/managed-auth.ts +0 -16
- package/src/browser-controller-authority.ts +137 -0
- package/src/browser-state-authority.ts +236 -0
- package/src/codemode.ts +186 -0
- package/src/editable-artifact-live-hints.ts +64 -0
- package/src/editable-artifact-native-kernel.ts +659 -0
- package/src/editable-artifact-office-import.ts +230 -0
- package/src/editable-artifact-production.ts +419 -0
- package/src/editable-artifact-websocket.ts +311 -0
- package/src/editable-artifact-workspace-files.ts +186 -0
- package/src/github-browser-flow.ts +35 -6
- package/src/http/auth.ts +2 -0
- package/src/http/cors.ts +3 -0
- package/src/http/sse.ts +101 -6
- package/src/index.ts +147 -23
- package/src/integrations/api-integrations.ts +350 -0
- package/src/integrations/atlassian.ts +1621 -0
- package/src/integrations/github-skill-source.ts +142 -0
- package/src/integrations/google-drive.ts +1000 -64
- package/src/integrations/oauth-client.ts +159 -89
- package/src/integrations/provider-oauth.ts +777 -0
- package/src/integrations/slack-bot.ts +31 -2
- package/src/integrations/slack-interactions.ts +610 -42
- package/src/integrations/social-api.ts +11 -0
- package/src/mcp/documents.ts +74 -26
- package/src/mcp/editable-artifact-query-schema.ts +236 -0
- package/src/mcp/editable-artifacts.ts +448 -0
- package/src/mcp/receipts.ts +95 -0
- package/src/mcp/scheduled-task-view.ts +642 -0
- package/src/mcp/server.ts +1718 -310
- package/src/memory-slack-delivery.ts +209 -0
- package/src/observability.ts +3 -3
- package/src/routes/api-integrations.ts +407 -0
- package/src/routes/api-keys.ts +7 -1
- package/src/routes/browser-identities.ts +136 -0
- package/src/routes/browser-sessions.ts +2543 -0
- package/src/routes/codex.ts +7 -4
- package/src/routes/company-profile.ts +255 -0
- package/src/routes/computer-sessions.ts +1247 -0
- package/src/routes/connections.ts +358 -102
- package/src/routes/documents.ts +22 -3
- package/src/routes/editable-artifacts.ts +1159 -0
- package/src/routes/enrollments.ts +54 -12
- package/src/routes/environments.ts +60 -11
- package/src/routes/files.ts +277 -65
- package/src/routes/github.ts +18 -2
- package/src/routes/install.ts +38 -2
- package/src/routes/integration-features.ts +258 -0
- package/src/routes/machines.ts +1 -1
- package/src/routes/memory-slack-publications.ts +216 -0
- package/src/routes/packs.ts +437 -7
- package/src/routes/plugins.ts +751 -0
- package/src/routes/rigs.ts +77 -20
- package/src/routes/scheduled-tasks.ts +94 -42
- package/src/routes/sessions.ts +475 -234
- package/src/routes/skills.ts +174 -0
- package/src/routes/transcription-recordings.ts +65 -33
- package/src/routes/video-generation.ts +132 -0
- package/src/routes/workspaces.ts +46 -24
- package/src/sandbox/auth-callout.ts +16 -4
- package/src/sandbox/channel-a.ts +809 -85
- package/src/sandbox/enrollment.ts +13 -3
- package/src/sandbox/machines.ts +1 -1
- package/src/sandbox/metrics-ingestion.ts +121 -3
- package/src/sandbox/rematerialize.ts +35 -47
- package/src/sandbox/viewer.ts +58 -29
- package/src/temporal-schedule-cleanup.ts +135 -0
- package/dist/chunk-HWXJW5C7.js.map +0 -1
- package/dist/mcp/toolspace.d.ts +0 -62
- package/src/mcp/toolspace.ts +0 -1186
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
claimTemporalScheduleCleanups,
|
|
4
|
+
settleTemporalScheduleCleanup,
|
|
5
|
+
type Database,
|
|
6
|
+
type TemporalScheduleCleanupClaim,
|
|
7
|
+
} from "@opengeni/db";
|
|
8
|
+
import type { Observability } from "@opengeni/observability";
|
|
9
|
+
|
|
10
|
+
const CLEANUP_BATCH_SIZE = 32;
|
|
11
|
+
const CLEANUP_CLAIM_SECONDS = 15;
|
|
12
|
+
const CLEANUP_POLL_INTERVAL_MS = 1_000;
|
|
13
|
+
|
|
14
|
+
type TemporalScheduleCleanupDependencies = {
|
|
15
|
+
db: Database;
|
|
16
|
+
deleteSchedule: (temporalScheduleId: string) => Promise<void>;
|
|
17
|
+
observability?: Pick<Observability, "info" | "warn" | "error">;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type TemporalScheduleCleanupBatchResult = {
|
|
21
|
+
claimed: number;
|
|
22
|
+
deleted: number;
|
|
23
|
+
failed: number;
|
|
24
|
+
stale: number;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function cleanupError(error: unknown): string {
|
|
28
|
+
if (error instanceof Error) {
|
|
29
|
+
return `${error.name}: ${error.message}`.slice(0, 2000);
|
|
30
|
+
}
|
|
31
|
+
return String(error).slice(0, 2000);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Settle exact claims concurrently; every external delete is idempotent. */
|
|
35
|
+
export async function processTemporalScheduleCleanupClaims(
|
|
36
|
+
deps: TemporalScheduleCleanupDependencies,
|
|
37
|
+
claims: readonly TemporalScheduleCleanupClaim[],
|
|
38
|
+
): Promise<TemporalScheduleCleanupBatchResult> {
|
|
39
|
+
const results = await Promise.all(
|
|
40
|
+
claims.map(async (claim): Promise<"deleted" | "failed" | "stale"> => {
|
|
41
|
+
try {
|
|
42
|
+
await deps.deleteSchedule(claim.temporalScheduleId);
|
|
43
|
+
const settled = await settleTemporalScheduleCleanup(deps.db, {
|
|
44
|
+
id: claim.id,
|
|
45
|
+
claimId: claim.claimId,
|
|
46
|
+
});
|
|
47
|
+
return settled ? "deleted" : "stale";
|
|
48
|
+
} catch (error) {
|
|
49
|
+
const message = cleanupError(error);
|
|
50
|
+
try {
|
|
51
|
+
const settled = await settleTemporalScheduleCleanup(deps.db, {
|
|
52
|
+
id: claim.id,
|
|
53
|
+
claimId: claim.claimId,
|
|
54
|
+
error: message,
|
|
55
|
+
});
|
|
56
|
+
if (!settled) return "stale";
|
|
57
|
+
} catch (settlementError) {
|
|
58
|
+
deps.observability?.error("Temporal schedule cleanup settlement failed", {
|
|
59
|
+
cleanupId: claim.id,
|
|
60
|
+
temporalScheduleId: claim.temporalScheduleId,
|
|
61
|
+
attemptCount: claim.attemptCount,
|
|
62
|
+
error: cleanupError(settlementError),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
deps.observability?.warn("Temporal schedule cleanup will retry", {
|
|
66
|
+
cleanupId: claim.id,
|
|
67
|
+
temporalScheduleId: claim.temporalScheduleId,
|
|
68
|
+
attemptCount: claim.attemptCount,
|
|
69
|
+
error: message,
|
|
70
|
+
});
|
|
71
|
+
return "failed";
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
claimed: claims.length,
|
|
78
|
+
deleted: results.filter((result) => result === "deleted").length,
|
|
79
|
+
failed: results.filter((result) => result === "failed").length,
|
|
80
|
+
stale: results.filter((result) => result === "stale").length,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Claim and process one globally bounded batch. */
|
|
85
|
+
export async function drainTemporalScheduleCleanupOutbox(
|
|
86
|
+
deps: TemporalScheduleCleanupDependencies,
|
|
87
|
+
): Promise<TemporalScheduleCleanupBatchResult> {
|
|
88
|
+
const claims = await claimTemporalScheduleCleanups(deps.db, {
|
|
89
|
+
claimId: randomUUID(),
|
|
90
|
+
limit: CLEANUP_BATCH_SIZE,
|
|
91
|
+
claimSeconds: CLEANUP_CLAIM_SECONDS,
|
|
92
|
+
});
|
|
93
|
+
return await processTemporalScheduleCleanupClaims(deps, claims);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Start one non-overlapping reconciliation loop. PostgreSQL claims coordinate
|
|
98
|
+
* replicas; an API crash merely delays the exact row until its short claim
|
|
99
|
+
* expires.
|
|
100
|
+
*/
|
|
101
|
+
export function startTemporalScheduleCleanupPump(
|
|
102
|
+
deps: TemporalScheduleCleanupDependencies,
|
|
103
|
+
options: { intervalMs?: number } = {},
|
|
104
|
+
): () => Promise<void> {
|
|
105
|
+
const intervalMs = Math.max(100, options.intervalMs ?? CLEANUP_POLL_INTERVAL_MS);
|
|
106
|
+
let stopped = false;
|
|
107
|
+
let running: Promise<void> | undefined;
|
|
108
|
+
|
|
109
|
+
const tick = (): void => {
|
|
110
|
+
if (stopped || running) return;
|
|
111
|
+
running = drainTemporalScheduleCleanupOutbox(deps)
|
|
112
|
+
.then((result) => {
|
|
113
|
+
if (result.claimed > 0) {
|
|
114
|
+
deps.observability?.info("Temporal schedule cleanup batch settled", result);
|
|
115
|
+
}
|
|
116
|
+
})
|
|
117
|
+
.catch((error: unknown) => {
|
|
118
|
+
deps.observability?.error("Temporal schedule cleanup claim failed", {
|
|
119
|
+
error: cleanupError(error),
|
|
120
|
+
});
|
|
121
|
+
})
|
|
122
|
+
.finally(() => {
|
|
123
|
+
running = undefined;
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const timer = setInterval(tick, intervalMs);
|
|
128
|
+
queueMicrotask(tick);
|
|
129
|
+
|
|
130
|
+
return async () => {
|
|
131
|
+
stopped = true;
|
|
132
|
+
clearInterval(timer);
|
|
133
|
+
await running;
|
|
134
|
+
};
|
|
135
|
+
}
|