@openacp/cli 2026.331.1 → 2026.331.2
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 +2 -1
- package/dist/cli.js +24932 -270
- package/dist/cli.js.map +1 -1
- package/dist/data/registry-snapshot.json +1 -1
- package/dist/index.js +17626 -409
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/adapter-ELG3VRZ3.js +0 -14
- package/dist/adapter-ELG3VRZ3.js.map +0 -1
- package/dist/agent-catalog-UYD26QDK.js +0 -10
- package/dist/agent-catalog-UYD26QDK.js.map +0 -1
- package/dist/agent-dependencies-ED2ZTUHG.js +0 -23
- package/dist/agent-dependencies-ED2ZTUHG.js.map +0 -1
- package/dist/agent-registry-YOGP656W.js +0 -8
- package/dist/agent-registry-YOGP656W.js.map +0 -1
- package/dist/agent-store-5UHZH2XI.js +0 -8
- package/dist/agent-store-5UHZH2XI.js.map +0 -1
- package/dist/api-client-PEMHYL5U.js +0 -13
- package/dist/api-client-PEMHYL5U.js.map +0 -1
- package/dist/api-server-DATG2KBR.js +0 -10
- package/dist/api-server-DATG2KBR.js.map +0 -1
- package/dist/api-server-L5Z7XACW.js +0 -7
- package/dist/api-server-L5Z7XACW.js.map +0 -1
- package/dist/autostart-CUPZMKKC.js +0 -22
- package/dist/autostart-CUPZMKKC.js.map +0 -1
- package/dist/chunk-23SRIVG4.js +0 -50
- package/dist/chunk-23SRIVG4.js.map +0 -1
- package/dist/chunk-2KT6TROD.js +0 -129
- package/dist/chunk-2KT6TROD.js.map +0 -1
- package/dist/chunk-2R5XM3ES.js +0 -154
- package/dist/chunk-2R5XM3ES.js.map +0 -1
- package/dist/chunk-3EWTPOF7.js +0 -51
- package/dist/chunk-3EWTPOF7.js.map +0 -1
- package/dist/chunk-566W6INH.js +0 -83
- package/dist/chunk-566W6INH.js.map +0 -1
- package/dist/chunk-5WGVYX3C.js +0 -55
- package/dist/chunk-5WGVYX3C.js.map +0 -1
- package/dist/chunk-7GXEMMEV.js +0 -44
- package/dist/chunk-7GXEMMEV.js.map +0 -1
- package/dist/chunk-7U6IZIJP.js +0 -186
- package/dist/chunk-7U6IZIJP.js.map +0 -1
- package/dist/chunk-7YIKTRSM.js +0 -105
- package/dist/chunk-7YIKTRSM.js.map +0 -1
- package/dist/chunk-7ZCQF6QM.js +0 -27
- package/dist/chunk-7ZCQF6QM.js.map +0 -1
- package/dist/chunk-AFKX424Q.js +0 -92
- package/dist/chunk-AFKX424Q.js.map +0 -1
- package/dist/chunk-BYCJQPMN.js +0 -543
- package/dist/chunk-BYCJQPMN.js.map +0 -1
- package/dist/chunk-CDAUYTVP.js +0 -41
- package/dist/chunk-CDAUYTVP.js.map +0 -1
- package/dist/chunk-EWVXSTQK.js +0 -6544
- package/dist/chunk-EWVXSTQK.js.map +0 -1
- package/dist/chunk-FNRSWA2K.js +0 -1
- package/dist/chunk-FNRSWA2K.js.map +0 -1
- package/dist/chunk-FPKQYCQS.js +0 -776
- package/dist/chunk-FPKQYCQS.js.map +0 -1
- package/dist/chunk-IZ5UEZF7.js +0 -138
- package/dist/chunk-IZ5UEZF7.js.map +0 -1
- package/dist/chunk-K6UY5M75.js +0 -653
- package/dist/chunk-K6UY5M75.js.map +0 -1
- package/dist/chunk-KGAQW6F4.js +0 -106
- package/dist/chunk-KGAQW6F4.js.map +0 -1
- package/dist/chunk-LGFWH3AE.js +0 -26
- package/dist/chunk-LGFWH3AE.js.map +0 -1
- package/dist/chunk-LRV56K2M.js +0 -4106
- package/dist/chunk-LRV56K2M.js.map +0 -1
- package/dist/chunk-MDJHCCFS.js +0 -485
- package/dist/chunk-MDJHCCFS.js.map +0 -1
- package/dist/chunk-MLF4W5R6.js +0 -101
- package/dist/chunk-MLF4W5R6.js.map +0 -1
- package/dist/chunk-NHD5XDD2.js +0 -686
- package/dist/chunk-NHD5XDD2.js.map +0 -1
- package/dist/chunk-NJX75BLK.js +0 -259
- package/dist/chunk-NJX75BLK.js.map +0 -1
- package/dist/chunk-NOEAJNTK.js +0 -156
- package/dist/chunk-NOEAJNTK.js.map +0 -1
- package/dist/chunk-ON7HB5O7.js +0 -58
- package/dist/chunk-ON7HB5O7.js.map +0 -1
- package/dist/chunk-OSBZXY2W.js +0 -126
- package/dist/chunk-OSBZXY2W.js.map +0 -1
- package/dist/chunk-OYSAN7UX.js +0 -15
- package/dist/chunk-OYSAN7UX.js.map +0 -1
- package/dist/chunk-P3HHJANC.js +0 -209
- package/dist/chunk-P3HHJANC.js.map +0 -1
- package/dist/chunk-R2YLDQLI.js +0 -1115
- package/dist/chunk-R2YLDQLI.js.map +0 -1
- package/dist/chunk-R6KZYF7D.js +0 -231
- package/dist/chunk-R6KZYF7D.js.map +0 -1
- package/dist/chunk-S64CB6J3.js +0 -98
- package/dist/chunk-S64CB6J3.js.map +0 -1
- package/dist/chunk-SSLVNCEA.js +0 -236
- package/dist/chunk-SSLVNCEA.js.map +0 -1
- package/dist/chunk-TGP34LQN.js +0 -681
- package/dist/chunk-TGP34LQN.js.map +0 -1
- package/dist/chunk-VUSCVRJL.js +0 -229
- package/dist/chunk-VUSCVRJL.js.map +0 -1
- package/dist/chunk-W26AUH5B.js +0 -61
- package/dist/chunk-W26AUH5B.js.map +0 -1
- package/dist/chunk-WQCJTU2C.js +0 -84
- package/dist/chunk-WQCJTU2C.js.map +0 -1
- package/dist/chunk-XRJUS6FE.js +0 -53
- package/dist/chunk-XRJUS6FE.js.map +0 -1
- package/dist/chunk-YZCKSNRN.js +0 -453
- package/dist/chunk-YZCKSNRN.js.map +0 -1
- package/dist/chunk-ZIRH6QWW.js +0 -69
- package/dist/chunk-ZIRH6QWW.js.map +0 -1
- package/dist/chunk-ZSLHHQPQ.js +0 -282
- package/dist/chunk-ZSLHHQPQ.js.map +0 -1
- package/dist/config-X4UP7H6R.js +0 -13
- package/dist/config-X4UP7H6R.js.map +0 -1
- package/dist/config-editor-7BENRVG5.js +0 -11
- package/dist/config-editor-7BENRVG5.js.map +0 -1
- package/dist/config-registry-M3FFWEVM.js +0 -18
- package/dist/config-registry-M3FFWEVM.js.map +0 -1
- package/dist/context-FVGCU5TI.js +0 -9
- package/dist/context-FVGCU5TI.js.map +0 -1
- package/dist/core-plugins-JSY2I44L.js +0 -25
- package/dist/core-plugins-JSY2I44L.js.map +0 -1
- package/dist/daemon-UOSRDEXW.js +0 -34
- package/dist/daemon-UOSRDEXW.js.map +0 -1
- package/dist/dev-loader-7P3HZCIA.js +0 -37
- package/dist/dev-loader-7P3HZCIA.js.map +0 -1
- package/dist/doctor-6DLACBR4.js +0 -10
- package/dist/doctor-6DLACBR4.js.map +0 -1
- package/dist/file-service-FQQYME7M.js +0 -8
- package/dist/file-service-FQQYME7M.js.map +0 -1
- package/dist/install-cloudflared-LNS5L5FR.js +0 -33
- package/dist/install-cloudflared-LNS5L5FR.js.map +0 -1
- package/dist/install-context-KZO5FR4D.js +0 -78
- package/dist/install-context-KZO5FR4D.js.map +0 -1
- package/dist/install-jq-SN4IA5K4.js +0 -31
- package/dist/install-jq-SN4IA5K4.js.map +0 -1
- package/dist/instance-context-FLCE7VZ4.js +0 -13
- package/dist/instance-context-FLCE7VZ4.js.map +0 -1
- package/dist/instance-registry-SW5FWKHO.js +0 -7
- package/dist/instance-registry-SW5FWKHO.js.map +0 -1
- package/dist/integrate-JIEZYDOR.js +0 -371
- package/dist/integrate-JIEZYDOR.js.map +0 -1
- package/dist/log-YZ243M5G.js +0 -25
- package/dist/log-YZ243M5G.js.map +0 -1
- package/dist/main-D7M2AKRM.js +0 -697
- package/dist/main-D7M2AKRM.js.map +0 -1
- package/dist/menu-ALFN37IR.js +0 -15
- package/dist/menu-ALFN37IR.js.map +0 -1
- package/dist/notifications-MO23S7S3.js +0 -8
- package/dist/notifications-MO23S7S3.js.map +0 -1
- package/dist/plugin-create-HFKS23JY.js +0 -968
- package/dist/plugin-create-HFKS23JY.js.map +0 -1
- package/dist/plugin-installer-VSTYZSXC.js +0 -9
- package/dist/plugin-installer-VSTYZSXC.js.map +0 -1
- package/dist/plugin-registry-6J3YSFHF.js +0 -7
- package/dist/plugin-registry-6J3YSFHF.js.map +0 -1
- package/dist/plugin-search-MGKAL5JM.js +0 -39
- package/dist/plugin-search-MGKAL5JM.js.map +0 -1
- package/dist/post-upgrade-F4YPMTUT.js +0 -79
- package/dist/post-upgrade-F4YPMTUT.js.map +0 -1
- package/dist/read-text-file-DJBTITIB.js +0 -7
- package/dist/read-text-file-DJBTITIB.js.map +0 -1
- package/dist/registry-client-GTBWLXYU.js +0 -7
- package/dist/registry-client-GTBWLXYU.js.map +0 -1
- package/dist/security-O4XGN2CM.js +0 -8
- package/dist/security-O4XGN2CM.js.map +0 -1
- package/dist/settings-manager-B4UN2LAC.js +0 -7
- package/dist/settings-manager-B4UN2LAC.js.map +0 -1
- package/dist/setup-44WLBIOT.js +0 -989
- package/dist/setup-44WLBIOT.js.map +0 -1
- package/dist/speech-GHTSWDAN.js +0 -9
- package/dist/speech-GHTSWDAN.js.map +0 -1
- package/dist/suggest-RST5VOHB.js +0 -36
- package/dist/suggest-RST5VOHB.js.map +0 -1
- package/dist/telegram-D7ASLVEB.js +0 -7
- package/dist/telegram-D7ASLVEB.js.map +0 -1
- package/dist/tunnel-ALJDPFDQ.js +0 -10
- package/dist/tunnel-ALJDPFDQ.js.map +0 -1
- package/dist/tunnel-service-TBAHDXMF.js +0 -755
- package/dist/tunnel-service-TBAHDXMF.js.map +0 -1
- package/dist/validators-GITLOFXC.js +0 -11
- package/dist/validators-GITLOFXC.js.map +0 -1
- package/dist/version-AXXV6IV2.js +0 -15
- package/dist/version-AXXV6IV2.js.map +0 -1
package/dist/chunk-YZCKSNRN.js
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createChildLogger
|
|
3
|
-
} from "./chunk-R6KZYF7D.js";
|
|
4
|
-
import {
|
|
5
|
-
getGlobalRoot
|
|
6
|
-
} from "./chunk-ON7HB5O7.js";
|
|
7
|
-
|
|
8
|
-
// src/core/config/config.ts
|
|
9
|
-
import { z } from "zod";
|
|
10
|
-
import * as fs2 from "fs";
|
|
11
|
-
import * as path2 from "path";
|
|
12
|
-
import * as os from "os";
|
|
13
|
-
import { EventEmitter } from "events";
|
|
14
|
-
|
|
15
|
-
// src/core/config/config-migrations.ts
|
|
16
|
-
import * as fs from "fs";
|
|
17
|
-
import * as path from "path";
|
|
18
|
-
var log = createChildLogger({ module: "config-migrations" });
|
|
19
|
-
var migrations = [
|
|
20
|
-
{
|
|
21
|
-
name: "add-tunnel-section",
|
|
22
|
-
apply(raw) {
|
|
23
|
-
if (raw.tunnel) return false;
|
|
24
|
-
raw.tunnel = {
|
|
25
|
-
enabled: true,
|
|
26
|
-
port: 3100,
|
|
27
|
-
provider: "cloudflare",
|
|
28
|
-
options: {},
|
|
29
|
-
storeTtlMinutes: 60,
|
|
30
|
-
auth: { enabled: false }
|
|
31
|
-
};
|
|
32
|
-
log.info("Added tunnel section to config (enabled by default with cloudflare)");
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: "fix-agent-commands",
|
|
38
|
-
apply(raw) {
|
|
39
|
-
const COMMAND_MIGRATIONS = {
|
|
40
|
-
"claude-agent-acp": ["claude", "claude-code"]
|
|
41
|
-
};
|
|
42
|
-
const agents = raw.agents;
|
|
43
|
-
if (!agents || typeof agents !== "object") return false;
|
|
44
|
-
let changed = false;
|
|
45
|
-
for (const [agentName, agentDef] of Object.entries(agents)) {
|
|
46
|
-
if (!agentDef || typeof agentDef !== "object" || !("command" in agentDef)) continue;
|
|
47
|
-
const def = agentDef;
|
|
48
|
-
if (typeof def.command !== "string") continue;
|
|
49
|
-
for (const [correctCmd, legacyCmds] of Object.entries(COMMAND_MIGRATIONS)) {
|
|
50
|
-
if (legacyCmds.includes(def.command)) {
|
|
51
|
-
log.warn(
|
|
52
|
-
{ agent: agentName, oldCommand: def.command, newCommand: correctCmd },
|
|
53
|
-
`Auto-migrating agent command: "${def.command}" \u2192 "${correctCmd}"`
|
|
54
|
-
);
|
|
55
|
-
def.command = correctCmd;
|
|
56
|
-
changed = true;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return changed;
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
name: "migrate-agents-to-store",
|
|
65
|
-
apply(raw) {
|
|
66
|
-
const agentsJsonPath = path.join(getGlobalRoot(), "agents.json");
|
|
67
|
-
if (fs.existsSync(agentsJsonPath)) return false;
|
|
68
|
-
const agents = raw.agents;
|
|
69
|
-
if (!agents || Object.keys(agents).length === 0) return false;
|
|
70
|
-
const COMMAND_TO_REGISTRY = {
|
|
71
|
-
"claude-agent-acp": "claude-acp",
|
|
72
|
-
"codex": "codex-acp"
|
|
73
|
-
};
|
|
74
|
-
const installed = {};
|
|
75
|
-
for (const [key, val] of Object.entries(agents)) {
|
|
76
|
-
const cfg = val;
|
|
77
|
-
const command = typeof cfg.command === "string" ? cfg.command : "";
|
|
78
|
-
const registryId = COMMAND_TO_REGISTRY[command] ?? null;
|
|
79
|
-
installed[key] = {
|
|
80
|
-
registryId,
|
|
81
|
-
name: key.charAt(0).toUpperCase() + key.slice(1),
|
|
82
|
-
version: "unknown",
|
|
83
|
-
distribution: "custom",
|
|
84
|
-
command: cfg.command,
|
|
85
|
-
args: cfg.args ?? [],
|
|
86
|
-
env: cfg.env ?? {},
|
|
87
|
-
workingDirectory: cfg.workingDirectory ?? void 0,
|
|
88
|
-
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
89
|
-
binaryPath: null
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
fs.mkdirSync(path.dirname(agentsJsonPath), { recursive: true });
|
|
93
|
-
fs.writeFileSync(agentsJsonPath, JSON.stringify({ version: 1, installed }, null, 2));
|
|
94
|
-
raw.agents = {};
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: "add-instance-name",
|
|
100
|
-
apply(raw) {
|
|
101
|
-
if (raw.instanceName) return false;
|
|
102
|
-
raw.instanceName = "Main";
|
|
103
|
-
log.info("Added instanceName to config");
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: "migrate-display-verbosity-to-output-mode",
|
|
109
|
-
apply(raw) {
|
|
110
|
-
const channels = raw.channels;
|
|
111
|
-
if (!channels) return false;
|
|
112
|
-
let changed = false;
|
|
113
|
-
for (const [, channelCfg] of Object.entries(channels)) {
|
|
114
|
-
if (!channelCfg || typeof channelCfg !== "object") continue;
|
|
115
|
-
const cfg = channelCfg;
|
|
116
|
-
if (cfg.displayVerbosity && !cfg.outputMode) {
|
|
117
|
-
cfg.outputMode = cfg.displayVerbosity;
|
|
118
|
-
changed = true;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return changed;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
];
|
|
125
|
-
function applyMigrations(raw, migrationList = migrations) {
|
|
126
|
-
let changed = false;
|
|
127
|
-
for (const migration of migrationList) {
|
|
128
|
-
if (migration.apply(raw)) {
|
|
129
|
-
changed = true;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return { changed };
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// src/core/config/config.ts
|
|
136
|
-
var log2 = createChildLogger({ module: "config" });
|
|
137
|
-
var BaseChannelSchema = z.object({
|
|
138
|
-
enabled: z.boolean().default(false),
|
|
139
|
-
adapter: z.string().optional(),
|
|
140
|
-
// package name for plugin adapters
|
|
141
|
-
displayVerbosity: z.enum(["low", "medium", "high"]).optional(),
|
|
142
|
-
outputMode: z.enum(["low", "medium", "high"]).optional()
|
|
143
|
-
}).passthrough();
|
|
144
|
-
var AgentSchema = z.object({
|
|
145
|
-
command: z.string(),
|
|
146
|
-
args: z.array(z.string()).default([]),
|
|
147
|
-
workingDirectory: z.string().optional(),
|
|
148
|
-
env: z.record(z.string(), z.string()).default({})
|
|
149
|
-
});
|
|
150
|
-
var LoggingSchema = z.object({
|
|
151
|
-
level: z.enum(["silent", "debug", "info", "warn", "error", "fatal"]).default("info"),
|
|
152
|
-
logDir: z.string().default("~/.openacp/logs"),
|
|
153
|
-
maxFileSize: z.union([z.string(), z.number()]).default("10m"),
|
|
154
|
-
maxFiles: z.number().default(7),
|
|
155
|
-
sessionLogRetentionDays: z.number().default(30)
|
|
156
|
-
}).default({});
|
|
157
|
-
var TunnelAuthSchema = z.object({
|
|
158
|
-
enabled: z.boolean().default(false),
|
|
159
|
-
token: z.string().optional()
|
|
160
|
-
}).default({});
|
|
161
|
-
var TunnelSchema = z.object({
|
|
162
|
-
enabled: z.boolean().default(false),
|
|
163
|
-
port: z.number().default(3100),
|
|
164
|
-
provider: z.enum(["cloudflare", "ngrok", "bore", "tailscale"]).default("cloudflare"),
|
|
165
|
-
options: z.record(z.string(), z.unknown()).default({}),
|
|
166
|
-
maxUserTunnels: z.number().default(5),
|
|
167
|
-
storeTtlMinutes: z.number().default(60),
|
|
168
|
-
auth: TunnelAuthSchema
|
|
169
|
-
}).default({});
|
|
170
|
-
var UsageSchema = z.object({
|
|
171
|
-
enabled: z.boolean().default(true),
|
|
172
|
-
monthlyBudget: z.number().optional(),
|
|
173
|
-
warningThreshold: z.number().default(0.8),
|
|
174
|
-
currency: z.string().default("USD"),
|
|
175
|
-
retentionDays: z.number().default(90)
|
|
176
|
-
}).default({});
|
|
177
|
-
var SpeechProviderSchema = z.object({
|
|
178
|
-
apiKey: z.string().min(1).optional(),
|
|
179
|
-
model: z.string().optional()
|
|
180
|
-
}).passthrough();
|
|
181
|
-
var SpeechSchema = z.object({
|
|
182
|
-
stt: z.object({
|
|
183
|
-
provider: z.string().nullable().default(null),
|
|
184
|
-
providers: z.record(SpeechProviderSchema).default({})
|
|
185
|
-
}).default({}),
|
|
186
|
-
tts: z.object({
|
|
187
|
-
provider: z.string().nullable().default(null),
|
|
188
|
-
providers: z.record(SpeechProviderSchema).default({})
|
|
189
|
-
}).default({})
|
|
190
|
-
}).optional().default({});
|
|
191
|
-
var ConfigSchema = z.object({
|
|
192
|
-
instanceName: z.string().optional(),
|
|
193
|
-
channels: z.object({}).catchall(BaseChannelSchema),
|
|
194
|
-
agents: z.record(z.string(), AgentSchema).optional().default({}),
|
|
195
|
-
defaultAgent: z.string(),
|
|
196
|
-
workspace: z.object({
|
|
197
|
-
baseDir: z.string().default("~/openacp-workspace")
|
|
198
|
-
}).default({}),
|
|
199
|
-
security: z.object({
|
|
200
|
-
allowedUserIds: z.array(z.string()).default([]),
|
|
201
|
-
maxConcurrentSessions: z.number().default(20),
|
|
202
|
-
sessionTimeoutMinutes: z.number().default(60)
|
|
203
|
-
}).default({}),
|
|
204
|
-
logging: LoggingSchema,
|
|
205
|
-
runMode: z.enum(["foreground", "daemon"]).default("foreground"),
|
|
206
|
-
autoStart: z.boolean().default(false),
|
|
207
|
-
api: z.object({
|
|
208
|
-
port: z.number().default(21420),
|
|
209
|
-
host: z.string().default("127.0.0.1")
|
|
210
|
-
}).default({}),
|
|
211
|
-
sessionStore: z.object({
|
|
212
|
-
ttlDays: z.number().default(30)
|
|
213
|
-
}).default({}),
|
|
214
|
-
tunnel: TunnelSchema,
|
|
215
|
-
usage: UsageSchema,
|
|
216
|
-
integrations: z.record(
|
|
217
|
-
z.string(),
|
|
218
|
-
z.object({
|
|
219
|
-
installed: z.boolean(),
|
|
220
|
-
installedAt: z.string().optional()
|
|
221
|
-
})
|
|
222
|
-
).default({}),
|
|
223
|
-
speech: SpeechSchema,
|
|
224
|
-
outputMode: z.enum(["low", "medium", "high"]).default("medium").optional(),
|
|
225
|
-
agentSwitch: z.object({
|
|
226
|
-
labelHistory: z.boolean().default(true)
|
|
227
|
-
}).default({})
|
|
228
|
-
});
|
|
229
|
-
function expandHome(p) {
|
|
230
|
-
if (p.startsWith("~")) {
|
|
231
|
-
return path2.join(os.homedir(), p.slice(1));
|
|
232
|
-
}
|
|
233
|
-
return p;
|
|
234
|
-
}
|
|
235
|
-
var DEFAULT_CONFIG = {
|
|
236
|
-
channels: {
|
|
237
|
-
telegram: {
|
|
238
|
-
enabled: false,
|
|
239
|
-
botToken: "YOUR_BOT_TOKEN_HERE",
|
|
240
|
-
chatId: 0,
|
|
241
|
-
notificationTopicId: null,
|
|
242
|
-
assistantTopicId: null
|
|
243
|
-
},
|
|
244
|
-
discord: {
|
|
245
|
-
enabled: false,
|
|
246
|
-
botToken: "YOUR_DISCORD_BOT_TOKEN_HERE",
|
|
247
|
-
guildId: "",
|
|
248
|
-
forumChannelId: null,
|
|
249
|
-
notificationChannelId: null,
|
|
250
|
-
assistantThreadId: null
|
|
251
|
-
}
|
|
252
|
-
},
|
|
253
|
-
agents: {
|
|
254
|
-
claude: { command: "claude-agent-acp", args: [], env: {} },
|
|
255
|
-
codex: { command: "codex", args: ["--acp"], env: {} }
|
|
256
|
-
},
|
|
257
|
-
defaultAgent: "claude",
|
|
258
|
-
workspace: { baseDir: "~/openacp-workspace" },
|
|
259
|
-
security: {
|
|
260
|
-
allowedUserIds: [],
|
|
261
|
-
maxConcurrentSessions: 20,
|
|
262
|
-
sessionTimeoutMinutes: 60
|
|
263
|
-
},
|
|
264
|
-
sessionStore: { ttlDays: 30 },
|
|
265
|
-
tunnel: {
|
|
266
|
-
enabled: true,
|
|
267
|
-
port: 3100,
|
|
268
|
-
provider: "cloudflare",
|
|
269
|
-
options: {},
|
|
270
|
-
storeTtlMinutes: 60,
|
|
271
|
-
auth: { enabled: false }
|
|
272
|
-
},
|
|
273
|
-
usage: {}
|
|
274
|
-
};
|
|
275
|
-
var ConfigManager = class extends EventEmitter {
|
|
276
|
-
config;
|
|
277
|
-
configPath;
|
|
278
|
-
constructor(configPath) {
|
|
279
|
-
super();
|
|
280
|
-
this.configPath = process.env.OPENACP_CONFIG_PATH || configPath || expandHome("~/.openacp/config.json");
|
|
281
|
-
}
|
|
282
|
-
async load() {
|
|
283
|
-
const dir = path2.dirname(this.configPath);
|
|
284
|
-
fs2.mkdirSync(dir, { recursive: true });
|
|
285
|
-
if (!fs2.existsSync(this.configPath)) {
|
|
286
|
-
fs2.writeFileSync(
|
|
287
|
-
this.configPath,
|
|
288
|
-
JSON.stringify(DEFAULT_CONFIG, null, 2)
|
|
289
|
-
);
|
|
290
|
-
log2.info({ configPath: this.configPath }, "Config created");
|
|
291
|
-
log2.info(
|
|
292
|
-
"Please edit it with your channel credentials (Telegram bot token, Discord bot token, etc.), then restart."
|
|
293
|
-
);
|
|
294
|
-
process.exit(1);
|
|
295
|
-
}
|
|
296
|
-
const raw = JSON.parse(fs2.readFileSync(this.configPath, "utf-8"));
|
|
297
|
-
const { changed: configUpdated } = applyMigrations(raw);
|
|
298
|
-
if (configUpdated) {
|
|
299
|
-
fs2.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));
|
|
300
|
-
}
|
|
301
|
-
this.applyEnvOverrides(raw);
|
|
302
|
-
const result = ConfigSchema.safeParse(raw);
|
|
303
|
-
if (!result.success) {
|
|
304
|
-
log2.error("Config validation failed");
|
|
305
|
-
for (const issue of result.error.issues) {
|
|
306
|
-
log2.error(
|
|
307
|
-
{ path: issue.path.join("."), message: issue.message },
|
|
308
|
-
"Validation error"
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
process.exit(1);
|
|
312
|
-
}
|
|
313
|
-
this.config = result.data;
|
|
314
|
-
}
|
|
315
|
-
get() {
|
|
316
|
-
return structuredClone(this.config);
|
|
317
|
-
}
|
|
318
|
-
async save(updates, changePath) {
|
|
319
|
-
const oldConfig = this.config ? structuredClone(this.config) : void 0;
|
|
320
|
-
const raw = JSON.parse(fs2.readFileSync(this.configPath, "utf-8"));
|
|
321
|
-
this.deepMerge(raw, updates);
|
|
322
|
-
const result = ConfigSchema.safeParse(raw);
|
|
323
|
-
if (!result.success) {
|
|
324
|
-
log2.error({ errors: result.error.issues }, "Config validation failed, not saving");
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
fs2.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));
|
|
328
|
-
this.config = result.data;
|
|
329
|
-
if (changePath) {
|
|
330
|
-
const { getConfigValue } = await import("./config-registry-M3FFWEVM.js");
|
|
331
|
-
const value = getConfigValue(this.config, changePath);
|
|
332
|
-
const oldValue = oldConfig ? getConfigValue(oldConfig, changePath) : void 0;
|
|
333
|
-
this.emit("config:changed", { path: changePath, value, oldValue });
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
resolveWorkspace(input) {
|
|
337
|
-
if (!input) {
|
|
338
|
-
const resolved2 = expandHome(this.config.workspace.baseDir);
|
|
339
|
-
fs2.mkdirSync(resolved2, { recursive: true });
|
|
340
|
-
return resolved2;
|
|
341
|
-
}
|
|
342
|
-
if (input.startsWith("/") || input.startsWith("~")) {
|
|
343
|
-
const resolved2 = expandHome(input);
|
|
344
|
-
fs2.mkdirSync(resolved2, { recursive: true });
|
|
345
|
-
return resolved2;
|
|
346
|
-
}
|
|
347
|
-
const name = input.toLowerCase();
|
|
348
|
-
const resolved = path2.join(expandHome(this.config.workspace.baseDir), name);
|
|
349
|
-
fs2.mkdirSync(resolved, { recursive: true });
|
|
350
|
-
return resolved;
|
|
351
|
-
}
|
|
352
|
-
async exists() {
|
|
353
|
-
return fs2.existsSync(this.configPath);
|
|
354
|
-
}
|
|
355
|
-
getConfigPath() {
|
|
356
|
-
return this.configPath;
|
|
357
|
-
}
|
|
358
|
-
async writeNew(config) {
|
|
359
|
-
const dir = path2.dirname(this.configPath);
|
|
360
|
-
fs2.mkdirSync(dir, { recursive: true });
|
|
361
|
-
fs2.writeFileSync(this.configPath, JSON.stringify(config, null, 2));
|
|
362
|
-
}
|
|
363
|
-
applyEnvOverrides(raw) {
|
|
364
|
-
const overrides = [
|
|
365
|
-
["OPENACP_TELEGRAM_BOT_TOKEN", ["channels", "telegram", "botToken"]],
|
|
366
|
-
["OPENACP_TELEGRAM_CHAT_ID", ["channels", "telegram", "chatId"]],
|
|
367
|
-
["OPENACP_DISCORD_BOT_TOKEN", ["channels", "discord", "botToken"]],
|
|
368
|
-
["OPENACP_DISCORD_GUILD_ID", ["channels", "discord", "guildId"]],
|
|
369
|
-
["OPENACP_SLACK_BOT_TOKEN", ["channels", "slack", "botToken"]],
|
|
370
|
-
["OPENACP_SLACK_APP_TOKEN", ["channels", "slack", "appToken"]],
|
|
371
|
-
["OPENACP_SLACK_SIGNING_SECRET", ["channels", "slack", "signingSecret"]],
|
|
372
|
-
["OPENACP_DEFAULT_AGENT", ["defaultAgent"]],
|
|
373
|
-
["OPENACP_RUN_MODE", ["runMode"]],
|
|
374
|
-
["OPENACP_API_PORT", ["api", "port"]]
|
|
375
|
-
];
|
|
376
|
-
for (const [envVar, configPath] of overrides) {
|
|
377
|
-
const value = process.env[envVar];
|
|
378
|
-
if (value !== void 0) {
|
|
379
|
-
let target = raw;
|
|
380
|
-
for (let i = 0; i < configPath.length - 1; i++) {
|
|
381
|
-
if (!target[configPath[i]]) target[configPath[i]] = {};
|
|
382
|
-
target = target[configPath[i]];
|
|
383
|
-
}
|
|
384
|
-
const key = configPath[configPath.length - 1];
|
|
385
|
-
target[key] = key === "chatId" || key === "port" ? Number(value) : value;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
if (process.env.OPENACP_LOG_LEVEL) {
|
|
389
|
-
raw.logging = raw.logging || {};
|
|
390
|
-
raw.logging.level = process.env.OPENACP_LOG_LEVEL;
|
|
391
|
-
}
|
|
392
|
-
if (process.env.OPENACP_LOG_DIR) {
|
|
393
|
-
raw.logging = raw.logging || {};
|
|
394
|
-
raw.logging.logDir = process.env.OPENACP_LOG_DIR;
|
|
395
|
-
}
|
|
396
|
-
if (process.env.OPENACP_DEBUG && !process.env.OPENACP_LOG_LEVEL) {
|
|
397
|
-
raw.logging = raw.logging || {};
|
|
398
|
-
raw.logging.level = "debug";
|
|
399
|
-
}
|
|
400
|
-
if (process.env.OPENACP_TUNNEL_ENABLED) {
|
|
401
|
-
raw.tunnel = raw.tunnel || {};
|
|
402
|
-
raw.tunnel.enabled = process.env.OPENACP_TUNNEL_ENABLED === "true";
|
|
403
|
-
}
|
|
404
|
-
if (process.env.OPENACP_TUNNEL_PORT) {
|
|
405
|
-
raw.tunnel = raw.tunnel || {};
|
|
406
|
-
raw.tunnel.port = Number(
|
|
407
|
-
process.env.OPENACP_TUNNEL_PORT
|
|
408
|
-
);
|
|
409
|
-
}
|
|
410
|
-
if (process.env.OPENACP_TUNNEL_PROVIDER) {
|
|
411
|
-
raw.tunnel = raw.tunnel || {};
|
|
412
|
-
raw.tunnel.provider = process.env.OPENACP_TUNNEL_PROVIDER;
|
|
413
|
-
}
|
|
414
|
-
if (process.env.OPENACP_SPEECH_STT_PROVIDER) {
|
|
415
|
-
raw.speech = raw.speech || {};
|
|
416
|
-
const speech = raw.speech;
|
|
417
|
-
speech.stt = speech.stt || {};
|
|
418
|
-
speech.stt.provider = process.env.OPENACP_SPEECH_STT_PROVIDER;
|
|
419
|
-
}
|
|
420
|
-
if (process.env.OPENACP_SPEECH_GROQ_API_KEY) {
|
|
421
|
-
raw.speech = raw.speech || {};
|
|
422
|
-
const speech = raw.speech;
|
|
423
|
-
speech.stt = speech.stt || {};
|
|
424
|
-
const stt = speech.stt;
|
|
425
|
-
stt.providers = stt.providers || {};
|
|
426
|
-
const providers = stt.providers;
|
|
427
|
-
providers.groq = providers.groq || {};
|
|
428
|
-
providers.groq.apiKey = process.env.OPENACP_SPEECH_GROQ_API_KEY;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
deepMerge(target, source) {
|
|
432
|
-
for (const key of Object.keys(source)) {
|
|
433
|
-
const val = source[key];
|
|
434
|
-
if (val && typeof val === "object" && !Array.isArray(val)) {
|
|
435
|
-
if (!target[key]) target[key] = {};
|
|
436
|
-
this.deepMerge(
|
|
437
|
-
target[key],
|
|
438
|
-
val
|
|
439
|
-
);
|
|
440
|
-
} else {
|
|
441
|
-
target[key] = val;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
export {
|
|
448
|
-
applyMigrations,
|
|
449
|
-
ConfigSchema,
|
|
450
|
-
expandHome,
|
|
451
|
-
ConfigManager
|
|
452
|
-
};
|
|
453
|
-
//# sourceMappingURL=chunk-YZCKSNRN.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/config/config.ts","../../src/core/config/config-migrations.ts"],"sourcesContent":["import { z } from \"zod\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { EventEmitter } from \"node:events\";\nimport { applyMigrations } from \"./config-migrations.js\";\nimport { createChildLogger } from \"../utils/log.js\";\nconst log = createChildLogger({ module: \"config\" });\n\nconst BaseChannelSchema = z\n .object({\n enabled: z.boolean().default(false),\n adapter: z.string().optional(), // package name for plugin adapters\n displayVerbosity: z\n .enum([\"low\", \"medium\", \"high\"])\n .optional(),\n outputMode: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n })\n .passthrough();\n\nconst AgentSchema = z.object({\n command: z.string(),\n args: z.array(z.string()).default([]),\n workingDirectory: z.string().optional(),\n env: z.record(z.string(), z.string()).default({}),\n});\n\nconst LoggingSchema = z\n .object({\n level: z\n .enum([\"silent\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"])\n .default(\"info\"),\n logDir: z.string().default(\"~/.openacp/logs\"),\n maxFileSize: z.union([z.string(), z.number()]).default(\"10m\"),\n maxFiles: z.number().default(7),\n sessionLogRetentionDays: z.number().default(30),\n })\n .default({});\n\nexport type LoggingConfig = z.infer<typeof LoggingSchema>;\n\nconst TunnelAuthSchema = z\n .object({\n enabled: z.boolean().default(false),\n token: z.string().optional(),\n })\n .default({});\n\nconst TunnelSchema = z\n .object({\n enabled: z.boolean().default(false),\n port: z.number().default(3100),\n provider: z\n .enum([\"cloudflare\", \"ngrok\", \"bore\", \"tailscale\"])\n .default(\"cloudflare\"),\n options: z.record(z.string(), z.unknown()).default({}),\n maxUserTunnels: z.number().default(5),\n storeTtlMinutes: z.number().default(60),\n auth: TunnelAuthSchema,\n })\n .default({});\n\nexport type TunnelConfig = z.infer<typeof TunnelSchema>;\n\n\nconst UsageSchema = z\n .object({\n enabled: z.boolean().default(true),\n monthlyBudget: z.number().optional(),\n warningThreshold: z.number().default(0.8),\n currency: z.string().default(\"USD\"),\n retentionDays: z.number().default(90),\n })\n .default({});\n\nexport type UsageConfig = z.infer<typeof UsageSchema>;\n\nconst SpeechProviderSchema = z\n .object({\n apiKey: z.string().min(1).optional(),\n model: z.string().optional(),\n })\n .passthrough();\n\nconst SpeechSchema = z\n .object({\n stt: z\n .object({\n provider: z.string().nullable().default(null),\n providers: z.record(SpeechProviderSchema).default({}),\n })\n .default({}),\n tts: z\n .object({\n provider: z.string().nullable().default(null),\n providers: z.record(SpeechProviderSchema).default({}),\n })\n .default({}),\n })\n .optional()\n .default({});\n\nexport const ConfigSchema = z.object({\n instanceName: z.string().optional(),\n channels: z\n .object({})\n .catchall(BaseChannelSchema),\n agents: z.record(z.string(), AgentSchema).optional().default({}),\n defaultAgent: z.string(),\n workspace: z\n .object({\n baseDir: z.string().default(\"~/openacp-workspace\"),\n })\n .default({}),\n security: z\n .object({\n allowedUserIds: z.array(z.string()).default([]),\n maxConcurrentSessions: z.number().default(20),\n sessionTimeoutMinutes: z.number().default(60),\n })\n .default({}),\n logging: LoggingSchema,\n runMode: z.enum([\"foreground\", \"daemon\"]).default(\"foreground\"),\n autoStart: z.boolean().default(false),\n api: z\n .object({\n port: z.number().default(21420),\n host: z.string().default(\"127.0.0.1\"),\n })\n .default({}),\n sessionStore: z\n .object({\n ttlDays: z.number().default(30),\n })\n .default({}),\n tunnel: TunnelSchema,\n usage: UsageSchema,\n integrations: z\n .record(\n z.string(),\n z.object({\n installed: z.boolean(),\n installedAt: z.string().optional(),\n }),\n )\n .default({}),\n speech: SpeechSchema,\n outputMode: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\").optional(),\n agentSwitch: z.object({\n labelHistory: z.boolean().default(true),\n }).default({}),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport function expandHome(p: string): string {\n if (p.startsWith(\"~\")) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nconst DEFAULT_CONFIG = {\n channels: {\n telegram: {\n enabled: false,\n botToken: \"YOUR_BOT_TOKEN_HERE\",\n chatId: 0,\n notificationTopicId: null,\n assistantTopicId: null,\n },\n discord: {\n enabled: false,\n botToken: \"YOUR_DISCORD_BOT_TOKEN_HERE\",\n guildId: \"\",\n forumChannelId: null,\n notificationChannelId: null,\n assistantThreadId: null,\n },\n },\n agents: {\n claude: { command: \"claude-agent-acp\", args: [], env: {} },\n codex: { command: \"codex\", args: [\"--acp\"], env: {} },\n },\n defaultAgent: \"claude\",\n workspace: { baseDir: \"~/openacp-workspace\" },\n security: {\n allowedUserIds: [],\n maxConcurrentSessions: 20,\n sessionTimeoutMinutes: 60,\n },\n sessionStore: { ttlDays: 30 },\n tunnel: {\n enabled: true,\n port: 3100,\n provider: \"cloudflare\",\n options: {},\n storeTtlMinutes: 60,\n auth: { enabled: false },\n },\n usage: {},\n};\n\nexport class ConfigManager extends EventEmitter {\n private config!: Config;\n private configPath: string;\n\n constructor(configPath?: string) {\n super();\n this.configPath =\n process.env.OPENACP_CONFIG_PATH || configPath || expandHome(\"~/.openacp/config.json\");\n }\n\n async load(): Promise<void> {\n // 1. Ensure directory exists\n const dir = path.dirname(this.configPath);\n fs.mkdirSync(dir, { recursive: true });\n\n // 2. If config file doesn't exist, create default\n if (!fs.existsSync(this.configPath)) {\n fs.writeFileSync(\n this.configPath,\n JSON.stringify(DEFAULT_CONFIG, null, 2),\n );\n log.info({ configPath: this.configPath }, \"Config created\");\n log.info(\n \"Please edit it with your channel credentials (Telegram bot token, Discord bot token, etc.), then restart.\",\n );\n process.exit(1);\n }\n\n // 3. Read and parse\n const raw = JSON.parse(fs.readFileSync(this.configPath, \"utf-8\"));\n\n // 3.5. Auto-migrate config\n const { changed: configUpdated } = applyMigrations(raw);\n if (configUpdated) {\n fs.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));\n }\n\n // 4. Apply env var overrides\n this.applyEnvOverrides(raw);\n\n // 5. Validate with Zod\n const result = ConfigSchema.safeParse(raw);\n if (!result.success) {\n log.error(\"Config validation failed\");\n for (const issue of result.error.issues) {\n log.error(\n { path: issue.path.join(\".\"), message: issue.message },\n \"Validation error\",\n );\n }\n process.exit(1);\n }\n this.config = result.data;\n }\n\n get(): Config {\n return structuredClone(this.config);\n }\n\n async save(\n updates: Record<string, unknown>,\n changePath?: string,\n ): Promise<void> {\n const oldConfig = this.config ? structuredClone(this.config) : undefined;\n // Read current file, merge updates\n const raw = JSON.parse(fs.readFileSync(this.configPath, \"utf-8\"));\n this.deepMerge(raw, updates);\n // Validate BEFORE writing to disk\n const result = ConfigSchema.safeParse(raw);\n if (!result.success) {\n log.error({ errors: result.error.issues }, \"Config validation failed, not saving\");\n return;\n }\n fs.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));\n this.config = result.data;\n // Emit change event if path provided\n if (changePath) {\n const { getConfigValue } = await import(\"./config-registry.js\");\n const value = getConfigValue(this.config, changePath);\n const oldValue = oldConfig\n ? getConfigValue(oldConfig, changePath)\n : undefined;\n this.emit(\"config:changed\", { path: changePath, value, oldValue });\n }\n }\n\n resolveWorkspace(input?: string): string {\n if (!input) {\n const resolved = expandHome(this.config.workspace.baseDir);\n fs.mkdirSync(resolved, { recursive: true });\n return resolved;\n }\n if (input.startsWith(\"/\") || input.startsWith(\"~\")) {\n const resolved = expandHome(input);\n fs.mkdirSync(resolved, { recursive: true });\n return resolved;\n }\n // Named workspace → lowercase, under baseDir\n const name = input.toLowerCase();\n const resolved = path.join(expandHome(this.config.workspace.baseDir), name);\n fs.mkdirSync(resolved, { recursive: true });\n return resolved;\n }\n\n async exists(): Promise<boolean> {\n return fs.existsSync(this.configPath);\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n async writeNew(config: Config): Promise<void> {\n const dir = path.dirname(this.configPath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2));\n }\n\n private applyEnvOverrides(raw: Record<string, unknown>): void {\n const overrides: [string, string[]][] = [\n [\"OPENACP_TELEGRAM_BOT_TOKEN\", [\"channels\", \"telegram\", \"botToken\"]],\n [\"OPENACP_TELEGRAM_CHAT_ID\", [\"channels\", \"telegram\", \"chatId\"]],\n [\"OPENACP_DISCORD_BOT_TOKEN\", [\"channels\", \"discord\", \"botToken\"]],\n [\"OPENACP_DISCORD_GUILD_ID\", [\"channels\", \"discord\", \"guildId\"]],\n [\"OPENACP_SLACK_BOT_TOKEN\", [\"channels\", \"slack\", \"botToken\"]],\n [\"OPENACP_SLACK_APP_TOKEN\", [\"channels\", \"slack\", \"appToken\"]],\n [\"OPENACP_SLACK_SIGNING_SECRET\", [\"channels\", \"slack\", \"signingSecret\"]],\n [\"OPENACP_DEFAULT_AGENT\", [\"defaultAgent\"]],\n [\"OPENACP_RUN_MODE\", [\"runMode\"]],\n [\"OPENACP_API_PORT\", [\"api\", \"port\"]],\n ];\n for (const [envVar, configPath] of overrides) {\n const value = process.env[envVar];\n if (value !== undefined) {\n let target: Record<string, unknown> = raw;\n for (let i = 0; i < configPath.length - 1; i++) {\n if (!target[configPath[i]]) target[configPath[i]] = {};\n target = target[configPath[i]] as Record<string, unknown>;\n }\n const key = configPath[configPath.length - 1];\n // Convert numeric fields to number\n target[key] =\n key === \"chatId\" || key === \"port\" ? Number(value) : value;\n }\n }\n\n // Logging env var overrides\n if (process.env.OPENACP_LOG_LEVEL) {\n raw.logging = raw.logging || {};\n (raw.logging as Record<string, unknown>).level =\n process.env.OPENACP_LOG_LEVEL;\n }\n if (process.env.OPENACP_LOG_DIR) {\n raw.logging = raw.logging || {};\n (raw.logging as Record<string, unknown>).logDir =\n process.env.OPENACP_LOG_DIR;\n }\n if (process.env.OPENACP_DEBUG && !process.env.OPENACP_LOG_LEVEL) {\n raw.logging = raw.logging || {};\n (raw.logging as Record<string, unknown>).level = \"debug\";\n }\n\n // Tunnel env var overrides\n if (process.env.OPENACP_TUNNEL_ENABLED) {\n raw.tunnel = raw.tunnel || {};\n (raw.tunnel as Record<string, unknown>).enabled =\n process.env.OPENACP_TUNNEL_ENABLED === \"true\";\n }\n if (process.env.OPENACP_TUNNEL_PORT) {\n raw.tunnel = raw.tunnel || {};\n (raw.tunnel as Record<string, unknown>).port = Number(\n process.env.OPENACP_TUNNEL_PORT,\n );\n }\n if (process.env.OPENACP_TUNNEL_PROVIDER) {\n raw.tunnel = raw.tunnel || {};\n (raw.tunnel as Record<string, unknown>).provider =\n process.env.OPENACP_TUNNEL_PROVIDER;\n }\n\n // Speech env var overrides\n if (process.env.OPENACP_SPEECH_STT_PROVIDER) {\n raw.speech = raw.speech || {};\n const speech = raw.speech as Record<string, unknown>;\n speech.stt = speech.stt || {};\n (speech.stt as Record<string, unknown>).provider =\n process.env.OPENACP_SPEECH_STT_PROVIDER;\n }\n if (process.env.OPENACP_SPEECH_GROQ_API_KEY) {\n raw.speech = raw.speech || {};\n const speech = raw.speech as Record<string, unknown>;\n speech.stt = speech.stt || {};\n const stt = speech.stt as Record<string, unknown>;\n stt.providers = stt.providers || {};\n const providers = stt.providers as Record<string, unknown>;\n providers.groq = providers.groq || {};\n (providers.groq as Record<string, unknown>).apiKey =\n process.env.OPENACP_SPEECH_GROQ_API_KEY;\n }\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): void {\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val && typeof val === \"object\" && !Array.isArray(val)) {\n if (!target[key]) target[key] = {};\n this.deepMerge(\n target[key] as Record<string, unknown>,\n val as Record<string, unknown>,\n );\n } else {\n target[key] = val;\n }\n }\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createChildLogger } from \"../utils/log.js\";\nimport { getGlobalRoot } from \"../instance-context.js\";\nconst log = createChildLogger({ module: \"config-migrations\" });\n\ntype RawConfig = Record<string, unknown>;\n\nexport interface Migration {\n name: string;\n apply: (raw: RawConfig) => boolean; // returns true if config was modified\n}\n\nexport const migrations: Migration[] = [\n {\n name: \"add-tunnel-section\",\n apply(raw) {\n if (raw.tunnel) return false;\n raw.tunnel = {\n enabled: true,\n port: 3100,\n provider: \"cloudflare\",\n options: {},\n storeTtlMinutes: 60,\n auth: { enabled: false },\n };\n log.info(\"Added tunnel section to config (enabled by default with cloudflare)\");\n return true;\n },\n },\n {\n name: \"fix-agent-commands\",\n apply(raw) {\n const COMMAND_MIGRATIONS: Record<string, string[]> = {\n \"claude-agent-acp\": [\"claude\", \"claude-code\"],\n };\n\n const agents = raw.agents;\n if (!agents || typeof agents !== \"object\") return false;\n\n let changed = false;\n for (const [agentName, agentDef] of Object.entries(agents as Record<string, unknown>)) {\n if (!agentDef || typeof agentDef !== \"object\" || !(\"command\" in agentDef)) continue;\n const def = agentDef as Record<string, unknown>;\n if (typeof def.command !== \"string\") continue;\n for (const [correctCmd, legacyCmds] of Object.entries(COMMAND_MIGRATIONS)) {\n if (legacyCmds.includes(def.command as string)) {\n log.warn(\n { agent: agentName, oldCommand: def.command, newCommand: correctCmd },\n `Auto-migrating agent command: \"${def.command}\" → \"${correctCmd}\"`,\n );\n def.command = correctCmd;\n changed = true;\n }\n }\n }\n return changed;\n },\n },\n {\n name: \"migrate-agents-to-store\",\n apply(raw) {\n const agentsJsonPath = path.join(getGlobalRoot(), \"agents.json\");\n if (fs.existsSync(agentsJsonPath)) return false;\n\n const agents = raw.agents as Record<string, unknown> | undefined;\n if (!agents || Object.keys(agents).length === 0) return false;\n\n const COMMAND_TO_REGISTRY: Record<string, string> = {\n \"claude-agent-acp\": \"claude-acp\",\n \"codex\": \"codex-acp\",\n };\n\n const installed: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(agents)) {\n const cfg = val as Record<string, unknown>;\n const command = typeof cfg.command === \"string\" ? cfg.command : \"\";\n const registryId = COMMAND_TO_REGISTRY[command] ?? null;\n installed[key] = {\n registryId,\n name: key.charAt(0).toUpperCase() + key.slice(1),\n version: \"unknown\",\n distribution: \"custom\",\n command: cfg.command,\n args: cfg.args ?? [],\n env: cfg.env ?? {},\n workingDirectory: cfg.workingDirectory ?? undefined,\n installedAt: new Date().toISOString(),\n binaryPath: null,\n };\n }\n\n fs.mkdirSync(path.dirname(agentsJsonPath), { recursive: true });\n fs.writeFileSync(agentsJsonPath, JSON.stringify({ version: 1, installed }, null, 2));\n\n raw.agents = {};\n return true;\n },\n },\n {\n name: \"add-instance-name\",\n apply(raw) {\n if (raw.instanceName) return false;\n raw.instanceName = \"Main\";\n log.info(\"Added instanceName to config\");\n return true;\n },\n },\n {\n name: \"migrate-display-verbosity-to-output-mode\",\n apply(raw) {\n const channels = raw.channels as Record<string, unknown> | undefined;\n if (!channels) return false;\n let changed = false;\n for (const [, channelCfg] of Object.entries(channels)) {\n if (!channelCfg || typeof channelCfg !== \"object\") continue;\n const cfg = channelCfg as Record<string, unknown>;\n if (cfg.displayVerbosity && !cfg.outputMode) {\n cfg.outputMode = cfg.displayVerbosity;\n changed = true;\n }\n }\n return changed;\n },\n },\n];\n\n/**\n * Apply all migrations to raw config (mutates in place).\n * Returns whether any changes were made.\n */\nexport function applyMigrations(\n raw: RawConfig,\n migrationList: Migration[] = migrations,\n): { changed: boolean } {\n let changed = false;\n for (const migration of migrationList) {\n if (migration.apply(raw)) {\n changed = true;\n }\n }\n return { changed };\n}\n"],"mappings":"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","names":["fs","path","log","resolved"]}
|
package/dist/chunk-ZIRH6QWW.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FileService
|
|
3
|
-
} from "./chunk-IZ5UEZF7.js";
|
|
4
|
-
|
|
5
|
-
// src/plugins/file-service/index.ts
|
|
6
|
-
import path from "path";
|
|
7
|
-
import os from "os";
|
|
8
|
-
function createFileServicePlugin() {
|
|
9
|
-
return {
|
|
10
|
-
name: "@openacp/file-service",
|
|
11
|
-
version: "1.0.0",
|
|
12
|
-
description: "File storage and management for session attachments",
|
|
13
|
-
essential: false,
|
|
14
|
-
permissions: ["services:register"],
|
|
15
|
-
async install(ctx) {
|
|
16
|
-
const { settings, legacyConfig, terminal } = ctx;
|
|
17
|
-
const defaultFilesDir = path.join(ctx.instanceRoot ?? path.join(os.homedir(), ".openacp"), "files");
|
|
18
|
-
if (legacyConfig) {
|
|
19
|
-
const filesCfg = legacyConfig.files;
|
|
20
|
-
if (filesCfg) {
|
|
21
|
-
await settings.setAll({
|
|
22
|
-
baseDir: filesCfg.baseDir ?? defaultFilesDir
|
|
23
|
-
});
|
|
24
|
-
terminal.log.success("File service settings migrated from legacy config");
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
await settings.setAll({
|
|
29
|
-
baseDir: defaultFilesDir
|
|
30
|
-
});
|
|
31
|
-
terminal.log.success("File service defaults saved");
|
|
32
|
-
},
|
|
33
|
-
async configure(ctx) {
|
|
34
|
-
const { terminal, settings } = ctx;
|
|
35
|
-
const current = await settings.getAll();
|
|
36
|
-
const defaultFilesDir = path.join(ctx.instanceRoot ?? path.join(os.homedir(), ".openacp"), "files");
|
|
37
|
-
const val = await terminal.text({
|
|
38
|
-
message: "File storage directory:",
|
|
39
|
-
defaultValue: current.baseDir ?? defaultFilesDir
|
|
40
|
-
});
|
|
41
|
-
await settings.set("baseDir", val.trim());
|
|
42
|
-
terminal.log.success("File storage directory updated");
|
|
43
|
-
},
|
|
44
|
-
async uninstall(ctx, opts) {
|
|
45
|
-
if (opts.purge) {
|
|
46
|
-
await ctx.settings.clear();
|
|
47
|
-
ctx.terminal.log.success("File service settings cleared");
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
async setup(ctx) {
|
|
51
|
-
const config = ctx.pluginConfig;
|
|
52
|
-
const baseDir = config.baseDir ?? path.join(ctx.instanceRoot, "files");
|
|
53
|
-
const retentionDays = config.retentionDays ?? 30;
|
|
54
|
-
const service = new FileService(baseDir);
|
|
55
|
-
ctx.registerService("file-service", service);
|
|
56
|
-
service.cleanupOldFiles(retentionDays).then((count) => {
|
|
57
|
-
if (count > 0) ctx.log.info(`Cleaned up ${count} old session files`);
|
|
58
|
-
}).catch(() => {
|
|
59
|
-
});
|
|
60
|
-
ctx.log.info("File service ready");
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
var file_service_default = createFileServicePlugin();
|
|
65
|
-
|
|
66
|
-
export {
|
|
67
|
-
file_service_default
|
|
68
|
-
};
|
|
69
|
-
//# sourceMappingURL=chunk-ZIRH6QWW.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/file-service/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport { FileService } from './file-service.js'\nimport path from 'node:path'\nimport os from 'node:os'\n\nfunction createFileServicePlugin(): OpenACPPlugin {\n return {\n name: '@openacp/file-service',\n version: '1.0.0',\n description: 'File storage and management for session attachments',\n essential: false,\n permissions: ['services:register'],\n\n async install(ctx: InstallContext) {\n const { settings, legacyConfig, terminal } = ctx\n const defaultFilesDir = path.join(ctx.instanceRoot ?? path.join(os.homedir(), '.openacp'), 'files')\n\n // Migrate from legacy config if present\n if (legacyConfig) {\n const filesCfg = legacyConfig.files as Record<string, unknown> | undefined\n if (filesCfg) {\n await settings.setAll({\n baseDir: filesCfg.baseDir ?? defaultFilesDir,\n })\n terminal.log.success('File service settings migrated from legacy config')\n return\n }\n }\n\n // Save defaults\n await settings.setAll({\n baseDir: defaultFilesDir,\n })\n terminal.log.success('File service defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n const defaultFilesDir = path.join(ctx.instanceRoot ?? path.join(os.homedir(), '.openacp'), 'files')\n\n const val = await terminal.text({\n message: 'File storage directory:',\n defaultValue: (current.baseDir as string) ?? defaultFilesDir,\n })\n await settings.set('baseDir', val.trim())\n terminal.log.success('File storage directory updated')\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('File service settings cleared')\n }\n },\n\n async setup(ctx) {\n const config = ctx.pluginConfig as Record<string, unknown>\n const baseDir = (config.baseDir as string) ?? path.join(ctx.instanceRoot, 'files')\n const retentionDays = (config.retentionDays as number) ?? 30\n const service = new FileService(baseDir)\n ctx.registerService('file-service', service)\n // Cleanup old session files in background (fire-and-forget)\n service.cleanupOldFiles(retentionDays).then((count) => {\n if (count > 0) ctx.log.info(`Cleaned up ${count} old session files`)\n }).catch(() => {})\n ctx.log.info('File service ready')\n },\n }\n}\n\nexport default createFileServicePlugin()\n"],"mappings":";;;;;AAEA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAS,0BAAyC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa,CAAC,mBAAmB;AAAA,IAEjC,MAAM,QAAQ,KAAqB;AACjC,YAAM,EAAE,UAAU,cAAc,SAAS,IAAI;AAC7C,YAAM,kBAAkB,KAAK,KAAK,IAAI,gBAAgB,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO;AAGlG,UAAI,cAAc;AAChB,cAAM,WAAW,aAAa;AAC9B,YAAI,UAAU;AACZ,gBAAM,SAAS,OAAO;AAAA,YACpB,SAAS,SAAS,WAAW;AAAA,UAC/B,CAAC;AACD,mBAAS,IAAI,QAAQ,mDAAmD;AACxE;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,OAAO;AAAA,QACpB,SAAS;AAAA,MACX,CAAC;AACD,eAAS,IAAI,QAAQ,6BAA6B;AAAA,IACpD;AAAA,IAEA,MAAM,UAAU,KAAqB;AACnC,YAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,YAAM,UAAU,MAAM,SAAS,OAAO;AACtC,YAAM,kBAAkB,KAAK,KAAK,IAAI,gBAAgB,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO;AAElG,YAAM,MAAM,MAAM,SAAS,KAAK;AAAA,QAC9B,SAAS;AAAA,QACT,cAAe,QAAQ,WAAsB;AAAA,MAC/C,CAAC;AACD,YAAM,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC;AACxC,eAAS,IAAI,QAAQ,gCAAgC;AAAA,IACvD;AAAA,IAEA,MAAM,UAAU,KAAqB,MAA0B;AAC7D,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,SAAS,MAAM;AACzB,YAAI,SAAS,IAAI,QAAQ,+BAA+B;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK;AACf,YAAM,SAAS,IAAI;AACnB,YAAM,UAAW,OAAO,WAAsB,KAAK,KAAK,IAAI,cAAc,OAAO;AACjF,YAAM,gBAAiB,OAAO,iBAA4B;AAC1D,YAAM,UAAU,IAAI,YAAY,OAAO;AACvC,UAAI,gBAAgB,gBAAgB,OAAO;AAE3C,cAAQ,gBAAgB,aAAa,EAAE,KAAK,CAAC,UAAU;AACrD,YAAI,QAAQ,EAAG,KAAI,IAAI,KAAK,cAAc,KAAK,oBAAoB;AAAA,MACrE,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACjB,UAAI,IAAI,KAAK,oBAAoB;AAAA,IACnC;AAAA,EACF;AACF;AAEA,IAAO,uBAAQ,wBAAwB;","names":[]}
|