@openacp/cli 0.4.9 → 0.4.11

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.
Files changed (63) hide show
  1. package/README.md +17 -2
  2. package/dist/api-client-UN7BXQOQ.js +11 -0
  3. package/dist/{autostart-DZ3MHHMM.js → autostart-K73RQZVV.js} +3 -3
  4. package/dist/chunk-3DIPXFZJ.js +650 -0
  5. package/dist/chunk-3DIPXFZJ.js.map +1 -0
  6. package/dist/{chunk-45DFYWJT.js → chunk-66RVSUAR.js} +1782 -1415
  7. package/dist/chunk-66RVSUAR.js.map +1 -0
  8. package/dist/chunk-BGKQHQB4.js +276 -0
  9. package/dist/chunk-BGKQHQB4.js.map +1 -0
  10. package/dist/chunk-C33LTDZV.js +97 -0
  11. package/dist/chunk-C33LTDZV.js.map +1 -0
  12. package/dist/{chunk-LYKCQTH5.js → chunk-ESOPMQAY.js} +5 -1
  13. package/dist/chunk-ESOPMQAY.js.map +1 -0
  14. package/dist/{chunk-6MJLVZXV.js → chunk-FKOARMAE.js} +58 -21
  15. package/dist/{chunk-6MJLVZXV.js.map → chunk-FKOARMAE.js.map} +1 -1
  16. package/dist/chunk-OORPX73T.js +30 -0
  17. package/dist/chunk-OORPX73T.js.map +1 -0
  18. package/dist/{chunk-V3BA2MJ6.js → chunk-RF3DUYFO.js} +2 -2
  19. package/dist/{chunk-UAUTLC4E.js → chunk-W7QQA6CW.js} +4 -4
  20. package/dist/{chunk-ZRFBLD3W.js → chunk-WYZFGHHI.js} +14 -4
  21. package/dist/chunk-WYZFGHHI.js.map +1 -0
  22. package/dist/{chunk-MRKYJ422.js → chunk-X6LLG7XN.js} +2 -2
  23. package/dist/{chunk-C6YIUTGR.js → chunk-YRJEZD7R.js} +2 -2
  24. package/dist/{chunk-HZD3CGPK.js → chunk-ZW444AQY.js} +3 -3
  25. package/dist/cli.js +141 -52
  26. package/dist/cli.js.map +1 -1
  27. package/dist/{config-H2DSEHNW.js → config-XURP6B3S.js} +3 -3
  28. package/dist/config-editor-AALY3URF.js +11 -0
  29. package/dist/config-registry-OGX4YM2U.js +17 -0
  30. package/dist/{daemon-VF6HJQXD.js → daemon-GWJM2S4A.js} +4 -4
  31. package/dist/doctor-X477CVZN.js +9 -0
  32. package/dist/doctor-X477CVZN.js.map +1 -0
  33. package/dist/index.d.ts +76 -27
  34. package/dist/index.js +33 -13
  35. package/dist/install-cloudflared-BTGUD7SW.js +8 -0
  36. package/dist/install-cloudflared-BTGUD7SW.js.map +1 -0
  37. package/dist/log-SPS2S6FO.js +19 -0
  38. package/dist/log-SPS2S6FO.js.map +1 -0
  39. package/dist/{main-7T5YHFHO.js → main-2QKD2EI2.js} +17 -14
  40. package/dist/{main-7T5YHFHO.js.map → main-2QKD2EI2.js.map} +1 -1
  41. package/dist/menu-CARRTW2F.js +17 -0
  42. package/dist/menu-CARRTW2F.js.map +1 -0
  43. package/dist/{setup-FCVL75K6.js → setup-TTOL7XAN.js} +4 -4
  44. package/dist/setup-TTOL7XAN.js.map +1 -0
  45. package/dist/{tunnel-service-DASSH7OA.js → tunnel-service-LEVPLXAZ.js} +3 -3
  46. package/package.json +1 -1
  47. package/dist/chunk-45DFYWJT.js.map +0 -1
  48. package/dist/chunk-LYKCQTH5.js.map +0 -1
  49. package/dist/chunk-ZRFBLD3W.js.map +0 -1
  50. package/dist/config-editor-SKS4LJLT.js +0 -11
  51. package/dist/install-cloudflared-ILUXKLAC.js +0 -8
  52. /package/dist/{autostart-DZ3MHHMM.js.map → api-client-UN7BXQOQ.js.map} +0 -0
  53. /package/dist/{config-H2DSEHNW.js.map → autostart-K73RQZVV.js.map} +0 -0
  54. /package/dist/{chunk-V3BA2MJ6.js.map → chunk-RF3DUYFO.js.map} +0 -0
  55. /package/dist/{chunk-UAUTLC4E.js.map → chunk-W7QQA6CW.js.map} +0 -0
  56. /package/dist/{chunk-MRKYJ422.js.map → chunk-X6LLG7XN.js.map} +0 -0
  57. /package/dist/{chunk-C6YIUTGR.js.map → chunk-YRJEZD7R.js.map} +0 -0
  58. /package/dist/{chunk-HZD3CGPK.js.map → chunk-ZW444AQY.js.map} +0 -0
  59. /package/dist/{config-editor-SKS4LJLT.js.map → config-XURP6B3S.js.map} +0 -0
  60. /package/dist/{daemon-VF6HJQXD.js.map → config-editor-AALY3URF.js.map} +0 -0
  61. /package/dist/{install-cloudflared-ILUXKLAC.js.map → config-registry-OGX4YM2U.js.map} +0 -0
  62. /package/dist/{setup-FCVL75K6.js.map → daemon-GWJM2S4A.js.map} +0 -0
  63. /package/dist/{tunnel-service-DASSH7OA.js.map → tunnel-service-LEVPLXAZ.js.map} +0 -0
@@ -0,0 +1,9 @@
1
+ import {
2
+ DoctorEngine
3
+ } from "./chunk-3DIPXFZJ.js";
4
+ import "./chunk-WYZFGHHI.js";
5
+ import "./chunk-ESOPMQAY.js";
6
+ export {
7
+ DoctorEngine
8
+ };
9
+ //# sourceMappingURL=doctor-X477CVZN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import pino from 'pino';
2
2
  import { z } from 'zod';
3
+ import { EventEmitter } from 'node:events';
3
4
  import { Readable, Writable } from 'node:stream';
4
5
  import { PromptResponse } from '@agentclientprotocol/sdk';
5
6
 
@@ -412,13 +413,13 @@ declare const ConfigSchema: z.ZodObject<{
412
413
  }>;
413
414
  type Config = z.infer<typeof ConfigSchema>;
414
415
  declare function expandHome(p: string): string;
415
- declare class ConfigManager {
416
+ declare class ConfigManager extends EventEmitter {
416
417
  private config;
417
418
  private configPath;
418
419
  constructor();
419
420
  load(): Promise<void>;
420
421
  get(): Config;
421
- save(updates: Record<string, unknown>): Promise<void>;
422
+ save(updates: Record<string, unknown>, changePath?: string): Promise<void>;
422
423
  resolveWorkspace(input?: string): string;
423
424
  exists(): Promise<boolean>;
424
425
  getConfigPath(): string;
@@ -437,6 +438,8 @@ declare const log: {
437
438
  child: (bindings: pino.Bindings) => pino.Logger<never, boolean>;
438
439
  };
439
440
  declare function initLogger(config: LoggingConfig): Logger;
441
+ /** Change log level at runtime. Pino transport targets respect parent level changes automatically. */
442
+ declare function setLogLevel(level: string): void;
440
443
  declare function createChildLogger(context: {
441
444
  module: string;
442
445
  [key: string]: unknown;
@@ -585,6 +588,8 @@ interface SessionEvents {
585
588
  agent_event: (event: AgentEvent) => void;
586
589
  permission_request: (request: PermissionRequest) => void;
587
590
  session_end: (reason: string) => void;
591
+ status_change: (from: SessionStatus, to: SessionStatus) => void;
592
+ named: (name: string) => void;
588
593
  error: (error: Error) => void;
589
594
  }
590
595
  declare class Session extends TypedEmitter<SessionEvents> {
@@ -595,10 +600,9 @@ declare class Session extends TypedEmitter<SessionEvents> {
595
600
  workingDirectory: string;
596
601
  agentInstance: AgentInstance;
597
602
  agentSessionId: string;
598
- status: SessionStatus;
603
+ private _status;
599
604
  name?: string;
600
605
  createdAt: Date;
601
- adapter?: ChannelAdapter;
602
606
  dangerousMode: boolean;
603
607
  log: Logger;
604
608
  readonly permissionGate: PermissionGate;
@@ -610,15 +614,16 @@ declare class Session extends TypedEmitter<SessionEvents> {
610
614
  workingDirectory: string;
611
615
  agentInstance: AgentInstance;
612
616
  });
613
- /** @deprecated Use permissionGate directly */
614
- get pendingPermission(): {
615
- requestId: string;
616
- resolve: (optionId: string) => void;
617
- } | undefined;
618
- set pendingPermission(val: {
619
- requestId: string;
620
- resolve: (optionId: string) => void;
621
- } | undefined);
617
+ get status(): SessionStatus;
618
+ /** Transition to active — from initializing, error, or cancelled */
619
+ activate(): void;
620
+ /** Transition to error — from initializing or active */
621
+ fail(reason: string): void;
622
+ /** Transition to finished — from active only. Emits session_end for backward compat. */
623
+ finish(reason?: string): void;
624
+ /** Transition to cancelled — from active only (terminal session cancel) */
625
+ markCancelled(): void;
626
+ private transition;
622
627
  /** Number of prompts waiting in queue */
623
628
  get queueDepth(): number;
624
629
  get promptRunning(): boolean;
@@ -628,7 +633,8 @@ declare class Session extends TypedEmitter<SessionEvents> {
628
633
  /** Fire-and-forget warm-up: primes model cache while user types their first message */
629
634
  warmup(): Promise<void>;
630
635
  private runWarmup;
631
- cancel(): Promise<void>;
636
+ /** Cancel the current prompt and clear the queue. Stays in active state. */
637
+ abortPrompt(): Promise<void>;
632
638
  destroy(): Promise<void>;
633
639
  }
634
640
 
@@ -721,11 +727,7 @@ declare class SessionManager {
721
727
  getRecordByAgentSessionId(agentSessionId: string): SessionRecord | undefined;
722
728
  getRecordByThread(channelId: string, threadId: string): SessionRecord | undefined;
723
729
  registerSession(session: Session): void;
724
- updateSessionPlatform(sessionId: string, platform: Record<string, unknown>): Promise<void>;
725
- updateSessionActivity(sessionId: string): Promise<void>;
726
- updateSessionStatus(sessionId: string, status: SessionStatus): Promise<void>;
727
- updateSessionDangerousMode(sessionId: string, dangerousMode: boolean): Promise<void>;
728
- updateSessionName(sessionId: string, name: string): Promise<void>;
730
+ patchRecord(sessionId: string, patch: Partial<SessionRecord>): Promise<void>;
729
731
  getSessionRecord(sessionId: string): SessionRecord | undefined;
730
732
  cancelSession(sessionId: string): Promise<void>;
731
733
  listSessions(channelId?: string): Session[];
@@ -736,6 +738,28 @@ declare class SessionManager {
736
738
  destroyAll(): Promise<void>;
737
739
  }
738
740
 
741
+ interface BridgeDeps {
742
+ messageTransformer: MessageTransformer;
743
+ notificationManager: NotificationManager;
744
+ sessionManager: SessionManager;
745
+ }
746
+ declare class SessionBridge {
747
+ private session;
748
+ private adapter;
749
+ private deps;
750
+ private connected;
751
+ private agentEventHandler?;
752
+ private statusChangeHandler?;
753
+ private namedHandler?;
754
+ constructor(session: Session, adapter: ChannelAdapter, deps: BridgeDeps);
755
+ connect(): void;
756
+ disconnect(): void;
757
+ private wireAgentToSession;
758
+ private wireSessionToAdapter;
759
+ private wirePermissions;
760
+ private wireLifecycle;
761
+ }
762
+
739
763
  declare class OpenACPCore {
740
764
  configManager: ConfigManager;
741
765
  agentManager: AgentManager;
@@ -755,6 +779,15 @@ declare class OpenACPCore {
755
779
  start(): Promise<void>;
756
780
  stop(): Promise<void>;
757
781
  handleMessage(message: IncomingMessage): Promise<void>;
782
+ createSession(params: {
783
+ channelId: string;
784
+ agentName: string;
785
+ workingDirectory: string;
786
+ resumeAgentSessionId?: string;
787
+ existingSessionId?: string;
788
+ createThread?: boolean;
789
+ initialName?: string;
790
+ }): Promise<Session>;
758
791
  handleNewSession(channelId: string, agentName?: string, workspacePath?: string): Promise<Session>;
759
792
  adoptSession(agentName: string, agentSessionId: string, cwd: string): Promise<{
760
793
  ok: true;
@@ -768,7 +801,8 @@ declare class OpenACPCore {
768
801
  }>;
769
802
  handleNewChat(channelId: string, currentThreadId: string): Promise<Session | null>;
770
803
  private lazyResume;
771
- wireSessionEvents(session: Session, adapter: ChannelAdapter): void;
804
+ /** Create a SessionBridge for the given session and adapter */
805
+ createBridge(session: Session, adapter: ChannelAdapter): SessionBridge;
772
806
  }
773
807
 
774
808
  interface AdapterFactory {
@@ -807,7 +841,7 @@ declare function uninstallAutoStart(): {
807
841
  };
808
842
  declare function isAutoStartInstalled(): boolean;
809
843
 
810
- declare function runConfigEditor(configManager: ConfigManager): Promise<void>;
844
+ declare function runConfigEditor(configManager: ConfigManager, mode?: 'file' | 'api', apiPort?: number): Promise<void>;
811
845
 
812
846
  interface TopicInfo {
813
847
  sessionId: string;
@@ -879,6 +913,7 @@ declare class ApiServer {
879
913
  private handleToggleDangerous;
880
914
  private handleHealth;
881
915
  private handleVersion;
916
+ private handleGetEditableConfig;
882
917
  private handleGetConfig;
883
918
  private handleUpdateConfig;
884
919
  private handleListAdapters;
@@ -896,6 +931,22 @@ declare class ApiServer {
896
931
  private readBody;
897
932
  }
898
933
 
934
+ interface ConfigFieldDef {
935
+ path: string;
936
+ displayName: string;
937
+ group: string;
938
+ type: 'toggle' | 'select' | 'number' | 'string';
939
+ options?: string[] | ((config: Config) => string[]);
940
+ scope: 'safe' | 'sensitive';
941
+ hotReload: boolean;
942
+ }
943
+ declare const CONFIG_REGISTRY: ConfigFieldDef[];
944
+ declare function getFieldDef(path: string): ConfigFieldDef | undefined;
945
+ declare function getSafeFields(): ConfigFieldDef[];
946
+ declare function isHotReloadable(path: string): boolean;
947
+ declare function resolveOptions(def: ConfigFieldDef, config: Config): string[] | undefined;
948
+ declare function getConfigValue(config: Config, path: string): unknown;
949
+
899
950
  interface TelegramChannelConfig {
900
951
  enabled: boolean;
901
952
  botToken: string;
@@ -907,16 +958,15 @@ interface TelegramChannelConfig {
907
958
  declare class TelegramAdapter extends ChannelAdapter<OpenACPCore> {
908
959
  private bot;
909
960
  private telegramConfig;
910
- private sessionDrafts;
911
- private sessionTextBuffers;
912
- private toolCallMessages;
913
961
  private permissionHandler;
914
962
  private assistantSession;
915
963
  private assistantInitializing;
916
964
  private notificationTopicId;
917
965
  private assistantTopicId;
918
- private skillMessages;
919
966
  private sendQueue;
967
+ private toolTracker;
968
+ private draftManager;
969
+ private skillManager;
920
970
  private sessionTrackers;
921
971
  private getOrCreateTracker;
922
972
  constructor(core: OpenACPCore, config: TelegramChannelConfig);
@@ -931,7 +981,6 @@ declare class TelegramAdapter extends ChannelAdapter<OpenACPCore> {
931
981
  deleteSessionThread(sessionId: string): Promise<void>;
932
982
  sendSkillCommands(sessionId: string, commands: AgentCommand[]): Promise<void>;
933
983
  cleanupSkillCommands(sessionId: string): Promise<void>;
934
- private finalizeDraft;
935
984
  }
936
985
 
937
- 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 };
986
+ export { type AdapterFactory, type AgentCommand, type AgentDefinition, type AgentEvent, AgentInstance, AgentManager, type ApiConfig, ApiServer, type BridgeDeps, CONFIG_REGISTRY, ChannelAdapter, type ChannelConfig, type CleanupResult, type Config, type ConfigFieldDef, 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, SessionBridge, type SessionEvents, SessionManager, type SessionRecord, type SessionStatus, StderrCapture, TelegramAdapter, type TelegramPlatformData, type TopicInfo, TopicManager, TypedEmitter, cleanupOldSessionLogs, createChildLogger, createSessionLogger, expandHome, getConfigValue, getFieldDef, getPidPath, getSafeFields, getStatus, initLogger, installAutoStart, installPlugin, isAutoStartInstalled, isAutoStartSupported, isHotReloadable, listPlugins, loadAdapterFactory, log, nodeToWebReadable, nodeToWebWritable, resolveOptions, runConfigEditor, setLogLevel, shutdownLogger, startDaemon, stopDaemon, uninstallAutoStart, uninstallPlugin };
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  PermissionGate,
10
10
  PromptQueue,
11
11
  Session,
12
+ SessionBridge,
12
13
  SessionManager,
13
14
  StderrCapture,
14
15
  TelegramAdapter,
@@ -16,47 +17,59 @@ import {
16
17
  TypedEmitter,
17
18
  nodeToWebReadable,
18
19
  nodeToWebWritable
19
- } from "./chunk-45DFYWJT.js";
20
+ } from "./chunk-66RVSUAR.js";
20
21
  import {
21
22
  runConfigEditor
22
- } from "./chunk-6MJLVZXV.js";
23
- import "./chunk-UAUTLC4E.js";
23
+ } from "./chunk-FKOARMAE.js";
24
+ import {
25
+ installAutoStart,
26
+ isAutoStartInstalled,
27
+ isAutoStartSupported,
28
+ uninstallAutoStart
29
+ } from "./chunk-X6LLG7XN.js";
30
+ import "./chunk-W7QQA6CW.js";
31
+ import "./chunk-3DIPXFZJ.js";
24
32
  import "./chunk-VA2M52CM.js";
33
+ import "./chunk-BGKQHQB4.js";
25
34
  import {
26
35
  installPlugin,
27
36
  listPlugins,
28
37
  loadAdapterFactory,
29
38
  uninstallPlugin
30
- } from "./chunk-HZD3CGPK.js";
39
+ } from "./chunk-ZW444AQY.js";
40
+ import {
41
+ CONFIG_REGISTRY,
42
+ getConfigValue,
43
+ getFieldDef,
44
+ getSafeFields,
45
+ isHotReloadable,
46
+ resolveOptions
47
+ } from "./chunk-C33LTDZV.js";
31
48
  import {
32
49
  getPidPath,
33
50
  getStatus,
34
51
  startDaemon,
35
52
  stopDaemon
36
- } from "./chunk-C6YIUTGR.js";
53
+ } from "./chunk-YRJEZD7R.js";
37
54
  import {
38
55
  ConfigManager,
39
56
  PLUGINS_DIR,
40
57
  expandHome
41
- } from "./chunk-ZRFBLD3W.js";
42
- import {
43
- installAutoStart,
44
- isAutoStartInstalled,
45
- isAutoStartSupported,
46
- uninstallAutoStart
47
- } from "./chunk-MRKYJ422.js";
58
+ } from "./chunk-WYZFGHHI.js";
48
59
  import {
49
60
  cleanupOldSessionLogs,
50
61
  createChildLogger,
51
62
  createSessionLogger,
52
63
  initLogger,
53
64
  log,
65
+ setLogLevel,
54
66
  shutdownLogger
55
- } from "./chunk-LYKCQTH5.js";
67
+ } from "./chunk-ESOPMQAY.js";
56
68
  export {
57
69
  AgentInstance,
58
70
  AgentManager,
59
71
  ApiServer,
72
+ CONFIG_REGISTRY,
60
73
  ChannelAdapter,
61
74
  ConfigManager,
62
75
  MessageTransformer,
@@ -66,6 +79,7 @@ export {
66
79
  PermissionGate,
67
80
  PromptQueue,
68
81
  Session,
82
+ SessionBridge,
69
83
  SessionManager,
70
84
  StderrCapture,
71
85
  TelegramAdapter,
@@ -75,19 +89,25 @@ export {
75
89
  createChildLogger,
76
90
  createSessionLogger,
77
91
  expandHome,
92
+ getConfigValue,
93
+ getFieldDef,
78
94
  getPidPath,
95
+ getSafeFields,
79
96
  getStatus,
80
97
  initLogger,
81
98
  installAutoStart,
82
99
  installPlugin,
83
100
  isAutoStartInstalled,
84
101
  isAutoStartSupported,
102
+ isHotReloadable,
85
103
  listPlugins,
86
104
  loadAdapterFactory,
87
105
  log,
88
106
  nodeToWebReadable,
89
107
  nodeToWebWritable,
108
+ resolveOptions,
90
109
  runConfigEditor,
110
+ setLogLevel,
91
111
  shutdownLogger,
92
112
  startDaemon,
93
113
  stopDaemon,
@@ -0,0 +1,8 @@
1
+ import {
2
+ ensureCloudflared
3
+ } from "./chunk-RF3DUYFO.js";
4
+ import "./chunk-ESOPMQAY.js";
5
+ export {
6
+ ensureCloudflared
7
+ };
8
+ //# sourceMappingURL=install-cloudflared-BTGUD7SW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ cleanupOldSessionLogs,
3
+ createChildLogger,
4
+ createSessionLogger,
5
+ initLogger,
6
+ log,
7
+ setLogLevel,
8
+ shutdownLogger
9
+ } from "./chunk-ESOPMQAY.js";
10
+ export {
11
+ cleanupOldSessionLogs,
12
+ createChildLogger,
13
+ createSessionLogger,
14
+ initLogger,
15
+ log,
16
+ setLogLevel,
17
+ shutdownLogger
18
+ };
19
+ //# sourceMappingURL=log-SPS2S6FO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -4,31 +4,34 @@ import {
4
4
  OpenACPCore,
5
5
  TelegramAdapter,
6
6
  TopicManager
7
- } from "./chunk-45DFYWJT.js";
8
- import "./chunk-6MJLVZXV.js";
9
- import "./chunk-UAUTLC4E.js";
7
+ } from "./chunk-66RVSUAR.js";
8
+ import "./chunk-FKOARMAE.js";
9
+ import "./chunk-X6LLG7XN.js";
10
+ import "./chunk-W7QQA6CW.js";
11
+ import "./chunk-3DIPXFZJ.js";
10
12
  import "./chunk-VA2M52CM.js";
13
+ import "./chunk-BGKQHQB4.js";
11
14
  import {
12
15
  loadAdapterFactory
13
- } from "./chunk-HZD3CGPK.js";
14
- import "./chunk-C6YIUTGR.js";
16
+ } from "./chunk-ZW444AQY.js";
17
+ import "./chunk-C33LTDZV.js";
18
+ import "./chunk-YRJEZD7R.js";
15
19
  import {
16
20
  ConfigManager
17
- } from "./chunk-ZRFBLD3W.js";
18
- import "./chunk-MRKYJ422.js";
21
+ } from "./chunk-WYZFGHHI.js";
19
22
  import {
20
23
  cleanupOldSessionLogs,
21
24
  initLogger,
22
25
  log,
23
26
  shutdownLogger
24
- } from "./chunk-LYKCQTH5.js";
27
+ } from "./chunk-ESOPMQAY.js";
25
28
 
26
29
  // src/main.ts
27
30
  var RESTART_EXIT_CODE = 75;
28
31
  var shuttingDown = false;
29
32
  async function startServer() {
30
33
  if (process.argv.includes("--daemon-child")) {
31
- const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-VF6HJQXD.js");
34
+ const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-GWJM2S4A.js");
32
35
  if (!shouldAutoStart()) {
33
36
  process.exit(0);
34
37
  }
@@ -47,7 +50,7 @@ async function startServer() {
47
50
  const configManager = new ConfigManager();
48
51
  const configExists = await configManager.exists();
49
52
  if (!configExists) {
50
- const { runSetup } = await import("./setup-FCVL75K6.js");
53
+ const { runSetup } = await import("./setup-TTOL7XAN.js");
51
54
  const shouldStart = await runSetup(configManager);
52
55
  if (!shouldStart) process.exit(0);
53
56
  }
@@ -61,7 +64,7 @@ async function startServer() {
61
64
  const core = new OpenACPCore(configManager);
62
65
  let tunnelService;
63
66
  if (config.tunnel.enabled) {
64
- const { TunnelService } = await import("./tunnel-service-DASSH7OA.js");
67
+ const { TunnelService } = await import("./tunnel-service-LEVPLXAZ.js");
65
68
  tunnelService = new TunnelService(config.tunnel);
66
69
  const publicUrl = await tunnelService.start();
67
70
  core.tunnelService = tunnelService;
@@ -105,13 +108,13 @@ async function startServer() {
105
108
  }
106
109
  const isDaemon = process.argv.includes("--daemon-child");
107
110
  if (isDaemon) {
108
- const { removePidFile, getPidPath } = await import("./daemon-VF6HJQXD.js");
111
+ const { removePidFile, getPidPath } = await import("./daemon-GWJM2S4A.js");
109
112
  removePidFile(getPidPath());
110
113
  }
111
114
  if (exitCode === RESTART_EXIT_CODE) {
112
115
  if (isDaemon) {
113
116
  const { spawn: spawnChild } = await import("child_process");
114
- const { expandHome } = await import("./config-H2DSEHNW.js");
117
+ const { expandHome } = await import("./config-XURP6B3S.js");
115
118
  const fs = await import("fs");
116
119
  const pathMod = await import("path");
117
120
  const cliPath = pathMod.resolve(process.argv[1]);
@@ -181,4 +184,4 @@ export {
181
184
  RESTART_EXIT_CODE,
182
185
  startServer
183
186
  };
184
- //# sourceMappingURL=main-7T5YHFHO.js.map
187
+ //# sourceMappingURL=main-2QKD2EI2.js.map
@@ -1 +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":[]}
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":[]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ buildMenuKeyboard,
3
+ buildSkillMessages,
4
+ handleAgents,
5
+ handleClear,
6
+ handleHelp,
7
+ handleMenu
8
+ } from "./chunk-BGKQHQB4.js";
9
+ export {
10
+ buildMenuKeyboard,
11
+ buildSkillMessages,
12
+ handleAgents,
13
+ handleClear,
14
+ handleHelp,
15
+ handleMenu
16
+ };
17
+ //# sourceMappingURL=menu-CARRTW2F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -9,9 +9,9 @@ import {
9
9
  validateBotAdmin,
10
10
  validateBotToken,
11
11
  validateChatId
12
- } from "./chunk-UAUTLC4E.js";
13
- import "./chunk-ZRFBLD3W.js";
14
- import "./chunk-LYKCQTH5.js";
12
+ } from "./chunk-W7QQA6CW.js";
13
+ import "./chunk-WYZFGHHI.js";
14
+ import "./chunk-ESOPMQAY.js";
15
15
  export {
16
16
  detectAgents,
17
17
  runSetup,
@@ -24,4 +24,4 @@ export {
24
24
  validateBotToken,
25
25
  validateChatId
26
26
  };
27
- //# sourceMappingURL=setup-FCVL75K6.js.map
27
+ //# sourceMappingURL=setup-TTOL7XAN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ensureCloudflared
3
- } from "./chunk-V3BA2MJ6.js";
3
+ } from "./chunk-RF3DUYFO.js";
4
4
  import {
5
5
  createChildLogger
6
- } from "./chunk-LYKCQTH5.js";
6
+ } from "./chunk-ESOPMQAY.js";
7
7
 
8
8
  // src/tunnel/tunnel-service.ts
9
9
  import { serve } from "@hono/node-server";
@@ -936,4 +936,4 @@ var TunnelService = class {
936
936
  export {
937
937
  TunnelService
938
938
  };
939
- //# sourceMappingURL=tunnel-service-DASSH7OA.js.map
939
+ //# sourceMappingURL=tunnel-service-LEVPLXAZ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openacp/cli",
3
- "version": "0.4.9",
3
+ "version": "0.4.11",
4
4
  "description": "Self-hosted bridge for AI coding agents via ACP protocol",
5
5
  "type": "module",
6
6
  "bin": {