@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 +10 -0
- package/dist/browser/meshagent-client.d.ts +26 -4
- package/dist/browser/meshagent-client.js +39 -2
- package/dist/esm/meshagent-client.d.ts +26 -4
- package/dist/esm/meshagent-client.js +39 -2
- package/dist/node/meshagent-client.d.ts +26 -4
- package/dist/node/meshagent-client.js +39 -2
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
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`, {
|