@neta-art/cohub 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,11 @@
1
1
  import type { HttpTransport } from "../transport.js";
2
- import type { CreateCronJobInput, CronJobRecord, TaskRunRecord } from "../types.js";
2
+ import type { CronJobRecord, TaskRunRecord } from "../types.js";
3
3
  export declare class CronJobsApi {
4
4
  private readonly transport;
5
5
  constructor(transport: HttpTransport);
6
6
  list(spaceId?: string): Promise<{
7
7
  jobs: CronJobRecord[];
8
8
  }>;
9
- create(data: CreateCronJobInput): Promise<CronJobRecord>;
10
9
  delete(id: string): Promise<{
11
10
  ok: true;
12
11
  }>;
@@ -7,13 +7,6 @@ export class CronJobsApi {
7
7
  const query = spaceId ? `?spaceId=${encodeURIComponent(spaceId)}` : "";
8
8
  return this.transport.request(`/api/cron-jobs${query}`);
9
9
  }
10
- create(data) {
11
- return this.transport.request("/api/cron-jobs", {
12
- method: "POST",
13
- headers: { "Content-Type": "application/json" },
14
- body: JSON.stringify(data),
15
- });
16
- }
17
10
  delete(id) {
18
11
  return this.transport.request(`/api/cron-jobs/${id}`, {
19
12
  method: "DELETE",
@@ -2,7 +2,7 @@ import type { SpacePublicEndpoints } from "@neta-art/cohub-protocol/ports";
2
2
  import type { WebsocketClient, WebsocketEventPayload } from "../websocket.js";
3
3
  import type { HttpTransport, Fetch } from "../transport.js";
4
4
  import { type SessionPatchApplyResult } from "../session-patch-reducer.js";
5
- import type { CheckpointRecord, ContentBlock, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionTurnResponse, SessionTurnStreamSnapshotResponse, SessionTurnIndexResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SessionTurnSignedUrlsResponse, SessionRecord, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceCreateResponse, SpaceEnvInput, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsTreeResponse, SpaceFsUploadResponse, SpaceUsageResponse, SpaceFsWriteFileInput, SpaceMarkKind, SpaceMarkListItem, SpaceMarkResourceType, SpaceMember, SpaceRecord, SpaceRole, SpaceSessionsResponse } from "../types.js";
5
+ import type { CheckpointRecord, ContentBlock, SessionMessageResponse, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionTurnResponse, SessionTurnStreamSnapshotResponse, SessionTurnIndexResponse, SessionTurnWindowResponse, SessionTurnsPaginatedResponse, SessionTurnSignedUrlsResponse, SessionRecord, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceCreateResponse, CreateSpacePromptInput, CreateSpacePromptResponse, SpaceEnvInput, SpaceFsCompleteUploadInput, SpaceFsCompleteUploadResponse, SpaceFsCreateUploadInput, SpaceFsCreateUploadResponse, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsTreeResponse, SpaceFsUploadResponse, SpaceUsageResponse, SpaceFsWriteFileInput, SpaceMarkKind, SpaceMarkListItem, SpaceMarkResourceType, SpaceMember, SpaceRecord, SpaceRole, SpaceSessionsResponse } from "../types.js";
6
6
  import { SpaceInvitationsApi } from "./invitations.js";
7
7
  export type SessionSubscriptionHandlers = {
8
8
  patch?: (event: WebsocketEventPayload) => void;
@@ -22,6 +22,7 @@ type SessionSendMessageInput = {
22
22
  content: ContentBlock[];
23
23
  model?: string;
24
24
  provider?: string;
25
+ clientMessageId?: string;
25
26
  };
26
27
  export declare class SpacesApi {
27
28
  private readonly transport;
@@ -330,6 +331,7 @@ export declare class SpaceClient {
330
331
  readonly marks: SpaceMarksApi;
331
332
  constructor(id: string, transport: HttpTransport, websocketClient: WebsocketClient | null);
332
333
  get(customFetch?: Fetch): Promise<SpaceRecord>;
334
+ prompt(input: CreateSpacePromptInput): Promise<CreateSpacePromptResponse>;
333
335
  rename(name: string): Promise<{
334
336
  space: SpaceRecord;
335
337
  }>;
@@ -243,6 +243,7 @@ class SessionMessagesClient {
243
243
  content: input.content,
244
244
  model: input.model,
245
245
  provider: input.provider,
246
+ clientMessageId: input.clientMessageId,
246
247
  }),
247
248
  });
248
249
  }
@@ -705,6 +706,13 @@ export class SpaceClient {
705
706
  fetch: customFetch,
706
707
  });
707
708
  }
709
+ prompt(input) {
710
+ return this.transport.request(`/api/spaces/${this.id}/prompt`, {
711
+ method: "POST",
712
+ headers: { "Content-Type": "application/json" },
713
+ body: JSON.stringify(input),
714
+ });
715
+ }
708
716
  rename(name) {
709
717
  return this.transport.request(`/api/spaces/${this.id}`, {
710
718
  method: "PATCH",
@@ -1,5 +1,5 @@
1
1
  import type { HttpTransport } from "../transport.js";
2
- import type { CreateScheduledTaskInput, TaskRunDetailResponse, TaskRunRecord } from "../types.js";
2
+ import type { TaskRunDetailResponse, TaskRunRecord } from "../types.js";
3
3
  export declare class TasksApi {
4
4
  private readonly transport;
5
5
  constructor(transport: HttpTransport);
@@ -10,9 +10,4 @@ export declare class TasksApi {
10
10
  }): Promise<{
11
11
  runs: TaskRunRecord[];
12
12
  }>;
13
- createScheduled(data: CreateScheduledTaskInput): Promise<{
14
- ok: true;
15
- taskRunId: string;
16
- scheduledAt: string;
17
- }>;
18
13
  }
@@ -15,11 +15,4 @@ export class TasksApi {
15
15
  const query = params.toString();
16
16
  return this.transport.request(`/api/tasks${query ? `?${query}` : ""}`);
17
17
  }
18
- createScheduled(data) {
19
- return this.transport.request("/api/tasks", {
20
- method: "POST",
21
- headers: { "Content-Type": "application/json" },
22
- body: JSON.stringify(data),
23
- });
24
- }
25
18
  }
package/dist/types.d.ts CHANGED
@@ -16,6 +16,7 @@ export type UserProfile = {
16
16
  export type MeResponse = {
17
17
  uuid: string;
18
18
  profile: UserProfile;
19
+ email: string | null;
19
20
  };
20
21
  export type UserRulesResponse = {
21
22
  content: string;
@@ -280,9 +281,51 @@ export type UserSshKey = {
280
281
  giteaKeyId: number;
281
282
  createdAt: string;
282
283
  };
284
+ export type CreateSpacePromptInput = {
285
+ sessionId?: string | null;
286
+ title?: string | null;
287
+ content: ContentBlock[];
288
+ model?: string | null;
289
+ provider?: string | null;
290
+ clientMessageId?: string | null;
291
+ schedule?: {
292
+ mode?: "immediate";
293
+ } | {
294
+ mode: "delay";
295
+ delayMs: number;
296
+ } | {
297
+ mode: "at";
298
+ sendAt: string;
299
+ } | {
300
+ mode: "repeat";
301
+ cronExpression: string;
302
+ timezone: string;
303
+ };
304
+ };
305
+ export type CreateSpacePromptResponse = {
306
+ ok: true;
307
+ mode: "immediate";
308
+ sessionId: string;
309
+ userMessageId: string;
310
+ turnId: string;
311
+ } | {
312
+ ok: true;
313
+ mode: "delay" | "at";
314
+ taskRunId: string;
315
+ scheduledAt: string;
316
+ sessionId: string | null;
317
+ } | {
318
+ ok: true;
319
+ mode: "repeat";
320
+ cronJobId: string;
321
+ nextRunAt: string;
322
+ timezone: string;
323
+ sessionId: string | null;
324
+ };
283
325
  export type CronJobRecord = {
284
326
  id: string;
285
327
  userUuid: string;
328
+ userProfile?: UserProfile;
286
329
  title: string;
287
330
  taskType: string;
288
331
  payload: Record<string, unknown>;
@@ -331,22 +374,6 @@ export type CheckpointRecord = {
331
374
  export type SpaceCheckpointDetailResponse = {
332
375
  checkpoint: CheckpointRecord;
333
376
  };
334
- export type CreateCronJobInput = {
335
- title: string;
336
- taskType: string;
337
- payload: Record<string, unknown>;
338
- cronExpression: string;
339
- timezone?: string;
340
- spaceId?: string;
341
- sessionId?: string;
342
- };
343
- export type CreateScheduledTaskInput = {
344
- taskType: string;
345
- payload: Record<string, unknown>;
346
- scheduleAt: string;
347
- spaceId?: string;
348
- sessionId?: string;
349
- };
350
377
  export type SpaceRole = "host" | "builder" | "guest";
351
378
  export type SpaceMember = {
352
379
  userId: string;
package/dist/websocket.js CHANGED
@@ -1,4 +1,4 @@
1
- import { realtimeCompactFrameSchema, realtimeEnvelopeSchema, WS_COMPACT_STREAM_CAPABILITY, } from "@neta-art/cohub-protocol/realtime";
1
+ import { getSessionTurnPatchStreamKey, realtimeCompactFrameSchema, realtimeEnvelopeSchema, WS_COMPACT_STREAM_CAPABILITY, } from "@neta-art/cohub-protocol/realtime";
2
2
  import { resolveWebsocketUrl } from "./environment.js";
3
3
  const createEventMap = () => ({
4
4
  connecting: new Set(),
@@ -446,13 +446,7 @@ export class WebsocketClient {
446
446
  if (typeof realtimeMeta?.sid === "string" && realtimeMeta.sid.trim()) {
447
447
  return realtimeMeta.sid;
448
448
  }
449
- if (typeof payload.turnId === "string" && payload.turnId.trim())
450
- return payload.turnId;
451
- if (typeof payload.messageId === "string" && payload.messageId.trim())
452
- return payload.messageId;
453
- return typeof envelope.sessionId === "string" && envelope.sessionId.trim()
454
- ? envelope.sessionId
455
- : null;
449
+ return getSessionTurnPatchStreamKey(payload, { includeSessionFallback: true });
456
450
  }
457
451
  handlePatchEnvelope(envelope) {
458
452
  const payload = envelope.payload;
@@ -479,10 +473,12 @@ export class WebsocketClient {
479
473
  }
480
474
  const buffer = this.patchStreamBuffers.get(key);
481
475
  if (!buffer) {
482
- this.patchStreamBuffers.set(key, {
483
- nextSeq: payload.baseSeq,
476
+ const newBuffer = {
477
+ nextSeq: payload.baseSeq + 1,
484
478
  pending: new Map([[payload.seq, envelope]]),
485
- });
479
+ };
480
+ this.patchStreamBuffers.set(key, newBuffer);
481
+ this.flushPatchStreamBuffer(newBuffer);
486
482
  return;
487
483
  }
488
484
  if (payload.seq < buffer.nextSeq)
@@ -543,6 +539,7 @@ export class WebsocketClient {
543
539
  turnId: context.turnId,
544
540
  messageId: context.messageId,
545
541
  messageOrdinal: context.messageOrdinal,
542
+ sourceMessageId: context.messageId,
546
543
  anchorUserMessageId: context.anchorUserMessageId,
547
544
  seq: frame.s,
548
545
  baseSeq: frame.b,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neta-art/cohub",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "Cohub SDK for spaces, sessions, checkpoints, and realtime agent collaboration.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -44,7 +44,7 @@
44
44
  "README.md"
45
45
  ],
46
46
  "dependencies": {
47
- "@neta-art/cohub-protocol": "1.2.3"
47
+ "@neta-art/cohub-protocol": "1.3.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "typescript": "^6.0.3"