@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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openacp/cli",
|
|
3
|
-
"version": "2026.331.
|
|
3
|
+
"version": "2026.331.2",
|
|
4
4
|
"description": "Self-hosted bridge for AI coding agents via ACP protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"@clack/prompts": "^1.1.0",
|
|
27
27
|
"@hono/node-server": "^1.19.11",
|
|
28
28
|
"@inquirer/prompts": "^8.3.2",
|
|
29
|
-
"@
|
|
29
|
+
"@agentclientprotocol/claude-agent-acp": "^0.24.2",
|
|
30
30
|
"diff": "^8.0.3",
|
|
31
31
|
"fastest-levenshtein": "^1.0.16",
|
|
32
32
|
"grammy": "^1.41.1",
|
package/dist/adapter-ELG3VRZ3.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
TelegramAdapter
|
|
3
|
-
} from "./chunk-EWVXSTQK.js";
|
|
4
|
-
import "./chunk-AFKX424Q.js";
|
|
5
|
-
import "./chunk-K6UY5M75.js";
|
|
6
|
-
import "./chunk-NOEAJNTK.js";
|
|
7
|
-
import "./chunk-YZCKSNRN.js";
|
|
8
|
-
import "./chunk-NJX75BLK.js";
|
|
9
|
-
import "./chunk-R6KZYF7D.js";
|
|
10
|
-
import "./chunk-ON7HB5O7.js";
|
|
11
|
-
export {
|
|
12
|
-
TelegramAdapter
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=adapter-ELG3VRZ3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
REGISTRY_AGENT_ALIASES,
|
|
3
|
-
checkDependencies,
|
|
4
|
-
checkRuntimeAvailable,
|
|
5
|
-
commandExists,
|
|
6
|
-
getAgentAlias,
|
|
7
|
-
getAgentCapabilities,
|
|
8
|
-
getAgentDependencies,
|
|
9
|
-
getAgentSetup,
|
|
10
|
-
listAgentsWithIntegration
|
|
11
|
-
} from "./chunk-ZSLHHQPQ.js";
|
|
12
|
-
export {
|
|
13
|
-
REGISTRY_AGENT_ALIASES,
|
|
14
|
-
checkDependencies,
|
|
15
|
-
checkRuntimeAvailable,
|
|
16
|
-
commandExists,
|
|
17
|
-
getAgentAlias,
|
|
18
|
-
getAgentCapabilities,
|
|
19
|
-
getAgentDependencies,
|
|
20
|
-
getAgentSetup,
|
|
21
|
-
listAgentsWithIntegration
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=agent-dependencies-ED2ZTUHG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
escapeSystemdValue,
|
|
3
|
-
escapeXml,
|
|
4
|
-
generateLaunchdPlist,
|
|
5
|
-
generateSystemdUnit,
|
|
6
|
-
installAutoStart,
|
|
7
|
-
isAutoStartInstalled,
|
|
8
|
-
isAutoStartSupported,
|
|
9
|
-
uninstallAutoStart
|
|
10
|
-
} from "./chunk-2R5XM3ES.js";
|
|
11
|
-
import "./chunk-R6KZYF7D.js";
|
|
12
|
-
export {
|
|
13
|
-
escapeSystemdValue,
|
|
14
|
-
escapeXml,
|
|
15
|
-
generateLaunchdPlist,
|
|
16
|
-
generateSystemdUnit,
|
|
17
|
-
installAutoStart,
|
|
18
|
-
isAutoStartInstalled,
|
|
19
|
-
isAutoStartSupported,
|
|
20
|
-
uninstallAutoStart
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=autostart-CUPZMKKC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/chunk-23SRIVG4.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
// src/core/instance-registry.ts
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import path from "path";
|
|
4
|
-
var InstanceRegistry = class {
|
|
5
|
-
constructor(registryPath) {
|
|
6
|
-
this.registryPath = registryPath;
|
|
7
|
-
}
|
|
8
|
-
data = { version: 1, instances: {} };
|
|
9
|
-
async load() {
|
|
10
|
-
try {
|
|
11
|
-
const raw = fs.readFileSync(this.registryPath, "utf-8");
|
|
12
|
-
const parsed = JSON.parse(raw);
|
|
13
|
-
if (parsed.version === 1 && parsed.instances) {
|
|
14
|
-
this.data = parsed;
|
|
15
|
-
}
|
|
16
|
-
} catch {
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
async save() {
|
|
20
|
-
const dir = path.dirname(this.registryPath);
|
|
21
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
22
|
-
fs.writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2));
|
|
23
|
-
}
|
|
24
|
-
register(id, root) {
|
|
25
|
-
this.data.instances[id] = { id, root };
|
|
26
|
-
}
|
|
27
|
-
remove(id) {
|
|
28
|
-
delete this.data.instances[id];
|
|
29
|
-
}
|
|
30
|
-
get(id) {
|
|
31
|
-
return this.data.instances[id];
|
|
32
|
-
}
|
|
33
|
-
getByRoot(root) {
|
|
34
|
-
return Object.values(this.data.instances).find((e) => e.root === root);
|
|
35
|
-
}
|
|
36
|
-
list() {
|
|
37
|
-
return Object.values(this.data.instances);
|
|
38
|
-
}
|
|
39
|
-
uniqueId(baseId) {
|
|
40
|
-
if (!this.data.instances[baseId]) return baseId;
|
|
41
|
-
let n = 2;
|
|
42
|
-
while (this.data.instances[`${baseId}-${n}`]) n++;
|
|
43
|
-
return `${baseId}-${n}`;
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export {
|
|
48
|
-
InstanceRegistry
|
|
49
|
-
};
|
|
50
|
-
//# sourceMappingURL=chunk-23SRIVG4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/instance-registry.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface InstanceRegistryEntry {\n id: string\n root: string\n}\n\ninterface RegistryData {\n version: 1\n instances: Record<string, InstanceRegistryEntry>\n}\n\nexport class InstanceRegistry {\n private data: RegistryData = { version: 1, instances: {} }\n\n constructor(private registryPath: string) {}\n\n async load(): Promise<void> {\n try {\n const raw = fs.readFileSync(this.registryPath, 'utf-8')\n const parsed = JSON.parse(raw) as RegistryData\n if (parsed.version === 1 && parsed.instances) {\n this.data = parsed\n }\n } catch {\n // File doesn't exist or invalid — start fresh\n }\n }\n\n async save(): Promise<void> {\n const dir = path.dirname(this.registryPath)\n fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2))\n }\n\n register(id: string, root: string): void {\n this.data.instances[id] = { id, root }\n }\n\n remove(id: string): void {\n delete this.data.instances[id]\n }\n\n get(id: string): InstanceRegistryEntry | undefined {\n return this.data.instances[id]\n }\n\n getByRoot(root: string): InstanceRegistryEntry | undefined {\n return Object.values(this.data.instances).find((e) => e.root === root)\n }\n\n list(): InstanceRegistryEntry[] {\n return Object.values(this.data.instances)\n }\n\n uniqueId(baseId: string): string {\n if (!this.data.instances[baseId]) return baseId\n let n = 2\n while (this.data.instances[`${baseId}-${n}`]) n++\n return `${baseId}-${n}`\n }\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAYV,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAoB,cAAsB;AAAtB;AAAA,EAAuB;AAAA,EAFnC,OAAqB,EAAE,SAAS,GAAG,WAAW,CAAC,EAAE;AAAA,EAIzD,MAAM,OAAsB;AAC1B,QAAI;AACF,YAAM,MAAM,GAAG,aAAa,KAAK,cAAc,OAAO;AACtD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,OAAO,YAAY,KAAK,OAAO,WAAW;AAC5C,aAAK,OAAO;AAAA,MACd;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,MAAM,KAAK,QAAQ,KAAK,YAAY;AAC1C,OAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACrC,OAAG,cAAc,KAAK,cAAc,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EACxE;AAAA,EAEA,SAAS,IAAY,MAAoB;AACvC,SAAK,KAAK,UAAU,EAAE,IAAI,EAAE,IAAI,KAAK;AAAA,EACvC;AAAA,EAEA,OAAO,IAAkB;AACvB,WAAO,KAAK,KAAK,UAAU,EAAE;AAAA,EAC/B;AAAA,EAEA,IAAI,IAA+C;AACjD,WAAO,KAAK,KAAK,UAAU,EAAE;AAAA,EAC/B;AAAA,EAEA,UAAU,MAAiD;AACzD,WAAO,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACvE;AAAA,EAEA,OAAgC;AAC9B,WAAO,OAAO,OAAO,KAAK,KAAK,SAAS;AAAA,EAC1C;AAAA,EAEA,SAAS,QAAwB;AAC/B,QAAI,CAAC,KAAK,KAAK,UAAU,MAAM,EAAG,QAAO;AACzC,QAAI,IAAI;AACR,WAAO,KAAK,KAAK,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,EAAG;AAC9C,WAAO,GAAG,MAAM,IAAI,CAAC;AAAA,EACvB;AACF;","names":[]}
|
package/dist/chunk-2KT6TROD.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
// src/plugins/speech/speech-service.ts
|
|
2
|
-
var SpeechService = class {
|
|
3
|
-
constructor(config) {
|
|
4
|
-
this.config = config;
|
|
5
|
-
}
|
|
6
|
-
sttProviders = /* @__PURE__ */ new Map();
|
|
7
|
-
ttsProviders = /* @__PURE__ */ new Map();
|
|
8
|
-
providerFactory;
|
|
9
|
-
/** Set a factory function that can recreate providers from config (for hot-reload) */
|
|
10
|
-
setProviderFactory(factory) {
|
|
11
|
-
this.providerFactory = factory;
|
|
12
|
-
}
|
|
13
|
-
registerSTTProvider(name, provider) {
|
|
14
|
-
this.sttProviders.set(name, provider);
|
|
15
|
-
}
|
|
16
|
-
registerTTSProvider(name, provider) {
|
|
17
|
-
this.ttsProviders.set(name, provider);
|
|
18
|
-
}
|
|
19
|
-
unregisterTTSProvider(name) {
|
|
20
|
-
this.ttsProviders.delete(name);
|
|
21
|
-
}
|
|
22
|
-
isSTTAvailable() {
|
|
23
|
-
const { provider, providers } = this.config.stt;
|
|
24
|
-
return provider !== null && providers[provider]?.apiKey !== void 0;
|
|
25
|
-
}
|
|
26
|
-
isTTSAvailable() {
|
|
27
|
-
const provider = this.config.tts.provider;
|
|
28
|
-
return provider !== null && this.ttsProviders.has(provider);
|
|
29
|
-
}
|
|
30
|
-
async transcribe(audioBuffer, mimeType, options) {
|
|
31
|
-
const providerName = this.config.stt.provider;
|
|
32
|
-
if (!providerName || !this.config.stt.providers[providerName]?.apiKey) {
|
|
33
|
-
throw new Error("STT not configured. Set speech.stt.provider and API key in config.");
|
|
34
|
-
}
|
|
35
|
-
const provider = this.sttProviders.get(providerName);
|
|
36
|
-
if (!provider) {
|
|
37
|
-
throw new Error(`STT provider "${providerName}" not registered. Available: ${[...this.sttProviders.keys()].join(", ") || "none"}`);
|
|
38
|
-
}
|
|
39
|
-
return provider.transcribe(audioBuffer, mimeType, options);
|
|
40
|
-
}
|
|
41
|
-
async synthesize(text, options) {
|
|
42
|
-
const providerName = this.config.tts.provider;
|
|
43
|
-
if (!providerName) {
|
|
44
|
-
throw new Error("TTS not configured. Set speech.tts.provider in config.");
|
|
45
|
-
}
|
|
46
|
-
const provider = this.ttsProviders.get(providerName);
|
|
47
|
-
if (!provider) {
|
|
48
|
-
throw new Error(`TTS provider "${providerName}" not registered. Available: ${[...this.ttsProviders.keys()].join(", ") || "none"}`);
|
|
49
|
-
}
|
|
50
|
-
return provider.synthesize(text, options);
|
|
51
|
-
}
|
|
52
|
-
updateConfig(config) {
|
|
53
|
-
this.config = config;
|
|
54
|
-
}
|
|
55
|
-
/** Re-create factory-managed providers from config. Preserves externally-registered providers (e.g. from plugins). */
|
|
56
|
-
refreshProviders(newConfig) {
|
|
57
|
-
this.config = newConfig;
|
|
58
|
-
if (this.providerFactory) {
|
|
59
|
-
const { stt, tts } = this.providerFactory(newConfig);
|
|
60
|
-
for (const [name, provider] of stt) {
|
|
61
|
-
this.sttProviders.set(name, provider);
|
|
62
|
-
}
|
|
63
|
-
for (const [name, provider] of tts) {
|
|
64
|
-
this.ttsProviders.set(name, provider);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// src/plugins/speech/providers/groq.ts
|
|
71
|
-
var GROQ_API_URL = "https://api.groq.com/openai/v1/audio/transcriptions";
|
|
72
|
-
var GroqSTT = class {
|
|
73
|
-
constructor(apiKey, defaultModel = "whisper-large-v3-turbo") {
|
|
74
|
-
this.apiKey = apiKey;
|
|
75
|
-
this.defaultModel = defaultModel;
|
|
76
|
-
}
|
|
77
|
-
name = "groq";
|
|
78
|
-
async transcribe(audioBuffer, mimeType, options) {
|
|
79
|
-
const ext = mimeToExt(mimeType);
|
|
80
|
-
const form = new FormData();
|
|
81
|
-
form.append("file", new Blob([new Uint8Array(audioBuffer)], { type: mimeType }), `audio${ext}`);
|
|
82
|
-
form.append("model", options?.model || this.defaultModel);
|
|
83
|
-
form.append("response_format", "verbose_json");
|
|
84
|
-
if (options?.language) {
|
|
85
|
-
form.append("language", options.language);
|
|
86
|
-
}
|
|
87
|
-
const resp = await fetch(GROQ_API_URL, {
|
|
88
|
-
method: "POST",
|
|
89
|
-
headers: { Authorization: `Bearer ${this.apiKey}` },
|
|
90
|
-
body: form
|
|
91
|
-
});
|
|
92
|
-
if (!resp.ok) {
|
|
93
|
-
const body = await resp.text();
|
|
94
|
-
if (resp.status === 401) {
|
|
95
|
-
throw new Error("Invalid Groq API key. Check your key at console.groq.com.");
|
|
96
|
-
}
|
|
97
|
-
if (resp.status === 413) {
|
|
98
|
-
throw new Error("Audio file too large for Groq API (max 25MB).");
|
|
99
|
-
}
|
|
100
|
-
if (resp.status === 429) {
|
|
101
|
-
throw new Error("Groq rate limit exceeded. Free tier: 28,800 seconds/day. Try again later.");
|
|
102
|
-
}
|
|
103
|
-
throw new Error(`Groq STT error (${resp.status}): ${body}`);
|
|
104
|
-
}
|
|
105
|
-
const data = await resp.json();
|
|
106
|
-
return {
|
|
107
|
-
text: data.text,
|
|
108
|
-
language: data.language,
|
|
109
|
-
duration: data.duration
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
function mimeToExt(mimeType) {
|
|
114
|
-
const map = {
|
|
115
|
-
"audio/ogg": ".ogg",
|
|
116
|
-
"audio/wav": ".wav",
|
|
117
|
-
"audio/mpeg": ".mp3",
|
|
118
|
-
"audio/mp4": ".m4a",
|
|
119
|
-
"audio/webm": ".webm",
|
|
120
|
-
"audio/flac": ".flac"
|
|
121
|
-
};
|
|
122
|
-
return map[mimeType] || ".bin";
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export {
|
|
126
|
-
SpeechService,
|
|
127
|
-
GroqSTT
|
|
128
|
-
};
|
|
129
|
-
//# sourceMappingURL=chunk-2KT6TROD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/speech/speech-service.ts","../../src/plugins/speech/providers/groq.ts"],"sourcesContent":["import type { STTProvider, TTSProvider, STTOptions, STTResult, TTSOptions, TTSResult, SpeechServiceConfig } from './speech-types.js';\n\nexport type ProviderFactory = (config: SpeechServiceConfig) => { stt: Map<string, STTProvider>; tts: Map<string, TTSProvider> };\n\nexport class SpeechService {\n private sttProviders = new Map<string, STTProvider>();\n private ttsProviders = new Map<string, TTSProvider>();\n private providerFactory?: ProviderFactory;\n\n constructor(private config: SpeechServiceConfig) {}\n\n /** Set a factory function that can recreate providers from config (for hot-reload) */\n setProviderFactory(factory: ProviderFactory): void {\n this.providerFactory = factory;\n }\n\n registerSTTProvider(name: string, provider: STTProvider): void {\n this.sttProviders.set(name, provider);\n }\n\n registerTTSProvider(name: string, provider: TTSProvider): void {\n this.ttsProviders.set(name, provider);\n }\n\n unregisterTTSProvider(name: string): void {\n this.ttsProviders.delete(name);\n }\n\n isSTTAvailable(): boolean {\n const { provider, providers } = this.config.stt;\n return provider !== null && providers[provider]?.apiKey !== undefined;\n }\n\n isTTSAvailable(): boolean {\n const provider = this.config.tts.provider;\n return provider !== null && this.ttsProviders.has(provider);\n }\n\n async transcribe(audioBuffer: Buffer, mimeType: string, options?: STTOptions): Promise<STTResult> {\n const providerName = this.config.stt.provider;\n if (!providerName || !this.config.stt.providers[providerName]?.apiKey) {\n throw new Error(\"STT not configured. Set speech.stt.provider and API key in config.\");\n }\n const provider = this.sttProviders.get(providerName);\n if (!provider) {\n throw new Error(`STT provider \"${providerName}\" not registered. Available: ${[...this.sttProviders.keys()].join(\", \") || \"none\"}`);\n }\n return provider.transcribe(audioBuffer, mimeType, options);\n }\n\n async synthesize(text: string, options?: TTSOptions): Promise<TTSResult> {\n const providerName = this.config.tts.provider;\n if (!providerName) {\n throw new Error(\"TTS not configured. Set speech.tts.provider in config.\");\n }\n const provider = this.ttsProviders.get(providerName);\n if (!provider) {\n throw new Error(`TTS provider \"${providerName}\" not registered. Available: ${[...this.ttsProviders.keys()].join(\", \") || \"none\"}`);\n }\n return provider.synthesize(text, options);\n }\n\n updateConfig(config: SpeechServiceConfig): void {\n this.config = config;\n }\n\n /** Re-create factory-managed providers from config. Preserves externally-registered providers (e.g. from plugins). */\n refreshProviders(newConfig: SpeechServiceConfig): void {\n this.config = newConfig;\n if (this.providerFactory) {\n const { stt, tts } = this.providerFactory(newConfig);\n // Merge: factory providers overwrite, but externally-registered providers are preserved\n for (const [name, provider] of stt) {\n this.sttProviders.set(name, provider);\n }\n for (const [name, provider] of tts) {\n this.ttsProviders.set(name, provider);\n }\n }\n }\n}\n","import type { STTProvider, STTOptions, STTResult } from '../speech-types.js';\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1/audio/transcriptions\";\n\nexport class GroqSTT implements STTProvider {\n readonly name = \"groq\";\n\n constructor(\n private apiKey: string,\n private defaultModel: string = \"whisper-large-v3-turbo\",\n ) {}\n\n async transcribe(audioBuffer: Buffer, mimeType: string, options?: STTOptions): Promise<STTResult> {\n const ext = mimeToExt(mimeType);\n const form = new FormData();\n form.append(\"file\", new Blob([new Uint8Array(audioBuffer)], { type: mimeType }), `audio${ext}`);\n form.append(\"model\", options?.model || this.defaultModel);\n form.append(\"response_format\", \"verbose_json\");\n if (options?.language) {\n form.append(\"language\", options.language);\n }\n\n const resp = await fetch(GROQ_API_URL, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n body: form,\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n if (resp.status === 401) {\n throw new Error(\"Invalid Groq API key. Check your key at console.groq.com.\");\n }\n if (resp.status === 413) {\n throw new Error(\"Audio file too large for Groq API (max 25MB).\");\n }\n if (resp.status === 429) {\n throw new Error(\"Groq rate limit exceeded. Free tier: 28,800 seconds/day. Try again later.\");\n }\n throw new Error(`Groq STT error (${resp.status}): ${body}`);\n }\n\n const data = await resp.json() as { text: string; language?: string; duration?: number };\n return {\n text: data.text,\n language: data.language,\n duration: data.duration,\n };\n }\n}\n\nfunction mimeToExt(mimeType: string): string {\n const map: Record<string, string> = {\n \"audio/ogg\": \".ogg\",\n \"audio/wav\": \".wav\",\n \"audio/mpeg\": \".mp3\",\n \"audio/mp4\": \".m4a\",\n \"audio/webm\": \".webm\",\n \"audio/flac\": \".flac\",\n };\n return map[mimeType] || \".bin\";\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-2R5XM3ES.js
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createChildLogger
|
|
3
|
-
} from "./chunk-R6KZYF7D.js";
|
|
4
|
-
|
|
5
|
-
// src/cli/autostart.ts
|
|
6
|
-
import { execFileSync } from "child_process";
|
|
7
|
-
import * as fs from "fs";
|
|
8
|
-
import * as path from "path";
|
|
9
|
-
import * as os from "os";
|
|
10
|
-
var log = createChildLogger({ module: "autostart" });
|
|
11
|
-
var LAUNCHD_LABEL = "com.openacp.daemon";
|
|
12
|
-
var LAUNCHD_PLIST_PATH = path.join(os.homedir(), "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`);
|
|
13
|
-
var SYSTEMD_SERVICE_PATH = path.join(os.homedir(), ".config", "systemd", "user", "openacp.service");
|
|
14
|
-
function isAutoStartSupported() {
|
|
15
|
-
return process.platform === "darwin" || process.platform === "linux";
|
|
16
|
-
}
|
|
17
|
-
function escapeXml(str) {
|
|
18
|
-
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
19
|
-
}
|
|
20
|
-
function escapeSystemdValue(str) {
|
|
21
|
-
const escaped = str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\$/g, "$$$$").replace(/%/g, "%%");
|
|
22
|
-
return `"${escaped}"`;
|
|
23
|
-
}
|
|
24
|
-
function generateLaunchdPlist(nodePath, cliPath, logDir) {
|
|
25
|
-
const logFile = path.join(logDir, "openacp.log");
|
|
26
|
-
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
27
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
28
|
-
<plist version="1.0">
|
|
29
|
-
<dict>
|
|
30
|
-
<key>Label</key>
|
|
31
|
-
<string>${LAUNCHD_LABEL}</string>
|
|
32
|
-
<key>ProgramArguments</key>
|
|
33
|
-
<array>
|
|
34
|
-
<string>${escapeXml(nodePath)}</string>
|
|
35
|
-
<string>${escapeXml(cliPath)}</string>
|
|
36
|
-
<string>--daemon-child</string>
|
|
37
|
-
</array>
|
|
38
|
-
<key>RunAtLoad</key>
|
|
39
|
-
<true/>
|
|
40
|
-
<key>KeepAlive</key>
|
|
41
|
-
<dict>
|
|
42
|
-
<key>SuccessfulExit</key>
|
|
43
|
-
<false/>
|
|
44
|
-
</dict>
|
|
45
|
-
<key>StandardOutPath</key>
|
|
46
|
-
<string>${escapeXml(logFile)}</string>
|
|
47
|
-
<key>StandardErrorPath</key>
|
|
48
|
-
<string>${escapeXml(logFile)}</string>
|
|
49
|
-
</dict>
|
|
50
|
-
</plist>
|
|
51
|
-
`;
|
|
52
|
-
}
|
|
53
|
-
function generateSystemdUnit(nodePath, cliPath) {
|
|
54
|
-
return `[Unit]
|
|
55
|
-
Description=OpenACP Daemon
|
|
56
|
-
|
|
57
|
-
[Service]
|
|
58
|
-
ExecStart=${escapeSystemdValue(nodePath)} ${escapeSystemdValue(cliPath)} --daemon-child
|
|
59
|
-
Restart=on-failure
|
|
60
|
-
|
|
61
|
-
[Install]
|
|
62
|
-
WantedBy=default.target
|
|
63
|
-
`;
|
|
64
|
-
}
|
|
65
|
-
function installAutoStart(logDir) {
|
|
66
|
-
if (!isAutoStartSupported()) {
|
|
67
|
-
return { success: false, error: "Auto-start not supported on this platform" };
|
|
68
|
-
}
|
|
69
|
-
const nodePath = process.execPath;
|
|
70
|
-
const cliPath = path.resolve(process.argv[1]);
|
|
71
|
-
const resolvedLogDir = logDir.startsWith("~") ? path.join(os.homedir(), logDir.slice(1)) : logDir;
|
|
72
|
-
try {
|
|
73
|
-
if (process.platform === "darwin") {
|
|
74
|
-
const plist = generateLaunchdPlist(nodePath, cliPath, resolvedLogDir);
|
|
75
|
-
const dir = path.dirname(LAUNCHD_PLIST_PATH);
|
|
76
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
77
|
-
fs.writeFileSync(LAUNCHD_PLIST_PATH, plist);
|
|
78
|
-
execFileSync("launchctl", ["load", LAUNCHD_PLIST_PATH], { stdio: "pipe" });
|
|
79
|
-
log.info("LaunchAgent installed");
|
|
80
|
-
return { success: true };
|
|
81
|
-
}
|
|
82
|
-
if (process.platform === "linux") {
|
|
83
|
-
const unit = generateSystemdUnit(nodePath, cliPath);
|
|
84
|
-
const dir = path.dirname(SYSTEMD_SERVICE_PATH);
|
|
85
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
86
|
-
fs.writeFileSync(SYSTEMD_SERVICE_PATH, unit);
|
|
87
|
-
execFileSync("systemctl", ["--user", "daemon-reload"], { stdio: "pipe" });
|
|
88
|
-
execFileSync("systemctl", ["--user", "enable", "openacp"], { stdio: "pipe" });
|
|
89
|
-
log.info("systemd user service installed");
|
|
90
|
-
return { success: true };
|
|
91
|
-
}
|
|
92
|
-
return { success: false, error: "Unsupported platform" };
|
|
93
|
-
} catch (e) {
|
|
94
|
-
const msg = e.message;
|
|
95
|
-
log.error({ err: msg }, "Failed to install auto-start");
|
|
96
|
-
return { success: false, error: msg };
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
function uninstallAutoStart() {
|
|
100
|
-
if (!isAutoStartSupported()) {
|
|
101
|
-
return { success: false, error: "Auto-start not supported on this platform" };
|
|
102
|
-
}
|
|
103
|
-
try {
|
|
104
|
-
if (process.platform === "darwin") {
|
|
105
|
-
if (fs.existsSync(LAUNCHD_PLIST_PATH)) {
|
|
106
|
-
try {
|
|
107
|
-
execFileSync("launchctl", ["unload", LAUNCHD_PLIST_PATH], { stdio: "pipe" });
|
|
108
|
-
} catch {
|
|
109
|
-
}
|
|
110
|
-
fs.unlinkSync(LAUNCHD_PLIST_PATH);
|
|
111
|
-
log.info("LaunchAgent removed");
|
|
112
|
-
}
|
|
113
|
-
return { success: true };
|
|
114
|
-
}
|
|
115
|
-
if (process.platform === "linux") {
|
|
116
|
-
if (fs.existsSync(SYSTEMD_SERVICE_PATH)) {
|
|
117
|
-
try {
|
|
118
|
-
execFileSync("systemctl", ["--user", "disable", "openacp"], { stdio: "pipe" });
|
|
119
|
-
} catch {
|
|
120
|
-
}
|
|
121
|
-
fs.unlinkSync(SYSTEMD_SERVICE_PATH);
|
|
122
|
-
execFileSync("systemctl", ["--user", "daemon-reload"], { stdio: "pipe" });
|
|
123
|
-
log.info("systemd user service removed");
|
|
124
|
-
}
|
|
125
|
-
return { success: true };
|
|
126
|
-
}
|
|
127
|
-
return { success: false, error: "Unsupported platform" };
|
|
128
|
-
} catch (e) {
|
|
129
|
-
const msg = e.message;
|
|
130
|
-
log.error({ err: msg }, "Failed to uninstall auto-start");
|
|
131
|
-
return { success: false, error: msg };
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
function isAutoStartInstalled() {
|
|
135
|
-
if (process.platform === "darwin") {
|
|
136
|
-
return fs.existsSync(LAUNCHD_PLIST_PATH);
|
|
137
|
-
}
|
|
138
|
-
if (process.platform === "linux") {
|
|
139
|
-
return fs.existsSync(SYSTEMD_SERVICE_PATH);
|
|
140
|
-
}
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export {
|
|
145
|
-
isAutoStartSupported,
|
|
146
|
-
escapeXml,
|
|
147
|
-
escapeSystemdValue,
|
|
148
|
-
generateLaunchdPlist,
|
|
149
|
-
generateSystemdUnit,
|
|
150
|
-
installAutoStart,
|
|
151
|
-
uninstallAutoStart,
|
|
152
|
-
isAutoStartInstalled
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=chunk-2R5XM3ES.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/autostart.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport * as os from 'node:os'\nimport { createChildLogger } from '../core/utils/log.js'\n\nconst log = createChildLogger({ module: 'autostart' })\n\nconst LAUNCHD_LABEL = 'com.openacp.daemon'\nconst LAUNCHD_PLIST_PATH = path.join(os.homedir(), 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`)\nconst SYSTEMD_SERVICE_PATH = path.join(os.homedir(), '.config', 'systemd', 'user', 'openacp.service')\n\nexport function isAutoStartSupported(): boolean {\n return process.platform === 'darwin' || process.platform === 'linux'\n}\n\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\nexport function escapeSystemdValue(str: string): string {\n const escaped = str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\$/g, '$$$$')\n .replace(/%/g, '%%')\n return `\"${escaped}\"`\n}\n\nexport function generateLaunchdPlist(nodePath: string, cliPath: string, logDir: string): string {\n const logFile = path.join(logDir, 'openacp.log')\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LAUNCHD_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${escapeXml(nodePath)}</string>\n <string>${escapeXml(cliPath)}</string>\n <string>--daemon-child</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>StandardOutPath</key>\n <string>${escapeXml(logFile)}</string>\n <key>StandardErrorPath</key>\n <string>${escapeXml(logFile)}</string>\n</dict>\n</plist>\n`\n}\n\nexport function generateSystemdUnit(nodePath: string, cliPath: string): string {\n return `[Unit]\nDescription=OpenACP Daemon\n\n[Service]\nExecStart=${escapeSystemdValue(nodePath)} ${escapeSystemdValue(cliPath)} --daemon-child\nRestart=on-failure\n\n[Install]\nWantedBy=default.target\n`\n}\n\nexport function installAutoStart(logDir: string): { success: boolean; error?: string } {\n if (!isAutoStartSupported()) {\n return { success: false, error: 'Auto-start not supported on this platform' }\n }\n\n const nodePath = process.execPath\n const cliPath = path.resolve(process.argv[1])\n const resolvedLogDir = logDir.startsWith('~')\n ? path.join(os.homedir(), logDir.slice(1))\n : logDir\n\n try {\n if (process.platform === 'darwin') {\n const plist = generateLaunchdPlist(nodePath, cliPath, resolvedLogDir)\n const dir = path.dirname(LAUNCHD_PLIST_PATH)\n fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(LAUNCHD_PLIST_PATH, plist)\n execFileSync('launchctl', ['load', LAUNCHD_PLIST_PATH], { stdio: 'pipe' })\n log.info('LaunchAgent installed')\n return { success: true }\n }\n\n if (process.platform === 'linux') {\n const unit = generateSystemdUnit(nodePath, cliPath)\n const dir = path.dirname(SYSTEMD_SERVICE_PATH)\n fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(SYSTEMD_SERVICE_PATH, unit)\n execFileSync('systemctl', ['--user', 'daemon-reload'], { stdio: 'pipe' })\n execFileSync('systemctl', ['--user', 'enable', 'openacp'], { stdio: 'pipe' })\n log.info('systemd user service installed')\n return { success: true }\n }\n\n return { success: false, error: 'Unsupported platform' }\n } catch (e) {\n const msg = (e as Error).message\n log.error({ err: msg }, 'Failed to install auto-start')\n return { success: false, error: msg }\n }\n}\n\nexport function uninstallAutoStart(): { success: boolean; error?: string } {\n if (!isAutoStartSupported()) {\n return { success: false, error: 'Auto-start not supported on this platform' }\n }\n\n try {\n if (process.platform === 'darwin') {\n if (fs.existsSync(LAUNCHD_PLIST_PATH)) {\n try {\n execFileSync('launchctl', ['unload', LAUNCHD_PLIST_PATH], { stdio: 'pipe' })\n } catch {\n // may already be unloaded\n }\n fs.unlinkSync(LAUNCHD_PLIST_PATH)\n log.info('LaunchAgent removed')\n }\n return { success: true }\n }\n\n if (process.platform === 'linux') {\n if (fs.existsSync(SYSTEMD_SERVICE_PATH)) {\n try {\n execFileSync('systemctl', ['--user', 'disable', 'openacp'], { stdio: 'pipe' })\n } catch {\n // may already be disabled\n }\n fs.unlinkSync(SYSTEMD_SERVICE_PATH)\n execFileSync('systemctl', ['--user', 'daemon-reload'], { stdio: 'pipe' })\n log.info('systemd user service removed')\n }\n return { success: true }\n }\n\n return { success: false, error: 'Unsupported platform' }\n } catch (e) {\n const msg = (e as Error).message\n log.error({ err: msg }, 'Failed to uninstall auto-start')\n return { success: false, error: msg }\n }\n}\n\nexport function isAutoStartInstalled(): boolean {\n if (process.platform === 'darwin') {\n return fs.existsSync(LAUNCHD_PLIST_PATH)\n }\n if (process.platform === 'linux') {\n return fs.existsSync(SYSTEMD_SERVICE_PATH)\n }\n return false\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-3EWTPOF7.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
NotificationManager
|
|
3
|
-
} from "./chunk-7ZCQF6QM.js";
|
|
4
|
-
|
|
5
|
-
// src/plugins/notifications/index.ts
|
|
6
|
-
function createNotificationsPlugin() {
|
|
7
|
-
return {
|
|
8
|
-
name: "@openacp/notifications",
|
|
9
|
-
version: "1.0.0",
|
|
10
|
-
description: "Cross-session notification routing",
|
|
11
|
-
essential: false,
|
|
12
|
-
pluginDependencies: { "@openacp/security": "^1.0.0" },
|
|
13
|
-
permissions: ["services:register", "kernel:access"],
|
|
14
|
-
async install(ctx) {
|
|
15
|
-
const { settings, terminal } = ctx;
|
|
16
|
-
await settings.setAll({ enabled: true });
|
|
17
|
-
terminal.log.success("Notifications defaults saved");
|
|
18
|
-
},
|
|
19
|
-
async configure(ctx) {
|
|
20
|
-
const { terminal, settings } = ctx;
|
|
21
|
-
const current = await settings.getAll();
|
|
22
|
-
const toggle = await terminal.confirm({
|
|
23
|
-
message: `Notifications are ${current.enabled !== false ? "enabled" : "disabled"}. Toggle?`,
|
|
24
|
-
initialValue: false
|
|
25
|
-
});
|
|
26
|
-
if (toggle) {
|
|
27
|
-
const newState = current.enabled === false;
|
|
28
|
-
await settings.set("enabled", newState);
|
|
29
|
-
terminal.log.success(`Notifications ${newState ? "enabled" : "disabled"}`);
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
async uninstall(ctx, opts) {
|
|
33
|
-
if (opts.purge) {
|
|
34
|
-
await ctx.settings.clear();
|
|
35
|
-
ctx.terminal.log.success("Notifications settings cleared");
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
async setup(ctx) {
|
|
39
|
-
const core = ctx.core;
|
|
40
|
-
const manager = new NotificationManager(core.adapters);
|
|
41
|
-
ctx.registerService("notifications", manager);
|
|
42
|
-
ctx.log.info("Notifications service ready");
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
var notifications_default = createNotificationsPlugin();
|
|
47
|
-
|
|
48
|
-
export {
|
|
49
|
-
notifications_default
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=chunk-3EWTPOF7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/notifications/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext, CoreAccess } from '../../core/plugin/types.js'\nimport { NotificationManager } from './notification.js'\n\nfunction createNotificationsPlugin(): OpenACPPlugin {\n return {\n name: '@openacp/notifications',\n version: '1.0.0',\n description: 'Cross-session notification routing',\n essential: false,\n pluginDependencies: { '@openacp/security': '^1.0.0' },\n permissions: ['services:register', 'kernel:access'],\n\n async install(ctx: InstallContext) {\n const { settings, terminal } = ctx\n\n // No interactive prompts needed — save defaults\n await settings.setAll({ enabled: true })\n terminal.log.success('Notifications defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const toggle = await terminal.confirm({\n message: `Notifications are ${current.enabled !== false ? 'enabled' : 'disabled'}. Toggle?`,\n initialValue: false,\n })\n if (toggle) {\n const newState = current.enabled === false\n await settings.set('enabled', newState)\n terminal.log.success(`Notifications ${newState ? 'enabled' : 'disabled'}`)\n }\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('Notifications settings cleared')\n }\n },\n\n async setup(ctx) {\n // NotificationManager needs the live adapters Map from core\n const core = ctx.core as CoreAccess\n const manager = new NotificationManager(core.adapters)\n ctx.registerService('notifications', manager)\n ctx.log.info('Notifications service ready')\n },\n }\n}\n\nexport default createNotificationsPlugin()\n"],"mappings":";;;;;AAGA,SAAS,4BAA2C;AAClD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,oBAAoB,EAAE,qBAAqB,SAAS;AAAA,IACpD,aAAa,CAAC,qBAAqB,eAAe;AAAA,IAElD,MAAM,QAAQ,KAAqB;AACjC,YAAM,EAAE,UAAU,SAAS,IAAI;AAG/B,YAAM,SAAS,OAAO,EAAE,SAAS,KAAK,CAAC;AACvC,eAAS,IAAI,QAAQ,8BAA8B;AAAA,IACrD;AAAA,IAEA,MAAM,UAAU,KAAqB;AACnC,YAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,YAAM,UAAU,MAAM,SAAS,OAAO;AAEtC,YAAM,SAAS,MAAM,SAAS,QAAQ;AAAA,QACpC,SAAS,qBAAqB,QAAQ,YAAY,QAAQ,YAAY,UAAU;AAAA,QAChF,cAAc;AAAA,MAChB,CAAC;AACD,UAAI,QAAQ;AACV,cAAM,WAAW,QAAQ,YAAY;AACrC,cAAM,SAAS,IAAI,WAAW,QAAQ;AACtC,iBAAS,IAAI,QAAQ,iBAAiB,WAAW,YAAY,UAAU,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,KAAqB,MAA0B;AAC7D,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,SAAS,MAAM;AACzB,YAAI,SAAS,IAAI,QAAQ,gCAAgC;AAAA,MAC3D;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK;AAEf,YAAM,OAAO,IAAI;AACjB,YAAM,UAAU,IAAI,oBAAoB,KAAK,QAAQ;AACrD,UAAI,gBAAgB,iBAAiB,OAAO;AAC5C,UAAI,IAAI,KAAK,6BAA6B;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,IAAO,wBAAQ,0BAA0B;","names":[]}
|