@neta-art/cohub 8.9.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: {
@@ -17,17 +70,55 @@ const readProcessEnv = () => {
17
70
  const readRuntimeEnv = () => readProcessEnv()?.ENV;
18
71
  /** Existing scoped identity injected into Sandbox command processes. */
19
72
  const resolveExecutionToken = () => readProcessEnv()?.COHUB_EXECUTION_TOKEN?.trim() || null;
20
- function resolveExecutionAppId() {
21
- const payload = resolveExecutionToken()?.split(".")[1];
22
- if (!payload) return null;
73
+ function decodeExecutionPayload() {
74
+ const encoded = resolveExecutionToken()?.split(".")[1];
75
+ if (!encoded) return null;
23
76
  try {
24
- const base64 = payload.replaceAll("-", "+").replaceAll("_", "/").padEnd(Math.ceil(payload.length / 4) * 4, "=");
25
- const appId = JSON.parse(globalThis.atob(base64)).appId;
26
- return typeof appId === "string" && appId ? appId : null;
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;
27
80
  } catch {
28
81
  return null;
29
82
  }
30
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
+ }
31
122
  const resolveCohubEnvironment = (env) => {
32
123
  if (env) return env;
33
124
  return readRuntimeEnv() === "dev" ? "dev" : "prod";
@@ -56,4 +147,4 @@ const resolveVoiceInputWebsocketUrl = (options = {}) => {
56
147
  return COHUB_ENVIRONMENTS[resolveCohubEnvironment(options.env)].voiceInputWebsocketUrl;
57
148
  };
58
149
  //#endregion
59
- export { resolveApiBaseUrl as a, resolveExecutionToken as c, normalizeWebsocketUrl as i, resolveVoiceInputWebsocketUrl as l, normalizeBaseUrl as n, resolveCohubEnvironment as o, normalizeVoiceInputWebsocketUrl as r, resolveExecutionAppId as s, COHUB_ENVIRONMENTS as t, resolveWebsocketUrl as u };
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 CheckpointRecord, $n as SpaceEnvInput, $r as UserActivityResponse, $t as ReferenceAggregateGroupBy, Ar as SpaceModListItem, At as LabelResourceType, Bn as SpaceCommerceBuyerProfile, Bt as PatchResourceLabelsInput, Ca as NavigationLaunch, Cn as SessionTurnWindowResponse, Co as SessionTurnRecord, Cr as SpaceFsWriteFileInput, Da as BoardCapabilities, Do as TurnIntermediateMessagesFile, En as SkillCatalogResponse, Et as LabelItemsResponse, Fa as BoardPlaybackSnapshot, Fo as SpaceCompletionResult, Fr as SpacePublicProfile, Gn as SpaceCommerceProductBenefitBinding, Gt as PromptTemplateCatalogResponse, Ha as BoardAuthoringReadInput, Hr as SpaceTurnAuthorFilter, Ht as Permission, Io as SpaceCompletionStreamEvent, Ir as SpaceRecord, It as PaletteOverviewResponse, Ja as BoardSemanticMutation, Ji as BoardAwarenessUpdate, Jn as SpaceConfigInput, Jr as TaskRunDetailResponse, Jt as PublicUserPageResponse, Kr as SpaceUsageResponse, Kt as PublicReferral, La as BoardSummary, Lo as Usage, Lr as SpaceRole, Ma as BoardPlaybackCommand, Mi as BoardAwarenessUpdatedEvent$1, Mn as SpaceActivityResponse, Mr as SpacePendingDiffSummary, Ni as BoardChangedEvent$1, No as CreateSpaceCompletionInput, Nr as SpacePresenceSnapshot, Nt as MeResponse, Oa as BoardCreateInput, Or as SpaceMember, Ot as LabelListItem, Pi as BoardPlaybackChangedEvent$1, Pt as ModelCatalogEntry, Q as CheckpointDiffSummary, Qn as SpaceDefaultResponse, Rn as SpaceCheckpointDetailResponse, Ro as BillingPayload, Sa as NavigationCall, Sn as SessionTurnStreamSnapshotResponse, Sr as SpaceFsUploadResponse, Ti as GenerationModelDeclaration, To as StoredIntermediateMessage, Tr as SpaceInvitationListResponse, Tt as LabelAssignmentRecord, Ua as BoardAuthoringSnapshot, Un as SpaceCommerceOrder, Uo as RequestSource, Vr as SpaceSessionsResponse, Vt as PatchResourceLabelsResponse, W as Channel, Wi as SessionTurnPatchEvent, Wn as SpaceCommerceProduct, Xn as SpaceConfigUpdateResponse, Xr as UserActivityQuery, Yi as AppArtifactDescriptor, Yn as SpaceConfigResponse, Yr as TaskRunRecord, Zn as SpaceCreateResponse, _n as SessionMessagesResponse, _o as SpacePublicEndpoints, _t as GlobalSearchType, a as WebsocketClientOptions, at as CreateSpacePromptInput, bn as SessionTurnResponse, d as BatchUserProfilesResponse, da as DesktopCommand, dr as SpaceFsPreparingFile, dt as CursorPageInfo, ei as UserProfile, en as ReferenceAggregateResponse, er as SpaceFsCompleteUploadInput, et as ClaimReferralResponse, gn as SessionMessagesPaginatedResponse, ha as DesktopCommandStatus, hn as SessionMessageResponse, hr as SpaceFsTreeResponse, ht as GlobalSearchResponse, ii as UserSessionsResponse, in as ReferenceQueryableType, ir as SpaceFsCreateUploadResponse, ja as BoardMutationReceipt, jr as SpacePendingDiffFileResponse, kn as SpaceAccessPolicy, l as AcceptInvitationResponse, lr as SpaceFsFileResponse, lt as CronJobRecord, ma as DesktopCommandRecord, mr as SpaceFsReadFilesResponse, nn as ReferenceKind, nt as CreateInvitationResponse, oi as ChannelConfig, ot as CreateSpacePromptResponse, pa as DesktopCommandError, q as CheckpointDiffFileResponse, r as WebsocketClient, rn as ReferenceQueryResponse, rr as SpaceFsCreateUploadInput, rt as CreateSpaceInput, s as WebsocketEventPayload, si as ChannelHealth, sn as ReferralDashboard, st as CreateSpaceSessionInput, ta as AppContentKind, ti as UserRulesResponse, tn as ReferenceDirection, tr as SpaceFsCompleteUploadResponse, tt as CreateInvitationInput, ur as SpaceFsMoveInput, ut as CronJobUpdatePatch, vn as SessionRecord, vo as MessageRecord, wi as GenerationContentBlock, wn as SessionTurnsPaginatedResponse, wo as SpaceTurnsResponse, xn as SessionTurnSignedUrlsResponse, xo as MessageToolCallsFile, yn as SessionTurnIndexResponse, yo as SessionForkRecord, yt as InvitationDetail, zi as RealtimePatchOperation, zn as SpaceCommerceBenefit, zo as ContentBlock } 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<{
@@ -2451,4 +2462,4 @@ declare class CohubHttpClient {
2451
2462
  }
2452
2463
  declare const createHttpClient: (options?: CohubClientOptions) => CohubHttpClient;
2453
2464
  //#endregion
2454
- export { AppTargetType as $, matchesUnauthorizedErrorToken as $n, BuildSpaceInvitePathInput as $t, WaitForUiCommandOptions as A, CreatePublicAssetUploadResponse as An, SpaceStartupResponse as Ar, WorkVersionRecord as At, AppPresentationMeta as B, PromptsApi as Bn, BoardClient as Bt, DesktopCommandsApi as C, SessionPatchStatus as Cn, PublicFileCreateUploadInput as Cr, WorkPublicSpaceRecord as Ct, UiCommandStatus as D, ReferencesApi as Dn, PublicFileUploadEntryInput as Dr, WorkStatus as Dt, UiCommandRecord as E, ReferenceResourceSelector as En, PublicFileListResponse as Er, WorkSessionResponse as Et, AppCreateInput as F, PublicAssetsApi as Fn, ListGenerationModelsResponse as Fr, UsersApi as Ft, AppPromotionRecord as G, CohubClientOptions as Gn, SessionSubscriptionHandlers as Gt, AppPromotionEventResponse as H, GenerationsApi as Hn, BoardPlaybackChangedEvent as Ht, AppDetailResponse as I, UploadChatAttachmentInput as In, PublicGenerationDeclaration as Ir, UserApi as It, AppPublicSpaceRecord as J, HttpTraceContext as Jn, SpaceEventName as Jt, AppPromotionStatsResponse as K, Fetch as Kn, SpaceChannelBindingRecord as Kt, AppExtractedPageMeta as L, UploadChatImageAttachmentInput as Ln, ModelStatusEntry as Lr, TasksApi as Lt, AppAuthorizeResponse as M, PublicAssetPurpose as Mn, CreateGenerationTaskResponse as Mr, WorkViewStatsResponse as Mt, AppContent as N, PublicAssetUploadProgress as Nn, GenerationTaskResult as Nr, WorkVisibility as Nt, UiCommandsApi as O, SearchApi as On, PublicFileUploadPlanEntry as Or, WorkTargetType as Ot, AppContentDownload as P, PublicAssetUploadProtocol as Pn, GenerationUsageBilling as Pr, ReferralsApi as Pt, AppStatus as Q, joinApiUrl as Qn, WebSocketConnectionState as Qt, AppGetResponse as R, UploadPublicAssetInput as Rn, ModelStatusResponse as Rr, BoardAwarenessUpdatedEvent as Rt, CreateUiCommandInput as S, SessionPatchState as Sn, AppNavigationTarget as Sr, WorkPublicOwnerRecord as St, UiCommandError as T, SessionAccessApi as Tn, PublicFileListEntry as Tr, WorkResolveResponse as Tt, AppPromotionProvider as U, CronJobsApi as Un, BoardSubscriptionHandlers as Ut, AppPromotionCreateInput as V, ModelsApi as Vn, BoardEventName as Vt, AppPromotionProviderStatus as W, ChannelsApi as Wn, SessionEventName as Wt, AppResolveResponse as X, RawHttpResponse as Xn, SpaceTurnListOptions as Xt, AppRecord as Y, HttpTransport as Yn, SpacePublicFilesApi as Yt, AppSessionResponse as Z, UnauthorizedContext as Zn, SpacesApi as Zt, WorkCommerceEntitlementsResponse as _, createSessionGenerationStreamClient as _n, resolveAppTransport as _r, WorkPromotionEventResponse as _t, AppCommerceCreditConsumeResponse as a, GenerationStreamCommitEvent as an, AppRuntimeCheckoutState as ar, AppVisibility as at, WorkCommercePurchaseResponse as b, SessionPatchApplyResult as bn, AppNavigationOpenMessage as br, WorkPromotionRecord as bt, AppCommerceEntitlementsResponse as c, GenerationStreamFinalizedEvent as cn, AppRuntimeInvocationContext as cr, WorkContent as ct, AppCommercePurchaseResponse as d, GenerationStreamOutOfSyncEvent as dn, AppRuntimeShellContext as dr, WorkDetailResponse as dt, BuildSpacePathInput as en, sanitizeAccessToken as er, AppUpdateInput as et, WorkCommerceApi as f, GenerationStreamStateEvent as fn, AppRuntimeTransport as fr, WorkExtractedPageMeta as ft, WorkCommerceEntitlement as g, SessionGenerationStreamClient as gn, createSlugAppIdResolver as gr, WorkPromotionCreateInput as gt, WorkCommerceCreditConsumeStatus as h, GenerationStreamTurnUpdatedEvent as hn, createAppRuntime as hr, WorkPresentationMeta as ht, AppCommerceCheckoutStatus as i, AssistantMessageCommit as in, AppRuntimeAuthorizationResult as ir, AppViewerGrantRecord as it, AppActionRunResponse as j, PublicAssetMimeType as jn, CreateGenerationTaskRequest as jr, WorkViewSource as jt, WaitForDesktopCommandOptions as k, CreatePublicAssetUploadInput as kn, PublicFileUrlResponse as kr, WorkUpdateInput as kt, AppCommerceOrder as l, GenerationStreamIntermediateMessage as ln, AppRuntimeModeConfig as lr, WorkContentDownload as lt, WorkCommerceCreditConsumeResponse as m, GenerationStreamSubscriptionHandlers as mn, PopupBrokerTransport as mr, WorkMeta as mt, createHttpClient as n, buildSpaceInvitePath as nn, AppIdResolver as nr, AppViewSource as nt, AppCommerceCreditConsumeStatus as o, GenerationStreamErrorEvent as on, AppRuntimeCheckoutStatus as or, AppsApi as ot, WorkCommerceCheckoutStatus as p, GenerationStreamSubscribeOptions as pn, ParentBridgeTransport as pr, WorkGetResponse as pt, AppPublicOwnerRecord as q, HttpError as qn, SpaceClient as qt, AppCommerceApi as r, buildSpacePath as rn, AppRuntimeApi as rr, AppViewStatsResponse as rt, AppCommerceEntitlement as s, GenerationStreamEvent as sn, AppRuntimeContext as sr, WorkAuthorizeResponse as st, CohubHttpClient as t, PublicInviteApi as tn, AppContextChangedListener as tr, AppVersionRecord as tt, AppCommerceProductResolveResponse as u, GenerationStreamLifecycleEvent as un, AppRuntimeRequestOptions as ur, WorkCreateInput as ut, WorkCommerceOrder as v, parseAssistantMessageCommit as vn, AppNavigationCall as vr, WorkPromotionProvider as vt, UiCommand as w, createSessionPatchReducer as wn, PublicFileCreateUploadResponse as wr, WorkRecord as wt, CreateDesktopCommandInput as x, SessionPatchReducer as xn, AppNavigationOpenResponse as xr, WorkPromotionStatsResponse as xt, WorkCommerceProductResolveResponse as y, SessionPatchApplyInput as yn, AppNavigationLaunch as yr, WorkPromotionProviderStatus as yt, AppMeta as z, SkillsApi as zn, BoardChangedEvent 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, c as resolveExecutionToken } 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;
4077
+ }
4078
+ get(taskRunId, options) {
4079
+ return this.transport.request(`/api/tasks/${taskRunId}`, { signal: options?.signal });
4056
4080
  }
4057
- get(taskRunId) {
4058
- return this.transport.request(`/api/tasks/${taskRunId}`);
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))];
@@ -4433,59 +4548,6 @@ var AppCommerceApi = class {
4433
4548
  /** @deprecated Use `AppCommerceApi`. */
4434
4549
  var WorkCommerceApi = class extends AppCommerceApi {};
4435
4550
  //#endregion
4436
- //#region src/types.ts
4437
- /**
4438
- * The full permission vocabulary, mirrored from `@cohub/core` permissions.
4439
- * Kept as a runtime constant so hosts can validate untrusted scopes from
4440
- * app iframes — TypeScript unions cannot constrain cross-window messages.
4441
- */
4442
- const PERMISSIONS = [
4443
- "space.view",
4444
- "space.edit",
4445
- "space.label.view",
4446
- "space.label.manage",
4447
- "space.label.assign",
4448
- "session.view",
4449
- "session.edit",
4450
- "session.prompt.readonly",
4451
- "session.prompt.fullaccess",
4452
- "generation.create",
4453
- "file.view",
4454
- "file.view.filtered",
4455
- "file.edit",
4456
- "checkpoint.view",
4457
- "checkpoint.edit",
4458
- "member.view",
4459
- "member.manage",
4460
- "references.view",
4461
- "channel.view",
4462
- "channel.manage",
4463
- "cronjob.view",
4464
- "cronjob.manage",
4465
- "taskrun.view",
4466
- "command.execute",
4467
- "sandbox.view",
4468
- "sandbox.manage",
4469
- "mod.view",
4470
- "mod.manage",
4471
- "space.commerce.view",
4472
- "space.commerce.manage",
4473
- "user.space.list",
4474
- "user.session.list",
4475
- "user.taskrun.list",
4476
- "user.usage.read"
4477
- ];
4478
- /** A held permission that already covers the checked one. */
4479
- const IMPLIED_PERMISSIONS = {
4480
- "session.prompt.readonly": ["session.prompt.fullaccess"],
4481
- "file.view.filtered": ["file.view"]
4482
- };
4483
- /** Implication-aware membership check, mirroring `@cohub/core`. */
4484
- function scopeListHasPermission(scopes, permission) {
4485
- if (scopes.includes(permission)) return true;
4486
- return (IMPLIED_PERMISSIONS[permission] ?? []).some((implies) => scopes.includes(implies));
4487
- }
4488
- //#endregion
4489
4551
  //#region src/http.ts
4490
4552
  var CohubHttpClient = class {
4491
4553
  spaces;
@@ -4554,4 +4616,4 @@ var CohubHttpClient = class {
4554
4616
  };
4555
4617
  const createHttpClient = (options) => new CohubHttpClient(options);
4556
4618
  //#endregion
4557
- 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;