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