@opengeni/core 0.28.0 → 1.0.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.
Files changed (224) hide show
  1. package/README.md +1 -1
  2. package/dist/access/external-actor-authority.d.ts +47 -0
  3. package/dist/access/index.d.ts +182 -3
  4. package/dist/access/service-initiator.d.ts +3 -0
  5. package/dist/application/api-integration-servers.d.ts +20 -0
  6. package/dist/application/archived-session-imports.d.ts +6 -0
  7. package/dist/application/composer-submit.d.ts +24 -0
  8. package/dist/application/connect-authority.d.ts +13 -0
  9. package/dist/application/connect-operation.d.ts +31 -0
  10. package/dist/application/external-continuation.d.ts +15 -0
  11. package/dist/application/external-identity-lifecycle.d.ts +20 -0
  12. package/dist/application/external-link-work-admission.d.ts +12 -0
  13. package/dist/application/external-workspace-members.d.ts +34 -0
  14. package/dist/application/modal-native-worker-host-transport.d.ts +297 -0
  15. package/dist/application/new-session-drafts.d.ts +39 -2
  16. package/dist/application/sandbox-recovery.d.ts +58 -0
  17. package/dist/application/session-commands.d.ts +26 -13
  18. package/dist/application/session-mcp-credential-rotation.d.ts +29 -0
  19. package/dist/application/session-tenancy.d.ts +19 -0
  20. package/dist/application/user-resource-grants.d.ts +20 -0
  21. package/dist/billing/limits.d.ts +11 -0
  22. package/dist/canonical-human-identities.d.ts +7 -2
  23. package/dist/canonical-human-identities.js +17 -4
  24. package/dist/canonical-human-identities.js.map +1 -1
  25. package/dist/{chunk-6WKPWE5S.js → chunk-2MKMRGSY.js} +108 -24
  26. package/dist/chunk-2MKMRGSY.js.map +1 -0
  27. package/dist/{chunk-NYPMQ7NO.js → chunk-GVO3N37G.js} +205 -37
  28. package/dist/chunk-GVO3N37G.js.map +1 -0
  29. package/dist/{chunk-JJU6I5XD.js → chunk-LCQXNR62.js} +36 -10
  30. package/dist/chunk-LCQXNR62.js.map +1 -0
  31. package/dist/chunk-MM6N7CTO.js +387 -0
  32. package/dist/chunk-MM6N7CTO.js.map +1 -0
  33. package/dist/chunk-QO5GVFFO.js +235 -0
  34. package/dist/chunk-QO5GVFFO.js.map +1 -0
  35. package/dist/codex-model-availability.d.ts +14 -0
  36. package/dist/default-session-model.d.ts +139 -0
  37. package/dist/dependencies.d.ts +87 -4
  38. package/dist/developer-setup-credential-ceiling.d.ts +10 -0
  39. package/dist/domain/agent-config-resolution.d.ts +49 -0
  40. package/dist/domain/automations.d.ts +58 -0
  41. package/dist/domain/capabilities.d.ts +22 -4
  42. package/dist/domain/company-profile-agent-admin.d.ts +25 -0
  43. package/dist/domain/connection-account-selection-error.d.ts +8 -0
  44. package/dist/domain/connector-tool-permissions.d.ts +36 -0
  45. package/dist/domain/direct-model-provider.d.ts +3 -0
  46. package/dist/domain/editable-artifacts/agent-application.d.ts +10 -1
  47. package/dist/domain/editable-artifacts/durable-export.d.ts +22 -1
  48. package/dist/domain/editable-artifacts/ports.d.ts +10 -0
  49. package/dist/domain/editable-artifacts/service.d.ts +4 -3
  50. package/dist/domain/environments.d.ts +5 -9
  51. package/dist/domain/external-creation-attribution.d.ts +6 -0
  52. package/dist/domain/file-owner.d.ts +8 -0
  53. package/dist/domain/github-action-policies.d.ts +36 -0
  54. package/dist/domain/github-repository-bindings.d.ts +117 -0
  55. package/dist/domain/github-skill-source.d.ts +5 -0
  56. package/dist/domain/governed-learning-slack-publication.d.ts +45 -0
  57. package/dist/domain/insights-timing.d.ts +16 -0
  58. package/dist/domain/insights-usage.d.ts +27 -0
  59. package/dist/domain/insights.d.ts +28 -1
  60. package/dist/domain/knowledge-files.d.ts +20 -0
  61. package/dist/domain/knowledge-messages.d.ts +39 -0
  62. package/dist/domain/knowledge-messages.test.d.ts +1 -0
  63. package/dist/domain/knowledge-preparation.d.ts +10 -0
  64. package/dist/domain/knowledge-preparation.test.d.ts +1 -0
  65. package/dist/domain/knowledge-search.d.ts +15 -0
  66. package/dist/domain/knowledge-search.test.d.ts +1 -0
  67. package/dist/domain/knowledge.d.ts +9 -0
  68. package/dist/domain/mcp-account-bindings.d.ts +19 -0
  69. package/dist/domain/mcp-account-routes.d.ts +21 -0
  70. package/dist/domain/native-mcp-connection-admission.d.ts +3 -0
  71. package/dist/domain/organization-integration-catalog.d.ts +15 -0
  72. package/dist/domain/organization-membership-lifecycle.d.ts +1 -0
  73. package/dist/domain/personal-connection-delegations.d.ts +87 -4
  74. package/dist/domain/pr-review.d.ts +249 -0
  75. package/dist/domain/resources.d.ts +24 -3
  76. package/dist/domain/scheduled-task-access.d.ts +247 -0
  77. package/dist/domain/scheduled-tasks.d.ts +103 -6
  78. package/dist/domain/session-connection-accounts.d.ts +16 -0
  79. package/dist/domain/session-file-access.d.ts +4 -0
  80. package/dist/domain/session-native-connection-replacement.d.ts +14 -0
  81. package/dist/domain/session-start-timing.d.ts +7 -0
  82. package/dist/domain/session-tool-policy.d.ts +93 -4
  83. package/dist/domain/sessions.d.ts +275 -28
  84. package/dist/domain/skill-imports.d.ts +1 -0
  85. package/dist/domain/skill-search.d.ts +30 -0
  86. package/dist/domain/skills.d.ts +117 -0
  87. package/dist/domain/slack-bot.d.ts +46 -1
  88. package/dist/domain/workspace-members.d.ts +8 -1
  89. package/dist/editable-artifact-live/application.d.ts +12 -3
  90. package/dist/editable-artifact-live/ports.d.ts +0 -1
  91. package/dist/editable-artifact-live/server.d.ts +5 -2
  92. package/dist/editable-artifact-live/ticket.d.ts +2 -2
  93. package/dist/editable-artifact-live/types.d.ts +14 -2
  94. package/dist/editable-artifact-live.js +2 -2
  95. package/dist/editable-artifacts.js +10 -4
  96. package/dist/index.d.ts +49 -3
  97. package/dist/index.js +18826 -6847
  98. package/dist/index.js.map +1 -1
  99. package/dist/managed-auth-session-sets.d.ts +131 -0
  100. package/dist/managed-auth-session-sets.js +51 -0
  101. package/dist/managed-auth-session-sets.js.map +1 -0
  102. package/dist/managed-session.d.ts +98 -11
  103. package/dist/model-catalog.d.ts +117 -0
  104. package/dist/product-usage-metrics.d.ts +30 -0
  105. package/dist/rigs/index.d.ts +22 -5
  106. package/dist/rigs/provider-images.d.ts +1 -1
  107. package/dist/sandbox/fleet.d.ts +59 -10
  108. package/dist/sandbox/routing.d.ts +22 -2
  109. package/dist/sandbox/runtime-settings.d.ts +56 -0
  110. package/dist/session-authorization.d.ts +38 -1
  111. package/dist/site-session-origin.d.ts +9 -0
  112. package/dist/transcription.d.ts +12 -1
  113. package/dist/turn-surface.d.ts +18 -0
  114. package/dist/user-presence.d.ts +32 -0
  115. package/package.json +18 -11
  116. package/src/access/external-actor-authority.ts +94 -0
  117. package/src/access/index.ts +1386 -44
  118. package/src/access/service-initiator.ts +50 -0
  119. package/src/application/api-integration-servers.ts +215 -0
  120. package/src/application/archived-session-imports.ts +161 -0
  121. package/src/application/composer-submit.ts +77 -0
  122. package/src/application/connect-authority.ts +77 -0
  123. package/src/application/connect-operation.ts +80 -0
  124. package/src/application/external-continuation.ts +129 -0
  125. package/src/application/external-identity-lifecycle.ts +48 -0
  126. package/src/application/external-link-work-admission.ts +90 -0
  127. package/src/application/external-workspace-members.ts +232 -0
  128. package/src/application/modal-native-worker-host-transport.ts +263 -0
  129. package/src/application/new-session-drafts.ts +222 -29
  130. package/src/application/sandbox-recovery.ts +78 -0
  131. package/src/application/session-commands.ts +430 -73
  132. package/src/application/session-mcp-credential-rotation.ts +217 -0
  133. package/src/application/session-tenancy.ts +445 -0
  134. package/src/application/user-resource-grants.ts +154 -0
  135. package/src/billing/limits.ts +103 -24
  136. package/src/canonical-human-identities.ts +22 -3
  137. package/src/codex-model-availability.ts +136 -0
  138. package/src/default-session-model.ts +656 -0
  139. package/src/dependencies.ts +97 -5
  140. package/src/developer-setup-credential-ceiling.ts +60 -0
  141. package/src/domain/agent-config-resolution.ts +148 -0
  142. package/src/domain/automations.ts +270 -0
  143. package/src/domain/capabilities.ts +244 -151
  144. package/src/domain/company-profile-agent-admin.ts +56 -0
  145. package/src/domain/connection-account-selection-error.ts +19 -0
  146. package/src/domain/connector-tool-permissions.ts +371 -0
  147. package/src/domain/direct-model-provider.ts +62 -0
  148. package/src/domain/editable-artifacts/agent-application.ts +61 -15
  149. package/src/domain/editable-artifacts/durable-export.ts +100 -5
  150. package/src/domain/editable-artifacts/in-memory.ts +6 -0
  151. package/src/domain/editable-artifacts/ports.ts +11 -0
  152. package/src/domain/editable-artifacts/service.ts +32 -1
  153. package/src/domain/editable-artifacts/snapshot-compaction.ts +9 -5
  154. package/src/domain/editable-artifacts/snapshot-verifier-genesis.ts +10 -8
  155. package/src/domain/editable-artifacts/snapshot-verifier.ts +10 -3
  156. package/src/domain/environments.ts +25 -45
  157. package/src/domain/external-creation-attribution.ts +22 -0
  158. package/src/domain/file-owner.ts +67 -0
  159. package/src/domain/github-action-policies.ts +169 -0
  160. package/src/domain/github-repository-bindings.ts +295 -0
  161. package/src/domain/github-skill-source.ts +233 -0
  162. package/src/domain/governed-learning-slack-publication.ts +157 -0
  163. package/src/domain/insights-timing.ts +95 -0
  164. package/src/domain/insights-usage.ts +67 -0
  165. package/src/domain/insights.ts +270 -169
  166. package/src/domain/knowledge-files.ts +46 -0
  167. package/src/domain/knowledge-messages.test.ts +91 -0
  168. package/src/domain/knowledge-messages.ts +106 -0
  169. package/src/domain/knowledge-preparation.test.ts +276 -0
  170. package/src/domain/knowledge-preparation.ts +147 -0
  171. package/src/domain/knowledge-search.test.ts +561 -0
  172. package/src/domain/knowledge-search.ts +256 -0
  173. package/src/domain/knowledge.ts +133 -0
  174. package/src/domain/mcp-account-bindings.ts +171 -0
  175. package/src/domain/mcp-account-routes.ts +121 -0
  176. package/src/domain/native-mcp-connection-admission.ts +14 -0
  177. package/src/domain/organization-integration-catalog.ts +88 -0
  178. package/src/domain/organization-membership-lifecycle.ts +10 -0
  179. package/src/domain/personal-connection-delegations.ts +758 -115
  180. package/src/domain/pr-review.ts +687 -0
  181. package/src/domain/resources.ts +182 -25
  182. package/src/domain/scheduled-task-access.ts +1052 -0
  183. package/src/domain/scheduled-tasks.ts +1952 -215
  184. package/src/domain/session-connection-accounts.ts +67 -0
  185. package/src/domain/session-file-access.ts +47 -0
  186. package/src/domain/session-native-connection-replacement.ts +64 -0
  187. package/src/domain/session-start-timing.ts +55 -0
  188. package/src/domain/session-tool-policy.ts +443 -19
  189. package/src/domain/sessions.ts +3417 -619
  190. package/src/domain/skill-imports.ts +137 -17
  191. package/src/domain/skill-search.ts +221 -0
  192. package/src/domain/skills.ts +104 -0
  193. package/src/domain/slack-bot.ts +128 -3
  194. package/src/domain/workspace-members.ts +34 -2
  195. package/src/editable-artifact-live/application.ts +29 -4
  196. package/src/editable-artifact-live/ports.ts +0 -1
  197. package/src/editable-artifact-live/server.ts +167 -13
  198. package/src/editable-artifact-live/ticket.ts +87 -6
  199. package/src/editable-artifact-live/types.ts +16 -2
  200. package/src/editable-artifact-live/wire.ts +0 -10
  201. package/src/index.ts +69 -4
  202. package/src/managed-auth-session-sets.ts +371 -0
  203. package/src/managed-session.ts +520 -2
  204. package/src/model-catalog.ts +873 -0
  205. package/src/product-usage-metrics.ts +101 -0
  206. package/src/rigs/index.ts +179 -63
  207. package/src/rigs/provider-images.ts +2 -3
  208. package/src/sandbox/fleet.ts +471 -59
  209. package/src/sandbox/routing.ts +160 -33
  210. package/src/sandbox/runtime-settings.ts +281 -0
  211. package/src/session-authorization.ts +262 -78
  212. package/src/site-session-origin.ts +22 -0
  213. package/src/transcription.ts +13 -1
  214. package/src/turn-surface.ts +45 -0
  215. package/src/user-presence.ts +134 -0
  216. package/dist/chunk-6WKPWE5S.js.map +0 -1
  217. package/dist/chunk-IBOEYG6N.js +0 -34
  218. package/dist/chunk-IBOEYG6N.js.map +0 -1
  219. package/dist/chunk-JJU6I5XD.js.map +0 -1
  220. package/dist/chunk-NYPMQ7NO.js.map +0 -1
  221. package/dist/domain/durable-learning-slack-publication.d.ts +0 -72
  222. package/dist/domain/packs.d.ts +0 -55
  223. package/src/domain/durable-learning-slack-publication.ts +0 -202
  224. package/src/domain/packs.ts +0 -556
@@ -0,0 +1,67 @@
1
+ import type { AccessGrant } from "@opengeni/contracts";
2
+ import type { Settings } from "@opengeni/config";
3
+ import { requireSession, requireWorkspace, type Database } from "@opengeni/db";
4
+ import { settingsWithEnabledCapabilityMcpServers } from "./capabilities";
5
+ import {
6
+ freezeConnectionAccounts,
7
+ personalConnectionDelegationSourceForGrant,
8
+ } from "./personal-connection-delegations";
9
+ import {
10
+ sessionToolsForConnectionAccounts,
11
+ settingsWithSessionMcpServerMetadata,
12
+ } from "./sessions";
13
+ import { workspaceSessionToolPolicyDefaultServerIdsFor } from "./session-tool-policy";
14
+
15
+ /** Freeze the authenticated request's eligible accounts before starting voice.
16
+ * The resulting lease snapshot, not a later participant or ambient connection,
17
+ * supplies authority to both live delegations and automatic transcript handoff. */
18
+ export async function freezeSessionRealtimeConnectionAccounts(input: {
19
+ db: Database;
20
+ settings: Settings;
21
+ grant: AccessGrant;
22
+ workspaceId: string;
23
+ sessionId: string;
24
+ }) {
25
+ const { db, settings, grant, workspaceId, sessionId } = input;
26
+ const session = await requireSession(db, workspaceId, sessionId);
27
+ const capabilitySettings = await settingsWithEnabledCapabilityMcpServers(
28
+ db,
29
+ workspaceId,
30
+ settings,
31
+ {
32
+ subjectId: grant.subjectId,
33
+ },
34
+ );
35
+ const runtimeSettings = settingsWithSessionMcpServerMetadata(
36
+ capabilitySettings,
37
+ session.mcpServers,
38
+ );
39
+ const tools = sessionToolsForConnectionAccounts({
40
+ session,
41
+ runtimeMcpServers: runtimeSettings.mcpServers,
42
+ defaultMcpServerIds: workspaceSessionToolPolicyDefaultServerIdsFor(
43
+ capabilitySettings.mcpServers,
44
+ (await requireWorkspace(db, workspaceId)).settings,
45
+ ),
46
+ });
47
+ return await freezeConnectionAccounts({
48
+ db,
49
+ settings: runtimeSettings,
50
+ accountId: grant.accountId,
51
+ workspaceId,
52
+ tools,
53
+ resources: session.resources,
54
+ source: personalConnectionDelegationSourceForGrant(grant),
55
+ targetSessionId: sessionId,
56
+ googleDrivePublicationEnabled:
57
+ session.firstPartyMcpTools.includes("editable_artifact_export") &&
58
+ session.firstPartyMcpTools.includes("editable_artifact_export_status") &&
59
+ (!session.firstPartyMcpPermissions?.length ||
60
+ (session.firstPartyMcpPermissions.includes("artifacts:read") &&
61
+ session.firstPartyMcpPermissions.includes("artifacts:publish"))),
62
+ atlassianEnabled:
63
+ session.firstPartyMcpTools.some((tool) => tool.startsWith("atlassian_")) &&
64
+ (!session.firstPartyMcpPermissions?.length ||
65
+ session.firstPartyMcpPermissions.includes("connections:read")),
66
+ });
67
+ }
@@ -0,0 +1,47 @@
1
+ import type { AccessGrant, FileAsset } from "@opengeni/contracts";
2
+ import {
3
+ getSessionAuthorityProjection,
4
+ getFilesForSubject,
5
+ readSessionFileAttachments,
6
+ withSessionRlsActorContext,
7
+ } from "@opengeni/db";
8
+ import type { SessionAuthorizationDependencies } from "../session-authorization";
9
+ import {
10
+ requireSessionAuthorization,
11
+ withResolvedSessionAuthorization,
12
+ } from "../session-authorization";
13
+
14
+ /** A session attachment grant is never a generic file/Knowledge grant. */
15
+ export async function readSessionAttachmentFiles(
16
+ deps: SessionAuthorizationDependencies,
17
+ grant: AccessGrant,
18
+ sessionId: string,
19
+ fileIds: readonly string[],
20
+ ): Promise<FileAsset[]> {
21
+ const authority = await getSessionAuthorityProjection(deps.db, grant.workspaceId, sessionId);
22
+ if (!authority) return [];
23
+ const authorization = await requireSessionAuthorization(deps, grant, {
24
+ sessionId,
25
+ operation: "session.read",
26
+ surface: "core",
27
+ });
28
+ const ordinary = await getFilesForSubject(deps.db, {
29
+ accountId: grant.accountId,
30
+ workspaceId: grant.workspaceId,
31
+ subjectId: grant.subjectId,
32
+ fileIds,
33
+ });
34
+ const missing = fileIds.filter((id) => !ordinary.some((file) => file.id === id));
35
+ const actor = authorization?.actor ?? { kind: "subject" as const, subjectId: grant.subjectId };
36
+ const read = () =>
37
+ readSessionFileAttachments(deps.db, {
38
+ accountId: grant.accountId,
39
+ workspaceId: grant.workspaceId,
40
+ fileIds: missing,
41
+ access: { sessionId, authorityEpoch: authority.authorityEpoch, actor },
42
+ });
43
+ const shared = authorization
44
+ ? await withResolvedSessionAuthorization(authorization, read)
45
+ : await withSessionRlsActorContext({ subjectId: grant.subjectId }, read);
46
+ return [...ordinary, ...shared];
47
+ }
@@ -0,0 +1,64 @@
1
+ import type { ConnectionMetadata, McpServerConnectionRef } from "@opengeni/contracts";
2
+ import { connectionMetadataMatchesBinding } from "@opengeni/db/session-mcp-credential-rotation";
3
+
4
+ /** Selection is restricted to the caller's already-authorized inventory. This
5
+ * projection grants no execution authority: subsequent admission and physical
6
+ * credential use still validate the exact native account normally. */
7
+ export function nativeSessionConnectionReplacement(input: {
8
+ accountId: string;
9
+ workspaceId: string;
10
+ subjectId: string | null;
11
+ serverUrl: string;
12
+ replacementServerUrl?: string;
13
+ currentRef: McpServerConnectionRef | null;
14
+ nativeConnectionId: string;
15
+ connections: ConnectionMetadata[];
16
+ }): McpServerConnectionRef {
17
+ const connection = input.connections.find(
18
+ (candidate) => candidate.id === input.nativeConnectionId,
19
+ );
20
+ if (
21
+ !connection ||
22
+ connection.accountId !== input.accountId ||
23
+ connection.status !== "active" ||
24
+ (connection.subjectId === null
25
+ ? connection.workspaceId !== input.workspaceId
26
+ : !input.subjectId || connection.subjectId !== input.subjectId || !connection.authorityId)
27
+ ) {
28
+ throw new Error("native connection unavailable");
29
+ }
30
+ const {
31
+ authoritySource: _authoritySource,
32
+ hostBinding: _hostBinding,
33
+ accountSelection: _accountSelection,
34
+ ...retained
35
+ } = input.currentRef ?? {};
36
+ // Preserve provider, resource, scope and selected-resource restrictions.
37
+ // Retired host identity is never interpreted as a native connection ID.
38
+ if (
39
+ input.currentRef &&
40
+ input.currentRef.providerDomain.toLowerCase() !== connection.providerDomain.toLowerCase()
41
+ )
42
+ throw new Error("native connection provider mismatch");
43
+ const ref: McpServerConnectionRef = {
44
+ ...retained,
45
+ ...(!input.currentRef?.resource && typeof connection.metadata.resource === "string"
46
+ ? { resource: connection.metadata.resource }
47
+ : {}),
48
+ connectionId: connection.id,
49
+ providerDomain: connection.providerDomain,
50
+ kind: connection.kind,
51
+ subjectScope: connection.subjectId === null ? "workspace" : "subject",
52
+ };
53
+ const destination = input.replacementServerUrl ?? input.serverUrl;
54
+ // A redirect must be explicitly requested and bound in the account metadata;
55
+ // the broker's legacy provider-host fallback is insufficient for rebinding.
56
+ if (
57
+ input.replacementServerUrl &&
58
+ (typeof connection.metadata.mcpUrl !== "string" || !connection.metadata.mcpUrl.trim())
59
+ )
60
+ throw new Error("native connection destination unavailable");
61
+ if (!connectionMetadataMatchesBinding(connection, ref, destination))
62
+ throw new Error("native connection binding mismatch");
63
+ return ref;
64
+ }
@@ -0,0 +1,55 @@
1
+ import { withTraceContext, type Observability, type Span } from "@opengeni/observability";
2
+
3
+ type SessionStartPhase =
4
+ | "workspace_read"
5
+ | "model_catalog_initial"
6
+ | "default_model"
7
+ | "model_catalog_effective"
8
+ | "capability_settings"
9
+ | "initiator_freeze"
10
+ | "allowance"
11
+ | "shell_insert"
12
+ | "initialize"
13
+ | "event_fanout"
14
+ | "workflow_wake"
15
+ | "session_reload";
16
+ export type SessionStartObservability = Pick<Observability, "startSpan">;
17
+
18
+ /** Content-free child spans around existing work; export is never joined and
19
+ * diagnostic failures cannot alter the lifecycle or its exact error. */
20
+ export async function measureSessionStartPhase<T>(
21
+ observability: SessionStartObservability | null | undefined,
22
+ phase: SessionStartPhase,
23
+ work: () => Promise<T>,
24
+ ): Promise<T> {
25
+ let span: Span | undefined;
26
+ try {
27
+ span = observability?.startSpan(`core.session_start.${phase}`);
28
+ } catch {
29
+ // An unhealthy observer is not session authority.
30
+ }
31
+ const end = (outcome: "completed" | "failed") => {
32
+ try {
33
+ void Promise.resolve(span?.end({ attributes: { outcome } })).catch(() => undefined);
34
+ } catch {
35
+ // Never leak diagnostic errors or user content through an error field.
36
+ }
37
+ };
38
+ try {
39
+ const result = span ? withTraceContext(span, work) : work();
40
+ if (!span) return result;
41
+ return result.then(
42
+ (value) => {
43
+ end("completed");
44
+ return value;
45
+ },
46
+ (error) => {
47
+ end("failed");
48
+ throw error;
49
+ },
50
+ );
51
+ } catch (error) {
52
+ end("failed");
53
+ throw error;
54
+ }
55
+ }