@neta-art/cohub 1.16.1 → 1.18.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.
@@ -336,10 +336,61 @@ type GenerateRequest = {
336
336
  metadata?: Record<string, unknown>;
337
337
  };
338
338
  //#endregion
339
+ //#region ../protocol/src/generation/policy.d.ts
340
+ type GenerationPolicy = {
341
+ version: 1;
342
+ mode: "auto" | "limited";
343
+ models?: GenerationModelPolicy[];
344
+ };
345
+ type GenerationModelPolicy = {
346
+ model: string;
347
+ /**
348
+ * Generic constraints keyed by generation declaration parameter name.
349
+ * Missing parameters are not restricted by policy.
350
+ */
351
+ parameters?: Record<string, GenerationParameterConstraint>;
352
+ };
353
+ type GenerationParameterConstraint = {
354
+ kind: "enum";
355
+ values: Array<string | number | boolean>;
356
+ } | {
357
+ kind: "number";
358
+ min?: number;
359
+ max?: number;
360
+ values?: number[];
361
+ } | {
362
+ kind: "integer";
363
+ min?: number;
364
+ max?: number;
365
+ values?: number[];
366
+ } | {
367
+ kind: "boolean";
368
+ value?: boolean;
369
+ };
370
+ declare class GenerationPolicyError extends Error {
371
+ constructor(message: string);
372
+ }
373
+ type EnvLike = Record<string, string | undefined>;
374
+ type PublicDeclaration = Omit<GenerationModelDeclaration, "adapter">;
375
+ declare function normalizeGenerationPolicy(value: unknown): GenerationPolicy | null;
376
+ declare function encodeGenerationPolicy(policy: GenerationPolicy): string;
377
+ declare function decodeGenerationPolicy(value: string): GenerationPolicy | null;
378
+ declare function parseGenerationPolicyFromEnv(env: EnvLike): GenerationPolicy | null;
379
+ declare function getAllowedGenerationModelIds(policy: GenerationPolicy | null): string[] | null;
380
+ declare function findGenerationModelPolicy(policy: GenerationPolicy | null, model: string): GenerationModelPolicy | null;
381
+ declare function assertGenerationRequestAllowedByPolicy(input: {
382
+ policy: GenerationPolicy | null;
383
+ model: string;
384
+ parameters?: Record<string, unknown>;
385
+ }): void;
386
+ declare function filterGenerationDeclarationsByPolicy<T extends PublicDeclaration>(declarations: T[], policy: GenerationPolicy | null): T[];
387
+ //#endregion
339
388
  //#region ../protocol/src/generation/index.d.ts
340
389
  declare const GENERATION_TASK_TYPE: "generation";
341
390
  type CreateGenerationTaskRequest = {
342
391
  spaceId: string;
392
+ sessionId?: string | null;
393
+ turnId?: string | null;
343
394
  model: string;
344
395
  content: GenerationContentBlock[];
345
396
  parameters?: Record<string, unknown>;
@@ -838,6 +889,7 @@ type CreateSpacePromptInput = {
838
889
  model?: string | null;
839
890
  provider?: string | null;
840
891
  clientMessageId?: string | null;
892
+ generationPolicy?: GenerationPolicy | null;
841
893
  schedule?: {
842
894
  mode?: "immediate";
843
895
  } | {
@@ -904,6 +956,7 @@ type TaskRunRecord = {
904
956
  attemptCount: number;
905
957
  spaceId: string | null;
906
958
  sessionId: string | null;
959
+ turnId: string | null;
907
960
  userUuid: string | null;
908
961
  scheduledAt: string | null;
909
962
  startedAt: string | null;
@@ -1300,7 +1353,7 @@ type GenerationStreamIntermediateMessage = {
1300
1353
  };
1301
1354
  type GenerationStreamStateEvent = {
1302
1355
  type: "state";
1303
- source: "snapshot" | "patch" | "progress";
1356
+ source: "patch";
1304
1357
  state: SessionPatchState;
1305
1358
  messageId: string | null;
1306
1359
  messageOrdinal: number | null;
@@ -1329,7 +1382,7 @@ type GenerationStreamErrorEvent = {
1329
1382
  };
1330
1383
  type GenerationStreamOutOfSyncEvent = {
1331
1384
  type: "out_of_sync";
1332
- source: "snapshot" | "patch";
1385
+ source: "patch";
1333
1386
  reason: "duplicate" | "version_mismatch" | "invalid";
1334
1387
  state: SessionPatchState;
1335
1388
  rawEvent: WebsocketEventPayload;
@@ -1353,7 +1406,7 @@ declare class SessionGenerationStreamClient {
1353
1406
  private messageId;
1354
1407
  private messageOrdinal;
1355
1408
  private intermediateMessages;
1356
- private progressState;
1409
+ private patchState;
1357
1410
  constructor(websocketClient: WebsocketClient | null, spaceId: string, sessionId: string);
1358
1411
  subscribe(handlers: GenerationStreamSubscriptionHandlers): () => void;
1359
1412
  private emit;
@@ -1362,9 +1415,7 @@ declare class SessionGenerationStreamClient {
1362
1415
  private addIntermediateMessage;
1363
1416
  private handleAppliedState;
1364
1417
  private prepareMessageBoundary;
1365
- private handleSnapshot;
1366
1418
  private handlePatch;
1367
- private handleProgress;
1368
1419
  private handlePersisted;
1369
1420
  private handleFinalized;
1370
1421
  private handleEvent;
@@ -1397,28 +1448,22 @@ declare class PublicInviteApi {
1397
1448
  //#endregion
1398
1449
  //#region src/apis/spaces.d.ts
1399
1450
  type SessionSubscriptionHandlers = {
1400
- patch?: (event: WebsocketEventPayload) => void;
1401
- /**
1402
- * @deprecated Use `session.subscribeGeneration({ state })` for normalized
1403
- * snapshot/patch/progress generation state.
1404
- */
1405
- patchState?: (result: SessionPatchApplyResult) => void; /** @deprecated Use `session.subscribeGeneration({ state })`. */
1406
- snapshot?: (event: WebsocketEventPayload) => void; /** @deprecated Legacy progress events are normalized by `subscribeGeneration`. */
1407
- progress?: (event: WebsocketEventPayload) => void; /** @deprecated Use `session.subscribeGeneration({ commit, finalized })`. */
1408
- final?: (event: WebsocketEventPayload) => void;
1451
+ patch?: (event: WebsocketEventPayload) => void; /** @deprecated Use `session.subscribeGeneration({ state })`. */
1452
+ patchState?: (result: SessionPatchApplyResult) => void;
1409
1453
  turnUpdated?: (event: WebsocketEventPayload) => void;
1410
1454
  turnFinalized?: (event: WebsocketEventPayload) => void;
1411
1455
  error?: (event: WebsocketEventPayload) => void;
1412
1456
  persisted?: (event: WebsocketEventPayload) => void;
1413
1457
  event?: (event: WebsocketEventPayload) => void;
1414
1458
  };
1415
- type SessionEventName = "turn.patch" | "turn.snapshot" | "turn.progress" | "turn.final" | "turn.updated" | "turn.error" | "message.persisted";
1416
- type SpaceEventName = SessionEventName | "ports.changed" | "event";
1459
+ type SessionEventName = "created" | "updated" | "turn.created" | "turn.patch" | "turn.updated" | "turn.finalized" | "turn.error" | "message.persisted";
1460
+ type SpaceEventName = SessionEventName | "fs.changed" | "ports.changed" | "task.created" | "task.updated" | "event";
1417
1461
  type SessionSendMessageInput = {
1418
1462
  content: ContentBlock[];
1419
1463
  model?: string;
1420
1464
  provider?: string;
1421
1465
  clientMessageId?: string;
1466
+ generationPolicy?: GenerationPolicy | null;
1422
1467
  };
1423
1468
  declare class SpacesApi {
1424
1469
  private readonly transport;
@@ -1861,4 +1906,4 @@ declare class CohubHttpClient {
1861
1906
  }
1862
1907
  declare const createHttpClient: (options?: CohubClientOptions) => CohubHttpClient;
1863
1908
  //#endregion
1864
- export { CreateInvitationInput as $, SpaceFsReadFilesInput as $t, SessionPatchStatus as A, TaskRunRecord as An, SessionTurnWindowResponse as At, GenerationsApi as B, ChannelConfig as Bn, SpaceCreateResponse as Bt, SessionGenerationStreamClient as C, SpaceSandboxAutoDestroyPolicy as Cn, SessionMessagesPaginatedResponse as Ct, SessionPatchApplyResult as D, SpaceUsageResponse as Dn, SessionTurnResponse as Dt, SessionPatchApplyInput as E, SpaceUsageHourlyStat as En, SessionTurnIndexResponse as Et, CreatePublicAssetUploadResponse as F, CreateGenerationTaskResponse as Fn, SpaceChannelBindingInput as Ft, BillingCreditExpiryGroup as G, SessionTurnIndexItem as Gn, SpaceFsCreateUploadResponse as Gt, ChannelsApi as H, MessageRecord as Hn, SpaceFsCompleteUploadInput as Ht, PublicAssetPurpose as I, GenerationTaskResult as In, SpaceCheckpointDetailResponse as It, BillingCreditUnit as J, Fetch as Jn, SpaceFsFileKind as Jt, BillingCreditGrantStatus as K, SessionTurnRecord as Kn, SpaceFsEncoding as Kt, PublicAssetsApi as L, ListGenerationModelsResponse as Ln, SpaceConfig as Lt, SessionAccessApi as M, UserRulesResponse as Mn, SpaceAccess as Mt, SearchApi as N, UserSshKey as Nn, SpaceAccessPolicy as Nt, SessionPatchReducer as O, SpaceUsageSummary as On, SessionTurnSignedUrlsResponse as Ot, CreatePublicAssetUploadInput as P, CreateGenerationTaskRequest as Pn, SpaceBootstrapSource as Pt, CheckpointRecord as Q, SpaceFsReadFilesError as Qt, PromptsApi as R, PublicGenerationDeclaration as Rn, SpaceConfigInput as Rt, GenerationStreamTurnUpdatedEvent as S, SpaceRole as Sn, SessionMessageResponse as St, parseAssistantMessageCommit as T, SpaceSessionsResponse as Tn, SessionRecord as Tt, AcceptInvitationResponse as U, SessionForkRecord as Un, SpaceFsCompleteUploadResponse as Ut, CronJobsApi as V, DiscordChannelConfig as Vn, SpaceEnvInput as Vt, ApiError as W, SessionTurnSegmentRecord as Wn, SpaceFsCreateUploadInput as Wt, BillingPluginStatus as X, HttpTransport as Xn, SpaceFsMoveInput as Xt, BillingOpenOverageStatus as Y, HttpError as Yn, SpaceFsFileResponse as Yt, Channel as Z, RawHttpResponse as Zn, SpaceFsPreparingFile as Zt, GenerationStreamFinalizedEvent as _, SpaceMember as _n, ModelCatalogEntry as _t, SessionEventName as a, SpaceFsUploadPlanEntry as an, CronJobRecord as at, GenerationStreamStateEvent as b, SpacePublicProfile as bn, PromptTemplateCatalogResponse as bt, SpaceClient as c, SpaceFsUploadResponse as cn, ExploreSpacesResponse as ct, WebSocketConnectionState as d, SpaceInvitation as dn, GlobalSearchType as dt, SpaceFsReadFilesResponse as en, CreateInvitationResponse as et, PublicInviteApi as f, SpaceListItem as fn, InvitationDetail as ft, GenerationStreamEvent as g, SpaceMarkResourceType as gn, MeResponse as gt, GenerationStreamErrorEvent as h, SpaceMarkRecord as hn, JsonValue as ht, TasksApi as i, SpaceFsUploadError as in, CreateSpacePromptResponse as it, createSessionPatchReducer as j, UserProfile as jn, SessionTurnsPaginatedResponse as jt, SessionPatchState as k, TaskRunDetailResponse as kn, SessionTurnStreamSnapshotResponse as kt, SpaceEventName as l, SpaceFsWriteFileInput as ln, GlobalSearchResponse as lt, GenerationStreamCommitEvent as m, SpaceMarkListItem as mn, JsonPrimitive as mt, createHttpClient as n, SpaceFsUploadDestination as nn, CreateSpaceModInput as nt, SessionSubscriptionHandlers as o, SpaceFsUploadPlanEntryInput as on, ExploreSection as ot, AssistantMessageCommit as p, SpaceMarkKind as pn, JsonObject as pt, BillingCreditStatus as q, CohubClientOptions as qn, SpaceFsEntry as qt, UserApi as r, SpaceFsUploadEntry as rn, CreateSpacePromptInput as rt, SpaceChannelBindingRecord as s, SpaceFsUploadProgress as sn, ExploreSpaceItem as st, CohubHttpClient as t, SpaceFsTreeResponse as tn, CreateSpaceInput as tt, SpacesApi as u, SpaceGitInfo as un, GlobalSearchResult as ut, GenerationStreamIntermediateMessage as v, SpaceMeta as vn, Permission as vt, createSessionGenerationStreamClient as w, SpaceSandboxConfig as wn, SessionMessagesResponse as wt, GenerationStreamSubscriptionHandlers as x, SpaceRecord as xn, SessionBindingRecord as xt, GenerationStreamOutOfSyncEvent as y, SpaceModListItem as yn, PromptTemplateCatalogEntry as yt, ModelsApi as z, GenerationContentBlock as zn, SpaceConfigResponse as zt };
1909
+ export { CreateInvitationInput as $, DiscordChannelConfig as $n, SpaceFsReadFilesInput as $t, SessionPatchStatus as A, TaskRunRecord as An, SessionTurnWindowResponse as At, GenerationsApi as B, GenerationParameterConstraint as Bn, SpaceCreateResponse as Bt, SessionGenerationStreamClient as C, SpaceSandboxAutoDestroyPolicy as Cn, SessionMessagesPaginatedResponse as Ct, SessionPatchApplyResult as D, SpaceUsageResponse as Dn, SessionTurnResponse as Dt, SessionPatchApplyInput as E, SpaceUsageHourlyStat as En, SessionTurnIndexResponse as Et, CreatePublicAssetUploadResponse as F, CreateGenerationTaskResponse as Fn, SpaceChannelBindingInput as Ft, BillingCreditExpiryGroup as G, encodeGenerationPolicy as Gn, SpaceFsCreateUploadResponse as Gt, ChannelsApi as H, GenerationPolicyError as Hn, SpaceFsCompleteUploadInput as Ht, PublicAssetPurpose as I, GenerationTaskResult as In, SpaceCheckpointDetailResponse as It, BillingCreditUnit as J, getAllowedGenerationModelIds as Jn, SpaceFsFileKind as Jt, BillingCreditGrantStatus as K, filterGenerationDeclarationsByPolicy as Kn, SpaceFsEncoding as Kt, PublicAssetsApi as L, ListGenerationModelsResponse as Ln, SpaceConfig as Lt, SessionAccessApi as M, UserRulesResponse as Mn, SpaceAccess as Mt, SearchApi as N, UserSshKey as Nn, SpaceAccessPolicy as Nt, SessionPatchReducer as O, SpaceUsageSummary as On, SessionTurnSignedUrlsResponse as Ot, CreatePublicAssetUploadInput as P, CreateGenerationTaskRequest as Pn, SpaceBootstrapSource as Pt, CheckpointRecord as Q, ChannelConfig as Qn, SpaceFsReadFilesError as Qt, PromptsApi as R, PublicGenerationDeclaration as Rn, SpaceConfigInput as Rt, GenerationStreamTurnUpdatedEvent as S, SpaceRole as Sn, SessionMessageResponse as St, parseAssistantMessageCommit as T, SpaceSessionsResponse as Tn, SessionRecord as Tt, AcceptInvitationResponse as U, assertGenerationRequestAllowedByPolicy as Un, SpaceFsCompleteUploadResponse as Ut, CronJobsApi as V, GenerationPolicy as Vn, SpaceEnvInput as Vt, ApiError as W, decodeGenerationPolicy as Wn, SpaceFsCreateUploadInput as Wt, BillingPluginStatus as X, parseGenerationPolicyFromEnv as Xn, SpaceFsMoveInput as Xt, BillingOpenOverageStatus as Y, normalizeGenerationPolicy as Yn, SpaceFsFileResponse as Yt, Channel as Z, GenerationContentBlock as Zn, SpaceFsPreparingFile as Zt, GenerationStreamFinalizedEvent as _, SpaceMember as _n, ModelCatalogEntry as _t, SessionEventName as a, SpaceFsUploadPlanEntry as an, CohubClientOptions as ar, CronJobRecord as at, GenerationStreamStateEvent as b, SpacePublicProfile as bn, PromptTemplateCatalogResponse as bt, SpaceClient as c, SpaceFsUploadResponse as cn, HttpTransport as cr, ExploreSpacesResponse as ct, WebSocketConnectionState as d, SpaceInvitation as dn, GlobalSearchType as dt, SpaceFsReadFilesResponse as en, MessageRecord as er, CreateInvitationResponse as et, PublicInviteApi as f, SpaceListItem as fn, InvitationDetail as ft, GenerationStreamEvent as g, SpaceMarkResourceType as gn, MeResponse as gt, GenerationStreamErrorEvent as h, SpaceMarkRecord as hn, JsonValue as ht, TasksApi as i, SpaceFsUploadError as in, SessionTurnRecord as ir, CreateSpacePromptResponse as it, createSessionPatchReducer as j, UserProfile as jn, SessionTurnsPaginatedResponse as jt, SessionPatchState as k, TaskRunDetailResponse as kn, SessionTurnStreamSnapshotResponse as kt, SpaceEventName as l, SpaceFsWriteFileInput as ln, RawHttpResponse as lr, GlobalSearchResponse as lt, GenerationStreamCommitEvent as m, SpaceMarkListItem as mn, JsonPrimitive as mt, createHttpClient as n, SpaceFsUploadDestination as nn, SessionTurnSegmentRecord as nr, CreateSpaceModInput as nt, SessionSubscriptionHandlers as o, SpaceFsUploadPlanEntryInput as on, Fetch as or, ExploreSection as ot, AssistantMessageCommit as p, SpaceMarkKind as pn, JsonObject as pt, BillingCreditStatus as q, findGenerationModelPolicy as qn, SpaceFsEntry as qt, UserApi as r, SpaceFsUploadEntry as rn, SessionTurnIndexItem as rr, CreateSpacePromptInput as rt, SpaceChannelBindingRecord as s, SpaceFsUploadProgress as sn, HttpError as sr, ExploreSpaceItem as st, CohubHttpClient as t, SpaceFsTreeResponse as tn, SessionForkRecord as tr, CreateSpaceInput as tt, SpacesApi as u, SpaceGitInfo as un, GlobalSearchResult as ut, GenerationStreamIntermediateMessage as v, SpaceMeta as vn, Permission as vt, createSessionGenerationStreamClient as w, SpaceSandboxConfig as wn, SessionMessagesResponse as wt, GenerationStreamSubscriptionHandlers as x, SpaceRecord as xn, SessionBindingRecord as xt, GenerationStreamOutOfSyncEvent as y, SpaceModListItem as yn, PromptTemplateCatalogEntry as yt, ModelsApi as z, GenerationModelPolicy as zn, SpaceConfigResponse as zt };
@@ -320,7 +320,7 @@ const createIdleState = (input) => ({
320
320
  function cloneBlock(block) {
321
321
  return structuredClone(block);
322
322
  }
323
- function getStreamIndex$1(block) {
323
+ function getStreamIndex(block) {
324
324
  const value = block._meta?.streamIndex;
325
325
  return typeof value === "number" && Number.isFinite(value) ? value : null;
326
326
  }
@@ -331,19 +331,19 @@ function blockIdentityCompatible(prev, next) {
331
331
  return true;
332
332
  }
333
333
  function findBlockByStreamIndex(blocks, streamIndex) {
334
- return blocks.findIndex((block) => getStreamIndex$1(block) === streamIndex);
334
+ return blocks.findIndex((block) => getStreamIndex(block) === streamIndex);
335
335
  }
336
336
  function findBlockForReplacement(blocks, streamIndex, nextBlock) {
337
- const compatibleIndex = blocks.findIndex((block) => getStreamIndex$1(block) === streamIndex && blockIdentityCompatible(block, nextBlock));
337
+ const compatibleIndex = blocks.findIndex((block) => getStreamIndex(block) === streamIndex && blockIdentityCompatible(block, nextBlock));
338
338
  if (compatibleIndex >= 0) return compatibleIndex;
339
- const sameStreamIndex = blocks.findIndex((block) => getStreamIndex$1(block) === streamIndex);
339
+ const sameStreamIndex = blocks.findIndex((block) => getStreamIndex(block) === streamIndex);
340
340
  if (sameStreamIndex >= 0 && nextBlock.type !== "tool_use" && nextBlock.type !== "tool_result") return sameStreamIndex;
341
341
  return -1;
342
342
  }
343
343
  function sortBlocksByStreamIndex(blocks) {
344
344
  return [...blocks].sort((a, b) => {
345
- const aIndex = getStreamIndex$1(a);
346
- const bIndex = getStreamIndex$1(b);
345
+ const aIndex = getStreamIndex(a);
346
+ const bIndex = getStreamIndex(b);
347
347
  if (aIndex == null && bIndex == null) return 0;
348
348
  if (aIndex == null) return 1;
349
349
  if (bIndex == null) return -1;
@@ -697,14 +697,6 @@ const createSessionPatchReducer = () => new SessionPatchReducer();
697
697
  //#region src/session-generation-stream.ts
698
698
  const isRecord = (value) => Boolean(value && typeof value === "object" && !Array.isArray(value));
699
699
  const isContentBlockArray = (value) => Array.isArray(value) && value.every((item) => isRecord(item) && typeof item.type === "string");
700
- const stringField = (record, key) => {
701
- const value = record[key];
702
- return typeof value === "string" ? value : null;
703
- };
704
- const numberField = (record, key) => {
705
- const value = record[key];
706
- return typeof value === "number" && Number.isFinite(value) ? value : null;
707
- };
708
700
  const getMessageKind = (message) => {
709
701
  const kind = message.meta?.messageKind;
710
702
  return typeof kind === "string" ? kind : null;
@@ -737,68 +729,6 @@ function parseAssistantMessageCommit(message) {
737
729
  isFinal: false
738
730
  };
739
731
  }
740
- function cloneContentBlock(block) {
741
- return structuredClone(block);
742
- }
743
- function getStreamIndex(block) {
744
- const value = block._meta?.streamIndex;
745
- return typeof value === "number" && Number.isFinite(value) ? value : null;
746
- }
747
- function findMergeTargetIndex(result, block) {
748
- const streamIndex = getStreamIndex(block);
749
- if (streamIndex != null) return result.findIndex((existing) => existing.type === block.type && getStreamIndex(existing) === streamIndex);
750
- if (block.type === "tool_use") return result.findIndex((existing) => existing.type === "tool_use" && existing.id === block.id);
751
- if (block.type === "tool_result") return result.findIndex((existing) => existing.type === "tool_result" && existing.tool_use_id === block.tool_use_id);
752
- return -1;
753
- }
754
- function mergeStreamingDeltaBlocks(existing, delta) {
755
- if (delta.length === 0) return existing;
756
- const result = existing.map(cloneContentBlock);
757
- for (const block of delta) {
758
- const targetIndex = findMergeTargetIndex(result, block);
759
- if (targetIndex === -1) {
760
- result.push(cloneContentBlock(block));
761
- continue;
762
- }
763
- const target = result[targetIndex];
764
- if (block.type === "text" && target?.type === "text") {
765
- target.text += block.text;
766
- continue;
767
- }
768
- if (block.type === "thinking" && target?.type === "thinking") {
769
- target.thinking += block.thinking;
770
- if (block.signature) target.signature = block.signature;
771
- if (block._meta) target._meta = {
772
- ...target._meta ?? {},
773
- ...block._meta
774
- };
775
- continue;
776
- }
777
- result[targetIndex] = Object.assign(target ?? {}, cloneContentBlock(block));
778
- }
779
- return result;
780
- }
781
- function parseSnapshotMessage(value) {
782
- if (!isRecord(value) || !isContentBlockArray(value.content)) return null;
783
- return {
784
- messageId: stringField(value, "messageId"),
785
- messageOrdinal: numberField(value, "messageOrdinal"),
786
- content: value.content,
787
- ...typeof value.id === "string" ? { id: value.id } : {},
788
- ...typeof value.sessionId === "string" ? { sessionId: value.sessionId } : {},
789
- ...value.role === "user" || value.role === "assistant" || value.role === "system" ? { role: value.role } : {},
790
- ...typeof value.text === "string" ? { text: value.text } : {},
791
- ...typeof value.provider === "string" ? { provider: value.provider } : {},
792
- ...typeof value.model === "string" ? { model: value.model } : {},
793
- ...typeof value.stopReason === "string" ? { stopReason: value.stopReason } : {},
794
- ...typeof value.errorMessage === "string" ? { errorMessage: value.errorMessage } : {},
795
- ...isRecord(value.usage) ? { usage: value.usage } : {},
796
- ...typeof value.durationMs === "number" ? { durationMs: value.durationMs } : {},
797
- ...typeof value.toolCallsObjectKey === "string" ? { toolCallsObjectKey: value.toolCallsObjectKey } : {},
798
- ...isRecord(value.meta) ? { meta: value.meta } : {},
799
- ...typeof value.createdAt === "string" ? { createdAt: value.createdAt } : {}
800
- };
801
- }
802
732
  function messageRecordToIntermediate(message) {
803
733
  if (!isContentBlockArray(message.content) || message.content.length === 0) return null;
804
734
  const meta = isRecord(message.meta) ? message.meta : {};
@@ -838,7 +768,7 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
838
768
  messageId = null;
839
769
  messageOrdinal = null;
840
770
  intermediateMessages = [];
841
- progressState = null;
771
+ patchState = null;
842
772
  constructor(websocketClient, spaceId, sessionId) {
843
773
  this.websocketClient = websocketClient;
844
774
  this.spaceId = spaceId;
@@ -866,7 +796,7 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
866
796
  resetCurrentMessage() {
867
797
  this.messageId = null;
868
798
  this.messageOrdinal = null;
869
- this.progressState = null;
799
+ this.patchState = null;
870
800
  }
871
801
  appendCurrentMessage(state) {
872
802
  if (state.contentBlocks.length === 0) return;
@@ -894,14 +824,14 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
894
824
  if (!result.applied) {
895
825
  this.emit(handlers, {
896
826
  type: "out_of_sync",
897
- source: source === "progress" ? "patch" : source,
827
+ source,
898
828
  reason: result.reason,
899
829
  state: result.state,
900
830
  rawEvent
901
831
  });
902
832
  return;
903
833
  }
904
- this.progressState = result.state;
834
+ this.patchState = result.state;
905
835
  this.messageId = messageId;
906
836
  this.messageOrdinal = messageOrdinal;
907
837
  this.emit(handlers, {
@@ -915,7 +845,7 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
915
845
  });
916
846
  }
917
847
  prepareMessageBoundary(input) {
918
- const current = this.progressState ?? this.reducer.get({
848
+ const current = this.patchState ?? this.reducer.get({
919
849
  spaceId: this.spaceId,
920
850
  sessionId: this.sessionId
921
851
  });
@@ -947,45 +877,6 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
947
877
  }
948
878
  return nextMessageId;
949
879
  }
950
- handleSnapshot(event, handlers) {
951
- const payload = event.payload;
952
- const current = isRecord(payload.current) ? payload.current : null;
953
- const content = current ? current.content : null;
954
- const seq = typeof payload.seq === "number" ? payload.seq : null;
955
- if (!current || !isContentBlockArray(content) || seq === null) {
956
- this.emit(handlers, {
957
- type: "out_of_sync",
958
- source: "snapshot",
959
- reason: "invalid",
960
- state: this.reducer.get({
961
- spaceId: this.spaceId,
962
- sessionId: this.sessionId
963
- }),
964
- rawEvent: event
965
- });
966
- return;
967
- }
968
- const turnId = typeof payload.turnId === "string" ? payload.turnId : null;
969
- const anchorUserMessageId = typeof payload.anchorUserMessageId === "string" ? payload.anchorUserMessageId : null;
970
- const messageOrdinal = numberField(current, "messageOrdinal");
971
- const messageId = this.prepareMessageBoundary({
972
- turnId,
973
- messageId: stringField(current, "messageId"),
974
- messageOrdinal,
975
- anchorUserMessageId
976
- });
977
- this.intermediateMessages = Array.isArray(payload.intermediateMessages) ? payload.intermediateMessages.map(parseSnapshotMessage).filter((message) => message !== null) : [];
978
- const result = this.reducer.applySnapshot({
979
- spaceId: this.spaceId,
980
- sessionId: this.sessionId,
981
- turnId,
982
- seq,
983
- contentBlocks: content,
984
- anchorUserMessageId,
985
- appendPath: stringField(current, "appendPath")
986
- });
987
- this.handleAppliedState(handlers, "snapshot", result, event, messageId, messageOrdinal);
988
- }
989
880
  handlePatch(event, handlers) {
990
881
  const payload = event.payload;
991
882
  const seq = typeof payload.seq === "number" ? payload.seq : null;
@@ -1024,45 +915,6 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
1024
915
  const result = this.reducer.applyPatch(input);
1025
916
  this.handleAppliedState(handlers, "patch", result, event, messageId, messageOrdinal);
1026
917
  }
1027
- handleProgress(event, handlers) {
1028
- const payload = event.payload;
1029
- if (!isContentBlockArray(payload.content)) return;
1030
- const current = this.progressState ?? this.reducer.get({
1031
- spaceId: this.spaceId,
1032
- sessionId: this.sessionId
1033
- });
1034
- const turnId = typeof payload.turnId === "string" ? payload.turnId : current.turnId;
1035
- const anchorUserMessageId = typeof payload.anchorUserMessageId === "string" ? payload.anchorUserMessageId : current.anchorUserMessageId;
1036
- const messageOrdinal = typeof payload.messageOrdinal === "number" ? payload.messageOrdinal : this.messageOrdinal;
1037
- const messageId = this.prepareMessageBoundary({
1038
- turnId,
1039
- messageId: typeof payload.messageId === "string" ? payload.messageId : this.messageId,
1040
- messageOrdinal,
1041
- anchorUserMessageId
1042
- });
1043
- const base = this.progressState?.turnId === turnId ? this.progressState : current;
1044
- const state = {
1045
- ...base,
1046
- spaceId: this.spaceId,
1047
- sessionId: this.sessionId,
1048
- status: "streaming",
1049
- contentBlocks: mergeStreamingDeltaBlocks(base.contentBlocks, payload.content),
1050
- anchorUserMessageId,
1051
- turnId
1052
- };
1053
- this.progressState = state;
1054
- this.messageId = messageId;
1055
- this.messageOrdinal = messageOrdinal;
1056
- this.emit(handlers, {
1057
- type: "state",
1058
- source: "progress",
1059
- state,
1060
- messageId,
1061
- messageOrdinal,
1062
- intermediateMessages: [...this.intermediateMessages],
1063
- rawEvent: event
1064
- });
1065
- }
1066
918
  handlePersisted(event, handlers) {
1067
919
  const message = event.payload.message;
1068
920
  if (!isRecord(message)) return;
@@ -1121,15 +973,9 @@ var SessionGenerationStreamClient = class SessionGenerationStreamClient {
1121
973
  }
1122
974
  handleEvent(event, handlers) {
1123
975
  switch (event.type) {
1124
- case "session.turn.snapshot":
1125
- this.handleSnapshot(event, handlers);
1126
- return;
1127
976
  case "session.turn.patch":
1128
977
  this.handlePatch(event, handlers);
1129
978
  return;
1130
- case "session.turn.progress":
1131
- this.handleProgress(event, handlers);
1132
- return;
1133
979
  case "session.message.persisted":
1134
980
  this.handlePersisted(event, handlers);
1135
981
  return;
@@ -1217,12 +1063,13 @@ const getFilenameFromContentDisposition = (value) => {
1217
1063
  };
1218
1064
  const toSessionEventName = (type) => {
1219
1065
  switch (type) {
1066
+ case "session.created": return "created";
1067
+ case "session.updated": return "updated";
1068
+ case "session.turn.created": return "turn.created";
1220
1069
  case "session.turn.patch": return "turn.patch";
1221
- case "session.turn.snapshot": return "turn.snapshot";
1222
- case "session.turn.progress": return "turn.progress";
1223
1070
  case "session.turn.error": return "turn.error";
1224
1071
  case "session.turn.updated": return "turn.updated";
1225
- case "session.turn.finalized": return "turn.final";
1072
+ case "session.turn.finalized": return "turn.finalized";
1226
1073
  case "session.message.persisted": return "message.persisted";
1227
1074
  default: return null;
1228
1075
  }
@@ -1418,7 +1265,8 @@ var SessionMessagesClient = class {
1418
1265
  content: input.content,
1419
1266
  model: input.model,
1420
1267
  provider: input.provider,
1421
- clientMessageId: input.clientMessageId
1268
+ clientMessageId: input.clientMessageId,
1269
+ generationPolicy: input.generationPolicy
1422
1270
  })
1423
1271
  });
1424
1272
  }
@@ -1500,8 +1348,6 @@ var SessionRealtimeClient = class {
1500
1348
  }));
1501
1349
  }
1502
1350
  }
1503
- if (eventName === "turn.snapshot") handlers.snapshot?.(event);
1504
- if (eventName === "turn.progress") handlers.progress?.(event);
1505
1351
  if (eventName === "turn.error") {
1506
1352
  this.patchReducer.fail({
1507
1353
  spaceId: this.spaceId,
@@ -1517,32 +1363,24 @@ var SessionRealtimeClient = class {
1517
1363
  });
1518
1364
  }
1519
1365
  if (eventName === "turn.updated") handlers.turnUpdated?.(event);
1520
- if (eventName === "turn.final") {
1366
+ if (eventName === "turn.finalized") {
1521
1367
  this.patchReducer.complete({
1522
1368
  spaceId: this.spaceId,
1523
1369
  sessionId: this.sessionId,
1524
1370
  turnId: typeof event.payload.turn === "object" && event.payload.turn && "id" in event.payload.turn ? String(event.payload.turn.id) : null
1525
1371
  });
1526
1372
  handlers.turnFinalized?.(event);
1527
- handlers.final?.(event);
1528
- }
1529
- if (isAssistantFinalPersistedEvent(event)) {
1530
- this.patchReducer.complete({
1531
- spaceId: this.spaceId,
1532
- sessionId: this.sessionId,
1533
- turnId: getPersistedMessageTurnId(event)
1534
- });
1535
- handlers.final?.(event);
1536
1373
  }
1374
+ if (isAssistantFinalPersistedEvent(event)) this.patchReducer.complete({
1375
+ spaceId: this.spaceId,
1376
+ sessionId: this.sessionId,
1377
+ turnId: getPersistedMessageTurnId(event)
1378
+ });
1537
1379
  });
1538
1380
  return () => unsubscribe();
1539
1381
  }
1540
1382
  on(type, handler) {
1541
1383
  return this.subscribe({ event: (event) => {
1542
- if (type === "turn.final" && isAssistantFinalPersistedEvent(event)) {
1543
- handler(event);
1544
- return;
1545
- }
1546
1384
  if (toSessionEventName(event.type) === type) handler(event);
1547
1385
  } });
1548
1386
  }
@@ -1652,11 +1490,19 @@ var SpaceEventsApi = class {
1652
1490
  handler(event);
1653
1491
  return;
1654
1492
  }
1493
+ if (type === "fs.changed" && event.type === "space.fs.changed") {
1494
+ handler(event);
1495
+ return;
1496
+ }
1655
1497
  if (type === "ports.changed" && event.type === "space.ports.changed") {
1656
1498
  handler(event);
1657
1499
  return;
1658
1500
  }
1659
- if (type === "turn.final" && isAssistantFinalPersistedEvent(event)) {
1501
+ if (type === "task.created" && event.type === "task.created") {
1502
+ handler(event);
1503
+ return;
1504
+ }
1505
+ if (type === "task.updated" && event.type === "task.updated") {
1660
1506
  handler(event);
1661
1507
  return;
1662
1508
  }
package/dist/http.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { l as ContentBlock } from "./chunks/websocket.js";
2
- import { $ as CreateInvitationInput, $t as SpaceFsReadFilesInput, An as TaskRunRecord, At as SessionTurnWindowResponse, Bn as ChannelConfig, Bt as SpaceCreateResponse, Cn as SpaceSandboxAutoDestroyPolicy, Ct as SessionMessagesPaginatedResponse, Dn as SpaceUsageResponse, Dt as SessionTurnResponse, En as SpaceUsageHourlyStat, Et as SessionTurnIndexResponse, Fn as CreateGenerationTaskResponse, Ft as SpaceChannelBindingInput, G as BillingCreditExpiryGroup, Gn as SessionTurnIndexItem, Gt as SpaceFsCreateUploadResponse, Hn as MessageRecord, Ht as SpaceFsCompleteUploadInput, In as GenerationTaskResult, It as SpaceCheckpointDetailResponse, J as BillingCreditUnit, Jn as Fetch, Jt as SpaceFsFileKind, K as BillingCreditGrantStatus, Kn as SessionTurnRecord, Kt as SpaceFsEncoding, Ln as ListGenerationModelsResponse, Lt as SpaceConfig, Mn as UserRulesResponse, Mt as SpaceAccess, Nn as UserSshKey, Nt as SpaceAccessPolicy, On as SpaceUsageSummary, Ot as SessionTurnSignedUrlsResponse, Pn as CreateGenerationTaskRequest, Pt as SpaceBootstrapSource, Q as CheckpointRecord, Qt as SpaceFsReadFilesError, Rn as PublicGenerationDeclaration, Rt as SpaceConfigInput, Sn as SpaceRole, St as SessionMessageResponse, Tn as SpaceSessionsResponse, Tt as SessionRecord, U as AcceptInvitationResponse, Un as SessionForkRecord, Ut as SpaceFsCompleteUploadResponse, Vn as DiscordChannelConfig, Vt as SpaceEnvInput, W as ApiError, Wn as SessionTurnSegmentRecord, Wt as SpaceFsCreateUploadInput, X as BillingPluginStatus, Xn as HttpTransport, Xt as SpaceFsMoveInput, Y as BillingOpenOverageStatus, Yn as HttpError, Yt as SpaceFsFileResponse, Z as Channel, Zt as SpaceFsPreparingFile, _n as SpaceMember, _t as ModelCatalogEntry, an as SpaceFsUploadPlanEntry, at as CronJobRecord, bn as SpacePublicProfile, bt as PromptTemplateCatalogResponse, cn as SpaceFsUploadResponse, ct as ExploreSpacesResponse, dn as SpaceInvitation, dt as GlobalSearchType, en as SpaceFsReadFilesResponse, et as CreateInvitationResponse, fn as SpaceListItem, ft as InvitationDetail, gn as SpaceMarkResourceType, gt as MeResponse, hn as SpaceMarkRecord, ht as JsonValue, in as SpaceFsUploadError, it as CreateSpacePromptResponse, jn as UserProfile, jt as SessionTurnsPaginatedResponse, kn as TaskRunDetailResponse, kt as SessionTurnStreamSnapshotResponse, ln as SpaceFsWriteFileInput, lt as GlobalSearchResponse, mn as SpaceMarkListItem, mt as JsonPrimitive, n as createHttpClient, nn as SpaceFsUploadDestination, nt as CreateSpaceModInput, on as SpaceFsUploadPlanEntryInput, ot as ExploreSection, pn as SpaceMarkKind, pt as JsonObject, q as BillingCreditStatus, qn as CohubClientOptions, qt as SpaceFsEntry, rn as SpaceFsUploadEntry, rt as CreateSpacePromptInput, sn as SpaceFsUploadProgress, st as ExploreSpaceItem, t as CohubHttpClient, tn as SpaceFsTreeResponse, tt as CreateSpaceInput, un as SpaceGitInfo, ut as GlobalSearchResult, vn as SpaceMeta, vt as Permission, wn as SpaceSandboxConfig, wt as SessionMessagesResponse, xn as SpaceRecord, xt as SessionBindingRecord, yn as SpaceModListItem, yt as PromptTemplateCatalogEntry, zn as GenerationContentBlock, zt as SpaceConfigResponse } from "./chunks/http.js";
3
- export { AcceptInvitationResponse, ApiError, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingOpenOverageStatus, BillingPluginStatus, Channel, ChannelConfig, CheckpointRecord, CohubClientOptions, CohubHttpClient, ContentBlock, CreateGenerationTaskRequest, CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CronJobRecord, DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, Fetch, GenerationContentBlock, GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, HttpTransport, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, ListGenerationModelsResponse, MeResponse, MessageRecord, ModelCatalogEntry, Permission, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, PublicGenerationDeclaration, SessionBindingRecord, SessionForkRecord, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionRecord, SessionTurnIndexItem, SessionTurnIndexResponse, SessionTurnRecord, SessionTurnResponse, SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceCreateResponse, SpaceEnvInput, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsEncoding, SpaceFsEntry, SpaceFsFileKind, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsPreparingFile, SpaceFsReadFilesError, SpaceFsReadFilesInput, SpaceFsReadFilesResponse, SpaceFsTreeResponse, SpaceFsUploadDestination, SpaceFsUploadEntry, SpaceFsUploadError, SpaceFsUploadPlanEntry, SpaceFsUploadPlanEntryInput, SpaceFsUploadProgress, SpaceFsUploadResponse, SpaceFsWriteFileInput, SpaceGitInfo, SpaceInvitation, SpaceListItem, SpaceMarkKind, SpaceMarkListItem, SpaceMarkRecord, SpaceMarkResourceType, SpaceMember, SpaceMeta, SpaceModListItem, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, UserProfile, UserRulesResponse, UserSshKey, createHttpClient };
2
+ import { $ as CreateInvitationInput, $n as DiscordChannelConfig, $t as SpaceFsReadFilesInput, An as TaskRunRecord, At as SessionTurnWindowResponse, Bt as SpaceCreateResponse, Cn as SpaceSandboxAutoDestroyPolicy, Ct as SessionMessagesPaginatedResponse, Dn as SpaceUsageResponse, Dt as SessionTurnResponse, En as SpaceUsageHourlyStat, Et as SessionTurnIndexResponse, Fn as CreateGenerationTaskResponse, Ft as SpaceChannelBindingInput, G as BillingCreditExpiryGroup, Gt as SpaceFsCreateUploadResponse, Ht as SpaceFsCompleteUploadInput, In as GenerationTaskResult, It as SpaceCheckpointDetailResponse, J as BillingCreditUnit, Jt as SpaceFsFileKind, K as BillingCreditGrantStatus, Kt as SpaceFsEncoding, Ln as ListGenerationModelsResponse, Lt as SpaceConfig, Mn as UserRulesResponse, Mt as SpaceAccess, Nn as UserSshKey, Nt as SpaceAccessPolicy, On as SpaceUsageSummary, Ot as SessionTurnSignedUrlsResponse, Pn as CreateGenerationTaskRequest, Pt as SpaceBootstrapSource, Q as CheckpointRecord, Qn as ChannelConfig, Qt as SpaceFsReadFilesError, Rn as PublicGenerationDeclaration, Rt as SpaceConfigInput, Sn as SpaceRole, St as SessionMessageResponse, Tn as SpaceSessionsResponse, Tt as SessionRecord, U as AcceptInvitationResponse, Ut as SpaceFsCompleteUploadResponse, Vn as GenerationPolicy, Vt as SpaceEnvInput, W as ApiError, Wt as SpaceFsCreateUploadInput, X as BillingPluginStatus, Xt as SpaceFsMoveInput, Y as BillingOpenOverageStatus, Yt as SpaceFsFileResponse, Z as Channel, Zn as GenerationContentBlock, Zt as SpaceFsPreparingFile, _n as SpaceMember, _t as ModelCatalogEntry, an as SpaceFsUploadPlanEntry, ar as CohubClientOptions, at as CronJobRecord, bn as SpacePublicProfile, bt as PromptTemplateCatalogResponse, cn as SpaceFsUploadResponse, cr as HttpTransport, ct as ExploreSpacesResponse, dn as SpaceInvitation, dt as GlobalSearchType, en as SpaceFsReadFilesResponse, er as MessageRecord, et as CreateInvitationResponse, fn as SpaceListItem, ft as InvitationDetail, gn as SpaceMarkResourceType, gt as MeResponse, hn as SpaceMarkRecord, ht as JsonValue, in as SpaceFsUploadError, ir as SessionTurnRecord, it as CreateSpacePromptResponse, jn as UserProfile, jt as SessionTurnsPaginatedResponse, kn as TaskRunDetailResponse, kt as SessionTurnStreamSnapshotResponse, ln as SpaceFsWriteFileInput, lt as GlobalSearchResponse, mn as SpaceMarkListItem, mt as JsonPrimitive, n as createHttpClient, nn as SpaceFsUploadDestination, nr as SessionTurnSegmentRecord, nt as CreateSpaceModInput, on as SpaceFsUploadPlanEntryInput, or as Fetch, ot as ExploreSection, pn as SpaceMarkKind, pt as JsonObject, q as BillingCreditStatus, qt as SpaceFsEntry, rn as SpaceFsUploadEntry, rr as SessionTurnIndexItem, rt as CreateSpacePromptInput, sn as SpaceFsUploadProgress, sr as HttpError, st as ExploreSpaceItem, t as CohubHttpClient, tn as SpaceFsTreeResponse, tr as SessionForkRecord, tt as CreateSpaceInput, un as SpaceGitInfo, ut as GlobalSearchResult, vn as SpaceMeta, vt as Permission, wn as SpaceSandboxConfig, wt as SessionMessagesResponse, xn as SpaceRecord, xt as SessionBindingRecord, yn as SpaceModListItem, yt as PromptTemplateCatalogEntry, zt as SpaceConfigResponse } from "./chunks/http.js";
3
+ export { AcceptInvitationResponse, ApiError, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingOpenOverageStatus, BillingPluginStatus, Channel, ChannelConfig, CheckpointRecord, CohubClientOptions, CohubHttpClient, ContentBlock, CreateGenerationTaskRequest, CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CronJobRecord, DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, Fetch, GenerationContentBlock, GenerationPolicy, GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, HttpTransport, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, ListGenerationModelsResponse, MeResponse, MessageRecord, ModelCatalogEntry, Permission, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, PublicGenerationDeclaration, SessionBindingRecord, SessionForkRecord, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionRecord, SessionTurnIndexItem, SessionTurnIndexResponse, SessionTurnRecord, SessionTurnResponse, SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceCreateResponse, SpaceEnvInput, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsEncoding, SpaceFsEntry, SpaceFsFileKind, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsPreparingFile, SpaceFsReadFilesError, SpaceFsReadFilesInput, SpaceFsReadFilesResponse, SpaceFsTreeResponse, SpaceFsUploadDestination, SpaceFsUploadEntry, SpaceFsUploadError, SpaceFsUploadPlanEntry, SpaceFsUploadPlanEntryInput, SpaceFsUploadProgress, SpaceFsUploadResponse, SpaceFsWriteFileInput, SpaceGitInfo, SpaceInvitation, SpaceListItem, SpaceMarkKind, SpaceMarkListItem, SpaceMarkRecord, SpaceMarkResourceType, SpaceMember, SpaceMeta, SpaceModListItem, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, UserProfile, UserRulesResponse, UserSshKey, createHttpClient };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { _ as resolveCohubEnvironment, c as createWebsocketClient, f as COHUB_ENVIRONMENTS, g as resolveApiBaseUrl, h as normalizeWebsocketUrl, l as ContentBlock, m as normalizeBaseUrl, p as CohubEnvironment, r as WebsocketClient, v as resolveWebsocketUrl } from "./chunks/websocket.js";
2
- import { $ as CreateInvitationInput, $t as SpaceFsReadFilesInput, A as SessionPatchStatus, An as TaskRunRecord, At as SessionTurnWindowResponse, B as GenerationsApi, Bn as ChannelConfig, Bt as SpaceCreateResponse, C as SessionGenerationStreamClient, Cn as SpaceSandboxAutoDestroyPolicy, Ct as SessionMessagesPaginatedResponse, D as SessionPatchApplyResult, Dn as SpaceUsageResponse, Dt as SessionTurnResponse, E as SessionPatchApplyInput, En as SpaceUsageHourlyStat, Et as SessionTurnIndexResponse, F as CreatePublicAssetUploadResponse, Fn as CreateGenerationTaskResponse, Ft as SpaceChannelBindingInput, G as BillingCreditExpiryGroup, Gn as SessionTurnIndexItem, Gt as SpaceFsCreateUploadResponse, H as ChannelsApi, Hn as MessageRecord, Ht as SpaceFsCompleteUploadInput, I as PublicAssetPurpose, In as GenerationTaskResult, It as SpaceCheckpointDetailResponse, J as BillingCreditUnit, Jn as Fetch, Jt as SpaceFsFileKind, K as BillingCreditGrantStatus, Kn as SessionTurnRecord, Kt as SpaceFsEncoding, L as PublicAssetsApi, Ln as ListGenerationModelsResponse, Lt as SpaceConfig, M as SessionAccessApi, Mn as UserRulesResponse, Mt as SpaceAccess, N as SearchApi, Nn as UserSshKey, Nt as SpaceAccessPolicy, O as SessionPatchReducer, On as SpaceUsageSummary, Ot as SessionTurnSignedUrlsResponse, P as CreatePublicAssetUploadInput, Pn as CreateGenerationTaskRequest, Pt as SpaceBootstrapSource, Q as CheckpointRecord, Qt as SpaceFsReadFilesError, R as PromptsApi, Rn as PublicGenerationDeclaration, Rt as SpaceConfigInput, S as GenerationStreamTurnUpdatedEvent, Sn as SpaceRole, St as SessionMessageResponse, T as parseAssistantMessageCommit, Tn as SpaceSessionsResponse, Tt as SessionRecord, U as AcceptInvitationResponse, Un as SessionForkRecord, Ut as SpaceFsCompleteUploadResponse, V as CronJobsApi, Vn as DiscordChannelConfig, Vt as SpaceEnvInput, W as ApiError, Wn as SessionTurnSegmentRecord, Wt as SpaceFsCreateUploadInput, X as BillingPluginStatus, Xn as HttpTransport, Xt as SpaceFsMoveInput, Y as BillingOpenOverageStatus, Yn as HttpError, Yt as SpaceFsFileResponse, Z as Channel, Zn as RawHttpResponse, Zt as SpaceFsPreparingFile, _ as GenerationStreamFinalizedEvent, _n as SpaceMember, _t as ModelCatalogEntry, a as SessionEventName, an as SpaceFsUploadPlanEntry, at as CronJobRecord, b as GenerationStreamStateEvent, bn as SpacePublicProfile, bt as PromptTemplateCatalogResponse, c as SpaceClient, cn as SpaceFsUploadResponse, ct as ExploreSpacesResponse, d as WebSocketConnectionState, dn as SpaceInvitation, dt as GlobalSearchType, en as SpaceFsReadFilesResponse, et as CreateInvitationResponse, f as PublicInviteApi, fn as SpaceListItem, ft as InvitationDetail, g as GenerationStreamEvent, gn as SpaceMarkResourceType, gt as MeResponse, h as GenerationStreamErrorEvent, hn as SpaceMarkRecord, ht as JsonValue, i as TasksApi, in as SpaceFsUploadError, it as CreateSpacePromptResponse, j as createSessionPatchReducer, jn as UserProfile, jt as SessionTurnsPaginatedResponse, k as SessionPatchState, kn as TaskRunDetailResponse, kt as SessionTurnStreamSnapshotResponse, l as SpaceEventName, ln as SpaceFsWriteFileInput, lt as GlobalSearchResponse, m as GenerationStreamCommitEvent, mn as SpaceMarkListItem, mt as JsonPrimitive, n as createHttpClient, nn as SpaceFsUploadDestination, nt as CreateSpaceModInput, o as SessionSubscriptionHandlers, on as SpaceFsUploadPlanEntryInput, ot as ExploreSection, p as AssistantMessageCommit, pn as SpaceMarkKind, pt as JsonObject, q as BillingCreditStatus, qn as CohubClientOptions, qt as SpaceFsEntry, r as UserApi, rn as SpaceFsUploadEntry, rt as CreateSpacePromptInput, s as SpaceChannelBindingRecord, sn as SpaceFsUploadProgress, st as ExploreSpaceItem, t as CohubHttpClient, tn as SpaceFsTreeResponse, tt as CreateSpaceInput, u as SpacesApi, un as SpaceGitInfo, ut as GlobalSearchResult, v as GenerationStreamIntermediateMessage, vn as SpaceMeta, vt as Permission, w as createSessionGenerationStreamClient, wn as SpaceSandboxConfig, wt as SessionMessagesResponse, x as GenerationStreamSubscriptionHandlers, xn as SpaceRecord, xt as SessionBindingRecord, y as GenerationStreamOutOfSyncEvent, yn as SpaceModListItem, yt as PromptTemplateCatalogEntry, z as ModelsApi, zn as GenerationContentBlock, zt as SpaceConfigResponse } from "./chunks/http.js";
2
+ import { $ as CreateInvitationInput, $n as DiscordChannelConfig, $t as SpaceFsReadFilesInput, A as SessionPatchStatus, An as TaskRunRecord, At as SessionTurnWindowResponse, B as GenerationsApi, Bn as GenerationParameterConstraint, Bt as SpaceCreateResponse, C as SessionGenerationStreamClient, Cn as SpaceSandboxAutoDestroyPolicy, Ct as SessionMessagesPaginatedResponse, D as SessionPatchApplyResult, Dn as SpaceUsageResponse, Dt as SessionTurnResponse, E as SessionPatchApplyInput, En as SpaceUsageHourlyStat, Et as SessionTurnIndexResponse, F as CreatePublicAssetUploadResponse, Fn as CreateGenerationTaskResponse, Ft as SpaceChannelBindingInput, G as BillingCreditExpiryGroup, Gn as encodeGenerationPolicy, Gt as SpaceFsCreateUploadResponse, H as ChannelsApi, Hn as GenerationPolicyError, Ht as SpaceFsCompleteUploadInput, I as PublicAssetPurpose, In as GenerationTaskResult, It as SpaceCheckpointDetailResponse, J as BillingCreditUnit, Jn as getAllowedGenerationModelIds, Jt as SpaceFsFileKind, K as BillingCreditGrantStatus, Kn as filterGenerationDeclarationsByPolicy, Kt as SpaceFsEncoding, L as PublicAssetsApi, Ln as ListGenerationModelsResponse, Lt as SpaceConfig, M as SessionAccessApi, Mn as UserRulesResponse, Mt as SpaceAccess, N as SearchApi, Nn as UserSshKey, Nt as SpaceAccessPolicy, O as SessionPatchReducer, On as SpaceUsageSummary, Ot as SessionTurnSignedUrlsResponse, P as CreatePublicAssetUploadInput, Pn as CreateGenerationTaskRequest, Pt as SpaceBootstrapSource, Q as CheckpointRecord, Qn as ChannelConfig, Qt as SpaceFsReadFilesError, R as PromptsApi, Rn as PublicGenerationDeclaration, Rt as SpaceConfigInput, S as GenerationStreamTurnUpdatedEvent, Sn as SpaceRole, St as SessionMessageResponse, T as parseAssistantMessageCommit, Tn as SpaceSessionsResponse, Tt as SessionRecord, U as AcceptInvitationResponse, Un as assertGenerationRequestAllowedByPolicy, Ut as SpaceFsCompleteUploadResponse, V as CronJobsApi, Vn as GenerationPolicy, Vt as SpaceEnvInput, W as ApiError, Wn as decodeGenerationPolicy, Wt as SpaceFsCreateUploadInput, X as BillingPluginStatus, Xn as parseGenerationPolicyFromEnv, Xt as SpaceFsMoveInput, Y as BillingOpenOverageStatus, Yn as normalizeGenerationPolicy, Yt as SpaceFsFileResponse, Z as Channel, Zn as GenerationContentBlock, Zt as SpaceFsPreparingFile, _ as GenerationStreamFinalizedEvent, _n as SpaceMember, _t as ModelCatalogEntry, a as SessionEventName, an as SpaceFsUploadPlanEntry, ar as CohubClientOptions, at as CronJobRecord, b as GenerationStreamStateEvent, bn as SpacePublicProfile, bt as PromptTemplateCatalogResponse, c as SpaceClient, cn as SpaceFsUploadResponse, cr as HttpTransport, ct as ExploreSpacesResponse, d as WebSocketConnectionState, dn as SpaceInvitation, dt as GlobalSearchType, en as SpaceFsReadFilesResponse, er as MessageRecord, et as CreateInvitationResponse, f as PublicInviteApi, fn as SpaceListItem, ft as InvitationDetail, g as GenerationStreamEvent, gn as SpaceMarkResourceType, gt as MeResponse, h as GenerationStreamErrorEvent, hn as SpaceMarkRecord, ht as JsonValue, i as TasksApi, in as SpaceFsUploadError, ir as SessionTurnRecord, it as CreateSpacePromptResponse, j as createSessionPatchReducer, jn as UserProfile, jt as SessionTurnsPaginatedResponse, k as SessionPatchState, kn as TaskRunDetailResponse, kt as SessionTurnStreamSnapshotResponse, l as SpaceEventName, ln as SpaceFsWriteFileInput, lr as RawHttpResponse, lt as GlobalSearchResponse, m as GenerationStreamCommitEvent, mn as SpaceMarkListItem, mt as JsonPrimitive, n as createHttpClient, nn as SpaceFsUploadDestination, nr as SessionTurnSegmentRecord, nt as CreateSpaceModInput, o as SessionSubscriptionHandlers, on as SpaceFsUploadPlanEntryInput, or as Fetch, ot as ExploreSection, p as AssistantMessageCommit, pn as SpaceMarkKind, pt as JsonObject, q as BillingCreditStatus, qn as findGenerationModelPolicy, qt as SpaceFsEntry, r as UserApi, rn as SpaceFsUploadEntry, rr as SessionTurnIndexItem, rt as CreateSpacePromptInput, s as SpaceChannelBindingRecord, sn as SpaceFsUploadProgress, sr as HttpError, st as ExploreSpaceItem, t as CohubHttpClient, tn as SpaceFsTreeResponse, tr as SessionForkRecord, tt as CreateSpaceInput, u as SpacesApi, un as SpaceGitInfo, ut as GlobalSearchResult, v as GenerationStreamIntermediateMessage, vn as SpaceMeta, vt as Permission, w as createSessionGenerationStreamClient, wn as SpaceSandboxConfig, wt as SessionMessagesResponse, x as GenerationStreamSubscriptionHandlers, xn as SpaceRecord, xt as SessionBindingRecord, y as GenerationStreamOutOfSyncEvent, yn as SpaceModListItem, yt as PromptTemplateCatalogEntry, z as ModelsApi, zn as GenerationModelPolicy, zt as SpaceConfigResponse } from "./chunks/http.js";
3
3
 
4
4
  //#region src/apis/billing.d.ts
5
5
  declare class BillingApi {
@@ -43,4 +43,4 @@ declare class CohubClient {
43
43
  }
44
44
  declare const createCohubClient: (options?: CohubClientOptions) => CohubClient;
45
45
  //#endregion
46
- export { AcceptInvitationResponse, ApiError, type AssistantMessageCommit, BillingApi, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingOpenOverageStatus, BillingPluginStatus, COHUB_ENVIRONMENTS, Channel, ChannelConfig, CheckpointRecord, CohubClient, type CohubClientOptions, type CohubEnvironment, CohubHttpClient, ContentBlock, CreateGenerationTaskRequest, CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, type CreatePublicAssetUploadInput, type CreatePublicAssetUploadResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CronJobRecord, DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, type Fetch, GenerationContentBlock, type GenerationStreamCommitEvent, type GenerationStreamErrorEvent, type GenerationStreamEvent, type GenerationStreamFinalizedEvent, type GenerationStreamIntermediateMessage, type GenerationStreamOutOfSyncEvent, type GenerationStreamStateEvent, type GenerationStreamSubscriptionHandlers, type GenerationStreamTurnUpdatedEvent, GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, ListGenerationModelsResponse, MeResponse, MessageRecord, ModelCatalogEntry, Permission, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, type PublicAssetPurpose, PublicGenerationDeclaration, type RawHttpResponse, SessionBindingRecord, type SessionEventName, SessionForkRecord, SessionGenerationStreamClient, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, type SessionPatchApplyInput, type SessionPatchApplyResult, SessionPatchReducer, type SessionPatchState, type SessionPatchStatus, SessionRecord, type SessionSubscriptionHandlers, SessionTurnIndexItem, SessionTurnIndexResponse, SessionTurnRecord, SessionTurnResponse, SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, type SpaceChannelBindingRecord, SpaceCheckpointDetailResponse, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceCreateResponse, 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, SpaceGitInfo, SpaceInvitation, SpaceListItem, SpaceMarkKind, SpaceMarkListItem, SpaceMarkRecord, SpaceMarkResourceType, SpaceMember, SpaceMeta, SpaceModListItem, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, UserProfile, UserRulesResponse, UserSshKey, type WebSocketConnectionState, WebsocketClient, createCohubClient, createHttpClient, createSessionGenerationStreamClient, createSessionPatchReducer, createWebsocketClient, normalizeBaseUrl, normalizeWebsocketUrl, parseAssistantMessageCommit, resolveApiBaseUrl, resolveCohubEnvironment, resolveWebsocketUrl };
46
+ export { AcceptInvitationResponse, ApiError, type AssistantMessageCommit, BillingApi, BillingCreditExpiryGroup, BillingCreditGrantStatus, BillingCreditStatus, BillingCreditUnit, BillingOpenOverageStatus, BillingPluginStatus, COHUB_ENVIRONMENTS, Channel, ChannelConfig, CheckpointRecord, CohubClient, type CohubClientOptions, type CohubEnvironment, CohubHttpClient, ContentBlock, CreateGenerationTaskRequest, CreateGenerationTaskResponse, CreateInvitationInput, CreateInvitationResponse, type CreatePublicAssetUploadInput, type CreatePublicAssetUploadResponse, CreateSpaceInput, CreateSpaceModInput, CreateSpacePromptInput, CreateSpacePromptResponse, CronJobRecord, DiscordChannelConfig, ExploreSection, ExploreSpaceItem, ExploreSpacesResponse, type Fetch, GenerationContentBlock, type GenerationModelPolicy, type GenerationParameterConstraint, type GenerationPolicy, GenerationPolicyError, type GenerationStreamCommitEvent, type GenerationStreamErrorEvent, type GenerationStreamEvent, type GenerationStreamFinalizedEvent, type GenerationStreamIntermediateMessage, type GenerationStreamOutOfSyncEvent, type GenerationStreamStateEvent, type GenerationStreamSubscriptionHandlers, type GenerationStreamTurnUpdatedEvent, GenerationTaskResult, GlobalSearchResponse, GlobalSearchResult, GlobalSearchType, HttpError, InvitationDetail, JsonObject, JsonPrimitive, JsonValue, ListGenerationModelsResponse, MeResponse, MessageRecord, ModelCatalogEntry, Permission, PromptTemplateCatalogEntry, PromptTemplateCatalogResponse, type PublicAssetPurpose, PublicGenerationDeclaration, type RawHttpResponse, SessionBindingRecord, type SessionEventName, SessionForkRecord, SessionGenerationStreamClient, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, type SessionPatchApplyInput, type SessionPatchApplyResult, SessionPatchReducer, type SessionPatchState, type SessionPatchStatus, SessionRecord, type SessionSubscriptionHandlers, SessionTurnIndexItem, SessionTurnIndexResponse, SessionTurnRecord, SessionTurnResponse, SessionTurnSegmentRecord, SessionTurnSignedUrlsResponse, SessionTurnStreamSnapshotResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SpaceAccess, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, type SpaceChannelBindingRecord, SpaceCheckpointDetailResponse, SpaceConfig, SpaceConfigInput, SpaceConfigResponse, SpaceCreateResponse, 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, SpaceGitInfo, SpaceInvitation, SpaceListItem, SpaceMarkKind, SpaceMarkListItem, SpaceMarkRecord, SpaceMarkResourceType, SpaceMember, SpaceMeta, SpaceModListItem, SpacePublicProfile, SpaceRecord, SpaceRole, SpaceSandboxAutoDestroyPolicy, SpaceSandboxConfig, SpaceSessionsResponse, SpaceUsageHourlyStat, SpaceUsageResponse, SpaceUsageSummary, TaskRunDetailResponse, TaskRunRecord, UserProfile, UserRulesResponse, UserSshKey, type WebSocketConnectionState, WebsocketClient, assertGenerationRequestAllowedByPolicy, createCohubClient, createHttpClient, createSessionGenerationStreamClient, createSessionPatchReducer, createWebsocketClient, decodeGenerationPolicy, encodeGenerationPolicy, filterGenerationDeclarationsByPolicy, findGenerationModelPolicy, getAllowedGenerationModelIds, normalizeBaseUrl, normalizeGenerationPolicy, normalizeWebsocketUrl, parseAssistantMessageCommit, parseGenerationPolicyFromEnv, resolveApiBaseUrl, resolveCohubEnvironment, resolveWebsocketUrl };
package/dist/index.js CHANGED
@@ -118,4 +118,235 @@ var CohubClient = class {
118
118
  };
119
119
  const createCohubClient = (options) => new CohubClient(options);
120
120
  //#endregion
121
- export { BillingApi, COHUB_ENVIRONMENTS, CohubClient, CohubHttpClient, HttpError, SessionGenerationStreamClient, SessionPatchReducer, WebsocketClient, createCohubClient, createHttpClient, createSessionGenerationStreamClient, createSessionPatchReducer, createWebsocketClient, normalizeBaseUrl, normalizeWebsocketUrl, parseAssistantMessageCommit, resolveApiBaseUrl, resolveCohubEnvironment, resolveWebsocketUrl };
121
+ //#region ../protocol/src/generation/policy.ts
122
+ const GENERATION_POLICY_ENV_KEY = "COHUB_GENERATION_POLICY_B64";
123
+ var GenerationPolicyError = class extends Error {
124
+ constructor(message) {
125
+ super(message);
126
+ this.name = "GenerationPolicyError";
127
+ }
128
+ };
129
+ function isRecord(value) {
130
+ return !!value && typeof value === "object" && !Array.isArray(value);
131
+ }
132
+ function isPrimitiveEnumValue(value) {
133
+ return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
134
+ }
135
+ function normalizeConstraint(value) {
136
+ if (!isRecord(value) || typeof value.kind !== "string") return null;
137
+ if (value.kind === "enum") {
138
+ if (!Array.isArray(value.values) || value.values.length === 0 || !value.values.every(isPrimitiveEnumValue)) return null;
139
+ return {
140
+ kind: "enum",
141
+ values: value.values
142
+ };
143
+ }
144
+ if (value.kind === "number" || value.kind === "integer") {
145
+ const result = { kind: value.kind };
146
+ if (typeof value.min === "number" && Number.isFinite(value.min)) result.min = value.min;
147
+ if (typeof value.max === "number" && Number.isFinite(value.max)) result.max = value.max;
148
+ if (result.min !== void 0 && result.max !== void 0 && result.min > result.max) return null;
149
+ if (Array.isArray(value.values) && value.values.every((item) => typeof item === "number" && Number.isFinite(item))) {
150
+ if (value.kind === "integer" && !value.values.every(Number.isInteger)) return null;
151
+ const min = result.min;
152
+ const max = result.max;
153
+ if (min !== void 0 && value.values.some((item) => item < min)) return null;
154
+ if (max !== void 0 && value.values.some((item) => item > max)) return null;
155
+ result.values = value.values;
156
+ }
157
+ return result;
158
+ }
159
+ if (value.kind === "boolean") return typeof value.value === "boolean" ? {
160
+ kind: "boolean",
161
+ value: value.value
162
+ } : { kind: "boolean" };
163
+ return null;
164
+ }
165
+ function normalizeGenerationPolicy(value) {
166
+ if (!isRecord(value) || value.version !== 1) return null;
167
+ if (value.mode === "auto") return {
168
+ version: 1,
169
+ mode: "auto"
170
+ };
171
+ if (value.mode !== "limited" || !Array.isArray(value.models) || value.models.length === 0) return null;
172
+ const models = [];
173
+ for (const item of value.models) {
174
+ if (!isRecord(item) || typeof item.model !== "string" || !item.model.trim()) return null;
175
+ const modelPolicy = { model: item.model.trim() };
176
+ if (item.parameters !== void 0) {
177
+ if (!isRecord(item.parameters)) return null;
178
+ const parameters = {};
179
+ for (const [key, rawConstraint] of Object.entries(item.parameters)) {
180
+ if (!key.trim()) return null;
181
+ const constraint = normalizeConstraint(rawConstraint);
182
+ if (!constraint) return null;
183
+ parameters[key] = constraint;
184
+ }
185
+ if (Object.keys(parameters).length > 0) modelPolicy.parameters = parameters;
186
+ }
187
+ models.push(modelPolicy);
188
+ }
189
+ return {
190
+ version: 1,
191
+ mode: "limited",
192
+ models
193
+ };
194
+ }
195
+ function bytesToBase64(bytes) {
196
+ let binary = "";
197
+ for (const byte of bytes) binary += String.fromCharCode(byte);
198
+ return btoa(binary);
199
+ }
200
+ function base64ToBytes(value) {
201
+ const binary = atob(value);
202
+ const bytes = new Uint8Array(binary.length);
203
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
204
+ return bytes;
205
+ }
206
+ function toBase64Url(value) {
207
+ return bytesToBase64(new TextEncoder().encode(value)).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
208
+ }
209
+ function fromBase64Url(value) {
210
+ const base64 = value.replaceAll("-", "+").replaceAll("_", "/");
211
+ const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, "=");
212
+ return new TextDecoder().decode(base64ToBytes(padded));
213
+ }
214
+ function encodeGenerationPolicy(policy) {
215
+ return toBase64Url(JSON.stringify(policy));
216
+ }
217
+ function decodeGenerationPolicy(value) {
218
+ try {
219
+ return normalizeGenerationPolicy(JSON.parse(fromBase64Url(value)));
220
+ } catch {
221
+ return null;
222
+ }
223
+ }
224
+ function parseGenerationPolicyFromEnv(env) {
225
+ const value = env[GENERATION_POLICY_ENV_KEY]?.trim();
226
+ return value ? decodeGenerationPolicy(value) : null;
227
+ }
228
+ function getAllowedGenerationModelIds(policy) {
229
+ if (!policy || policy.mode === "auto") return null;
230
+ return [...new Set((policy.models ?? []).map((item) => item.model))];
231
+ }
232
+ function findGenerationModelPolicy(policy, model) {
233
+ if (!policy || policy.mode === "auto") return null;
234
+ return policy.models?.find((item) => item.model === model) ?? null;
235
+ }
236
+ function formatList(values) {
237
+ return values.map((value) => `- ${String(value)}`).join("\n");
238
+ }
239
+ function modelNotSupportedMessage(allowedModels) {
240
+ return [
241
+ "This turn supports the following generation models:",
242
+ "",
243
+ formatList(allowedModels),
244
+ "",
245
+ "Choose one of these models or update Generation settings in the Models panel."
246
+ ].join("\n");
247
+ }
248
+ function valuesNotSupportedMessage(model, name, values, received) {
249
+ return [
250
+ `This turn supports selected values for ${model}.${name}:`,
251
+ "",
252
+ formatList(values),
253
+ "",
254
+ "Received:",
255
+ `- ${String(received)}`
256
+ ].join("\n");
257
+ }
258
+ function rangeNotSupportedMessage(model, name, min, max, received) {
259
+ return [
260
+ `This turn supports ${model}.${name} in the range ${min !== void 0 && max !== void 0 ? `${min}–${max}` : min !== void 0 ? `at least ${min}` : `at most ${max}`}.`,
261
+ "",
262
+ "Received:",
263
+ `- ${String(received)}`
264
+ ].join("\n");
265
+ }
266
+ function booleanNotSupportedMessage(model, name, expected, received) {
267
+ return [
268
+ `This turn supports ${model}.${name}=${String(expected)}.`,
269
+ "",
270
+ "Received:",
271
+ `- ${String(received)}`
272
+ ].join("\n");
273
+ }
274
+ function sameEnumValue(a, b) {
275
+ return typeof a === typeof b && a === b;
276
+ }
277
+ function validateConstraint(input) {
278
+ const { model, name, value, constraint } = input;
279
+ if (constraint.kind === "enum") {
280
+ if (!constraint.values.some((item) => sameEnumValue(item, value))) throw new GenerationPolicyError(valuesNotSupportedMessage(model, name, constraint.values, value));
281
+ return;
282
+ }
283
+ if (constraint.kind === "number" || constraint.kind === "integer") {
284
+ if (typeof value !== "number" || !Number.isFinite(value)) throw new GenerationPolicyError(rangeNotSupportedMessage(model, name, constraint.min, constraint.max, value));
285
+ if (constraint.kind === "integer" && !Number.isInteger(value)) throw new GenerationPolicyError(rangeNotSupportedMessage(model, name, constraint.min, constraint.max, value));
286
+ if (constraint.values?.length && !constraint.values.includes(value)) throw new GenerationPolicyError(valuesNotSupportedMessage(model, name, constraint.values, value));
287
+ if (constraint.min !== void 0 && value < constraint.min) throw new GenerationPolicyError(rangeNotSupportedMessage(model, name, constraint.min, constraint.max, value));
288
+ if (constraint.max !== void 0 && value > constraint.max) throw new GenerationPolicyError(rangeNotSupportedMessage(model, name, constraint.min, constraint.max, value));
289
+ return;
290
+ }
291
+ if (constraint.kind === "boolean" && constraint.value !== void 0 && value !== constraint.value) throw new GenerationPolicyError(booleanNotSupportedMessage(model, name, constraint.value, value));
292
+ }
293
+ function assertGenerationRequestAllowedByPolicy(input) {
294
+ const allowedModels = getAllowedGenerationModelIds(input.policy);
295
+ if (!allowedModels) return;
296
+ const modelPolicy = findGenerationModelPolicy(input.policy, input.model);
297
+ if (!modelPolicy) throw new GenerationPolicyError(modelNotSupportedMessage(allowedModels));
298
+ const parameters = input.parameters ?? {};
299
+ for (const [name, value] of Object.entries(parameters)) {
300
+ const constraint = modelPolicy.parameters?.[name];
301
+ if (!constraint) continue;
302
+ validateConstraint({
303
+ model: input.model,
304
+ name,
305
+ value,
306
+ constraint
307
+ });
308
+ }
309
+ }
310
+ function cloneDeclaration(declaration) {
311
+ return {
312
+ ...declaration,
313
+ content: {
314
+ ...declaration.content,
315
+ input: [...declaration.content.input]
316
+ },
317
+ parameters: declaration.parameters ? Object.fromEntries(Object.entries(declaration.parameters).map(([key, value]) => [key, { ...value }])) : declaration.parameters,
318
+ examples: declaration.examples ? [...declaration.examples] : declaration.examples
319
+ };
320
+ }
321
+ function narrowParameterSpec(spec, constraint) {
322
+ const next = { ...spec };
323
+ if (constraint.kind === "enum") {
324
+ if ("enum" in next && Array.isArray(next.enum)) next.enum = next.enum.filter((value) => constraint.values.some((allowed) => sameEnumValue(allowed, value)));
325
+ return next;
326
+ }
327
+ if (constraint.kind === "number" || constraint.kind === "integer") {
328
+ if ("min" in next && typeof next.min === "number" && constraint.min !== void 0) next.min = Math.max(next.min, constraint.min);
329
+ else if ("min" in next && constraint.min !== void 0) next.min = constraint.min;
330
+ if ("max" in next && typeof next.max === "number" && constraint.max !== void 0) next.max = Math.min(next.max, constraint.max);
331
+ else if ("max" in next && constraint.max !== void 0) next.max = constraint.max;
332
+ if (constraint.values?.length && "enum" in next && Array.isArray(next.enum)) next.enum = next.enum.filter((value) => constraint.values?.some((allowed) => sameEnumValue(allowed, value)));
333
+ }
334
+ return next;
335
+ }
336
+ function filterGenerationDeclarationsByPolicy(declarations, policy) {
337
+ const allowedModels = getAllowedGenerationModelIds(policy);
338
+ if (!allowedModels) return declarations;
339
+ const allowedSet = new Set(allowedModels);
340
+ return declarations.filter((declaration) => allowedSet.has(declaration.model)).map((declaration) => {
341
+ const cloned = cloneDeclaration(declaration);
342
+ const modelPolicy = findGenerationModelPolicy(policy, declaration.model);
343
+ if (!modelPolicy?.parameters || !cloned.parameters) return cloned;
344
+ for (const [name, constraint] of Object.entries(modelPolicy.parameters)) {
345
+ const spec = cloned.parameters[name];
346
+ if (spec) cloned.parameters[name] = narrowParameterSpec(spec, constraint);
347
+ }
348
+ return cloned;
349
+ });
350
+ }
351
+ //#endregion
352
+ export { BillingApi, COHUB_ENVIRONMENTS, CohubClient, CohubHttpClient, GenerationPolicyError, HttpError, SessionGenerationStreamClient, SessionPatchReducer, WebsocketClient, assertGenerationRequestAllowedByPolicy, createCohubClient, createHttpClient, createSessionGenerationStreamClient, createSessionPatchReducer, createWebsocketClient, decodeGenerationPolicy, encodeGenerationPolicy, filterGenerationDeclarationsByPolicy, findGenerationModelPolicy, getAllowedGenerationModelIds, normalizeBaseUrl, normalizeGenerationPolicy, normalizeWebsocketUrl, parseAssistantMessageCommit, parseGenerationPolicyFromEnv, resolveApiBaseUrl, resolveCohubEnvironment, resolveWebsocketUrl };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neta-art/cohub",
3
- "version": "1.16.1",
3
+ "version": "1.18.0",
4
4
  "description": "Cohub SDK for spaces, sessions, checkpoints, and realtime agent collaboration.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,