@openacp/cli 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.
@@ -0,0 +1,326 @@
1
+ import { Readable, Writable } from 'node:stream';
2
+ import { z } from 'zod';
3
+ import { PromptResponse } from '@agentclientprotocol/sdk';
4
+
5
+ interface IncomingMessage {
6
+ channelId: string;
7
+ threadId: string;
8
+ userId: string;
9
+ text: string;
10
+ }
11
+ interface OutgoingMessage {
12
+ type: 'text' | 'thought' | 'tool_call' | 'tool_update' | 'plan' | 'usage' | 'session_end' | 'error';
13
+ text: string;
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ interface PermissionRequest {
17
+ id: string;
18
+ description: string;
19
+ options: PermissionOption[];
20
+ }
21
+ interface PermissionOption {
22
+ id: string;
23
+ label: string;
24
+ isAllow: boolean;
25
+ }
26
+ interface NotificationMessage {
27
+ sessionId: string;
28
+ sessionName?: string;
29
+ type: 'completed' | 'error' | 'permission' | 'input_required';
30
+ summary: string;
31
+ deepLink?: string;
32
+ }
33
+ type AgentEvent = {
34
+ type: 'text';
35
+ content: string;
36
+ } | {
37
+ type: 'thought';
38
+ content: string;
39
+ } | {
40
+ type: 'tool_call';
41
+ id: string;
42
+ name: string;
43
+ kind?: string;
44
+ status: string;
45
+ content?: unknown;
46
+ locations?: unknown;
47
+ } | {
48
+ type: 'tool_update';
49
+ id: string;
50
+ status: string;
51
+ content?: unknown;
52
+ locations?: unknown;
53
+ } | {
54
+ type: 'plan';
55
+ entries: PlanEntry[];
56
+ } | {
57
+ type: 'usage';
58
+ tokensUsed?: number;
59
+ contextSize?: number;
60
+ cost?: {
61
+ amount: number;
62
+ currency: string;
63
+ };
64
+ } | {
65
+ type: 'commands_update';
66
+ commands: unknown[];
67
+ } | {
68
+ type: 'session_end';
69
+ reason: string;
70
+ } | {
71
+ type: 'error';
72
+ message: string;
73
+ };
74
+ interface PlanEntry {
75
+ content: string;
76
+ status: 'pending' | 'in_progress' | 'completed';
77
+ priority: 'high' | 'medium' | 'low';
78
+ }
79
+ interface AgentDefinition {
80
+ name: string;
81
+ command: string;
82
+ args: string[];
83
+ workingDirectory?: string;
84
+ env?: Record<string, string>;
85
+ }
86
+ type SessionStatus = 'initializing' | 'active' | 'cancelled' | 'finished' | 'error';
87
+
88
+ declare const log: {
89
+ info: (...args: unknown[]) => void;
90
+ warn: (...args: unknown[]) => void;
91
+ error: (...args: unknown[]) => void;
92
+ debug: (...args: unknown[]) => void;
93
+ };
94
+
95
+ interface ChannelConfig {
96
+ enabled: boolean;
97
+ [key: string]: unknown;
98
+ }
99
+ declare abstract class ChannelAdapter {
100
+ protected core: any;
101
+ protected config: ChannelConfig;
102
+ constructor(core: any, config: ChannelConfig);
103
+ abstract start(): Promise<void>;
104
+ abstract stop(): Promise<void>;
105
+ abstract sendMessage(sessionId: string, content: OutgoingMessage): Promise<void>;
106
+ abstract sendPermissionRequest(sessionId: string, request: PermissionRequest): Promise<void>;
107
+ abstract sendNotification(notification: NotificationMessage): Promise<void>;
108
+ abstract createSessionThread(sessionId: string, name: string): Promise<string>;
109
+ abstract renameSessionThread(sessionId: string, newName: string): Promise<void>;
110
+ }
111
+
112
+ declare class NotificationManager {
113
+ private adapters;
114
+ constructor(adapters: Map<string, ChannelAdapter>);
115
+ notify(channelId: string, notification: NotificationMessage): Promise<void>;
116
+ notifyAll(notification: NotificationMessage): Promise<void>;
117
+ }
118
+
119
+ declare function nodeToWebWritable(nodeStream: Writable): WritableStream<Uint8Array>;
120
+ declare function nodeToWebReadable(nodeStream: Readable): ReadableStream<Uint8Array>;
121
+
122
+ declare class StderrCapture {
123
+ private maxLines;
124
+ private lines;
125
+ constructor(maxLines?: number);
126
+ append(chunk: string): void;
127
+ getLastLines(): string;
128
+ }
129
+
130
+ declare const PLUGINS_DIR: string;
131
+ declare const ConfigSchema: z.ZodObject<{
132
+ channels: z.ZodRecord<z.ZodString, z.ZodObject<{
133
+ enabled: z.ZodDefault<z.ZodBoolean>;
134
+ adapter: z.ZodOptional<z.ZodString>;
135
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
136
+ enabled: z.ZodDefault<z.ZodBoolean>;
137
+ adapter: z.ZodOptional<z.ZodString>;
138
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
139
+ enabled: z.ZodDefault<z.ZodBoolean>;
140
+ adapter: z.ZodOptional<z.ZodString>;
141
+ }, z.ZodTypeAny, "passthrough">>>;
142
+ agents: z.ZodRecord<z.ZodString, z.ZodObject<{
143
+ command: z.ZodString;
144
+ args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
145
+ workingDirectory: z.ZodOptional<z.ZodString>;
146
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
147
+ }, "strip", z.ZodTypeAny, {
148
+ command: string;
149
+ args: string[];
150
+ env: Record<string, string>;
151
+ workingDirectory?: string | undefined;
152
+ }, {
153
+ command: string;
154
+ args?: string[] | undefined;
155
+ workingDirectory?: string | undefined;
156
+ env?: Record<string, string> | undefined;
157
+ }>>;
158
+ defaultAgent: z.ZodString;
159
+ workspace: z.ZodDefault<z.ZodObject<{
160
+ baseDir: z.ZodDefault<z.ZodString>;
161
+ }, "strip", z.ZodTypeAny, {
162
+ baseDir: string;
163
+ }, {
164
+ baseDir?: string | undefined;
165
+ }>>;
166
+ security: z.ZodDefault<z.ZodObject<{
167
+ allowedUserIds: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
168
+ maxConcurrentSessions: z.ZodDefault<z.ZodNumber>;
169
+ sessionTimeoutMinutes: z.ZodDefault<z.ZodNumber>;
170
+ }, "strip", z.ZodTypeAny, {
171
+ allowedUserIds: string[];
172
+ maxConcurrentSessions: number;
173
+ sessionTimeoutMinutes: number;
174
+ }, {
175
+ allowedUserIds?: string[] | undefined;
176
+ maxConcurrentSessions?: number | undefined;
177
+ sessionTimeoutMinutes?: number | undefined;
178
+ }>>;
179
+ }, "strip", z.ZodTypeAny, {
180
+ channels: Record<string, z.objectOutputType<{
181
+ enabled: z.ZodDefault<z.ZodBoolean>;
182
+ adapter: z.ZodOptional<z.ZodString>;
183
+ }, z.ZodTypeAny, "passthrough">>;
184
+ agents: Record<string, {
185
+ command: string;
186
+ args: string[];
187
+ env: Record<string, string>;
188
+ workingDirectory?: string | undefined;
189
+ }>;
190
+ defaultAgent: string;
191
+ workspace: {
192
+ baseDir: string;
193
+ };
194
+ security: {
195
+ allowedUserIds: string[];
196
+ maxConcurrentSessions: number;
197
+ sessionTimeoutMinutes: number;
198
+ };
199
+ }, {
200
+ channels: Record<string, z.objectInputType<{
201
+ enabled: z.ZodDefault<z.ZodBoolean>;
202
+ adapter: z.ZodOptional<z.ZodString>;
203
+ }, z.ZodTypeAny, "passthrough">>;
204
+ agents: Record<string, {
205
+ command: string;
206
+ args?: string[] | undefined;
207
+ workingDirectory?: string | undefined;
208
+ env?: Record<string, string> | undefined;
209
+ }>;
210
+ defaultAgent: string;
211
+ workspace?: {
212
+ baseDir?: string | undefined;
213
+ } | undefined;
214
+ security?: {
215
+ allowedUserIds?: string[] | undefined;
216
+ maxConcurrentSessions?: number | undefined;
217
+ sessionTimeoutMinutes?: number | undefined;
218
+ } | undefined;
219
+ }>;
220
+ type Config = z.infer<typeof ConfigSchema>;
221
+ declare function expandHome(p: string): string;
222
+ declare class ConfigManager {
223
+ private config;
224
+ private configPath;
225
+ constructor();
226
+ load(): Promise<void>;
227
+ get(): Config;
228
+ save(updates: Record<string, unknown>): Promise<void>;
229
+ resolveWorkspace(input?: string): string;
230
+ private applyEnvOverrides;
231
+ private deepMerge;
232
+ }
233
+
234
+ declare class AgentInstance {
235
+ private connection;
236
+ private child;
237
+ private stderrCapture;
238
+ private terminals;
239
+ sessionId: string;
240
+ agentName: string;
241
+ onSessionUpdate: (event: AgentEvent) => void;
242
+ onPermissionRequest: (request: PermissionRequest) => Promise<string>;
243
+ private constructor();
244
+ static spawn(agentDef: AgentDefinition, workingDirectory: string): Promise<AgentInstance>;
245
+ private createClient;
246
+ prompt(text: string): Promise<PromptResponse>;
247
+ cancel(): Promise<void>;
248
+ destroy(): Promise<void>;
249
+ }
250
+
251
+ declare class AgentManager {
252
+ private config;
253
+ constructor(config: Config);
254
+ getAvailableAgents(): AgentDefinition[];
255
+ getAgent(name: string): AgentDefinition | undefined;
256
+ spawn(agentName: string, workingDirectory: string): Promise<AgentInstance>;
257
+ }
258
+
259
+ declare class Session {
260
+ id: string;
261
+ channelId: string;
262
+ threadId: string;
263
+ agentName: string;
264
+ workingDirectory: string;
265
+ agentInstance: AgentInstance;
266
+ status: SessionStatus;
267
+ name?: string;
268
+ promptQueue: string[];
269
+ promptRunning: boolean;
270
+ createdAt: Date;
271
+ adapter?: ChannelAdapter;
272
+ pendingPermission?: {
273
+ requestId: string;
274
+ resolve: (optionId: string) => void;
275
+ };
276
+ constructor(opts: {
277
+ id?: string;
278
+ channelId: string;
279
+ agentName: string;
280
+ workingDirectory: string;
281
+ agentInstance: AgentInstance;
282
+ });
283
+ enqueuePrompt(text: string): Promise<void>;
284
+ private runPrompt;
285
+ private autoName;
286
+ cancel(): Promise<void>;
287
+ destroy(): Promise<void>;
288
+ }
289
+
290
+ declare class SessionManager {
291
+ private sessions;
292
+ createSession(channelId: string, agentName: string, workingDirectory: string, agentManager: AgentManager): Promise<Session>;
293
+ getSession(sessionId: string): Session | undefined;
294
+ getSessionByThread(channelId: string, threadId: string): Session | undefined;
295
+ cancelSession(sessionId: string): Promise<void>;
296
+ listSessions(channelId?: string): Session[];
297
+ destroyAll(): Promise<void>;
298
+ }
299
+
300
+ declare class OpenACPCore {
301
+ configManager: ConfigManager;
302
+ agentManager: AgentManager;
303
+ sessionManager: SessionManager;
304
+ notificationManager: NotificationManager;
305
+ adapters: Map<string, ChannelAdapter>;
306
+ constructor(configManager: ConfigManager);
307
+ registerAdapter(name: string, adapter: ChannelAdapter): void;
308
+ start(): Promise<void>;
309
+ stop(): Promise<void>;
310
+ handleMessage(message: IncomingMessage): Promise<void>;
311
+ handleNewSession(channelId: string, agentName?: string, workspacePath?: string): Promise<Session>;
312
+ handleNewChat(channelId: string, currentThreadId: string): Promise<Session | null>;
313
+ private toOutgoingMessage;
314
+ wireSessionEvents(session: Session, adapter: ChannelAdapter): void;
315
+ }
316
+
317
+ interface AdapterFactory {
318
+ name: string;
319
+ createAdapter(core: any, config: any): ChannelAdapter;
320
+ }
321
+ declare function installPlugin(packageName: string): void;
322
+ declare function uninstallPlugin(packageName: string): void;
323
+ declare function listPlugins(): Record<string, string>;
324
+ declare function loadAdapterFactory(packageName: string): Promise<AdapterFactory | null>;
325
+
326
+ export { type AdapterFactory, type AgentDefinition, type AgentEvent, AgentInstance, AgentManager, ChannelAdapter, type ChannelConfig, type Config, ConfigManager, type IncomingMessage, NotificationManager, type NotificationMessage, OpenACPCore, type OutgoingMessage, PLUGINS_DIR, type PermissionOption, type PermissionRequest, type PlanEntry, Session, SessionManager, type SessionStatus, StderrCapture, expandHome, installPlugin, listPlugins, loadAdapterFactory, log, nodeToWebReadable, nodeToWebWritable, uninstallPlugin };
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ import {
2
+ AgentInstance,
3
+ AgentManager,
4
+ NotificationManager,
5
+ OpenACPCore,
6
+ Session,
7
+ SessionManager,
8
+ StderrCapture,
9
+ nodeToWebReadable,
10
+ nodeToWebWritable
11
+ } from "./chunk-624B5RFL.js";
12
+ import {
13
+ ConfigManager,
14
+ PLUGINS_DIR,
15
+ expandHome,
16
+ installPlugin,
17
+ listPlugins,
18
+ loadAdapterFactory,
19
+ log,
20
+ uninstallPlugin
21
+ } from "./chunk-FLAM2AON.js";
22
+
23
+ // packages/core/src/channel.ts
24
+ var ChannelAdapter = class {
25
+ constructor(core, config) {
26
+ this.core = core;
27
+ this.config = config;
28
+ }
29
+ };
30
+ export {
31
+ AgentInstance,
32
+ AgentManager,
33
+ ChannelAdapter,
34
+ ConfigManager,
35
+ NotificationManager,
36
+ OpenACPCore,
37
+ PLUGINS_DIR,
38
+ Session,
39
+ SessionManager,
40
+ StderrCapture,
41
+ expandHome,
42
+ installPlugin,
43
+ listPlugins,
44
+ loadAdapterFactory,
45
+ log,
46
+ nodeToWebReadable,
47
+ nodeToWebWritable,
48
+ uninstallPlugin
49
+ };
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/core/src/channel.ts"],"sourcesContent":["import type { OutgoingMessage, PermissionRequest, NotificationMessage } from './types.js'\n\nexport interface ChannelConfig {\n enabled: boolean\n [key: string]: unknown\n}\n\nexport abstract class ChannelAdapter {\n constructor(protected core: any, protected config: ChannelConfig) {}\n\n abstract start(): Promise<void>\n abstract stop(): Promise<void>\n\n // Outgoing: core → channel\n abstract sendMessage(sessionId: string, content: OutgoingMessage): Promise<void>\n abstract sendPermissionRequest(sessionId: string, request: PermissionRequest): Promise<void>\n abstract sendNotification(notification: NotificationMessage): Promise<void>\n\n // Session lifecycle on channel side\n abstract createSessionThread(sessionId: string, name: string): Promise<string> // returns threadId\n abstract renameSessionThread(sessionId: string, newName: string): Promise<void>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAe,iBAAf,MAA8B;AAAA,EACnC,YAAsB,MAAqB,QAAuB;AAA5C;AAAqB;AAAA,EAAwB;AAarE;","names":[]}
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ OpenACPCore
4
+ } from "./chunk-624B5RFL.js";
5
+ import {
6
+ ConfigManager,
7
+ loadAdapterFactory,
8
+ log
9
+ } from "./chunk-FLAM2AON.js";
10
+
11
+ // packages/core/src/main.ts
12
+ var shuttingDown = false;
13
+ async function startServer() {
14
+ const configManager = new ConfigManager();
15
+ await configManager.load();
16
+ const config = configManager.get();
17
+ log.info("Config loaded from", configManager["configPath"]);
18
+ const core = new OpenACPCore(configManager);
19
+ for (const [channelName, channelConfig] of Object.entries(config.channels)) {
20
+ if (!channelConfig.enabled) continue;
21
+ if (channelName === "telegram") {
22
+ let TelegramAdapter;
23
+ try {
24
+ const mod = await import("@openacp/adapter-telegram");
25
+ TelegramAdapter = mod.TelegramAdapter;
26
+ } catch {
27
+ const adapterPath = new URL("../../adapters/telegram/dist/index.js", import.meta.url).pathname;
28
+ const mod = await import(adapterPath);
29
+ TelegramAdapter = mod.TelegramAdapter;
30
+ }
31
+ core.registerAdapter("telegram", new TelegramAdapter(core, channelConfig));
32
+ log.info("Telegram adapter registered (built-in)");
33
+ } else if (channelConfig.adapter) {
34
+ const factory = await loadAdapterFactory(channelConfig.adapter);
35
+ if (factory) {
36
+ const adapter = factory.createAdapter(core, channelConfig);
37
+ core.registerAdapter(channelName, adapter);
38
+ log.info(`${channelName} adapter registered (plugin: ${channelConfig.adapter})`);
39
+ } else {
40
+ log.error(`Skipping channel "${channelName}" \u2014 adapter "${channelConfig.adapter}" failed to load`);
41
+ }
42
+ } else {
43
+ log.error(`Channel "${channelName}" has no built-in adapter. Set "adapter" field to a plugin package.`);
44
+ }
45
+ }
46
+ if (core.adapters.size === 0) {
47
+ log.error("No channels enabled. Enable at least one channel in config.");
48
+ process.exit(1);
49
+ }
50
+ await core.start();
51
+ const agents = Object.keys(config.agents).join(", ");
52
+ log.info(`OpenACP started. Agents: ${agents}`);
53
+ log.info("Press Ctrl+C to stop.");
54
+ const shutdown = async (signal) => {
55
+ if (shuttingDown) return;
56
+ shuttingDown = true;
57
+ log.info(`${signal} received. Shutting down...`);
58
+ try {
59
+ await core.stop();
60
+ } catch (err) {
61
+ log.error("Error during shutdown:", err);
62
+ }
63
+ process.exit(0);
64
+ };
65
+ process.on("SIGINT", () => shutdown("SIGINT"));
66
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
67
+ process.on("uncaughtException", (err) => {
68
+ log.error("Uncaught exception:", err);
69
+ });
70
+ process.on("unhandledRejection", (err) => {
71
+ log.error("Unhandled rejection:", err);
72
+ });
73
+ }
74
+ var isDirectExecution = process.argv[1]?.endsWith("main.js");
75
+ if (isDirectExecution) {
76
+ startServer().catch((err) => {
77
+ log.error("Fatal:", err);
78
+ process.exit(1);
79
+ });
80
+ }
81
+ export {
82
+ startServer
83
+ };
84
+ //# sourceMappingURL=main-2DVA2NVU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/core/src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ConfigManager } from './config.js'\nimport { OpenACPCore } from './core.js'\nimport { loadAdapterFactory } from './plugin-manager.js'\nimport { log } from './log.js'\n\nlet shuttingDown = false\n\nexport async function startServer() {\n // 1. Load config\n const configManager = new ConfigManager()\n await configManager.load()\n\n const config = configManager.get()\n log.info('Config loaded from', configManager['configPath'])\n\n // 2. Create core\n const core = new OpenACPCore(configManager)\n\n // 3. Register adapters from config\n for (const [channelName, channelConfig] of Object.entries(config.channels)) {\n if (!channelConfig.enabled) continue\n\n if (channelName === 'telegram') {\n // Built-in adapter — try bundled import first, fall back to relative path for dev\n let TelegramAdapter: any\n try {\n // @ts-ignore — optional peer dependency, may not be installed\n const mod = await import('@openacp/adapter-telegram')\n TelegramAdapter = mod.TelegramAdapter\n } catch {\n // Dev mode: resolve from workspace via relative path\n const adapterPath = new URL('../../adapters/telegram/dist/index.js', import.meta.url).pathname\n const mod = await import(adapterPath)\n TelegramAdapter = mod.TelegramAdapter\n }\n core.registerAdapter('telegram', new TelegramAdapter(core, channelConfig))\n log.info('Telegram adapter registered (built-in)')\n } else if (channelConfig.adapter) {\n // Plugin adapter\n const factory = await loadAdapterFactory(channelConfig.adapter)\n if (factory) {\n const adapter = factory.createAdapter(core, channelConfig)\n core.registerAdapter(channelName, adapter)\n log.info(`${channelName} adapter registered (plugin: ${channelConfig.adapter})`)\n } else {\n log.error(`Skipping channel \"${channelName}\" — adapter \"${channelConfig.adapter}\" failed to load`)\n }\n } else {\n log.error(`Channel \"${channelName}\" has no built-in adapter. Set \"adapter\" field to a plugin package.`)\n }\n }\n\n if (core.adapters.size === 0) {\n log.error('No channels enabled. Enable at least one channel in config.')\n process.exit(1)\n }\n\n // 4. Start\n await core.start()\n\n // 5. Log ready\n const agents = Object.keys(config.agents).join(', ')\n log.info(`OpenACP started. Agents: ${agents}`)\n log.info('Press Ctrl+C to stop.')\n\n // 6. Graceful shutdown\n const shutdown = async (signal: string) => {\n if (shuttingDown) return\n shuttingDown = true\n log.info(`${signal} received. Shutting down...`)\n\n try {\n await core.stop()\n } catch (err) {\n log.error('Error during shutdown:', err)\n }\n\n process.exit(0)\n }\n\n process.on('SIGINT', () => shutdown('SIGINT'))\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n\n process.on('uncaughtException', (err) => {\n log.error('Uncaught exception:', err)\n })\n\n process.on('unhandledRejection', (err) => {\n log.error('Unhandled rejection:', err)\n })\n}\n\n// Direct execution for dev (node packages/core/dist/main.js)\nconst isDirectExecution = process.argv[1]?.endsWith('main.js')\nif (isDirectExecution) {\n startServer().catch((err) => {\n log.error('Fatal:', err)\n process.exit(1)\n })\n}\n"],"mappings":";;;;;;;;;;;AAOA,IAAI,eAAe;AAEnB,eAAsB,cAAc;AAElC,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,cAAc,KAAK;AAEzB,QAAM,SAAS,cAAc,IAAI;AACjC,MAAI,KAAK,sBAAsB,cAAc,YAAY,CAAC;AAG1D,QAAM,OAAO,IAAI,YAAY,aAAa;AAG1C,aAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC1E,QAAI,CAAC,cAAc,QAAS;AAE5B,QAAI,gBAAgB,YAAY;AAE9B,UAAI;AACJ,UAAI;AAEF,cAAM,MAAM,MAAM,OAAO,2BAA2B;AACpD,0BAAkB,IAAI;AAAA,MACxB,QAAQ;AAEN,cAAM,cAAc,IAAI,IAAI,yCAAyC,YAAY,GAAG,EAAE;AACtF,cAAM,MAAM,MAAM,OAAO;AACzB,0BAAkB,IAAI;AAAA,MACxB;AACA,WAAK,gBAAgB,YAAY,IAAI,gBAAgB,MAAM,aAAa,CAAC;AACzE,UAAI,KAAK,wCAAwC;AAAA,IACnD,WAAW,cAAc,SAAS;AAEhC,YAAM,UAAU,MAAM,mBAAmB,cAAc,OAAO;AAC9D,UAAI,SAAS;AACX,cAAM,UAAU,QAAQ,cAAc,MAAM,aAAa;AACzD,aAAK,gBAAgB,aAAa,OAAO;AACzC,YAAI,KAAK,GAAG,WAAW,gCAAgC,cAAc,OAAO,GAAG;AAAA,MACjF,OAAO;AACL,YAAI,MAAM,qBAAqB,WAAW,qBAAgB,cAAc,OAAO,kBAAkB;AAAA,MACnG;AAAA,IACF,OAAO;AACL,UAAI,MAAM,YAAY,WAAW,qEAAqE;AAAA,IACxG;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,QAAI,MAAM,6DAA6D;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,KAAK,MAAM;AAGjB,QAAM,SAAS,OAAO,KAAK,OAAO,MAAM,EAAE,KAAK,IAAI;AACnD,MAAI,KAAK,4BAA4B,MAAM,EAAE;AAC7C,MAAI,KAAK,uBAAuB;AAGhC,QAAM,WAAW,OAAO,WAAmB;AACzC,QAAI,aAAc;AAClB,mBAAe;AACf,QAAI,KAAK,GAAG,MAAM,6BAA6B;AAE/C,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,UAAI,MAAM,0BAA0B,GAAG;AAAA,IACzC;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAC7C,UAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAE/C,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,QAAI,MAAM,uBAAuB,GAAG;AAAA,EACtC,CAAC;AAED,UAAQ,GAAG,sBAAsB,CAAC,QAAQ;AACxC,QAAI,MAAM,wBAAwB,GAAG;AAAA,EACvC,CAAC;AACH;AAGA,IAAM,oBAAoB,QAAQ,KAAK,CAAC,GAAG,SAAS,SAAS;AAC7D,IAAI,mBAAmB;AACrB,cAAY,EAAE,MAAM,CAAC,QAAQ;AAC3B,QAAI,MAAM,UAAU,GAAG;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":[]}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@openacp/cli",
3
+ "version": "0.1.0",
4
+ "description": "Self-hosted bridge for AI coding agents via ACP protocol",
5
+ "type": "module",
6
+ "bin": {
7
+ "openacp": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "README.md"
20
+ ],
21
+ "engines": {
22
+ "node": ">=20"
23
+ },
24
+ "dependencies": {
25
+ "@agentclientprotocol/sdk": "^0.16.0",
26
+ "nanoid": "^5.0.0",
27
+ "zod": "^3.25.0",
28
+ "grammy": "^1.30.0"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/nicepkg/OpenACP"
33
+ },
34
+ "license": "AGPL-3.0",
35
+ "keywords": [
36
+ "acp",
37
+ "ai",
38
+ "coding-agent",
39
+ "telegram",
40
+ "claude",
41
+ "codex"
42
+ ]
43
+ }