@acp-router/core 0.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.
- package/lib/agents.d.ts +5 -0
- package/lib/agents.d.ts.map +1 -0
- package/lib/agents.js +51 -0
- package/lib/config.d.ts +21 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +18 -0
- package/lib/constants.d.ts +5 -0
- package/lib/constants.d.ts.map +1 -0
- package/lib/constants.js +1 -0
- package/lib/content.d.ts +18 -0
- package/lib/content.d.ts.map +1 -0
- package/lib/content.js +25 -0
- package/lib/im-adapter.d.ts +48 -0
- package/lib/im-adapter.d.ts.map +1 -0
- package/lib/im-adapter.js +3 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/logger.d.ts +3 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +5 -0
- package/lib/registry.d.ts +4 -0
- package/lib/registry.d.ts.map +1 -0
- package/lib/registry.js +36 -0
- package/lib/router.d.ts +95 -0
- package/lib/router.d.ts.map +1 -0
- package/lib/router.js +807 -0
- package/lib/types.d.ts +46 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +1 -0
- package/package.json +21 -0
package/lib/agents.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AgentLaunchRequest, AgentLauncher, AgentProcess, AgentRegistryEntry } from './types.js';
|
|
2
|
+
export declare class NodeAgentLauncher implements AgentLauncher {
|
|
3
|
+
launch(request: AgentLaunchRequest, entry: AgentRegistryEntry): Promise<AgentProcess>;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAErG,qBAAa,iBAAkB,YAAW,aAAa;IAC/C,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;CAsB5F"}
|
package/lib/agents.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export class NodeAgentLauncher {
|
|
3
|
+
async launch(request, entry) {
|
|
4
|
+
const args = [...(entry.args ?? []), ...(request.args ?? [])];
|
|
5
|
+
const env = { ...process.env, ...(entry.env ?? {}), ...(request.env ?? {}) };
|
|
6
|
+
const cwd = request.cwd ?? entry.cwd;
|
|
7
|
+
const child = spawn(entry.command, args, {
|
|
8
|
+
cwd,
|
|
9
|
+
env,
|
|
10
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
11
|
+
});
|
|
12
|
+
if (!child.stdin || !child.stdout)
|
|
13
|
+
throw new Error('Failed to spawn agent process');
|
|
14
|
+
const stdin = streamToWritable(child.stdin);
|
|
15
|
+
const stdout = streamToReadable(child.stdout);
|
|
16
|
+
const stderr = child.stderr ? streamToReadable(child.stderr) : undefined;
|
|
17
|
+
return {
|
|
18
|
+
stdin,
|
|
19
|
+
stdout,
|
|
20
|
+
stderr,
|
|
21
|
+
pid: child.pid,
|
|
22
|
+
kill: () => child.kill(),
|
|
23
|
+
wait: () => new Promise((resolve) => child.once('exit', (code) => resolve(code ?? null)))
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function streamToReadable(stream) {
|
|
28
|
+
return new ReadableStream({
|
|
29
|
+
start(controller) {
|
|
30
|
+
stream.on('data', (chunk) => controller.enqueue(new Uint8Array(chunk)));
|
|
31
|
+
stream.on('end', () => controller.close());
|
|
32
|
+
stream.on('error', (err) => controller.error(err));
|
|
33
|
+
},
|
|
34
|
+
cancel() {
|
|
35
|
+
stream.destroy();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function streamToWritable(stream) {
|
|
40
|
+
return new WritableStream({
|
|
41
|
+
write(chunk) {
|
|
42
|
+
stream.write(chunk);
|
|
43
|
+
},
|
|
44
|
+
close() {
|
|
45
|
+
stream.end();
|
|
46
|
+
},
|
|
47
|
+
abort() {
|
|
48
|
+
stream.destroy();
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface RouterConfig {
|
|
2
|
+
allowList: number[];
|
|
3
|
+
defaultAgentId?: string;
|
|
4
|
+
agents: Record<string, {
|
|
5
|
+
name?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
command: string;
|
|
8
|
+
args?: string[];
|
|
9
|
+
env?: Record<string, string>;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}>;
|
|
12
|
+
session: {
|
|
13
|
+
cwd?: string;
|
|
14
|
+
};
|
|
15
|
+
telegram?: {
|
|
16
|
+
token?: string;
|
|
17
|
+
permissionTimeoutMs?: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function normalizeConfig(input: Partial<RouterConfig>): RouterConfig;
|
|
21
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CACZ,MAAM,EACN;QACE,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CACF,CAAA;IACD,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;IACD,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAC7B,CAAA;CACF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAe1E"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function normalizeConfig(input) {
|
|
2
|
+
if (!input.allowList?.length)
|
|
3
|
+
throw new Error('Config: allowList must be a non-empty array');
|
|
4
|
+
if (!input.agents || !Object.keys(input.agents).length)
|
|
5
|
+
throw new Error('Config: agents is required');
|
|
6
|
+
return {
|
|
7
|
+
allowList: input.allowList,
|
|
8
|
+
defaultAgentId: input.defaultAgentId,
|
|
9
|
+
agents: input.agents,
|
|
10
|
+
session: {
|
|
11
|
+
cwd: input.session?.cwd ?? process.cwd()
|
|
12
|
+
},
|
|
13
|
+
telegram: {
|
|
14
|
+
token: input.telegram?.token,
|
|
15
|
+
permissionTimeoutMs: input.telegram?.permissionTimeoutMs
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;CAAoD,CAAA"}
|
package/lib/constants.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const CLIENT_INFO = { name: 'acp-router', version: '0.1.0' };
|
package/lib/content.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ContentBlock } from './types.js';
|
|
2
|
+
export type NormalizedContent = {
|
|
3
|
+
kind: 'text';
|
|
4
|
+
text: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'image';
|
|
7
|
+
mimeType: string;
|
|
8
|
+
data: Uint8Array;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'audio';
|
|
11
|
+
mimeType: string;
|
|
12
|
+
data: Uint8Array;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'unknown';
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function normalizeContent(block: ContentBlock): NormalizedContent;
|
|
18
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAevE"}
|
package/lib/content.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function normalizeContent(block) {
|
|
2
|
+
switch (block.type) {
|
|
3
|
+
case 'text':
|
|
4
|
+
return { kind: 'text', text: block.text };
|
|
5
|
+
case 'image':
|
|
6
|
+
return { kind: 'image', mimeType: block.mimeType, data: decodeBase64(block.data) };
|
|
7
|
+
case 'audio':
|
|
8
|
+
return { kind: 'audio', mimeType: block.mimeType, data: decodeBase64(block.data) };
|
|
9
|
+
case 'resource_link':
|
|
10
|
+
return { kind: 'unknown', type: 'resource_link' };
|
|
11
|
+
case 'resource':
|
|
12
|
+
return { kind: 'unknown', type: 'resource' };
|
|
13
|
+
default:
|
|
14
|
+
return { kind: 'unknown', type: block.type };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function decodeBase64(data) {
|
|
18
|
+
if (typeof Buffer !== 'undefined')
|
|
19
|
+
return Buffer.from(data, 'base64');
|
|
20
|
+
const bin = globalThis.atob(data);
|
|
21
|
+
const out = new Uint8Array(bin.length);
|
|
22
|
+
for (let i = 0; i < bin.length; i++)
|
|
23
|
+
out[i] = bin.charCodeAt(i);
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
export type InlineAction = {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export type InlineActions = {
|
|
7
|
+
columns?: number;
|
|
8
|
+
items: InlineAction[];
|
|
9
|
+
callback: (actionId: string) => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
export type InlineMessage = {
|
|
12
|
+
markdown: string;
|
|
13
|
+
actions?: InlineActions;
|
|
14
|
+
};
|
|
15
|
+
export type InlineUpdate = {
|
|
16
|
+
markdown?: string;
|
|
17
|
+
actions?: Partial<InlineActions> | null;
|
|
18
|
+
};
|
|
19
|
+
export type TextMessageKind = 'message' | 'thought';
|
|
20
|
+
export type InteractiveMessageKind = 'generic' | 'tool' | 'permission' | 'status' | 'picker';
|
|
21
|
+
export type AdapterInteraction = {
|
|
22
|
+
id: string;
|
|
23
|
+
message: InlineMessage;
|
|
24
|
+
};
|
|
25
|
+
export type AdapterEventMap = {
|
|
26
|
+
text: [chatId: string, messageId: string, text: string];
|
|
27
|
+
command: [chatId: string, messageId: string, command: string, args: string[]];
|
|
28
|
+
};
|
|
29
|
+
export declare abstract class IMAdapter extends EventEmitter<AdapterEventMap> {
|
|
30
|
+
abstract readonly platform: string;
|
|
31
|
+
abstract init(): Promise<void>;
|
|
32
|
+
abstract sendTextMessage(chatId: string, markdown: string, kind?: TextMessageKind): Promise<void>;
|
|
33
|
+
abstract sendMedia(chatId: string, payload: {
|
|
34
|
+
kind: string;
|
|
35
|
+
mimeType: string;
|
|
36
|
+
data: Uint8Array;
|
|
37
|
+
filename?: string;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
abstract setCommands(commands: {
|
|
40
|
+
name: string;
|
|
41
|
+
description: string;
|
|
42
|
+
}[]): Promise<void>;
|
|
43
|
+
abstract sendInteractiveMessage(chatId: string, message: InlineMessage, kind?: InteractiveMessageKind): Promise<AdapterInteraction>;
|
|
44
|
+
abstract editInteractiveMessage(chatId: string, messageId: string, update: InlineUpdate): Promise<void>;
|
|
45
|
+
abstract setActive(chatId: string, active: boolean): Promise<void>;
|
|
46
|
+
abstract setReaction(chatId: string, messageId: string, kind: 'queued' | 'aborted' | 'ignored' | undefined): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=im-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"im-adapter.d.ts","sourceRoot":"","sources":["../src/im-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAA;AAEnD,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,aAAa,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACvD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;CAC9E,CAAA;AAED,8BAAsB,SAAU,SAAQ,YAAY,CAAC,eAAe,CAAC;IACnE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IACjG,QAAQ,CAAC,SAAS,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/E,OAAO,CAAC,IAAI,CAAC;IAChB,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACtF,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACnI,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IACvG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAC3H"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './router.js';
|
|
2
|
+
export * from './im-adapter.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
export * from './registry.js';
|
|
5
|
+
export * from './agents.js';
|
|
6
|
+
export * from './config.js';
|
|
7
|
+
export * from './content.js';
|
|
8
|
+
export * from './constants.js';
|
|
9
|
+
export * from './logger.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './router.js';
|
|
2
|
+
export * from './im-adapter.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
export * from './registry.js';
|
|
5
|
+
export * from './agents.js';
|
|
6
|
+
export * from './config.js';
|
|
7
|
+
export * from './content.js';
|
|
8
|
+
export * from './constants.js';
|
|
9
|
+
export * from './logger.js';
|
package/lib/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,eAAO,MAAM,MAAM,6BAGjB,CAAA"}
|
package/lib/logger.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentRegistryEntry, AgentRegistrySnapshot } from './types.js';
|
|
2
|
+
export declare function fetchRegistry(url: string): Promise<AgentRegistrySnapshot>;
|
|
3
|
+
export declare function normalizeRegistryAgents(data: unknown): AgentRegistryEntry[];
|
|
4
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAE3E,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAU/E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,EAAE,CAK3E"}
|
package/lib/registry.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export async function fetchRegistry(url) {
|
|
2
|
+
const res = await fetch(url);
|
|
3
|
+
if (!res.ok)
|
|
4
|
+
throw new Error(`Registry fetch failed: ${res.status}`);
|
|
5
|
+
const data = (await res.json());
|
|
6
|
+
const agents = normalizeRegistryAgents(data);
|
|
7
|
+
return {
|
|
8
|
+
source: url,
|
|
9
|
+
fetchedAt: new Date().toISOString(),
|
|
10
|
+
agents
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function normalizeRegistryAgents(data) {
|
|
14
|
+
if (!data || typeof data !== 'object')
|
|
15
|
+
return [];
|
|
16
|
+
const entries = data.agents;
|
|
17
|
+
if (!Array.isArray(entries))
|
|
18
|
+
return [];
|
|
19
|
+
return entries.flatMap((raw) => toRegistryEntry(raw)).filter(Boolean);
|
|
20
|
+
}
|
|
21
|
+
function toRegistryEntry(raw) {
|
|
22
|
+
if (!raw || typeof raw !== 'object')
|
|
23
|
+
return null;
|
|
24
|
+
const entry = raw;
|
|
25
|
+
if (!entry.id || !entry.name || !entry.command)
|
|
26
|
+
return null;
|
|
27
|
+
return {
|
|
28
|
+
id: entry.id,
|
|
29
|
+
name: entry.name,
|
|
30
|
+
description: entry.description,
|
|
31
|
+
command: entry.command,
|
|
32
|
+
args: entry.args ?? [],
|
|
33
|
+
env: entry.env ?? {},
|
|
34
|
+
cwd: entry.cwd
|
|
35
|
+
};
|
|
36
|
+
}
|
package/lib/router.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as acp from '@agentclientprotocol/sdk';
|
|
2
|
+
import type { AgentLaunchRequest, AgentLauncher, AgentRegistryEntry, AgentRegistrySnapshot, AvailableCommand, ContentBlock, RequestPermissionRequest, RequestPermissionResponse, SessionCacheStore, SessionConfigOption, SessionModeState, SessionModelState } from './types.js';
|
|
3
|
+
import { IMAdapter } from './im-adapter.js';
|
|
4
|
+
export interface RouterSessionState {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
modes?: SessionModeState;
|
|
8
|
+
models?: SessionModelState;
|
|
9
|
+
configOptions: SessionConfigOption[];
|
|
10
|
+
availableCommands: AvailableCommand[];
|
|
11
|
+
}
|
|
12
|
+
export interface RouterClientState {
|
|
13
|
+
agentInfo: acp.Implementation | null;
|
|
14
|
+
session: RouterSessionState | null;
|
|
15
|
+
}
|
|
16
|
+
export declare const BUILT_IN_COMMANDS: {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
}[];
|
|
20
|
+
export declare class RouterClient implements acp.Client {
|
|
21
|
+
private adapter;
|
|
22
|
+
private chatId;
|
|
23
|
+
private permissions;
|
|
24
|
+
conn: acp.ClientSideConnection;
|
|
25
|
+
sessionId: string;
|
|
26
|
+
agentInfo: acp.Implementation | null;
|
|
27
|
+
title: string;
|
|
28
|
+
configOptions: SessionConfigOption[];
|
|
29
|
+
availableCommands: AvailableCommand[];
|
|
30
|
+
modes: SessionModeState | null;
|
|
31
|
+
models: SessionModelState | null;
|
|
32
|
+
private textBuffer;
|
|
33
|
+
private textBufferKind;
|
|
34
|
+
private flushTimer;
|
|
35
|
+
private toolCalls;
|
|
36
|
+
private pendingPermissions;
|
|
37
|
+
private updateQueue;
|
|
38
|
+
muteUpdates: boolean;
|
|
39
|
+
statusMessageId: string | null;
|
|
40
|
+
constructor(adapter: IMAdapter, chatId: string, permissions: {
|
|
41
|
+
timeoutMs: number | null;
|
|
42
|
+
});
|
|
43
|
+
get state(): RouterClientState;
|
|
44
|
+
requestPermission(params: RequestPermissionRequest): Promise<RequestPermissionResponse>;
|
|
45
|
+
cancelPendingOperations(): Promise<void>;
|
|
46
|
+
reset(): void;
|
|
47
|
+
private enqueue;
|
|
48
|
+
drainQueue(): Promise<void>;
|
|
49
|
+
sessionUpdate(params: acp.SessionNotification): Promise<void>;
|
|
50
|
+
private processUpdate;
|
|
51
|
+
syncCommands(): Promise<void>;
|
|
52
|
+
private scheduleFlush;
|
|
53
|
+
flushTextBuffer(): Promise<void>;
|
|
54
|
+
handleContent(block: ContentBlock, kind: 'thought' | 'message'): Promise<void>;
|
|
55
|
+
private presentToolApproval;
|
|
56
|
+
}
|
|
57
|
+
export declare class RouterCore {
|
|
58
|
+
private adapter;
|
|
59
|
+
private launcher;
|
|
60
|
+
private registry;
|
|
61
|
+
private cache;
|
|
62
|
+
private defaults;
|
|
63
|
+
private permissions;
|
|
64
|
+
private clients;
|
|
65
|
+
private clientProcs;
|
|
66
|
+
private chatAgents;
|
|
67
|
+
constructor(adapter: IMAdapter, launcher: AgentLauncher, registry: AgentRegistrySnapshot, cache: SessionCacheStore, defaults: {
|
|
68
|
+
agentId: string;
|
|
69
|
+
cwd: string;
|
|
70
|
+
}, permissions: {
|
|
71
|
+
timeoutMs: number | null;
|
|
72
|
+
});
|
|
73
|
+
private messageQueues;
|
|
74
|
+
private pendingMessages;
|
|
75
|
+
private enqueueMessage;
|
|
76
|
+
private drainMessageQueue;
|
|
77
|
+
init(): Promise<void>;
|
|
78
|
+
getAgentEntry(agentId: string): AgentRegistryEntry;
|
|
79
|
+
ensureClient(chatId: string, agentId: string, launch: AgentLaunchRequest): Promise<RouterClient>;
|
|
80
|
+
startSession(chatId: string, agentId: string, launch: AgentLaunchRequest, cwd: string): Promise<RouterClient>;
|
|
81
|
+
private resolveAgentId;
|
|
82
|
+
private ensureSession;
|
|
83
|
+
listAgents(): Promise<AgentRegistryEntry[]>;
|
|
84
|
+
onMessage(chatId: string, text: string): Promise<void>;
|
|
85
|
+
onCommand(chatId: string, command: string, args: string[]): Promise<void>;
|
|
86
|
+
private handleAgent;
|
|
87
|
+
private switchAgent;
|
|
88
|
+
private handleSessions;
|
|
89
|
+
private handleMode;
|
|
90
|
+
private handleModel;
|
|
91
|
+
private handleConfig;
|
|
92
|
+
private executeAgentCommand;
|
|
93
|
+
private presentOptionPicker;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|