@openacp/cli 2026.327.3 → 2026.328.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.
Files changed (179) hide show
  1. package/README.md +13 -13
  2. package/dist/adapter-HGJENQCN.js +13 -0
  3. package/dist/agent-catalog-SZQQERV7.js +10 -0
  4. package/dist/{agent-dependencies-WS7Z2DFW.js → agent-dependencies-ED2ZTUHG.js} +1 -2
  5. package/dist/{agent-registry-5LZT7CUB.js → agent-registry-YOGP656W.js} +1 -2
  6. package/dist/agent-store-5UHZH2XI.js +8 -0
  7. package/dist/{api-client-AQPNKXI2.js → api-client-XTLRRFPX.js} +1 -2
  8. package/dist/api-server-DSUW637I.js +7 -0
  9. package/dist/api-server-WFB5K6FP.js +10 -0
  10. package/dist/{autostart-6JS565RY.js → autostart-CUPZMKKC.js} +3 -4
  11. package/dist/{chunk-WIIZNPCR.js → chunk-2KT6TROD.js} +12 -33
  12. package/dist/chunk-2KT6TROD.js.map +1 -0
  13. package/dist/{chunk-PPSMUECX.js → chunk-2R5XM3ES.js} +2 -2
  14. package/dist/{chunk-SNPYTMPR.js → chunk-3EWTPOF7.js} +2 -2
  15. package/dist/{chunk-YEULD3SG.js → chunk-3NAFXVQM.js} +7 -2
  16. package/dist/{chunk-YEULD3SG.js.map → chunk-3NAFXVQM.js.map} +1 -1
  17. package/dist/{chunk-QAQDGPB4.js → chunk-43JVXFYP.js} +3 -3
  18. package/dist/{chunk-KMMEFXIE.js → chunk-4B6PCWQP.js} +37 -9
  19. package/dist/chunk-4B6PCWQP.js.map +1 -0
  20. package/dist/{chunk-A6Y4GZM3.js → chunk-566W6INH.js} +2 -2
  21. package/dist/{chunk-ODUM3D6X.js → chunk-5HKQCYOI.js} +1 -39
  22. package/dist/chunk-5HKQCYOI.js.map +1 -0
  23. package/dist/{chunk-36YQ44D7.js → chunk-5TCXYDLR.js} +3 -3
  24. package/dist/{chunk-XIBG7LSL.js → chunk-6VR4GWOO.js} +238 -108
  25. package/dist/chunk-6VR4GWOO.js.map +1 -0
  26. package/dist/{chunk-WXVT3AOY.js → chunk-7ZCQF6QM.js} +8 -3
  27. package/dist/chunk-7ZCQF6QM.js.map +1 -0
  28. package/dist/{chunk-HUWOFP2H.js → chunk-E2SLHZAC.js} +8 -12
  29. package/dist/{chunk-HUWOFP2H.js.map → chunk-E2SLHZAC.js.map} +1 -1
  30. package/dist/{chunk-RBYBSSGO.js → chunk-FCTC7KDT.js} +2 -2
  31. package/dist/chunk-I53NEV3S.js +45 -0
  32. package/dist/chunk-I53NEV3S.js.map +1 -0
  33. package/dist/{chunk-2YCW3QDV.js → chunk-IXMIC4GQ.js} +8 -7
  34. package/dist/chunk-IXMIC4GQ.js.map +1 -0
  35. package/dist/{chunk-BLQUXO7S.js → chunk-IZ5UEZF7.js} +27 -2
  36. package/dist/chunk-IZ5UEZF7.js.map +1 -0
  37. package/dist/{chunk-QVMEF6FB.js → chunk-JOMDPFQ2.js} +10 -24
  38. package/dist/chunk-JOMDPFQ2.js.map +1 -0
  39. package/dist/{chunk-4GMLGCF2.js → chunk-JUFN4XMB.js} +2 -2
  40. package/dist/{chunk-AD3X6DGK.js → chunk-NT6FYV27.js} +75 -13
  41. package/dist/chunk-NT6FYV27.js.map +1 -0
  42. package/dist/{chunk-UMT7RU77.js → chunk-QBEQJFGL.js} +9 -9
  43. package/dist/{chunk-XMMAGAT4.js → chunk-R6KZYF7D.js} +8 -1
  44. package/dist/{chunk-XMMAGAT4.js.map → chunk-R6KZYF7D.js.map} +1 -1
  45. package/dist/{chunk-LP45RCA4.js → chunk-RXMWJHWH.js} +1007 -495
  46. package/dist/chunk-RXMWJHWH.js.map +1 -0
  47. package/dist/{chunk-SHTGQGAU.js → chunk-V2YZWYXT.js} +3 -3
  48. package/dist/{chunk-BQ6FR32N.js → chunk-VD3QSMVY.js} +2 -2
  49. package/dist/cli.js +141 -115
  50. package/dist/cli.js.map +1 -1
  51. package/dist/{config-I4FMCJGZ.js → config-UCAFCS5W.js} +3 -4
  52. package/dist/config-editor-OU6PUY66.js +10 -0
  53. package/dist/{config-registry-CUMNXFGK.js → config-registry-ZXAIJNYB.js} +2 -3
  54. package/dist/{context-XM6E22LM.js → context-7MPU7RL5.js} +1 -2
  55. package/dist/core-plugins-R2EVZAJV.js +22 -0
  56. package/dist/{daemon-PXO5QPCR.js → daemon-DTA6KYYY.js} +4 -5
  57. package/dist/{dev-loader-DRU3R7ZM.js → dev-loader-7P3HZCIA.js} +1 -3
  58. package/dist/{dev-loader-DRU3R7ZM.js.map → dev-loader-7P3HZCIA.js.map} +1 -1
  59. package/dist/doctor-D723IB2I.js +9 -0
  60. package/dist/file-service-HHB3JQIO.js +8 -0
  61. package/dist/index.d.ts +41 -150
  62. package/dist/index.js +63 -29
  63. package/dist/index.js.map +1 -1
  64. package/dist/{install-cloudflared-AN24L4DP.js → install-cloudflared-JRJ4BSOM.js} +3 -4
  65. package/dist/{install-cloudflared-AN24L4DP.js.map → install-cloudflared-JRJ4BSOM.js.map} +1 -1
  66. package/dist/{install-context-XPWTFT3J.js → install-context-EHYV5WRY.js} +2 -3
  67. package/dist/{install-context-XPWTFT3J.js.map → install-context-EHYV5WRY.js.map} +1 -1
  68. package/dist/{install-jq-CRVDJGF3.js → install-jq-ISTGT263.js} +3 -4
  69. package/dist/{install-jq-CRVDJGF3.js.map → install-jq-ISTGT263.js.map} +1 -1
  70. package/dist/{integrate-G6CVXTGT.js → integrate-JIEZYDOR.js} +1 -2
  71. package/dist/{integrate-G6CVXTGT.js.map → integrate-JIEZYDOR.js.map} +1 -1
  72. package/dist/{log-LZ7FTRKG.js → log-YZ243M5G.js} +4 -3
  73. package/dist/{main-UVTZ46WP.js → main-RRSX5SRL.js} +117 -40
  74. package/dist/main-RRSX5SRL.js.map +1 -0
  75. package/dist/{menu-YDQ2LWAR.js → menu-ALFN37IR.js} +1 -2
  76. package/dist/notifications-MO23S7S3.js +8 -0
  77. package/dist/{plugin-create-5HQRF2ID.js → plugin-create-EHL76ZZG.js} +1 -2
  78. package/dist/{plugin-create-5HQRF2ID.js.map → plugin-create-EHL76ZZG.js.map} +1 -1
  79. package/dist/plugin-installer-5XHORMLS.js +9 -0
  80. package/dist/{plugin-registry-WB3DR67H.js → plugin-registry-6J3YSFHF.js} +1 -2
  81. package/dist/{plugin-search-HQ4WQKOF.js → plugin-search-MGKAL5JM.js} +1 -2
  82. package/dist/{plugin-search-HQ4WQKOF.js.map → plugin-search-MGKAL5JM.js.map} +1 -1
  83. package/dist/{post-upgrade-3ADZRMYJ.js → post-upgrade-Y26S2ZQ7.js} +6 -7
  84. package/dist/{post-upgrade-3ADZRMYJ.js.map → post-upgrade-Y26S2ZQ7.js.map} +1 -1
  85. package/dist/{read-text-file-IRZM3QLM.js → read-text-file-DJBTITIB.js} +1 -2
  86. package/dist/{registry-client-AVGRE4CF.js → registry-client-GTBWLXYU.js} +1 -2
  87. package/dist/{security-YNRBW6S7.js → security-2BA265LN.js} +1 -2
  88. package/dist/{settings-manager-MD2U4ZV2.js → settings-manager-B4UN2LAC.js} +1 -2
  89. package/dist/{setup-EYAFK2WI.js → setup-OI6A3OXW.js} +109 -80
  90. package/dist/setup-OI6A3OXW.js.map +1 -0
  91. package/dist/speech-GB7PHVQZ.js +9 -0
  92. package/dist/{suggest-7D6B542M.js → suggest-RST5VOHB.js} +1 -3
  93. package/dist/{suggest-7D6B542M.js.map → suggest-RST5VOHB.js.map} +1 -1
  94. package/dist/telegram-UVIAXADE.js +7 -0
  95. package/dist/tunnel-4WNFC7GO.js +7 -0
  96. package/dist/{tunnel-service-QJPUYEKU.js → tunnel-service-I2NFUX3V.js} +3 -4
  97. package/dist/{tunnel-service-QJPUYEKU.js.map → tunnel-service-I2NFUX3V.js.map} +1 -1
  98. package/dist/{validators-WSTBNKRW.js → validators-GITLOFXC.js} +1 -2
  99. package/dist/{version-NQZBM5M7.js → version-AXXV6IV2.js} +1 -2
  100. package/package.json +1 -3
  101. package/dist/adapter-LC2QSDAS.js +0 -15
  102. package/dist/adapter-Y55NXX6I.js +0 -1006
  103. package/dist/adapter-Y55NXX6I.js.map +0 -1
  104. package/dist/agent-catalog-YHBFERYO.js +0 -11
  105. package/dist/agent-store-VSHNY5GT.js +0 -9
  106. package/dist/api-server-7G3ZUZRM.js +0 -8
  107. package/dist/api-server-CAYNPUF2.js +0 -11
  108. package/dist/chunk-2YCW3QDV.js.map +0 -1
  109. package/dist/chunk-3ASUU6WW.js +0 -124
  110. package/dist/chunk-3ASUU6WW.js.map +0 -1
  111. package/dist/chunk-AD3X6DGK.js.map +0 -1
  112. package/dist/chunk-BLQUXO7S.js.map +0 -1
  113. package/dist/chunk-KMMEFXIE.js.map +0 -1
  114. package/dist/chunk-LP45RCA4.js.map +0 -1
  115. package/dist/chunk-ODUM3D6X.js.map +0 -1
  116. package/dist/chunk-QVMEF6FB.js.map +0 -1
  117. package/dist/chunk-TRXBJEZ5.js +0 -447
  118. package/dist/chunk-TRXBJEZ5.js.map +0 -1
  119. package/dist/chunk-VUNV25KB.js +0 -16
  120. package/dist/chunk-WIIZNPCR.js.map +0 -1
  121. package/dist/chunk-WXVT3AOY.js.map +0 -1
  122. package/dist/chunk-XIBG7LSL.js.map +0 -1
  123. package/dist/config-editor-3IKBPZA7.js +0 -11
  124. package/dist/core-plugins-ROU4GPLT.js +0 -23
  125. package/dist/dist-UHQK5CXN.js +0 -21151
  126. package/dist/dist-UHQK5CXN.js.map +0 -1
  127. package/dist/doctor-QZQAP46W.js +0 -10
  128. package/dist/file-service-EUODJAIT.js +0 -9
  129. package/dist/main-UVTZ46WP.js.map +0 -1
  130. package/dist/notifications-D5BRDNSU.js +0 -9
  131. package/dist/plugin-installer-GQ2P3Q3E.js +0 -23
  132. package/dist/plugin-installer-GQ2P3Q3E.js.map +0 -1
  133. package/dist/setup-EYAFK2WI.js.map +0 -1
  134. package/dist/slack-37ZWBDUI.js +0 -8
  135. package/dist/speech-2GHQNRIO.js +0 -9
  136. package/dist/telegram-2ZCCCZIY.js +0 -8
  137. package/dist/tunnel-45HA72MB.js +0 -8
  138. package/dist/version-NQZBM5M7.js.map +0 -1
  139. /package/dist/{adapter-LC2QSDAS.js.map → adapter-HGJENQCN.js.map} +0 -0
  140. /package/dist/{agent-catalog-YHBFERYO.js.map → agent-catalog-SZQQERV7.js.map} +0 -0
  141. /package/dist/{agent-dependencies-WS7Z2DFW.js.map → agent-dependencies-ED2ZTUHG.js.map} +0 -0
  142. /package/dist/{agent-registry-5LZT7CUB.js.map → agent-registry-YOGP656W.js.map} +0 -0
  143. /package/dist/{agent-store-VSHNY5GT.js.map → agent-store-5UHZH2XI.js.map} +0 -0
  144. /package/dist/{api-client-AQPNKXI2.js.map → api-client-XTLRRFPX.js.map} +0 -0
  145. /package/dist/{api-server-7G3ZUZRM.js.map → api-server-DSUW637I.js.map} +0 -0
  146. /package/dist/{api-server-CAYNPUF2.js.map → api-server-WFB5K6FP.js.map} +0 -0
  147. /package/dist/{autostart-6JS565RY.js.map → autostart-CUPZMKKC.js.map} +0 -0
  148. /package/dist/{chunk-PPSMUECX.js.map → chunk-2R5XM3ES.js.map} +0 -0
  149. /package/dist/{chunk-SNPYTMPR.js.map → chunk-3EWTPOF7.js.map} +0 -0
  150. /package/dist/{chunk-QAQDGPB4.js.map → chunk-43JVXFYP.js.map} +0 -0
  151. /package/dist/{chunk-A6Y4GZM3.js.map → chunk-566W6INH.js.map} +0 -0
  152. /package/dist/{chunk-36YQ44D7.js.map → chunk-5TCXYDLR.js.map} +0 -0
  153. /package/dist/{chunk-RBYBSSGO.js.map → chunk-FCTC7KDT.js.map} +0 -0
  154. /package/dist/{chunk-4GMLGCF2.js.map → chunk-JUFN4XMB.js.map} +0 -0
  155. /package/dist/{chunk-UMT7RU77.js.map → chunk-QBEQJFGL.js.map} +0 -0
  156. /package/dist/{chunk-SHTGQGAU.js.map → chunk-V2YZWYXT.js.map} +0 -0
  157. /package/dist/{chunk-BQ6FR32N.js.map → chunk-VD3QSMVY.js.map} +0 -0
  158. /package/dist/{chunk-VUNV25KB.js.map → config-UCAFCS5W.js.map} +0 -0
  159. /package/dist/{config-I4FMCJGZ.js.map → config-editor-OU6PUY66.js.map} +0 -0
  160. /package/dist/{config-editor-3IKBPZA7.js.map → config-registry-ZXAIJNYB.js.map} +0 -0
  161. /package/dist/{config-registry-CUMNXFGK.js.map → context-7MPU7RL5.js.map} +0 -0
  162. /package/dist/{context-XM6E22LM.js.map → core-plugins-R2EVZAJV.js.map} +0 -0
  163. /package/dist/{core-plugins-ROU4GPLT.js.map → daemon-DTA6KYYY.js.map} +0 -0
  164. /package/dist/{daemon-PXO5QPCR.js.map → doctor-D723IB2I.js.map} +0 -0
  165. /package/dist/{doctor-QZQAP46W.js.map → file-service-HHB3JQIO.js.map} +0 -0
  166. /package/dist/{file-service-EUODJAIT.js.map → log-YZ243M5G.js.map} +0 -0
  167. /package/dist/{log-LZ7FTRKG.js.map → menu-ALFN37IR.js.map} +0 -0
  168. /package/dist/{menu-YDQ2LWAR.js.map → notifications-MO23S7S3.js.map} +0 -0
  169. /package/dist/{notifications-D5BRDNSU.js.map → plugin-installer-5XHORMLS.js.map} +0 -0
  170. /package/dist/{plugin-registry-WB3DR67H.js.map → plugin-registry-6J3YSFHF.js.map} +0 -0
  171. /package/dist/{read-text-file-IRZM3QLM.js.map → read-text-file-DJBTITIB.js.map} +0 -0
  172. /package/dist/{registry-client-AVGRE4CF.js.map → registry-client-GTBWLXYU.js.map} +0 -0
  173. /package/dist/{security-YNRBW6S7.js.map → security-2BA265LN.js.map} +0 -0
  174. /package/dist/{settings-manager-MD2U4ZV2.js.map → settings-manager-B4UN2LAC.js.map} +0 -0
  175. /package/dist/{slack-37ZWBDUI.js.map → speech-GB7PHVQZ.js.map} +0 -0
  176. /package/dist/{speech-2GHQNRIO.js.map → telegram-UVIAXADE.js.map} +0 -0
  177. /package/dist/{telegram-2ZCCCZIY.js.map → tunnel-4WNFC7GO.js.map} +0 -0
  178. /package/dist/{tunnel-45HA72MB.js.map → validators-GITLOFXC.js.map} +0 -0
  179. /package/dist/{validators-WSTBNKRW.js.map → version-AXXV6IV2.js.map} +0 -0
package/README.md CHANGED
@@ -12,7 +12,7 @@ Send a message. The agent writes code. You see everything — in real time.
12
12
  [![npm](https://img.shields.io/npm/v/@openacp/cli.svg)](https://www.npmjs.com/package/@openacp/cli)
13
13
  [![Twitter Follow](https://img.shields.io/twitter/follow/openacp_ai?style=social)](https://x.com/openacp_ai)
14
14
 
15
- [Documentation](docs/gitbook/) · [Quick Start](#quick-start) · [Features](#features) · [Agents](#supported-agents) · [Contributing](docs/gitbook/extending/contributing.md)
15
+ [Documentation](https://openacp.gitbook.io/docs) · [Quick Start](#quick-start) · [Features](#features) · [Agents](#supported-agents) · [Contributing](https://openacp.gitbook.io/docs/extending/contributing)
16
16
 
17
17
  </div>
18
18
 
@@ -64,7 +64,7 @@ The interactive setup wizard walks you through everything:
64
64
 
65
65
  That's it. Send a message to your bot and start coding.
66
66
 
67
- > **Need detailed setup for a specific platform?** See the [Platform Setup guides](docs/gitbook/platform-setup/).
67
+ > **Need detailed setup for a specific platform?** See the [Platform Setup guides](https://openacp.gitbook.io/docs/platform-setup).
68
68
 
69
69
  ## Features
70
70
 
@@ -101,7 +101,7 @@ That's it. Send a message to your bot and start coding.
101
101
  - **Doctor diagnostics** — `openacp doctor` checks everything and suggests fixes
102
102
  - **Structured logging** — Pino with rotation, per-session log files
103
103
 
104
- > **Full feature documentation** — [docs/gitbook/](docs/gitbook/)
104
+ > **Full feature documentation** — [Documentation](https://openacp.gitbook.io/docs)
105
105
 
106
106
  ## Supported Agents
107
107
 
@@ -151,20 +151,20 @@ openacp tunnel add <port> [--label name]
151
151
  openacp tunnel list
152
152
  ```
153
153
 
154
- > **Full CLI reference** — [docs/gitbook/api-reference/cli-commands.md](docs/gitbook/api-reference/cli-commands.md)
154
+ > **Full CLI reference** — [CLI Commands](https://openacp.gitbook.io/docs/api-reference/cli-commands)
155
155
 
156
156
  ## Documentation
157
157
 
158
158
  | Section | Description |
159
159
  |---------|-------------|
160
- | [Getting Started](docs/gitbook/getting-started/) | What is OpenACP, quickstart for users & developers |
161
- | [Platform Setup](docs/gitbook/platform-setup/) | Step-by-step guides for Telegram, Discord, Slack |
162
- | [Using OpenACP](docs/gitbook/using-openacp/) | Commands, sessions, agents, permissions, voice |
163
- | [Self-Hosting](docs/gitbook/self-hosting/) | Installation, configuration, daemon, security |
164
- | [Features](docs/gitbook/features/) | Tunnel, context resume, usage tracking, and more |
165
- | [Extending](docs/gitbook/extending/) | Plugin system, building adapters, contributing |
166
- | [API Reference](docs/gitbook/api-reference/) | CLI commands, REST API, config schema, env vars |
167
- | [Troubleshooting](docs/gitbook/troubleshooting/) | Common issues and FAQ |
160
+ | [Getting Started](https://openacp.gitbook.io/docs/getting-started) | What is OpenACP, quickstart for users & developers |
161
+ | [Platform Setup](https://openacp.gitbook.io/docs/platform-setup) | Step-by-step guides for Telegram, Discord, Slack |
162
+ | [Using OpenACP](https://openacp.gitbook.io/docs/using-openacp) | Commands, sessions, agents, permissions, voice |
163
+ | [Self-Hosting](https://openacp.gitbook.io/docs/self-hosting) | Installation, configuration, daemon, security |
164
+ | [Features](https://openacp.gitbook.io/docs/features) | Tunnel, context resume, usage tracking, and more |
165
+ | [Extending](https://openacp.gitbook.io/docs/extending) | Plugin system, building adapters, contributing |
166
+ | [API Reference](https://openacp.gitbook.io/docs/api-reference) | CLI commands, REST API, config schema, env vars |
167
+ | [Troubleshooting](https://openacp.gitbook.io/docs/troubleshooting) | Common issues and FAQ |
168
168
 
169
169
  ## Star History
170
170
 
@@ -178,7 +178,7 @@ openacp tunnel list
178
178
 
179
179
  ## Contributing
180
180
 
181
- We welcome contributions! See the [contributing guide](docs/gitbook/extending/contributing.md) for development setup, testing conventions, and PR process.
181
+ We welcome contributions! See the [contributing guide](https://openacp.gitbook.io/docs/extending/contributing) for development setup, testing conventions, and PR process.
182
182
 
183
183
  ## Follow Us
184
184
 
@@ -0,0 +1,13 @@
1
+ import {
2
+ TelegramAdapter
3
+ } from "./chunk-RXMWJHWH.js";
4
+ import "./chunk-AFKX424Q.js";
5
+ import "./chunk-43JVXFYP.js";
6
+ import "./chunk-APS6UEFU.js";
7
+ import "./chunk-5HKQCYOI.js";
8
+ import "./chunk-JOMDPFQ2.js";
9
+ import "./chunk-R6KZYF7D.js";
10
+ export {
11
+ TelegramAdapter
12
+ };
13
+ //# sourceMappingURL=adapter-HGJENQCN.js.map
@@ -0,0 +1,10 @@
1
+ import {
2
+ AgentCatalog
3
+ } from "./chunk-V2YZWYXT.js";
4
+ import "./chunk-566W6INH.js";
5
+ import "./chunk-ZSLHHQPQ.js";
6
+ import "./chunk-R6KZYF7D.js";
7
+ export {
8
+ AgentCatalog
9
+ };
10
+ //# sourceMappingURL=agent-catalog-SZQQERV7.js.map
@@ -9,7 +9,6 @@ import {
9
9
  getAgentSetup,
10
10
  listAgentsWithIntegration
11
11
  } from "./chunk-ZSLHHQPQ.js";
12
- import "./chunk-VUNV25KB.js";
13
12
  export {
14
13
  REGISTRY_AGENT_ALIASES,
15
14
  checkDependencies,
@@ -21,4 +20,4 @@ export {
21
20
  getAgentSetup,
22
21
  listAgentsWithIntegration
23
22
  };
24
- //# sourceMappingURL=agent-dependencies-WS7Z2DFW.js.map
23
+ //# sourceMappingURL=agent-dependencies-ED2ZTUHG.js.map
@@ -2,8 +2,7 @@ import "./chunk-FNRSWA2K.js";
2
2
  import {
3
3
  getAgentCapabilities
4
4
  } from "./chunk-ZSLHHQPQ.js";
5
- import "./chunk-VUNV25KB.js";
6
5
  export {
7
6
  getAgentCapabilities
8
7
  };
9
- //# sourceMappingURL=agent-registry-5LZT7CUB.js.map
8
+ //# sourceMappingURL=agent-registry-YOGP656W.js.map
@@ -0,0 +1,8 @@
1
+ import {
2
+ AgentStore
3
+ } from "./chunk-566W6INH.js";
4
+ import "./chunk-R6KZYF7D.js";
5
+ export {
6
+ AgentStore
7
+ };
8
+ //# sourceMappingURL=agent-store-5UHZH2XI.js.map
@@ -4,11 +4,10 @@ import {
4
4
  readApiSecret,
5
5
  removeStalePortFile
6
6
  } from "./chunk-4WXALZA3.js";
7
- import "./chunk-VUNV25KB.js";
8
7
  export {
9
8
  apiCall,
10
9
  readApiPort,
11
10
  readApiSecret,
12
11
  removeStalePortFile
13
12
  };
14
- //# sourceMappingURL=api-client-AQPNKXI2.js.map
13
+ //# sourceMappingURL=api-client-XTLRRFPX.js.map
@@ -0,0 +1,7 @@
1
+ import {
2
+ api_server_default
3
+ } from "./chunk-JUFN4XMB.js";
4
+ export {
5
+ api_server_default as default
6
+ };
7
+ //# sourceMappingURL=api-server-DSUW637I.js.map
@@ -0,0 +1,10 @@
1
+ import {
2
+ ApiServer
3
+ } from "./chunk-IXMIC4GQ.js";
4
+ import "./chunk-FNRSWA2K.js";
5
+ import "./chunk-ZSLHHQPQ.js";
6
+ import "./chunk-R6KZYF7D.js";
7
+ export {
8
+ ApiServer
9
+ };
10
+ //# sourceMappingURL=api-server-WFB5K6FP.js.map
@@ -7,9 +7,8 @@ import {
7
7
  isAutoStartInstalled,
8
8
  isAutoStartSupported,
9
9
  uninstallAutoStart
10
- } from "./chunk-PPSMUECX.js";
11
- import "./chunk-XMMAGAT4.js";
12
- import "./chunk-VUNV25KB.js";
10
+ } from "./chunk-2R5XM3ES.js";
11
+ import "./chunk-R6KZYF7D.js";
13
12
  export {
14
13
  escapeSystemdValue,
15
14
  escapeXml,
@@ -20,4 +19,4 @@ export {
20
19
  isAutoStartSupported,
21
20
  uninstallAutoStart
22
21
  };
23
- //# sourceMappingURL=autostart-6JS565RY.js.map
22
+ //# sourceMappingURL=autostart-CUPZMKKC.js.map
@@ -16,6 +16,9 @@ var SpeechService = class {
16
16
  registerTTSProvider(name, provider) {
17
17
  this.ttsProviders.set(name, provider);
18
18
  }
19
+ unregisterTTSProvider(name) {
20
+ this.ttsProviders.delete(name);
21
+ }
19
22
  isSTTAvailable() {
20
23
  const { provider, providers } = this.config.stt;
21
24
  return provider !== null && providers[provider]?.apiKey !== void 0;
@@ -49,13 +52,17 @@ var SpeechService = class {
49
52
  updateConfig(config) {
50
53
  this.config = config;
51
54
  }
52
- /** Re-create all providers from current config using the registered factory */
55
+ /** Re-create factory-managed providers from config. Preserves externally-registered providers (e.g. from plugins). */
53
56
  refreshProviders(newConfig) {
54
57
  this.config = newConfig;
55
58
  if (this.providerFactory) {
56
59
  const { stt, tts } = this.providerFactory(newConfig);
57
- this.sttProviders = stt;
58
- this.ttsProviders = tts;
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
+ }
59
66
  }
60
67
  }
61
68
  };
@@ -115,36 +122,8 @@ function mimeToExt(mimeType) {
115
122
  return map[mimeType] || ".bin";
116
123
  }
117
124
 
118
- // src/plugins/speech/providers/edge-tts.ts
119
- var DEFAULT_VOICE = "en-US-AriaNeural";
120
- var EdgeTTS = class {
121
- name = "edge-tts";
122
- voice;
123
- constructor(voice) {
124
- this.voice = voice || DEFAULT_VOICE;
125
- }
126
- async synthesize(text, options) {
127
- const { MsEdgeTTS, OUTPUT_FORMAT } = await import("./dist-UHQK5CXN.js");
128
- const tts = new MsEdgeTTS();
129
- const voice = options?.voice || this.voice;
130
- const format = OUTPUT_FORMAT.AUDIO_24KHZ_48KBITRATE_MONO_MP3;
131
- await tts.setMetadata(voice, format);
132
- const { audioStream } = tts.toStream(text);
133
- const chunks = [];
134
- for await (const chunk of audioStream) {
135
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
136
- }
137
- tts.close();
138
- return {
139
- audioBuffer: Buffer.concat(chunks),
140
- mimeType: "audio/mpeg"
141
- };
142
- }
143
- };
144
-
145
125
  export {
146
126
  SpeechService,
147
- GroqSTT,
148
- EdgeTTS
127
+ GroqSTT
149
128
  };
150
- //# sourceMappingURL=chunk-WIIZNPCR.js.map
129
+ //# sourceMappingURL=chunk-2KT6TROD.js.map
@@ -0,0 +1 @@
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":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createChildLogger
3
- } from "./chunk-XMMAGAT4.js";
3
+ } from "./chunk-R6KZYF7D.js";
4
4
 
5
5
  // src/cli/autostart.ts
6
6
  import { execFileSync } from "child_process";
@@ -151,4 +151,4 @@ export {
151
151
  uninstallAutoStart,
152
152
  isAutoStartInstalled
153
153
  };
154
- //# sourceMappingURL=chunk-PPSMUECX.js.map
154
+ //# sourceMappingURL=chunk-2R5XM3ES.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NotificationManager
3
- } from "./chunk-WXVT3AOY.js";
3
+ } from "./chunk-7ZCQF6QM.js";
4
4
 
5
5
  // src/plugins/notifications/index.ts
6
6
  function createNotificationsPlugin() {
@@ -48,4 +48,4 @@ var notifications_default = createNotificationsPlugin();
48
48
  export {
49
49
  notifications_default
50
50
  };
51
- //# sourceMappingURL=chunk-SNPYTMPR.js.map
51
+ //# sourceMappingURL=chunk-3EWTPOF7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  FileService
3
- } from "./chunk-BLQUXO7S.js";
3
+ } from "./chunk-IZ5UEZF7.js";
4
4
 
5
5
  // src/plugins/file-service/index.ts
6
6
  import path from "path";
@@ -48,8 +48,13 @@ function createFileServicePlugin() {
48
48
  async setup(ctx) {
49
49
  const config = ctx.pluginConfig;
50
50
  const baseDir = config.baseDir ?? path.join(os.homedir(), ".openacp", "files");
51
+ const retentionDays = config.retentionDays ?? 30;
51
52
  const service = new FileService(baseDir);
52
53
  ctx.registerService("file-service", service);
54
+ service.cleanupOldFiles(retentionDays).then((count) => {
55
+ if (count > 0) ctx.log.info(`Cleaned up ${count} old session files`);
56
+ }).catch(() => {
57
+ });
53
58
  ctx.log.info("File service ready");
54
59
  }
55
60
  };
@@ -59,4 +64,4 @@ var file_service_default = createFileServicePlugin();
59
64
  export {
60
65
  file_service_default
61
66
  };
62
- //# sourceMappingURL=chunk-YEULD3SG.js.map
67
+ //# sourceMappingURL=chunk-3NAFXVQM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/file-service/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport { FileService } from './file-service.js'\nimport path from 'node:path'\nimport os from 'node:os'\n\nfunction createFileServicePlugin(): OpenACPPlugin {\n return {\n name: '@openacp/file-service',\n version: '1.0.0',\n description: 'File storage and management for session attachments',\n essential: false,\n permissions: ['services:register'],\n\n async install(ctx: InstallContext) {\n const { settings, legacyConfig, terminal } = ctx\n\n // Migrate from legacy config if present\n if (legacyConfig) {\n const filesCfg = legacyConfig.files as Record<string, unknown> | undefined\n if (filesCfg) {\n await settings.setAll({\n baseDir: filesCfg.baseDir ?? path.join(os.homedir(), '.openacp', 'files'),\n })\n terminal.log.success('File service settings migrated from legacy config')\n return\n }\n }\n\n // Save defaults\n await settings.setAll({\n baseDir: path.join(os.homedir(), '.openacp', 'files'),\n })\n terminal.log.success('File service defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const val = await terminal.text({\n message: 'File storage directory:',\n defaultValue: (current.baseDir as string) ?? path.join(os.homedir(), '.openacp', 'files'),\n })\n await settings.set('baseDir', val.trim())\n terminal.log.success('File storage directory updated')\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('File service settings cleared')\n }\n },\n\n async setup(ctx) {\n const config = ctx.pluginConfig as Record<string, unknown>\n const baseDir = (config.baseDir as string) ?? path.join(os.homedir(), '.openacp', 'files')\n const service = new FileService(baseDir)\n ctx.registerService('file-service', service)\n ctx.log.info('File service ready')\n },\n }\n}\n\nexport default createFileServicePlugin()\n"],"mappings":";;;;;AAEA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAS,0BAAyC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa,CAAC,mBAAmB;AAAA,IAEjC,MAAM,QAAQ,KAAqB;AACjC,YAAM,EAAE,UAAU,cAAc,SAAS,IAAI;AAG7C,UAAI,cAAc;AAChB,cAAM,WAAW,aAAa;AAC9B,YAAI,UAAU;AACZ,gBAAM,SAAS,OAAO;AAAA,YACpB,SAAS,SAAS,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,UAC1E,CAAC;AACD,mBAAS,IAAI,QAAQ,mDAAmD;AACxE;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,OAAO;AAAA,QACpB,SAAS,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,MACtD,CAAC;AACD,eAAS,IAAI,QAAQ,6BAA6B;AAAA,IACpD;AAAA,IAEA,MAAM,UAAU,KAAqB;AACnC,YAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,YAAM,UAAU,MAAM,SAAS,OAAO;AAEtC,YAAM,MAAM,MAAM,SAAS,KAAK;AAAA,QAC9B,SAAS;AAAA,QACT,cAAe,QAAQ,WAAsB,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,MAC1F,CAAC;AACD,YAAM,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC;AACxC,eAAS,IAAI,QAAQ,gCAAgC;AAAA,IACvD;AAAA,IAEA,MAAM,UAAU,KAAqB,MAA0B;AAC7D,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,SAAS,MAAM;AACzB,YAAI,SAAS,IAAI,QAAQ,+BAA+B;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK;AACf,YAAM,SAAS,IAAI;AACnB,YAAM,UAAW,OAAO,WAAsB,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AACzF,YAAM,UAAU,IAAI,YAAY,OAAO;AACvC,UAAI,gBAAgB,gBAAgB,OAAO;AAC3C,UAAI,IAAI,KAAK,oBAAoB;AAAA,IACnC;AAAA,EACF;AACF;AAEA,IAAO,uBAAQ,wBAAwB;","names":[]}
1
+ {"version":3,"sources":["../../src/plugins/file-service/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport { FileService } from './file-service.js'\nimport path from 'node:path'\nimport os from 'node:os'\n\nfunction createFileServicePlugin(): OpenACPPlugin {\n return {\n name: '@openacp/file-service',\n version: '1.0.0',\n description: 'File storage and management for session attachments',\n essential: false,\n permissions: ['services:register'],\n\n async install(ctx: InstallContext) {\n const { settings, legacyConfig, terminal } = ctx\n\n // Migrate from legacy config if present\n if (legacyConfig) {\n const filesCfg = legacyConfig.files as Record<string, unknown> | undefined\n if (filesCfg) {\n await settings.setAll({\n baseDir: filesCfg.baseDir ?? path.join(os.homedir(), '.openacp', 'files'),\n })\n terminal.log.success('File service settings migrated from legacy config')\n return\n }\n }\n\n // Save defaults\n await settings.setAll({\n baseDir: path.join(os.homedir(), '.openacp', 'files'),\n })\n terminal.log.success('File service defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const val = await terminal.text({\n message: 'File storage directory:',\n defaultValue: (current.baseDir as string) ?? path.join(os.homedir(), '.openacp', 'files'),\n })\n await settings.set('baseDir', val.trim())\n terminal.log.success('File storage directory updated')\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('File service settings cleared')\n }\n },\n\n async setup(ctx) {\n const config = ctx.pluginConfig as Record<string, unknown>\n const baseDir = (config.baseDir as string) ?? path.join(os.homedir(), '.openacp', 'files')\n const retentionDays = (config.retentionDays as number) ?? 30\n const service = new FileService(baseDir)\n ctx.registerService('file-service', service)\n // Cleanup old session files in background (fire-and-forget)\n service.cleanupOldFiles(retentionDays).then((count) => {\n if (count > 0) ctx.log.info(`Cleaned up ${count} old session files`)\n }).catch(() => {})\n ctx.log.info('File service ready')\n },\n }\n}\n\nexport default createFileServicePlugin()\n"],"mappings":";;;;;AAEA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAS,0BAAyC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa,CAAC,mBAAmB;AAAA,IAEjC,MAAM,QAAQ,KAAqB;AACjC,YAAM,EAAE,UAAU,cAAc,SAAS,IAAI;AAG7C,UAAI,cAAc;AAChB,cAAM,WAAW,aAAa;AAC9B,YAAI,UAAU;AACZ,gBAAM,SAAS,OAAO;AAAA,YACpB,SAAS,SAAS,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,UAC1E,CAAC;AACD,mBAAS,IAAI,QAAQ,mDAAmD;AACxE;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,OAAO;AAAA,QACpB,SAAS,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,MACtD,CAAC;AACD,eAAS,IAAI,QAAQ,6BAA6B;AAAA,IACpD;AAAA,IAEA,MAAM,UAAU,KAAqB;AACnC,YAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,YAAM,UAAU,MAAM,SAAS,OAAO;AAEtC,YAAM,MAAM,MAAM,SAAS,KAAK;AAAA,QAC9B,SAAS;AAAA,QACT,cAAe,QAAQ,WAAsB,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,MAC1F,CAAC;AACD,YAAM,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC;AACxC,eAAS,IAAI,QAAQ,gCAAgC;AAAA,IACvD;AAAA,IAEA,MAAM,UAAU,KAAqB,MAA0B;AAC7D,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,SAAS,MAAM;AACzB,YAAI,SAAS,IAAI,QAAQ,+BAA+B;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK;AACf,YAAM,SAAS,IAAI;AACnB,YAAM,UAAW,OAAO,WAAsB,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AACzF,YAAM,gBAAiB,OAAO,iBAA4B;AAC1D,YAAM,UAAU,IAAI,YAAY,OAAO;AACvC,UAAI,gBAAgB,gBAAgB,OAAO;AAE3C,cAAQ,gBAAgB,aAAa,EAAE,KAAK,CAAC,UAAU;AACrD,YAAI,QAAQ,EAAG,KAAI,IAAI,KAAK,cAAc,KAAK,oBAAoB;AAAA,MACrE,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACjB,UAAI,IAAI,KAAK,oBAAoB;AAAA,IACnC;AAAA,EACF;AACF;AAEA,IAAO,uBAAQ,wBAAwB;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  ConfigSchema,
4
4
  applyMigrations,
5
5
  expandHome
6
- } from "./chunk-QVMEF6FB.js";
6
+ } from "./chunk-JOMDPFQ2.js";
7
7
 
8
8
  // src/core/doctor/index.ts
9
9
  import * as fs8 from "fs";
@@ -532,7 +532,7 @@ var tunnelCheck = {
532
532
  fixRisk: "safe",
533
533
  fix: async () => {
534
534
  try {
535
- const { ensureCloudflared } = await import("./install-cloudflared-AN24L4DP.js");
535
+ const { ensureCloudflared } = await import("./install-cloudflared-JRJ4BSOM.js");
536
536
  await ensureCloudflared();
537
537
  return { success: true, message: "installed cloudflared" };
538
538
  } catch (err) {
@@ -647,4 +647,4 @@ var DoctorEngine = class {
647
647
  export {
648
648
  DoctorEngine
649
649
  };
650
- //# sourceMappingURL=chunk-QAQDGPB4.js.map
650
+ //# sourceMappingURL=chunk-43JVXFYP.js.map
@@ -116,18 +116,40 @@ function createTunnelPlugin() {
116
116
  ctx.log.info("Tunnel disabled (no provider configured)");
117
117
  return;
118
118
  }
119
- const { TunnelService } = await import("./tunnel-service-QJPUYEKU.js");
119
+ const { TunnelService } = await import("./tunnel-service-I2NFUX3V.js");
120
120
  const tunnelSvc = new TunnelService(config);
121
121
  const publicUrl = await tunnelSvc.start();
122
122
  service = tunnelSvc;
123
123
  ctx.registerService("tunnel", tunnelSvc);
124
124
  ctx.registerCommand({
125
125
  name: "tunnel",
126
- description: "Show tunnel status and URL",
126
+ description: "Manage tunnels: /tunnel <port> [label] | /tunnel stop <port>",
127
127
  category: "plugin",
128
- handler: async () => {
128
+ handler: async (args) => {
129
+ const parts = args.raw.trim().split(/\s+/);
130
+ if (parts[0] === "stop" && parts[1]) {
131
+ const port = parseInt(parts[1], 10);
132
+ if (isNaN(port)) return { type: "error", message: "Invalid port number" };
133
+ try {
134
+ await tunnelSvc.stopTunnel(port);
135
+ return { type: "text", text: `Tunnel on port ${port} stopped.` };
136
+ } catch (err) {
137
+ return { type: "error", message: err.message };
138
+ }
139
+ }
140
+ if (parts[0] && parts[0] !== "") {
141
+ const port = parseInt(parts[0], 10);
142
+ if (isNaN(port)) return { type: "error", message: "Invalid port number" };
143
+ const label = parts.slice(1).join(" ") || void 0;
144
+ try {
145
+ const entry = await tunnelSvc.addTunnel(port, { label });
146
+ return { type: "text", text: `Tunnel created: ${entry.publicUrl ?? "starting..."}` };
147
+ } catch (err) {
148
+ return { type: "error", message: err.message };
149
+ }
150
+ }
129
151
  const url = tunnelSvc.getPublicUrl();
130
- return { type: "text", text: `Tunnel active: ${url}` };
152
+ return { type: "text", text: url ? `Tunnel: ${url}` : "No tunnel active." };
131
153
  }
132
154
  });
133
155
  ctx.registerCommand({
@@ -135,10 +157,16 @@ function createTunnelPlugin() {
135
157
  description: "List active tunnels",
136
158
  category: "plugin",
137
159
  handler: async () => {
138
- const url = tunnelSvc.getPublicUrl();
139
- return { type: "list", title: "Active Tunnels", items: [
140
- { label: "Primary", detail: url }
141
- ] };
160
+ const userTunnels = tunnelSvc.listTunnels();
161
+ const systemUrl = tunnelSvc.getPublicUrl();
162
+ const items = [
163
+ { label: "System", detail: systemUrl },
164
+ ...userTunnels.map((t) => ({
165
+ label: t.label ?? `Port ${t.port}`,
166
+ detail: `${t.publicUrl ?? t.status} (${t.provider})`
167
+ }))
168
+ ];
169
+ return { type: "list", title: "Active Tunnels", items };
142
170
  }
143
171
  });
144
172
  ctx.log.info(`Tunnel ready: ${publicUrl}`);
@@ -155,4 +183,4 @@ var tunnel_default = createTunnelPlugin();
155
183
  export {
156
184
  tunnel_default
157
185
  };
158
- //# sourceMappingURL=chunk-KMMEFXIE.js.map
186
+ //# sourceMappingURL=chunk-4B6PCWQP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugins/tunnel/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport type { TunnelConfig } from '../../core/config/config.js'\n\nfunction createTunnelPlugin(): OpenACPPlugin {\n let service: { stop(): Promise<void> } | null = null\n\n return {\n name: '@openacp/tunnel',\n version: '1.0.0',\n description: 'Expose local services to internet via tunnel providers',\n essential: false,\n permissions: ['services:register', 'kernel:access', 'commands:register'],\n\n async install(ctx: InstallContext) {\n const { terminal, settings, legacyConfig } = ctx\n\n // Migrate from legacy config if present\n if (legacyConfig) {\n const tunnelCfg = legacyConfig.tunnel as Record<string, unknown> | undefined\n if (tunnelCfg) {\n await settings.setAll({\n enabled: tunnelCfg.enabled ?? true,\n provider: tunnelCfg.provider ?? 'cloudflare',\n port: tunnelCfg.port ?? 3100,\n options: tunnelCfg.options ?? {},\n maxUserTunnels: tunnelCfg.maxUserTunnels ?? 5,\n storeTtlMinutes: tunnelCfg.storeTtlMinutes ?? 60,\n auth: tunnelCfg.auth ?? { enabled: false },\n })\n terminal.log.success('Tunnel settings migrated from legacy config')\n return\n }\n }\n\n // Interactive setup\n const provider = await terminal.select({\n message: 'Tunnel provider:',\n options: [\n { value: 'cloudflare', label: 'Cloudflare (cloudflared)', hint: 'Free, no account needed' },\n { value: 'ngrok', label: 'ngrok', hint: 'Requires auth token' },\n { value: 'bore', label: 'bore', hint: 'Self-hostable' },\n { value: 'tailscale', label: 'Tailscale Funnel' },\n ],\n })\n\n const portStr = await terminal.text({\n message: 'Local port to expose:',\n defaultValue: '3100',\n validate: (v) => {\n const n = Number(v.trim())\n if (isNaN(n) || n < 1 || n > 65535) return 'Port must be 1-65535'\n return undefined\n },\n })\n\n let authToken = ''\n if (provider === 'ngrok') {\n authToken = await terminal.text({\n message: 'ngrok auth token:',\n validate: (v) => (!v.trim() ? 'Auth token cannot be empty' : undefined),\n })\n authToken = authToken.trim()\n }\n\n await settings.setAll({\n enabled: true,\n provider,\n port: Number(portStr.trim()),\n options: authToken ? { authtoken: authToken } : {},\n maxUserTunnels: 5,\n storeTtlMinutes: 60,\n auth: { enabled: false },\n })\n terminal.log.success('Tunnel settings saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const choice = await terminal.select({\n message: 'What to configure?',\n options: [\n { value: 'provider', label: `Change provider (current: ${current.provider ?? 'none'})` },\n { value: 'port', label: `Change port (current: ${current.port ?? 3100})` },\n { value: 'toggle', label: `${current.enabled ? 'Disable' : 'Enable'} tunnel` },\n { value: 'done', label: 'Done' },\n ],\n })\n\n if (choice === 'provider') {\n const provider = await terminal.select({\n message: 'Tunnel provider:',\n options: [\n { value: 'cloudflare', label: 'Cloudflare' },\n { value: 'ngrok', label: 'ngrok' },\n { value: 'bore', label: 'bore' },\n { value: 'tailscale', label: 'Tailscale' },\n ],\n })\n await settings.set('provider', provider)\n terminal.log.success('Provider updated')\n } else if (choice === 'port') {\n const val = await terminal.text({\n message: 'New port:',\n defaultValue: String(current.port ?? 3100),\n validate: (v) => {\n const n = Number(v.trim())\n if (isNaN(n) || n < 1 || n > 65535) return 'Port must be 1-65535'\n return undefined\n },\n })\n await settings.set('port', Number(val.trim()))\n terminal.log.success('Port updated')\n } else if (choice === 'toggle') {\n const newState = !current.enabled\n await settings.set('enabled', newState)\n terminal.log.success(`Tunnel ${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('Tunnel settings cleared')\n }\n },\n\n async setup(ctx) {\n const config = ctx.pluginConfig as Record<string, unknown>\n if (!config.provider) {\n ctx.log.info('Tunnel disabled (no provider configured)')\n return\n }\n\n const { TunnelService } = await import('./tunnel-service.js')\n const tunnelSvc = new TunnelService(config as unknown as TunnelConfig)\n const publicUrl = await tunnelSvc.start()\n service = tunnelSvc\n\n ctx.registerService('tunnel', tunnelSvc)\n\n ctx.registerCommand({\n name: 'tunnel',\n description: 'Manage tunnels: /tunnel <port> [label] | /tunnel stop <port>',\n category: 'plugin',\n handler: async (args) => {\n const parts = args.raw.trim().split(/\\s+/)\n\n // /tunnel stop <port>\n if (parts[0] === 'stop' && parts[1]) {\n const port = parseInt(parts[1], 10)\n if (isNaN(port)) return { type: 'error', message: 'Invalid port number' }\n try {\n await tunnelSvc.stopTunnel(port)\n return { type: 'text', text: `Tunnel on port ${port} stopped.` }\n } catch (err) {\n return { type: 'error', message: (err as Error).message }\n }\n }\n\n // /tunnel <port> [label]\n if (parts[0] && parts[0] !== '') {\n const port = parseInt(parts[0], 10)\n if (isNaN(port)) return { type: 'error', message: 'Invalid port number' }\n const label = parts.slice(1).join(' ') || undefined\n try {\n const entry = await tunnelSvc.addTunnel(port, { label })\n return { type: 'text', text: `Tunnel created: ${entry.publicUrl ?? 'starting...'}` }\n } catch (err) {\n return { type: 'error', message: (err as Error).message }\n }\n }\n\n // /tunnel (no args) — show current tunnel URL\n const url = tunnelSvc.getPublicUrl()\n return { type: 'text', text: url ? `Tunnel: ${url}` : 'No tunnel active.' }\n },\n })\n\n ctx.registerCommand({\n name: 'tunnels',\n description: 'List active tunnels',\n category: 'plugin',\n handler: async () => {\n const userTunnels = tunnelSvc.listTunnels()\n const systemUrl = tunnelSvc.getPublicUrl()\n const items = [\n { label: 'System', detail: systemUrl },\n ...userTunnels.map(t => ({\n label: t.label ?? `Port ${t.port}`,\n detail: `${t.publicUrl ?? t.status} (${t.provider})`,\n })),\n ]\n return { type: 'list', title: 'Active Tunnels', items }\n },\n })\n\n ctx.log.info(`Tunnel ready: ${publicUrl}`)\n },\n\n async teardown() {\n if (service) {\n await service.stop()\n }\n },\n }\n}\n\nexport default createTunnelPlugin()\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createChildLogger
3
- } from "./chunk-XMMAGAT4.js";
3
+ } from "./chunk-R6KZYF7D.js";
4
4
 
5
5
  // src/core/agents/agent-store.ts
6
6
  import * as fs from "fs";
@@ -80,4 +80,4 @@ var AgentStore = class {
80
80
  export {
81
81
  AgentStore
82
82
  };
83
- //# sourceMappingURL=chunk-A6Y4GZM3.js.map
83
+ //# sourceMappingURL=chunk-566W6INH.js.map
@@ -105,44 +105,6 @@ var CONFIG_REGISTRY = [
105
105
  type: "string",
106
106
  scope: "sensitive",
107
107
  hotReload: true
108
- },
109
- {
110
- path: "speech.tts.provider",
111
- displayName: "Text to Speech",
112
- group: "speech",
113
- type: "select",
114
- options: ["edge-tts"],
115
- scope: "safe",
116
- hotReload: true
117
- },
118
- {
119
- path: "speech.tts.providers.edge-tts.voice",
120
- displayName: "Edge TTS Voice",
121
- group: "speech",
122
- type: "select",
123
- options: [
124
- "en-US-AriaNeural",
125
- "en-US-GuyNeural",
126
- "en-US-JennyNeural",
127
- "en-GB-SoniaNeural",
128
- "en-AU-NatashaNeural",
129
- "vi-VN-HoaiMyNeural",
130
- "vi-VN-NamMinhNeural",
131
- "zh-CN-XiaoxiaoNeural",
132
- "zh-CN-YunxiNeural",
133
- "ja-JP-NanamiNeural",
134
- "ja-JP-KeitaNeural",
135
- "ko-KR-SunHiNeural",
136
- "ko-KR-InJoonNeural",
137
- "es-ES-ElviraNeural",
138
- "fr-FR-DeniseNeural",
139
- "de-DE-KatjaNeural",
140
- "pt-BR-FranciscaNeural",
141
- "hi-IN-SwaraNeural",
142
- "ar-SA-ZariyahNeural"
143
- ],
144
- scope: "safe",
145
- hotReload: true
146
108
  }
147
109
  ];
148
110
  function getFieldDef(path2) {
@@ -180,4 +142,4 @@ export {
180
142
  resolveOptions,
181
143
  getConfigValue
182
144
  };
183
- //# sourceMappingURL=chunk-ODUM3D6X.js.map
145
+ //# sourceMappingURL=chunk-5HKQCYOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/config/config-registry.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { Config } from \"./config.js\";\n\nexport interface ConfigFieldDef {\n path: string;\n displayName: string;\n group: string;\n type: \"toggle\" | \"select\" | \"number\" | \"string\";\n options?: string[] | ((config: Config) => string[]);\n scope: \"safe\" | \"sensitive\";\n hotReload: boolean;\n}\n\nexport const CONFIG_REGISTRY: ConfigFieldDef[] = [\n {\n path: \"defaultAgent\",\n displayName: \"Default Agent\",\n group: \"agent\",\n type: \"select\",\n options: (config) => {\n try {\n const agentsPath = path.join(os.homedir(), \".openacp\", \"agents.json\");\n if (fs.existsSync(agentsPath)) {\n const data = JSON.parse(fs.readFileSync(agentsPath, \"utf-8\"));\n return Object.keys(data.installed ?? {});\n }\n } catch {\n /* fallback */\n }\n return Object.keys(config.agents ?? {});\n },\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"channels.telegram.displayVerbosity\",\n displayName: \"Telegram Verbosity\",\n group: \"display\",\n type: \"select\",\n options: [\"low\", \"medium\", \"high\"],\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"channels.discord.displayVerbosity\",\n displayName: \"Discord Verbosity\",\n group: \"display\",\n type: \"select\",\n options: [\"low\", \"medium\", \"high\"],\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"logging.level\",\n displayName: \"Log Level\",\n group: \"logging\",\n type: \"select\",\n options: [\"silent\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"],\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"tunnel.enabled\",\n displayName: \"Tunnel\",\n group: \"tunnel\",\n type: \"toggle\",\n scope: \"safe\",\n hotReload: false,\n },\n {\n path: \"security.maxConcurrentSessions\",\n displayName: \"Max Concurrent Sessions\",\n group: \"security\",\n type: \"number\",\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"security.sessionTimeoutMinutes\",\n displayName: \"Session Timeout (min)\",\n group: \"security\",\n type: \"number\",\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"workspace.baseDir\",\n displayName: \"Workspace Directory\",\n group: \"workspace\",\n type: \"string\",\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"sessionStore.ttlDays\",\n displayName: \"Session Store TTL (days)\",\n group: \"storage\",\n type: \"number\",\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"speech.stt.provider\",\n displayName: \"Speech to Text\",\n group: \"speech\",\n type: \"select\",\n options: [\"groq\"],\n scope: \"safe\",\n hotReload: true,\n },\n {\n path: \"speech.stt.apiKey\",\n displayName: \"STT API Key\",\n group: \"speech\",\n type: \"string\",\n scope: \"sensitive\",\n hotReload: true,\n },\n];\n\nexport function getFieldDef(path: string): ConfigFieldDef | undefined {\n return CONFIG_REGISTRY.find((f) => f.path === path);\n}\n\nexport function getSafeFields(): ConfigFieldDef[] {\n return CONFIG_REGISTRY.filter((f) => f.scope === \"safe\");\n}\n\nexport function isHotReloadable(path: string): boolean {\n const def = getFieldDef(path);\n return def?.hotReload ?? false;\n}\n\nexport function resolveOptions(\n def: ConfigFieldDef,\n config: Config,\n): string[] | undefined {\n if (!def.options) return undefined;\n return typeof def.options === \"function\" ? def.options(config) : def.options;\n}\n\nexport function getConfigValue(config: Config, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = config;\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n"],"mappings":"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","names":["path"]}
@@ -30,7 +30,7 @@ function createTelegramPlugin() {
30
30
  return;
31
31
  }
32
32
  }
33
- const { validateBotToken, validateChatId, validateBotAdmin } = await import("./validators-WSTBNKRW.js");
33
+ const { validateBotToken, validateChatId, validateBotAdmin } = await import("./validators-GITLOFXC.js");
34
34
  let botToken = "";
35
35
  while (true) {
36
36
  botToken = await terminal.text({
@@ -146,7 +146,7 @@ function createTelegramPlugin() {
146
146
  ctx.log.info("Telegram disabled (missing botToken or chatId)");
147
147
  return;
148
148
  }
149
- const { TelegramAdapter } = await import("./adapter-LC2QSDAS.js");
149
+ const { TelegramAdapter } = await import("./adapter-HGJENQCN.js");
150
150
  adapter = new TelegramAdapter(ctx.core, {
151
151
  ...config,
152
152
  enabled: true,
@@ -209,4 +209,4 @@ var telegram_default = createTelegramPlugin();
209
209
  export {
210
210
  telegram_default
211
211
  };
212
- //# sourceMappingURL=chunk-36YQ44D7.js.map
212
+ //# sourceMappingURL=chunk-5TCXYDLR.js.map