@openacp/cli 0.4.4 → 0.4.6

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.
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  runConfigEditor
3
- } from "./chunk-WHKLPZGK.js";
4
- import "./chunk-MRKYJ422.js";
5
- import "./chunk-BLVZFCKN.js";
3
+ } from "./chunk-IUPHAXGA.js";
4
+ import "./chunk-ARWC4S35.js";
6
5
  import "./chunk-WF5XDN4D.js";
6
+ import "./chunk-MRKYJ422.js";
7
7
  import "./chunk-LYKCQTH5.js";
8
8
  export {
9
9
  runConfigEditor
10
10
  };
11
- //# sourceMappingURL=config-editor-IXL4BFG3.js.map
11
+ //# sourceMappingURL=config-editor-EPOKAEP6.js.map
package/dist/index.d.ts CHANGED
@@ -99,6 +99,7 @@ type SessionStatus = "initializing" | "active" | "cancelled" | "finished" | "err
99
99
  interface SessionRecord<P = Record<string, unknown>> {
100
100
  sessionId: string;
101
101
  agentSessionId: string;
102
+ originalAgentSessionId?: string;
102
103
  agentName: string;
103
104
  workingDir: string;
104
105
  channelId: string;
@@ -297,6 +298,10 @@ declare const ConfigSchema: z.ZodObject<{
297
298
  } | undefined;
298
299
  }>>;
299
300
  }, "strip", z.ZodTypeAny, {
301
+ api: {
302
+ port: number;
303
+ host: string;
304
+ };
300
305
  tunnel: {
301
306
  options: Record<string, unknown>;
302
307
  enabled: boolean;
@@ -336,10 +341,6 @@ declare const ConfigSchema: z.ZodObject<{
336
341
  };
337
342
  runMode: "foreground" | "daemon";
338
343
  autoStart: boolean;
339
- api: {
340
- port: number;
341
- host: string;
342
- };
343
344
  sessionStore: {
344
345
  ttlDays: number;
345
346
  };
@@ -355,6 +356,10 @@ declare const ConfigSchema: z.ZodObject<{
355
356
  adapter: z.ZodOptional<z.ZodString>;
356
357
  }, z.ZodTypeAny, "passthrough">>;
357
358
  defaultAgent: string;
359
+ api?: {
360
+ port?: number | undefined;
361
+ host?: string | undefined;
362
+ } | undefined;
358
363
  tunnel?: {
359
364
  options?: Record<string, unknown> | undefined;
360
365
  enabled?: boolean | undefined;
@@ -383,10 +388,6 @@ declare const ConfigSchema: z.ZodObject<{
383
388
  } | undefined;
384
389
  runMode?: "foreground" | "daemon" | undefined;
385
390
  autoStart?: boolean | undefined;
386
- api?: {
387
- port?: number | undefined;
388
- host?: string | undefined;
389
- } | undefined;
390
391
  sessionStore?: {
391
392
  ttlDays?: number | undefined;
392
393
  } | undefined;
@@ -438,6 +439,7 @@ interface IChannelAdapter {
438
439
  sendNotification(notification: NotificationMessage): Promise<void>;
439
440
  createSessionThread(sessionId: string, name: string): Promise<string>;
440
441
  renameSessionThread(sessionId: string, newName: string): Promise<void>;
442
+ deleteSessionThread(sessionId: string): Promise<void>;
441
443
  sendSkillCommands(sessionId: string, commands: AgentCommand[]): Promise<void>;
442
444
  cleanupSkillCommands(sessionId: string): Promise<void>;
443
445
  }
@@ -456,6 +458,7 @@ declare abstract class ChannelAdapter<TCore = unknown> implements IChannelAdapte
456
458
  abstract sendNotification(notification: NotificationMessage): Promise<void>;
457
459
  abstract createSessionThread(sessionId: string, name: string): Promise<string>;
458
460
  abstract renameSessionThread(sessionId: string, newName: string): Promise<void>;
461
+ deleteSessionThread(_sessionId: string): Promise<void>;
459
462
  sendSkillCommands(_sessionId: string, _commands: AgentCommand[]): Promise<void>;
460
463
  cleanupSkillCommands(_sessionId: string): Promise<void>;
461
464
  }
@@ -684,6 +687,7 @@ interface SessionStore {
684
687
  save(record: SessionRecord): Promise<void>;
685
688
  get(sessionId: string): SessionRecord | undefined;
686
689
  findByPlatform(channelId: string, predicate: (platform: Record<string, unknown>) => boolean): SessionRecord | undefined;
690
+ findByAgentSessionId(agentSessionId: string): SessionRecord | undefined;
687
691
  list(channelId?: string): SessionRecord[];
688
692
  remove(sessionId: string): Promise<void>;
689
693
  }
@@ -695,6 +699,8 @@ declare class SessionManager {
695
699
  createSession(channelId: string, agentName: string, workingDirectory: string, agentManager: AgentManager): Promise<Session>;
696
700
  getSession(sessionId: string): Session | undefined;
697
701
  getSessionByThread(channelId: string, threadId: string): Session | undefined;
702
+ getSessionByAgentSessionId(agentSessionId: string): Session | undefined;
703
+ getRecordByAgentSessionId(agentSessionId: string): SessionRecord | undefined;
698
704
  getRecordByThread(channelId: string, threadId: string): SessionRecord | undefined;
699
705
  registerSession(session: Session): void;
700
706
  updateSessionPlatform(sessionId: string, platform: Record<string, unknown>): Promise<void>;
@@ -705,6 +711,10 @@ declare class SessionManager {
705
711
  getSessionRecord(sessionId: string): SessionRecord | undefined;
706
712
  cancelSession(sessionId: string): Promise<void>;
707
713
  listSessions(channelId?: string): Session[];
714
+ listRecords(filter?: {
715
+ statuses?: string[];
716
+ }): SessionRecord[];
717
+ removeRecord(sessionId: string): Promise<void>;
708
718
  destroyAll(): Promise<void>;
709
719
  }
710
720
 
@@ -728,6 +738,16 @@ declare class OpenACPCore {
728
738
  stop(): Promise<void>;
729
739
  handleMessage(message: IncomingMessage): Promise<void>;
730
740
  handleNewSession(channelId: string, agentName?: string, workspacePath?: string): Promise<Session>;
741
+ adoptSession(agentName: string, agentSessionId: string, cwd: string): Promise<{
742
+ ok: true;
743
+ sessionId: string;
744
+ threadId: string;
745
+ status: "adopted" | "existing";
746
+ } | {
747
+ ok: false;
748
+ error: string;
749
+ message: string;
750
+ }>;
731
751
  handleNewChat(channelId: string, currentThreadId: string): Promise<Session | null>;
732
752
  private lazyResume;
733
753
  wireSessionEvents(session: Session, adapter: ChannelAdapter): void;
@@ -771,6 +791,51 @@ declare function isAutoStartInstalled(): boolean;
771
791
 
772
792
  declare function runConfigEditor(configManager: ConfigManager): Promise<void>;
773
793
 
794
+ interface TopicInfo {
795
+ sessionId: string;
796
+ topicId: number | null;
797
+ name: string | null;
798
+ status: string;
799
+ agentName: string;
800
+ lastActiveAt: string;
801
+ }
802
+ interface DeleteTopicResult {
803
+ ok: boolean;
804
+ needsConfirmation?: boolean;
805
+ topicId?: number | null;
806
+ session?: {
807
+ id: string;
808
+ name: string | null;
809
+ status: string;
810
+ };
811
+ error?: string;
812
+ }
813
+ interface CleanupResult {
814
+ deleted: string[];
815
+ failed: {
816
+ sessionId: string;
817
+ error: string;
818
+ }[];
819
+ }
820
+ interface SystemTopicIds {
821
+ notificationTopicId: number | null;
822
+ assistantTopicId: number | null;
823
+ }
824
+ declare class TopicManager {
825
+ private sessionManager;
826
+ private adapter;
827
+ private systemTopicIds;
828
+ constructor(sessionManager: SessionManager, adapter: IChannelAdapter | null, systemTopicIds: SystemTopicIds);
829
+ listTopics(filter?: {
830
+ statuses?: string[];
831
+ }): TopicInfo[];
832
+ deleteTopic(sessionId: string, options?: {
833
+ confirmed?: boolean;
834
+ }): Promise<DeleteTopicResult>;
835
+ cleanup(statuses?: string[]): Promise<CleanupResult>;
836
+ private isSystemTopic;
837
+ }
838
+
774
839
  interface ApiConfig {
775
840
  port: number;
776
841
  host: string;
@@ -778,10 +843,12 @@ interface ApiConfig {
778
843
  declare class ApiServer {
779
844
  private core;
780
845
  private config;
846
+ private topicManager?;
781
847
  private server;
782
848
  private actualPort;
783
849
  private portFilePath;
784
- constructor(core: OpenACPCore, config: ApiConfig, portFilePath?: string);
850
+ private startedAt;
851
+ constructor(core: OpenACPCore, config: ApiConfig, portFilePath?: string, topicManager?: TopicManager | undefined);
785
852
  start(): Promise<void>;
786
853
  stop(): Promise<void>;
787
854
  getPort(): number;
@@ -789,10 +856,25 @@ declare class ApiServer {
789
856
  private removePortFile;
790
857
  private handleRequest;
791
858
  private handleCreateSession;
859
+ private handleSendPrompt;
860
+ private handleGetSession;
861
+ private handleToggleDangerous;
862
+ private handleHealth;
863
+ private handleVersion;
864
+ private handleGetConfig;
865
+ private handleUpdateConfig;
866
+ private handleListAdapters;
867
+ private handleTunnelStatus;
868
+ private handleNotify;
869
+ private handleRestart;
792
870
  private handleCancelSession;
793
871
  private handleListSessions;
872
+ private handleAdoptSession;
794
873
  private handleListAgents;
795
874
  private sendJson;
875
+ private handleListTopics;
876
+ private handleDeleteTopic;
877
+ private handleCleanupTopics;
796
878
  private readBody;
797
879
  }
798
880
 
@@ -828,9 +910,10 @@ declare class TelegramAdapter extends ChannelAdapter<OpenACPCore> {
828
910
  sendNotification(notification: NotificationMessage): Promise<void>;
829
911
  createSessionThread(sessionId: string, name: string): Promise<string>;
830
912
  renameSessionThread(sessionId: string, newName: string): Promise<void>;
913
+ deleteSessionThread(sessionId: string): Promise<void>;
831
914
  sendSkillCommands(sessionId: string, commands: AgentCommand[]): Promise<void>;
832
915
  cleanupSkillCommands(sessionId: string): Promise<void>;
833
916
  private finalizeDraft;
834
917
  }
835
918
 
836
- export { type AdapterFactory, type AgentCommand, type AgentDefinition, type AgentEvent, AgentInstance, AgentManager, type ApiConfig, ApiServer, ChannelAdapter, type ChannelConfig, type Config, ConfigManager, type IChannelAdapter, type IncomingMessage, type Logger, type LoggingConfig, MessageTransformer, NotificationManager, type NotificationMessage, OpenACPCore, type OutgoingMessage, PLUGINS_DIR, PermissionGate, type PermissionOption, type PermissionRequest, type PlanEntry, PromptQueue, Session, type SessionEvents, SessionManager, type SessionRecord, type SessionStatus, StderrCapture, TelegramAdapter, type TelegramPlatformData, TypedEmitter, cleanupOldSessionLogs, createChildLogger, createSessionLogger, expandHome, getPidPath, getStatus, initLogger, installAutoStart, installPlugin, isAutoStartInstalled, isAutoStartSupported, listPlugins, loadAdapterFactory, log, nodeToWebReadable, nodeToWebWritable, runConfigEditor, shutdownLogger, startDaemon, stopDaemon, uninstallAutoStart, uninstallPlugin };
919
+ export { type AdapterFactory, type AgentCommand, type AgentDefinition, type AgentEvent, AgentInstance, AgentManager, type ApiConfig, ApiServer, ChannelAdapter, type ChannelConfig, type CleanupResult, type Config, ConfigManager, type DeleteTopicResult, type IChannelAdapter, type IncomingMessage, type Logger, type LoggingConfig, MessageTransformer, NotificationManager, type NotificationMessage, OpenACPCore, type OutgoingMessage, PLUGINS_DIR, PermissionGate, type PermissionOption, type PermissionRequest, type PlanEntry, PromptQueue, Session, type SessionEvents, SessionManager, type SessionRecord, type SessionStatus, StderrCapture, TelegramAdapter, type TelegramPlatformData, type TopicInfo, TopicManager, TypedEmitter, cleanupOldSessionLogs, createChildLogger, createSessionLogger, expandHome, getPidPath, getStatus, initLogger, installAutoStart, installPlugin, isAutoStartInstalled, isAutoStartSupported, listPlugins, loadAdapterFactory, log, nodeToWebReadable, nodeToWebWritable, runConfigEditor, shutdownLogger, startDaemon, stopDaemon, uninstallAutoStart, uninstallPlugin };
package/dist/index.js CHANGED
@@ -12,13 +12,16 @@ import {
12
12
  SessionManager,
13
13
  StderrCapture,
14
14
  TelegramAdapter,
15
+ TopicManager,
15
16
  TypedEmitter,
16
17
  nodeToWebReadable,
17
18
  nodeToWebWritable
18
- } from "./chunk-VRXFGWZJ.js";
19
+ } from "./chunk-2M4O7AFI.js";
19
20
  import {
20
21
  runConfigEditor
21
- } from "./chunk-WHKLPZGK.js";
22
+ } from "./chunk-IUPHAXGA.js";
23
+ import "./chunk-ARWC4S35.js";
24
+ import "./chunk-VA2M52CM.js";
22
25
  import {
23
26
  installPlugin,
24
27
  listPlugins,
@@ -31,18 +34,17 @@ import {
31
34
  startDaemon,
32
35
  stopDaemon
33
36
  } from "./chunk-3QACY5E3.js";
37
+ import {
38
+ ConfigManager,
39
+ PLUGINS_DIR,
40
+ expandHome
41
+ } from "./chunk-WF5XDN4D.js";
34
42
  import {
35
43
  installAutoStart,
36
44
  isAutoStartInstalled,
37
45
  isAutoStartSupported,
38
46
  uninstallAutoStart
39
47
  } from "./chunk-MRKYJ422.js";
40
- import "./chunk-BLVZFCKN.js";
41
- import {
42
- ConfigManager,
43
- PLUGINS_DIR,
44
- expandHome
45
- } from "./chunk-WF5XDN4D.js";
46
48
  import {
47
49
  cleanupOldSessionLogs,
48
50
  createChildLogger,
@@ -67,6 +69,7 @@ export {
67
69
  SessionManager,
68
70
  StderrCapture,
69
71
  TelegramAdapter,
72
+ TopicManager,
70
73
  TypedEmitter,
71
74
  cleanupOldSessionLogs,
72
75
  createChildLogger,
@@ -0,0 +1,123 @@
1
+ // src/cli/integrate.ts
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from "fs";
3
+ import { join } from "path";
4
+ import { homedir } from "os";
5
+ var CLAUDE_DIR = join(homedir(), ".claude");
6
+ var HOOKS_DIR = join(CLAUDE_DIR, "hooks");
7
+ var COMMANDS_DIR = join(CLAUDE_DIR, "commands");
8
+ var SETTINGS_FILE = join(CLAUDE_DIR, "settings.json");
9
+ var INJECT_HOOK_FILE = join(HOOKS_DIR, "openacp-inject-session.sh");
10
+ var HANDOFF_SCRIPT_FILE = join(HOOKS_DIR, "openacp-handoff.sh");
11
+ var HANDOFF_COMMAND_FILE = join(COMMANDS_DIR, "openacp:handoff.md");
12
+ var INJECT_HOOK_CONTENT = `#!/bin/bash
13
+ INPUT=$(cat)
14
+ SESSION_ID=$(echo "$INPUT" | jq -r '.session_id')
15
+ CWD=$(echo "$INPUT" | jq -r '.cwd')
16
+
17
+ echo "CLAUDE_SESSION_ID: $SESSION_ID"
18
+ echo "CLAUDE_WORKING_DIR: $CWD"
19
+
20
+ exit 0
21
+ `;
22
+ var HANDOFF_SCRIPT_CONTENT = `#!/bin/bash
23
+ SESSION_ID=$1
24
+ CWD=$2
25
+
26
+ if [ -z "$SESSION_ID" ]; then
27
+ echo "Usage: openacp-handoff.sh <session_id> [cwd]"
28
+ exit 1
29
+ fi
30
+
31
+ openacp adopt claude "$SESSION_ID" \${CWD:+--cwd "$CWD"}
32
+ `;
33
+ var HANDOFF_COMMAND_CONTENT = `---
34
+ description: Hand off current session to OpenACP (Telegram)
35
+ ---
36
+
37
+ Look at the context injected at the start of this message to find
38
+ CLAUDE_SESSION_ID and CLAUDE_WORKING_DIR, then run:
39
+
40
+ bash ~/.claude/hooks/openacp-handoff.sh <CLAUDE_SESSION_ID> <CLAUDE_WORKING_DIR>
41
+ `;
42
+ var HOOK_MARKER = "openacp-inject-session.sh";
43
+ var ClaudeIntegration = class {
44
+ async install() {
45
+ mkdirSync(HOOKS_DIR, { recursive: true });
46
+ mkdirSync(COMMANDS_DIR, { recursive: true });
47
+ writeFileSync(INJECT_HOOK_FILE, INJECT_HOOK_CONTENT);
48
+ chmodSync(INJECT_HOOK_FILE, 493);
49
+ console.log(` Created ${INJECT_HOOK_FILE}`);
50
+ writeFileSync(HANDOFF_SCRIPT_FILE, HANDOFF_SCRIPT_CONTENT);
51
+ chmodSync(HANDOFF_SCRIPT_FILE, 493);
52
+ console.log(` Created ${HANDOFF_SCRIPT_FILE}`);
53
+ writeFileSync(HANDOFF_COMMAND_FILE, HANDOFF_COMMAND_CONTENT);
54
+ console.log(` Created ${HANDOFF_COMMAND_FILE}`);
55
+ this.mergeSettings();
56
+ console.log(` Updated ${SETTINGS_FILE}`);
57
+ }
58
+ async uninstall() {
59
+ for (const file of [INJECT_HOOK_FILE, HANDOFF_SCRIPT_FILE, HANDOFF_COMMAND_FILE]) {
60
+ if (existsSync(file)) {
61
+ unlinkSync(file);
62
+ console.log(` Removed ${file}`);
63
+ }
64
+ }
65
+ this.removeFromSettings();
66
+ console.log(` Updated ${SETTINGS_FILE}`);
67
+ }
68
+ mergeSettings() {
69
+ let settings = {};
70
+ if (existsSync(SETTINGS_FILE)) {
71
+ const raw = readFileSync(SETTINGS_FILE, "utf-8");
72
+ writeFileSync(`${SETTINGS_FILE}.bak`, raw);
73
+ settings = JSON.parse(raw);
74
+ }
75
+ const hooks = settings.hooks ?? {};
76
+ settings.hooks = hooks;
77
+ const userPromptSubmit = hooks.UserPromptSubmit ?? [];
78
+ hooks.UserPromptSubmit = userPromptSubmit;
79
+ const alreadyInstalled = userPromptSubmit.some(
80
+ (group) => group.hooks?.some((h) => h.command?.includes(HOOK_MARKER))
81
+ );
82
+ if (!alreadyInstalled) {
83
+ userPromptSubmit.push({
84
+ hooks: [
85
+ {
86
+ type: "command",
87
+ command: INJECT_HOOK_FILE
88
+ }
89
+ ]
90
+ });
91
+ }
92
+ writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2) + "\n");
93
+ }
94
+ removeFromSettings() {
95
+ if (!existsSync(SETTINGS_FILE)) return;
96
+ const raw = readFileSync(SETTINGS_FILE, "utf-8");
97
+ const settings = JSON.parse(raw);
98
+ const hooks = settings.hooks;
99
+ if (!hooks?.UserPromptSubmit) return;
100
+ hooks.UserPromptSubmit = hooks.UserPromptSubmit.filter(
101
+ (group) => !group.hooks?.some((h) => h.command?.includes("openacp-"))
102
+ );
103
+ if (hooks.UserPromptSubmit.length === 0) {
104
+ delete hooks.UserPromptSubmit;
105
+ }
106
+ writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2) + "\n");
107
+ }
108
+ };
109
+ var integrations = {
110
+ claude: new ClaudeIntegration()
111
+ };
112
+ function getIntegration(agentName) {
113
+ return integrations[agentName];
114
+ }
115
+ function listIntegrations() {
116
+ return Object.keys(integrations);
117
+ }
118
+ export {
119
+ ClaudeIntegration,
120
+ getIntegration,
121
+ listIntegrations
122
+ };
123
+ //# sourceMappingURL=integrate-HYDSHAF3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/integrate.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface AgentIntegration {\n install(): Promise<void>;\n uninstall(): Promise<void>;\n}\n\nconst CLAUDE_DIR = join(homedir(), \".claude\");\nconst HOOKS_DIR = join(CLAUDE_DIR, \"hooks\");\nconst COMMANDS_DIR = join(CLAUDE_DIR, \"commands\");\nconst SETTINGS_FILE = join(CLAUDE_DIR, \"settings.json\");\n\nconst INJECT_HOOK_FILE = join(HOOKS_DIR, \"openacp-inject-session.sh\");\nconst HANDOFF_SCRIPT_FILE = join(HOOKS_DIR, \"openacp-handoff.sh\");\nconst HANDOFF_COMMAND_FILE = join(COMMANDS_DIR, \"openacp:handoff.md\");\n\nconst INJECT_HOOK_CONTENT = `#!/bin/bash\nINPUT=$(cat)\nSESSION_ID=$(echo \"$INPUT\" | jq -r '.session_id')\nCWD=$(echo \"$INPUT\" | jq -r '.cwd')\n\necho \"CLAUDE_SESSION_ID: $SESSION_ID\"\necho \"CLAUDE_WORKING_DIR: $CWD\"\n\nexit 0\n`;\n\nconst HANDOFF_SCRIPT_CONTENT = `#!/bin/bash\nSESSION_ID=$1\nCWD=$2\n\nif [ -z \"$SESSION_ID\" ]; then\n echo \"Usage: openacp-handoff.sh <session_id> [cwd]\"\n exit 1\nfi\n\nopenacp adopt claude \"$SESSION_ID\" \\${CWD:+--cwd \"$CWD\"}\n`;\n\nconst HANDOFF_COMMAND_CONTENT = `---\ndescription: Hand off current session to OpenACP (Telegram)\n---\n\nLook at the context injected at the start of this message to find\nCLAUDE_SESSION_ID and CLAUDE_WORKING_DIR, then run:\n\nbash ~/.claude/hooks/openacp-handoff.sh <CLAUDE_SESSION_ID> <CLAUDE_WORKING_DIR>\n`;\n\nconst HOOK_MARKER = \"openacp-inject-session.sh\";\n\nexport class ClaudeIntegration implements AgentIntegration {\n async install(): Promise<void> {\n mkdirSync(HOOKS_DIR, { recursive: true });\n mkdirSync(COMMANDS_DIR, { recursive: true });\n\n writeFileSync(INJECT_HOOK_FILE, INJECT_HOOK_CONTENT);\n chmodSync(INJECT_HOOK_FILE, 0o755);\n console.log(` Created ${INJECT_HOOK_FILE}`);\n\n writeFileSync(HANDOFF_SCRIPT_FILE, HANDOFF_SCRIPT_CONTENT);\n chmodSync(HANDOFF_SCRIPT_FILE, 0o755);\n console.log(` Created ${HANDOFF_SCRIPT_FILE}`);\n\n writeFileSync(HANDOFF_COMMAND_FILE, HANDOFF_COMMAND_CONTENT);\n console.log(` Created ${HANDOFF_COMMAND_FILE}`);\n\n this.mergeSettings();\n console.log(` Updated ${SETTINGS_FILE}`);\n }\n\n async uninstall(): Promise<void> {\n for (const file of [INJECT_HOOK_FILE, HANDOFF_SCRIPT_FILE, HANDOFF_COMMAND_FILE]) {\n if (existsSync(file)) {\n unlinkSync(file);\n console.log(` Removed ${file}`);\n }\n }\n\n this.removeFromSettings();\n console.log(` Updated ${SETTINGS_FILE}`);\n }\n\n private mergeSettings(): void {\n let settings: Record<string, unknown> = {};\n\n if (existsSync(SETTINGS_FILE)) {\n const raw = readFileSync(SETTINGS_FILE, \"utf-8\");\n writeFileSync(`${SETTINGS_FILE}.bak`, raw);\n settings = JSON.parse(raw);\n }\n\n const hooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n settings.hooks = hooks;\n\n const userPromptSubmit = (hooks.UserPromptSubmit ?? []) as Array<{ hooks?: Array<{ type?: string; command?: string }> }>;\n hooks.UserPromptSubmit = userPromptSubmit;\n\n const alreadyInstalled = userPromptSubmit.some((group) =>\n group.hooks?.some((h) => h.command?.includes(HOOK_MARKER)),\n );\n\n if (!alreadyInstalled) {\n userPromptSubmit.push({\n hooks: [\n {\n type: \"command\",\n command: INJECT_HOOK_FILE,\n },\n ],\n });\n }\n\n writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2) + \"\\n\");\n }\n\n private removeFromSettings(): void {\n if (!existsSync(SETTINGS_FILE)) return;\n\n const raw = readFileSync(SETTINGS_FILE, \"utf-8\");\n const settings = JSON.parse(raw);\n\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.UserPromptSubmit) return;\n\n hooks.UserPromptSubmit = (hooks.UserPromptSubmit as Array<{ hooks?: Array<{ command?: string }> }>).filter(\n (group) => !group.hooks?.some((h) => h.command?.includes(\"openacp-\")),\n );\n\n if (hooks.UserPromptSubmit.length === 0) {\n delete hooks.UserPromptSubmit;\n }\n\n writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2) + \"\\n\");\n }\n}\n\nconst integrations: Record<string, AgentIntegration> = {\n claude: new ClaudeIntegration(),\n};\n\nexport function getIntegration(agentName: string): AgentIntegration | undefined {\n return integrations[agentName];\n}\n\nexport function listIntegrations(): string[] {\n return Object.keys(integrations);\n}\n"],"mappings":"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","names":[]}
@@ -2,18 +2,20 @@
2
2
  import {
3
3
  ApiServer,
4
4
  OpenACPCore,
5
- TelegramAdapter
6
- } from "./chunk-VRXFGWZJ.js";
7
- import "./chunk-WHKLPZGK.js";
5
+ TelegramAdapter,
6
+ TopicManager
7
+ } from "./chunk-2M4O7AFI.js";
8
+ import "./chunk-IUPHAXGA.js";
9
+ import "./chunk-ARWC4S35.js";
10
+ import "./chunk-VA2M52CM.js";
8
11
  import {
9
12
  loadAdapterFactory
10
13
  } from "./chunk-2SY7Y2VB.js";
11
14
  import "./chunk-3QACY5E3.js";
12
- import "./chunk-MRKYJ422.js";
13
- import "./chunk-BLVZFCKN.js";
14
15
  import {
15
16
  ConfigManager
16
17
  } from "./chunk-WF5XDN4D.js";
18
+ import "./chunk-MRKYJ422.js";
17
19
  import {
18
20
  cleanupOldSessionLogs,
19
21
  initLogger,
@@ -45,7 +47,7 @@ async function startServer() {
45
47
  const configManager = new ConfigManager();
46
48
  const configExists = await configManager.exists();
47
49
  if (!configExists) {
48
- const { runSetup } = await import("./setup-JQZBPXWS.js");
50
+ const { runSetup } = await import("./setup-CEDO6VWV.js");
49
51
  const shouldStart = await runSetup(configManager);
50
52
  if (!shouldStart) process.exit(0);
51
53
  }
@@ -151,7 +153,18 @@ async function startServer() {
151
153
  log.error({ err }, "Unhandled rejection");
152
154
  });
153
155
  await core.start();
154
- apiServer = new ApiServer(core, config.api);
156
+ const updatedConfig = core.configManager.get();
157
+ const telegramAdapter = core.adapters.get("telegram") ?? null;
158
+ const telegramCfg = updatedConfig.channels?.telegram;
159
+ const topicManager = new TopicManager(
160
+ core.sessionManager,
161
+ telegramAdapter,
162
+ {
163
+ notificationTopicId: telegramCfg?.notificationTopicId ?? null,
164
+ assistantTopicId: telegramCfg?.assistantTopicId ?? null
165
+ }
166
+ );
167
+ apiServer = new ApiServer(core, config.api, void 0, topicManager);
155
168
  await apiServer.start();
156
169
  const agents = Object.keys(config.agents);
157
170
  log.info({ agents }, "OpenACP started");
@@ -168,4 +181,4 @@ export {
168
181
  RESTART_EXIT_CODE,
169
182
  startServer
170
183
  };
171
- //# sourceMappingURL=main-QFEJO2NB.js.map
184
+ //# sourceMappingURL=main-3POGUQPY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ConfigManager } from './core/config.js'\nimport { OpenACPCore } from './core/core.js'\nimport { loadAdapterFactory } from './core/plugin-manager.js'\nimport { initLogger, shutdownLogger, cleanupOldSessionLogs, log } from './core/log.js'\nimport { TelegramAdapter } from './adapters/telegram/index.js'\nimport { ApiServer } from './core/api-server.js'\nimport { TopicManager } from './core/topic-manager.js'\n\nexport const RESTART_EXIT_CODE = 75\nlet shuttingDown = false\n\nexport async function startServer() {\n // 0. If running as daemon child, check state and write PID file\n if (process.argv.includes('--daemon-child')) {\n const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import('./core/daemon.js')\n\n // Only auto-start if the daemon was previously running (user started it)\n if (!shouldAutoStart()) {\n process.exit(0)\n }\n\n const pidPath = getPidPath()\n const existingPid = readPidFile(pidPath)\n if (existingPid !== null && existingPid !== process.pid) {\n try {\n process.kill(existingPid, 0)\n console.error(`Another OpenACP instance is already running (PID ${existingPid}). Exiting.`)\n process.exit(1)\n } catch {\n // Stale PID file — safe to overwrite\n }\n }\n writePidFile(pidPath, process.pid)\n }\n\n // 1. Check config exists, run setup if not\n const configManager = new ConfigManager()\n const configExists = await configManager.exists()\n\n if (!configExists) {\n const { runSetup } = await import('./core/setup.js')\n const shouldStart = await runSetup(configManager)\n if (!shouldStart) process.exit(0)\n }\n\n // 2. Load config (validates with Zod)\n await configManager.load()\n const config = configManager.get()\n initLogger(config.logging)\n log.info({ configPath: configManager.getConfigPath() }, 'Config loaded')\n\n // Async cleanup of old session logs (non-blocking)\n cleanupOldSessionLogs(config.logging.sessionLogRetentionDays).catch(err =>\n log.warn({ err }, 'Session log cleanup failed')\n )\n\n // 3. Create core\n const core = new OpenACPCore(configManager)\n\n // 3.5 Start tunnel if configured\n let tunnelService: import('./tunnel/tunnel-service.js').TunnelService | undefined\n if (config.tunnel.enabled) {\n const { TunnelService } = await import('./tunnel/tunnel-service.js')\n tunnelService = new TunnelService(config.tunnel)\n const publicUrl = await tunnelService.start()\n core.tunnelService = tunnelService\n log.info({ publicUrl }, 'Tunnel started')\n }\n\n // 4. 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 core.registerAdapter('telegram', new TelegramAdapter(core, channelConfig as any))\n log.info({ adapter: 'telegram' }, 'Adapter registered')\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({ adapter: channelName, plugin: channelConfig.adapter }, 'Adapter registered')\n } else {\n const name = channelName\n const err = channelConfig.adapter\n log.error({ adapter: name, err }, 'Failed to load adapter')\n }\n } else {\n log.error({ adapter: channelName }, 'Channel 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 // 5. Start\n let apiServer: ApiServer | undefined\n\n const shutdown = async (signal: string, exitCode = 0) => {\n if (shuttingDown) return\n shuttingDown = true\n log.info({ signal, exitCode }, 'Signal received, shutting down')\n\n try {\n if (apiServer) await apiServer.stop()\n await core.stop()\n if (tunnelService) await tunnelService.stop()\n } catch (err) {\n log.error({ err }, 'Error during shutdown')\n }\n\n const isDaemon = process.argv.includes('--daemon-child')\n\n // Clean up PID file if running as daemon\n if (isDaemon) {\n const { removePidFile, getPidPath } = await import('./core/daemon.js')\n removePidFile(getPidPath())\n }\n\n // Self-respawn on restart\n if (exitCode === RESTART_EXIT_CODE) {\n if (isDaemon) {\n // Daemon mode: spawn detached child writing to log file\n const { spawn: spawnChild } = await import('node:child_process')\n const { expandHome } = await import('./core/config.js')\n const fs = await import('node:fs')\n const pathMod = await import('node:path')\n\n const cliPath = pathMod.resolve(process.argv[1])\n const resolvedLogDir = expandHome(config.logging.logDir)\n fs.mkdirSync(resolvedLogDir, { recursive: true })\n const logFile = pathMod.join(resolvedLogDir, 'openacp.log')\n const out = fs.openSync(logFile, 'a')\n const err = fs.openSync(logFile, 'a')\n\n const child = spawnChild(process.execPath, [cliPath, '--daemon-child'], {\n detached: true,\n stdio: ['ignore', out, err],\n env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: '1' },\n })\n fs.closeSync(out)\n fs.closeSync(err)\n child.unref()\n log.info({ newPid: child.pid }, 'Respawned daemon for restart')\n } else if (!process.env.OPENACP_DEV_LOOP) {\n // Foreground production mode: spawn replacement process with inherited stdio\n const { spawn: spawnChild } = await import('node:child_process')\n const child = spawnChild(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: '1' },\n })\n await shutdownLogger()\n child.on('exit', (code) => process.exit(code ?? 0))\n return\n }\n }\n\n await shutdownLogger()\n process.exit(exitCode)\n }\n\n // Expose restart trigger for adapters (e.g. /restart command)\n core.requestRestart = () => shutdown('restart', RESTART_EXIT_CODE)\n\n process.on('SIGINT', () => shutdown('SIGINT'))\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n\n process.on('uncaughtException', (err) => {\n log.error({ err }, 'Uncaught exception')\n })\n\n process.on('unhandledRejection', (err) => {\n log.error({ err }, 'Unhandled rejection')\n })\n\n await core.start()\n\n const updatedConfig = core.configManager.get()\n const telegramAdapter = core.adapters.get('telegram') ?? null\n const telegramCfg = updatedConfig.channels?.telegram as any\n const topicManager = new TopicManager(\n core.sessionManager,\n telegramAdapter,\n {\n notificationTopicId: telegramCfg?.notificationTopicId ?? null,\n assistantTopicId: telegramCfg?.assistantTopicId ?? null,\n },\n )\n\n apiServer = new ApiServer(core, config.api, undefined, topicManager)\n await apiServer.start()\n\n // 6. Log ready\n const agents = Object.keys(config.agents)\n log.info({ agents }, 'OpenACP started')\n log.info('Press Ctrl+C to stop')\n}\n\n// Direct execution for dev (node dist/main.js)\nconst isDirectExecution = process.argv[1]?.endsWith('main.js')\nif (isDirectExecution) {\n startServer().catch((err) => {\n log.error({ err }, 'Fatal error')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  validateBotAdmin,
10
10
  validateBotToken,
11
11
  validateChatId
12
- } from "./chunk-BLVZFCKN.js";
12
+ } from "./chunk-ARWC4S35.js";
13
13
  import "./chunk-WF5XDN4D.js";
14
14
  import "./chunk-LYKCQTH5.js";
15
15
  export {
@@ -24,4 +24,4 @@ export {
24
24
  validateBotToken,
25
25
  validateChatId
26
26
  };
27
- //# sourceMappingURL=setup-JQZBPXWS.js.map
27
+ //# sourceMappingURL=setup-CEDO6VWV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openacp/cli",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "description": "Self-hosted bridge for AI coding agents via ACP protocol",
5
5
  "type": "module",
6
6
  "bin": {