@meshagent/meshagent 0.49.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,14 @@
1
+ ## [0.50.0]
2
+ - Chat clients now support per-turn LLM authorization providers, and websocket chat tokens are optional for `auth=none` deployments.
3
+ - The typed client gained `connectLlm`, optional access-subject IDs, service-account principals, room and service enabled flags, `llm_quota_manager`, and the `router` project settings document.
4
+ - Chat-thread constructors now take a chat client instead of requiring a room client, which is a breaking signature change for callers.
5
+ - The Tailwind chat package was updated to `tailwindcss` 4.3.3, and the chat and thread UI was refactored for more reliable optimistic streaming plus richer attachment and thread handling.
6
+
7
+ ## [0.49.1]
8
+ - Stability
9
+
1
10
  ## [0.49.0]
11
+ - Added typed service enable/disable state with backward-compatible enabled defaults.
2
12
  - Breaking: `createProject` no longer accepts inline settings; project settings are now document-based with `room_roles` support.
3
13
  - Route path models now use a service-port/content-target union and support CORS, compression, index, and IAP for room-content routes.
4
14
  - `RoomRole` now includes `guest`, and missing project-settings documents return `undefined`.
@@ -1,8 +1,8 @@
1
1
  import { ApiScope } from "./participant-token.js";
2
- export type ProjectRole = "member" | "admin" | "developer" | "room_creator" | "room_inventory" | "room_manager" | "session_inventory" | "agent_creator" | "agent_inventory" | "agent_manager" | "repository_creator" | "repository_inventory" | "repository_manager" | "feed_creator" | "feed_inventory" | "feed_manager" | "oauth_client_creator" | "oauth_client_inventory" | "oauth_client_manager" | "api_key_creator" | "api_key_inventory" | "api_key_manager" | "service_creator" | "service_inventory" | "service_manager" | "service_account_creator" | "service_account_inventory" | "service_account_manager" | "participant_token_creator" | "mailbox_creator" | "mailbox_inventory" | "mailbox_manager" | "route_creator" | "route_inventory" | "route_manager" | "scheduled_task_creator" | "scheduled_task_inventory" | "scheduled_task_manager" | "feed_subscription_creator" | "feed_subscription_inventory" | "feed_subscription_manager" | "llm_logger_creator" | "llm_logger_inventory" | "llm_logger_manager" | "llm_proxy_user" | "usage_reporter" | "billing_manager" | "group_manager";
2
+ export type ProjectRole = "member" | "admin" | "developer" | "room_creator" | "room_inventory" | "room_manager" | "session_inventory" | "agent_creator" | "agent_inventory" | "agent_manager" | "repository_creator" | "repository_inventory" | "repository_manager" | "feed_creator" | "feed_inventory" | "feed_manager" | "oauth_client_creator" | "oauth_client_inventory" | "oauth_client_manager" | "api_key_creator" | "api_key_inventory" | "api_key_manager" | "service_creator" | "service_inventory" | "service_manager" | "service_account_creator" | "service_account_inventory" | "service_account_manager" | "participant_token_creator" | "mailbox_creator" | "mailbox_inventory" | "mailbox_manager" | "route_creator" | "route_inventory" | "route_manager" | "scheduled_task_creator" | "scheduled_task_inventory" | "scheduled_task_manager" | "feed_subscription_creator" | "feed_subscription_inventory" | "feed_subscription_manager" | "llm_logger_creator" | "llm_logger_inventory" | "llm_logger_manager" | "llm_proxy_user" | "llm_quota_manager" | "usage_reporter" | "billing_manager" | "group_manager";
3
3
  export type ResourceRole = "viewer" | "operator" | "developer" | "admin";
4
4
  export type RoomRole = "site_user" | "guest" | ResourceRole;
5
- export type ProjectSettingsDocumentName = "openai" | "anthropic" | "otel" | "admission" | "room" | "room_roles";
5
+ export type ProjectSettingsDocumentName = "openai" | "anthropic" | "otel" | "admission" | "room" | "room_roles" | "router";
6
6
  export type FeedRole = "reader" | "subscriber" | "publisher" | "manager";
7
7
  export type SecretRole = "use_proxy";
8
8
  export type AccessRole = ProjectRole | RoomRole | FeedRole | SecretRole | "list";
@@ -10,13 +10,25 @@ export type AccessSubjectType = "user" | "group" | "agent" | "service_account" |
10
10
  export type AccessResourceType = "project" | "room" | "agent" | "group" | "repository" | "feed" | "secret";
11
11
  export interface AccessSubject {
12
12
  type: AccessSubjectType;
13
- id: string;
13
+ id?: string | null;
14
14
  name?: string | null;
15
15
  firstName?: string | null;
16
16
  lastName?: string | null;
17
17
  email?: string | null;
18
18
  objectType?: "project" | null;
19
- relation?: "member" | "developer" | "agent" | null;
19
+ relation?: "member" | "developer" | "agent" | "service_account" | null;
20
+ }
21
+ export type LlmProvider = "openai" | "anthropic";
22
+ export interface LlmDelegation {
23
+ id: string;
24
+ token: string;
25
+ expiresAt: string;
26
+ projectId: string;
27
+ delegator: AccessSubject;
28
+ subject: AccessSubject;
29
+ providers?: LlmProvider[] | null;
30
+ models?: string[] | null;
31
+ maxBudget: string;
20
32
  }
21
33
  export interface AccessResource {
22
34
  type: AccessResourceType;
@@ -401,6 +413,7 @@ export interface ServiceSpec {
401
413
  version: "v1";
402
414
  kind: "Service";
403
415
  id?: string | null;
416
+ enabled?: boolean;
404
417
  metadata: ServiceMetadata;
405
418
  agents?: AgentSpec[] | null;
406
419
  ports?: PortSpec[];
@@ -587,6 +600,7 @@ export declare class Meshagent {
587
600
  private parseAccessResource;
588
601
  private parseAccessSubject;
589
602
  private serializeAccessSubject;
603
+ private parseLlmDelegation;
590
604
  private serializeAccessResource;
591
605
  private parseProjectMember;
592
606
  private parseGroupMember;
@@ -949,6 +963,14 @@ export declare class Meshagent {
949
963
  }): Promise<void>;
950
964
  connectRoom(projectId: string, room: string): Promise<RoomConnectionInfo>;
951
965
  connectAgent(projectId: string, agentName: string): Promise<AgentConnectionInfo>;
966
+ connectLlm(params: {
967
+ projectId: string;
968
+ subject: AccessSubject;
969
+ maxBudget: string;
970
+ providers?: LlmProvider[];
971
+ models?: string[];
972
+ expiresInSeconds?: number;
973
+ }): Promise<LlmDelegation>;
952
974
  listRooms(projectId: string, options?: {
953
975
  pageSize?: number;
954
976
  continuationToken?: string;
@@ -83,7 +83,7 @@ function normalizeServiceSpec(service) {
83
83
  })),
84
84
  },
85
85
  };
86
- return { ...service, agents, container };
86
+ return { ...service, enabled: service.enabled ?? true, agents, container };
87
87
  }
88
88
  class ServiceTemplateSpec {
89
89
  constructor(template) {
@@ -199,6 +199,7 @@ function serializeServiceSpec(service) {
199
199
  };
200
200
  return pruneUndefinedValues({
201
201
  ...service,
202
+ enabled: service.enabled ?? true,
202
203
  container,
203
204
  agents,
204
205
  });
@@ -595,7 +596,7 @@ class Meshagent {
595
596
  serializeAccessSubject(subject) {
596
597
  return {
597
598
  type: subject.type,
598
- id: subject.id,
599
+ ...(subject.id !== undefined ? { id: subject.id } : {}),
599
600
  ...(subject.name !== undefined ? { name: subject.name } : {}),
600
601
  ...(subject.firstName !== undefined ? { first_name: subject.firstName } : {}),
601
602
  ...(subject.lastName !== undefined ? { last_name: subject.lastName } : {}),
@@ -604,6 +605,24 @@ class Meshagent {
604
605
  ...(subject.relation !== undefined ? { relation: subject.relation } : {}),
605
606
  };
606
607
  }
608
+ parseLlmDelegation(data) {
609
+ if (!data || typeof data !== "object" || typeof data.id !== "string" || typeof data.token !== "string"
610
+ || typeof data.expires_at !== "string" || typeof data.project_id !== "string"
611
+ || typeof data.max_budget !== "string") {
612
+ throw new requirement_js_1.RoomException("Invalid LLM delegation payload");
613
+ }
614
+ return {
615
+ id: data.id,
616
+ token: data.token,
617
+ expiresAt: data.expires_at,
618
+ projectId: data.project_id,
619
+ delegator: this.parseAccessSubject(data.delegator),
620
+ subject: this.parseAccessSubject(data.subject),
621
+ providers: Array.isArray(data.providers) ? data.providers : null,
622
+ models: Array.isArray(data.models) ? data.models.filter((value) => typeof value === "string") : null,
623
+ maxBudget: data.max_budget,
624
+ };
625
+ }
607
626
  serializeAccessResource(resource) {
608
627
  return {
609
628
  type: resource.type,
@@ -724,6 +743,9 @@ class Meshagent {
724
743
  metadata: parsedResource.metadata ?? {},
725
744
  annotations: parsedResource.annotations ?? {},
726
745
  };
746
+ if (!parsedSubject.id) {
747
+ throw new requirement_js_1.RoomException("Invalid room grant payload: missing subject id");
748
+ }
727
749
  return {
728
750
  resource: parsedResource,
729
751
  subject: parsedSubject,
@@ -1893,6 +1915,21 @@ class Meshagent {
1893
1915
  });
1894
1916
  return this.parseAgentConnectionInfo(data);
1895
1917
  }
1918
+ async connectLlm(params) {
1919
+ const data = await this.request("/llm/connect", {
1920
+ method: "POST",
1921
+ headers: { "Meshagent-Project-Id": params.projectId },
1922
+ json: {
1923
+ subject: this.serializeAccessSubject(params.subject),
1924
+ max_budget: params.maxBudget,
1925
+ ...(params.providers !== undefined ? { providers: params.providers } : {}),
1926
+ ...(params.models !== undefined ? { models: params.models } : {}),
1927
+ ...(params.expiresInSeconds !== undefined ? { expires_in_seconds: params.expiresInSeconds } : {}),
1928
+ },
1929
+ action: "connect LLM delegation",
1930
+ });
1931
+ return this.parseLlmDelegation(data);
1932
+ }
1896
1933
  async listRooms(projectId, options = {}) {
1897
1934
  const { pageSize = 50, continuationToken, filter, view } = options;
1898
1935
  const data = await this.request(`/accounts/projects/${projectId}/rooms`, {
@@ -1,8 +1,8 @@
1
1
  import { ApiScope } from "./participant-token.js";
2
- export type ProjectRole = "member" | "admin" | "developer" | "room_creator" | "room_inventory" | "room_manager" | "session_inventory" | "agent_creator" | "agent_inventory" | "agent_manager" | "repository_creator" | "repository_inventory" | "repository_manager" | "feed_creator" | "feed_inventory" | "feed_manager" | "oauth_client_creator" | "oauth_client_inventory" | "oauth_client_manager" | "api_key_creator" | "api_key_inventory" | "api_key_manager" | "service_creator" | "service_inventory" | "service_manager" | "service_account_creator" | "service_account_inventory" | "service_account_manager" | "participant_token_creator" | "mailbox_creator" | "mailbox_inventory" | "mailbox_manager" | "route_creator" | "route_inventory" | "route_manager" | "scheduled_task_creator" | "scheduled_task_inventory" | "scheduled_task_manager" | "feed_subscription_creator" | "feed_subscription_inventory" | "feed_subscription_manager" | "llm_logger_creator" | "llm_logger_inventory" | "llm_logger_manager" | "llm_proxy_user" | "usage_reporter" | "billing_manager" | "group_manager";
2
+ export type ProjectRole = "member" | "admin" | "developer" | "room_creator" | "room_inventory" | "room_manager" | "session_inventory" | "agent_creator" | "agent_inventory" | "agent_manager" | "repository_creator" | "repository_inventory" | "repository_manager" | "feed_creator" | "feed_inventory" | "feed_manager" | "oauth_client_creator" | "oauth_client_inventory" | "oauth_client_manager" | "api_key_creator" | "api_key_inventory" | "api_key_manager" | "service_creator" | "service_inventory" | "service_manager" | "service_account_creator" | "service_account_inventory" | "service_account_manager" | "participant_token_creator" | "mailbox_creator" | "mailbox_inventory" | "mailbox_manager" | "route_creator" | "route_inventory" | "route_manager" | "scheduled_task_creator" | "scheduled_task_inventory" | "scheduled_task_manager" | "feed_subscription_creator" | "feed_subscription_inventory" | "feed_subscription_manager" | "llm_logger_creator" | "llm_logger_inventory" | "llm_logger_manager" | "llm_proxy_user" | "llm_quota_manager" | "usage_reporter" | "billing_manager" | "group_manager";
3
3
  export type ResourceRole = "viewer" | "operator" | "developer" | "admin";
4
4
  export type RoomRole = "site_user" | "guest" | ResourceRole;
5
- export type ProjectSettingsDocumentName = "openai" | "anthropic" | "otel" | "admission" | "room" | "room_roles";
5
+ export type ProjectSettingsDocumentName = "openai" | "anthropic" | "otel" | "admission" | "room" | "room_roles" | "router";
6
6
  export type FeedRole = "reader" | "subscriber" | "publisher" | "manager";
7
7
  export type SecretRole = "use_proxy";
8
8
  export type AccessRole = ProjectRole | RoomRole | FeedRole | SecretRole | "list";
@@ -10,13 +10,25 @@ export type AccessSubjectType = "user" | "group" | "agent" | "service_account" |
10
10
  export type AccessResourceType = "project" | "room" | "agent" | "group" | "repository" | "feed" | "secret";
11
11
  export interface AccessSubject {
12
12
  type: AccessSubjectType;
13
- id: string;
13
+ id?: string | null;
14
14
  name?: string | null;
15
15
  firstName?: string | null;
16
16
  lastName?: string | null;
17
17
  email?: string | null;
18
18
  objectType?: "project" | null;
19
- relation?: "member" | "developer" | "agent" | null;
19
+ relation?: "member" | "developer" | "agent" | "service_account" | null;
20
+ }
21
+ export type LlmProvider = "openai" | "anthropic";
22
+ export interface LlmDelegation {
23
+ id: string;
24
+ token: string;
25
+ expiresAt: string;
26
+ projectId: string;
27
+ delegator: AccessSubject;
28
+ subject: AccessSubject;
29
+ providers?: LlmProvider[] | null;
30
+ models?: string[] | null;
31
+ maxBudget: string;
20
32
  }
21
33
  export interface AccessResource {
22
34
  type: AccessResourceType;
@@ -401,6 +413,7 @@ export interface ServiceSpec {
401
413
  version: "v1";
402
414
  kind: "Service";
403
415
  id?: string | null;
416
+ enabled?: boolean;
404
417
  metadata: ServiceMetadata;
405
418
  agents?: AgentSpec[] | null;
406
419
  ports?: PortSpec[];
@@ -587,6 +600,7 @@ export declare class Meshagent {
587
600
  private parseAccessResource;
588
601
  private parseAccessSubject;
589
602
  private serializeAccessSubject;
603
+ private parseLlmDelegation;
590
604
  private serializeAccessResource;
591
605
  private parseProjectMember;
592
606
  private parseGroupMember;
@@ -949,6 +963,14 @@ export declare class Meshagent {
949
963
  }): Promise<void>;
950
964
  connectRoom(projectId: string, room: string): Promise<RoomConnectionInfo>;
951
965
  connectAgent(projectId: string, agentName: string): Promise<AgentConnectionInfo>;
966
+ connectLlm(params: {
967
+ projectId: string;
968
+ subject: AccessSubject;
969
+ maxBudget: string;
970
+ providers?: LlmProvider[];
971
+ models?: string[];
972
+ expiresInSeconds?: number;
973
+ }): Promise<LlmDelegation>;
952
974
  listRooms(projectId: string, options?: {
953
975
  pageSize?: number;
954
976
  continuationToken?: string;
@@ -79,7 +79,7 @@ function normalizeServiceSpec(service) {
79
79
  })),
80
80
  },
81
81
  };
82
- return { ...service, agents, container };
82
+ return { ...service, enabled: service.enabled ?? true, agents, container };
83
83
  }
84
84
  export class ServiceTemplateSpec {
85
85
  constructor(template) {
@@ -194,6 +194,7 @@ function serializeServiceSpec(service) {
194
194
  };
195
195
  return pruneUndefinedValues({
196
196
  ...service,
197
+ enabled: service.enabled ?? true,
197
198
  container,
198
199
  agents,
199
200
  });
@@ -590,7 +591,7 @@ export class Meshagent {
590
591
  serializeAccessSubject(subject) {
591
592
  return {
592
593
  type: subject.type,
593
- id: subject.id,
594
+ ...(subject.id !== undefined ? { id: subject.id } : {}),
594
595
  ...(subject.name !== undefined ? { name: subject.name } : {}),
595
596
  ...(subject.firstName !== undefined ? { first_name: subject.firstName } : {}),
596
597
  ...(subject.lastName !== undefined ? { last_name: subject.lastName } : {}),
@@ -599,6 +600,24 @@ export class Meshagent {
599
600
  ...(subject.relation !== undefined ? { relation: subject.relation } : {}),
600
601
  };
601
602
  }
603
+ parseLlmDelegation(data) {
604
+ if (!data || typeof data !== "object" || typeof data.id !== "string" || typeof data.token !== "string"
605
+ || typeof data.expires_at !== "string" || typeof data.project_id !== "string"
606
+ || typeof data.max_budget !== "string") {
607
+ throw new RoomException("Invalid LLM delegation payload");
608
+ }
609
+ return {
610
+ id: data.id,
611
+ token: data.token,
612
+ expiresAt: data.expires_at,
613
+ projectId: data.project_id,
614
+ delegator: this.parseAccessSubject(data.delegator),
615
+ subject: this.parseAccessSubject(data.subject),
616
+ providers: Array.isArray(data.providers) ? data.providers : null,
617
+ models: Array.isArray(data.models) ? data.models.filter((value) => typeof value === "string") : null,
618
+ maxBudget: data.max_budget,
619
+ };
620
+ }
602
621
  serializeAccessResource(resource) {
603
622
  return {
604
623
  type: resource.type,
@@ -719,6 +738,9 @@ export class Meshagent {
719
738
  metadata: parsedResource.metadata ?? {},
720
739
  annotations: parsedResource.annotations ?? {},
721
740
  };
741
+ if (!parsedSubject.id) {
742
+ throw new RoomException("Invalid room grant payload: missing subject id");
743
+ }
722
744
  return {
723
745
  resource: parsedResource,
724
746
  subject: parsedSubject,
@@ -1888,6 +1910,21 @@ export class Meshagent {
1888
1910
  });
1889
1911
  return this.parseAgentConnectionInfo(data);
1890
1912
  }
1913
+ async connectLlm(params) {
1914
+ const data = await this.request("/llm/connect", {
1915
+ method: "POST",
1916
+ headers: { "Meshagent-Project-Id": params.projectId },
1917
+ json: {
1918
+ subject: this.serializeAccessSubject(params.subject),
1919
+ max_budget: params.maxBudget,
1920
+ ...(params.providers !== undefined ? { providers: params.providers } : {}),
1921
+ ...(params.models !== undefined ? { models: params.models } : {}),
1922
+ ...(params.expiresInSeconds !== undefined ? { expires_in_seconds: params.expiresInSeconds } : {}),
1923
+ },
1924
+ action: "connect LLM delegation",
1925
+ });
1926
+ return this.parseLlmDelegation(data);
1927
+ }
1891
1928
  async listRooms(projectId, options = {}) {
1892
1929
  const { pageSize = 50, continuationToken, filter, view } = options;
1893
1930
  const data = await this.request(`/accounts/projects/${projectId}/rooms`, {
@@ -1,8 +1,8 @@
1
1
  import { ApiScope } from "./participant-token.js";
2
- export type ProjectRole = "member" | "admin" | "developer" | "room_creator" | "room_inventory" | "room_manager" | "session_inventory" | "agent_creator" | "agent_inventory" | "agent_manager" | "repository_creator" | "repository_inventory" | "repository_manager" | "feed_creator" | "feed_inventory" | "feed_manager" | "oauth_client_creator" | "oauth_client_inventory" | "oauth_client_manager" | "api_key_creator" | "api_key_inventory" | "api_key_manager" | "service_creator" | "service_inventory" | "service_manager" | "service_account_creator" | "service_account_inventory" | "service_account_manager" | "participant_token_creator" | "mailbox_creator" | "mailbox_inventory" | "mailbox_manager" | "route_creator" | "route_inventory" | "route_manager" | "scheduled_task_creator" | "scheduled_task_inventory" | "scheduled_task_manager" | "feed_subscription_creator" | "feed_subscription_inventory" | "feed_subscription_manager" | "llm_logger_creator" | "llm_logger_inventory" | "llm_logger_manager" | "llm_proxy_user" | "usage_reporter" | "billing_manager" | "group_manager";
2
+ export type ProjectRole = "member" | "admin" | "developer" | "room_creator" | "room_inventory" | "room_manager" | "session_inventory" | "agent_creator" | "agent_inventory" | "agent_manager" | "repository_creator" | "repository_inventory" | "repository_manager" | "feed_creator" | "feed_inventory" | "feed_manager" | "oauth_client_creator" | "oauth_client_inventory" | "oauth_client_manager" | "api_key_creator" | "api_key_inventory" | "api_key_manager" | "service_creator" | "service_inventory" | "service_manager" | "service_account_creator" | "service_account_inventory" | "service_account_manager" | "participant_token_creator" | "mailbox_creator" | "mailbox_inventory" | "mailbox_manager" | "route_creator" | "route_inventory" | "route_manager" | "scheduled_task_creator" | "scheduled_task_inventory" | "scheduled_task_manager" | "feed_subscription_creator" | "feed_subscription_inventory" | "feed_subscription_manager" | "llm_logger_creator" | "llm_logger_inventory" | "llm_logger_manager" | "llm_proxy_user" | "llm_quota_manager" | "usage_reporter" | "billing_manager" | "group_manager";
3
3
  export type ResourceRole = "viewer" | "operator" | "developer" | "admin";
4
4
  export type RoomRole = "site_user" | "guest" | ResourceRole;
5
- export type ProjectSettingsDocumentName = "openai" | "anthropic" | "otel" | "admission" | "room" | "room_roles";
5
+ export type ProjectSettingsDocumentName = "openai" | "anthropic" | "otel" | "admission" | "room" | "room_roles" | "router";
6
6
  export type FeedRole = "reader" | "subscriber" | "publisher" | "manager";
7
7
  export type SecretRole = "use_proxy";
8
8
  export type AccessRole = ProjectRole | RoomRole | FeedRole | SecretRole | "list";
@@ -10,13 +10,25 @@ export type AccessSubjectType = "user" | "group" | "agent" | "service_account" |
10
10
  export type AccessResourceType = "project" | "room" | "agent" | "group" | "repository" | "feed" | "secret";
11
11
  export interface AccessSubject {
12
12
  type: AccessSubjectType;
13
- id: string;
13
+ id?: string | null;
14
14
  name?: string | null;
15
15
  firstName?: string | null;
16
16
  lastName?: string | null;
17
17
  email?: string | null;
18
18
  objectType?: "project" | null;
19
- relation?: "member" | "developer" | "agent" | null;
19
+ relation?: "member" | "developer" | "agent" | "service_account" | null;
20
+ }
21
+ export type LlmProvider = "openai" | "anthropic";
22
+ export interface LlmDelegation {
23
+ id: string;
24
+ token: string;
25
+ expiresAt: string;
26
+ projectId: string;
27
+ delegator: AccessSubject;
28
+ subject: AccessSubject;
29
+ providers?: LlmProvider[] | null;
30
+ models?: string[] | null;
31
+ maxBudget: string;
20
32
  }
21
33
  export interface AccessResource {
22
34
  type: AccessResourceType;
@@ -401,6 +413,7 @@ export interface ServiceSpec {
401
413
  version: "v1";
402
414
  kind: "Service";
403
415
  id?: string | null;
416
+ enabled?: boolean;
404
417
  metadata: ServiceMetadata;
405
418
  agents?: AgentSpec[] | null;
406
419
  ports?: PortSpec[];
@@ -587,6 +600,7 @@ export declare class Meshagent {
587
600
  private parseAccessResource;
588
601
  private parseAccessSubject;
589
602
  private serializeAccessSubject;
603
+ private parseLlmDelegation;
590
604
  private serializeAccessResource;
591
605
  private parseProjectMember;
592
606
  private parseGroupMember;
@@ -949,6 +963,14 @@ export declare class Meshagent {
949
963
  }): Promise<void>;
950
964
  connectRoom(projectId: string, room: string): Promise<RoomConnectionInfo>;
951
965
  connectAgent(projectId: string, agentName: string): Promise<AgentConnectionInfo>;
966
+ connectLlm(params: {
967
+ projectId: string;
968
+ subject: AccessSubject;
969
+ maxBudget: string;
970
+ providers?: LlmProvider[];
971
+ models?: string[];
972
+ expiresInSeconds?: number;
973
+ }): Promise<LlmDelegation>;
952
974
  listRooms(projectId: string, options?: {
953
975
  pageSize?: number;
954
976
  continuationToken?: string;
@@ -83,7 +83,7 @@ function normalizeServiceSpec(service) {
83
83
  })),
84
84
  },
85
85
  };
86
- return { ...service, agents, container };
86
+ return { ...service, enabled: service.enabled ?? true, agents, container };
87
87
  }
88
88
  class ServiceTemplateSpec {
89
89
  constructor(template) {
@@ -199,6 +199,7 @@ function serializeServiceSpec(service) {
199
199
  };
200
200
  return pruneUndefinedValues({
201
201
  ...service,
202
+ enabled: service.enabled ?? true,
202
203
  container,
203
204
  agents,
204
205
  });
@@ -595,7 +596,7 @@ class Meshagent {
595
596
  serializeAccessSubject(subject) {
596
597
  return {
597
598
  type: subject.type,
598
- id: subject.id,
599
+ ...(subject.id !== undefined ? { id: subject.id } : {}),
599
600
  ...(subject.name !== undefined ? { name: subject.name } : {}),
600
601
  ...(subject.firstName !== undefined ? { first_name: subject.firstName } : {}),
601
602
  ...(subject.lastName !== undefined ? { last_name: subject.lastName } : {}),
@@ -604,6 +605,24 @@ class Meshagent {
604
605
  ...(subject.relation !== undefined ? { relation: subject.relation } : {}),
605
606
  };
606
607
  }
608
+ parseLlmDelegation(data) {
609
+ if (!data || typeof data !== "object" || typeof data.id !== "string" || typeof data.token !== "string"
610
+ || typeof data.expires_at !== "string" || typeof data.project_id !== "string"
611
+ || typeof data.max_budget !== "string") {
612
+ throw new requirement_js_1.RoomException("Invalid LLM delegation payload");
613
+ }
614
+ return {
615
+ id: data.id,
616
+ token: data.token,
617
+ expiresAt: data.expires_at,
618
+ projectId: data.project_id,
619
+ delegator: this.parseAccessSubject(data.delegator),
620
+ subject: this.parseAccessSubject(data.subject),
621
+ providers: Array.isArray(data.providers) ? data.providers : null,
622
+ models: Array.isArray(data.models) ? data.models.filter((value) => typeof value === "string") : null,
623
+ maxBudget: data.max_budget,
624
+ };
625
+ }
607
626
  serializeAccessResource(resource) {
608
627
  return {
609
628
  type: resource.type,
@@ -724,6 +743,9 @@ class Meshagent {
724
743
  metadata: parsedResource.metadata ?? {},
725
744
  annotations: parsedResource.annotations ?? {},
726
745
  };
746
+ if (!parsedSubject.id) {
747
+ throw new requirement_js_1.RoomException("Invalid room grant payload: missing subject id");
748
+ }
727
749
  return {
728
750
  resource: parsedResource,
729
751
  subject: parsedSubject,
@@ -1893,6 +1915,21 @@ class Meshagent {
1893
1915
  });
1894
1916
  return this.parseAgentConnectionInfo(data);
1895
1917
  }
1918
+ async connectLlm(params) {
1919
+ const data = await this.request("/llm/connect", {
1920
+ method: "POST",
1921
+ headers: { "Meshagent-Project-Id": params.projectId },
1922
+ json: {
1923
+ subject: this.serializeAccessSubject(params.subject),
1924
+ max_budget: params.maxBudget,
1925
+ ...(params.providers !== undefined ? { providers: params.providers } : {}),
1926
+ ...(params.models !== undefined ? { models: params.models } : {}),
1927
+ ...(params.expiresInSeconds !== undefined ? { expires_in_seconds: params.expiresInSeconds } : {}),
1928
+ },
1929
+ action: "connect LLM delegation",
1930
+ });
1931
+ return this.parseLlmDelegation(data);
1932
+ }
1896
1933
  async listRooms(projectId, options = {}) {
1897
1934
  const { pageSize = 50, continuationToken, filter, view } = options;
1898
1935
  const data = await this.request(`/accounts/projects/${projectId}/rooms`, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshagent/meshagent",
3
- "version": "0.49.0",
3
+ "version": "0.50.0",
4
4
  "description": "Meshagent Client",
5
5
  "homepage": "https://github.com/meshagent/meshagent-ts",
6
6
  "scripts": {