@openacp/cli 0.4.10 → 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.
- package/README.md +17 -2
- package/dist/api-client-UN7BXQOQ.js +11 -0
- package/dist/{autostart-DZ3MHHMM.js → autostart-K73RQZVV.js} +3 -3
- package/dist/chunk-3DIPXFZJ.js +650 -0
- package/dist/chunk-3DIPXFZJ.js.map +1 -0
- package/dist/{chunk-KPI4HGJC.js → chunk-66RVSUAR.js} +1423 -1141
- package/dist/chunk-66RVSUAR.js.map +1 -0
- package/dist/chunk-BGKQHQB4.js +276 -0
- package/dist/chunk-BGKQHQB4.js.map +1 -0
- package/dist/chunk-C33LTDZV.js +97 -0
- package/dist/chunk-C33LTDZV.js.map +1 -0
- package/dist/{chunk-LYKCQTH5.js → chunk-ESOPMQAY.js} +5 -1
- package/dist/chunk-ESOPMQAY.js.map +1 -0
- package/dist/{chunk-6MJLVZXV.js → chunk-FKOARMAE.js} +58 -21
- package/dist/{chunk-6MJLVZXV.js.map → chunk-FKOARMAE.js.map} +1 -1
- package/dist/chunk-OORPX73T.js +30 -0
- package/dist/chunk-OORPX73T.js.map +1 -0
- package/dist/{chunk-V3BA2MJ6.js → chunk-RF3DUYFO.js} +2 -2
- package/dist/{chunk-UAUTLC4E.js → chunk-W7QQA6CW.js} +4 -4
- package/dist/{chunk-ZRFBLD3W.js → chunk-WYZFGHHI.js} +14 -4
- package/dist/chunk-WYZFGHHI.js.map +1 -0
- package/dist/{chunk-MRKYJ422.js → chunk-X6LLG7XN.js} +2 -2
- package/dist/{chunk-C6YIUTGR.js → chunk-YRJEZD7R.js} +2 -2
- package/dist/{chunk-HZD3CGPK.js → chunk-ZW444AQY.js} +3 -3
- package/dist/cli.js +141 -52
- package/dist/cli.js.map +1 -1
- package/dist/{config-H2DSEHNW.js → config-XURP6B3S.js} +3 -3
- package/dist/config-editor-AALY3URF.js +11 -0
- package/dist/config-registry-OGX4YM2U.js +17 -0
- package/dist/{daemon-VF6HJQXD.js → daemon-GWJM2S4A.js} +4 -4
- package/dist/doctor-X477CVZN.js +9 -0
- package/dist/doctor-X477CVZN.js.map +1 -0
- package/dist/index.d.ts +76 -27
- package/dist/index.js +33 -13
- package/dist/install-cloudflared-BTGUD7SW.js +8 -0
- package/dist/install-cloudflared-BTGUD7SW.js.map +1 -0
- package/dist/log-SPS2S6FO.js +19 -0
- package/dist/log-SPS2S6FO.js.map +1 -0
- package/dist/{main-G6XDM7EZ.js → main-2QKD2EI2.js} +17 -14
- package/dist/{main-G6XDM7EZ.js.map → main-2QKD2EI2.js.map} +1 -1
- package/dist/menu-CARRTW2F.js +17 -0
- package/dist/menu-CARRTW2F.js.map +1 -0
- package/dist/{setup-FCVL75K6.js → setup-TTOL7XAN.js} +4 -4
- package/dist/setup-TTOL7XAN.js.map +1 -0
- package/dist/{tunnel-service-DASSH7OA.js → tunnel-service-LEVPLXAZ.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-KPI4HGJC.js.map +0 -1
- package/dist/chunk-LYKCQTH5.js.map +0 -1
- package/dist/chunk-ZRFBLD3W.js.map +0 -1
- package/dist/config-editor-SKS4LJLT.js +0 -11
- package/dist/install-cloudflared-ILUXKLAC.js +0 -8
- /package/dist/{autostart-DZ3MHHMM.js.map → api-client-UN7BXQOQ.js.map} +0 -0
- /package/dist/{config-H2DSEHNW.js.map → autostart-K73RQZVV.js.map} +0 -0
- /package/dist/{chunk-V3BA2MJ6.js.map → chunk-RF3DUYFO.js.map} +0 -0
- /package/dist/{chunk-UAUTLC4E.js.map → chunk-W7QQA6CW.js.map} +0 -0
- /package/dist/{chunk-MRKYJ422.js.map → chunk-X6LLG7XN.js.map} +0 -0
- /package/dist/{chunk-C6YIUTGR.js.map → chunk-YRJEZD7R.js.map} +0 -0
- /package/dist/{chunk-HZD3CGPK.js.map → chunk-ZW444AQY.js.map} +0 -0
- /package/dist/{config-editor-SKS4LJLT.js.map → config-XURP6B3S.js.map} +0 -0
- /package/dist/{daemon-VF6HJQXD.js.map → config-editor-AALY3URF.js.map} +0 -0
- /package/dist/{install-cloudflared-ILUXKLAC.js.map → config-registry-OGX4YM2U.js.map} +0 -0
- /package/dist/{setup-FCVL75K6.js.map → daemon-GWJM2S4A.js.map} +0 -0
- /package/dist/{tunnel-service-DASSH7OA.js.map → tunnel-service-LEVPLXAZ.js.map} +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
20
|
+
} from "./chunk-66RVSUAR.js";
|
|
20
21
|
import {
|
|
21
22
|
runConfigEditor
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import
|
|
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-
|
|
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-
|
|
53
|
+
} from "./chunk-YRJEZD7R.js";
|
|
37
54
|
import {
|
|
38
55
|
ConfigManager,
|
|
39
56
|
PLUGINS_DIR,
|
|
40
57
|
expandHome
|
|
41
|
-
} from "./chunk-
|
|
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-
|
|
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 @@
|
|
|
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-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
14
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-ZW444AQY.js";
|
|
17
|
+
import "./chunk-C33LTDZV.js";
|
|
18
|
+
import "./chunk-YRJEZD7R.js";
|
|
15
19
|
import {
|
|
16
20
|
ConfigManager
|
|
17
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
3
|
+
} from "./chunk-RF3DUYFO.js";
|
|
4
4
|
import {
|
|
5
5
|
createChildLogger
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
939
|
+
//# sourceMappingURL=tunnel-service-LEVPLXAZ.js.map
|