@neta-art/cohub 1.0.0 → 1.1.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.
@@ -0,0 +1,10 @@
1
+ import type { Fetch } from "../transport.js";
2
+ import type { PromptTemplateCatalogResponse } from "../types.js";
3
+ export declare class PromptsApi {
4
+ private readonly fetcher;
5
+ private readonly baseUrl;
6
+ constructor(fetcher: Fetch, baseUrl: string);
7
+ list(options?: {
8
+ spaceId?: string;
9
+ }, customFetch?: Fetch): Promise<PromptTemplateCatalogResponse>;
10
+ }
@@ -0,0 +1,22 @@
1
+ export class PromptsApi {
2
+ fetcher;
3
+ baseUrl;
4
+ constructor(fetcher, baseUrl) {
5
+ this.fetcher = fetcher;
6
+ this.baseUrl = baseUrl;
7
+ }
8
+ async list(options, customFetch) {
9
+ const fetchImpl = customFetch ?? this.fetcher;
10
+ const params = new URLSearchParams();
11
+ if (options?.spaceId)
12
+ params.set("spaceId", options.spaceId);
13
+ const query = params.toString();
14
+ const base = this.baseUrl ? `${this.baseUrl}/api/prompts` : "/api/prompts";
15
+ const url = query ? `${base}?${query}` : base;
16
+ const response = await fetchImpl(url);
17
+ if (!response.ok) {
18
+ throw new Error(`Failed to fetch prompt templates: ${response.status} ${response.statusText}`);
19
+ }
20
+ return response.json();
21
+ }
22
+ }
@@ -8,7 +8,7 @@ export class SessionAccessApi {
8
8
  }
9
9
  set(sessionId, body) {
10
10
  return this.transport.request(`/api/sessions/${sessionId}/access`, {
11
- method: "PUT",
11
+ method: "PATCH",
12
12
  headers: { "Content-Type": "application/json" },
13
13
  body: JSON.stringify(body),
14
14
  });
@@ -1,6 +1,6 @@
1
1
  import type { WebsocketClient, WebsocketEventPayload } from "../websocket.js";
2
2
  import type { HttpTransport, Fetch } from "../transport.js";
3
- import type { CheckpointRecord, ContentBlock, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionRecord, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceCreateResponse, SpaceEnvInput, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsTreeResponse, SpaceFsWriteFileInput, SpaceMember, SpaceRecord, SpaceRole, SpaceSessionsResponse } from "../types.js";
3
+ import type { CheckpointRecord, ContentBlock, SessionMessagesPaginatedResponse, SessionMessagesResponse, SessionRecord, SpaceAccessPolicy, SpaceBootstrapSource, SpaceChannelBindingInput, SpaceCheckpointDetailResponse, SpaceCreateResponse, SpaceEnvInput, SpaceFsFileResponse, SpaceFsMoveInput, SpaceFsTreeResponse, SpaceUsageResponse, SpaceFsWriteFileInput, SpaceMember, SpaceRecord, SpaceRole, SpaceSessionsResponse } from "../types.js";
4
4
  export type SessionSubscriptionHandlers = {
5
5
  progress?: (event: WebsocketEventPayload) => void;
6
6
  final?: (event: WebsocketEventPayload) => void;
@@ -96,6 +96,9 @@ export declare class SessionClient {
96
96
  space: SpaceRecord;
97
97
  session: SessionRecord;
98
98
  }>;
99
+ rename(title: string | null, customFetch?: Fetch): Promise<{
100
+ session: SessionRecord;
101
+ }>;
99
102
  subscribe(handlers: SessionSubscriptionHandlers): () => void;
100
103
  on(type: SessionEventName, handler: (event: WebsocketEventPayload) => void): () => void;
101
104
  }
@@ -114,6 +117,11 @@ export declare class SpaceSessionsApi {
114
117
  list(customFetch?: Fetch): Promise<SpaceSessionsResponse>;
115
118
  byId(sessionId: string): SessionClient;
116
119
  }
120
+ export type WebSocketConnectionState = {
121
+ state: "open" | "closed" | "error";
122
+ willReconnect: boolean;
123
+ connectionId?: string | null;
124
+ };
117
125
  export declare class SpaceEventsApi {
118
126
  private readonly websocketClient;
119
127
  private readonly spaceId;
@@ -143,6 +151,12 @@ export declare class SpaceAccessApi {
143
151
  anonymous_user?: SpaceRole | null;
144
152
  }): Promise<SpaceAccessPolicy>;
145
153
  }
154
+ export declare class SpaceUsageApi {
155
+ private readonly transport;
156
+ private readonly spaceId;
157
+ constructor(transport: HttpTransport, spaceId: string);
158
+ get(days?: number, customFetch?: Fetch): Promise<SpaceUsageResponse>;
159
+ }
146
160
  export declare class SpaceCheckpointsApi {
147
161
  private readonly transport;
148
162
  private readonly spaceId;
@@ -165,6 +179,7 @@ export declare class SpaceClient {
165
179
  readonly members: SpaceMembersApi;
166
180
  readonly access: SpaceAccessApi;
167
181
  readonly checkpoints: SpaceCheckpointsApi;
182
+ readonly usage: SpaceUsageApi;
168
183
  constructor(id: string, transport: HttpTransport, websocketClient: WebsocketClient | null);
169
184
  get(customFetch?: Fetch): Promise<SpaceRecord>;
170
185
  rename(name: string): Promise<{
@@ -201,6 +201,13 @@ export class SessionClient {
201
201
  fetch: customFetch,
202
202
  });
203
203
  }
204
+ rename(title, customFetch) {
205
+ return this.transport.request(`/api/sessions/${this.id}`, {
206
+ method: "PATCH",
207
+ body: JSON.stringify({ title }),
208
+ fetch: customFetch,
209
+ });
210
+ }
204
211
  subscribe(handlers) {
205
212
  return this.realtime.subscribe(handlers);
206
213
  }
@@ -301,12 +308,24 @@ export class SpaceAccessApi {
301
308
  }
302
309
  set(body) {
303
310
  return this.transport.request(`/api/spaces/${this.spaceId}/access`, {
304
- method: "PUT",
311
+ method: "PATCH",
305
312
  headers: { "Content-Type": "application/json" },
306
313
  body: JSON.stringify(body),
307
314
  });
308
315
  }
309
316
  }
317
+ export class SpaceUsageApi {
318
+ transport;
319
+ spaceId;
320
+ constructor(transport, spaceId) {
321
+ this.transport = transport;
322
+ this.spaceId = spaceId;
323
+ }
324
+ get(days = 30, customFetch) {
325
+ const params = new URLSearchParams({ days: String(days) });
326
+ return this.transport.request(`/api/spaces/${this.spaceId}/usage?${params.toString()}`, { fetch: customFetch });
327
+ }
328
+ }
310
329
  export class SpaceCheckpointsApi {
311
330
  transport;
312
331
  spaceId;
@@ -337,6 +356,7 @@ export class SpaceClient {
337
356
  members;
338
357
  access;
339
358
  checkpoints;
359
+ usage;
340
360
  constructor(id, transport, websocketClient) {
341
361
  this.id = id;
342
362
  this.transport = transport;
@@ -346,6 +366,7 @@ export class SpaceClient {
346
366
  this.members = new SpaceMembersApi(transport, id);
347
367
  this.access = new SpaceAccessApi(transport, id);
348
368
  this.checkpoints = new SpaceCheckpointsApi(transport, id);
369
+ this.usage = new SpaceUsageApi(transport, id);
349
370
  }
350
371
  get(customFetch) {
351
372
  return this.transport.request(`/api/spaces/${this.id}`, {
package/dist/client.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { ChannelsApi } from "./apis/channels.js";
2
2
  import { CronJobsApi } from "./apis/cron-jobs.js";
3
3
  import { ModelsApi } from "./apis/models.js";
4
+ import { PromptsApi } from "./apis/prompts.js";
4
5
  import { SessionAccessApi } from "./apis/session-access.js";
5
- import { SpaceClient, SpacesApi } from "./apis/spaces.js";
6
+ import { SpaceClient, SpacesApi, type WebSocketConnectionState } from "./apis/spaces.js";
6
7
  import { TasksApi } from "./apis/tasks.js";
7
8
  import { UserApi } from "./apis/user.js";
8
9
  import { type CohubClientOptions } from "./transport.js";
@@ -11,6 +12,7 @@ export declare class CohubClient {
11
12
  readonly channels: ChannelsApi;
12
13
  readonly user: UserApi;
13
14
  readonly models: ModelsApi;
15
+ readonly prompts: PromptsApi;
14
16
  readonly sessionAccess: SessionAccessApi;
15
17
  readonly tasks: TasksApi;
16
18
  readonly cronJobs: CronJobsApi;
@@ -18,5 +20,6 @@ export declare class CohubClient {
18
20
  private readonly websocketClient;
19
21
  constructor(options?: CohubClientOptions);
20
22
  space(spaceId: string): SpaceClient;
23
+ onConnection(handler: (state: WebSocketConnectionState) => void): () => void;
21
24
  }
22
25
  export declare const createCohubClient: (options?: CohubClientOptions) => CohubClient;
package/dist/client.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ChannelsApi } from "./apis/channels.js";
2
2
  import { CronJobsApi } from "./apis/cron-jobs.js";
3
3
  import { ModelsApi } from "./apis/models.js";
4
+ import { PromptsApi } from "./apis/prompts.js";
4
5
  import { SessionAccessApi } from "./apis/session-access.js";
5
6
  import { SpaceClient, SpacesApi } from "./apis/spaces.js";
6
7
  import { TasksApi } from "./apis/tasks.js";
@@ -12,6 +13,7 @@ export class CohubClient {
12
13
  channels;
13
14
  user;
14
15
  models;
16
+ prompts;
15
17
  sessionAccess;
16
18
  tasks;
17
19
  cronJobs;
@@ -27,6 +29,7 @@ export class CohubClient {
27
29
  this.channels = new ChannelsApi(this.transport);
28
30
  this.user = new UserApi(this.transport, options.baseUrl ?? "", options.setStoredAuthToken, options.clearStoredAuthToken);
29
31
  this.models = new ModelsApi(options.fetch ?? fetch, options.baseUrl ?? "");
32
+ this.prompts = new PromptsApi(options.fetch ?? fetch, options.baseUrl ?? "");
30
33
  this.sessionAccess = new SessionAccessApi(this.transport);
31
34
  this.tasks = new TasksApi(this.transport);
32
35
  this.cronJobs = new CronJobsApi(this.transport);
@@ -34,5 +37,28 @@ export class CohubClient {
34
37
  space(spaceId) {
35
38
  return new SpaceClient(spaceId, this.transport, this.websocketClient);
36
39
  }
40
+ onConnection(handler) {
41
+ const openCleanup = this.websocketClient.on("open", (payload) => {
42
+ handler({
43
+ state: "open",
44
+ willReconnect: false,
45
+ connectionId: payload.connectionId,
46
+ });
47
+ });
48
+ const closeCleanup = this.websocketClient.on("close", (payload) => {
49
+ handler({
50
+ state: "closed",
51
+ willReconnect: payload.willReconnect,
52
+ });
53
+ });
54
+ const errorCleanup = this.websocketClient.on("error", () => {
55
+ handler({ state: "error", willReconnect: true });
56
+ });
57
+ return () => {
58
+ openCleanup();
59
+ closeCleanup();
60
+ errorCleanup();
61
+ };
62
+ }
37
63
  }
38
64
  export const createCohubClient = (options) => new CohubClient(options);
package/dist/http.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ChannelsApi } from "./apis/channels.js";
2
2
  import { CronJobsApi } from "./apis/cron-jobs.js";
3
3
  import { ModelsApi } from "./apis/models.js";
4
+ import { PromptsApi } from "./apis/prompts.js";
4
5
  import { SessionAccessApi } from "./apis/session-access.js";
5
6
  import { SpaceClient, SpacesApi } from "./apis/spaces.js";
6
7
  import { TasksApi } from "./apis/tasks.js";
@@ -11,6 +12,7 @@ export declare class CohubHttpClient {
11
12
  readonly channels: ChannelsApi;
12
13
  readonly user: UserApi;
13
14
  readonly models: ModelsApi;
15
+ readonly prompts: PromptsApi;
14
16
  readonly sessionAccess: SessionAccessApi;
15
17
  readonly tasks: TasksApi;
16
18
  readonly cronJobs: CronJobsApi;
package/dist/http.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ChannelsApi } from "./apis/channels.js";
2
2
  import { CronJobsApi } from "./apis/cron-jobs.js";
3
3
  import { ModelsApi } from "./apis/models.js";
4
+ import { PromptsApi } from "./apis/prompts.js";
4
5
  import { SessionAccessApi } from "./apis/session-access.js";
5
6
  import { SpaceClient, SpacesApi } from "./apis/spaces.js";
6
7
  import { TasksApi } from "./apis/tasks.js";
@@ -11,6 +12,7 @@ export class CohubHttpClient {
11
12
  channels;
12
13
  user;
13
14
  models;
15
+ prompts;
14
16
  sessionAccess;
15
17
  tasks;
16
18
  cronJobs;
@@ -21,6 +23,7 @@ export class CohubHttpClient {
21
23
  this.channels = new ChannelsApi(this.transport);
22
24
  this.user = new UserApi(this.transport, options.baseUrl ?? "", options.setStoredAuthToken, options.clearStoredAuthToken);
23
25
  this.models = new ModelsApi(options.fetch ?? fetch, options.baseUrl ?? "");
26
+ this.prompts = new PromptsApi(options.fetch ?? fetch, options.baseUrl ?? "");
24
27
  this.sessionAccess = new SessionAccessApi(this.transport);
25
28
  this.tasks = new TasksApi(this.transport);
26
29
  this.cronJobs = new CronJobsApi(this.transport);
package/dist/index.d.ts CHANGED
@@ -4,4 +4,4 @@ export { WebsocketClient, createWebsocketClient } from "./websocket.js";
4
4
  export { HttpError } from "./transport.js";
5
5
  export type { CohubClientOptions, Fetch } from "./transport.js";
6
6
  export * from "./types.js";
7
- export type { SessionEventName, SessionSubscriptionHandlers, SpaceEventName } from "./apis/spaces.js";
7
+ export type { SessionEventName, SessionSubscriptionHandlers, SpaceEventName, WebSocketConnectionState } from "./apis/spaces.js";
package/dist/types.d.ts CHANGED
@@ -86,12 +86,10 @@ export type SpaceCreateResponse = {
86
86
  };
87
87
  export type SpaceListItem = SpaceRecord;
88
88
  export type SessionMessagesResponse = {
89
- space: SpaceRecord;
90
89
  session: SessionRecord;
91
90
  messages: MessageRecord[];
92
91
  };
93
92
  export type SessionMessagesPaginatedResponse = {
94
- space: SpaceRecord;
95
93
  session: SessionRecord;
96
94
  messages: MessageRecord[];
97
95
  hasMore: boolean;
@@ -102,6 +100,16 @@ export type ModelCatalogEntry = {
102
100
  id: string;
103
101
  model: Record<string, unknown>;
104
102
  };
103
+ export type PromptTemplateCatalogEntry = {
104
+ name: string;
105
+ description: string;
106
+ argumentHint?: string;
107
+ category?: string;
108
+ scope: "platform";
109
+ };
110
+ export type PromptTemplateCatalogResponse = {
111
+ prompts: PromptTemplateCatalogEntry[];
112
+ };
105
113
  export type Channel = {
106
114
  id: string;
107
115
  userUuid: string;
@@ -125,7 +133,6 @@ export type SpaceChannelBindingInput = {
125
133
  config?: ChannelConfig | null;
126
134
  };
127
135
  export type SpaceSessionsResponse = {
128
- space: SpaceRecord;
129
136
  sessions: SessionRecord[];
130
137
  };
131
138
  export type UserSshKey = {
@@ -198,7 +205,7 @@ export type CreateScheduledTaskInput = {
198
205
  spaceId?: string;
199
206
  sessionId?: string;
200
207
  };
201
- export type SpaceRole = "host" | "maker" | "guest";
208
+ export type SpaceRole = "host" | "builder" | "guest";
202
209
  export type SpaceMember = {
203
210
  userId: string;
204
211
  role: SpaceRole;
@@ -209,3 +216,32 @@ export type SpaceAccessPolicy = {
209
216
  signed_in_user: SpaceRole | null;
210
217
  anonymous_user: SpaceRole | null;
211
218
  };
219
+ export type SpaceUsageHourlyStat = {
220
+ bucketStartAt: string;
221
+ totalTokens: number;
222
+ inputTokens: number;
223
+ outputTokens: number;
224
+ cacheReadTokens: number;
225
+ cacheWriteTokens: number;
226
+ costTotal: number;
227
+ requestCount: number;
228
+ successCount: number;
229
+ errorCount: number;
230
+ models: string[];
231
+ };
232
+ export type SpaceUsageSummary = {
233
+ totalTokens: number;
234
+ inputTokens: number;
235
+ outputTokens: number;
236
+ cacheReadTokens: number;
237
+ cacheWriteTokens: number;
238
+ costTotal: number;
239
+ requestCount: number;
240
+ successCount: number;
241
+ errorCount: number;
242
+ };
243
+ export type SpaceUsageResponse = {
244
+ hourly: SpaceUsageHourlyStat[];
245
+ summary: SpaceUsageSummary;
246
+ days: number;
247
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neta-art/cohub",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Cohub SDK for spaces, sessions, checkpoints, and realtime agent collaboration.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -8,10 +8,10 @@
8
8
  "sideEffects": false,
9
9
  "repository": {
10
10
  "type": "git",
11
- "url": "https://github.com/neta-art/cohub.git",
11
+ "url": "https://github.com/talesofai/cohub.git",
12
12
  "directory": "packages/sdk"
13
13
  },
14
- "homepage": "https://github.com/neta-art/cohub",
14
+ "homepage": "https://github.com/talesofai/cohub",
15
15
  "keywords": [
16
16
  "cohub",
17
17
  "sdk",
@@ -43,14 +43,14 @@
43
43
  "dist",
44
44
  "README.md"
45
45
  ],
46
+ "scripts": {
47
+ "build": "tsc -p tsconfig.build.json",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit"
49
+ },
46
50
  "dependencies": {
47
51
  "@neta-art/cohub-protocol": "^1.0.0"
48
52
  },
49
53
  "devDependencies": {
50
54
  "typescript": "^6.0.3"
51
- },
52
- "scripts": {
53
- "build": "tsc -p tsconfig.build.json",
54
- "typecheck": "tsc -p tsconfig.json --noEmit"
55
55
  }
56
- }
56
+ }