@neta-art/cohub 8.8.0 → 8.10.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.
@@ -1,3 +1,56 @@
1
+ //#region src/types.ts
2
+ /**
3
+ * The full permission vocabulary, mirrored from `@cohub/core` permissions.
4
+ * Kept as a runtime constant so hosts can validate untrusted scopes from
5
+ * app iframes — TypeScript unions cannot constrain cross-window messages.
6
+ */
7
+ const PERMISSIONS = [
8
+ "space.view",
9
+ "space.edit",
10
+ "space.label.view",
11
+ "space.label.manage",
12
+ "space.label.assign",
13
+ "session.view",
14
+ "session.edit",
15
+ "session.prompt.readonly",
16
+ "session.prompt.fullaccess",
17
+ "generation.create",
18
+ "file.view",
19
+ "file.view.filtered",
20
+ "file.edit",
21
+ "checkpoint.view",
22
+ "checkpoint.edit",
23
+ "member.view",
24
+ "member.manage",
25
+ "references.view",
26
+ "channel.view",
27
+ "channel.manage",
28
+ "cronjob.view",
29
+ "cronjob.manage",
30
+ "taskrun.view",
31
+ "command.execute",
32
+ "sandbox.view",
33
+ "sandbox.manage",
34
+ "mod.view",
35
+ "mod.manage",
36
+ "space.commerce.view",
37
+ "space.commerce.manage",
38
+ "user.space.list",
39
+ "user.session.list",
40
+ "user.taskrun.list",
41
+ "user.usage.read"
42
+ ];
43
+ /** A held permission that already covers the checked one. */
44
+ const IMPLIED_PERMISSIONS = {
45
+ "session.prompt.readonly": ["session.prompt.fullaccess"],
46
+ "file.view.filtered": ["file.view"]
47
+ };
48
+ /** Implication-aware membership check, mirroring `@cohub/core`. */
49
+ function scopeListHasPermission(scopes, permission) {
50
+ if (scopes.includes(permission)) return true;
51
+ return (IMPLIED_PERMISSIONS[permission] ?? []).some((implies) => scopes.includes(implies));
52
+ }
53
+ //#endregion
1
54
  //#region src/environment.ts
2
55
  const COHUB_ENVIRONMENTS = {
3
56
  prod: {
@@ -11,9 +64,61 @@ const COHUB_ENVIRONMENTS = {
11
64
  voiceInputWebsocketUrl: "wss://gateway-dev.cohub.live/asr/ws"
12
65
  }
13
66
  };
14
- const readRuntimeEnv = () => {
15
- return globalThis.process?.env?.ENV;
67
+ const readProcessEnv = () => {
68
+ return globalThis.process?.env;
16
69
  };
70
+ const readRuntimeEnv = () => readProcessEnv()?.ENV;
71
+ /** Existing scoped identity injected into Sandbox command processes. */
72
+ const resolveExecutionToken = () => readProcessEnv()?.COHUB_EXECUTION_TOKEN?.trim() || null;
73
+ function decodeExecutionPayload() {
74
+ const encoded = resolveExecutionToken()?.split(".")[1];
75
+ if (!encoded) return null;
76
+ try {
77
+ const base64 = encoded.replaceAll("-", "+").replaceAll("_", "/").padEnd(Math.ceil(encoded.length / 4) * 4, "=");
78
+ const decoded = JSON.parse(globalThis.atob(base64));
79
+ return decoded && typeof decoded === "object" ? decoded : null;
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+ const readString = (env, key) => env?.[key]?.trim() || null;
85
+ const readPayloadString = (payload, key) => typeof payload?.[key] === "string" && payload[key] ? payload[key] : null;
86
+ const KNOWN_PERMISSIONS = new Set(PERMISSIONS);
87
+ const readScopes = (payload) => Array.isArray(payload?.scopes) ? payload.scopes.filter((scope) => typeof scope === "string" && KNOWN_PERMISSIONS.has(scope)) : [];
88
+ function getCohubContext() {
89
+ const env = readProcessEnv();
90
+ const token = resolveExecutionToken();
91
+ const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
92
+ const runtime = token || readString(env, "COHUB_SPACE_ID") ? "sandbox" : isBrowser ? "browser" : "local";
93
+ const payload = decodeExecutionPayload();
94
+ if (!token && runtime !== "sandbox") return {
95
+ runtime: { kind: runtime },
96
+ execution: null
97
+ };
98
+ return {
99
+ runtime: { kind: runtime },
100
+ execution: {
101
+ source: readPayloadString(payload, "source"),
102
+ actorUserId: readString(env, "COHUB_USER_UUID") ?? readPayloadString(payload, "actorUserId"),
103
+ viewerUserId: readPayloadString(payload, "viewerUserId"),
104
+ spaceId: readString(env, "COHUB_SPACE_ID") ?? readPayloadString(payload, "spaceId"),
105
+ sessionId: readString(env, "COHUB_SESSION_ID") ?? readPayloadString(payload, "sessionId"),
106
+ turnId: readString(env, "COHUB_TURN_ID") ?? readPayloadString(payload, "turnId"),
107
+ toolCallId: readString(env, "COHUB_TOOL_CALL_ID"),
108
+ sourceClientId: readString(env, "COHUB_SOURCE_CLIENT_ID"),
109
+ taskRunId: readPayloadString(payload, "taskRunId"),
110
+ appId: readPayloadString(payload, "appId"),
111
+ appVersionId: readPayloadString(payload, "appVersionId"),
112
+ action: readPayloadString(payload, "action"),
113
+ scopes: readScopes(payload),
114
+ modelProvider: readString(env, "COHUB_MODEL_PROVIDER"),
115
+ modelId: readString(env, "COHUB_MODEL_ID")
116
+ }
117
+ };
118
+ }
119
+ function resolveExecutionAppId() {
120
+ return readPayloadString(decodeExecutionPayload(), "appId");
121
+ }
17
122
  const resolveCohubEnvironment = (env) => {
18
123
  if (env) return env;
19
124
  return readRuntimeEnv() === "dev" ? "dev" : "prod";
@@ -42,4 +147,4 @@ const resolveVoiceInputWebsocketUrl = (options = {}) => {
42
147
  return COHUB_ENVIRONMENTS[resolveCohubEnvironment(options.env)].voiceInputWebsocketUrl;
43
148
  };
44
149
  //#endregion
45
- export { resolveApiBaseUrl as a, resolveWebsocketUrl as c, normalizeWebsocketUrl as i, normalizeBaseUrl as n, resolveCohubEnvironment as o, normalizeVoiceInputWebsocketUrl as r, resolveVoiceInputWebsocketUrl as s, COHUB_ENVIRONMENTS as t };
150
+ export { normalizeWebsocketUrl as a, resolveExecutionAppId as c, resolveWebsocketUrl as d, PERMISSIONS as f, normalizeVoiceInputWebsocketUrl as i, resolveExecutionToken as l, getCohubContext as n, resolveApiBaseUrl as o, scopeListHasPermission as p, normalizeBaseUrl as r, resolveCohubEnvironment as s, COHUB_ENVIRONMENTS as t, resolveVoiceInputWebsocketUrl as u };
@@ -1,5 +1,5 @@
1
- import { $ as CreateInvitationInput, $i as AppContentKind, $n as SpaceFsCompleteUploadResponse, $r as UserRulesResponse, $t as ReferenceDirection, Aa as BoardPlaybackCommand, Ai as BoardAwarenessUpdatedEvent$1, An as SpaceActivityResponse, Ar as SpacePendingDiffSummary, Ba as BoardAuthoringReadInput, Br as SpaceTurnAuthorFilter, Bt as Permission, Ci as GenerationModelDeclaration, Co as StoredIntermediateMessage, Cr as SpaceInvitationListResponse, Ct as LabelAssignmentRecord, Dn as SpaceAccessPolicy, Ea as BoardCreateInput, Er as SpaceMember, Et as LabelListItem, Fa as BoardSummary, Fo as Usage, Fr as SpaceRole, G as CheckpointDiffFileResponse, H as Channel, Hi as SessionTurnPatchEvent, Hn as SpaceCommerceProduct, In as SpaceCheckpointDetailResponse, Io as BillingPayload, Jn as SpaceConfigUpdateResponse, Jr as UserActivityQuery, Ka as BoardSemanticMutation, Ki as BoardAwarenessUpdate, Kn as SpaceConfigInput, Kr as TaskRunDetailResponse, Kt as PublicUserPageResponse, Li as RealtimePatchOperation, Ln as SpaceCommerceBenefit, Lo as ContentBlock, Mi as BoardPlaybackChangedEvent$1, Mt as ModelCatalogEntry, Na as BoardPlaybackSnapshot, No as SpaceCompletionResult, Nr as SpacePublicProfile, Or as SpaceModListItem, Ot as LabelResourceType, Po as SpaceCompletionStreamEvent, Pr as SpaceRecord, Pt as PaletteOverviewResponse, Q as ClaimReferralResponse, Qn as SpaceFsCompleteUploadInput, Qr as UserProfile, Qt as ReferenceAggregateResponse, Rn as SpaceCommerceBuyerProfile, Rt as PatchResourceLabelsInput, Si as GenerationContentBlock, Sn as SessionTurnsPaginatedResponse, So as SpaceTurnsResponse, Ta as BoardCapabilities, To as TurnIntermediateMessagesFile, Un as SpaceCommerceProductBenefitBinding, Ut as PromptTemplateCatalogResponse, Va as BoardAuthoringSnapshot, Vn as SpaceCommerceOrder, Vo as RequestSource, Wr as SpaceUsageResponse, Wt as PublicReferral, X as CheckpointDiffSummary, Xn as SpaceDefaultResponse, Yn as SpaceCreateResponse, Z as CheckpointRecord, Zn as SpaceEnvInput, Zr as UserActivityResponse, Zt as ReferenceAggregateGroupBy, _n as SessionTurnIndexResponse, _o as SessionForkRecord, _t as InvitationDetail, a as WebsocketClientOptions, ai as ChannelHealth, an as ReferralDashboard, at as CreateSpaceSessionInput, ba as NavigationCall, bn as SessionTurnStreamSnapshotResponse, br as SpaceFsUploadResponse, cr as SpaceFsMoveInput, ct as CronJobUpdatePatch, d as BatchUserProfilesResponse, da as DesktopCommandError, en as ReferenceKind, et as CreateInvitationResponse, fa as DesktopCommandRecord, fr as SpaceFsReadFilesResponse, gn as SessionRecord, go as MessageRecord, hn as SessionMessagesResponse, ho as SpacePublicEndpoints, ht as GlobalSearchType, ii as ChannelConfig, it as CreateSpacePromptResponse, ji as BoardChangedEvent$1, jo as CreateSpaceCompletionInput, jr as SpacePresenceSnapshot, jt as MeResponse, ka as BoardMutationReceipt, kr as SpacePendingDiffFileResponse, l as AcceptInvitationResponse, la as DesktopCommand, lr as SpaceFsPreparingFile, lt as CursorPageInfo, mn as SessionMessagesPaginatedResponse, ni as UserSessionsResponse, nn as ReferenceQueryableType, nr as SpaceFsCreateUploadResponse, pa as DesktopCommandStatus, pn as SessionMessageResponse, pr as SpaceFsTreeResponse, pt as GlobalSearchResponse, qi as AppArtifactDescriptor, qn as SpaceConfigResponse, qr as TaskRunRecord, r as WebsocketClient, rt as CreateSpacePromptInput, s as WebsocketEventPayload, sr as SpaceFsFileResponse, st as CronJobRecord, tn as ReferenceQueryResponse, tr as SpaceFsCreateUploadInput, tt as CreateSpaceInput, vn as SessionTurnResponse, wn as SkillCatalogResponse, wt as LabelItemsResponse, xa as NavigationLaunch, xn as SessionTurnWindowResponse, xo as SessionTurnRecord, xr as SpaceFsWriteFileInput, yn as SessionTurnSignedUrlsResponse, yo as MessageToolCallsFile, zr as SpaceSessionsResponse, zt as PatchResourceLabelsResponse } from "./websocket.js";
2
- import { n as CohubEnvironment } from "./environment.js";
1
+ import { $r as SpaceUsageResponse, $t as PublicReferral, Aa as BoardAuthoringReadInput, An as SessionTurnWindowResponse, Ao as MessageToolCallsFile, Ar as SpaceFsWriteFileInput, Br as SpacePresenceSnapshot, Bt as MeResponse, Ca as BoardPlaybackSnapshot, Cn as SessionMessagesPaginatedResponse, Di as SessionTurnPatchEvent, Dn as SessionTurnResponse, Do as MessageRecord, En as SessionTurnIndexResponse, Et as InvitationDetail, Fr as SpaceMember, Ft as LabelListItem, Gn as SpaceCheckpointDetailResponse, Go as SpaceCompletionStreamEvent, Ho as CreateSpaceCompletionInput, Hr as SpacePublicProfile, Ia as BoardSemanticMutation, In as SpaceAccessPolicy, Io as TurnIntermediateMessagesFile, Ji as DesktopCommandStatus, Jr as SpaceSessionsResponse, Jt as PatchResourceLabelsResponse, Ki as DesktopCommandError, Kn as SpaceCommerceBenefit, Ko as Usage, Lr as SpaceModListItem, Lt as LabelResourceType, Mo as SessionTurnRecord, Mr as SpaceInvitationListResponse, Mt as LabelAssignmentRecord, Nn as SkillCatalogResponse, No as SpaceTurnsResponse, Nt as LabelItemsResponse, Oi as AppArtifactDescriptor, On as SessionTurnSignedUrlsResponse, Oo as SessionForkRecord, Pi as AppContentKind, Po as StoredIntermediateMessage, Qn as SpaceCommerceProductBenefitBinding, Qt as PromptTemplateCatalogResponse, Rr as SpacePendingDiffFileResponse, Sn as SessionMessageResponse, So as ChannelHealth, Sr as SpaceFsTreeResponse, St as GlobalSearchResponse, Ta as BoardSummary, Tn as SessionRecord, Ur as SpaceRecord, Ut as PaletteOverviewResponse, Vt as ModelCatalogEntry, Wi as DesktopCommand, Wo as SpaceCompletionResult, Wr as SpaceRole, Xn as SpaceCommerceOrder, Yr as SpaceTurnAuthorFilter, Yt as Permission, Z as Channel, Zn as SpaceCommerceProduct, Zo as RequestSource, _o as BillingPayload, _r as SpaceFsMoveInput, _t as CronJobUpdatePatch, ar as SpaceDefaultResponse, at as CheckpointDiffSummary, ba as BoardPlaybackCommand, ci as UserRulesResponse, cn as ReferenceDirection, cr as SpaceFsCompleteUploadResponse, ct as CreateInvitationInput, di as UserSessionsResponse, dn as ReferenceQueryableType, dr as SpaceFsCreateUploadResponse, et as CheckpointDiffFileResponse, ft as CreateSpacePromptInput, g as AcceptInvitationResponse, ga as BoardCreateInput, gi as BoardPlaybackChangedEvent$1, gr as SpaceFsFileResponse, gt as CronJobRecord, ha as BoardCapabilities, hi as BoardChangedEvent$1, ir as SpaceCreateResponse, ja as BoardAuthoringSnapshot, jn as SessionTurnsPaginatedResponse, kn as SessionTurnStreamSnapshotResponse, kr as SpaceFsUploadResponse, ln as ReferenceKind, lt as CreateInvitationResponse, mi as BoardAwarenessUpdatedEvent$1, mn as ReferralDashboard, mt as CreateSpaceSessionInput, na as NavigationLaunch, ni as TaskRunRecord, nr as SpaceConfigResponse, oi as UserActivityResponse, on as ReferenceAggregateGroupBy, or as SpaceEnvInput, ot as CheckpointRecord, pt as CreateSpacePromptResponse, qi as DesktopCommandRecord, qn as SpaceCommerceBuyerProfile, qo as ContentBlock, qt as PatchResourceLabelsInput, r as CohubEnvironment, ra as SpacePublicEndpoints, ri as UserActivityQuery, rr as SpaceConfigUpdateResponse, sa as BoardAwarenessUpdate, si as UserProfile, sn as ReferenceAggregateResponse, sr as SpaceFsCompleteUploadInput, st as ClaimReferralResponse, ta as NavigationCall, ti as TaskRunDetailResponse, tn as PublicUserPageResponse, tr as SpaceConfigInput, un as ReferenceQueryResponse, ur as SpaceFsCreateUploadInput, ut as CreateSpaceInput, v as BatchUserProfilesResponse, vo as GenerationContentBlock, vr as SpaceFsPreparingFile, vt as CursorPageInfo, wn as SessionMessagesResponse, wt as GlobalSearchType, xi as RealtimePatchOperation, xo as ChannelConfig, xr as SpaceFsReadFilesResponse, ya as BoardMutationReceipt, yo as GenerationModelDeclaration, zn as SpaceActivityResponse, zr as SpacePendingDiffSummary } from "./environment.js";
2
+ import { a as WebsocketClientOptions, r as WebsocketClient, s as WebsocketEventPayload } from "./websocket.js";
3
3
  import { a as VoiceInputCreateOptions } from "./voice-input.js";
4
4
  //#region ../protocol/dist/model/status.d.ts
5
5
  /** Per-model availability status, derived from observed traffic with probe fallback. */
@@ -720,7 +720,7 @@ declare class SkillsApi {
720
720
  }
721
721
  //#endregion
722
722
  //#region src/apis/public-assets.d.ts
723
- type PublicAssetPurpose = "user_avatar" | "space_avatar" | "chat_attachment";
723
+ type PublicAssetPurpose = "user_avatar" | "space_avatar" | "chat_attachment" | "app_source";
724
724
  type PublicAssetUploadProtocol = "presigned_put_v1";
725
725
  /** Preprocessed chat images. General chat files and avatars may use any mime string. */
726
726
  type PublicAssetMimeType = "image/webp" | "image/jpeg";
@@ -762,6 +762,7 @@ type PublicAssetUploadProgress = {
762
762
  totalBytes: number;
763
763
  ratio: number;
764
764
  };
765
+ type UploadAppSourceInput = UploadChatAttachmentInput;
765
766
  type UploadChatAttachmentInput = {
766
767
  /** Optional association only; upload is user-scoped. */
767
768
  spaceId?: string;
@@ -785,6 +786,7 @@ declare class PublicAssetsApi {
785
786
  }): Promise<CreatePublicAssetUploadResponse>;
786
787
  upload(input: UploadPublicAssetInput): Promise<PublicAssetUploadBase>;
787
788
  /** Durable public upload for any chat attachment (image or file). No space required. */
789
+ uploadAppSource(input: UploadAppSourceInput): Promise<PublicAssetUploadBase>;
788
790
  uploadChatAttachment(input: UploadChatAttachmentInput): Promise<PublicAssetUploadBase>;
789
791
  /** Preprocessed chat image (webp/jpeg). Same durable path as uploadChatAttachment. */
790
792
  uploadChatImageAttachment(input: UploadChatImageAttachmentInput): Promise<PublicAssetUploadBase>;
@@ -1811,10 +1813,19 @@ declare class SpaceClient {
1811
1813
  }
1812
1814
  //#endregion
1813
1815
  //#region src/apis/tasks.d.ts
1816
+ type TaskWaitOptions = {
1817
+ timeoutMs?: number;
1818
+ pollIntervalMs?: number;
1819
+ signal?: AbortSignal;
1820
+ };
1814
1821
  declare class TasksApi {
1815
1822
  private readonly transport;
1816
- constructor(transport: HttpTransport);
1817
- get(taskRunId: string): Promise<TaskRunDetailResponse>;
1823
+ private readonly websocketClient;
1824
+ constructor(transport: HttpTransport, websocketClient?: WebsocketClient | null);
1825
+ get(taskRunId: string, options?: {
1826
+ signal?: AbortSignal;
1827
+ }): Promise<TaskRunDetailResponse>;
1828
+ wait(taskRunId: string, options?: TaskWaitOptions): Promise<TaskRunRecord>;
1818
1829
  getMany(taskRunIds: string[], options?: {
1819
1830
  spaceId?: string;
1820
1831
  }): Promise<{
@@ -2134,6 +2145,11 @@ type AppViewerGrantRecord = {
2134
2145
  createdAt: string | null;
2135
2146
  updatedAt: string | null;
2136
2147
  };
2148
+ type AppActionRunResponse = {
2149
+ taskRunId: string;
2150
+ action: string;
2151
+ status: "pending";
2152
+ };
2137
2153
  type AppAuthorizeResponse = {
2138
2154
  token: string;
2139
2155
  expiresIn: number;
@@ -2151,6 +2167,7 @@ declare class AppsApi {
2151
2167
  apps: AppRecord[];
2152
2168
  }>;
2153
2169
  get(id: string): Promise<AppDetailResponse>;
2170
+ runAction(appId: string, action: string, input?: unknown): Promise<AppActionRunResponse>;
2154
2171
  /**
2155
2172
  * Loads a published app's metadata + owner info by id (public access model).
2156
2173
  * Used by the standalone app auth broker page.
@@ -2445,4 +2462,4 @@ declare class CohubHttpClient {
2445
2462
  }
2446
2463
  declare const createHttpClient: (options?: CohubClientOptions) => CohubHttpClient;
2447
2464
  //#endregion
2448
- export { AppUpdateInput as $, sanitizeAccessToken as $n, BuildSpacePathInput as $t, WaitForUiCommandOptions as A, PublicAssetMimeType as An, CreateGenerationTaskRequest as Ar, WorkViewSource as At, AppPromotionCreateInput as B, ModelsApi as Bn, BoardEventName as Bt, DesktopCommandsApi as C, createSessionPatchReducer as Cn, PublicFileCreateUploadResponse as Cr, WorkRecord as Ct, UiCommandStatus as D, SearchApi as Dn, PublicFileUploadPlanEntry as Dr, WorkTargetType as Dt, UiCommandRecord as E, ReferencesApi as En, PublicFileUploadEntryInput as Er, WorkStatus as Et, AppDetailResponse as F, UploadChatAttachmentInput as Fn, PublicGenerationDeclaration as Fr, UserApi as Ft, AppPromotionStatsResponse as G, Fetch as Gn, SpaceChannelBindingRecord as Gt, AppPromotionProvider as H, CronJobsApi as Hn, BoardSubscriptionHandlers as Ht, AppExtractedPageMeta as I, UploadChatImageAttachmentInput as In, ModelStatusEntry as Ir, TasksApi as It, AppRecord as J, HttpTransport as Jn, SpacePublicFilesApi as Jt, AppPublicOwnerRecord as K, HttpError as Kn, SpaceClient as Kt, AppGetResponse as L, UploadPublicAssetInput as Ln, ModelStatusResponse as Lr, BoardAwarenessUpdatedEvent as Lt, AppContent as M, PublicAssetUploadProgress as Mn, GenerationTaskResult as Mr, WorkVisibility as Mt, AppContentDownload as N, PublicAssetUploadProtocol as Nn, GenerationUsageBilling as Nr, ReferralsApi as Nt, UiCommandsApi as O, CreatePublicAssetUploadInput as On, PublicFileUrlResponse as Or, WorkUpdateInput as Ot, AppCreateInput as P, PublicAssetsApi as Pn, ListGenerationModelsResponse as Pr, UsersApi as Pt, AppTargetType as Q, matchesUnauthorizedErrorToken as Qn, BuildSpaceInvitePathInput as Qt, AppMeta as R, SkillsApi as Rn, BoardChangedEvent as Rt, CreateUiCommandInput as S, SessionPatchStatus as Sn, PublicFileCreateUploadInput as Sr, WorkPublicSpaceRecord as St, UiCommandError as T, ReferenceResourceSelector as Tn, PublicFileListResponse as Tr, WorkSessionResponse as Tt, AppPromotionProviderStatus as U, ChannelsApi as Un, SessionEventName as Ut, AppPromotionEventResponse as V, GenerationsApi as Vn, BoardPlaybackChangedEvent as Vt, AppPromotionRecord as W, CohubClientOptions as Wn, SessionSubscriptionHandlers as Wt, AppSessionResponse as X, UnauthorizedContext as Xn, SpacesApi as Xt, AppResolveResponse as Y, RawHttpResponse as Yn, SpaceTurnListOptions as Yt, AppStatus as Z, joinApiUrl as Zn, WebSocketConnectionState as Zt, WorkCommerceEntitlementsResponse as _, parseAssistantMessageCommit as _n, AppNavigationCall as _r, WorkPromotionProvider as _t, AppCommerceCreditConsumeResponse as a, GenerationStreamErrorEvent as an, AppRuntimeCheckoutStatus as ar, AppsApi as at, WorkCommercePurchaseResponse as b, SessionPatchReducer as bn, AppNavigationOpenResponse as br, WorkPromotionStatsResponse as bt, AppCommerceEntitlementsResponse as c, GenerationStreamIntermediateMessage as cn, AppRuntimeModeConfig as cr, WorkContentDownload as ct, AppCommercePurchaseResponse as d, GenerationStreamStateEvent as dn, AppRuntimeTransport as dr, WorkExtractedPageMeta as dt, PublicInviteApi as en, AppContextChangedListener as er, AppVersionRecord as et, WorkCommerceApi as f, GenerationStreamSubscribeOptions as fn, ParentBridgeTransport as fr, WorkGetResponse as ft, WorkCommerceEntitlement as g, createSessionGenerationStreamClient as gn, resolveAppTransport as gr, WorkPromotionEventResponse as gt, WorkCommerceCreditConsumeStatus as h, SessionGenerationStreamClient as hn, createSlugAppIdResolver as hr, WorkPromotionCreateInput as ht, AppCommerceCheckoutStatus as i, GenerationStreamCommitEvent as in, AppRuntimeCheckoutState as ir, AppVisibility as it, AppAuthorizeResponse as j, PublicAssetPurpose as jn, CreateGenerationTaskResponse as jr, WorkViewStatsResponse as jt, WaitForDesktopCommandOptions as k, CreatePublicAssetUploadResponse as kn, SpaceStartupResponse as kr, WorkVersionRecord as kt, AppCommerceOrder as l, GenerationStreamLifecycleEvent as ln, AppRuntimeRequestOptions as lr, WorkCreateInput as lt, WorkCommerceCreditConsumeResponse as m, GenerationStreamTurnUpdatedEvent as mn, createAppRuntime as mr, WorkPresentationMeta as mt, createHttpClient as n, buildSpacePath as nn, AppRuntimeApi as nr, AppViewStatsResponse as nt, AppCommerceCreditConsumeStatus as o, GenerationStreamEvent as on, AppRuntimeContext as or, WorkAuthorizeResponse as ot, WorkCommerceCheckoutStatus as p, GenerationStreamSubscriptionHandlers as pn, PopupBrokerTransport as pr, WorkMeta as pt, AppPublicSpaceRecord as q, HttpTraceContext as qn, SpaceEventName as qt, AppCommerceApi as r, AssistantMessageCommit as rn, AppRuntimeAuthorizationResult as rr, AppViewerGrantRecord as rt, AppCommerceEntitlement as s, GenerationStreamFinalizedEvent as sn, AppRuntimeInvocationContext as sr, WorkContent as st, CohubHttpClient as t, buildSpaceInvitePath as tn, AppIdResolver as tr, AppViewSource as tt, AppCommerceProductResolveResponse as u, GenerationStreamOutOfSyncEvent as un, AppRuntimeShellContext as ur, WorkDetailResponse as ut, WorkCommerceOrder as v, SessionPatchApplyInput as vn, AppNavigationLaunch as vr, WorkPromotionProviderStatus as vt, UiCommand as w, SessionAccessApi as wn, PublicFileListEntry as wr, WorkResolveResponse as wt, CreateDesktopCommandInput as x, SessionPatchState as xn, AppNavigationTarget as xr, WorkPublicOwnerRecord as xt, WorkCommerceProductResolveResponse as y, SessionPatchApplyResult as yn, AppNavigationOpenMessage as yr, WorkPromotionRecord as yt, AppPresentationMeta as z, PromptsApi as zn, BoardClient as zt };
2465
+ export { AppTargetType as $, UnauthorizedContext as $n, WebSocketConnectionState as $t, WaitForUiCommandOptions as A, CreatePublicAssetUploadInput as An, PublicFileUploadPlanEntry as Ar, WorkVersionRecord as At, AppPresentationMeta as B, UploadPublicAssetInput as Bn, ModelStatusResponse as Br, BoardChangedEvent as Bt, DesktopCommandsApi as C, SessionPatchState as Cn, AppNavigationOpenResponse as Cr, WorkPublicSpaceRecord as Ct, UiCommandStatus as D, ReferenceResourceSelector as Dn, PublicFileListEntry as Dr, WorkStatus as Dt, UiCommandRecord as E, SessionAccessApi as En, PublicFileCreateUploadResponse as Er, WorkSessionResponse as Et, AppCreateInput as F, PublicAssetUploadProtocol as Fn, GenerationTaskResult as Fr, UsersApi as Ft, AppPromotionRecord as G, CronJobsApi as Gn, SessionEventName as Gt, AppPromotionEventResponse as H, PromptsApi as Hn, BoardEventName as Ht, AppDetailResponse as I, PublicAssetsApi as In, GenerationUsageBilling as Ir, UserApi as It, AppPublicSpaceRecord as J, Fetch as Jn, SpaceClient as Jt, AppPromotionStatsResponse as K, ChannelsApi as Kn, SessionSubscriptionHandlers as Kt, AppExtractedPageMeta as L, UploadAppSourceInput as Ln, ListGenerationModelsResponse as Lr, TaskWaitOptions as Lt, AppAuthorizeResponse as M, PublicAssetMimeType as Mn, SpaceStartupResponse as Mr, WorkViewStatsResponse as Mt, AppContent as N, PublicAssetPurpose as Nn, CreateGenerationTaskRequest as Nr, WorkVisibility as Nt, UiCommandsApi as O, ReferencesApi as On, PublicFileListResponse as Or, WorkTargetType as Ot, AppContentDownload as P, PublicAssetUploadProgress as Pn, CreateGenerationTaskResponse as Pr, ReferralsApi as Pt, AppStatus as Q, RawHttpResponse as Qn, SpacesApi as Qt, AppGetResponse as R, UploadChatAttachmentInput as Rn, PublicGenerationDeclaration as Rr, TasksApi as Rt, CreateUiCommandInput as S, SessionPatchReducer as Sn, AppNavigationOpenMessage as Sr, WorkPublicOwnerRecord as St, UiCommandError as T, createSessionPatchReducer as Tn, PublicFileCreateUploadInput as Tr, WorkResolveResponse as Tt, AppPromotionProvider as U, ModelsApi as Un, BoardPlaybackChangedEvent as Ut, AppPromotionCreateInput as V, SkillsApi as Vn, BoardClient as Vt, AppPromotionProviderStatus as W, GenerationsApi as Wn, BoardSubscriptionHandlers as Wt, AppResolveResponse as X, HttpTraceContext as Xn, SpacePublicFilesApi as Xt, AppRecord as Y, HttpError as Yn, SpaceEventName as Yt, AppSessionResponse as Z, HttpTransport as Zn, SpaceTurnListOptions as Zt, WorkCommerceEntitlementsResponse as _, SessionGenerationStreamClient as _n, createAppRuntime as _r, WorkPromotionEventResponse as _t, AppCommerceCreditConsumeResponse as a, AssistantMessageCommit as an, AppRuntimeApi as ar, AppVisibility as at, WorkCommercePurchaseResponse as b, SessionPatchApplyInput as bn, AppNavigationCall as br, WorkPromotionRecord as bt, AppCommerceEntitlementsResponse as c, GenerationStreamEvent as cn, AppRuntimeCheckoutStatus as cr, WorkContent as ct, AppCommercePurchaseResponse as d, GenerationStreamLifecycleEvent as dn, AppRuntimeModeConfig as dr, WorkDetailResponse as dt, BuildSpaceInvitePathInput as en, joinApiUrl as er, AppUpdateInput as et, WorkCommerceApi as f, GenerationStreamOutOfSyncEvent as fn, AppRuntimeRequestOptions as fr, WorkExtractedPageMeta as ft, WorkCommerceEntitlement as g, GenerationStreamTurnUpdatedEvent as gn, PopupBrokerTransport as gr, WorkPromotionCreateInput as gt, WorkCommerceCreditConsumeStatus as h, GenerationStreamSubscriptionHandlers as hn, ParentBridgeTransport as hr, WorkPresentationMeta as ht, AppCommerceCheckoutStatus as i, buildSpacePath as in, AppIdResolver as ir, AppViewerGrantRecord as it, AppActionRunResponse as j, CreatePublicAssetUploadResponse as jn, PublicFileUrlResponse as jr, WorkViewSource as jt, WaitForDesktopCommandOptions as k, SearchApi as kn, PublicFileUploadEntryInput as kr, WorkUpdateInput as kt, AppCommerceOrder as l, GenerationStreamFinalizedEvent as ln, AppRuntimeContext as lr, WorkContentDownload as lt, WorkCommerceCreditConsumeResponse as m, GenerationStreamSubscribeOptions as mn, AppRuntimeTransport as mr, WorkMeta as mt, createHttpClient as n, PublicInviteApi as nn, sanitizeAccessToken as nr, AppViewSource as nt, AppCommerceCreditConsumeStatus as o, GenerationStreamCommitEvent as on, AppRuntimeAuthorizationResult as or, AppsApi as ot, WorkCommerceCheckoutStatus as p, GenerationStreamStateEvent as pn, AppRuntimeShellContext as pr, WorkGetResponse as pt, AppPublicOwnerRecord as q, CohubClientOptions as qn, SpaceChannelBindingRecord as qt, AppCommerceApi as r, buildSpaceInvitePath as rn, AppContextChangedListener as rr, AppViewStatsResponse as rt, AppCommerceEntitlement as s, GenerationStreamErrorEvent as sn, AppRuntimeCheckoutState as sr, WorkAuthorizeResponse as st, CohubHttpClient as t, BuildSpacePathInput as tn, matchesUnauthorizedErrorToken as tr, AppVersionRecord as tt, AppCommerceProductResolveResponse as u, GenerationStreamIntermediateMessage as un, AppRuntimeInvocationContext as ur, WorkCreateInput as ut, WorkCommerceOrder as v, createSessionGenerationStreamClient as vn, createSlugAppIdResolver as vr, WorkPromotionProvider as vt, UiCommand as w, SessionPatchStatus as wn, AppNavigationTarget as wr, WorkRecord as wt, CreateDesktopCommandInput as x, SessionPatchApplyResult as xn, AppNavigationLaunch as xr, WorkPromotionStatsResponse as xt, WorkCommerceProductResolveResponse as y, parseAssistantMessageCommit as yn, resolveAppTransport as yr, WorkPromotionProviderStatus as yt, AppMeta as z, UploadChatImageAttachmentInput as zn, ModelStatusEntry as zr, BoardAwarenessUpdatedEvent as zt };
@@ -1,5 +1,5 @@
1
1
  import { D as getRealtimeSpaceRoom, E as getRealtimeBoardRoom, n as HttpTransport, t as HttpError, y as isUuid } from "./transport.js";
2
- import { a as resolveApiBaseUrl } from "./environment.js";
2
+ import { l as resolveExecutionToken, o as resolveApiBaseUrl } from "./environment.js";
3
3
  import { z } from "zod";
4
4
  //#region src/apis/channels.ts
5
5
  var ChannelsApi = class {
@@ -319,6 +319,18 @@ var PublicAssetsApi = class {
319
319
  return plan.asset;
320
320
  }
321
321
  /** Durable public upload for any chat attachment (image or file). No space required. */
322
+ uploadAppSource(input) {
323
+ return this.upload({
324
+ purpose: "app_source",
325
+ spaceId: input.spaceId,
326
+ sessionId: input.sessionId,
327
+ file: input.file,
328
+ mimeType: input.mimeType,
329
+ filename: input.filename,
330
+ onProgress: input.onProgress,
331
+ signal: input.signal
332
+ });
333
+ }
322
334
  uploadChatAttachment(input) {
323
335
  return this.upload({
324
336
  purpose: "chat_attachment",
@@ -3651,11 +3663,9 @@ var SpaceBoardsApi = class {
3651
3663
  });
3652
3664
  }
3653
3665
  authoring(boardId, input = {}, customFetch) {
3666
+ if (input.include?.length === 0) throw new Error("Board authoring include must not be empty.");
3654
3667
  const params = new URLSearchParams();
3655
- if (input.include) {
3656
- for (const section of input.include) params.append("include", section);
3657
- if (input.include.length === 0) params.set("include", "");
3658
- }
3668
+ for (const section of input.include ?? []) params.append("include", section);
3659
3669
  if (input.itemIds?.length) params.set("itemIds", input.itemIds.join(","));
3660
3670
  if (input.connectionIds?.length) params.set("connectionIds", input.connectionIds.join(","));
3661
3671
  if (input.effectIds?.length) params.set("effectIds", input.effectIds.join(","));
@@ -4049,13 +4059,118 @@ var SpaceClient = class {
4049
4059
  };
4050
4060
  //#endregion
4051
4061
  //#region src/apis/tasks.ts
4062
+ const isTerminal = (status) => status === "completed" || status === "failed";
4063
+ const MAX_WAIT_TIMEOUT_MS = 864e5;
4064
+ const MIN_POLL_INTERVAL_MS = 100;
4065
+ function validateWaitNumber(name, value, max) {
4066
+ if (!Number.isFinite(value) || value <= 0 || max !== void 0 && value > max) {
4067
+ const suffix = max === void 0 ? "greater than 0" : `greater than 0 and at most ${max}ms`;
4068
+ throw new RangeError(`${name} must be ${suffix}.`);
4069
+ }
4070
+ }
4052
4071
  var TasksApi = class {
4053
4072
  transport;
4054
- constructor(transport) {
4073
+ websocketClient;
4074
+ constructor(transport, websocketClient = null) {
4055
4075
  this.transport = transport;
4076
+ this.websocketClient = websocketClient;
4056
4077
  }
4057
- get(taskRunId) {
4058
- return this.transport.request(`/api/tasks/${taskRunId}`);
4078
+ get(taskRunId, options) {
4079
+ return this.transport.request(`/api/tasks/${taskRunId}`, { signal: options?.signal });
4080
+ }
4081
+ async wait(taskRunId, options = {}) {
4082
+ if (options.signal?.aborted) throw new DOMException("The task wait was aborted.", "AbortError");
4083
+ const timeoutMs = options.timeoutMs ?? 12e4;
4084
+ const pollIntervalMs = options.pollIntervalMs ?? 2e3;
4085
+ validateWaitNumber("timeoutMs", timeoutMs, MAX_WAIT_TIMEOUT_MS);
4086
+ validateWaitNumber("pollIntervalMs", pollIntervalMs);
4087
+ if (pollIntervalMs < MIN_POLL_INTERVAL_MS) throw new RangeError(`pollIntervalMs must be at least ${MIN_POLL_INTERVAL_MS}ms.`);
4088
+ const deadline = Date.now() + timeoutMs;
4089
+ const controller = new AbortController();
4090
+ let timedOut = false;
4091
+ let onTimeout = null;
4092
+ const abortFromCaller = () => controller.abort();
4093
+ const timeoutTimer = setTimeout(() => {
4094
+ timedOut = true;
4095
+ controller.abort();
4096
+ onTimeout?.();
4097
+ }, timeoutMs);
4098
+ options.signal?.addEventListener("abort", abortFromCaller, { once: true });
4099
+ let initial;
4100
+ try {
4101
+ initial = await this.get(taskRunId, { signal: controller.signal });
4102
+ } catch (error) {
4103
+ clearTimeout(timeoutTimer);
4104
+ options.signal?.removeEventListener("abort", abortFromCaller);
4105
+ if (timedOut) throw new Error(`Timed out waiting for task ${taskRunId}.`);
4106
+ if (options.signal?.aborted) throw new DOMException("The task wait was aborted.", "AbortError");
4107
+ throw error;
4108
+ }
4109
+ if (isTerminal(initial.run.status)) {
4110
+ clearTimeout(timeoutTimer);
4111
+ options.signal?.removeEventListener("abort", abortFromCaller);
4112
+ return initial.run;
4113
+ }
4114
+ if (options.signal?.aborted) {
4115
+ clearTimeout(timeoutTimer);
4116
+ options.signal?.removeEventListener("abort", abortFromCaller);
4117
+ throw new DOMException("The task wait was aborted.", "AbortError");
4118
+ }
4119
+ const spaceId = initial.run.spaceId;
4120
+ return new Promise((resolve, reject) => {
4121
+ let settled = false;
4122
+ let pollTimer = null;
4123
+ let releaseRoom = null;
4124
+ let unsubscribe = null;
4125
+ let inspectInFlight = false;
4126
+ const cleanup = () => {
4127
+ if (pollTimer) clearTimeout(pollTimer);
4128
+ clearTimeout(timeoutTimer);
4129
+ onTimeout = null;
4130
+ options.signal?.removeEventListener("abort", abortFromCaller);
4131
+ options.signal?.removeEventListener("abort", onAbort);
4132
+ unsubscribe?.();
4133
+ releaseRoom?.();
4134
+ };
4135
+ const finish = (callback) => {
4136
+ if (settled) return;
4137
+ settled = true;
4138
+ cleanup();
4139
+ callback();
4140
+ };
4141
+ const inspect = async () => {
4142
+ if (settled || inspectInFlight) return;
4143
+ inspectInFlight = true;
4144
+ try {
4145
+ const detail = await this.get(taskRunId, { signal: controller.signal });
4146
+ if (isTerminal(detail.run.status)) {
4147
+ finish(() => resolve(detail.run));
4148
+ return;
4149
+ }
4150
+ if (!settled) pollTimer = setTimeout(inspect, Math.max(0, Math.min(pollIntervalMs, deadline - Date.now())));
4151
+ } catch (error) {
4152
+ if (timedOut) finish(() => reject(/* @__PURE__ */ new Error(`Timed out waiting for task ${taskRunId}.`)));
4153
+ else if (options.signal?.aborted) finish(() => reject(new DOMException("The task wait was aborted.", "AbortError")));
4154
+ else finish(() => reject(error));
4155
+ } finally {
4156
+ inspectInFlight = false;
4157
+ }
4158
+ };
4159
+ const onEvent = (event) => {
4160
+ if (event.type !== "task.updated") return;
4161
+ if (event.payload.task?.id !== taskRunId) return;
4162
+ inspect();
4163
+ };
4164
+ const onAbort = () => finish(() => reject(new DOMException("The task wait was aborted.", "AbortError")));
4165
+ onTimeout = () => finish(() => reject(/* @__PURE__ */ new Error(`Timed out waiting for task ${taskRunId}.`)));
4166
+ options.signal?.addEventListener("abort", onAbort, { once: true });
4167
+ pollTimer = setTimeout(inspect, Math.max(0, Math.min(pollIntervalMs, deadline - Date.now())));
4168
+ if (this.websocketClient && spaceId) {
4169
+ ensureRealtimeConnected(this.websocketClient);
4170
+ releaseRoom = this.websocketClient.retainRooms([getRealtimeSpaceRoom(spaceId)]);
4171
+ unsubscribe = this.websocketClient.on("event", onEvent);
4172
+ }
4173
+ });
4059
4174
  }
4060
4175
  getMany(taskRunIds, options) {
4061
4176
  const ids = [...new Set(taskRunIds.filter(Boolean))];
@@ -4222,6 +4337,13 @@ var AppsApi = class {
4222
4337
  get(id) {
4223
4338
  return this.transport.request(`/api/apps/${id}`);
4224
4339
  }
4340
+ runAction(appId, action, input) {
4341
+ return this.transport.request(`/api/apps/${encodeURIComponent(appId)}/actions/${encodeURIComponent(action)}/run`, {
4342
+ method: "POST",
4343
+ headers: { "Content-Type": "application/json" },
4344
+ body: JSON.stringify({ input: input ?? null })
4345
+ });
4346
+ }
4225
4347
  /**
4226
4348
  * Loads a published app's metadata + owner info by id (public access model).
4227
4349
  * Used by the standalone app auth broker page.
@@ -4426,59 +4548,6 @@ var AppCommerceApi = class {
4426
4548
  /** @deprecated Use `AppCommerceApi`. */
4427
4549
  var WorkCommerceApi = class extends AppCommerceApi {};
4428
4550
  //#endregion
4429
- //#region src/types.ts
4430
- /**
4431
- * The full permission vocabulary, mirrored from `@cohub/core` permissions.
4432
- * Kept as a runtime constant so hosts can validate untrusted scopes from
4433
- * app iframes — TypeScript unions cannot constrain cross-window messages.
4434
- */
4435
- const PERMISSIONS = [
4436
- "space.view",
4437
- "space.edit",
4438
- "space.label.view",
4439
- "space.label.manage",
4440
- "space.label.assign",
4441
- "session.view",
4442
- "session.edit",
4443
- "session.prompt.readonly",
4444
- "session.prompt.fullaccess",
4445
- "generation.create",
4446
- "file.view",
4447
- "file.view.filtered",
4448
- "file.edit",
4449
- "checkpoint.view",
4450
- "checkpoint.edit",
4451
- "member.view",
4452
- "member.manage",
4453
- "references.view",
4454
- "channel.view",
4455
- "channel.manage",
4456
- "cronjob.view",
4457
- "cronjob.manage",
4458
- "taskrun.view",
4459
- "command.execute",
4460
- "sandbox.view",
4461
- "sandbox.manage",
4462
- "mod.view",
4463
- "mod.manage",
4464
- "space.commerce.view",
4465
- "space.commerce.manage",
4466
- "user.space.list",
4467
- "user.session.list",
4468
- "user.taskrun.list",
4469
- "user.usage.read"
4470
- ];
4471
- /** A held permission that already covers the checked one. */
4472
- const IMPLIED_PERMISSIONS = {
4473
- "session.prompt.readonly": ["session.prompt.fullaccess"],
4474
- "file.view.filtered": ["file.view"]
4475
- };
4476
- /** Implication-aware membership check, mirroring `@cohub/core`. */
4477
- function scopeListHasPermission(scopes, permission) {
4478
- if (scopes.includes(permission)) return true;
4479
- return (IMPLIED_PERMISSIONS[permission] ?? []).some((implies) => scopes.includes(implies));
4480
- }
4481
- //#endregion
4482
4551
  //#region src/http.ts
4483
4552
  var CohubHttpClient = class {
4484
4553
  spaces;
@@ -4515,7 +4584,12 @@ var CohubHttpClient = class {
4515
4584
  transport;
4516
4585
  constructor(options = {}) {
4517
4586
  const apiBaseUrl = resolveApiBaseUrl(options);
4518
- this.transport = new HttpTransport(options);
4587
+ const executionToken = resolveExecutionToken();
4588
+ const resolvedOptions = options.getAccessToken || !executionToken ? options : {
4589
+ ...options,
4590
+ getAccessToken: () => executionToken
4591
+ };
4592
+ this.transport = new HttpTransport(resolvedOptions);
4519
4593
  this.spaces = new SpacesApi(this.transport);
4520
4594
  this.channels = new ChannelsApi(this.transport);
4521
4595
  this.user = new UserApi(this.transport, apiBaseUrl, options.setStoredAuthToken, options.clearStoredAuthToken);
@@ -4542,4 +4616,4 @@ var CohubHttpClient = class {
4542
4616
  };
4543
4617
  const createHttpClient = (options) => new CohubHttpClient(options);
4544
4618
  //#endregion
4545
- export { BoardConnectionSchema as $, DESKTOP_COMMAND_PENDING_TTL_SECONDS as A, BoardItemPatchSchema as B, parseAssistantMessageCommit as C, DESKTOP_COMMAND_DEFAULT_TIMEOUT_MS as D, ensureRealtimeConnected as E, isTerminalDesktopCommandStatus as F, parseBoardEffectInput as G, BoardSemanticMutationSchema as H, parseDesktopCommand as I, BoardCompositionInputSchema as J, BOARD_ANIMATION_CHANNELS as K, parseDesktopCommandId as L, DESKTOP_COMMAND_TERMINAL_TTL_SECONDS as M, DESKTOP_COMMAND_VERSION as N, DESKTOP_COMMAND_MAX_TIMEOUT_MS as O, isDesktopCallMethod as P, parseBoardCompositionInput as Q, NAVIGATION_ERROR_MESSAGE_MAX_LENGTH as R, createSessionGenerationStreamClient as S, createSessionPatchReducer as T, BoardEffectInputSchema as U, BoardSemanticCommandSchema as V, BoardEffectSchema as W, BoardProceduralClipSchema as X, BoardCompositionSchema as Y, BoardTrackSchema as Z, SpacesApi as _, AppCommerceApi as a, SessionAccessApi as at, buildSpacePath as b, UiCommandsApi as c, PublicAssetsApi as ct, UsersApi as d, ModelsApi as dt, BOARD_ARROW_STROKE_SIZE as et, UserApi as f, GenerationsApi as ft, SpacePublicFilesApi as g, SpaceClient as h, scopeListHasPermission as i, DEFAULT_BOARD_RENDER_LIMITS as it, DESKTOP_COMMAND_SETTLEMENT_GRACE_SECONDS as j, DESKTOP_COMMAND_PAYLOAD_MAX_BYTES as k, AppsApi as l, SkillsApi as lt, BoardClient as m, ChannelsApi as mt, createHttpClient as n, BOARD_BUILTIN_CLIP_KINDS as nt, WorkCommerceApi as o, ReferencesApi as ot, TasksApi as p, CronJobsApi as pt, BOARD_ANIMATION_CHANNEL_CAPABILITIES as q, PERMISSIONS as r, BOARD_BUILTIN_EFFECT_KINDS as rt, DesktopCommandsApi as s, SearchApi as st, CohubHttpClient as t, BOARD_BUILTIN_CAPABILITIES as tt, ReferralsApi as u, PromptsApi as ut, PublicInviteApi as v, SessionPatchReducer as w, SessionGenerationStreamClient as x, buildSpaceInvitePath as y, BoardAuthoringItemSchema as z };
4619
+ export { BOARD_BUILTIN_CAPABILITIES as $, DESKTOP_COMMAND_TERMINAL_TTL_SECONDS as A, BoardSemanticMutationSchema as B, createSessionPatchReducer as C, DESKTOP_COMMAND_PAYLOAD_MAX_BYTES as D, DESKTOP_COMMAND_MAX_TIMEOUT_MS as E, parseDesktopCommandId as F, BOARD_ANIMATION_CHANNEL_CAPABILITIES as G, BoardEffectSchema as H, NAVIGATION_ERROR_MESSAGE_MAX_LENGTH as I, BoardProceduralClipSchema as J, BoardCompositionInputSchema as K, BoardAuthoringItemSchema as L, isDesktopCallMethod as M, isTerminalDesktopCommandStatus as N, DESKTOP_COMMAND_PENDING_TTL_SECONDS as O, parseDesktopCommand as P, BOARD_ARROW_STROKE_SIZE as Q, BoardItemPatchSchema as R, SessionPatchReducer as S, DESKTOP_COMMAND_DEFAULT_TIMEOUT_MS as T, parseBoardEffectInput as U, BoardEffectInputSchema as V, BOARD_ANIMATION_CHANNELS as W, parseBoardCompositionInput as X, BoardTrackSchema as Y, BoardConnectionSchema as Z, buildSpaceInvitePath as _, DesktopCommandsApi as a, SearchApi as at, createSessionGenerationStreamClient as b, ReferralsApi as c, PromptsApi as ct, TasksApi as d, CronJobsApi as dt, BOARD_BUILTIN_CLIP_KINDS as et, BoardClient as f, ChannelsApi as ft, PublicInviteApi as g, SpacesApi as h, WorkCommerceApi as i, ReferencesApi as it, DESKTOP_COMMAND_VERSION as j, DESKTOP_COMMAND_SETTLEMENT_GRACE_SECONDS as k, UsersApi as l, ModelsApi as lt, SpacePublicFilesApi as m, createHttpClient as n, DEFAULT_BOARD_RENDER_LIMITS as nt, UiCommandsApi as o, PublicAssetsApi as ot, SpaceClient as p, BoardCompositionSchema as q, AppCommerceApi as r, SessionAccessApi as rt, AppsApi as s, SkillsApi as st, CohubHttpClient as t, BOARD_BUILTIN_EFFECT_KINDS as tt, UserApi as u, GenerationsApi as ut, buildSpacePath as v, ensureRealtimeConnected as w, parseAssistantMessageCommit as x, SessionGenerationStreamClient as y, BoardSemanticCommandSchema as z };
@@ -1,4 +1,4 @@
1
- import { a as resolveApiBaseUrl } from "./environment.js";
1
+ import { o as resolveApiBaseUrl } from "./environment.js";
2
2
  //#region ../protocol/dist/realtime/types.js
3
3
  const WS_COMPACT_STREAM_CAPABILITY = "session.compact_stream.v1";
4
4
  const WS_ROOM_SUBSCRIPTION_CAPABILITY = "realtime.rooms.v1";
@@ -1,4 +1,4 @@
1
- import { n as CohubEnvironment } from "./environment.js";
1
+ import { r as CohubEnvironment } from "./environment.js";
2
2
  //#region src/voice-input.d.ts
3
3
  type VoiceInputEvent = {
4
4
  type: string;