@openacp/cli 0.6.8 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +100 -154
  2. package/dist/{action-detect-6M5GCGAU.js → action-detect-P7ZE4NEM.js} +2 -1
  3. package/dist/{adapter-7GY3N4ZH.js → adapter-ZOANORGM.js} +8 -7
  4. package/dist/{adapter-7GY3N4ZH.js.map → adapter-ZOANORGM.js.map} +1 -1
  5. package/dist/{admin-2HAFXQBG.js → admin-6SYB6XCZ.js} +2 -1
  6. package/dist/{agent-catalog-SBZQRYOD.js → agent-catalog-FC3HGDEQ.js} +2 -1
  7. package/dist/{agent-dependencies-QY5QSULV.js → agent-dependencies-4OWBMZWZ.js} +2 -1
  8. package/dist/{agent-registry-KZFSIRSJ.js → agent-registry-WT4NXPYG.js} +2 -1
  9. package/dist/{agent-store-CGE4G6PA.js → agent-store-VZLFPTZU.js} +2 -1
  10. package/dist/{agents-QJPHNWK2.js → agents-QO7DKARJ.js} +2 -1
  11. package/dist/{api-client-BH2JFHQW.js → api-client-CFQT5U7D.js} +2 -1
  12. package/dist/{autostart-6M3FZAKW.js → autostart-X33OGMX6.js} +2 -1
  13. package/dist/{chunk-RHE2JSYE.js → chunk-2HMQOC7N.js} +2 -2
  14. package/dist/{chunk-SHHMBGB3.js → chunk-33RP6K2O.js} +2 -2
  15. package/dist/{chunk-5SXG7X5D.js → chunk-CS3KCJ5D.js} +103 -55
  16. package/dist/chunk-CS3KCJ5D.js.map +1 -0
  17. package/dist/{chunk-47B7GNOE.js → chunk-LCRLAV4G.js} +541 -191
  18. package/dist/chunk-LCRLAV4G.js.map +1 -0
  19. package/dist/{chunk-LO4Y5WQ7.js → chunk-LGP2YGRL.js} +7 -7
  20. package/dist/{chunk-LO4Y5WQ7.js.map → chunk-LGP2YGRL.js.map} +1 -1
  21. package/dist/{chunk-MZXWCDBU.js → chunk-MKHUZLII.js} +4 -4
  22. package/dist/chunk-MKHUZLII.js.map +1 -0
  23. package/dist/{chunk-YEOY2PBJ.js → chunk-NVPG6JCL.js} +3 -3
  24. package/dist/{chunk-JUYDFUSN.js → chunk-OWP7RZ62.js} +38 -14
  25. package/dist/chunk-OWP7RZ62.js.map +1 -0
  26. package/dist/{chunk-5OVPEDUB.js → chunk-VOIJ6OY4.js} +2 -2
  27. package/dist/chunk-VUNV25KB.js +16 -0
  28. package/dist/{chunk-2J2RBYWN.js → chunk-WTZDAYZX.js} +2 -2
  29. package/dist/cli.js +53 -47
  30. package/dist/cli.js.map +1 -1
  31. package/dist/{config-CQAS6YHR.js → config-6S355X75.js} +3 -2
  32. package/dist/config-editor-QQTZMWGD.js +13 -0
  33. package/dist/{config-registry-HDXFES2D.js → config-registry-AHYI4MYL.js} +2 -1
  34. package/dist/{daemon-K33ZPSEZ.js → daemon-4CS6HMB5.js} +4 -3
  35. package/dist/{discord-VOHXRTCH.js → discord-OMC52Y54.js} +251 -94
  36. package/dist/discord-OMC52Y54.js.map +1 -0
  37. package/dist/dist-UHQK5CXN.js +21151 -0
  38. package/dist/dist-UHQK5CXN.js.map +1 -0
  39. package/dist/doctor-HZZ5BSHB.js +10 -0
  40. package/dist/{doctor-HASEBMUD.js → doctor-OLYBO3V3.js} +5 -4
  41. package/dist/index.js +11 -10
  42. package/dist/{install-cloudflared-FSILDS5J.js → install-cloudflared-Z7VCGOVG.js} +2 -1
  43. package/dist/{install-cloudflared-FSILDS5J.js.map → install-cloudflared-Z7VCGOVG.js.map} +1 -1
  44. package/dist/{install-jq-P6RUBKPV.js → install-jq-HUYSQWKR.js} +2 -1
  45. package/dist/{install-jq-P6RUBKPV.js.map → install-jq-HUYSQWKR.js.map} +1 -1
  46. package/dist/{integrate-O4OCR4SN.js → integrate-PNEHRY2I.js} +2 -1
  47. package/dist/{integrate-O4OCR4SN.js.map → integrate-PNEHRY2I.js.map} +1 -1
  48. package/dist/{log-RCVBXLTN.js → log-NXABYJTT.js} +2 -1
  49. package/dist/{main-DUXVFTDD.js → main-XOZCLFUK.js} +21 -20
  50. package/dist/main-XOZCLFUK.js.map +1 -0
  51. package/dist/{menu-XR2GET2B.js → menu-YY5MKHEK.js} +2 -1
  52. package/dist/{new-session-NHK7TOEW.js → new-session-FEO4J4VU.js} +2 -1
  53. package/dist/{post-upgrade-62LUHDJO.js → post-upgrade-CJG5I7M2.js} +6 -5
  54. package/dist/{post-upgrade-62LUHDJO.js.map → post-upgrade-CJG5I7M2.js.map} +1 -1
  55. package/dist/{session-O6ZPLJIZ.js → session-IUSI7P5S.js} +2 -1
  56. package/dist/{settings-6TF4WIGJ.js → settings-RQPAM4KC.js} +2 -1
  57. package/dist/{setup-RJCEB6FS.js → setup-XHS4OMPM.js} +6 -3
  58. package/dist/{suggest-RST5VOHB.js → suggest-7D6B542M.js} +3 -1
  59. package/dist/{suggest-RST5VOHB.js.map → suggest-7D6B542M.js.map} +1 -1
  60. package/dist/{tunnel-service-NJJH4I26.js → tunnel-service-CJLUH6SZ.js} +3 -2
  61. package/dist/{tunnel-service-NJJH4I26.js.map → tunnel-service-CJLUH6SZ.js.map} +1 -1
  62. package/dist/{version-AXXV6IV2.js → version-NQZBM5M7.js} +2 -1
  63. package/dist/version-NQZBM5M7.js.map +1 -0
  64. package/package.json +15 -1
  65. package/dist/chunk-47B7GNOE.js.map +0 -1
  66. package/dist/chunk-5SXG7X5D.js.map +0 -1
  67. package/dist/chunk-JUYDFUSN.js.map +0 -1
  68. package/dist/chunk-MZXWCDBU.js.map +0 -1
  69. package/dist/config-editor-37BM56WF.js +0 -12
  70. package/dist/discord-VOHXRTCH.js.map +0 -1
  71. package/dist/doctor-W4VGLDVM.js +0 -9
  72. package/dist/main-DUXVFTDD.js.map +0 -1
  73. /package/dist/{action-detect-6M5GCGAU.js.map → action-detect-P7ZE4NEM.js.map} +0 -0
  74. /package/dist/{admin-2HAFXQBG.js.map → admin-6SYB6XCZ.js.map} +0 -0
  75. /package/dist/{agent-catalog-SBZQRYOD.js.map → agent-catalog-FC3HGDEQ.js.map} +0 -0
  76. /package/dist/{agent-dependencies-QY5QSULV.js.map → agent-dependencies-4OWBMZWZ.js.map} +0 -0
  77. /package/dist/{agent-registry-KZFSIRSJ.js.map → agent-registry-WT4NXPYG.js.map} +0 -0
  78. /package/dist/{agent-store-CGE4G6PA.js.map → agent-store-VZLFPTZU.js.map} +0 -0
  79. /package/dist/{agents-QJPHNWK2.js.map → agents-QO7DKARJ.js.map} +0 -0
  80. /package/dist/{api-client-BH2JFHQW.js.map → api-client-CFQT5U7D.js.map} +0 -0
  81. /package/dist/{autostart-6M3FZAKW.js.map → autostart-X33OGMX6.js.map} +0 -0
  82. /package/dist/{chunk-RHE2JSYE.js.map → chunk-2HMQOC7N.js.map} +0 -0
  83. /package/dist/{chunk-SHHMBGB3.js.map → chunk-33RP6K2O.js.map} +0 -0
  84. /package/dist/{chunk-YEOY2PBJ.js.map → chunk-NVPG6JCL.js.map} +0 -0
  85. /package/dist/{chunk-5OVPEDUB.js.map → chunk-VOIJ6OY4.js.map} +0 -0
  86. /package/dist/{config-CQAS6YHR.js.map → chunk-VUNV25KB.js.map} +0 -0
  87. /package/dist/{chunk-2J2RBYWN.js.map → chunk-WTZDAYZX.js.map} +0 -0
  88. /package/dist/{config-editor-37BM56WF.js.map → config-6S355X75.js.map} +0 -0
  89. /package/dist/{config-registry-HDXFES2D.js.map → config-editor-QQTZMWGD.js.map} +0 -0
  90. /package/dist/{daemon-K33ZPSEZ.js.map → config-registry-AHYI4MYL.js.map} +0 -0
  91. /package/dist/{doctor-HASEBMUD.js.map → daemon-4CS6HMB5.js.map} +0 -0
  92. /package/dist/{doctor-W4VGLDVM.js.map → doctor-HZZ5BSHB.js.map} +0 -0
  93. /package/dist/{log-RCVBXLTN.js.map → doctor-OLYBO3V3.js.map} +0 -0
  94. /package/dist/{menu-XR2GET2B.js.map → log-NXABYJTT.js.map} +0 -0
  95. /package/dist/{new-session-NHK7TOEW.js.map → menu-YY5MKHEK.js.map} +0 -0
  96. /package/dist/{session-O6ZPLJIZ.js.map → new-session-FEO4J4VU.js.map} +0 -0
  97. /package/dist/{settings-6TF4WIGJ.js.map → session-IUSI7P5S.js.map} +0 -0
  98. /package/dist/{setup-RJCEB6FS.js.map → settings-RQPAM4KC.js.map} +0 -0
  99. /package/dist/{version-AXXV6IV2.js.map → setup-XHS4OMPM.js.map} +0 -0
@@ -0,0 +1,10 @@
1
+ import {
2
+ DoctorEngine
3
+ } from "./chunk-NVPG6JCL.js";
4
+ import "./chunk-33RP6K2O.js";
5
+ import "./chunk-GAK6PIBW.js";
6
+ import "./chunk-VUNV25KB.js";
7
+ export {
8
+ DoctorEngine
9
+ };
10
+ //# sourceMappingURL=doctor-HZZ5BSHB.js.map
@@ -2,13 +2,14 @@ import {
2
2
  handleDoctor,
3
3
  handleDoctorButton,
4
4
  runDoctorInline
5
- } from "./chunk-RHE2JSYE.js";
6
- import "./chunk-YEOY2PBJ.js";
7
- import "./chunk-SHHMBGB3.js";
5
+ } from "./chunk-2HMQOC7N.js";
6
+ import "./chunk-NVPG6JCL.js";
7
+ import "./chunk-33RP6K2O.js";
8
8
  import "./chunk-GAK6PIBW.js";
9
+ import "./chunk-VUNV25KB.js";
9
10
  export {
10
11
  handleDoctor,
11
12
  handleDoctorButton,
12
13
  runDoctorInline
13
14
  };
14
- //# sourceMappingURL=doctor-HASEBMUD.js.map
15
+ //# sourceMappingURL=doctor-OLYBO3V3.js.map
package/dist/index.js CHANGED
@@ -1,9 +1,7 @@
1
1
  import {
2
2
  TelegramAdapter
3
- } from "./chunk-5SXG7X5D.js";
4
- import "./chunk-JUYDFUSN.js";
5
- import "./chunk-YEOY2PBJ.js";
6
- import "./chunk-7QJS2XBD.js";
3
+ } from "./chunk-CS3KCJ5D.js";
4
+ import "./chunk-OWP7RZ62.js";
7
5
  import {
8
6
  AgentInstance,
9
7
  AgentManager,
@@ -33,17 +31,19 @@ import {
33
31
  UsageStore,
34
32
  nodeToWebReadable,
35
33
  nodeToWebWritable
36
- } from "./chunk-LO4Y5WQ7.js";
34
+ } from "./chunk-LGP2YGRL.js";
37
35
  import {
38
36
  ChannelAdapter
39
37
  } from "./chunk-LBIKITQT.js";
38
+ import "./chunk-NVPG6JCL.js";
40
39
  import "./chunk-NAMYZIS5.js";
40
+ import "./chunk-7QJS2XBD.js";
41
41
  import {
42
42
  getPidPath,
43
43
  getStatus,
44
44
  startDaemon,
45
45
  stopDaemon
46
- } from "./chunk-2J2RBYWN.js";
46
+ } from "./chunk-WTZDAYZX.js";
47
47
  import {
48
48
  AgentCatalog
49
49
  } from "./chunk-UKT3G5IA.js";
@@ -52,21 +52,21 @@ import {
52
52
  } from "./chunk-34M4OS5P.js";
53
53
  import {
54
54
  runConfigEditor
55
- } from "./chunk-MZXWCDBU.js";
55
+ } from "./chunk-MKHUZLII.js";
56
56
  import {
57
57
  installAutoStart,
58
58
  isAutoStartInstalled,
59
59
  isAutoStartSupported,
60
60
  uninstallAutoStart
61
61
  } from "./chunk-2CJ46J3C.js";
62
- import "./chunk-47B7GNOE.js";
62
+ import "./chunk-LCRLAV4G.js";
63
63
  import "./chunk-JKBFUAJK.js";
64
64
  import {
65
65
  installPlugin,
66
66
  listPlugins,
67
67
  loadAdapterFactory,
68
68
  uninstallPlugin
69
- } from "./chunk-5OVPEDUB.js";
69
+ } from "./chunk-VOIJ6OY4.js";
70
70
  import {
71
71
  CONFIG_REGISTRY,
72
72
  getConfigValue,
@@ -79,7 +79,7 @@ import {
79
79
  ConfigManager,
80
80
  PLUGINS_DIR,
81
81
  expandHome
82
- } from "./chunk-SHHMBGB3.js";
82
+ } from "./chunk-33RP6K2O.js";
83
83
  import {
84
84
  cleanupOldSessionLogs,
85
85
  createChildLogger,
@@ -89,6 +89,7 @@ import {
89
89
  setLogLevel,
90
90
  shutdownLogger
91
91
  } from "./chunk-GAK6PIBW.js";
92
+ import "./chunk-VUNV25KB.js";
92
93
  export {
93
94
  AgentCatalog,
94
95
  AgentInstance,
@@ -3,6 +3,7 @@ import {
3
3
  } from "./chunk-V5GZQEIY.js";
4
4
  import "./chunk-JKBFUAJK.js";
5
5
  import "./chunk-GAK6PIBW.js";
6
+ import "./chunk-VUNV25KB.js";
6
7
 
7
8
  // src/tunnel/providers/install-cloudflared.ts
8
9
  var CLOUDFLARED_SPEC = {
@@ -29,4 +30,4 @@ async function ensureCloudflared() {
29
30
  export {
30
31
  ensureCloudflared
31
32
  };
32
- //# sourceMappingURL=install-cloudflared-FSILDS5J.js.map
33
+ //# sourceMappingURL=install-cloudflared-Z7VCGOVG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tunnel/providers/install-cloudflared.ts"],"sourcesContent":["import { ensureBinary, type BinarySpec } from '../../core/install-binary.js'\n\nconst CLOUDFLARED_SPEC: BinarySpec = {\n name: 'cloudflared',\n githubBaseUrl: 'https://github.com/cloudflare/cloudflared/releases/latest/download',\n platforms: {\n darwin: {\n x64: 'cloudflared-darwin-amd64.tgz',\n arm64: 'cloudflared-darwin-amd64.tgz',\n },\n win32: {\n x64: 'cloudflared-windows-amd64.exe',\n },\n linux: {\n x64: 'cloudflared-linux-amd64',\n arm64: 'cloudflared-linux-arm64',\n },\n },\n isArchive: (url) => url.endsWith('.tgz'),\n}\n\nexport async function ensureCloudflared(): Promise<string> {\n return ensureBinary(CLOUDFLARED_SPEC)\n}\n"],"mappings":";;;;;;;AAEA,IAAM,mBAA+B;AAAA,EACnC,MAAM;AAAA,EACN,eAAe;AAAA,EACf,WAAW;AAAA,IACT,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,WAAW,CAAC,QAAQ,IAAI,SAAS,MAAM;AACzC;AAEA,eAAsB,oBAAqC;AACzD,SAAO,aAAa,gBAAgB;AACtC;","names":[]}
1
+ {"version":3,"sources":["../../src/tunnel/providers/install-cloudflared.ts"],"sourcesContent":["import { ensureBinary, type BinarySpec } from '../../core/install-binary.js'\n\nconst CLOUDFLARED_SPEC: BinarySpec = {\n name: 'cloudflared',\n githubBaseUrl: 'https://github.com/cloudflare/cloudflared/releases/latest/download',\n platforms: {\n darwin: {\n x64: 'cloudflared-darwin-amd64.tgz',\n arm64: 'cloudflared-darwin-amd64.tgz',\n },\n win32: {\n x64: 'cloudflared-windows-amd64.exe',\n },\n linux: {\n x64: 'cloudflared-linux-amd64',\n arm64: 'cloudflared-linux-arm64',\n },\n },\n isArchive: (url) => url.endsWith('.tgz'),\n}\n\nexport async function ensureCloudflared(): Promise<string> {\n return ensureBinary(CLOUDFLARED_SPEC)\n}\n"],"mappings":";;;;;;;;AAEA,IAAM,mBAA+B;AAAA,EACnC,MAAM;AAAA,EACN,eAAe;AAAA,EACf,WAAW;AAAA,IACT,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,WAAW,CAAC,QAAQ,IAAI,SAAS,MAAM;AACzC;AAEA,eAAsB,oBAAqC;AACzD,SAAO,aAAa,gBAAgB;AACtC;","names":[]}
@@ -3,6 +3,7 @@ import {
3
3
  } from "./chunk-V5GZQEIY.js";
4
4
  import "./chunk-JKBFUAJK.js";
5
5
  import "./chunk-GAK6PIBW.js";
6
+ import "./chunk-VUNV25KB.js";
6
7
 
7
8
  // src/core/install-jq.ts
8
9
  var JQ_SPEC = {
@@ -28,4 +29,4 @@ async function ensureJq() {
28
29
  export {
29
30
  ensureJq
30
31
  };
31
- //# sourceMappingURL=install-jq-P6RUBKPV.js.map
32
+ //# sourceMappingURL=install-jq-HUYSQWKR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/install-jq.ts"],"sourcesContent":["import { ensureBinary, type BinarySpec } from './install-binary.js'\n\nconst JQ_SPEC: BinarySpec = {\n name: 'jq',\n githubBaseUrl: 'https://github.com/jqlang/jq/releases/latest/download',\n platforms: {\n darwin: {\n x64: 'jq-macos-amd64',\n arm64: 'jq-macos-arm64',\n },\n win32: {\n x64: 'jq-windows-amd64.exe',\n },\n linux: {\n x64: 'jq-linux-amd64',\n arm64: 'jq-linux-arm64',\n },\n },\n}\n\nexport async function ensureJq(): Promise<string> {\n return ensureBinary(JQ_SPEC)\n}\n"],"mappings":";;;;;;;AAEA,IAAM,UAAsB;AAAA,EAC1B,MAAM;AAAA,EACN,eAAe;AAAA,EACf,WAAW;AAAA,IACT,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAsB,WAA4B;AAChD,SAAO,aAAa,OAAO;AAC7B;","names":[]}
1
+ {"version":3,"sources":["../../src/core/install-jq.ts"],"sourcesContent":["import { ensureBinary, type BinarySpec } from './install-binary.js'\n\nconst JQ_SPEC: BinarySpec = {\n name: 'jq',\n githubBaseUrl: 'https://github.com/jqlang/jq/releases/latest/download',\n platforms: {\n darwin: {\n x64: 'jq-macos-amd64',\n arm64: 'jq-macos-arm64',\n },\n win32: {\n x64: 'jq-windows-amd64.exe',\n },\n linux: {\n x64: 'jq-linux-amd64',\n arm64: 'jq-linux-arm64',\n },\n },\n}\n\nexport async function ensureJq(): Promise<string> {\n return ensureBinary(JQ_SPEC)\n}\n"],"mappings":";;;;;;;;AAEA,IAAM,UAAsB;AAAA,EAC1B,MAAM;AAAA,EACN,eAAe;AAAA,EACf,WAAW;AAAA,IACT,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAsB,WAA4B;AAChD,SAAO,aAAa,OAAO;AAC7B;","names":[]}
@@ -3,6 +3,7 @@ import {
3
3
  getAgentCapabilities,
4
4
  listAgentsWithIntegration
5
5
  } from "./chunk-JKBFUAJK.js";
6
+ import "./chunk-VUNV25KB.js";
6
7
 
7
8
  // src/cli/integrate.ts
8
9
  import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync, rmdirSync } from "fs";
@@ -369,4 +370,4 @@ export {
369
370
  listIntegrations,
370
371
  uninstallIntegration
371
372
  };
372
- //# sourceMappingURL=integrate-O4OCR4SN.js.map
373
+ //# sourceMappingURL=integrate-PNEHRY2I.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/integrate.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync, rmdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { getAgentCapabilities, commandExists, listAgentsWithIntegration } from \"../core/agent-dependencies.js\";\nimport type { AgentIntegrationSpec } from \"../core/agent-dependencies.js\";\n\nexport interface IntegrationResult {\n success: boolean;\n logs: string[];\n}\n\nexport interface IntegrationItem {\n id: string;\n name: string;\n description: string;\n isInstalled(): boolean;\n install(): Promise<IntegrationResult>;\n uninstall(): Promise<IntegrationResult>;\n}\n\nexport interface AgentIntegration {\n items: IntegrationItem[];\n}\n\nconst HOOK_MARKER = \"openacp-inject-session.sh\";\n\nfunction expandPath(p: string): string {\n return p.replace(/^~/, homedir());\n}\n\n// --- Script generators ---\n\nfunction generateInjectScript(_agentKey: string, spec: AgentIntegrationSpec): string {\n const sidVar = spec.sessionIdVar ?? \"SESSION_ID\";\n const cwdVar = spec.workingDirVar ?? \"WORKING_DIR\";\n\n // Resolve jq: check ~/.openacp/bin first, then PATH\n const jqResolver = `JQ=$(command -v jq 2>/dev/null || echo \"$HOME/.openacp/bin/jq\")`;\n\n if (spec.outputFormat === \"plaintext\") {\n return `#!/bin/bash\n${jqResolver}\nINPUT=$(cat)\nSESSION_ID=$(echo \"$INPUT\" | \"$JQ\" -r '${spec.sessionIdField}')\nCWD=$(echo \"$INPUT\" | \"$JQ\" -r '.cwd')\n\necho \"${sidVar}: $SESSION_ID\"\necho \"${cwdVar}: $CWD\"\n\nexit 0\n`;\n }\n\n // JSON output (Gemini, Cline, Cursor)\n return `#!/bin/bash\n${jqResolver}\nINPUT=$(cat)\nSESSION_ID=$(echo \"$INPUT\" | \"$JQ\" -r '${spec.sessionIdField}')\nCWD=$(echo \"$INPUT\" | \"$JQ\" -r '.cwd')\n\n\"$JQ\" -n --arg sid \"$SESSION_ID\" --arg cwd \"$CWD\" \\\\\n '{\"additionalContext\":\"${sidVar}: \\\\($sid)\\\\n${cwdVar}: \\\\($cwd)\"}'\n\nexit 0\n`;\n}\n\nfunction generateHandoffScript(agentKey: string): string {\n return `#!/bin/bash\nSESSION_ID=$1\nCWD=$2\nCHANNEL=$3\n\nif [ -z \"$SESSION_ID\" ]; then\n echo \"Usage: openacp-handoff.sh <session_id> [cwd] [channel]\"\n exit 1\nfi\n\nopenacp adopt ${agentKey} \"$SESSION_ID\" \\${CWD:+--cwd \"$CWD\"} \\${CHANNEL:+--channel \"$CHANNEL\"}\n`;\n}\n\nfunction generateTunnelCommand(): string {\n return `---\ndescription: Expose local ports to the internet. Use when user wants to share, preview, or access their local dev server remotely. Triggers on phrases like \"expose port\", \"map port\", \"share my app\", \"make it public\", \"open tunnel\", \"public URL\", \"share localhost\", \"preview on phone\", \"access from outside\", \"forward port\", \"ngrok\", \"cloudflare tunnel\", etc.\n---\n\nYou have access to OpenACP tunnel management via CLI. This creates a public URL for any local port (dev servers, APIs, static sites, etc.) using Cloudflare tunnel.\n\n## Commands\n\n\\`\\`\\`bash\n# Create a tunnel — exposes local port to the internet\nopenacp tunnel add <port> --label <name>\n\n# List all active tunnels with their public URLs\nopenacp tunnel list\n\n# Stop a specific tunnel\nopenacp tunnel stop <port>\n\n# Stop all tunnels\nopenacp tunnel stop-all\n\\`\\`\\`\n\n## When to use\n\nUser wants to:\n- **Share their local app** — \"share this on my phone\", \"let my friend see this\", \"preview on mobile\"\n- **Expose a port** — \"expose port 3000\", \"map port 5173\", \"make port 8080 public\"\n- **Get a public URL** — \"give me a public URL\", \"I need an external link\", \"make localhost accessible\"\n- **Open a tunnel** — \"open tunnel\", \"start tunnel\", \"tunnel this\", \"bật tunnel\"\n- **Forward/proxy a port** — \"forward port 3000\", \"proxy my server\"\n- **Deploy preview** — \"deploy preview\", \"share a preview link\"\n- **Access remotely** — \"access from my phone\", \"access from outside\"\n- **Manage tunnels** — \"show tunnels\", \"list tunnels\", \"stop tunnel\", \"close tunnel\", \"kill tunnel\"\n\n## How to respond\n\n1. Run the CLI command\n2. Share the public URL with the user\n3. Mention the URL works on any device (phone, tablet, other computer)\n4. If the user hasn't started a dev server yet, remind them to start one first\n\n## Example flow\n\nUser: \"I want to see this React app on my phone\"\n→ Check if dev server is running (e.g. port 5173 for Vite)\n→ Run: \\`openacp tunnel add 5173 --label react-app\\`\n→ Share the public URL\n`;\n}\n\nfunction generateHandoffCommand(_agentKey: string, spec: AgentIntegrationSpec): string {\n const sidVar = spec.sessionIdVar ?? \"SESSION_ID\";\n const cwdVar = spec.workingDirVar ?? \"WORKING_DIR\";\n const hooksDir = expandPath(spec.hooksDirPath);\n\n return `---\ndescription: Transfer current session to OpenACP (Telegram/Discord)\n---\n\nLook at the context injected at the start of this message to find\n${sidVar} and ${cwdVar}, then run:\n\nbash ${hooksDir}openacp-handoff.sh <${sidVar}> <${cwdVar}> <args if any>\n\nUsage: /openacp:handoff [channel]\n channel: telegram, discord, or omit for default adapter\n\nExamples:\n /openacp:handoff\n /openacp:handoff discord\n /openacp:handoff telegram\n`;\n}\n\n// --- Settings mergers ---\n\nfunction mergeSettingsJson(settingsPath: string, hookEvent: string, hookScriptPath: string): void {\n const fullPath = expandPath(settingsPath);\n let settings: Record<string, unknown> = {};\n\n if (existsSync(fullPath)) {\n const raw = readFileSync(fullPath, \"utf-8\");\n writeFileSync(`${fullPath}.bak`, raw);\n settings = JSON.parse(raw);\n }\n\n const hooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n settings.hooks = hooks;\n\n const eventHooks = (hooks[hookEvent] ?? []) as Array<{ hooks?: Array<{ type?: string; command?: string }> }>;\n hooks[hookEvent] = eventHooks;\n\n const alreadyInstalled = eventHooks.some((group) =>\n group.hooks?.some((h) => h.command?.includes(HOOK_MARKER)),\n );\n\n if (!alreadyInstalled) {\n eventHooks.push({\n hooks: [{ type: \"command\", command: hookScriptPath }],\n });\n }\n\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, JSON.stringify(settings, null, 2) + \"\\n\");\n}\n\nfunction mergeHooksJson(settingsPath: string, hookEvent: string, hookScriptPath: string): void {\n const fullPath = expandPath(settingsPath);\n let config: Record<string, unknown> = { version: 1 };\n\n if (existsSync(fullPath)) {\n const raw = readFileSync(fullPath, \"utf-8\");\n writeFileSync(`${fullPath}.bak`, raw);\n config = JSON.parse(raw);\n }\n\n const hooks = (config.hooks ?? {}) as Record<string, unknown[]>;\n config.hooks = hooks;\n\n const eventHooks = (hooks[hookEvent] ?? []) as Array<{ command?: string }>;\n hooks[hookEvent] = eventHooks;\n\n const alreadyInstalled = eventHooks.some((h) => h.command?.includes(HOOK_MARKER));\n\n if (!alreadyInstalled) {\n eventHooks.push({ command: hookScriptPath });\n }\n\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nfunction removeFromSettingsJson(settingsPath: string, hookEvent: string): void {\n const fullPath = expandPath(settingsPath);\n if (!existsSync(fullPath)) return;\n\n const raw = readFileSync(fullPath, \"utf-8\");\n const settings = JSON.parse(raw);\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.[hookEvent]) return;\n\n hooks[hookEvent] = (hooks[hookEvent] as Array<{ hooks?: Array<{ command?: string }> }>).filter(\n (group) => !group.hooks?.some((h) => h.command?.includes(\"openacp-\")),\n );\n\n if ((hooks[hookEvent] as unknown[]).length === 0) {\n delete hooks[hookEvent];\n }\n\n writeFileSync(fullPath, JSON.stringify(settings, null, 2) + \"\\n\");\n}\n\nfunction removeFromHooksJson(settingsPath: string, hookEvent: string): void {\n const fullPath = expandPath(settingsPath);\n if (!existsSync(fullPath)) return;\n\n const raw = readFileSync(fullPath, \"utf-8\");\n const config = JSON.parse(raw);\n const hooks = config.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.[hookEvent]) return;\n\n hooks[hookEvent] = (hooks[hookEvent] as Array<{ command?: string }>).filter(\n (h) => !h.command?.includes(\"openacp-\"),\n );\n\n if ((hooks[hookEvent] as unknown[]).length === 0) {\n delete hooks[hookEvent];\n }\n\n writeFileSync(fullPath, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\n// --- Core install/uninstall ---\n\nexport async function installIntegration(agentKey: string, spec: AgentIntegrationSpec): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n // Check jq\n if (!commandExists(\"jq\")) {\n return {\n success: false,\n logs: [\"jq is required for handoff hooks. Install: brew install jq (macOS) or apt install jq (Linux)\"],\n };\n }\n\n const hooksDir = expandPath(spec.hooksDirPath);\n mkdirSync(hooksDir, { recursive: true });\n\n // Inject script\n const injectPath = join(hooksDir, \"openacp-inject-session.sh\");\n writeFileSync(injectPath, generateInjectScript(agentKey, spec));\n chmodSync(injectPath, 0o755);\n logs.push(`Created ${injectPath}`);\n\n // Handoff script\n const handoffPath = join(hooksDir, \"openacp-handoff.sh\");\n writeFileSync(handoffPath, generateHandoffScript(agentKey));\n chmodSync(handoffPath, 0o755);\n logs.push(`Created ${handoffPath}`);\n\n // Slash command / skill\n if (spec.commandsPath && spec.handoffCommandName) {\n if (spec.commandFormat === \"skill\") {\n const skillDir = expandPath(join(spec.commandsPath, spec.handoffCommandName));\n mkdirSync(skillDir, { recursive: true });\n const skillPath = join(skillDir, \"SKILL.md\");\n writeFileSync(skillPath, generateHandoffCommand(agentKey, spec));\n logs.push(`Created ${skillPath}`);\n } else {\n const cmdsDir = expandPath(spec.commandsPath);\n mkdirSync(cmdsDir, { recursive: true });\n const cmdPath = join(cmdsDir, `${spec.handoffCommandName}.md`);\n writeFileSync(cmdPath, generateHandoffCommand(agentKey, spec));\n logs.push(`Created ${cmdPath}`);\n }\n }\n\n // Merge settings\n const injectFullPath = join(hooksDir, \"openacp-inject-session.sh\");\n if (spec.settingsFormat === \"hooks_json\") {\n mergeHooksJson(spec.settingsPath, spec.hookEvent, injectFullPath);\n } else {\n mergeSettingsJson(spec.settingsPath, spec.hookEvent, injectFullPath);\n }\n logs.push(`Updated ${expandPath(spec.settingsPath)}`);\n\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n}\n\nexport async function uninstallIntegration(agentKey: string, spec: AgentIntegrationSpec): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n const hooksDir = expandPath(spec.hooksDirPath);\n\n // Remove hook scripts\n for (const filename of [\"openacp-inject-session.sh\", \"openacp-handoff.sh\"]) {\n const filePath = join(hooksDir, filename);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n logs.push(`Removed ${filePath}`);\n }\n }\n\n // Remove slash command / skill\n if (spec.commandsPath && spec.handoffCommandName) {\n if (spec.commandFormat === \"skill\") {\n const skillDir = expandPath(join(spec.commandsPath, spec.handoffCommandName));\n const skillPath = join(skillDir, \"SKILL.md\");\n if (existsSync(skillPath)) {\n unlinkSync(skillPath);\n try { rmdirSync(skillDir); } catch { /* not empty */ }\n logs.push(`Removed ${skillPath}`);\n }\n } else {\n const cmdPath = expandPath(join(spec.commandsPath, `${spec.handoffCommandName}.md`));\n if (existsSync(cmdPath)) {\n unlinkSync(cmdPath);\n logs.push(`Removed ${cmdPath}`);\n }\n }\n }\n\n // Clean settings\n if (spec.settingsFormat === \"hooks_json\") {\n removeFromHooksJson(spec.settingsPath, spec.hookEvent);\n } else {\n removeFromSettingsJson(spec.settingsPath, spec.hookEvent);\n }\n logs.push(`Updated ${expandPath(spec.settingsPath)}`);\n\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n}\n\n// --- Public API (backward compat with existing cmdIntegrate / Telegram integrate) ---\n\nfunction buildHandoffItem(agentKey: string, spec: AgentIntegrationSpec): IntegrationItem {\n const hooksDir = expandPath(spec.hooksDirPath);\n return {\n id: \"handoff\",\n name: \"Handoff\",\n description: \"Transfer sessions between terminal and messaging platforms\",\n isInstalled(): boolean {\n return (\n existsSync(join(hooksDir, \"openacp-inject-session.sh\")) &&\n existsSync(join(hooksDir, \"openacp-handoff.sh\"))\n );\n },\n install: () => installIntegration(agentKey, spec),\n uninstall: () => uninstallIntegration(agentKey, spec),\n };\n}\n\nfunction getSkillBasePath(spec: AgentIntegrationSpec): string {\n // Skills go into the agent's skills directory (sibling to commands)\n // Claude: ~/.claude/skills/, Cursor: ~/.cursor/skills/\n const base = spec.commandsPath!;\n // If commandsPath is commands/, use skills/ instead\n const skillsBase = base.replace(/\\/commands\\/?$/, \"/skills/\");\n return expandPath(skillsBase);\n}\n\nfunction buildTunnelItem(spec: AgentIntegrationSpec): IntegrationItem | null {\n if (!spec.commandsPath) return null;\n\n function getTunnelPath(): string {\n return join(getSkillBasePath(spec), \"openacp-tunnel\", \"SKILL.md\");\n }\n\n return {\n id: \"tunnel\",\n name: \"Tunnel\",\n description: \"Expose local ports to the internet via OpenACP tunnel\",\n isInstalled(): boolean {\n return existsSync(getTunnelPath());\n },\n async install(): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n const skillPath = getTunnelPath();\n mkdirSync(dirname(skillPath), { recursive: true });\n writeFileSync(skillPath, generateTunnelCommand());\n logs.push(`Created ${skillPath}`);\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n },\n async uninstall(): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n const skillPath = getTunnelPath();\n if (existsSync(skillPath)) {\n unlinkSync(skillPath);\n try { rmdirSync(dirname(skillPath)); } catch { /* not empty */ }\n logs.push(`Removed ${skillPath}`);\n }\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n },\n };\n}\n\nexport function getIntegration(agentName: string): AgentIntegration | undefined {\n const caps = getAgentCapabilities(agentName);\n if (!caps.integration) return undefined;\n const items: IntegrationItem[] = [buildHandoffItem(agentName, caps.integration)];\n const tunnelItem = buildTunnelItem(caps.integration);\n if (tunnelItem) items.push(tunnelItem);\n return { items };\n}\n\nexport function listIntegrations(): string[] {\n return listAgentsWithIntegration();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/integrate.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync, rmdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { getAgentCapabilities, commandExists, listAgentsWithIntegration } from \"../core/agent-dependencies.js\";\nimport type { AgentIntegrationSpec } from \"../core/agent-dependencies.js\";\n\nexport interface IntegrationResult {\n success: boolean;\n logs: string[];\n}\n\nexport interface IntegrationItem {\n id: string;\n name: string;\n description: string;\n isInstalled(): boolean;\n install(): Promise<IntegrationResult>;\n uninstall(): Promise<IntegrationResult>;\n}\n\nexport interface AgentIntegration {\n items: IntegrationItem[];\n}\n\nconst HOOK_MARKER = \"openacp-inject-session.sh\";\n\nfunction expandPath(p: string): string {\n return p.replace(/^~/, homedir());\n}\n\n// --- Script generators ---\n\nfunction generateInjectScript(_agentKey: string, spec: AgentIntegrationSpec): string {\n const sidVar = spec.sessionIdVar ?? \"SESSION_ID\";\n const cwdVar = spec.workingDirVar ?? \"WORKING_DIR\";\n\n // Resolve jq: check ~/.openacp/bin first, then PATH\n const jqResolver = `JQ=$(command -v jq 2>/dev/null || echo \"$HOME/.openacp/bin/jq\")`;\n\n if (spec.outputFormat === \"plaintext\") {\n return `#!/bin/bash\n${jqResolver}\nINPUT=$(cat)\nSESSION_ID=$(echo \"$INPUT\" | \"$JQ\" -r '${spec.sessionIdField}')\nCWD=$(echo \"$INPUT\" | \"$JQ\" -r '.cwd')\n\necho \"${sidVar}: $SESSION_ID\"\necho \"${cwdVar}: $CWD\"\n\nexit 0\n`;\n }\n\n // JSON output (Gemini, Cline, Cursor)\n return `#!/bin/bash\n${jqResolver}\nINPUT=$(cat)\nSESSION_ID=$(echo \"$INPUT\" | \"$JQ\" -r '${spec.sessionIdField}')\nCWD=$(echo \"$INPUT\" | \"$JQ\" -r '.cwd')\n\n\"$JQ\" -n --arg sid \"$SESSION_ID\" --arg cwd \"$CWD\" \\\\\n '{\"additionalContext\":\"${sidVar}: \\\\($sid)\\\\n${cwdVar}: \\\\($cwd)\"}'\n\nexit 0\n`;\n}\n\nfunction generateHandoffScript(agentKey: string): string {\n return `#!/bin/bash\nSESSION_ID=$1\nCWD=$2\nCHANNEL=$3\n\nif [ -z \"$SESSION_ID\" ]; then\n echo \"Usage: openacp-handoff.sh <session_id> [cwd] [channel]\"\n exit 1\nfi\n\nopenacp adopt ${agentKey} \"$SESSION_ID\" \\${CWD:+--cwd \"$CWD\"} \\${CHANNEL:+--channel \"$CHANNEL\"}\n`;\n}\n\nfunction generateTunnelCommand(): string {\n return `---\ndescription: Expose local ports to the internet. Use when user wants to share, preview, or access their local dev server remotely. Triggers on phrases like \"expose port\", \"map port\", \"share my app\", \"make it public\", \"open tunnel\", \"public URL\", \"share localhost\", \"preview on phone\", \"access from outside\", \"forward port\", \"ngrok\", \"cloudflare tunnel\", etc.\n---\n\nYou have access to OpenACP tunnel management via CLI. This creates a public URL for any local port (dev servers, APIs, static sites, etc.) using Cloudflare tunnel.\n\n## Commands\n\n\\`\\`\\`bash\n# Create a tunnel — exposes local port to the internet\nopenacp tunnel add <port> --label <name>\n\n# List all active tunnels with their public URLs\nopenacp tunnel list\n\n# Stop a specific tunnel\nopenacp tunnel stop <port>\n\n# Stop all tunnels\nopenacp tunnel stop-all\n\\`\\`\\`\n\n## When to use\n\nUser wants to:\n- **Share their local app** — \"share this on my phone\", \"let my friend see this\", \"preview on mobile\"\n- **Expose a port** — \"expose port 3000\", \"map port 5173\", \"make port 8080 public\"\n- **Get a public URL** — \"give me a public URL\", \"I need an external link\", \"make localhost accessible\"\n- **Open a tunnel** — \"open tunnel\", \"start tunnel\", \"tunnel this\", \"bật tunnel\"\n- **Forward/proxy a port** — \"forward port 3000\", \"proxy my server\"\n- **Deploy preview** — \"deploy preview\", \"share a preview link\"\n- **Access remotely** — \"access from my phone\", \"access from outside\"\n- **Manage tunnels** — \"show tunnels\", \"list tunnels\", \"stop tunnel\", \"close tunnel\", \"kill tunnel\"\n\n## How to respond\n\n1. Run the CLI command\n2. Share the public URL with the user\n3. Mention the URL works on any device (phone, tablet, other computer)\n4. If the user hasn't started a dev server yet, remind them to start one first\n\n## Example flow\n\nUser: \"I want to see this React app on my phone\"\n→ Check if dev server is running (e.g. port 5173 for Vite)\n→ Run: \\`openacp tunnel add 5173 --label react-app\\`\n→ Share the public URL\n`;\n}\n\nfunction generateHandoffCommand(_agentKey: string, spec: AgentIntegrationSpec): string {\n const sidVar = spec.sessionIdVar ?? \"SESSION_ID\";\n const cwdVar = spec.workingDirVar ?? \"WORKING_DIR\";\n const hooksDir = expandPath(spec.hooksDirPath);\n\n return `---\ndescription: Transfer current session to OpenACP (Telegram/Discord)\n---\n\nLook at the context injected at the start of this message to find\n${sidVar} and ${cwdVar}, then run:\n\nbash ${hooksDir}openacp-handoff.sh <${sidVar}> <${cwdVar}> <args if any>\n\nUsage: /openacp:handoff [channel]\n channel: telegram, discord, or omit for default adapter\n\nExamples:\n /openacp:handoff\n /openacp:handoff discord\n /openacp:handoff telegram\n`;\n}\n\n// --- Settings mergers ---\n\nfunction mergeSettingsJson(settingsPath: string, hookEvent: string, hookScriptPath: string): void {\n const fullPath = expandPath(settingsPath);\n let settings: Record<string, unknown> = {};\n\n if (existsSync(fullPath)) {\n const raw = readFileSync(fullPath, \"utf-8\");\n writeFileSync(`${fullPath}.bak`, raw);\n settings = JSON.parse(raw);\n }\n\n const hooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n settings.hooks = hooks;\n\n const eventHooks = (hooks[hookEvent] ?? []) as Array<{ hooks?: Array<{ type?: string; command?: string }> }>;\n hooks[hookEvent] = eventHooks;\n\n const alreadyInstalled = eventHooks.some((group) =>\n group.hooks?.some((h) => h.command?.includes(HOOK_MARKER)),\n );\n\n if (!alreadyInstalled) {\n eventHooks.push({\n hooks: [{ type: \"command\", command: hookScriptPath }],\n });\n }\n\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, JSON.stringify(settings, null, 2) + \"\\n\");\n}\n\nfunction mergeHooksJson(settingsPath: string, hookEvent: string, hookScriptPath: string): void {\n const fullPath = expandPath(settingsPath);\n let config: Record<string, unknown> = { version: 1 };\n\n if (existsSync(fullPath)) {\n const raw = readFileSync(fullPath, \"utf-8\");\n writeFileSync(`${fullPath}.bak`, raw);\n config = JSON.parse(raw);\n }\n\n const hooks = (config.hooks ?? {}) as Record<string, unknown[]>;\n config.hooks = hooks;\n\n const eventHooks = (hooks[hookEvent] ?? []) as Array<{ command?: string }>;\n hooks[hookEvent] = eventHooks;\n\n const alreadyInstalled = eventHooks.some((h) => h.command?.includes(HOOK_MARKER));\n\n if (!alreadyInstalled) {\n eventHooks.push({ command: hookScriptPath });\n }\n\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nfunction removeFromSettingsJson(settingsPath: string, hookEvent: string): void {\n const fullPath = expandPath(settingsPath);\n if (!existsSync(fullPath)) return;\n\n const raw = readFileSync(fullPath, \"utf-8\");\n const settings = JSON.parse(raw);\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.[hookEvent]) return;\n\n hooks[hookEvent] = (hooks[hookEvent] as Array<{ hooks?: Array<{ command?: string }> }>).filter(\n (group) => !group.hooks?.some((h) => h.command?.includes(\"openacp-\")),\n );\n\n if ((hooks[hookEvent] as unknown[]).length === 0) {\n delete hooks[hookEvent];\n }\n\n writeFileSync(fullPath, JSON.stringify(settings, null, 2) + \"\\n\");\n}\n\nfunction removeFromHooksJson(settingsPath: string, hookEvent: string): void {\n const fullPath = expandPath(settingsPath);\n if (!existsSync(fullPath)) return;\n\n const raw = readFileSync(fullPath, \"utf-8\");\n const config = JSON.parse(raw);\n const hooks = config.hooks as Record<string, unknown[]> | undefined;\n if (!hooks?.[hookEvent]) return;\n\n hooks[hookEvent] = (hooks[hookEvent] as Array<{ command?: string }>).filter(\n (h) => !h.command?.includes(\"openacp-\"),\n );\n\n if ((hooks[hookEvent] as unknown[]).length === 0) {\n delete hooks[hookEvent];\n }\n\n writeFileSync(fullPath, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\n// --- Core install/uninstall ---\n\nexport async function installIntegration(agentKey: string, spec: AgentIntegrationSpec): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n // Check jq\n if (!commandExists(\"jq\")) {\n return {\n success: false,\n logs: [\"jq is required for handoff hooks. Install: brew install jq (macOS) or apt install jq (Linux)\"],\n };\n }\n\n const hooksDir = expandPath(spec.hooksDirPath);\n mkdirSync(hooksDir, { recursive: true });\n\n // Inject script\n const injectPath = join(hooksDir, \"openacp-inject-session.sh\");\n writeFileSync(injectPath, generateInjectScript(agentKey, spec));\n chmodSync(injectPath, 0o755);\n logs.push(`Created ${injectPath}`);\n\n // Handoff script\n const handoffPath = join(hooksDir, \"openacp-handoff.sh\");\n writeFileSync(handoffPath, generateHandoffScript(agentKey));\n chmodSync(handoffPath, 0o755);\n logs.push(`Created ${handoffPath}`);\n\n // Slash command / skill\n if (spec.commandsPath && spec.handoffCommandName) {\n if (spec.commandFormat === \"skill\") {\n const skillDir = expandPath(join(spec.commandsPath, spec.handoffCommandName));\n mkdirSync(skillDir, { recursive: true });\n const skillPath = join(skillDir, \"SKILL.md\");\n writeFileSync(skillPath, generateHandoffCommand(agentKey, spec));\n logs.push(`Created ${skillPath}`);\n } else {\n const cmdsDir = expandPath(spec.commandsPath);\n mkdirSync(cmdsDir, { recursive: true });\n const cmdPath = join(cmdsDir, `${spec.handoffCommandName}.md`);\n writeFileSync(cmdPath, generateHandoffCommand(agentKey, spec));\n logs.push(`Created ${cmdPath}`);\n }\n }\n\n // Merge settings\n const injectFullPath = join(hooksDir, \"openacp-inject-session.sh\");\n if (spec.settingsFormat === \"hooks_json\") {\n mergeHooksJson(spec.settingsPath, spec.hookEvent, injectFullPath);\n } else {\n mergeSettingsJson(spec.settingsPath, spec.hookEvent, injectFullPath);\n }\n logs.push(`Updated ${expandPath(spec.settingsPath)}`);\n\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n}\n\nexport async function uninstallIntegration(agentKey: string, spec: AgentIntegrationSpec): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n const hooksDir = expandPath(spec.hooksDirPath);\n\n // Remove hook scripts\n for (const filename of [\"openacp-inject-session.sh\", \"openacp-handoff.sh\"]) {\n const filePath = join(hooksDir, filename);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n logs.push(`Removed ${filePath}`);\n }\n }\n\n // Remove slash command / skill\n if (spec.commandsPath && spec.handoffCommandName) {\n if (spec.commandFormat === \"skill\") {\n const skillDir = expandPath(join(spec.commandsPath, spec.handoffCommandName));\n const skillPath = join(skillDir, \"SKILL.md\");\n if (existsSync(skillPath)) {\n unlinkSync(skillPath);\n try { rmdirSync(skillDir); } catch { /* not empty */ }\n logs.push(`Removed ${skillPath}`);\n }\n } else {\n const cmdPath = expandPath(join(spec.commandsPath, `${spec.handoffCommandName}.md`));\n if (existsSync(cmdPath)) {\n unlinkSync(cmdPath);\n logs.push(`Removed ${cmdPath}`);\n }\n }\n }\n\n // Clean settings\n if (spec.settingsFormat === \"hooks_json\") {\n removeFromHooksJson(spec.settingsPath, spec.hookEvent);\n } else {\n removeFromSettingsJson(spec.settingsPath, spec.hookEvent);\n }\n logs.push(`Updated ${expandPath(spec.settingsPath)}`);\n\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n}\n\n// --- Public API (backward compat with existing cmdIntegrate / Telegram integrate) ---\n\nfunction buildHandoffItem(agentKey: string, spec: AgentIntegrationSpec): IntegrationItem {\n const hooksDir = expandPath(spec.hooksDirPath);\n return {\n id: \"handoff\",\n name: \"Handoff\",\n description: \"Transfer sessions between terminal and messaging platforms\",\n isInstalled(): boolean {\n return (\n existsSync(join(hooksDir, \"openacp-inject-session.sh\")) &&\n existsSync(join(hooksDir, \"openacp-handoff.sh\"))\n );\n },\n install: () => installIntegration(agentKey, spec),\n uninstall: () => uninstallIntegration(agentKey, spec),\n };\n}\n\nfunction getSkillBasePath(spec: AgentIntegrationSpec): string {\n // Skills go into the agent's skills directory (sibling to commands)\n // Claude: ~/.claude/skills/, Cursor: ~/.cursor/skills/\n const base = spec.commandsPath!;\n // If commandsPath is commands/, use skills/ instead\n const skillsBase = base.replace(/\\/commands\\/?$/, \"/skills/\");\n return expandPath(skillsBase);\n}\n\nfunction buildTunnelItem(spec: AgentIntegrationSpec): IntegrationItem | null {\n if (!spec.commandsPath) return null;\n\n function getTunnelPath(): string {\n return join(getSkillBasePath(spec), \"openacp-tunnel\", \"SKILL.md\");\n }\n\n return {\n id: \"tunnel\",\n name: \"Tunnel\",\n description: \"Expose local ports to the internet via OpenACP tunnel\",\n isInstalled(): boolean {\n return existsSync(getTunnelPath());\n },\n async install(): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n const skillPath = getTunnelPath();\n mkdirSync(dirname(skillPath), { recursive: true });\n writeFileSync(skillPath, generateTunnelCommand());\n logs.push(`Created ${skillPath}`);\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n },\n async uninstall(): Promise<IntegrationResult> {\n const logs: string[] = [];\n try {\n const skillPath = getTunnelPath();\n if (existsSync(skillPath)) {\n unlinkSync(skillPath);\n try { rmdirSync(dirname(skillPath)); } catch { /* not empty */ }\n logs.push(`Removed ${skillPath}`);\n }\n return { success: true, logs };\n } catch (err) {\n logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);\n return { success: false, logs };\n }\n },\n };\n}\n\nexport function getIntegration(agentName: string): AgentIntegration | undefined {\n const caps = getAgentCapabilities(agentName);\n if (!caps.integration) return undefined;\n const items: IntegrationItem[] = [buildHandoffItem(agentName, caps.integration)];\n const tunnelItem = buildTunnelItem(caps.integration);\n if (tunnelItem) items.push(tunnelItem);\n return { items };\n}\n\nexport function listIntegrations(): string[] {\n return listAgentsWithIntegration();\n}\n"],"mappings":"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","names":[]}
@@ -9,6 +9,7 @@ import {
9
9
  shutdownLogger,
10
10
  unmuteLogger
11
11
  } from "./chunk-GAK6PIBW.js";
12
+ import "./chunk-VUNV25KB.js";
12
13
  export {
13
14
  cleanupOldSessionLogs,
14
15
  createChildLogger,
@@ -20,4 +21,4 @@ export {
20
21
  shutdownLogger,
21
22
  unmuteLogger
22
23
  };
23
- //# sourceMappingURL=log-RCVBXLTN.js.map
24
+ //# sourceMappingURL=log-NXABYJTT.js.map
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  TelegramAdapter
4
- } from "./chunk-5SXG7X5D.js";
5
- import "./chunk-JUYDFUSN.js";
6
- import "./chunk-YEOY2PBJ.js";
7
- import "./chunk-7QJS2XBD.js";
4
+ } from "./chunk-CS3KCJ5D.js";
5
+ import "./chunk-OWP7RZ62.js";
8
6
  import {
9
7
  ApiServer,
10
8
  OpenACPCore,
11
9
  TopicManager
12
- } from "./chunk-LO4Y5WQ7.js";
10
+ } from "./chunk-LGP2YGRL.js";
13
11
  import "./chunk-LBIKITQT.js";
12
+ import "./chunk-NVPG6JCL.js";
14
13
  import "./chunk-NAMYZIS5.js";
15
- import "./chunk-2J2RBYWN.js";
14
+ import "./chunk-7QJS2XBD.js";
15
+ import "./chunk-WTZDAYZX.js";
16
16
  import "./chunk-UKT3G5IA.js";
17
17
  import "./chunk-34M4OS5P.js";
18
- import "./chunk-MZXWCDBU.js";
18
+ import "./chunk-MKHUZLII.js";
19
19
  import "./chunk-2CJ46J3C.js";
20
- import "./chunk-47B7GNOE.js";
20
+ import "./chunk-LCRLAV4G.js";
21
21
  import "./chunk-JKBFUAJK.js";
22
22
  import {
23
23
  loadAdapterFactory
24
- } from "./chunk-5OVPEDUB.js";
24
+ } from "./chunk-VOIJ6OY4.js";
25
25
  import "./chunk-JHYXKVV2.js";
26
26
  import {
27
27
  ConfigManager
28
- } from "./chunk-SHHMBGB3.js";
28
+ } from "./chunk-33RP6K2O.js";
29
29
  import {
30
30
  cleanupOldSessionLogs,
31
31
  initLogger,
@@ -34,13 +34,14 @@ import {
34
34
  shutdownLogger,
35
35
  unmuteLogger
36
36
  } from "./chunk-GAK6PIBW.js";
37
+ import "./chunk-VUNV25KB.js";
37
38
 
38
39
  // src/main.ts
39
40
  var RESTART_EXIT_CODE = 75;
40
41
  var shuttingDown = false;
41
42
  async function startServer() {
42
43
  if (process.argv.includes("--daemon-child")) {
43
- const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-K33ZPSEZ.js");
44
+ const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-4CS6HMB5.js");
44
45
  if (!shouldAutoStart()) {
45
46
  process.exit(0);
46
47
  }
@@ -59,7 +60,7 @@ async function startServer() {
59
60
  const configManager = new ConfigManager();
60
61
  const configExists = await configManager.exists();
61
62
  if (!configExists) {
62
- const { runSetup } = await import("./setup-RJCEB6FS.js");
63
+ const { runSetup } = await import("./setup-XHS4OMPM.js");
63
64
  const shouldStart = await runSetup(configManager);
64
65
  if (!shouldStart) process.exit(0);
65
66
  }
@@ -69,7 +70,7 @@ async function startServer() {
69
70
  log.debug({ configPath: configManager.getConfigPath() }, "Config loaded");
70
71
  const isForegroundTTY = !!(process.stdout.isTTY && !process.env.NO_COLOR && config.runMode !== "daemon");
71
72
  if (isForegroundTTY) {
72
- const { printStartBanner } = await import("./setup-RJCEB6FS.js");
73
+ const { printStartBanner } = await import("./setup-XHS4OMPM.js");
73
74
  await printStartBanner();
74
75
  }
75
76
  let spinner;
@@ -79,7 +80,7 @@ async function startServer() {
79
80
  spinner = ora({ text: "Starting OpenACP...", spinner: "dots" }).start();
80
81
  }
81
82
  try {
82
- const { runPostUpgradeChecks } = await import("./post-upgrade-62LUHDJO.js");
83
+ const { runPostUpgradeChecks } = await import("./post-upgrade-CJG5I7M2.js");
83
84
  await runPostUpgradeChecks(config);
84
85
  } catch (err) {
85
86
  log.warn({ err }, "Post-upgrade check failed");
@@ -90,7 +91,7 @@ async function startServer() {
90
91
  const core = new OpenACPCore(configManager);
91
92
  let tunnelService;
92
93
  if (config.tunnel.enabled) {
93
- const { TunnelService } = await import("./tunnel-service-NJJH4I26.js");
94
+ const { TunnelService } = await import("./tunnel-service-CJLUH6SZ.js");
94
95
  tunnelService = new TunnelService(config.tunnel);
95
96
  const publicUrl = await tunnelService.start();
96
97
  core.tunnelService = tunnelService;
@@ -102,12 +103,12 @@ async function startServer() {
102
103
  core.registerAdapter("telegram", new TelegramAdapter(core, channelConfig));
103
104
  log.info({ adapter: "telegram" }, "Adapter registered");
104
105
  } else if (channelName === "slack") {
105
- const { SlackAdapter } = await import("./adapter-7GY3N4ZH.js");
106
+ const { SlackAdapter } = await import("./adapter-ZOANORGM.js");
106
107
  const slackConfig = channelConfig;
107
108
  core.registerAdapter("slack", new SlackAdapter(core, slackConfig));
108
109
  log.info({ adapter: "slack" }, "Adapter registered");
109
110
  } else if (channelName === "discord") {
110
- const { DiscordAdapter } = await import("./discord-VOHXRTCH.js");
111
+ const { DiscordAdapter } = await import("./discord-OMC52Y54.js");
111
112
  const discordConfig = channelConfig;
112
113
  core.registerAdapter("discord", new DiscordAdapter(core, discordConfig));
113
114
  log.info({ adapter: "discord" }, "Adapter registered");
@@ -144,13 +145,13 @@ async function startServer() {
144
145
  }
145
146
  const isDaemon = process.argv.includes("--daemon-child");
146
147
  if (isDaemon) {
147
- const { removePidFile, getPidPath } = await import("./daemon-K33ZPSEZ.js");
148
+ const { removePidFile, getPidPath } = await import("./daemon-4CS6HMB5.js");
148
149
  removePidFile(getPidPath());
149
150
  }
150
151
  if (exitCode === RESTART_EXIT_CODE) {
151
152
  if (isDaemon) {
152
153
  const { spawn: spawnChild } = await import("child_process");
153
- const { expandHome } = await import("./config-CQAS6YHR.js");
154
+ const { expandHome } = await import("./config-6S355X75.js");
154
155
  const fs = await import("fs");
155
156
  const pathMod = await import("path");
156
157
  const cliPath = pathMod.resolve(process.argv[1]);
@@ -234,4 +235,4 @@ export {
234
235
  RESTART_EXIT_CODE,
235
236
  startServer
236
237
  };
237
- //# sourceMappingURL=main-DUXVFTDD.js.map
238
+ //# sourceMappingURL=main-XOZCLFUK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ConfigManager } from './core/config.js'\nimport { OpenACPCore } from './core/core.js'\nimport { loadAdapterFactory } from './core/plugin-manager.js'\nimport { initLogger, shutdownLogger, cleanupOldSessionLogs, log, muteLogger, unmuteLogger } from './core/log.js'\nimport { TelegramAdapter } from './adapters/telegram/index.js'\nimport type { TelegramChannelConfig } from './adapters/telegram/index.js'\nimport { ApiServer } from './core/api-server.js'\nimport { TopicManager } from './core/topic-manager.js'\n\nexport const RESTART_EXIT_CODE = 75\nlet shuttingDown = false\n\nexport async function startServer() {\n // 0. If running as daemon child, check state and write PID file\n if (process.argv.includes('--daemon-child')) {\n const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import('./core/daemon.js')\n\n // Only auto-start if the daemon was previously running (user started it)\n if (!shouldAutoStart()) {\n process.exit(0)\n }\n\n const pidPath = getPidPath()\n const existingPid = readPidFile(pidPath)\n if (existingPid !== null && existingPid !== process.pid) {\n try {\n process.kill(existingPid, 0)\n console.error(`Another OpenACP instance is already running (PID ${existingPid}). Exiting.`)\n process.exit(1)\n } catch {\n // Stale PID file — safe to overwrite\n }\n }\n writePidFile(pidPath, process.pid)\n }\n\n // 1. Check config exists, run setup if not\n const configManager = new ConfigManager()\n const configExists = await configManager.exists()\n\n if (!configExists) {\n const { runSetup } = await import('./core/setup/index.js')\n const shouldStart = await runSetup(configManager)\n if (!shouldStart) process.exit(0)\n }\n\n // 2. Load config (validates with Zod)\n await configManager.load()\n const config = configManager.get()\n initLogger(config.logging)\n log.debug({ configPath: configManager.getConfigPath() }, 'Config loaded')\n\n // Show banner in foreground TTY mode (not daemon, not piped)\n const isForegroundTTY = !!(process.stdout.isTTY && !process.env.NO_COLOR && config.runMode !== 'daemon')\n if (isForegroundTTY) {\n const { printStartBanner } = await import('./core/setup/index.js')\n await printStartBanner()\n }\n\n // Mute pino during startup, show spinner instead\n let spinner: ReturnType<typeof import('ora').default> | undefined\n if (isForegroundTTY) {\n muteLogger()\n const ora = (await import('ora')).default\n spinner = ora({ text: 'Starting OpenACP...', spinner: 'dots' }).start()\n }\n\n // Post-upgrade dependency check (blocking — must complete before server start)\n try {\n const { runPostUpgradeChecks } = await import('./core/post-upgrade.js')\n await runPostUpgradeChecks(config)\n } catch (err) {\n log.warn({ err }, 'Post-upgrade check failed')\n }\n\n // Async cleanup of old session logs (non-blocking)\n cleanupOldSessionLogs(config.logging.sessionLogRetentionDays).catch(err =>\n log.warn({ err }, 'Session log cleanup failed')\n )\n\n // 3. Create core\n const core = new OpenACPCore(configManager)\n\n // 3.5 Start tunnel if configured\n let tunnelService: import('./tunnel/tunnel-service.js').TunnelService | undefined\n if (config.tunnel.enabled) {\n const { TunnelService } = await import('./tunnel/tunnel-service.js')\n tunnelService = new TunnelService(config.tunnel)\n const publicUrl = await tunnelService.start()\n core.tunnelService = tunnelService\n log.info({ publicUrl }, 'Tunnel started')\n }\n\n // 4. Register adapters from config\n for (const [channelName, channelConfig] of Object.entries(config.channels)) {\n if (!channelConfig.enabled) continue\n\n if (channelName === 'telegram') {\n core.registerAdapter('telegram', new TelegramAdapter(core, channelConfig as TelegramChannelConfig))\n log.info({ adapter: 'telegram' }, 'Adapter registered')\n } else if (channelName === 'slack') {\n const { SlackAdapter } = await import('./adapters/slack/adapter.js')\n const slackConfig = channelConfig as import('./adapters/slack/types.js').SlackChannelConfig\n core.registerAdapter('slack', new SlackAdapter(core, slackConfig))\n log.info({ adapter: 'slack' }, 'Adapter registered')\n } else if (channelName === 'discord') {\n const { DiscordAdapter } = await import('./adapters/discord/index.js')\n const discordConfig = channelConfig as import('./adapters/discord/types.js').DiscordChannelConfig\n core.registerAdapter('discord', new DiscordAdapter(core, discordConfig))\n log.info({ adapter: 'discord' }, 'Adapter registered')\n } else if (channelConfig.adapter) {\n // Plugin adapter\n const factory = await loadAdapterFactory(channelConfig.adapter)\n if (factory) {\n const adapter = factory.createAdapter(core, channelConfig)\n core.registerAdapter(channelName, adapter)\n log.info({ adapter: channelName, plugin: channelConfig.adapter }, 'Adapter registered')\n } else {\n const name = channelName\n const err = channelConfig.adapter\n log.error({ adapter: name, err }, 'Failed to load adapter')\n }\n } else {\n log.error({ adapter: channelName }, 'Channel has no built-in adapter; set \"adapter\" field to a plugin package')\n }\n }\n\n if (core.adapters.size === 0) {\n log.error('No channels enabled. Enable at least one channel in config.')\n process.exit(1)\n }\n\n // 5. Start\n let apiServer: ApiServer | undefined\n\n const shutdown = async (signal: string, exitCode = 0) => {\n if (shuttingDown) return\n shuttingDown = true\n log.info({ signal, exitCode }, 'Signal received, shutting down')\n\n try {\n if (apiServer) await apiServer.stop()\n await core.stop()\n if (tunnelService) await tunnelService.stop()\n } catch (err) {\n log.error({ err }, 'Error during shutdown')\n }\n\n const isDaemon = process.argv.includes('--daemon-child')\n\n // Clean up PID file if running as daemon\n if (isDaemon) {\n const { removePidFile, getPidPath } = await import('./core/daemon.js')\n removePidFile(getPidPath())\n }\n\n // Self-respawn on restart\n if (exitCode === RESTART_EXIT_CODE) {\n if (isDaemon) {\n // Daemon mode: spawn detached child writing to log file\n const { spawn: spawnChild } = await import('node:child_process')\n const { expandHome } = await import('./core/config.js')\n const fs = await import('node:fs')\n const pathMod = await import('node:path')\n\n const cliPath = pathMod.resolve(process.argv[1])\n const resolvedLogDir = expandHome(config.logging.logDir)\n fs.mkdirSync(resolvedLogDir, { recursive: true })\n const logFile = pathMod.join(resolvedLogDir, 'openacp.log')\n const out = fs.openSync(logFile, 'a')\n const err = fs.openSync(logFile, 'a')\n\n const child = spawnChild(process.execPath, [cliPath, '--daemon-child'], {\n detached: true,\n stdio: ['ignore', out, err],\n env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: '1' },\n })\n fs.closeSync(out)\n fs.closeSync(err)\n child.unref()\n log.info({ newPid: child.pid }, 'Respawned daemon for restart')\n } else if (!process.env.OPENACP_DEV_LOOP) {\n // Foreground production mode: spawn replacement process with inherited stdio\n const { spawn: spawnChild } = await import('node:child_process')\n const child = spawnChild(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: '1' },\n })\n await shutdownLogger()\n child.on('exit', (code) => process.exit(code ?? 0))\n return\n }\n }\n\n await shutdownLogger()\n process.exit(exitCode)\n }\n\n // Expose restart trigger for adapters (e.g. /restart command)\n core.requestRestart = () => shutdown('restart', RESTART_EXIT_CODE)\n\n process.on('SIGINT', () => shutdown('SIGINT'))\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n\n process.on('uncaughtException', (err) => {\n log.error({ err }, 'Uncaught exception')\n })\n\n process.on('unhandledRejection', (err) => {\n log.error({ err }, 'Unhandled rejection')\n })\n\n await core.start()\n\n const updatedConfig = core.configManager.get()\n const telegramAdapter = core.adapters.get('telegram') ?? null\n let topicManager: TopicManager | undefined\n if (telegramAdapter) {\n const telegramCfg = updatedConfig.channels?.telegram as TelegramChannelConfig | undefined\n topicManager = new TopicManager(\n core.sessionManager,\n telegramAdapter,\n {\n notificationTopicId: telegramCfg?.notificationTopicId ?? null,\n assistantTopicId: telegramCfg?.assistantTopicId ?? null,\n },\n )\n }\n\n apiServer = new ApiServer(core, config.api, undefined, topicManager)\n await apiServer.start()\n\n // 6. Log ready\n if (isForegroundTTY) {\n if (spinner) spinner.stop()\n const ok = (msg: string) => console.log(`\\x1b[32m✓\\x1b[0m ${msg}`)\n ok('Config loaded')\n ok('Dependencies checked')\n if (tunnelService) ok(`Tunnel ready → ${tunnelService.getPublicUrl()}`)\n for (const [name] of core.adapters) ok(`${name.charAt(0).toUpperCase() + name.slice(1)} connected`)\n if (apiServer) ok(`API server on port ${config.api.port}`)\n console.log(`\\nOpenACP is running. Press Ctrl+C to stop.\\n`)\n unmuteLogger()\n }\n log.debug({ agents: Object.keys(config.agents) }, 'OpenACP started')\n}\n\n// Direct execution for dev (node dist/main.js)\nconst isDirectExecution = process.argv[1]?.endsWith('main.js')\nif (isDirectExecution) {\n startServer().catch((err) => {\n log.error({ err }, 'Fatal error')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":[]}
@@ -5,6 +5,7 @@ import {
5
5
  handleHelp,
6
6
  handleMenu
7
7
  } from "./chunk-7QJS2XBD.js";
8
+ import "./chunk-VUNV25KB.js";
8
9
  export {
9
10
  buildMenuKeyboard,
10
11
  buildSkillMessages,
@@ -12,4 +13,4 @@ export {
12
13
  handleHelp,
13
14
  handleMenu
14
15
  };
15
- //# sourceMappingURL=menu-XR2GET2B.js.map
16
+ //# sourceMappingURL=menu-YY5MKHEK.js.map
@@ -7,10 +7,11 @@ import {
7
7
  import "./chunk-KIRH7TUJ.js";
8
8
  import "./chunk-BNLGTZ34.js";
9
9
  import "./chunk-GAK6PIBW.js";
10
+ import "./chunk-VUNV25KB.js";
10
11
  export {
11
12
  executeNewSession,
12
13
  handleNew,
13
14
  handleNewChat,
14
15
  handleNewSessionButton
15
16
  };
16
- //# sourceMappingURL=new-session-NHK7TOEW.js.map
17
+ //# sourceMappingURL=new-session-FEO4J4VU.js.map
@@ -4,6 +4,7 @@ import {
4
4
  import {
5
5
  createChildLogger
6
6
  } from "./chunk-GAK6PIBW.js";
7
+ import "./chunk-VUNV25KB.js";
7
8
 
8
9
  // src/core/post-upgrade.ts
9
10
  var log = createChildLogger({ module: "post-upgrade" });
@@ -11,7 +12,7 @@ async function runPostUpgradeChecks(config) {
11
12
  if (config.tunnel.enabled) {
12
13
  if (config.tunnel.provider === "cloudflare") {
13
14
  try {
14
- const { ensureCloudflared } = await import("./install-cloudflared-FSILDS5J.js");
15
+ const { ensureCloudflared } = await import("./install-cloudflared-Z7VCGOVG.js");
15
16
  await ensureCloudflared();
16
17
  } catch (err) {
17
18
  log.warn(
@@ -28,7 +29,7 @@ async function runPostUpgradeChecks(config) {
28
29
  }
29
30
  }
30
31
  try {
31
- const { getIntegration } = await import("./integrate-O4OCR4SN.js");
32
+ const { getIntegration } = await import("./integrate-PNEHRY2I.js");
32
33
  const integration = getIntegration("claude");
33
34
  if (integration) {
34
35
  const allInstalled = integration.items.every((item) => item.isInstalled());
@@ -40,7 +41,7 @@ async function runPostUpgradeChecks(config) {
40
41
  const handoff = integration.items.find((i) => i.id === "handoff");
41
42
  if (handoff?.isInstalled() && !commandExists("jq")) {
42
43
  try {
43
- const { ensureJq } = await import("./install-jq-P6RUBKPV.js");
44
+ const { ensureJq } = await import("./install-jq-HUYSQWKR.js");
44
45
  await ensureJq();
45
46
  } catch (err) {
46
47
  log.warn(
@@ -58,7 +59,7 @@ async function runPostUpgradeChecks(config) {
58
59
  );
59
60
  }
60
61
  try {
61
- const { AgentStore } = await import("./agent-store-CGE4G6PA.js");
62
+ const { AgentStore } = await import("./agent-store-VZLFPTZU.js");
62
63
  const store = new AgentStore();
63
64
  store.load();
64
65
  const entries = store.getInstalled();
@@ -76,4 +77,4 @@ async function runPostUpgradeChecks(config) {
76
77
  export {
77
78
  runPostUpgradeChecks
78
79
  };
79
- //# sourceMappingURL=post-upgrade-62LUHDJO.js.map
80
+ //# sourceMappingURL=post-upgrade-CJG5I7M2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/post-upgrade.ts"],"sourcesContent":["import { createChildLogger } from \"./log.js\";\nimport { commandExists } from \"./agent-dependencies.js\";\nimport type { Config } from \"./config.js\";\n\nconst log = createChildLogger({ module: \"post-upgrade\" });\n\n/**\n * Post-upgrade dependency check — runs on every start.\n * Centralized source of truth for all binary dependency management.\n * Silent if everything is OK.\n */\nexport async function runPostUpgradeChecks(config: Config): Promise<void> {\n // 1. Tunnel provider binary\n if (config.tunnel.enabled) {\n if (config.tunnel.provider === \"cloudflare\") {\n try {\n const { ensureCloudflared } = await import(\n \"../tunnel/providers/install-cloudflared.js\"\n );\n await ensureCloudflared();\n } catch (err) {\n log.warn(\n { err: (err as Error).message },\n \"Could not install cloudflared. Tunnel may not work.\",\n );\n }\n } else {\n if (!commandExists(config.tunnel.provider)) {\n log.warn(\n `Tunnel provider \"${config.tunnel.provider}\" is not installed. Install it or switch to cloudflare (free, auto-installed).`,\n );\n }\n }\n }\n\n // 2. Claude CLI integration + jq\n try {\n const { getIntegration } = await import(\"../cli/integrate.js\");\n const integration = getIntegration(\"claude\");\n if (integration) {\n const allInstalled = integration.items.every((item) => item.isInstalled());\n if (!allInstalled) {\n log.info(\n 'Claude CLI integration not installed. Run \"openacp integrate claude\" for session transfer + tunnel skill.',\n );\n }\n\n const handoff = integration.items.find((i) => i.id === \"handoff\");\n if (handoff?.isInstalled() && !commandExists(\"jq\")) {\n try {\n const { ensureJq } = await import(\"./install-jq.js\");\n await ensureJq();\n } catch (err) {\n log.warn(\n { err: (err as Error).message },\n \"Could not install jq. Handoff hooks may not work.\",\n );\n }\n }\n }\n } catch {\n // integrate module not available — skip\n }\n\n // 3. unzip (needed for binary agent installs)\n if (!commandExists(\"unzip\")) {\n log.warn(\n \"unzip is not installed. Some agent installations (binary distribution) may fail. Install: brew install unzip (macOS) or apt install unzip (Linux)\",\n );\n }\n\n // 4. uvx (needed for Python-based agents)\n try {\n const { AgentStore } = await import(\"./agent-store.js\");\n const store = new AgentStore();\n store.load();\n const entries = store.getInstalled();\n const hasUvxAgent = Object.values(entries).some(\n (a: { distribution?: string }) => a.distribution === \"uvx\",\n );\n if (hasUvxAgent && !commandExists(\"uvx\")) {\n log.warn(\n \"uvx is not installed but you have Python-based agents. Install: pip install uv\",\n );\n }\n } catch {\n // skip\n }\n}\n"],"mappings":";;;;;;;;AAIA,IAAM,MAAM,kBAAkB,EAAE,QAAQ,eAAe,CAAC;AAOxD,eAAsB,qBAAqB,QAA+B;AAExE,MAAI,OAAO,OAAO,SAAS;AACzB,QAAI,OAAO,OAAO,aAAa,cAAc;AAC3C,UAAI;AACF,cAAM,EAAE,kBAAkB,IAAI,MAAM,OAClC,mCACF;AACA,cAAM,kBAAkB;AAAA,MAC1B,SAAS,KAAK;AACZ,YAAI;AAAA,UACF,EAAE,KAAM,IAAc,QAAQ;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,CAAC,cAAc,OAAO,OAAO,QAAQ,GAAG;AAC1C,YAAI;AAAA,UACF,oBAAoB,OAAO,OAAO,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,yBAAqB;AAC7D,UAAM,cAAc,eAAe,QAAQ;AAC3C,QAAI,aAAa;AACf,YAAM,eAAe,YAAY,MAAM,MAAM,CAAC,SAAS,KAAK,YAAY,CAAC;AACzE,UAAI,CAAC,cAAc;AACjB,YAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,YAAY,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAChE,UAAI,SAAS,YAAY,KAAK,CAAC,cAAc,IAAI,GAAG;AAClD,YAAI;AACF,gBAAM,EAAE,SAAS,IAAI,MAAM,OAAO,0BAAiB;AACnD,gBAAM,SAAS;AAAA,QACjB,SAAS,KAAK;AACZ,cAAI;AAAA,YACF,EAAE,KAAM,IAAc,QAAQ;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,QAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,2BAAkB;AACtD,UAAM,QAAQ,IAAI,WAAW;AAC7B,UAAM,KAAK;AACX,UAAM,UAAU,MAAM,aAAa;AACnC,UAAM,cAAc,OAAO,OAAO,OAAO,EAAE;AAAA,MACzC,CAAC,MAAiC,EAAE,iBAAiB;AAAA,IACvD;AACA,QAAI,eAAe,CAAC,cAAc,KAAK,GAAG;AACxC,UAAI;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/core/post-upgrade.ts"],"sourcesContent":["import { createChildLogger } from \"./log.js\";\nimport { commandExists } from \"./agent-dependencies.js\";\nimport type { Config } from \"./config.js\";\n\nconst log = createChildLogger({ module: \"post-upgrade\" });\n\n/**\n * Post-upgrade dependency check — runs on every start.\n * Centralized source of truth for all binary dependency management.\n * Silent if everything is OK.\n */\nexport async function runPostUpgradeChecks(config: Config): Promise<void> {\n // 1. Tunnel provider binary\n if (config.tunnel.enabled) {\n if (config.tunnel.provider === \"cloudflare\") {\n try {\n const { ensureCloudflared } = await import(\n \"../tunnel/providers/install-cloudflared.js\"\n );\n await ensureCloudflared();\n } catch (err) {\n log.warn(\n { err: (err as Error).message },\n \"Could not install cloudflared. Tunnel may not work.\",\n );\n }\n } else {\n if (!commandExists(config.tunnel.provider)) {\n log.warn(\n `Tunnel provider \"${config.tunnel.provider}\" is not installed. Install it or switch to cloudflare (free, auto-installed).`,\n );\n }\n }\n }\n\n // 2. Claude CLI integration + jq\n try {\n const { getIntegration } = await import(\"../cli/integrate.js\");\n const integration = getIntegration(\"claude\");\n if (integration) {\n const allInstalled = integration.items.every((item) => item.isInstalled());\n if (!allInstalled) {\n log.info(\n 'Claude CLI integration not installed. Run \"openacp integrate claude\" for session transfer + tunnel skill.',\n );\n }\n\n const handoff = integration.items.find((i) => i.id === \"handoff\");\n if (handoff?.isInstalled() && !commandExists(\"jq\")) {\n try {\n const { ensureJq } = await import(\"./install-jq.js\");\n await ensureJq();\n } catch (err) {\n log.warn(\n { err: (err as Error).message },\n \"Could not install jq. Handoff hooks may not work.\",\n );\n }\n }\n }\n } catch {\n // integrate module not available — skip\n }\n\n // 3. unzip (needed for binary agent installs)\n if (!commandExists(\"unzip\")) {\n log.warn(\n \"unzip is not installed. Some agent installations (binary distribution) may fail. Install: brew install unzip (macOS) or apt install unzip (Linux)\",\n );\n }\n\n // 4. uvx (needed for Python-based agents)\n try {\n const { AgentStore } = await import(\"./agent-store.js\");\n const store = new AgentStore();\n store.load();\n const entries = store.getInstalled();\n const hasUvxAgent = Object.values(entries).some(\n (a: { distribution?: string }) => a.distribution === \"uvx\",\n );\n if (hasUvxAgent && !commandExists(\"uvx\")) {\n log.warn(\n \"uvx is not installed but you have Python-based agents. Install: pip install uv\",\n );\n }\n } catch {\n // skip\n }\n}\n"],"mappings":";;;;;;;;;AAIA,IAAM,MAAM,kBAAkB,EAAE,QAAQ,eAAe,CAAC;AAOxD,eAAsB,qBAAqB,QAA+B;AAExE,MAAI,OAAO,OAAO,SAAS;AACzB,QAAI,OAAO,OAAO,aAAa,cAAc;AAC3C,UAAI;AACF,cAAM,EAAE,kBAAkB,IAAI,MAAM,OAClC,mCACF;AACA,cAAM,kBAAkB;AAAA,MAC1B,SAAS,KAAK;AACZ,YAAI;AAAA,UACF,EAAE,KAAM,IAAc,QAAQ;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,CAAC,cAAc,OAAO,OAAO,QAAQ,GAAG;AAC1C,YAAI;AAAA,UACF,oBAAoB,OAAO,OAAO,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,yBAAqB;AAC7D,UAAM,cAAc,eAAe,QAAQ;AAC3C,QAAI,aAAa;AACf,YAAM,eAAe,YAAY,MAAM,MAAM,CAAC,SAAS,KAAK,YAAY,CAAC;AACzE,UAAI,CAAC,cAAc;AACjB,YAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,YAAY,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAChE,UAAI,SAAS,YAAY,KAAK,CAAC,cAAc,IAAI,GAAG;AAClD,YAAI;AACF,gBAAM,EAAE,SAAS,IAAI,MAAM,OAAO,0BAAiB;AACnD,gBAAM,SAAS;AAAA,QACjB,SAAS,KAAK;AACZ,cAAI;AAAA,YACF,EAAE,KAAM,IAAc,QAAQ;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,QAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,2BAAkB;AACtD,UAAM,QAAQ,IAAI,WAAW;AAC7B,UAAM,KAAK;AACX,UAAM,UAAU,MAAM,aAAa;AACnC,UAAM,cAAc,OAAO,OAAO,OAAO,EAAE;AAAA,MACzC,CAAC,MAAiC,EAAE,iBAAiB;AAAA,IACvD;AACA,QAAI,eAAe,CAAC,cAAc,KAAK,GAAG;AACxC,UAAI;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;","names":[]}
@@ -8,6 +8,7 @@ import {
8
8
  } from "./chunk-4CTX774K.js";
9
9
  import "./chunk-BNLGTZ34.js";
10
10
  import "./chunk-GAK6PIBW.js";
11
+ import "./chunk-VUNV25KB.js";
11
12
  export {
12
13
  executeCancelSession,
13
14
  handleCancel,
@@ -16,4 +17,4 @@ export {
16
17
  handleSessions,
17
18
  handleStatus
18
19
  };
19
- //# sourceMappingURL=session-O6ZPLJIZ.js.map
20
+ //# sourceMappingURL=session-IUSI7P5S.js.map
@@ -5,9 +5,10 @@ import {
5
5
  } from "./chunk-O7CPGUAI.js";
6
6
  import "./chunk-JHYXKVV2.js";
7
7
  import "./chunk-GAK6PIBW.js";
8
+ import "./chunk-VUNV25KB.js";
8
9
  export {
9
10
  handleSettings,
10
11
  handleSettingsButton,
11
12
  showSettingsInfo
12
13
  };
13
- //# sourceMappingURL=settings-6TF4WIGJ.js.map
14
+ //# sourceMappingURL=settings-RQPAM4KC.js.map
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  detectAgents,
3
3
  printStartBanner,
4
+ runReconfigure,
4
5
  runSetup,
5
6
  setupAgents,
6
7
  setupDiscord,
@@ -12,13 +13,15 @@ import {
12
13
  validateBotToken,
13
14
  validateChatId,
14
15
  validateDiscordToken
15
- } from "./chunk-47B7GNOE.js";
16
+ } from "./chunk-LCRLAV4G.js";
16
17
  import "./chunk-JKBFUAJK.js";
17
- import "./chunk-SHHMBGB3.js";
18
+ import "./chunk-33RP6K2O.js";
18
19
  import "./chunk-GAK6PIBW.js";
20
+ import "./chunk-VUNV25KB.js";
19
21
  export {
20
22
  detectAgents,
21
23
  printStartBanner,
24
+ runReconfigure,
22
25
  runSetup,
23
26
  setupAgents,
24
27
  setupDiscord,
@@ -31,4 +34,4 @@ export {
31
34
  validateChatId,
32
35
  validateDiscordToken
33
36
  };
34
- //# sourceMappingURL=setup-RJCEB6FS.js.map
37
+ //# sourceMappingURL=setup-XHS4OMPM.js.map