@borgee/agents-host 0.2.1 → 0.2.26
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/README.md +184 -21
- package/dist/agents-host-supervisor.d.ts +7 -5
- package/dist/agents-host-supervisor.js +24 -4
- package/dist/agents-host.d.ts +89 -15
- package/dist/agents-host.js +2099 -142
- package/dist/chat/chat-control-plane.d.ts +14 -3
- package/dist/chat/sdk-chat-control-plane.d.ts +16 -4
- package/dist/chat/sdk-chat-control-plane.js +69 -9
- package/dist/cli-args.d.ts +46 -5
- package/dist/cli-args.js +313 -32
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +112 -5
- package/dist/compatibility-gates.d.ts +35 -0
- package/dist/compatibility-gates.js +127 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.js +23 -5
- package/dist/connections-state-store.d.ts +81 -0
- package/dist/connections-state-store.js +228 -0
- package/dist/context/injection.d.ts +109 -0
- package/dist/context/injection.js +350 -0
- package/dist/context/prompt.d.ts +4 -1
- package/dist/context/prompt.js +170 -1
- package/dist/context/turn-preparation.d.ts +9 -0
- package/dist/context/turn-preparation.js +106 -0
- package/dist/debug.d.ts +44 -0
- package/dist/debug.js +135 -0
- package/dist/gateway/localhost-gateway.d.ts +52 -0
- package/dist/gateway/localhost-gateway.js +857 -0
- package/dist/index.js +7 -5
- package/dist/local-config.d.ts +4 -1
- package/dist/local-config.js +24 -7
- package/dist/managed-daemon-log.d.ts +34 -0
- package/dist/managed-daemon-log.js +261 -0
- package/dist/managed-daemon.d.ts +220 -0
- package/dist/managed-daemon.js +1601 -0
- package/dist/policy/authorization-audit.d.ts +63 -0
- package/dist/policy/authorization-audit.js +94 -0
- package/dist/policy/copilot-permission.d.ts +15 -0
- package/dist/policy/copilot-permission.js +193 -0
- package/dist/policy/gateway-authorization.d.ts +42 -0
- package/dist/policy/gateway-authorization.js +162 -0
- package/dist/providers/awaiting-user.d.ts +12 -0
- package/dist/providers/awaiting-user.js +151 -0
- package/dist/providers/claude/adapter.d.ts +3 -1
- package/dist/providers/claude/adapter.js +8 -12
- package/dist/providers/claude/cli-client.d.ts +12 -5
- package/dist/providers/claude/cli-client.js +184 -37
- package/dist/providers/claude/session-store.d.ts +24 -0
- package/dist/providers/claude/session-store.js +65 -12
- package/dist/providers/codex/adapter.d.ts +11 -0
- package/dist/providers/codex/adapter.js +19 -0
- package/dist/providers/codex/cli-client.d.ts +103 -0
- package/dist/providers/codex/cli-client.js +1133 -0
- package/dist/providers/codex/project-doc.d.ts +3 -0
- package/dist/providers/codex/project-doc.js +66 -0
- package/dist/providers/codex/session-store.d.ts +38 -0
- package/dist/providers/codex/session-store.js +150 -0
- package/dist/providers/copilot/adapter.d.ts +3 -1
- package/dist/providers/copilot/adapter.js +8 -12
- package/dist/providers/copilot/cli-client.d.ts +20 -2
- package/dist/providers/copilot/cli-client.js +251 -71
- package/dist/providers/copilot/session-store.d.ts +24 -0
- package/dist/providers/copilot/session-store.js +65 -12
- package/dist/providers/create-provider.d.ts +11 -2
- package/dist/providers/create-provider.js +131 -12
- package/dist/run.d.ts +1 -0
- package/dist/run.js +5 -2
- package/dist/state-paths.d.ts +13 -1
- package/dist/state-paths.js +84 -3
- package/dist/task-thread-resolution.d.ts +10 -0
- package/dist/task-thread-resolution.js +48 -0
- package/dist/types.d.ts +174 -1
- package/dist/visible-mentions.d.ts +3 -0
- package/dist/visible-mentions.js +15 -0
- package/package.json +19 -17
- package/skills/borgee-agent/SKILL.md +33 -0
- package/skills/borgee-agent/borgee-agent.mjs +473 -0
- package/skills/borgee-agent/borgee-agent.py +409 -0
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
import type { ChannelMessageEvent, MeResponseUser, PostedMessage } from '../types.js';
|
|
1
|
+
import type { ChannelSummary, ChannelHistoryEntry, ChannelMessageEvent, CreateTaskInput, DirectoryUser, MeResponseUser, PostMessageInput, PostedMessage, ReadChannelHistoryInput, Task, UpdateTaskInput } from '../types.js';
|
|
2
2
|
export interface ChatControlPlane {
|
|
3
|
-
connect(onMessage: (message: ChannelMessageEvent) => void
|
|
3
|
+
connect(onMessage: (message: ChannelMessageEvent) => void): Promise<void>;
|
|
4
4
|
close(): Promise<void>;
|
|
5
|
-
postMessage(
|
|
5
|
+
postMessage(input: PostMessageInput): Promise<PostedMessage>;
|
|
6
6
|
editMessage(messageId: string, content: string): Promise<void>;
|
|
7
7
|
deleteMessage(messageId: string): Promise<void>;
|
|
8
8
|
startTyping(channelId: string): () => void;
|
|
9
9
|
getMe(): Promise<MeResponseUser>;
|
|
10
|
+
listUsers(): Promise<DirectoryUser[]>;
|
|
11
|
+
listChannels(): Promise<ChannelSummary[]>;
|
|
12
|
+
readChannelHistory(input: ReadChannelHistoryInput): Promise<ChannelHistoryEntry[]>;
|
|
13
|
+
createTask(input: CreateTaskInput): Promise<Task>;
|
|
14
|
+
listTasks(input: {
|
|
15
|
+
channelId: string;
|
|
16
|
+
}): Promise<Task[]>;
|
|
17
|
+
getTask(input: {
|
|
18
|
+
taskId: string;
|
|
19
|
+
}): Promise<Task>;
|
|
20
|
+
updateTask(input: UpdateTaskInput): Promise<Task>;
|
|
10
21
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type BorgeePluginClient, type BorgeePluginOptions, type InboundMessageEvent } from '@borgee/plugin-sdk';
|
|
2
|
-
import type { ChannelMessageEvent, MeResponseUser, PostedMessage } from '../types.js';
|
|
2
|
+
import type { ChannelSummary, ChannelHistoryEntry, ChannelMessageEvent, CreateTaskInput, DirectoryUser, MeResponseUser, PostMessageInput, PostedMessage, ReadChannelHistoryInput, Task, UpdateTaskInput } from '../types.js';
|
|
3
3
|
import type { ChatControlPlane } from './chat-control-plane.js';
|
|
4
|
-
type PluginClientLike = Pick<BorgeePluginClient, 'agentId' | 'close' | 'connect' | 'deleteMessage' | 'editMessage' | 'getMe' | 'on' | 'sendMessage' | 'startTyping'>;
|
|
4
|
+
type PluginClientLike = Pick<BorgeePluginClient, 'agentId' | 'close' | 'connect' | 'createTask' | 'deleteMessage' | 'editMessage' | 'getMe' | 'getTask' | 'listChannels' | 'listTasks' | 'listUsers' | 'on' | 'readHistory' | 'sendMessage' | 'startTyping' | 'updateTask'>;
|
|
5
5
|
type PluginClientFactory = (options: BorgeePluginOptions) => PluginClientLike;
|
|
6
6
|
type SdkChatControlPlaneOptions = Pick<BorgeePluginOptions, 'cursorStore' | 'pluginId'>;
|
|
7
7
|
/**
|
|
@@ -11,17 +11,29 @@ type SdkChatControlPlaneOptions = Pick<BorgeePluginOptions, 'cursorStore' | 'plu
|
|
|
11
11
|
*/
|
|
12
12
|
export declare class SdkChatControlPlane implements ChatControlPlane {
|
|
13
13
|
private readonly client;
|
|
14
|
+
private pendingMessages;
|
|
14
15
|
private unsubscribe;
|
|
15
16
|
private connected;
|
|
16
17
|
private me;
|
|
17
18
|
constructor(baseUrl: string, apiKey: string, createClient?: PluginClientFactory, options?: SdkChatControlPlaneOptions);
|
|
18
|
-
connect(onMessage: (message: ChannelMessageEvent) => void
|
|
19
|
+
connect(onMessage: (message: ChannelMessageEvent) => void): Promise<void>;
|
|
19
20
|
close(): Promise<void>;
|
|
20
|
-
postMessage(
|
|
21
|
+
postMessage(input: PostMessageInput): Promise<PostedMessage>;
|
|
21
22
|
editMessage(messageId: string, content: string): Promise<void>;
|
|
22
23
|
deleteMessage(messageId: string): Promise<void>;
|
|
23
24
|
startTyping(channelId: string): () => void;
|
|
24
25
|
getMe(): Promise<MeResponseUser>;
|
|
26
|
+
listUsers(): Promise<DirectoryUser[]>;
|
|
27
|
+
readChannelHistory(input: ReadChannelHistoryInput): Promise<ChannelHistoryEntry[]>;
|
|
28
|
+
listChannels(): Promise<ChannelSummary[]>;
|
|
29
|
+
createTask(input: CreateTaskInput): Promise<Task>;
|
|
30
|
+
listTasks(input: {
|
|
31
|
+
channelId: string;
|
|
32
|
+
}): Promise<Task[]>;
|
|
33
|
+
getTask(input: {
|
|
34
|
+
taskId: string;
|
|
35
|
+
}): Promise<Task>;
|
|
36
|
+
updateTask(input: UpdateTaskInput): Promise<Task>;
|
|
25
37
|
}
|
|
26
38
|
export declare function mapInboundToChannelMessage(event: InboundMessageEvent): ChannelMessageEvent;
|
|
27
39
|
export {};
|
|
@@ -6,6 +6,7 @@ import { createBorgeePlugin, } from '@borgee/plugin-sdk';
|
|
|
6
6
|
*/
|
|
7
7
|
export class SdkChatControlPlane {
|
|
8
8
|
client;
|
|
9
|
+
pendingMessages = [];
|
|
9
10
|
unsubscribe = null;
|
|
10
11
|
connected = false;
|
|
11
12
|
me = null;
|
|
@@ -13,34 +14,45 @@ export class SdkChatControlPlane {
|
|
|
13
14
|
this.client = createClient({ baseUrl, apiKey, ...options });
|
|
14
15
|
}
|
|
15
16
|
async connect(onMessage) {
|
|
16
|
-
this.unsubscribe = this.client.on('message',
|
|
17
|
-
|
|
17
|
+
this.unsubscribe = this.client.on('message', (event) => {
|
|
18
|
+
const message = mapInboundToChannelMessage(event);
|
|
19
|
+
if (!this.connected) {
|
|
20
|
+
this.pendingMessages.push(message);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
onMessage(message);
|
|
18
24
|
});
|
|
19
25
|
try {
|
|
20
|
-
// The SDK resolves connect after session.resume_ack, before every replay
|
|
21
|
-
// frame necessarily runs. Mark the consumer ready first so replay ACKs
|
|
22
|
-
// wait for the real handler instead of acknowledging an in-memory buffer.
|
|
23
|
-
this.connected = true;
|
|
24
26
|
await this.client.connect();
|
|
27
|
+
this.connected = true;
|
|
25
28
|
if (this.client.agentId) {
|
|
26
29
|
this.me = { id: this.client.agentId };
|
|
27
30
|
}
|
|
31
|
+
for (const message of this.pendingMessages) {
|
|
32
|
+
onMessage(message);
|
|
33
|
+
}
|
|
34
|
+
this.pendingMessages = [];
|
|
28
35
|
}
|
|
29
36
|
catch (error) {
|
|
30
|
-
this.connected = false;
|
|
31
37
|
this.unsubscribe?.();
|
|
32
38
|
this.unsubscribe = null;
|
|
39
|
+
this.pendingMessages = [];
|
|
33
40
|
throw error;
|
|
34
41
|
}
|
|
35
42
|
}
|
|
36
43
|
async close() {
|
|
37
44
|
this.connected = false;
|
|
45
|
+
this.pendingMessages = [];
|
|
38
46
|
this.unsubscribe?.();
|
|
39
47
|
this.unsubscribe = null;
|
|
40
48
|
await this.client.close();
|
|
41
49
|
}
|
|
42
|
-
async postMessage(
|
|
43
|
-
const sent = await this.client.sendMessage({
|
|
50
|
+
async postMessage(input) {
|
|
51
|
+
const sent = await this.client.sendMessage({
|
|
52
|
+
channelId: input.channelId,
|
|
53
|
+
body: input.body,
|
|
54
|
+
replyToId: input.replyToId,
|
|
55
|
+
});
|
|
44
56
|
return { messageId: sent.messageId };
|
|
45
57
|
}
|
|
46
58
|
async editMessage(messageId, content) {
|
|
@@ -64,10 +76,58 @@ export class SdkChatControlPlane {
|
|
|
64
76
|
};
|
|
65
77
|
return this.me;
|
|
66
78
|
}
|
|
79
|
+
async listUsers() {
|
|
80
|
+
const users = await this.client.listUsers();
|
|
81
|
+
return users.map((user) => ({
|
|
82
|
+
id: user.id,
|
|
83
|
+
display_name: user.displayName,
|
|
84
|
+
kind: user.kind,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
async readChannelHistory(input) {
|
|
88
|
+
const messages = await this.client.readHistory({
|
|
89
|
+
channelId: input.channelId,
|
|
90
|
+
before: input.before,
|
|
91
|
+
after: input.after,
|
|
92
|
+
limit: input.limit,
|
|
93
|
+
});
|
|
94
|
+
return messages.map((message) => ({
|
|
95
|
+
id: message.id,
|
|
96
|
+
channelId: message.channelId,
|
|
97
|
+
authorId: message.authorId,
|
|
98
|
+
body: message.body,
|
|
99
|
+
contentType: message.contentType,
|
|
100
|
+
type: message.type,
|
|
101
|
+
replyToId: message.replyToId,
|
|
102
|
+
createdAt: message.createdAt,
|
|
103
|
+
editedAt: message.editedAt,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
async listChannels() {
|
|
107
|
+
const channels = await this.client.listChannels();
|
|
108
|
+
return channels.map((channel) => ({
|
|
109
|
+
id: channel.id,
|
|
110
|
+
name: channel.name,
|
|
111
|
+
kind: channel.kind,
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
async createTask(input) {
|
|
115
|
+
return this.client.createTask(input);
|
|
116
|
+
}
|
|
117
|
+
async listTasks(input) {
|
|
118
|
+
return this.client.listTasks(input);
|
|
119
|
+
}
|
|
120
|
+
async getTask(input) {
|
|
121
|
+
return this.client.getTask(input);
|
|
122
|
+
}
|
|
123
|
+
async updateTask(input) {
|
|
124
|
+
return this.client.updateTask(input);
|
|
125
|
+
}
|
|
67
126
|
}
|
|
68
127
|
export function mapInboundToChannelMessage(event) {
|
|
69
128
|
return {
|
|
70
129
|
type: event.kind,
|
|
130
|
+
...(event.message?.type != null ? { message_type: event.message.type } : {}),
|
|
71
131
|
channel_id: event.channelId,
|
|
72
132
|
channel_type: event.channelType,
|
|
73
133
|
message_id: event.message?.id ?? event.messageId,
|
package/dist/cli-args.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Maps
|
|
3
|
-
* reads. Keeping this as a plain lookup table (rather than
|
|
4
|
-
* `loadConfigFromEnv`'s parsing logic) means the CLI and the
|
|
5
|
-
* point (`index.ts`) always agree on
|
|
2
|
+
* Maps `agents-host start` / `agents-host start-managed` agent flags to the env
|
|
3
|
+
* vars `config.ts` reads. Keeping this as a plain lookup table (rather than
|
|
4
|
+
* duplicating `loadConfigFromEnv`'s parsing logic) means the CLI and the
|
|
5
|
+
* standalone env-var entry point (`index.ts`) always agree on
|
|
6
|
+
* defaults/validation.
|
|
6
7
|
*/
|
|
7
8
|
export declare const CLI_FLAG_TO_ENV: Record<string, string>;
|
|
8
9
|
export type ParsedStartArgs = ParsedSingleAgentStartArgs | ParsedLocalConfigStartArgs;
|
|
@@ -10,11 +11,18 @@ export interface ParsedSingleAgentStartArgs {
|
|
|
10
11
|
mode: 'single-agent';
|
|
11
12
|
serverUrl: string;
|
|
12
13
|
apiKey: string;
|
|
14
|
+
debug: boolean;
|
|
15
|
+
env: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export interface ParsedManagedStartArgs {
|
|
18
|
+
serverUrl: string;
|
|
19
|
+
apiKey?: string;
|
|
13
20
|
env: Record<string, string>;
|
|
14
21
|
}
|
|
15
22
|
export interface ParsedLocalConfigStartArgs {
|
|
16
23
|
mode: 'local-config';
|
|
17
24
|
configPath: string;
|
|
25
|
+
debug: boolean;
|
|
18
26
|
}
|
|
19
27
|
export interface ParsedValidateArgs {
|
|
20
28
|
configPath: string;
|
|
@@ -35,11 +43,44 @@ export interface ParsedGenerateConfigFromStdinArgs {
|
|
|
35
43
|
input: 'stdin';
|
|
36
44
|
}
|
|
37
45
|
export type ParsedGenerateConfigArgs = ParsedGenerateConfigFromArgvArgs | ParsedGenerateConfigFromStdinArgs;
|
|
46
|
+
export interface ParsedDaemonArgs {
|
|
47
|
+
rootPath: string;
|
|
48
|
+
debug: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface ParsedLogArgs {
|
|
51
|
+
serverUrl: string;
|
|
52
|
+
lines: number;
|
|
53
|
+
follow: boolean;
|
|
54
|
+
pathOnly: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface ParsedDescribeManagedArgs {
|
|
57
|
+
serverUrl: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ParsedCleanupManagedArgs {
|
|
60
|
+
serverUrl: string;
|
|
61
|
+
purge: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface ParsedApplyManagedFromArgvArgs {
|
|
64
|
+
serverUrl: string;
|
|
65
|
+
input: 'argv';
|
|
66
|
+
specJson: string;
|
|
67
|
+
}
|
|
68
|
+
export interface ParsedApplyManagedFromStdinArgs {
|
|
69
|
+
serverUrl: string;
|
|
70
|
+
input: 'stdin';
|
|
71
|
+
}
|
|
72
|
+
export type ParsedApplyManagedArgs = ParsedApplyManagedFromArgvArgs | ParsedApplyManagedFromStdinArgs;
|
|
38
73
|
export declare class CliUsageError extends Error {
|
|
39
74
|
}
|
|
40
75
|
export declare function parseStartArgs(argv: string[]): ParsedStartArgs;
|
|
76
|
+
export declare function parseManagedStartArgs(argv: string[]): ParsedManagedStartArgs;
|
|
41
77
|
export declare function parseValidateArgs(argv: string[]): ParsedValidateArgs;
|
|
42
78
|
export declare function parseDescribeArgs(argv: string[]): ParsedDescribeArgs;
|
|
43
79
|
export declare function parsePrintLayoutArgs(argv: string[]): ParsedPrintLayoutArgs;
|
|
44
80
|
export declare function parseGenerateConfigArgs(argv: string[]): ParsedGenerateConfigArgs;
|
|
45
|
-
export declare
|
|
81
|
+
export declare function parseDaemonArgs(argv: string[]): ParsedDaemonArgs;
|
|
82
|
+
export declare function parseLogArgs(argv: string[]): ParsedLogArgs;
|
|
83
|
+
export declare function parseDescribeManagedArgs(argv: string[]): ParsedDescribeManagedArgs;
|
|
84
|
+
export declare function parseCleanupManagedArgs(argv: string[]): ParsedCleanupManagedArgs;
|
|
85
|
+
export declare function parseApplyManagedArgs(argv: string[]): ParsedApplyManagedArgs;
|
|
86
|
+
export declare const USAGE = "Usage:\n agents-host start <serverUrl> <apiKey> [options]\n agents-host start-managed <serverUrl>\n agents-host start-managed <serverUrl> <apiKey> [agent-options]\n agents-host describe-managed <serverUrl>\n agents-host cleanup-managed <serverUrl> [--purge]\n agents-host apply-managed <serverUrl> --stdin\n agents-host apply-managed <serverUrl> --spec-json <json>\n agents-host log <serverUrl> [--lines <n>] [--follow]\n agents-host log <serverUrl> --path\n agents-host start --config <path-to-host-config> [--debug]\n agents-host validate --config <path-to-host-config>\n agents-host describe --config <path-to-host-config>\n agents-host print-layout --root <dir>\n agents-host generate-config --root <dir> --stdin\n agents-host generate-config --root <dir> --spec-json <json>\n\nForeground start options:\n --debug Enable host/provider debug logs (or set AGENTS_HOST_DEBUG=1)\n\nSingle-agent agent options:\n --name <name> Display name (default: Assistant)\n --provider <claude|codex|copilot>\n Runtime provider (default: claude)\n --claude-command <cmd> Local Claude CLI command (default: claude)\n --claude-args <args> Local Claude CLI args (default: --print --permission-mode bypassPermissions)\n --codex-command <cmd> Local Codex ACP adapter command (default: codex-acp)\n --codex-args <args> Local Codex ACP adapter args\n --copilot-command <cmd> Local Copilot CLI command (default: copilot)\n --copilot-args <args> Ignored by the Copilot ACP prototype\n --copilot-session-ttl-minutes <minutes>\n Idle session TTL for Copilot ACP sessions (default: 2880)\n\nCommand summary:\n start <serverUrl> <apiKey> Start one foreground hosted agent (legacy-compatible behavior)\n start --config <path> Start agents + supervisor + watchers from a host config file\n start-managed <serverUrl> Restart or resume an existing per-serverUrl managed daemon\n start-managed <serverUrl> <apiKey>\n Upsert one agent into the per-serverUrl local daemon and exit after reconcile\n describe-managed <serverUrl> Print managed-runtime spec JSON for machine callers\n cleanup-managed <serverUrl> Stop one managed-runtime daemon locally; --purge also removes its runtime root\n apply-managed <serverUrl> Apply one managed-runtime full-set spec for machine callers\n log <serverUrl> Print the managed daemon log tail for one server runtime\n validate --config <path> Validate local-config files without starting agents or watchers\n describe --config <path> Print the current managed full-set spec as JSON\n print-layout --root <dir> Print the canonical default local-config layout as JSON\n generate-config --root <dir> --stdin Materialize canonical local-config files from stdin\n generate-config --root <dir> --spec-json <json>\n Compatibility input; JSON is exposed in process arguments\n\nExamples:\n agents-host start https://borgee.example.com bgr_xxxxxxxx --provider copilot --debug\n agents-host start-managed https://borgee.example.com\n agents-host start-managed https://borgee.example.com bgr_xxxxxxxx --provider copilot\n agents-host describe-managed https://borgee.example.com\n agents-host cleanup-managed https://borgee.example.com --purge\n printf '%s' '{\"host\":{\"borgeeBaseUrl\":\"https://borgee.example.com\"},\"agents\":[{\"key\":\"cp1\",\"name\":\"Copilot\",\"apiKey\":\"bgr_xxx\",\"provider\":\"copilot\"}]}' | agents-host apply-managed https://borgee.example.com --stdin\n agents-host log https://borgee.example.com --lines 200 --follow\n agents-host log https://borgee.example.com --path\n agents-host start --config ./agents-host.yaml --debug\n agents-host validate --config ./agents-host.yaml\n agents-host describe --config ./agents-host.yaml\n agents-host print-layout --root ./runtime-root\n printf '%s' '{\"host\":{\"borgeeBaseUrl\":\"https://borgee.example.com\"},\"agents\":[{\"key\":\"cp1\",\"name\":\"Copilot\",\"apiKey\":\"bgr_xxx\",\"provider\":\"copilot\"}]}' | agents-host generate-config --root ./runtime-root --stdin\n";
|