@neta-art/cohub 2.6.0 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -88,3 +88,56 @@ const stop = session.subscribe({
88
88
 
89
89
  stop();
90
90
  ```
91
+
92
+ ## Works and the Work runtime
93
+
94
+ A **Work** is a published, shareable web page hosted by Cohub. When a viewer
95
+ opens a Work, it runs inside a Cohub-managed runtime that provides short-lived
96
+ access tokens — no API keys required.
97
+
98
+ Three runtime-only APIs are available **exclusively inside a published Work**:
99
+
100
+ - `client.context()` — returns Work identity, Space identity, and current
101
+ permission scopes. Returns `null` outside a Work runtime.
102
+ - `client.auth.request({ scopes, reason })` — shows the viewer a consent dialog
103
+ and caches a token with the approved scopes.
104
+ - `client.work.commerce.*` — entitlement checks, credit consumption,
105
+ purchases.
106
+
107
+ ### Quick start (inside a Work)
108
+
109
+ ```ts
110
+ // Browsers don't inject ENV — pass it explicitly.
111
+ const client = createCohubClient({ env: "prod" });
112
+
113
+ const ctx = await client.context();
114
+ if (!ctx?.space?.id) throw new Error("Not inside a published Work.");
115
+
116
+ const space = client.space(ctx.space.id);
117
+
118
+ // Request viewer scopes from a user gesture (button click)
119
+ await client.auth.request({
120
+ scopes: ["session.prompt.fullaccess", "generation.create"],
121
+ reason: "This Work needs to send prompts and generate images.",
122
+ });
123
+ ```
124
+
125
+ ### The scope model (critical)
126
+
127
+ Work permissions come in **two disjoint sets**:
128
+
129
+ - **Work scopes** (read, no consent): `space.view`, `session.view`,
130
+ `file.view`, `taskrun.view` — granted at publish time.
131
+ - **Viewer scopes** (action, consent-required): `session.prompt.fullaccess`,
132
+ `generation.create`, `user.space.list`, `user.session.list`,
133
+ `user.usage.read` — approved per-viewer via `auth.request()`.
134
+
135
+ > **Read operations need work scopes. Action operations need viewer scopes.
136
+ They never substitute for each other.** For example, `session.prompt.fullaccess`
137
+ lets you send a prompt but does NOT let you read the reply — that needs
138
+ `session.view` (a work scope). Similarly, `generation.create` lets you create
139
+ a generation task, but polling its result needs `taskrun.view` (a work scope).
140
+
141
+ For the complete API-to-scope mapping, initialization recipe, capability
142
+ recipes, a full working example, and a pitfalls checklist, see the
143
+ **[Work Runtime Guide](./docs/work-runtime-guide.md)**.
@@ -731,9 +731,15 @@ type SpaceSandboxAutoDestroyPolicy = {
731
731
  mode: "never";
732
732
  };
733
733
  type SpaceSandboxProvider = "cloud" | "local";
734
+ type SandboxSpecId = "standard" | "boost" | "ultra";
734
735
  type SpaceSandboxConfig = {
735
736
  provider?: SpaceSandboxProvider;
736
737
  autoDestroy: SpaceSandboxAutoDestroyPolicy;
738
+ spec?: SandboxSpecId;
739
+ appliedSpec?: SandboxSpecId | null;
740
+ specPendingRestart?: boolean;
741
+ allowedSpec?: SandboxSpecId;
742
+ specs?: Record<string, unknown>;
737
743
  };
738
744
  type SpaceConfig = {
739
745
  sandbox?: SpaceSandboxConfig;
@@ -786,6 +792,7 @@ type SpaceConfigInput = {
786
792
  sandbox?: {
787
793
  provider?: SpaceSandboxProvider;
788
794
  autoDestroy?: SpaceSandboxAutoDestroyPolicy;
795
+ spec?: SandboxSpecId;
789
796
  };
790
797
  };
791
798
  type CreateSpaceModInput = {
@@ -808,6 +815,17 @@ type CreateSpaceInput = {
808
815
  type SpaceConfigResponse = {
809
816
  config: Required<Pick<SpaceConfig, "sandbox">>;
810
817
  };
818
+ type SpaceConfigUpdateResponse = {
819
+ space: SpaceRecord;
820
+ sandbox?: {
821
+ resized?: boolean;
822
+ applying?: boolean;
823
+ pendingRestart?: boolean;
824
+ appliedSpec?: SandboxSpecId;
825
+ skipped?: boolean;
826
+ message?: string;
827
+ };
828
+ };
811
829
  type CanvasDocumentRecord = {
812
830
  id: string;
813
831
  spaceId: string;
@@ -2550,9 +2568,7 @@ declare class SpaceClient {
2550
2568
  command: string;
2551
2569
  }): Promise<SpaceRunCommandResponse>;
2552
2570
  getConfig(): Promise<SpaceConfigResponse>;
2553
- updateConfig(input: SpaceConfigInput): Promise<{
2554
- space: SpaceRecord;
2555
- }>;
2571
+ updateConfig(input: SpaceConfigInput): Promise<SpaceConfigUpdateResponse>;
2556
2572
  session(sessionId: string): SessionClient;
2557
2573
  updatePresence(meta?: Record<string, unknown> | null): Promise<void>;
2558
2574
  subscribe(handler: (event: WebsocketEventPayload) => void): () => void;
@@ -2838,4 +2854,4 @@ declare class CohubHttpClient {
2838
2854
  }
2839
2855
  declare const createHttpClient: (options?: CohubClientOptions) => CohubHttpClient;
2840
2856
  //#endregion
2841
- export { parseAssistantMessageCommit as $, GenerationContentBlock as $i, PatchResourceLabelsInput as $n, SpaceFsFileKind as $r, BillingCreditStatus as $t, TasksApi as A, SpaceUsageResponse as Ai, CronJobRecord as An, SpaceBootstrapSource as Ar, WorkRuntimeCheckoutState as At, GenerationStreamCommitEvent as B, PublicGenerationDeclaration as Bi, JsonObject as Bn, SpaceCommerceProductCreditBenefit as Br, BatchUserProfilesResponse as Bt, WorkStatus as C, SpaceRecord as Ci, CreateInvitationResponse as Cn, SessionTurnResponse as Cr, Fetch as Ct, WorkVisibility as D, SpaceSandboxProvider as Di, CreateSpacePromptResponse as Dn, SessionTurnsPaginatedResponse as Dr, ParentBridgeTransport as Dt, WorkVersionRecord as E, SpaceSandboxConfig as Ei, CreateSpacePromptInput as En, SessionTurnWindowResponse as Er, RawHttpResponse as Et, SpaceEventName as F, UserRulesResponse as Fi, ExploreSpacesResponse as Fn, SpaceCommerceCreditsBenefit as Fr, WorkRuntimeTransport as Ft, GenerationStreamLifecycleEvent as G, assertGenerationRequestAllowedByPolicy as Gi, LabelAssignmentRecord as Gn, SpaceDefaultResponse as Gr, BillingBalanceActivityStatus as Gt, GenerationStreamEvent as H, GenerationParameterConstraint as Hi, JsonValue as Hn, SpaceConfigInput as Hr, BillingBalanceActivity as Ht, SpacesApi as I, CreateGenerationTaskRequest as Ii, GlobalSearchResponse as In, SpaceCommerceFeatureBenefit as Ir, createWorkRuntime as It, GenerationStreamSubscribeOptions as J, filterGenerationDeclarationsByPolicy as Ji, LabelResourceType as Jn, SpaceFsCompleteUploadResponse as Jr, BillingCheckoutActionState as Jt, GenerationStreamOutOfSyncEvent as K, decodeGenerationPolicy as Ki, LabelListItem as Kn, SpaceEnvInput as Kr, BillingCatalog as Kt, WebSocketConnectionState as L, CreateGenerationTaskResponse as Li, GlobalSearchResult as Ln, SpaceCommerceOrder as Lr, resolveWorkTransport as Lt, SessionSubscriptionHandlers as M, TaskRunDetailResponse as Mi, CursorPageInfo as Mn, SpaceCheckpointDetailResponse as Mr, WorkRuntimeContext as Mt, SpaceChannelBindingRecord as N, TaskRunRecord as Ni, ExploreSection as Nn, SpaceCommerceBenefit as Nr, WorkRuntimeModeConfig as Nt, WorksApi as O, SpaceSessionsResponse as Oi, CreateSpaceSessionInput as On, SpaceAccess as Or, PopupBrokerTransport as Ot, SpaceClient as P, UserProfile as Pi, ExploreSpaceItem as Pn, SpaceCommerceBuyerProfile as Pr, WorkRuntimeRequestOptions as Pt, createSessionGenerationStreamClient as Q, parseGenerationPolicyFromEnv as Qi, ModelCatalogEntry as Qn, SpaceFsEntry as Qr, BillingCreditGrantStatus as Qt, PublicInviteApi as R, GenerationTaskResult as Ri, GlobalSearchType as Rn, SpaceCommerceProduct as Rr, AcceptInvitationResponse as Rt, WorkSessionResponse as S, SpacePublicProfile as Si, CreateInvitationInput as Sn, SessionTurnIndexResponse as Sr, CohubClientOptions as St, WorkUpdateInput as T, SpaceSandboxAutoDestroyPolicy as Ti, CreateSpaceModInput as Tn, SessionTurnStreamSnapshotResponse as Tr, HttpTransport as Tt, GenerationStreamFinalizedEvent as U, GenerationPolicy as Ui, LabelAssignmentListItem as Un, SpaceConfigResponse as Ur, BillingBalanceActivityKind as Ut, GenerationStreamErrorEvent as V, GenerationModelPolicy as Vi, JsonPrimitive as Vn, SpaceConfig as Vr, BillingAccessWarning as Vt, GenerationStreamIntermediateMessage as W, GenerationPolicyError as Wi, LabelAssignmentPageInfo as Wn, SpaceCreateResponse as Wr, BillingBalanceActivityList as Wt, GenerationStreamTurnUpdatedEvent as X, getAllowedGenerationModelIds as Xi, LabelSource as Xn, SpaceFsCreateUploadResponse as Xr, BillingConversionIntent as Xt, GenerationStreamSubscriptionHandlers as Y, findGenerationModelPolicy as Yi, LabelScopeType as Yn, SpaceFsCreateUploadInput as Yr, BillingCheckoutResult as Yt, SessionGenerationStreamClient as Z, normalizeGenerationPolicy as Zi, MeResponse as Zn, SpaceFsEncoding as Zr, BillingCreditExpiryGroup as Zt, WorkPresentationMeta as _, SpaceMember as _i, CanvasNodeRecord as _n, SessionBindingRecord as _r, PromptsApi as _t, WorkCommerceCreditConsumeResponse as a, SpaceFsReadFilesResponse as ai, BillingProductCreditBenefit as an, PublicUserProfile as ar, createSessionPatchReducer as at, WorkRecord as b, SpacePresenceSnapshot as bi, Channel as bn, SessionMessagesResponse as br, CronJobsApi as bt, WorkCommerceEntitlementsResponse as c, SpaceFsUploadEntry as ci, BillingProductPricing as cn, ReferenceAggregateResponse as cr, ReferencesApi as ct, WorkCommercePurchaseResponse as d, SpaceFsUploadPlanEntryInput as di, BillingSubscriptionHistoryStatus as dn, ReferenceQueryResponse as dr, CreatePublicAssetUploadResponse as dt, ChannelConfig as ea, SpaceFsFileResponse as ei, BillingCreditUnit as en, PatchResourceLabelsResponse as er, SessionPatchApplyInput as et, WorkAuthorizeResponse as f, SpaceFsUploadProgress as fi, BillingSubscriptionSummary as fn, ReferenceQueryableType as fr, PublicAssetMimeType as ft, WorkMeta as g, SpaceListItem as gi, CanvasNodeInput as gn, SendMessageCronJobPayload as gr, UploadPublicAssetInput as gt, WorkGetResponse as h, SpaceInvitation as hi, CanvasDocumentRecord as hn, ResourceLabelsResponse as hr, UploadChatImageAttachmentInput as ht, WorkCommerceCheckoutStatus as i, SpaceFsReadFilesInput as ii, BillingProductBillingInterval as in, PromptTemplateCatalogResponse as ir, SessionPatchStatus as it, SessionEventName as j, SpaceUsageSummary as ji, CronJobUpdatePatch as jn, SpaceChannelBindingInput as jr, WorkRuntimeCheckoutStatus as jt, UserApi as k, SpaceUsageHourlyStat as ki, CronJobPayload as kn, SpaceAccessPolicy as kr, WorkRuntimeApi as kt, WorkCommerceOrder as l, SpaceFsUploadError as li, BillingRedemptionResult as ln, ReferenceDirection as lr, SearchApi as lt, WorkDetailResponse as m, SpaceFsWriteFileInput as mi, CanvasCreateInput as mn, ReferenceResourceType as mr, PublicAssetsApi as mt, createHttpClient as n, SpaceFsPreparingFile as ni, BillingPaymentStatus as nn, PromptAccessMode as nr, SessionPatchReducer as nt, WorkCommerceCreditConsumeStatus as o, SpaceFsTreeResponse as oi, BillingProductDisplay as on, ReferenceAggregateGroup as or, SessionAccessApi as ot, WorkCreateInput as p, SpaceFsUploadResponse as pi, CanvasBootstrapResponse as pn, ReferenceRecord as pr, PublicAssetPurpose as pt, GenerationStreamStateEvent as q, encodeGenerationPolicy as qi, LabelRecord as qn, SpaceFsCompleteUploadInput as qr, BillingCatalogProduct as qt, WorkCommerceApi as r, SpaceFsReadFilesError as ri, BillingPluginStatus as rn, PromptTemplateCatalogEntry as rr, SessionPatchState as rt, WorkCommerceEntitlement as s, SpaceFsUploadDestination as si, BillingProductKind as sn, ReferenceAggregateGroupBy as sr, ReferenceResourceSelector as st, CohubHttpClient as t, DiscordChannelConfig as ta, SpaceFsMoveInput as ti, BillingHistoryPagination as tn, Permission as tr, SessionPatchApplyResult as tt, WorkCommerceProductResolveResponse as u, SpaceFsUploadPlanEntry as ui, BillingSubscriptionHistoryList as un, ReferenceKind as ur, CreatePublicAssetUploadInput as ut, WorkPublicOwnerRecord as v, SpaceMeta as vi, CanvasSemanticOp as vn, SessionMessageResponse as vr, ModelsApi as vt, WorkTargetType as w, SpaceRole as wi, CreateSpaceInput as wn, SessionTurnSignedUrlsResponse as wr, HttpError as wt, WorkResolveResponse as x, SpacePresenceUser as xi, CheckpointRecord as xn, SessionRecord as xr, ChannelsApi as xt, WorkPublicSpaceRecord as y, SpaceModListItem as yi, CanvasTransactionInput as yn, SessionMessagesPaginatedResponse as yr, GenerationsApi as yt, AssistantMessageCommit as z, ListGenerationModelsResponse as zi, InvitationDetail as zn, SpaceCommerceProductBenefitBinding as zr, ApiError as zt };
2857
+ export { parseAssistantMessageCommit as $, normalizeGenerationPolicy as $i, PatchResourceLabelsInput as $n, SpaceFsEncoding as $r, BillingCreditStatus as $t, TasksApi as A, SpaceSessionsResponse as Ai, CronJobRecord as An, SpaceAccessPolicy as Ar, WorkRuntimeCheckoutState as At, GenerationStreamCommitEvent as B, GenerationTaskResult as Bi, JsonObject as Bn, SpaceCommerceProductBenefitBinding as Br, BatchUserProfilesResponse as Bt, WorkStatus as C, SpacePresenceUser as Ci, CreateInvitationResponse as Cn, SessionTurnIndexResponse as Cr, Fetch as Ct, WorkVisibility as D, SpaceSandboxAutoDestroyPolicy as Di, CreateSpacePromptResponse as Dn, SessionTurnWindowResponse as Dr, ParentBridgeTransport as Dt, WorkVersionRecord as E, SpaceRole as Ei, CreateSpacePromptInput as En, SessionTurnStreamSnapshotResponse as Er, RawHttpResponse as Et, SpaceEventName as F, TaskRunRecord as Fi, ExploreSpacesResponse as Fn, SpaceCommerceBuyerProfile as Fr, WorkRuntimeTransport as Ft, GenerationStreamLifecycleEvent as G, GenerationPolicy as Gi, LabelAssignmentRecord as Gn, SpaceConfigUpdateResponse as Gr, BillingBalanceActivityStatus as Gt, GenerationStreamEvent as H, PublicGenerationDeclaration as Hi, JsonValue as Hn, SpaceConfig as Hr, BillingBalanceActivity as Ht, SpacesApi as I, UserProfile as Ii, GlobalSearchResponse as In, SpaceCommerceCreditsBenefit as Ir, createWorkRuntime as It, GenerationStreamSubscribeOptions as J, decodeGenerationPolicy as Ji, LabelResourceType as Jn, SpaceEnvInput as Jr, BillingCheckoutActionState as Jt, GenerationStreamOutOfSyncEvent as K, GenerationPolicyError as Ki, LabelListItem as Kn, SpaceCreateResponse as Kr, BillingCatalog as Kt, WebSocketConnectionState as L, UserRulesResponse as Li, GlobalSearchResult as Ln, SpaceCommerceFeatureBenefit as Lr, resolveWorkTransport as Lt, SessionSubscriptionHandlers as M, SpaceUsageResponse as Mi, CursorPageInfo as Mn, SpaceChannelBindingInput as Mr, WorkRuntimeContext as Mt, SpaceChannelBindingRecord as N, SpaceUsageSummary as Ni, ExploreSection as Nn, SpaceCheckpointDetailResponse as Nr, WorkRuntimeModeConfig as Nt, WorksApi as O, SpaceSandboxConfig as Oi, CreateSpaceSessionInput as On, SessionTurnsPaginatedResponse as Or, PopupBrokerTransport as Ot, SpaceClient as P, TaskRunDetailResponse as Pi, ExploreSpaceItem as Pn, SpaceCommerceBenefit as Pr, WorkRuntimeRequestOptions as Pt, createSessionGenerationStreamClient as Q, getAllowedGenerationModelIds as Qi, ModelCatalogEntry as Qn, SpaceFsCreateUploadResponse as Qr, BillingCreditGrantStatus as Qt, PublicInviteApi as R, CreateGenerationTaskRequest as Ri, GlobalSearchType as Rn, SpaceCommerceOrder as Rr, AcceptInvitationResponse as Rt, WorkSessionResponse as S, SpacePresenceSnapshot as Si, CreateInvitationInput as Sn, SessionRecord as Sr, CohubClientOptions as St, WorkUpdateInput as T, SpaceRecord as Ti, CreateSpaceModInput as Tn, SessionTurnSignedUrlsResponse as Tr, HttpTransport as Tt, GenerationStreamFinalizedEvent as U, GenerationModelPolicy as Ui, LabelAssignmentListItem as Un, SpaceConfigInput as Ur, BillingBalanceActivityKind as Ut, GenerationStreamErrorEvent as V, ListGenerationModelsResponse as Vi, JsonPrimitive as Vn, SpaceCommerceProductCreditBenefit as Vr, BillingAccessWarning as Vt, GenerationStreamIntermediateMessage as W, GenerationParameterConstraint as Wi, LabelAssignmentPageInfo as Wn, SpaceConfigResponse as Wr, BillingBalanceActivityList as Wt, GenerationStreamTurnUpdatedEvent as X, filterGenerationDeclarationsByPolicy as Xi, LabelSource as Xn, SpaceFsCompleteUploadResponse as Xr, BillingConversionIntent as Xt, GenerationStreamSubscriptionHandlers as Y, encodeGenerationPolicy as Yi, LabelScopeType as Yn, SpaceFsCompleteUploadInput as Yr, BillingCheckoutResult as Yt, SessionGenerationStreamClient as Z, findGenerationModelPolicy as Zi, MeResponse as Zn, SpaceFsCreateUploadInput as Zr, BillingCreditExpiryGroup as Zt, WorkPresentationMeta as _, SpaceInvitation as _i, CanvasNodeRecord as _n, SendMessageCronJobPayload as _r, PromptsApi as _t, WorkCommerceCreditConsumeResponse as a, SpaceFsReadFilesError as ai, BillingProductCreditBenefit as an, PublicUserProfile as ar, createSessionPatchReducer as at, WorkRecord as b, SpaceMeta as bi, Channel as bn, SessionMessagesPaginatedResponse as br, CronJobsApi as bt, WorkCommerceEntitlementsResponse as c, SpaceFsTreeResponse as ci, BillingProductPricing as cn, ReferenceAggregateResponse as cr, ReferencesApi as ct, WorkCommercePurchaseResponse as d, SpaceFsUploadError as di, BillingSubscriptionHistoryStatus as dn, ReferenceQueryResponse as dr, CreatePublicAssetUploadResponse as dt, parseGenerationPolicyFromEnv as ea, SpaceFsEntry as ei, BillingCreditUnit as en, PatchResourceLabelsResponse as er, SessionPatchApplyInput as et, WorkAuthorizeResponse as f, SpaceFsUploadPlanEntry as fi, BillingSubscriptionSummary as fn, ReferenceQueryableType as fr, PublicAssetMimeType as ft, WorkMeta as g, SpaceFsWriteFileInput as gi, CanvasNodeInput as gn, SandboxSpecId as gr, UploadPublicAssetInput as gt, WorkGetResponse as h, SpaceFsUploadResponse as hi, CanvasDocumentRecord as hn, ResourceLabelsResponse as hr, UploadChatImageAttachmentInput as ht, WorkCommerceCheckoutStatus as i, SpaceFsPreparingFile as ii, BillingProductBillingInterval as in, PromptTemplateCatalogResponse as ir, SessionPatchStatus as it, SessionEventName as j, SpaceUsageHourlyStat as ji, CronJobUpdatePatch as jn, SpaceBootstrapSource as jr, WorkRuntimeCheckoutStatus as jt, UserApi as k, SpaceSandboxProvider as ki, CronJobPayload as kn, SpaceAccess as kr, WorkRuntimeApi as kt, WorkCommerceOrder as l, SpaceFsUploadDestination as li, BillingRedemptionResult as ln, ReferenceDirection as lr, SearchApi as lt, WorkDetailResponse as m, SpaceFsUploadProgress as mi, CanvasCreateInput as mn, ReferenceResourceType as mr, PublicAssetsApi as mt, createHttpClient as n, ChannelConfig as na, SpaceFsFileResponse as ni, BillingPaymentStatus as nn, PromptAccessMode as nr, SessionPatchReducer as nt, WorkCommerceCreditConsumeStatus as o, SpaceFsReadFilesInput as oi, BillingProductDisplay as on, ReferenceAggregateGroup as or, SessionAccessApi as ot, WorkCreateInput as p, SpaceFsUploadPlanEntryInput as pi, CanvasBootstrapResponse as pn, ReferenceRecord as pr, PublicAssetPurpose as pt, GenerationStreamStateEvent as q, assertGenerationRequestAllowedByPolicy as qi, LabelRecord as qn, SpaceDefaultResponse as qr, BillingCatalogProduct as qt, WorkCommerceApi as r, DiscordChannelConfig as ra, SpaceFsMoveInput as ri, BillingPluginStatus as rn, PromptTemplateCatalogEntry as rr, SessionPatchState as rt, WorkCommerceEntitlement as s, SpaceFsReadFilesResponse as si, BillingProductKind as sn, ReferenceAggregateGroupBy as sr, ReferenceResourceSelector as st, CohubHttpClient as t, GenerationContentBlock as ta, SpaceFsFileKind as ti, BillingHistoryPagination as tn, Permission as tr, SessionPatchApplyResult as tt, WorkCommerceProductResolveResponse as u, SpaceFsUploadEntry as ui, BillingSubscriptionHistoryList as un, ReferenceKind as ur, CreatePublicAssetUploadInput as ut, WorkPublicOwnerRecord as v, SpaceListItem as vi, CanvasSemanticOp as vn, SessionBindingRecord as vr, ModelsApi as vt, WorkTargetType as w, SpacePublicProfile as wi, CreateSpaceInput as wn, SessionTurnResponse as wr, HttpError as wt, WorkResolveResponse as x, SpaceModListItem as xi, CheckpointRecord as xn, SessionMessagesResponse as xr, ChannelsApi as xt, WorkPublicSpaceRecord as y, SpaceMember as yi, CanvasTransactionInput as yn, SessionMessageResponse as yr, GenerationsApi as yt, AssistantMessageCommit as z, CreateGenerationTaskResponse as zi, InvitationDetail as zn, SpaceCommerceProduct as zr, ApiError as zt };
@@ -2613,4 +2613,4 @@ var CohubHttpClient = class {
2613
2613
  };
2614
2614
  const createHttpClient = (options) => new CohubHttpClient(options);
2615
2615
  //#endregion
2616
- export { GenerationsApi as C, ModelsApi as S, ChannelsApi as T, SessionAccessApi as _, UserApi as a, PublicAssetsApi as b, SpacesApi as c, createSessionGenerationStreamClient as d, parseAssistantMessageCommit as f, HttpTransport as g, HttpError as h, WorksApi as i, PublicInviteApi as l, createSessionPatchReducer as m, createHttpClient as n, TasksApi as o, SessionPatchReducer as p, WorkCommerceApi as r, SpaceClient as s, CohubHttpClient as t, SessionGenerationStreamClient as u, ReferencesApi as v, CronJobsApi as w, PromptsApi as x, SearchApi as y };
2616
+ export { ModelsApi as C, ChannelsApi as E, PromptsApi as S, CronJobsApi as T, ensureRealtimeConnected as _, UserApi as a, SearchApi as b, SpacesApi as c, createSessionGenerationStreamClient as d, parseAssistantMessageCommit as f, HttpTransport as g, HttpError as h, WorksApi as i, PublicInviteApi as l, createSessionPatchReducer as m, createHttpClient as n, TasksApi as o, SessionPatchReducer as p, WorkCommerceApi as r, SpaceClient as s, CohubHttpClient as t, SessionGenerationStreamClient as u, SessionAccessApi as v, GenerationsApi as w, PublicAssetsApi as x, ReferencesApi as y };
@@ -545,6 +545,29 @@ type SessionTurnFinalizedEvent = {
545
545
  turn: RealtimeTurnRecord;
546
546
  };
547
547
  };
548
+ type SessionTurnNotifyEvent = {
549
+ id: string;
550
+ timestamp: number;
551
+ domain: "session";
552
+ type: "session.turn.notify";
553
+ requestId?: string | null;
554
+ spaceId: string;
555
+ sessionId: string;
556
+ payload: {
557
+ spaceId: string;
558
+ sessionId: string;
559
+ turnId: string;
560
+ status: SessionTurnRecord["status"];
561
+ finishReason?: SessionTurnSummary["finishReason"] | null;
562
+ userPreview: string | null;
563
+ durationMs: number | null;
564
+ stepCount: number | null;
565
+ sequence: number | null;
566
+ provider: string | null;
567
+ model: string | null;
568
+ completedAt: string | null;
569
+ };
570
+ };
548
571
  type SessionMessagePersistedEvent = {
549
572
  id: string;
550
573
  timestamp: number;
@@ -709,7 +732,7 @@ type LabelAssignmentsUpdatedEvent = {
709
732
  affectedLabelIds: string[];
710
733
  };
711
734
  };
712
- type RealtimeServerEvent = SystemReadyEvent | SystemAuthOkEvent | SystemRequestErrorEvent | SystemPongEvent | SystemAckOkEvent | SystemSubscribeOkEvent | SystemSubscribeErrorEvent | SessionCreatedEvent | SessionUpdatedEvent | SessionRequestAcceptedEvent | SessionRequestErrorEvent | SessionTurnCreatedEvent | SessionTurnPatchEvent | SessionTurnErrorEvent | SessionTurnLifecycleEvent | SessionTurnUpdatedEvent | SessionTurnFinalizedEvent | SessionMessagePersistedEvent | SpaceFsChangedEvent | SpacePortsChangedEvent | SpacePresenceUpdatedEvent | CanvasTransactionAppliedEvent | CanvasTransactionAckEvent | CanvasTransactionErrorEvent | TaskCreatedEvent | TaskUpdatedEvent | LabelAssignmentsUpdatedEvent;
735
+ type RealtimeServerEvent = SystemReadyEvent | SystemAuthOkEvent | SystemRequestErrorEvent | SystemPongEvent | SystemAckOkEvent | SystemSubscribeOkEvent | SystemSubscribeErrorEvent | SessionCreatedEvent | SessionUpdatedEvent | SessionRequestAcceptedEvent | SessionRequestErrorEvent | SessionTurnCreatedEvent | SessionTurnPatchEvent | SessionTurnErrorEvent | SessionTurnLifecycleEvent | SessionTurnUpdatedEvent | SessionTurnFinalizedEvent | SessionTurnNotifyEvent | SessionMessagePersistedEvent | SpaceFsChangedEvent | SpacePortsChangedEvent | SpacePresenceUpdatedEvent | CanvasTransactionAppliedEvent | CanvasTransactionAckEvent | CanvasTransactionErrorEvent | TaskCreatedEvent | TaskUpdatedEvent | LabelAssignmentsUpdatedEvent;
713
736
  //#endregion
714
737
  //#region src/websocket.d.ts
715
738
  type WebsocketEventPayload = ChannelEnvelope;
package/dist/http.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { C as ContentBlock, _ as SessionForkRecord, b as SessionTurnIndexItem, h as MessageRecord, x as SessionTurnRecord, y as SessionTurnSegmentRecord } from "./chunks/websocket.js";
2
- import { $i as GenerationContentBlock, $n as PatchResourceLabelsInput, $r as SpaceFsFileKind, $t as BillingCreditStatus, Ai as SpaceUsageResponse, An as CronJobRecord, Ar as SpaceBootstrapSource, Bi as PublicGenerationDeclaration, Bn as JsonObject, Br as SpaceCommerceProductCreditBenefit, Bt as BatchUserProfilesResponse, Ci as SpaceRecord, Cn as CreateInvitationResponse, Cr as SessionTurnResponse, Ct as Fetch, Di as SpaceSandboxProvider, Dn as CreateSpacePromptResponse, Dr as SessionTurnsPaginatedResponse, Ei as SpaceSandboxConfig, En as CreateSpacePromptInput, Er as SessionTurnWindowResponse, Fi as UserRulesResponse, Fn as ExploreSpacesResponse, Fr as SpaceCommerceCreditsBenefit, Gn as LabelAssignmentRecord, Gr as SpaceDefaultResponse, Gt as BillingBalanceActivityStatus, Hn as JsonValue, Hr as SpaceConfigInput, Ht as BillingBalanceActivity, Ii as CreateGenerationTaskRequest, In as GlobalSearchResponse, Ir as SpaceCommerceFeatureBenefit, Jn as LabelResourceType, Jr as SpaceFsCompleteUploadResponse, Jt as BillingCheckoutActionState, Kn as LabelListItem, Kr as SpaceEnvInput, Kt as BillingCatalog, Li as CreateGenerationTaskResponse, Ln as GlobalSearchResult, Lr as SpaceCommerceOrder, Mi as TaskRunDetailResponse, Mn as CursorPageInfo, Mr as SpaceCheckpointDetailResponse, Ni as TaskRunRecord, Nn as ExploreSection, Nr as SpaceCommerceBenefit, Oi as SpaceSessionsResponse, On as CreateSpaceSessionInput, Or as SpaceAccess, Pi as UserProfile, Pn as ExploreSpaceItem, Pr as SpaceCommerceBuyerProfile, Qn as ModelCatalogEntry, Qr as SpaceFsEntry, Qt as BillingCreditGrantStatus, Ri as GenerationTaskResult, Rn as GlobalSearchType, Rr as SpaceCommerceProduct, Rt as AcceptInvitationResponse, Si as SpacePublicProfile, Sn as CreateInvitationInput, Sr as SessionTurnIndexResponse, St as CohubClientOptions, Ti as SpaceSandboxAutoDestroyPolicy, Tn as CreateSpaceModInput, Tr as SessionTurnStreamSnapshotResponse, Tt as HttpTransport, Ui as GenerationPolicy, Un as LabelAssignmentListItem, Ur as SpaceConfigResponse, Ut as BillingBalanceActivityKind, Vn as JsonPrimitive, Vr as SpaceConfig, Vt as BillingAccessWarning, Wn as LabelAssignmentPageInfo, Wr as SpaceCreateResponse, Wt as BillingBalanceActivityList, Xn as LabelSource, Xr as SpaceFsCreateUploadResponse, Xt as BillingConversionIntent, Yn as LabelScopeType, Yr as SpaceFsCreateUploadInput, Yt as BillingCheckoutResult, Zn as MeResponse, Zr as SpaceFsEncoding, Zt as BillingCreditExpiryGroup, _i as SpaceMember, _n as CanvasNodeRecord, _r as SessionBindingRecord, ai as SpaceFsReadFilesResponse, an as BillingProductCreditBenefit, ar as PublicUserProfile, bi as SpacePresenceSnapshot, bn as Channel, br as SessionMessagesResponse, ci as SpaceFsUploadEntry, cn as BillingProductPricing, cr as ReferenceAggregateResponse, di as SpaceFsUploadPlanEntryInput, dn as BillingSubscriptionHistoryStatus, dr as ReferenceQueryResponse, ea as ChannelConfig, ei as SpaceFsFileResponse, en as BillingCreditUnit, er as PatchResourceLabelsResponse, fi as SpaceFsUploadProgress, fn as BillingSubscriptionSummary, fr as ReferenceQueryableType, gi as SpaceListItem, gn as CanvasNodeInput, gr as SendMessageCronJobPayload, hi as SpaceInvitation, hn as CanvasDocumentRecord, hr as ResourceLabelsResponse, ii as SpaceFsReadFilesInput, in as BillingProductBillingInterval, ir as PromptTemplateCatalogResponse, ji as SpaceUsageSummary, jn as CronJobUpdatePatch, jr as SpaceChannelBindingInput, ki as SpaceUsageHourlyStat, kn as CronJobPayload, kr as SpaceAccessPolicy, li as SpaceFsUploadError, ln as BillingRedemptionResult, lr as ReferenceDirection, mi as SpaceFsWriteFileInput, mn as CanvasCreateInput, mr as ReferenceResourceType, n as createHttpClient, ni as SpaceFsPreparingFile, nn as BillingPaymentStatus, nr as PromptAccessMode, oi as SpaceFsTreeResponse, on as BillingProductDisplay, or as ReferenceAggregateGroup, pi as SpaceFsUploadResponse, pn as CanvasBootstrapResponse, pr as ReferenceRecord, qn as LabelRecord, qr as SpaceFsCompleteUploadInput, qt as BillingCatalogProduct, ri as SpaceFsReadFilesError, rn as BillingPluginStatus, rr as PromptTemplateCatalogEntry, si as SpaceFsUploadDestination, sn as BillingProductKind, sr as ReferenceAggregateGroupBy, t as CohubHttpClient, ta as DiscordChannelConfig, ti as SpaceFsMoveInput, tn as BillingHistoryPagination, tr as Permission, ui as SpaceFsUploadPlanEntry, un as BillingSubscriptionHistoryList, ur as ReferenceKind, vi as SpaceMeta, vn as CanvasSemanticOp, vr as SessionMessageResponse, wi as SpaceRole, wn as CreateSpaceInput, wr as SessionTurnSignedUrlsResponse, wt as HttpError, xi as SpacePresenceUser, xn as CheckpointRecord, xr as SessionRecord, yi as SpaceModListItem, yn as CanvasTransactionInput, yr as SessionMessagesPaginatedResponse, zi as ListGenerationModelsResponse, zn as InvitationDetail, zr as SpaceCommerceProductBenefitBinding, zt as ApiError } from "./chunks/http.js";
3
- export { AcceptInvitationResponse, ApiError, BatchUserProfilesResponse, BillingAccessWarning, BillingBalanceActivity, BillingBalanceActivityKind, BillingBalanceActivityList, BillingBalanceActivityStatus, BillingCatalog, BillingCatalogProduct, BillingCheckoutActionState, BillingCheckoutResult, BillingConversionIntent, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingHistoryPagination, BillingPaymentStatus, BillingPluginStatus, BillingProductBillingInterval, BillingProductCreditBenefit, BillingProductDisplay, BillingProductKind, BillingProductPricing, BillingRedemptionResult, BillingSubscriptionHistoryList, BillingSubscriptionHistoryStatus, BillingSubscriptionSummary, CanvasBootstrapResponse, CanvasCreateInput, CanvasDocumentRecord, CanvasNodeInput, CanvasNodeRecord, CanvasSemanticOp, CanvasTransactionInput, Channel, type ChannelConfig, CheckpointRecord, type CohubClientOptions, CohubHttpClient, type ContentBlock, type CreateGenerationTaskRequest, type CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CreateSpaceSessionInput, CronJobPayload, CronJobRecord, CronJobUpdatePatch, CursorPageInfo, type DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, type Fetch, type GenerationContentBlock, type GenerationPolicy, type GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, HttpTransport, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, LabelAssignmentListItem, LabelAssignmentPageInfo, LabelAssignmentRecord, LabelListItem, LabelRecord, LabelResourceType, LabelScopeType, LabelSource, type ListGenerationModelsResponse, MeResponse, type MessageRecord, ModelCatalogEntry, PatchResourceLabelsInput, PatchResourceLabelsResponse, Permission, PromptAccessMode, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, type PublicGenerationDeclaration, PublicUserProfile, ReferenceAggregateGroup, ReferenceAggregateGroupBy, ReferenceAggregateResponse, ReferenceDirection, ReferenceKind, ReferenceQueryResponse, ReferenceQueryableType, ReferenceRecord, ReferenceResourceType, ResourceLabelsResponse, SendMessageCronJobPayload, SessionBindingRecord, type SessionForkRecord, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionRecord, type SessionTurnIndexItem, SessionTurnIndexResponse, type SessionTurnRecord, SessionTurnResponse, type SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceCommerceBenefit, SpaceCommerceBuyerProfile, SpaceCommerceCreditsBenefit, SpaceCommerceFeatureBenefit, SpaceCommerceOrder, SpaceCommerceProduct, SpaceCommerceProductBenefitBinding, SpaceCommerceProductCreditBenefit, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceCreateResponse, SpaceDefaultResponse, SpaceEnvInput, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsEncoding, SpaceFsEntry, SpaceFsFileKind, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsPreparingFile, SpaceFsReadFilesError, SpaceFsReadFilesInput, SpaceFsReadFilesResponse, SpaceFsTreeResponse, SpaceFsUploadDestination, SpaceFsUploadEntry, SpaceFsUploadError, SpaceFsUploadPlanEntry, SpaceFsUploadPlanEntryInput, SpaceFsUploadProgress, SpaceFsUploadResponse, SpaceFsWriteFileInput, SpaceInvitation, SpaceListItem, SpaceMember, SpaceMeta, SpaceModListItem, SpacePresenceSnapshot, SpacePresenceUser, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSandboxProvider, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, UserProfile, UserRulesResponse, createHttpClient };
2
+ import { $n as PatchResourceLabelsInput, $r as SpaceFsEncoding, $t as BillingCreditStatus, Ai as SpaceSessionsResponse, An as CronJobRecord, Ar as SpaceAccessPolicy, Bi as GenerationTaskResult, Bn as JsonObject, Br as SpaceCommerceProductBenefitBinding, Bt as BatchUserProfilesResponse, Ci as SpacePresenceUser, Cn as CreateInvitationResponse, Cr as SessionTurnIndexResponse, Ct as Fetch, Di as SpaceSandboxAutoDestroyPolicy, Dn as CreateSpacePromptResponse, Dr as SessionTurnWindowResponse, Ei as SpaceRole, En as CreateSpacePromptInput, Er as SessionTurnStreamSnapshotResponse, Fi as TaskRunRecord, Fn as ExploreSpacesResponse, Fr as SpaceCommerceBuyerProfile, Gi as GenerationPolicy, Gn as LabelAssignmentRecord, Gr as SpaceConfigUpdateResponse, Gt as BillingBalanceActivityStatus, Hi as PublicGenerationDeclaration, Hn as JsonValue, Hr as SpaceConfig, Ht as BillingBalanceActivity, Ii as UserProfile, In as GlobalSearchResponse, Ir as SpaceCommerceCreditsBenefit, Jn as LabelResourceType, Jr as SpaceEnvInput, Jt as BillingCheckoutActionState, Kn as LabelListItem, Kr as SpaceCreateResponse, Kt as BillingCatalog, Li as UserRulesResponse, Ln as GlobalSearchResult, Lr as SpaceCommerceFeatureBenefit, Mi as SpaceUsageResponse, Mn as CursorPageInfo, Mr as SpaceChannelBindingInput, Ni as SpaceUsageSummary, Nn as ExploreSection, Nr as SpaceCheckpointDetailResponse, Oi as SpaceSandboxConfig, On as CreateSpaceSessionInput, Or as SessionTurnsPaginatedResponse, Pi as TaskRunDetailResponse, Pn as ExploreSpaceItem, Pr as SpaceCommerceBenefit, Qn as ModelCatalogEntry, Qr as SpaceFsCreateUploadResponse, Qt as BillingCreditGrantStatus, Ri as CreateGenerationTaskRequest, Rn as GlobalSearchType, Rr as SpaceCommerceOrder, Rt as AcceptInvitationResponse, Si as SpacePresenceSnapshot, Sn as CreateInvitationInput, Sr as SessionRecord, St as CohubClientOptions, Ti as SpaceRecord, Tn as CreateSpaceModInput, Tr as SessionTurnSignedUrlsResponse, Tt as HttpTransport, Un as LabelAssignmentListItem, Ur as SpaceConfigInput, Ut as BillingBalanceActivityKind, Vi as ListGenerationModelsResponse, Vn as JsonPrimitive, Vr as SpaceCommerceProductCreditBenefit, Vt as BillingAccessWarning, Wn as LabelAssignmentPageInfo, Wr as SpaceConfigResponse, Wt as BillingBalanceActivityList, Xn as LabelSource, Xr as SpaceFsCompleteUploadResponse, Xt as BillingConversionIntent, Yn as LabelScopeType, Yr as SpaceFsCompleteUploadInput, Yt as BillingCheckoutResult, Zn as MeResponse, Zr as SpaceFsCreateUploadInput, Zt as BillingCreditExpiryGroup, _i as SpaceInvitation, _n as CanvasNodeRecord, _r as SendMessageCronJobPayload, ai as SpaceFsReadFilesError, an as BillingProductCreditBenefit, ar as PublicUserProfile, bi as SpaceMeta, bn as Channel, br as SessionMessagesPaginatedResponse, ci as SpaceFsTreeResponse, cn as BillingProductPricing, cr as ReferenceAggregateResponse, di as SpaceFsUploadError, dn as BillingSubscriptionHistoryStatus, dr as ReferenceQueryResponse, ei as SpaceFsEntry, en as BillingCreditUnit, er as PatchResourceLabelsResponse, fi as SpaceFsUploadPlanEntry, fn as BillingSubscriptionSummary, fr as ReferenceQueryableType, gi as SpaceFsWriteFileInput, gn as CanvasNodeInput, gr as SandboxSpecId, hi as SpaceFsUploadResponse, hn as CanvasDocumentRecord, hr as ResourceLabelsResponse, ii as SpaceFsPreparingFile, in as BillingProductBillingInterval, ir as PromptTemplateCatalogResponse, ji as SpaceUsageHourlyStat, jn as CronJobUpdatePatch, jr as SpaceBootstrapSource, ki as SpaceSandboxProvider, kn as CronJobPayload, kr as SpaceAccess, li as SpaceFsUploadDestination, ln as BillingRedemptionResult, lr as ReferenceDirection, mi as SpaceFsUploadProgress, mn as CanvasCreateInput, mr as ReferenceResourceType, n as createHttpClient, na as ChannelConfig, ni as SpaceFsFileResponse, nn as BillingPaymentStatus, nr as PromptAccessMode, oi as SpaceFsReadFilesInput, on as BillingProductDisplay, or as ReferenceAggregateGroup, pi as SpaceFsUploadPlanEntryInput, pn as CanvasBootstrapResponse, pr as ReferenceRecord, qn as LabelRecord, qr as SpaceDefaultResponse, qt as BillingCatalogProduct, ra as DiscordChannelConfig, ri as SpaceFsMoveInput, rn as BillingPluginStatus, rr as PromptTemplateCatalogEntry, si as SpaceFsReadFilesResponse, sn as BillingProductKind, sr as ReferenceAggregateGroupBy, t as CohubHttpClient, ta as GenerationContentBlock, ti as SpaceFsFileKind, tn as BillingHistoryPagination, tr as Permission, ui as SpaceFsUploadEntry, un as BillingSubscriptionHistoryList, ur as ReferenceKind, vi as SpaceListItem, vn as CanvasSemanticOp, vr as SessionBindingRecord, wi as SpacePublicProfile, wn as CreateSpaceInput, wr as SessionTurnResponse, wt as HttpError, xi as SpaceModListItem, xn as CheckpointRecord, xr as SessionMessagesResponse, yi as SpaceMember, yn as CanvasTransactionInput, yr as SessionMessageResponse, zi as CreateGenerationTaskResponse, zn as InvitationDetail, zr as SpaceCommerceProduct, zt as ApiError } from "./chunks/http.js";
3
+ export { AcceptInvitationResponse, ApiError, BatchUserProfilesResponse, BillingAccessWarning, BillingBalanceActivity, BillingBalanceActivityKind, BillingBalanceActivityList, BillingBalanceActivityStatus, BillingCatalog, BillingCatalogProduct, BillingCheckoutActionState, BillingCheckoutResult, BillingConversionIntent, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingHistoryPagination, BillingPaymentStatus, BillingPluginStatus, BillingProductBillingInterval, BillingProductCreditBenefit, BillingProductDisplay, BillingProductKind, BillingProductPricing, BillingRedemptionResult, BillingSubscriptionHistoryList, BillingSubscriptionHistoryStatus, BillingSubscriptionSummary, CanvasBootstrapResponse, CanvasCreateInput, CanvasDocumentRecord, CanvasNodeInput, CanvasNodeRecord, CanvasSemanticOp, CanvasTransactionInput, Channel, type ChannelConfig, CheckpointRecord, type CohubClientOptions, CohubHttpClient, type ContentBlock, type CreateGenerationTaskRequest, type CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CreateSpaceSessionInput, CronJobPayload, CronJobRecord, CronJobUpdatePatch, CursorPageInfo, type DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, type Fetch, type GenerationContentBlock, type GenerationPolicy, type GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, HttpTransport, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, LabelAssignmentListItem, LabelAssignmentPageInfo, LabelAssignmentRecord, LabelListItem, LabelRecord, LabelResourceType, LabelScopeType, LabelSource, type ListGenerationModelsResponse, MeResponse, type MessageRecord, ModelCatalogEntry, PatchResourceLabelsInput, PatchResourceLabelsResponse, Permission, PromptAccessMode, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, type PublicGenerationDeclaration, PublicUserProfile, ReferenceAggregateGroup, ReferenceAggregateGroupBy, ReferenceAggregateResponse, ReferenceDirection, ReferenceKind, ReferenceQueryResponse, ReferenceQueryableType, ReferenceRecord, ReferenceResourceType, ResourceLabelsResponse, SandboxSpecId, SendMessageCronJobPayload, SessionBindingRecord, type SessionForkRecord, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionRecord, type SessionTurnIndexItem, SessionTurnIndexResponse, type SessionTurnRecord, SessionTurnResponse, type SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceCommerceBenefit, SpaceCommerceBuyerProfile, SpaceCommerceCreditsBenefit, SpaceCommerceFeatureBenefit, SpaceCommerceOrder, SpaceCommerceProduct, SpaceCommerceProductBenefitBinding, SpaceCommerceProductCreditBenefit, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceConfigUpdateResponse, SpaceCreateResponse, SpaceDefaultResponse, SpaceEnvInput, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsEncoding, SpaceFsEntry, SpaceFsFileKind, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsPreparingFile, SpaceFsReadFilesError, SpaceFsReadFilesInput, SpaceFsReadFilesResponse, SpaceFsTreeResponse, SpaceFsUploadDestination, SpaceFsUploadEntry, SpaceFsUploadError, SpaceFsUploadPlanEntry, SpaceFsUploadPlanEntryInput, SpaceFsUploadProgress, SpaceFsUploadResponse, SpaceFsWriteFileInput, SpaceInvitation, SpaceListItem, SpaceMember, SpaceMeta, SpaceModListItem, SpacePresenceSnapshot, SpacePresenceUser, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSandboxProvider, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, UserProfile, UserRulesResponse, createHttpClient };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as normalizeWebsocketUrl, c as resolveVoiceInputWebsocketUrl, i as normalizeVoiceInputWebsocketUrl, l as resolveWebsocketUrl, n as CohubEnvironment, o as resolveApiBaseUrl, r as normalizeBaseUrl, s as resolveCohubEnvironment, t as COHUB_ENVIRONMENTS } from "./chunks/environment.js";
2
- import { C as ContentBlock, _ as SessionForkRecord, b as SessionTurnIndexItem, c as createWebsocketClient, f as RealtimeServerEvent, h as MessageRecord, l as ChannelEnvelope, r as WebsocketClient, u as LabelAssignmentsUpdatedEvent, x as SessionTurnRecord, y as SessionTurnSegmentRecord } from "./chunks/websocket.js";
2
+ import { C as ContentBlock, _ as SessionForkRecord, b as SessionTurnIndexItem, c as createWebsocketClient, f as RealtimeServerEvent, h as MessageRecord, l as ChannelEnvelope, r as WebsocketClient, s as WebsocketEventPayload, u as LabelAssignmentsUpdatedEvent, x as SessionTurnRecord, y as SessionTurnSegmentRecord } from "./chunks/websocket.js";
3
3
  import { a as VoiceInputCreateOptions, i as VoiceInputClientOptions, l as createVoiceInputClient, n as VoiceInputCallbacks, o as VoiceInputEvent, r as VoiceInputClient, t as VoiceApi } from "./chunks/voice-input.js";
4
- import { $ as parseAssistantMessageCommit, $i as GenerationContentBlock, $n as PatchResourceLabelsInput, $r as SpaceFsFileKind, $t as BillingCreditStatus, A as TasksApi, Ai as SpaceUsageResponse, An as CronJobRecord, Ar as SpaceBootstrapSource, At as WorkRuntimeCheckoutState, B as GenerationStreamCommitEvent, Bi as PublicGenerationDeclaration, Bn as JsonObject, Br as SpaceCommerceProductCreditBenefit, Bt as BatchUserProfilesResponse, C as WorkStatus, Ci as SpaceRecord, Cn as CreateInvitationResponse, Cr as SessionTurnResponse, Ct as Fetch, D as WorkVisibility, Di as SpaceSandboxProvider, Dn as CreateSpacePromptResponse, Dr as SessionTurnsPaginatedResponse, Dt as ParentBridgeTransport, E as WorkVersionRecord, Ei as SpaceSandboxConfig, En as CreateSpacePromptInput, Er as SessionTurnWindowResponse, Et as RawHttpResponse, F as SpaceEventName, Fi as UserRulesResponse, Fn as ExploreSpacesResponse, Fr as SpaceCommerceCreditsBenefit, Ft as WorkRuntimeTransport, G as GenerationStreamLifecycleEvent, Gi as assertGenerationRequestAllowedByPolicy, Gn as LabelAssignmentRecord, Gr as SpaceDefaultResponse, Gt as BillingBalanceActivityStatus, H as GenerationStreamEvent, Hi as GenerationParameterConstraint, Hn as JsonValue, Hr as SpaceConfigInput, Ht as BillingBalanceActivity, I as SpacesApi, Ii as CreateGenerationTaskRequest, In as GlobalSearchResponse, Ir as SpaceCommerceFeatureBenefit, It as createWorkRuntime, J as GenerationStreamSubscribeOptions, Ji as filterGenerationDeclarationsByPolicy, Jn as LabelResourceType, Jr as SpaceFsCompleteUploadResponse, Jt as BillingCheckoutActionState, K as GenerationStreamOutOfSyncEvent, Ki as decodeGenerationPolicy, Kn as LabelListItem, Kr as SpaceEnvInput, Kt as BillingCatalog, L as WebSocketConnectionState, Li as CreateGenerationTaskResponse, Ln as GlobalSearchResult, Lr as SpaceCommerceOrder, Lt as resolveWorkTransport, M as SessionSubscriptionHandlers, Mi as TaskRunDetailResponse, Mn as CursorPageInfo, Mr as SpaceCheckpointDetailResponse, Mt as WorkRuntimeContext, N as SpaceChannelBindingRecord, Ni as TaskRunRecord, Nn as ExploreSection, Nr as SpaceCommerceBenefit, Nt as WorkRuntimeModeConfig, O as WorksApi, Oi as SpaceSessionsResponse, On as CreateSpaceSessionInput, Or as SpaceAccess, Ot as PopupBrokerTransport, P as SpaceClient, Pi as UserProfile, Pn as ExploreSpaceItem, Pr as SpaceCommerceBuyerProfile, Pt as WorkRuntimeRequestOptions, Q as createSessionGenerationStreamClient, Qi as parseGenerationPolicyFromEnv, Qn as ModelCatalogEntry, Qr as SpaceFsEntry, Qt as BillingCreditGrantStatus, R as PublicInviteApi, Ri as GenerationTaskResult, Rn as GlobalSearchType, Rr as SpaceCommerceProduct, Rt as AcceptInvitationResponse, S as WorkSessionResponse, Si as SpacePublicProfile, Sn as CreateInvitationInput, Sr as SessionTurnIndexResponse, St as CohubClientOptions, T as WorkUpdateInput, Ti as SpaceSandboxAutoDestroyPolicy, Tn as CreateSpaceModInput, Tr as SessionTurnStreamSnapshotResponse, Tt as HttpTransport, U as GenerationStreamFinalizedEvent, Ui as GenerationPolicy, Un as LabelAssignmentListItem, Ur as SpaceConfigResponse, Ut as BillingBalanceActivityKind, V as GenerationStreamErrorEvent, Vi as GenerationModelPolicy, Vn as JsonPrimitive, Vr as SpaceConfig, Vt as BillingAccessWarning, W as GenerationStreamIntermediateMessage, Wi as GenerationPolicyError, Wn as LabelAssignmentPageInfo, Wr as SpaceCreateResponse, Wt as BillingBalanceActivityList, X as GenerationStreamTurnUpdatedEvent, Xi as getAllowedGenerationModelIds, Xn as LabelSource, Xr as SpaceFsCreateUploadResponse, Xt as BillingConversionIntent, Y as GenerationStreamSubscriptionHandlers, Yi as findGenerationModelPolicy, Yn as LabelScopeType, Yr as SpaceFsCreateUploadInput, Yt as BillingCheckoutResult, Z as SessionGenerationStreamClient, Zi as normalizeGenerationPolicy, Zn as MeResponse, Zr as SpaceFsEncoding, Zt as BillingCreditExpiryGroup, _ as WorkPresentationMeta, _i as SpaceMember, _n as CanvasNodeRecord, _r as SessionBindingRecord, _t as PromptsApi, a as WorkCommerceCreditConsumeResponse, ai as SpaceFsReadFilesResponse, an as BillingProductCreditBenefit, ar as PublicUserProfile, at as createSessionPatchReducer, b as WorkRecord, bi as SpacePresenceSnapshot, bn as Channel, br as SessionMessagesResponse, bt as CronJobsApi, c as WorkCommerceEntitlementsResponse, ci as SpaceFsUploadEntry, cn as BillingProductPricing, cr as ReferenceAggregateResponse, ct as ReferencesApi, d as WorkCommercePurchaseResponse, di as SpaceFsUploadPlanEntryInput, dn as BillingSubscriptionHistoryStatus, dr as ReferenceQueryResponse, dt as CreatePublicAssetUploadResponse, ea as ChannelConfig, ei as SpaceFsFileResponse, en as BillingCreditUnit, er as PatchResourceLabelsResponse, et as SessionPatchApplyInput, f as WorkAuthorizeResponse, fi as SpaceFsUploadProgress, fn as BillingSubscriptionSummary, fr as ReferenceQueryableType, ft as PublicAssetMimeType, g as WorkMeta, gi as SpaceListItem, gn as CanvasNodeInput, gr as SendMessageCronJobPayload, gt as UploadPublicAssetInput, h as WorkGetResponse, hi as SpaceInvitation, hn as CanvasDocumentRecord, hr as ResourceLabelsResponse, ht as UploadChatImageAttachmentInput, i as WorkCommerceCheckoutStatus, ii as SpaceFsReadFilesInput, in as BillingProductBillingInterval, ir as PromptTemplateCatalogResponse, it as SessionPatchStatus, j as SessionEventName, ji as SpaceUsageSummary, jn as CronJobUpdatePatch, jr as SpaceChannelBindingInput, jt as WorkRuntimeCheckoutStatus, k as UserApi, ki as SpaceUsageHourlyStat, kn as CronJobPayload, kr as SpaceAccessPolicy, kt as WorkRuntimeApi, l as WorkCommerceOrder, li as SpaceFsUploadError, ln as BillingRedemptionResult, lr as ReferenceDirection, lt as SearchApi, m as WorkDetailResponse, mi as SpaceFsWriteFileInput, mn as CanvasCreateInput, mr as ReferenceResourceType, mt as PublicAssetsApi, n as createHttpClient, ni as SpaceFsPreparingFile, nn as BillingPaymentStatus, nr as PromptAccessMode, nt as SessionPatchReducer, o as WorkCommerceCreditConsumeStatus, oi as SpaceFsTreeResponse, on as BillingProductDisplay, or as ReferenceAggregateGroup, ot as SessionAccessApi, p as WorkCreateInput, pi as SpaceFsUploadResponse, pn as CanvasBootstrapResponse, pr as ReferenceRecord, pt as PublicAssetPurpose, q as GenerationStreamStateEvent, qi as encodeGenerationPolicy, qn as LabelRecord, qr as SpaceFsCompleteUploadInput, qt as BillingCatalogProduct, r as WorkCommerceApi, ri as SpaceFsReadFilesError, rn as BillingPluginStatus, rr as PromptTemplateCatalogEntry, rt as SessionPatchState, s as WorkCommerceEntitlement, si as SpaceFsUploadDestination, sn as BillingProductKind, sr as ReferenceAggregateGroupBy, st as ReferenceResourceSelector, t as CohubHttpClient, ta as DiscordChannelConfig, ti as SpaceFsMoveInput, tn as BillingHistoryPagination, tr as Permission, tt as SessionPatchApplyResult, u as WorkCommerceProductResolveResponse, ui as SpaceFsUploadPlanEntry, un as BillingSubscriptionHistoryList, ur as ReferenceKind, ut as CreatePublicAssetUploadInput, v as WorkPublicOwnerRecord, vi as SpaceMeta, vn as CanvasSemanticOp, vr as SessionMessageResponse, vt as ModelsApi, w as WorkTargetType, wi as SpaceRole, wn as CreateSpaceInput, wr as SessionTurnSignedUrlsResponse, wt as HttpError, x as WorkResolveResponse, xi as SpacePresenceUser, xn as CheckpointRecord, xr as SessionRecord, xt as ChannelsApi, y as WorkPublicSpaceRecord, yi as SpaceModListItem, yn as CanvasTransactionInput, yr as SessionMessagesPaginatedResponse, yt as GenerationsApi, z as AssistantMessageCommit, zi as ListGenerationModelsResponse, zn as InvitationDetail, zr as SpaceCommerceProductBenefitBinding, zt as ApiError } from "./chunks/http.js";
4
+ import { $ as parseAssistantMessageCommit, $i as normalizeGenerationPolicy, $n as PatchResourceLabelsInput, $r as SpaceFsEncoding, $t as BillingCreditStatus, A as TasksApi, Ai as SpaceSessionsResponse, An as CronJobRecord, Ar as SpaceAccessPolicy, At as WorkRuntimeCheckoutState, B as GenerationStreamCommitEvent, Bi as GenerationTaskResult, Bn as JsonObject, Br as SpaceCommerceProductBenefitBinding, Bt as BatchUserProfilesResponse, C as WorkStatus, Ci as SpacePresenceUser, Cn as CreateInvitationResponse, Cr as SessionTurnIndexResponse, Ct as Fetch, D as WorkVisibility, Di as SpaceSandboxAutoDestroyPolicy, Dn as CreateSpacePromptResponse, Dr as SessionTurnWindowResponse, Dt as ParentBridgeTransport, E as WorkVersionRecord, Ei as SpaceRole, En as CreateSpacePromptInput, Er as SessionTurnStreamSnapshotResponse, Et as RawHttpResponse, F as SpaceEventName, Fi as TaskRunRecord, Fn as ExploreSpacesResponse, Fr as SpaceCommerceBuyerProfile, Ft as WorkRuntimeTransport, G as GenerationStreamLifecycleEvent, Gi as GenerationPolicy, Gn as LabelAssignmentRecord, Gr as SpaceConfigUpdateResponse, Gt as BillingBalanceActivityStatus, H as GenerationStreamEvent, Hi as PublicGenerationDeclaration, Hn as JsonValue, Hr as SpaceConfig, Ht as BillingBalanceActivity, I as SpacesApi, Ii as UserProfile, In as GlobalSearchResponse, Ir as SpaceCommerceCreditsBenefit, It as createWorkRuntime, J as GenerationStreamSubscribeOptions, Ji as decodeGenerationPolicy, Jn as LabelResourceType, Jr as SpaceEnvInput, Jt as BillingCheckoutActionState, K as GenerationStreamOutOfSyncEvent, Ki as GenerationPolicyError, Kn as LabelListItem, Kr as SpaceCreateResponse, Kt as BillingCatalog, L as WebSocketConnectionState, Li as UserRulesResponse, Ln as GlobalSearchResult, Lr as SpaceCommerceFeatureBenefit, Lt as resolveWorkTransport, M as SessionSubscriptionHandlers, Mi as SpaceUsageResponse, Mn as CursorPageInfo, Mr as SpaceChannelBindingInput, Mt as WorkRuntimeContext, N as SpaceChannelBindingRecord, Ni as SpaceUsageSummary, Nn as ExploreSection, Nr as SpaceCheckpointDetailResponse, Nt as WorkRuntimeModeConfig, O as WorksApi, Oi as SpaceSandboxConfig, On as CreateSpaceSessionInput, Or as SessionTurnsPaginatedResponse, Ot as PopupBrokerTransport, P as SpaceClient, Pi as TaskRunDetailResponse, Pn as ExploreSpaceItem, Pr as SpaceCommerceBenefit, Pt as WorkRuntimeRequestOptions, Q as createSessionGenerationStreamClient, Qi as getAllowedGenerationModelIds, Qn as ModelCatalogEntry, Qr as SpaceFsCreateUploadResponse, Qt as BillingCreditGrantStatus, R as PublicInviteApi, Ri as CreateGenerationTaskRequest, Rn as GlobalSearchType, Rr as SpaceCommerceOrder, Rt as AcceptInvitationResponse, S as WorkSessionResponse, Si as SpacePresenceSnapshot, Sn as CreateInvitationInput, Sr as SessionRecord, St as CohubClientOptions, T as WorkUpdateInput, Ti as SpaceRecord, Tn as CreateSpaceModInput, Tr as SessionTurnSignedUrlsResponse, Tt as HttpTransport, U as GenerationStreamFinalizedEvent, Ui as GenerationModelPolicy, Un as LabelAssignmentListItem, Ur as SpaceConfigInput, Ut as BillingBalanceActivityKind, V as GenerationStreamErrorEvent, Vi as ListGenerationModelsResponse, Vn as JsonPrimitive, Vr as SpaceCommerceProductCreditBenefit, Vt as BillingAccessWarning, W as GenerationStreamIntermediateMessage, Wi as GenerationParameterConstraint, Wn as LabelAssignmentPageInfo, Wr as SpaceConfigResponse, Wt as BillingBalanceActivityList, X as GenerationStreamTurnUpdatedEvent, Xi as filterGenerationDeclarationsByPolicy, Xn as LabelSource, Xr as SpaceFsCompleteUploadResponse, Xt as BillingConversionIntent, Y as GenerationStreamSubscriptionHandlers, Yi as encodeGenerationPolicy, Yn as LabelScopeType, Yr as SpaceFsCompleteUploadInput, Yt as BillingCheckoutResult, Z as SessionGenerationStreamClient, Zi as findGenerationModelPolicy, Zn as MeResponse, Zr as SpaceFsCreateUploadInput, Zt as BillingCreditExpiryGroup, _ as WorkPresentationMeta, _i as SpaceInvitation, _n as CanvasNodeRecord, _r as SendMessageCronJobPayload, _t as PromptsApi, a as WorkCommerceCreditConsumeResponse, ai as SpaceFsReadFilesError, an as BillingProductCreditBenefit, ar as PublicUserProfile, at as createSessionPatchReducer, b as WorkRecord, bi as SpaceMeta, bn as Channel, br as SessionMessagesPaginatedResponse, bt as CronJobsApi, c as WorkCommerceEntitlementsResponse, ci as SpaceFsTreeResponse, cn as BillingProductPricing, cr as ReferenceAggregateResponse, ct as ReferencesApi, d as WorkCommercePurchaseResponse, di as SpaceFsUploadError, dn as BillingSubscriptionHistoryStatus, dr as ReferenceQueryResponse, dt as CreatePublicAssetUploadResponse, ea as parseGenerationPolicyFromEnv, ei as SpaceFsEntry, en as BillingCreditUnit, er as PatchResourceLabelsResponse, et as SessionPatchApplyInput, f as WorkAuthorizeResponse, fi as SpaceFsUploadPlanEntry, fn as BillingSubscriptionSummary, fr as ReferenceQueryableType, ft as PublicAssetMimeType, g as WorkMeta, gi as SpaceFsWriteFileInput, gn as CanvasNodeInput, gr as SandboxSpecId, gt as UploadPublicAssetInput, h as WorkGetResponse, hi as SpaceFsUploadResponse, hn as CanvasDocumentRecord, hr as ResourceLabelsResponse, ht as UploadChatImageAttachmentInput, i as WorkCommerceCheckoutStatus, ii as SpaceFsPreparingFile, in as BillingProductBillingInterval, ir as PromptTemplateCatalogResponse, it as SessionPatchStatus, j as SessionEventName, ji as SpaceUsageHourlyStat, jn as CronJobUpdatePatch, jr as SpaceBootstrapSource, jt as WorkRuntimeCheckoutStatus, k as UserApi, ki as SpaceSandboxProvider, kn as CronJobPayload, kr as SpaceAccess, kt as WorkRuntimeApi, l as WorkCommerceOrder, li as SpaceFsUploadDestination, ln as BillingRedemptionResult, lr as ReferenceDirection, lt as SearchApi, m as WorkDetailResponse, mi as SpaceFsUploadProgress, mn as CanvasCreateInput, mr as ReferenceResourceType, mt as PublicAssetsApi, n as createHttpClient, na as ChannelConfig, ni as SpaceFsFileResponse, nn as BillingPaymentStatus, nr as PromptAccessMode, nt as SessionPatchReducer, o as WorkCommerceCreditConsumeStatus, oi as SpaceFsReadFilesInput, on as BillingProductDisplay, or as ReferenceAggregateGroup, ot as SessionAccessApi, p as WorkCreateInput, pi as SpaceFsUploadPlanEntryInput, pn as CanvasBootstrapResponse, pr as ReferenceRecord, pt as PublicAssetPurpose, q as GenerationStreamStateEvent, qi as assertGenerationRequestAllowedByPolicy, qn as LabelRecord, qr as SpaceDefaultResponse, qt as BillingCatalogProduct, r as WorkCommerceApi, ra as DiscordChannelConfig, ri as SpaceFsMoveInput, rn as BillingPluginStatus, rr as PromptTemplateCatalogEntry, rt as SessionPatchState, s as WorkCommerceEntitlement, si as SpaceFsReadFilesResponse, sn as BillingProductKind, sr as ReferenceAggregateGroupBy, st as ReferenceResourceSelector, t as CohubHttpClient, ta as GenerationContentBlock, ti as SpaceFsFileKind, tn as BillingHistoryPagination, tr as Permission, tt as SessionPatchApplyResult, u as WorkCommerceProductResolveResponse, ui as SpaceFsUploadEntry, un as BillingSubscriptionHistoryList, ur as ReferenceKind, ut as CreatePublicAssetUploadInput, v as WorkPublicOwnerRecord, vi as SpaceListItem, vn as CanvasSemanticOp, vr as SessionBindingRecord, vt as ModelsApi, w as WorkTargetType, wi as SpacePublicProfile, wn as CreateSpaceInput, wr as SessionTurnResponse, wt as HttpError, x as WorkResolveResponse, xi as SpaceModListItem, xn as CheckpointRecord, xr as SessionMessagesResponse, xt as ChannelsApi, y as WorkPublicSpaceRecord, yi as SpaceMember, yn as CanvasTransactionInput, yr as SessionMessageResponse, yt as GenerationsApi, z as AssistantMessageCommit, zi as CreateGenerationTaskResponse, zn as InvitationDetail, zr as SpaceCommerceProduct, zt as ApiError } from "./chunks/http.js";
5
5
 
6
6
  //#region src/apis/billing.d.ts
7
7
  declare class BillingApi {
@@ -132,6 +132,7 @@ declare class CohubClient {
132
132
  };
133
133
  };
134
134
  space(spaceId: string): SpaceClient;
135
+ onUserEvent(handler: (event: WebsocketEventPayload) => void): () => void;
135
136
  onConnection(handler: (state: WebSocketConnectionState) => void): () => void;
136
137
  }
137
138
  declare const createCohubClient: (options?: CohubClientOptions) => CohubClient;
@@ -251,4 +252,4 @@ declare function isHttpErrorCode(error: unknown, code: string): error is HttpErr
251
252
  code: string;
252
253
  };
253
254
  //#endregion
254
- export { AcceptInvitationResponse, ApiError, type AssistantMessageCommit, BatchUserProfilesResponse, BillingAccessWarning, BillingApi, BillingBalanceActivity, BillingBalanceActivityKind, BillingBalanceActivityList, BillingBalanceActivityStatus, BillingCatalog, BillingCatalogProduct, BillingCheckoutActionState, BillingCheckoutResult, BillingConversionIntent, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingHistoryPagination, BillingPaymentStatus, BillingPluginStatus, BillingProductBillingInterval, BillingProductCreditBenefit, BillingProductDisplay, BillingProductKind, BillingProductPricing, BillingRedemptionResult, BillingSubscriptionHistoryList, BillingSubscriptionHistoryStatus, BillingSubscriptionSummary, COHUB_ENVIRONMENTS, CanvasBootstrapResponse, CanvasCreateInput, CanvasDocumentRecord, CanvasNodeInput, CanvasNodeRecord, CanvasSemanticOp, CanvasTransactionInput, Channel, type ChannelConfig, type ChannelEnvelope, CheckpointRecord, CohubClient, type CohubClientOptions, type CohubEnvironment, CohubHttpClient, type ContentBlock, type CreateGenerationTaskRequest, type CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, type CreatePublicAssetUploadInput, type CreatePublicAssetUploadResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CreateSpaceSessionInput, CronJobPayload, CronJobRecord, CronJobUpdatePatch, CursorPageInfo, type DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, type Fetch, type GenerationContentBlock, type GenerationModelPolicy, type GenerationParameterConstraint, type GenerationPolicy, GenerationPolicyError, type GenerationStreamCommitEvent, type GenerationStreamErrorEvent, type GenerationStreamEvent, type GenerationStreamFinalizedEvent, type GenerationStreamIntermediateMessage, type GenerationStreamLifecycleEvent, type GenerationStreamOutOfSyncEvent, type GenerationStreamStateEvent, type GenerationStreamSubscribeOptions, type GenerationStreamSubscriptionHandlers, type GenerationStreamTurnUpdatedEvent, type GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, LabelAssignmentListItem, LabelAssignmentPageInfo, LabelAssignmentRecord, type LabelAssignmentsUpdatedEvent, LabelListItem, LabelRecord, LabelResourceType, LabelScopeType, LabelSource, type ListGenerationModelsResponse, MeResponse, type MessageRecord, ModelCatalogEntry, ParentBridgeTransport, PatchResourceLabelsInput, PatchResourceLabelsResponse, Permission, PopupBrokerTransport, PromptAccessMode, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, type PublicAssetMimeType, type PublicAssetPurpose, type PublicGenerationDeclaration, PublicUserProfile, type RawHttpResponse, type RealtimeServerEvent, ReferenceAggregateGroup, ReferenceAggregateGroupBy, ReferenceAggregateResponse, ReferenceDirection, ReferenceKind, ReferenceQueryResponse, ReferenceQueryableType, ReferenceRecord, type ReferenceResourceSelector, ReferenceResourceType, ReferencesApi, ResourceLabelsResponse, SendMessageCronJobPayload, SessionBindingRecord, type SessionEventName, type SessionForkRecord, SessionGenerationStreamClient, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, type SessionPatchApplyInput, type SessionPatchApplyResult, SessionPatchReducer, type SessionPatchState, type SessionPatchStatus, SessionRecord, type SessionSubscriptionHandlers, type SessionTurnIndexItem, SessionTurnIndexResponse, type SessionTurnRecord, SessionTurnResponse, type SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, type SpaceChannelBindingRecord, SpaceCheckpointDetailResponse, SpaceCommerceBenefit, SpaceCommerceBuyerProfile, SpaceCommerceCreditsBenefit, SpaceCommerceFeatureBenefit, SpaceCommerceOrder, SpaceCommerceProduct, SpaceCommerceProductBenefitBinding, SpaceCommerceProductCreditBenefit, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceCreateResponse, SpaceDefaultResponse, SpaceEnvInput, type SpaceEventName, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsEncoding, SpaceFsEntry, SpaceFsFileKind, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsPreparingFile, SpaceFsReadFilesError, SpaceFsReadFilesInput, SpaceFsReadFilesResponse, SpaceFsTreeResponse, SpaceFsUploadDestination, SpaceFsUploadEntry, SpaceFsUploadError, SpaceFsUploadPlanEntry, SpaceFsUploadPlanEntryInput, SpaceFsUploadProgress, SpaceFsUploadResponse, SpaceFsWriteFileInput, SpaceInvitation, SpaceListItem, SpaceMember, SpaceMeta, SpaceModListItem, SpacePresenceSnapshot, SpacePresenceUser, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSandboxProvider, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, type UploadChatImageAttachmentInput, type UploadPublicAssetInput, UserProfile, UserRulesResponse, UsersApi, VoiceApi, type VoiceInputCallbacks, VoiceInputClient, type VoiceInputClientOptions, type VoiceInputCreateOptions, type VoiceInputEvent, type WebSocketConnectionState, WebsocketClient, type WorkAuthorizeRequest, type WorkAuthorizeResponse, type WorkBridgeCore, type WorkBridgeCoreConfig, type WorkBridgeCoreWork, type WorkBridgeDialogState, type WorkBridgeGetAccessToken, type WorkBridgeGetViewerUuid, type WorkBridgeRequestSignIn, WorkCommerceApi, type WorkCommerceCheckoutStatus, type WorkCommerceCreditConsumeResponse, type WorkCommerceCreditConsumeStatus, type WorkCommerceEntitlement, type WorkCommerceEntitlementsResponse, type WorkCommerceOrder, type WorkCommerceProductResolveResponse, type WorkCommercePurchaseResponse, type WorkCreateInput, type WorkDetailResponse, type WorkGetResponse, type WorkMeta, type WorkPresentationMeta, type WorkPublicOwnerRecord, type WorkPublicSpaceRecord, type WorkPurchaseRequest, type WorkRecord, type WorkResolveResponse, WorkRuntimeApi, type WorkRuntimeCheckoutState, type WorkRuntimeCheckoutStatus, type WorkRuntimeContext, type WorkRuntimeModeConfig, type WorkRuntimeRequestOptions, type WorkRuntimeTransport, type WorkSessionResponse, type WorkStatus, type WorkTargetType, type WorkUpdateInput, type WorkVersionRecord, type WorkVisibility, WorksApi, assertGenerationRequestAllowedByPolicy, clearGrantedWorkScopes, createCohubClient, createHttpClient, createSessionGenerationStreamClient, createSessionPatchReducer, createVoiceInputClient, createWebsocketClient, createWorkBridgeCore, createWorkRuntime, decodeGenerationPolicy, encodeGenerationPolicy, filterGenerationDeclarationsByPolicy, findGenerationModelPolicy, getAllowedGenerationModelIds, hasGrantedWorkScopes, isHttpErrorCode, normalizeBaseUrl, normalizeGenerationPolicy, normalizeVoiceInputWebsocketUrl, normalizeWebsocketUrl, parseAssistantMessageCommit, parseGenerationPolicyFromEnv, resolveApiBaseUrl, resolveCohubEnvironment, resolveVoiceInputWebsocketUrl, resolveWebsocketUrl, resolveWorkTransport, setGrantedWorkScopes };
255
+ export { AcceptInvitationResponse, ApiError, type AssistantMessageCommit, BatchUserProfilesResponse, BillingAccessWarning, BillingApi, BillingBalanceActivity, BillingBalanceActivityKind, BillingBalanceActivityList, BillingBalanceActivityStatus, BillingCatalog, BillingCatalogProduct, BillingCheckoutActionState, BillingCheckoutResult, BillingConversionIntent, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingHistoryPagination, BillingPaymentStatus, BillingPluginStatus, BillingProductBillingInterval, BillingProductCreditBenefit, BillingProductDisplay, BillingProductKind, BillingProductPricing, BillingRedemptionResult, BillingSubscriptionHistoryList, BillingSubscriptionHistoryStatus, BillingSubscriptionSummary, COHUB_ENVIRONMENTS, CanvasBootstrapResponse, CanvasCreateInput, CanvasDocumentRecord, CanvasNodeInput, CanvasNodeRecord, CanvasSemanticOp, CanvasTransactionInput, Channel, type ChannelConfig, type ChannelEnvelope, CheckpointRecord, CohubClient, type CohubClientOptions, type CohubEnvironment, CohubHttpClient, type ContentBlock, type CreateGenerationTaskRequest, type CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, type CreatePublicAssetUploadInput, type CreatePublicAssetUploadResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CreateSpaceSessionInput, CronJobPayload, CronJobRecord, CronJobUpdatePatch, CursorPageInfo, type DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, type Fetch, type GenerationContentBlock, type GenerationModelPolicy, type GenerationParameterConstraint, type GenerationPolicy, GenerationPolicyError, type GenerationStreamCommitEvent, type GenerationStreamErrorEvent, type GenerationStreamEvent, type GenerationStreamFinalizedEvent, type GenerationStreamIntermediateMessage, type GenerationStreamLifecycleEvent, type GenerationStreamOutOfSyncEvent, type GenerationStreamStateEvent, type GenerationStreamSubscribeOptions, type GenerationStreamSubscriptionHandlers, type GenerationStreamTurnUpdatedEvent, type GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, LabelAssignmentListItem, LabelAssignmentPageInfo, LabelAssignmentRecord, type LabelAssignmentsUpdatedEvent, LabelListItem, LabelRecord, LabelResourceType, LabelScopeType, LabelSource, type ListGenerationModelsResponse, MeResponse, type MessageRecord, ModelCatalogEntry, ParentBridgeTransport, PatchResourceLabelsInput, PatchResourceLabelsResponse, Permission, PopupBrokerTransport, PromptAccessMode, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, type PublicAssetMimeType, type PublicAssetPurpose, type PublicGenerationDeclaration, PublicUserProfile, type RawHttpResponse, type RealtimeServerEvent, ReferenceAggregateGroup, ReferenceAggregateGroupBy, ReferenceAggregateResponse, ReferenceDirection, ReferenceKind, ReferenceQueryResponse, ReferenceQueryableType, ReferenceRecord, type ReferenceResourceSelector, ReferenceResourceType, ReferencesApi, ResourceLabelsResponse, SandboxSpecId, SendMessageCronJobPayload, SessionBindingRecord, type SessionEventName, type SessionForkRecord, SessionGenerationStreamClient, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, type SessionPatchApplyInput, type SessionPatchApplyResult, SessionPatchReducer, type SessionPatchState, type SessionPatchStatus, SessionRecord, type SessionSubscriptionHandlers, type SessionTurnIndexItem, SessionTurnIndexResponse, type SessionTurnRecord, SessionTurnResponse, type SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, type SpaceChannelBindingRecord, SpaceCheckpointDetailResponse, SpaceCommerceBenefit, SpaceCommerceBuyerProfile, SpaceCommerceCreditsBenefit, SpaceCommerceFeatureBenefit, SpaceCommerceOrder, SpaceCommerceProduct, SpaceCommerceProductBenefitBinding, SpaceCommerceProductCreditBenefit, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceConfigUpdateResponse, SpaceCreateResponse, SpaceDefaultResponse, SpaceEnvInput, type SpaceEventName, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsEncoding, SpaceFsEntry, SpaceFsFileKind, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsPreparingFile, SpaceFsReadFilesError, SpaceFsReadFilesInput, SpaceFsReadFilesResponse, SpaceFsTreeResponse, SpaceFsUploadDestination, SpaceFsUploadEntry, SpaceFsUploadError, SpaceFsUploadPlanEntry, SpaceFsUploadPlanEntryInput, SpaceFsUploadProgress, SpaceFsUploadResponse, SpaceFsWriteFileInput, SpaceInvitation, SpaceListItem, SpaceMember, SpaceMeta, SpaceModListItem, SpacePresenceSnapshot, SpacePresenceUser, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSandboxProvider, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, type UploadChatImageAttachmentInput, type UploadPublicAssetInput, UserProfile, UserRulesResponse, UsersApi, VoiceApi, type VoiceInputCallbacks, VoiceInputClient, type VoiceInputClientOptions, type VoiceInputCreateOptions, type VoiceInputEvent, type WebSocketConnectionState, WebsocketClient, type WorkAuthorizeRequest, type WorkAuthorizeResponse, type WorkBridgeCore, type WorkBridgeCoreConfig, type WorkBridgeCoreWork, type WorkBridgeDialogState, type WorkBridgeGetAccessToken, type WorkBridgeGetViewerUuid, type WorkBridgeRequestSignIn, WorkCommerceApi, type WorkCommerceCheckoutStatus, type WorkCommerceCreditConsumeResponse, type WorkCommerceCreditConsumeStatus, type WorkCommerceEntitlement, type WorkCommerceEntitlementsResponse, type WorkCommerceOrder, type WorkCommerceProductResolveResponse, type WorkCommercePurchaseResponse, type WorkCreateInput, type WorkDetailResponse, type WorkGetResponse, type WorkMeta, type WorkPresentationMeta, type WorkPublicOwnerRecord, type WorkPublicSpaceRecord, type WorkPurchaseRequest, type WorkRecord, type WorkResolveResponse, WorkRuntimeApi, type WorkRuntimeCheckoutState, type WorkRuntimeCheckoutStatus, type WorkRuntimeContext, type WorkRuntimeModeConfig, type WorkRuntimeRequestOptions, type WorkRuntimeTransport, type WorkSessionResponse, type WorkStatus, type WorkTargetType, type WorkUpdateInput, type WorkVersionRecord, type WorkVisibility, WorksApi, assertGenerationRequestAllowedByPolicy, clearGrantedWorkScopes, createCohubClient, createHttpClient, createSessionGenerationStreamClient, createSessionPatchReducer, createVoiceInputClient, createWebsocketClient, createWorkBridgeCore, createWorkRuntime, decodeGenerationPolicy, encodeGenerationPolicy, filterGenerationDeclarationsByPolicy, findGenerationModelPolicy, getAllowedGenerationModelIds, hasGrantedWorkScopes, isHttpErrorCode, normalizeBaseUrl, normalizeGenerationPolicy, normalizeVoiceInputWebsocketUrl, normalizeWebsocketUrl, parseAssistantMessageCommit, parseGenerationPolicyFromEnv, resolveApiBaseUrl, resolveCohubEnvironment, resolveVoiceInputWebsocketUrl, resolveWebsocketUrl, resolveWorkTransport, setGrantedWorkScopes };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C as GenerationsApi, S as ModelsApi, T as ChannelsApi, _ as SessionAccessApi, a as UserApi, b as PublicAssetsApi, c as SpacesApi, d as createSessionGenerationStreamClient, f as parseAssistantMessageCommit, g as HttpTransport, h as HttpError, i as WorksApi, l as PublicInviteApi, m as createSessionPatchReducer, n as createHttpClient, o as TasksApi, p as SessionPatchReducer, r as WorkCommerceApi, s as SpaceClient, t as CohubHttpClient, u as SessionGenerationStreamClient, v as ReferencesApi, w as CronJobsApi, x as PromptsApi, y as SearchApi } from "./chunks/http.js";
1
+ import { C as ModelsApi, E as ChannelsApi, S as PromptsApi, T as CronJobsApi, _ as ensureRealtimeConnected, a as UserApi, b as SearchApi, c as SpacesApi, d as createSessionGenerationStreamClient, f as parseAssistantMessageCommit, g as HttpTransport, h as HttpError, i as WorksApi, l as PublicInviteApi, m as createSessionPatchReducer, n as createHttpClient, o as TasksApi, p as SessionPatchReducer, r as WorkCommerceApi, s as SpaceClient, t as CohubHttpClient, u as SessionGenerationStreamClient, v as SessionAccessApi, w as GenerationsApi, x as PublicAssetsApi, y as ReferencesApi } from "./chunks/http.js";
2
2
  import { a as resolveApiBaseUrl, c as resolveWebsocketUrl, i as normalizeWebsocketUrl, n as normalizeBaseUrl, o as resolveCohubEnvironment, r as normalizeVoiceInputWebsocketUrl, s as resolveVoiceInputWebsocketUrl, t as COHUB_ENVIRONMENTS } from "./chunks/environment.js";
3
3
  import { WebsocketClient, createWebsocketClient } from "./websocket.js";
4
4
  import { VoiceApi, VoiceInputClient, createVoiceInputClient } from "./voice-input.js";
@@ -507,6 +507,10 @@ var CohubClient = class {
507
507
  space(spaceId) {
508
508
  return new SpaceClient(spaceId, this.transport, this.websocketClient);
509
509
  }
510
+ onUserEvent(handler) {
511
+ ensureRealtimeConnected(this.websocketClient);
512
+ return this.websocketClient.on("event", handler);
513
+ }
510
514
  onConnection(handler) {
511
515
  const connectingCleanup = this.websocketClient.on("connecting", (payload) => {
512
516
  handler({
@@ -0,0 +1,938 @@
1
+ # Cohub Work Runtime Guide
2
+
3
+ This guide explains how to use the Cohub SDK **inside a published Work** — the
4
+ only environment where runtime APIs (`context()`, `auth.request`,
5
+ `work.commerce.*`) function. Read this before writing any Work that calls Cohub
6
+ capabilities from browser-side JavaScript.
7
+
8
+ It is written to be self-contained: an agent or developer who reads only this
9
+ file plus the SDK type definitions should be able to build a working Work
10
+ without reverse-engineering source code.
11
+
12
+ ---
13
+
14
+ ## Table of contents
15
+
16
+ 1. [Mental model](#1-mental-model)
17
+ 2. [Two deployment modes: bridge vs broker](#2-two-deployment-modes-bridge-vs-broker)
18
+ 3. [The scope model — read this twice](#3-the-scope-model--read-this-twice)
19
+ 4. [Initialization recipe](#4-initialization-recipe)
20
+ 5. [Capability reference](#5-capability-reference)
21
+ - [LLM chat](#llm-chat-spaceprompt--subscribegeneration)
22
+ - [Image / media generation](#image--media-generation-generationscreateandwait)
23
+ - [Model listing](#model-listing-modelslist--modelslistmultimodal)
24
+ - [File reads](#file-reads-spacefiles)
25
+ - [Account-level data](#account-level-data-spaceslist--userlistsessions--usergetusage)
26
+ - [Commerce](#commerce-workcommerce)
27
+ 6. [Complete working example](#6-complete-working-example)
28
+ 7. [Common pitfalls checklist](#7-common-pitfalls-checklist)
29
+ 8. [Publishing a Work (API/SDK)](#8-publishing-a-work-apisdk)
30
+
31
+ ---
32
+
33
+ ## 1. Mental model
34
+
35
+ A **Work** is a published, shareable web page hosted by Cohub. When a viewer
36
+ opens a Work, Cohub serves its HTML/JS inside a **runtime** that bridges the
37
+ Work's code to Cohub's backend.
38
+
39
+ From the Work's JavaScript, you create a Cohub client and call APIs the same
40
+ way you would from any other client — **but** the client is pre-wired to obtain
41
+ short-lived access tokens from the Cohub shell (the runtime host) instead of
42
+ requiring the viewer to paste an API key.
43
+
44
+ ```
45
+ ┌─────────────────────────────────────────┐
46
+ │ Cohub shell (host page / iframe parent) │
47
+ │ │
48
+ │ ┌───────────────────────────────────┐ │
49
+ │ │ Your Work (iframe or standalone) │ │
50
+ │ │ │ │
51
+ │ │ createCohubClient() ──► token ──►│──┼──► Cohub API
52
+ │ │ client.context() ◄── identity │ │
53
+ │ │ client.auth.request() ──► consent│ │
54
+ │ └───────────────────────────────────┘ │
55
+ └─────────────────────────────────────────┘
56
+ ```
57
+
58
+ Three runtime-only APIs form the foundation; everything else is standard SDK:
59
+
60
+ | API | What it does | Returns |
61
+ |---|---|---|
62
+ | `client.context()` | Asks the host for the Work's identity | `{ work, space, viewer?, permissions }` or `null` |
63
+ | `client.auth.request({ scopes, reason })` | Shows the viewer a consent dialog; on approval, caches a token carrying those scopes | `true` / `false` |
64
+ | `client.work.commerce.*` | Entitlement checks, credit consumption, purchases | (see Commerce section) |
65
+
66
+ > **Runtime-only constraint.** These three APIs only work inside a **published**
67
+ > Work. Outside that context (a static asset URL, a local `file://` preview,
68
+ > a plain Node script) `context()` returns `null` and `auth.request` / commerce
69
+ > calls fail. Always develop against a published Work.
70
+
71
+ ---
72
+
73
+ ## 2. Two deployment modes: bridge vs broker
74
+
75
+ The SDK auto-detects which mode you are in based on whether the page is inside
76
+ an iframe. You normally do **not** need to set the mode explicitly.
77
+
78
+ ### Bridge mode (default, primary)
79
+
80
+ The Work runs inside a Cohub-hosted iframe (`window.parent !== window`). The
81
+ SDK communicates with the parent window via `postMessage` to request tokens
82
+ and context. This is the normal case when a viewer opens a Work through Cohub.
83
+
84
+ - `client.context()` returns the **real** `space.id`, `work.id`, and current
85
+ permission scopes from the host.
86
+ - `client.auth.request()` triggers an in-shell consent flow (no popup window).
87
+
88
+ ### Broker mode (standalone deployment)
89
+
90
+ The Work is accessed as a standalone page (`window.parent === window`), e.g.
91
+ a direct static-asset URL not wrapped in the Cohub iframe. The SDK opens a
92
+ **popup window** to a Cohub auth-broker page to obtain tokens.
93
+
94
+ - `client.context()` is **answered locally** by the SDK: `space.id` is an
95
+ **empty string `""`**, and `viewerScopes` is **always empty**.
96
+ - `client.auth.request()` opens a popup to
97
+ `${brokerOrigin}/work-auth?work=${workId}`.
98
+
99
+ > **Broker mode requires configuration.** You must pass `work: { brokerOrigin,
100
+ > workId }` to `createCohubClient` for broker mode to activate. Without it, a
101
+ > standalone page gets `ParentBridgeTransport` which has no parent to talk to,
102
+ > so `context()` returns `null`. See [Initialization recipe](#4-initialization-recipe).
103
+
104
+ ### Detecting the mode at runtime
105
+
106
+ ```js
107
+ const ctx = await client.context();
108
+ const isBroker = !ctx?.space?.id; // bridge has a real id; broker is ""
109
+ ```
110
+
111
+ In broker mode you cannot get `spaceId` from `context()`. Resolve it via the
112
+ public Work API (no token needed):
113
+
114
+ ```js
115
+ const isBroker = !ctx?.space?.id;
116
+ let spaceId;
117
+ if (isBroker) {
118
+ const detail = await client.works.get(workId); // public, no auth
119
+ spaceId = detail.work.spaceId;
120
+ } else {
121
+ spaceId = ctx.space.id;
122
+ }
123
+ ```
124
+
125
+ ### Broker mode: user-activation ordering gotcha
126
+
127
+ `HttpTransport` calls `getAccessToken()` on **every** request — including
128
+ public ones like `works.get()`. In broker mode, an uncached token request
129
+ opens a popup, which **consumes the browser's user-activation budget**. If a
130
+ second popup (`auth.request`) follows in the same click, the browser blocks it.
131
+
132
+ **Fix:** call `auth.request()` **before** any other API call that triggers
133
+ `getAccessToken()`. After `auth.request` succeeds, the token is cached in
134
+ `localStorage` and subsequent `getAccessToken()` calls hit the cache — no
135
+ popup.
136
+
137
+ ```js
138
+ // WRONG: works.get() opens a popup, consumes activation, auth.request popup blocked
139
+ const detail = await client.works.get(workId);
140
+ await client.auth.request({ scopes, reason });
141
+
142
+ // RIGHT: auth.request opens the only popup, then works.get() hits token cache
143
+ await client.auth.request({ scopes, reason });
144
+ const detail = await client.works.get(workId);
145
+ ```
146
+
147
+ Bridge mode is unaffected — `getAccessToken()` uses `postMessage` (no popup),
148
+ so ordering does not matter there.
149
+
150
+ ---
151
+
152
+ ## 3. The scope model — read this twice
153
+
154
+ > This is the **single most common source of bugs**. Every 403 you encounter
155
+ > in a Work will almost certainly trace back to a missing scope of the wrong
156
+ > type. Read this section carefully.
157
+
158
+ Cohub Work permissions come in **two disjoint sets**. They do not overlap and
159
+ do not imply each other.
160
+
161
+ ### Work scopes (direct, no user consent)
162
+
163
+ Granted by the publisher **at publish time**. The Work always has them — no
164
+ viewer action needed. These are **read** permissions.
165
+
166
+ ```
167
+ space.view — read space config, list models
168
+ session.view — read sessions, turns, stream generation updates
169
+ file.view — read files / file tree
170
+ taskrun.view — read task run details (used by generation polling!)
171
+ ```
172
+
173
+ Set via `workScopes` when creating/updating a Work.
174
+
175
+ ### Viewer scopes (consent-required, action permissions)
176
+
177
+ Declared by the publisher at publish time as **allowed** (`allowedViewerScopes`),
178
+ but **not active** until the viewer approves them through a consent dialog
179
+ triggered by `client.auth.request()`. These are **action** permissions.
180
+
181
+ ```
182
+ session.prompt.readonly — send read-only prompts (no side effects)
183
+ session.prompt.fullaccess — send prompts with full access (write, create sessions)
184
+ generation.create — create generation tasks (image/video/audio)
185
+ user.space.list — list the viewer's spaces (account-level)
186
+ user.session.list — list the viewer's sessions across all spaces
187
+ user.usage.read — read the viewer's aggregated usage
188
+ ```
189
+
190
+ ### The golden rule
191
+
192
+ > **Read operations need work scopes. Action operations need viewer scopes.
193
+ > They never substitute for each other.**
194
+
195
+ `session.prompt.fullaccess` lets you **send** a prompt, but does **not** let
196
+ you **read** the result — that needs `session.view` (a work scope).
197
+ `generation.create` lets you **create** a generation task, but reading its
198
+ result needs `taskrun.view` (a work scope).
199
+
200
+ ### Complete API → scope mapping
201
+
202
+ | Operation | SDK call | Scope needed | Type |
203
+ |---|---|---|---|
204
+ | Read space config | `space.get()` / `space.getConfig()` | `space.view` | work |
205
+ | List models | `client.models.list()` / `listMultimodal()` | *(none — just authenticated)* | — |
206
+ | Send a prompt | `space.prompt({ content, ... })` | `session.prompt.fullaccess` (or `.readonly`) | viewer |
207
+ | Read turn result | `session.turns.get(turnId)` | `session.view` | work |
208
+ | Stream generation | `session.subscribeGeneration({ state, finalized })` | `session.view` | work |
209
+ | Read file tree | `space.files.tree()` | `file.view` | work |
210
+ | Read file content | `space.files.read(path)` | `file.view` | work |
211
+ | Create generation task | `client.generations.create(request)` | `generation.create` | viewer |
212
+ | **Poll generation result** | `client.generations.wait(taskRunId)` / `createAndWait()` | **`taskrun.view`** | **work** |
213
+ | Read task run detail | `client.tasks.get(taskRunId)` | `taskrun.view` | work |
214
+ | List viewer's spaces | `client.spaces.list()` | `user.space.list` | viewer |
215
+ | List viewer's sessions | `client.user.listSessions()` | `user.session.list` | viewer |
216
+ | Read viewer's usage | `client.user.getUsage()` | `user.usage.read` | viewer |
217
+ | Commerce: entitlements | `client.work.commerce.getEntitlements()` | *(runtime only, no scope)* | — |
218
+ | Commerce: consume credits | `client.work.commerce.consumeCredits()` | *(runtime only, no scope)* | — |
219
+ | Commerce: purchase | `client.work.commerce.purchase()` | *(runtime only, no scope)* | — |
220
+
221
+ ### Minimal scope sets for common Work types
222
+
223
+ **LLM chat Work** (send prompt + read reply):
224
+ - workScopes: `["space.view", "session.view"]`
225
+ - allowedViewerScopes: `["session.prompt.fullaccess"]`
226
+
227
+ **Image generation Work** (create + poll):
228
+ - workScopes: `["space.view", "taskrun.view"]`
229
+ - allowedViewerScopes: `["generation.create"]`
230
+
231
+ **LLM + image generation Work** (the demo):
232
+ - workScopes: `["space.view", "session.view", "taskrun.view"]`
233
+ - allowedViewerScopes: `["session.prompt.fullaccess", "generation.create"]`
234
+
235
+ **File-reader Work** (static, no viewer action):
236
+ - workScopes: `["space.view", "file.view"]`
237
+ - allowedViewerScopes: `[]`
238
+
239
+ ### Checking granted scopes at runtime
240
+
241
+ `client.context()` returns a `permissions` object with three arrays:
242
+
243
+ ```js
244
+ const ctx = await client.context();
245
+ ctx.permissions.scopes // all effective scopes (work + viewer)
246
+ ctx.permissions.workScopes // work scopes granted at publish time
247
+ ctx.permissions.viewerScopes // viewer scopes the current viewer has approved
248
+ ```
249
+
250
+ To check whether a **viewer** scope is already granted (to skip re-requesting):
251
+
252
+ ```js
253
+ function hasViewerScope(ctx, scope) {
254
+ return (ctx?.permissions?.viewerScopes ?? []).includes(scope);
255
+ }
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 4. Initialization recipe
261
+
262
+ ### No-build HTML (CDN import)
263
+
264
+ Works are typically single HTML files with no bundler. Import the SDK from an
265
+ ESM CDN:
266
+
267
+ ```js
268
+ import { createCohubClient } from "https://esm.sh/@neta-art/cohub@2";
269
+ ```
270
+
271
+ > Pin to a major version (`@2`) or an exact version (`@2.6.0`) to avoid
272
+ > breaking changes. Check `npm view @neta-art/cohub version` for the latest.
273
+
274
+ ### Environment detection — critical
275
+
276
+ The SDK defaults to **production**. A Work running on a dev/staging host
277
+ (e.g. `dev.cohub.run`, a `/dev/` path prefix) **must** pass `env: "dev"`
278
+ explicitly — browsers do not inject `ENV` like Node does. If you omit this,
279
+ your Work will call the production API while the runtime host expects dev,
280
+ causing silent auth failures.
281
+
282
+ ```js
283
+ const isDevWork =
284
+ location.pathname.startsWith("/dev/") ||
285
+ location.hostname.includes("dev");
286
+
287
+ const client = createCohubClient({
288
+ env: isDevWork ? "dev" : "prod",
289
+ });
290
+ ```
291
+
292
+ ### Broker mode configuration (standalone pages only)
293
+
294
+ If the Work may be accessed as a standalone page (not inside the Cohub
295
+ iframe), pass the `work` option so the SDK can fall back to broker mode:
296
+
297
+ ```js
298
+ const client = createCohubClient({
299
+ env: isDevWork ? "dev" : "prod",
300
+ work: {
301
+ brokerOrigin: isDevWork ? "https://dev.cohub.run" : "https://cohub.run",
302
+ workId: "<your-published-work-id>",
303
+ },
304
+ });
305
+ ```
306
+
307
+ When inside the Cohub iframe, the SDK auto-detects bridge mode and ignores
308
+ broker config. When standalone, it uses broker mode. **One codebase, both
309
+ deployments.**
310
+
311
+ ### Standard initialization sequence
312
+
313
+ ```js
314
+ // 1. Create client (env is mandatory in the browser)
315
+ const client = createCohubClient({ env: isDevWork ? "dev" : "prod" });
316
+
317
+ // 2. Get runtime context
318
+ const ctx = await client.context();
319
+ if (!ctx?.space?.id) {
320
+ // Not in a Work runtime (or broker mode — see §2)
321
+ throw new Error("Not running inside a published Work.");
322
+ }
323
+
324
+ // 3. Obtain the space client for API calls
325
+ const spaceId = ctx.space.id;
326
+ const space = client.space(spaceId);
327
+
328
+ // 4. Request viewer scopes (from a user gesture, e.g. button click)
329
+ const ok = await client.auth.request({
330
+ scopes: ["session.prompt.fullaccess", "generation.create"],
331
+ reason: "This Work needs to send prompts and generate images.",
332
+ });
333
+ if (!ok) {
334
+ // Viewer denied — handle gracefully
335
+ }
336
+
337
+ // 5. Call capabilities
338
+ const result = await space.prompt({ content: [{ type: "text", text: "Hello" }] });
339
+ ```
340
+
341
+ > **`auth.request` must be called from a user gesture** (click handler).
342
+ Browsers block popups (broker mode) and some consent flows (bridge mode)
343
+ when triggered programmatically without user activation. Do not call it on
344
+ page load.
345
+
346
+ ---
347
+
348
+ ## 5. Capability reference
349
+
350
+ Each recipe below shows the exact code pattern and scope requirements.
351
+ Assume `client` and `space` are already initialized per [§4](#4-initialization-recipe).
352
+
353
+ ### LLM chat (`space.prompt` + `subscribeGeneration`)
354
+
355
+ **Scopes:** viewer `session.prompt.fullaccess` (to send) + work `session.view` (to read/stream).
356
+
357
+ `space.prompt()` is **asynchronous** — it returns immediately with a turn
358
+ whose `assistantText` is `null`. You must either stream the reply via
359
+ `subscribeGeneration` or poll `turns.get()`.
360
+
361
+ ```js
362
+ // Send a prompt (creates or continues a session)
363
+ const result = await space.prompt({
364
+ content: [{ type: "text", text: "Describe a shiba inu on Mars." }],
365
+ sessionId: null, // null → creates a new session; pass an id to continue
366
+ model: "gpt-5.5", // optional; omit for default
367
+ intent: "followup", // "followup" | "steer" | "compact"
368
+ });
369
+ const sessionId = result.session.id;
370
+ const turnId = result.turn.id;
371
+
372
+ // --- Option A: stream the reply (preferred) ---
373
+ // Requires work scope: session.view
374
+ const stop = space.session(sessionId).subscribeGeneration({
375
+ state(event) {
376
+ // Partial text as it streams in
377
+ const text = (event.state?.contentBlocks ?? [])
378
+ .filter(b => b.type === "text")
379
+ .map(b => b.text)
380
+ .join("");
381
+ console.log("streaming:", text);
382
+ },
383
+ finalized(event) {
384
+ const turn = event.turn;
385
+ const reply = turn.assistantText
386
+ ?? (turn.assistantContent ?? []).filter(b => b.type === "text").map(b => b.text).join("");
387
+ console.log("final:", reply);
388
+ },
389
+ error(event) {
390
+ console.error("stream error:", event);
391
+ },
392
+ });
393
+ // Call stop() to unsubscribe when done.
394
+
395
+ // --- Option B: poll for the reply (fallback) ---
396
+ // Also requires work scope: session.view
397
+ async function waitForTurn(sessionId, turnId) {
398
+ while (true) {
399
+ const { turn } = await space.session(sessionId).turns.get(turnId);
400
+ if (turn.status === "completed") return turn;
401
+ if (turn.status === "failed") throw new Error(turn.errorMessage || "failed");
402
+ await new Promise(r => setTimeout(r, 1500));
403
+ }
404
+ }
405
+ const turn = await waitForTurn(sessionId, turnId);
406
+ const reply = turn.assistantText;
407
+ ```
408
+
409
+ **Turn status values:** `"pending" | "running" | "completed" | "failed"`.
410
+
411
+ **Turn reply fields:** `turn.assistantText` (string | null) and
412
+ `turn.assistantContent` (ContentBlock[] | null). Always check both —
413
+ `assistantText` is a convenience; `assistantContent` is the source of truth.
414
+
415
+ > **Do not silently swallow `subscribeGeneration` errors.** If the work scope
416
+ `session.view` is missing, the WebSocket subscription fails. If you catch and
417
+ ignore it, your code silently degrades to polling — which will also 403.
418
+ Surface the error so you can diagnose the missing scope.
419
+
420
+ ### Image / media generation (`generations.createAndWait`)
421
+
422
+ **Scopes:** viewer `generation.create` (to create) + work `taskrun.view` (to poll).
423
+
424
+ `createAndWait` is a convenience that calls `create` then `wait` (polls
425
+ `GET /api/tasks/{id}`). **Both scopes are required** — `generation.create`
426
+ for the create step, `taskrun.view` for the poll step. Missing `taskrun.view`
427
+ is the #1 cause of "generation creates but never returns" bugs.
428
+
429
+ ```js
430
+ const result = await client.generations.createAndWait(
431
+ {
432
+ spaceId,
433
+ model: "gpt-image-2", // model id from models.listMultimodal()
434
+ content: [{ type: "text", text: "A cat on the moon, cartoon style" }],
435
+ parameters: { // optional, model-specific
436
+ size: "1024x1024",
437
+ // quality: "auto", // gpt-image-2 supports quality
438
+ },
439
+ },
440
+ {
441
+ onPoll: (detail) => console.log("status:", detail.run.status),
442
+ // intervalMs: 1500, // optional poll interval
443
+ // timeoutMs: 30 * 60 * 1000, // optional timeout (default 30 min)
444
+ },
445
+ );
446
+
447
+ // Extract the image URL from the output blocks
448
+ const image = (result.output ?? []).find(
449
+ b => b.type === "image" && b.source?.url
450
+ );
451
+ const imageUrl = image?.source?.url;
452
+ ```
453
+
454
+ **Output block types:** `text`, `image`, `video`, `audio`. Each media block has
455
+ a `source` of `{ type: "url", url }` or `{ type: "base64", mediaType, data }`.
456
+
457
+ **Two-step alternative** (if you need the `taskRunId` immediately):
458
+
459
+ ```js
460
+ const created = await client.generations.create(request);
461
+ // created.taskRunId — generation task is queued
462
+ const result = await client.generations.wait(created.taskRunId, { onPoll });
463
+ ```
464
+
465
+ ### Model listing (`models.list` / `models.listMultimodal`)
466
+
467
+ **Scopes:** none — only requires a valid authenticated token (any token, no
468
+ specific scope). Returns 401 without a token, but never 403.
469
+
470
+ Call after initialization (after `context()` succeeds, so a token exists):
471
+
472
+ ```js
473
+ // All models grouped by provider
474
+ const catalog = await client.models.list();
475
+ // catalog: { cohub: [...], openai: [...], ... }
476
+
477
+ // Generation-capable models only (for image/video/audio generation)
478
+ const { models } = await client.models.listMultimodal();
479
+ // models: [{ model, title, description, ... }, ...]
480
+ ```
481
+
482
+ Use `listMultimodal()` to populate a model picker for generation. Each entry's
483
+ `model` field is the id you pass to `generations.createAndWait({ model })`.
484
+
485
+ ### File reads (`space.files`)
486
+
487
+ **Scopes:** work `file.view` (read) + `space.view` (often needed for the space context).
488
+
489
+ ```js
490
+ // List the file tree
491
+ const tree = await space.files.tree();
492
+ // tree: nested file/directory entries
493
+
494
+ // Read a file (returns an HTTP Response — .text() / .blob() / .arrayBuffer())
495
+ const response = await space.files.read("path/to/file.txt");
496
+ const text = await response.text();
497
+
498
+ // Read multiple files at once
499
+ const files = await space.files.readMany(["a.txt", "b.json"]);
500
+ ```
501
+
502
+ ### Account-level data (`spaces.list` / `user.listSessions` / `user.getUsage`)
503
+
504
+ **Scopes:** viewer `user.space.list` / `user.session.list` / `user.usage.read`.
505
+
506
+ These access the **viewer's** account-level data across all their spaces — not
507
+ the Work's own space. Each requires a separate viewer scope.
508
+
509
+ ```js
510
+ // List the viewer's spaces — needs user.space.list
511
+ await client.auth.request({
512
+ scopes: ["user.space.list"],
513
+ reason: "Show your space list.",
514
+ });
515
+ const spaces = await client.spaces.list();
516
+
517
+ // List sessions across all the viewer's spaces — needs user.session.list
518
+ await client.auth.request({
519
+ scopes: ["user.session.list"],
520
+ reason: "List your recent sessions.",
521
+ });
522
+ const { sessions } = await client.user.listSessions({ limit: 20 });
523
+
524
+ // Read aggregated usage — needs user.usage.read
525
+ await client.auth.request({
526
+ scopes: ["user.usage.read"],
527
+ reason: "Show your usage summary.",
528
+ });
529
+ const usage = await client.user.getUsage(30); // last 30 days
530
+ ```
531
+
532
+ ### Commerce (`work.commerce`)
533
+
534
+ **Scopes:** none — runs inside the Work runtime, no scope needed. Only works
535
+ in a published Work.
536
+
537
+ ```js
538
+ // Check entitlements and credit balance in one call
539
+ const { entitlements, credits } = await client.work.commerce.getEntitlements();
540
+
541
+ // Feature unlock: purchase if not entitled
542
+ const unlocked = entitlements.some(e => e.benefitKey === "space_pro" && e.enabled);
543
+ if (!unlocked) {
544
+ await client.work.commerce.purchase({ productKey: "pro_unlock" });
545
+ // purchase() redirects to checkout; after return, re-check entitlements
546
+ }
547
+
548
+ // Credit consumption for a metered action
549
+ const result = await client.work.commerce.consumeCredits({
550
+ amount: 10,
551
+ operationId: crypto.randomUUID(), // idempotency key
552
+ reason: "Export high-res image",
553
+ });
554
+ if (result.status === "insufficient") {
555
+ await client.work.commerce.purchase({ productKey: "credit_pack" });
556
+ }
557
+
558
+ // After checkout return, query the order
559
+ const checkoutState = await client.work.commerce.getCheckoutState();
560
+ if (checkoutState.orderId) {
561
+ const { order } = await client.work.commerce.getOrder(checkoutState.orderId);
562
+ }
563
+ ```
564
+
565
+ ---
566
+
567
+ ## 6. Complete working example
568
+
569
+ A no-build HTML Work that tests LLM chat and image generation. This is the
570
+ exact pattern that was verified end-to-end. Adapt it to your needs.
571
+
572
+ > **Publish this Work with:**
573
+ > - workScopes: `["space.view", "session.view", "taskrun.view"]`
574
+ > - allowedViewerScopes: `["session.prompt.fullaccess", "generation.create"]`
575
+ >
576
+ > See [§8](#8-publishing-a-work-apisdk) for the publish API call.
577
+
578
+ ### `index.html`
579
+
580
+ ```html
581
+ <!DOCTYPE html>
582
+ <html lang="en">
583
+ <head>
584
+ <meta charset="UTF-8" />
585
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
586
+ <title>Cohub SDK Demo</title>
587
+ <link rel="stylesheet" href="style.css" />
588
+ </head>
589
+ <body>
590
+ <div class="container">
591
+ <h1>Cohub SDK Demo</h1>
592
+
593
+ <section class="card">
594
+ <h2>1. Context</h2>
595
+ <button id="btn-context" class="btn">Get context</button>
596
+ <pre id="output-context" class="output"></pre>
597
+ </section>
598
+
599
+ <section class="card">
600
+ <h2>2. Authorize</h2>
601
+ <button id="btn-auth" class="btn">Request viewer scopes</button>
602
+ <pre id="output-auth" class="output"></pre>
603
+ </section>
604
+
605
+ <section class="card">
606
+ <h2>3. LLM chat</h2>
607
+ <div id="chat-log" class="chat-log"></div>
608
+ <textarea id="chat-input" rows="2">Say hello in one sentence.</textarea>
609
+ <button id="btn-chat" class="btn">Send</button>
610
+ <pre id="output-chat" class="output"></pre>
611
+ </section>
612
+
613
+ <section class="card">
614
+ <h2>4. Image generation</h2>
615
+ <textarea id="img-prompt" rows="3">A cat on the moon, cartoon style</textarea>
616
+ <button id="btn-img" class="btn">Generate</button>
617
+ <div id="img-result"></div>
618
+ <pre id="output-img" class="output"></pre>
619
+ </section>
620
+ </div>
621
+ <script type="module" src="app.js"></script>
622
+ </body>
623
+ </html>
624
+ ```
625
+
626
+ ### `app.js`
627
+
628
+ ```js
629
+ import { createCohubClient } from "https://esm.sh/@neta-art/cohub@2";
630
+
631
+ // --- Environment detection (critical: browsers don't inject ENV) ---
632
+ const isDevWork =
633
+ location.pathname.startsWith("/dev/") ||
634
+ location.hostname.includes("dev");
635
+
636
+ const client = createCohubClient({
637
+ env: isDevWork ? "dev" : "prod",
638
+ });
639
+
640
+ const REQUIRED_SCOPES = ["generation.create", "session.prompt.fullaccess"];
641
+
642
+ let space = null;
643
+ let spaceId = null;
644
+ let sessionId = null;
645
+
646
+ const $ = (id) => document.getElementById(id);
647
+
648
+ function setOutput(el, data) {
649
+ el.textContent = typeof data === "object" ? JSON.stringify(data, null, 2) : String(data);
650
+ }
651
+
652
+ function log(el, msg) {
653
+ el.textContent += `[${new Date().toLocaleTimeString()}] ${msg}\n`;
654
+ }
655
+
656
+ // --- Runtime initialization ---
657
+ async function ensureRuntime(outEl) {
658
+ const ctx = await client.context();
659
+ if (!ctx?.space?.id) {
660
+ throw new Error("Not running inside a published Work runtime.");
661
+ }
662
+ spaceId = ctx.space.id;
663
+ space = client.space(spaceId);
664
+ return ctx;
665
+ }
666
+
667
+ // --- Viewer scope management ---
668
+ function getViewerScopes(ctx) {
669
+ return ctx?.permissions?.viewerScopes ?? [];
670
+ }
671
+
672
+ function missingViewerScopes(ctx, scopes) {
673
+ const have = new Set(getViewerScopes(ctx));
674
+ return scopes.filter((s) => !have.has(s));
675
+ }
676
+
677
+ async function ensureViewerScopes(scopes, reason, outEl) {
678
+ const ctx = await ensureRuntime(outEl);
679
+ const missing = missingViewerScopes(ctx, scopes);
680
+ if (missing.length === 0) {
681
+ log(outEl, `Already have scopes: [${scopes.join(", ")}]`);
682
+ return true;
683
+ }
684
+ log(outEl, `Requesting scopes: [${missing.join(", ")}]...`);
685
+ const ok = await client.auth.request({ scopes, reason });
686
+ log(outEl, ok ? "Authorized." : "Authorization denied.");
687
+ return ok;
688
+ }
689
+
690
+ // --- LLM chat (space.prompt + subscribeGeneration) ---
691
+ function extractText(blocks) {
692
+ return (blocks ?? [])
693
+ .filter((b) => b.type === "text" && typeof b.text === "string")
694
+ .map((b) => b.text)
695
+ .join("");
696
+ }
697
+
698
+ function waitForTurn(sid, turnId, onStream) {
699
+ return new Promise((resolve, reject) => {
700
+ let done = false;
701
+ let stop = null;
702
+
703
+ const finish = (fn) => {
704
+ if (done) return;
705
+ done = true;
706
+ if (stop) try { stop(); } catch {}
707
+ fn();
708
+ };
709
+
710
+ // Primary path: stream via WebSocket (needs work scope: session.view)
711
+ try {
712
+ stop = space.session(sid).subscribeGeneration({
713
+ state: (event) => {
714
+ const text = extractText(event.state?.contentBlocks);
715
+ if (text) onStream?.(text);
716
+ },
717
+ finalized: (event) => finish(() => resolve(event.turn)),
718
+ error: (event) => finish(() =>
719
+ reject(new Error(event?.rawEvent?.payload?.message || "stream error"))),
720
+ });
721
+ } catch (err) {
722
+ console.warn("subscribeGeneration failed:", err);
723
+ }
724
+
725
+ // Fallback: poll (also needs session.view — if missing, both paths 403)
726
+ const poll = async () => {
727
+ try {
728
+ const { turn } = await space.session(sid).turns.get(turnId);
729
+ if (turn.assistantText) onStream?.(turn.assistantText);
730
+ if (turn.status === "completed") finish(() => resolve(turn));
731
+ if (turn.status === "failed" || turn.status === "cancelled") {
732
+ finish(() => reject(new Error(turn.errorMessage || "failed")));
733
+ }
734
+ } catch (err) {
735
+ // Don't silently swallow — surface 403 (missing session.view)
736
+ console.error("poll error:", err);
737
+ }
738
+ };
739
+ const interval = setInterval(poll, 2000);
740
+ poll();
741
+ setTimeout(() => finish(() => reject(new Error("timeout"))), 120000);
742
+ // Note: in production, clear the interval in finish()
743
+ });
744
+ }
745
+
746
+ async function chat(text, outEl) {
747
+ const result = await space.prompt({
748
+ content: [{ type: "text", text }],
749
+ sessionId: sessionId || null,
750
+ intent: "followup",
751
+ });
752
+ sessionId = result.session.id;
753
+ const turn = await waitForTurn(sessionId, result.turn.id);
754
+ return turn.assistantText || extractText(turn.assistantContent) || "(empty)";
755
+ }
756
+
757
+ // --- Image generation (generations.createAndWait) ---
758
+ async function generateImage(prompt, outEl) {
759
+ const result = await client.generations.createAndWait(
760
+ {
761
+ spaceId,
762
+ model: "gpt-image-2",
763
+ content: [{ type: "text", text: prompt }],
764
+ parameters: { size: "1024x1024" },
765
+ },
766
+ { onPoll: (d) => log(outEl, `poll: ${d.run.status}`) },
767
+ );
768
+ const image = (result.output ?? []).find(
769
+ (b) => b.type === "image" && b.source?.url,
770
+ );
771
+ return image?.source?.url ?? null;
772
+ }
773
+
774
+ // --- Event handlers (auth.request must be in a user gesture) ---
775
+ $("btn-context").addEventListener("click", async () => {
776
+ const out = $("output-context");
777
+ out.textContent = "";
778
+ try {
779
+ const ctx = await client.context();
780
+ setOutput(out, {
781
+ "work.id": ctx?.work?.id,
782
+ "space.id": ctx?.space?.id,
783
+ permissions: ctx?.permissions,
784
+ });
785
+ } catch (err) { log(out, err.message); }
786
+ });
787
+
788
+ $("btn-auth").addEventListener("click", async () => {
789
+ const out = $("output-auth");
790
+ out.textContent = "";
791
+ const ok = await ensureViewerScopes(
792
+ REQUIRED_SCOPES,
793
+ "This demo needs to send prompts and generate images.",
794
+ out,
795
+ );
796
+ if (ok) log(out, "Ready to use capabilities.");
797
+ });
798
+
799
+ $("btn-chat").addEventListener("click", async () => {
800
+ const out = $("output-chat");
801
+ out.textContent = "";
802
+ const text = $("chat-input").value.trim();
803
+ if (!text) return;
804
+ try {
805
+ await ensureRuntime(out);
806
+ const ok = await ensureViewerScopes(
807
+ ["session.prompt.fullaccess"],
808
+ "LLM chat needs session.prompt.fullaccess.",
809
+ out,
810
+ );
811
+ if (!ok) return;
812
+ const reply = await chat(text, out);
813
+ log(out, `Reply: ${reply}`);
814
+ } catch (err) { log(out, err.message); }
815
+ });
816
+
817
+ $("btn-img").addEventListener("click", async () => {
818
+ const out = $("output-img");
819
+ out.textContent = "";
820
+ const prompt = $("img-prompt").value.trim();
821
+ if (!prompt) return;
822
+ try {
823
+ await ensureRuntime(out);
824
+ const ok = await ensureViewerScopes(
825
+ ["generation.create"],
826
+ "Image generation needs generation.create. taskrun.view comes from workScopes.",
827
+ out,
828
+ );
829
+ if (!ok) return;
830
+ const url = await generateImage(prompt, out);
831
+ if (url) {
832
+ $("img-result").innerHTML = `<img src="${url}" style="max-width:100%" />`;
833
+ }
834
+ log(out, "Done.");
835
+ } catch (err) { log(out, err.message); }
836
+ });
837
+
838
+ // Auto-fetch context on load (does not require auth)
839
+ (async () => {
840
+ try {
841
+ const ctx = await client.context();
842
+ if (ctx) {
843
+ setOutput($("output-context"), {
844
+ "work.id": ctx.work?.id,
845
+ "space.id": ctx.space?.id,
846
+ permissions: ctx.permissions,
847
+ });
848
+ }
849
+ } catch {}
850
+ })();
851
+ ```
852
+
853
+ ---
854
+
855
+ ## 7. Common pitfalls checklist
856
+
857
+ Before publishing your Work, verify each item:
858
+
859
+ - [ ] **Environment**: passed `env: "dev"` (or `"prod"`) explicitly — the SDK
860
+ defaults to prod and browsers don't inject `ENV`.
861
+ - [ ] **Work scopes include all read operations**: `space.view`, `session.view`
862
+ (for LLM reply reads), `taskrun.view` (for generation polling), `file.view`
863
+ (for file reads). Missing any of these → 403 on reads.
864
+ - [ ] **Viewer scopes include all action operations**: `session.prompt.fullaccess`
865
+ (or `.readonly`) for prompts, `generation.create` for generation.
866
+ - [ ] **`session.prompt.fullaccess` does NOT include `session.view`** — they
867
+ are separate. Sending a prompt succeeds but reading the reply 403s without
868
+ `session.view`.
869
+ - [ ] **`generation.create` does NOT include `taskrun.view`** — creating a
870
+ generation task succeeds but polling the result 403s without `taskrun.view`.
871
+ - [ ] **`auth.request()` is called from a user gesture** (button click), not
872
+ on page load.
873
+ - [ ] **`subscribeGeneration` errors are not silently swallowed** — if the
874
+ stream fails, surface it; a silent fallback to polling will also 403 if
875
+ `session.view` is missing.
876
+ - [ ] **Broker mode**: if the Work may be accessed standalone, pass
877
+ `work: { brokerOrigin, workId }` and call `auth.request()` before any other
878
+ API call (to avoid user-activation exhaustion).
879
+ - [ ] **Space has a slug and owner has a username** before publishing — the
880
+ API rejects Works when either is missing.
881
+ - [ ] **Model ids are not hardcoded** — use `client.models.listMultimodal()`
882
+ to fetch available models dynamically (requires auth but no scope).
883
+
884
+ ---
885
+
886
+ ## 8. Publishing a Work (API/SDK)
887
+
888
+ Before creating a Work through the API, ensure the owner has a username and
889
+ the Space has a slug. The API rejects Works when either public identity part
890
+ is missing.
891
+
892
+ ```js
893
+ // Create a single-file Work (HTML file)
894
+ await client.works.create({
895
+ spaceId,
896
+ slug: "my-html-demo",
897
+ status: "published",
898
+ targetType: "file",
899
+ targetRef: "demo/index.html",
900
+ workScopes: ["space.view", "session.view", "taskrun.view"],
901
+ allowedViewerScopes: ["session.prompt.fullaccess", "generation.create"],
902
+ });
903
+
904
+ // Create a directory Work (must contain index.html)
905
+ await client.works.create({
906
+ spaceId,
907
+ slug: "my-site",
908
+ status: "published",
909
+ targetType: "directory",
910
+ targetRef: "site",
911
+ workScopes: ["space.view", "session.view", "taskrun.view", "file.view"],
912
+ allowedViewerScopes: ["session.prompt.fullaccess", "generation.create"],
913
+ });
914
+
915
+ // Create a port Work (sandbox dev server)
916
+ await client.works.create({
917
+ spaceId,
918
+ slug: "live-preview",
919
+ status: "published",
920
+ targetType: "port",
921
+ targetRef: "5173",
922
+ workScopes: ["space.view"],
923
+ allowedViewerScopes: [],
924
+ });
925
+ ```
926
+
927
+ `targetRef` is a path **relative to the Space filesystem root** (not a local
928
+ path). For file Works, the target must be an HTML file (`.html`/`.htm`).
929
+
930
+ Update the published version from the current target:
931
+
932
+ ```js
933
+ await client.works.publishVersion(workId);
934
+ ```
935
+
936
+ Other SDK methods: `works.get(workId)`, `works.getBySlug(username, spaceSlug,
937
+ workSlug)`, `works.listBySpace(spaceId)`, `works.update(workId, input)`,
938
+ `works.delete(workId)`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neta-art/cohub",
3
- "version": "2.6.0",
3
+ "version": "2.7.1",
4
4
  "description": "Cohub SDK for spaces, sessions, checkpoints, and realtime agent collaboration.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -49,7 +49,8 @@
49
49
  "types": "./dist/index.d.ts",
50
50
  "files": [
51
51
  "dist",
52
- "README.md"
52
+ "README.md",
53
+ "docs"
53
54
  ],
54
55
  "devDependencies": {
55
56
  "tsdown": "^0.22.1",