@openacp/cli 0.6.10 → 2026.41.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 (133) hide show
  1. package/README.md +34 -16
  2. package/dist/cli.d.ts +11 -0
  3. package/dist/cli.js +28362 -449
  4. package/dist/cli.js.map +1 -1
  5. package/dist/data/registry-snapshot.json +1 -1
  6. package/dist/index.d.ts +1930 -467
  7. package/dist/index.js +17331 -102
  8. package/dist/index.js.map +1 -1
  9. package/package.json +13 -7
  10. package/dist/action-detect-P7ZE4NEM.js +0 -16
  11. package/dist/action-detect-P7ZE4NEM.js.map +0 -1
  12. package/dist/adapter-ZOANORGM.js +0 -799
  13. package/dist/adapter-ZOANORGM.js.map +0 -1
  14. package/dist/admin-6SYB6XCZ.js +0 -23
  15. package/dist/admin-6SYB6XCZ.js.map +0 -1
  16. package/dist/agent-catalog-FC3HGDEQ.js +0 -11
  17. package/dist/agent-catalog-FC3HGDEQ.js.map +0 -1
  18. package/dist/agent-dependencies-4OWBMZWZ.js +0 -24
  19. package/dist/agent-dependencies-4OWBMZWZ.js.map +0 -1
  20. package/dist/agent-registry-WT4NXPYG.js +0 -9
  21. package/dist/agent-registry-WT4NXPYG.js.map +0 -1
  22. package/dist/agent-store-VZLFPTZU.js +0 -9
  23. package/dist/agent-store-VZLFPTZU.js.map +0 -1
  24. package/dist/agents-QO7DKARJ.js +0 -15
  25. package/dist/agents-QO7DKARJ.js.map +0 -1
  26. package/dist/api-client-CFQT5U7D.js +0 -14
  27. package/dist/api-client-CFQT5U7D.js.map +0 -1
  28. package/dist/autostart-X33OGMX6.js +0 -23
  29. package/dist/autostart-X33OGMX6.js.map +0 -1
  30. package/dist/chunk-2CJ46J3C.js +0 -154
  31. package/dist/chunk-2CJ46J3C.js.map +0 -1
  32. package/dist/chunk-2HMQOC7N.js +0 -134
  33. package/dist/chunk-2HMQOC7N.js.map +0 -1
  34. package/dist/chunk-33RP6K2O.js +0 -435
  35. package/dist/chunk-33RP6K2O.js.map +0 -1
  36. package/dist/chunk-34M4OS5P.js +0 -83
  37. package/dist/chunk-34M4OS5P.js.map +0 -1
  38. package/dist/chunk-4CTX774K.js +0 -265
  39. package/dist/chunk-4CTX774K.js.map +0 -1
  40. package/dist/chunk-7QJS2XBD.js +0 -92
  41. package/dist/chunk-7QJS2XBD.js.map +0 -1
  42. package/dist/chunk-BNLGTZ34.js +0 -122
  43. package/dist/chunk-BNLGTZ34.js.map +0 -1
  44. package/dist/chunk-CS3KCJ5D.js +0 -4788
  45. package/dist/chunk-CS3KCJ5D.js.map +0 -1
  46. package/dist/chunk-GAK6PIBW.js +0 -224
  47. package/dist/chunk-GAK6PIBW.js.map +0 -1
  48. package/dist/chunk-I7WC6E5S.js +0 -71
  49. package/dist/chunk-I7WC6E5S.js.map +0 -1
  50. package/dist/chunk-J4SJTKIK.js +0 -203
  51. package/dist/chunk-J4SJTKIK.js.map +0 -1
  52. package/dist/chunk-JHYXKVV2.js +0 -183
  53. package/dist/chunk-JHYXKVV2.js.map +0 -1
  54. package/dist/chunk-JKBFUAJK.js +0 -282
  55. package/dist/chunk-JKBFUAJK.js.map +0 -1
  56. package/dist/chunk-KIRH7TUJ.js +0 -219
  57. package/dist/chunk-KIRH7TUJ.js.map +0 -1
  58. package/dist/chunk-LBIKITQT.js +0 -22
  59. package/dist/chunk-LBIKITQT.js.map +0 -1
  60. package/dist/chunk-LCRLAV4G.js +0 -1085
  61. package/dist/chunk-LCRLAV4G.js.map +0 -1
  62. package/dist/chunk-LGP2YGRL.js +0 -4880
  63. package/dist/chunk-LGP2YGRL.js.map +0 -1
  64. package/dist/chunk-MKHUZLII.js +0 -738
  65. package/dist/chunk-MKHUZLII.js.map +0 -1
  66. package/dist/chunk-NAMYZIS5.js +0 -1
  67. package/dist/chunk-NAMYZIS5.js.map +0 -1
  68. package/dist/chunk-NVPG6JCL.js +0 -724
  69. package/dist/chunk-NVPG6JCL.js.map +0 -1
  70. package/dist/chunk-O7CPGUAI.js +0 -298
  71. package/dist/chunk-O7CPGUAI.js.map +0 -1
  72. package/dist/chunk-OWP7RZ62.js +0 -697
  73. package/dist/chunk-OWP7RZ62.js.map +0 -1
  74. package/dist/chunk-S64CB6J3.js +0 -98
  75. package/dist/chunk-S64CB6J3.js.map +0 -1
  76. package/dist/chunk-UKT3G5IA.js +0 -484
  77. package/dist/chunk-UKT3G5IA.js.map +0 -1
  78. package/dist/chunk-V5GZQEIY.js +0 -101
  79. package/dist/chunk-V5GZQEIY.js.map +0 -1
  80. package/dist/chunk-VOIJ6OY4.js +0 -63
  81. package/dist/chunk-VOIJ6OY4.js.map +0 -1
  82. package/dist/chunk-VUNV25KB.js +0 -16
  83. package/dist/chunk-VUNV25KB.js.map +0 -1
  84. package/dist/chunk-W3EYKZNQ.js +0 -45
  85. package/dist/chunk-W3EYKZNQ.js.map +0 -1
  86. package/dist/chunk-WTZDAYZX.js +0 -172
  87. package/dist/chunk-WTZDAYZX.js.map +0 -1
  88. package/dist/chunk-XANPHG7W.js +0 -145
  89. package/dist/chunk-XANPHG7W.js.map +0 -1
  90. package/dist/config-6S355X75.js +0 -15
  91. package/dist/config-6S355X75.js.map +0 -1
  92. package/dist/config-editor-QQTZMWGD.js +0 -13
  93. package/dist/config-editor-QQTZMWGD.js.map +0 -1
  94. package/dist/config-registry-AHYI4MYL.js +0 -18
  95. package/dist/config-registry-AHYI4MYL.js.map +0 -1
  96. package/dist/daemon-4CS6HMB5.js +0 -30
  97. package/dist/daemon-4CS6HMB5.js.map +0 -1
  98. package/dist/discord-OMC52Y54.js +0 -2239
  99. package/dist/discord-OMC52Y54.js.map +0 -1
  100. package/dist/dist-UHQK5CXN.js +0 -21151
  101. package/dist/dist-UHQK5CXN.js.map +0 -1
  102. package/dist/doctor-HZZ5BSHB.js +0 -10
  103. package/dist/doctor-HZZ5BSHB.js.map +0 -1
  104. package/dist/doctor-OLYBO3V3.js +0 -15
  105. package/dist/doctor-OLYBO3V3.js.map +0 -1
  106. package/dist/install-cloudflared-Z7VCGOVG.js +0 -33
  107. package/dist/install-cloudflared-Z7VCGOVG.js.map +0 -1
  108. package/dist/install-jq-HUYSQWKR.js +0 -32
  109. package/dist/install-jq-HUYSQWKR.js.map +0 -1
  110. package/dist/integrate-PNEHRY2I.js +0 -373
  111. package/dist/integrate-PNEHRY2I.js.map +0 -1
  112. package/dist/log-NXABYJTT.js +0 -24
  113. package/dist/log-NXABYJTT.js.map +0 -1
  114. package/dist/main-XOZCLFUK.js +0 -238
  115. package/dist/main-XOZCLFUK.js.map +0 -1
  116. package/dist/menu-YY5MKHEK.js +0 -16
  117. package/dist/menu-YY5MKHEK.js.map +0 -1
  118. package/dist/new-session-FEO4J4VU.js +0 -17
  119. package/dist/new-session-FEO4J4VU.js.map +0 -1
  120. package/dist/post-upgrade-CJG5I7M2.js +0 -80
  121. package/dist/post-upgrade-CJG5I7M2.js.map +0 -1
  122. package/dist/session-IUSI7P5S.js +0 -20
  123. package/dist/session-IUSI7P5S.js.map +0 -1
  124. package/dist/settings-RQPAM4KC.js +0 -14
  125. package/dist/settings-RQPAM4KC.js.map +0 -1
  126. package/dist/setup-XHS4OMPM.js +0 -37
  127. package/dist/setup-XHS4OMPM.js.map +0 -1
  128. package/dist/suggest-7D6B542M.js +0 -38
  129. package/dist/suggest-7D6B542M.js.map +0 -1
  130. package/dist/tunnel-service-CJLUH6SZ.js +0 -1174
  131. package/dist/tunnel-service-CJLUH6SZ.js.map +0 -1
  132. package/dist/version-NQZBM5M7.js +0 -16
  133. package/dist/version-NQZBM5M7.js.map +0 -1
@@ -1,10 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,15 +0,0 @@
1
- import {
2
- handleDoctor,
3
- handleDoctorButton,
4
- runDoctorInline
5
- } from "./chunk-2HMQOC7N.js";
6
- import "./chunk-NVPG6JCL.js";
7
- import "./chunk-33RP6K2O.js";
8
- import "./chunk-GAK6PIBW.js";
9
- import "./chunk-VUNV25KB.js";
10
- export {
11
- handleDoctor,
12
- handleDoctorButton,
13
- runDoctorInline
14
- };
15
- //# sourceMappingURL=doctor-OLYBO3V3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,33 +0,0 @@
1
- import {
2
- ensureBinary
3
- } from "./chunk-V5GZQEIY.js";
4
- import "./chunk-JKBFUAJK.js";
5
- import "./chunk-GAK6PIBW.js";
6
- import "./chunk-VUNV25KB.js";
7
-
8
- // src/tunnel/providers/install-cloudflared.ts
9
- var CLOUDFLARED_SPEC = {
10
- name: "cloudflared",
11
- githubBaseUrl: "https://github.com/cloudflare/cloudflared/releases/latest/download",
12
- platforms: {
13
- darwin: {
14
- x64: "cloudflared-darwin-amd64.tgz",
15
- arm64: "cloudflared-darwin-amd64.tgz"
16
- },
17
- win32: {
18
- x64: "cloudflared-windows-amd64.exe"
19
- },
20
- linux: {
21
- x64: "cloudflared-linux-amd64",
22
- arm64: "cloudflared-linux-arm64"
23
- }
24
- },
25
- isArchive: (url) => url.endsWith(".tgz")
26
- };
27
- async function ensureCloudflared() {
28
- return ensureBinary(CLOUDFLARED_SPEC);
29
- }
30
- export {
31
- ensureCloudflared
32
- };
33
- //# sourceMappingURL=install-cloudflared-Z7VCGOVG.js.map
@@ -1 +0,0 @@
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,32 +0,0 @@
1
- import {
2
- ensureBinary
3
- } from "./chunk-V5GZQEIY.js";
4
- import "./chunk-JKBFUAJK.js";
5
- import "./chunk-GAK6PIBW.js";
6
- import "./chunk-VUNV25KB.js";
7
-
8
- // src/core/install-jq.ts
9
- var JQ_SPEC = {
10
- name: "jq",
11
- githubBaseUrl: "https://github.com/jqlang/jq/releases/latest/download",
12
- platforms: {
13
- darwin: {
14
- x64: "jq-macos-amd64",
15
- arm64: "jq-macos-arm64"
16
- },
17
- win32: {
18
- x64: "jq-windows-amd64.exe"
19
- },
20
- linux: {
21
- x64: "jq-linux-amd64",
22
- arm64: "jq-linux-arm64"
23
- }
24
- }
25
- };
26
- async function ensureJq() {
27
- return ensureBinary(JQ_SPEC);
28
- }
29
- export {
30
- ensureJq
31
- };
32
- //# sourceMappingURL=install-jq-HUYSQWKR.js.map
@@ -1 +0,0 @@
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,373 +0,0 @@
1
- import {
2
- commandExists,
3
- getAgentCapabilities,
4
- listAgentsWithIntegration
5
- } from "./chunk-JKBFUAJK.js";
6
- import "./chunk-VUNV25KB.js";
7
-
8
- // src/cli/integrate.ts
9
- import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync, rmdirSync } from "fs";
10
- import { join, dirname } from "path";
11
- import { homedir } from "os";
12
- var HOOK_MARKER = "openacp-inject-session.sh";
13
- function expandPath(p) {
14
- return p.replace(/^~/, homedir());
15
- }
16
- function generateInjectScript(_agentKey, spec) {
17
- const sidVar = spec.sessionIdVar ?? "SESSION_ID";
18
- const cwdVar = spec.workingDirVar ?? "WORKING_DIR";
19
- const jqResolver = `JQ=$(command -v jq 2>/dev/null || echo "$HOME/.openacp/bin/jq")`;
20
- if (spec.outputFormat === "plaintext") {
21
- return `#!/bin/bash
22
- ${jqResolver}
23
- INPUT=$(cat)
24
- SESSION_ID=$(echo "$INPUT" | "$JQ" -r '${spec.sessionIdField}')
25
- CWD=$(echo "$INPUT" | "$JQ" -r '.cwd')
26
-
27
- echo "${sidVar}: $SESSION_ID"
28
- echo "${cwdVar}: $CWD"
29
-
30
- exit 0
31
- `;
32
- }
33
- return `#!/bin/bash
34
- ${jqResolver}
35
- INPUT=$(cat)
36
- SESSION_ID=$(echo "$INPUT" | "$JQ" -r '${spec.sessionIdField}')
37
- CWD=$(echo "$INPUT" | "$JQ" -r '.cwd')
38
-
39
- "$JQ" -n --arg sid "$SESSION_ID" --arg cwd "$CWD" \\
40
- '{"additionalContext":"${sidVar}: \\($sid)\\n${cwdVar}: \\($cwd)"}'
41
-
42
- exit 0
43
- `;
44
- }
45
- function generateHandoffScript(agentKey) {
46
- return `#!/bin/bash
47
- SESSION_ID=$1
48
- CWD=$2
49
- CHANNEL=$3
50
-
51
- if [ -z "$SESSION_ID" ]; then
52
- echo "Usage: openacp-handoff.sh <session_id> [cwd] [channel]"
53
- exit 1
54
- fi
55
-
56
- openacp adopt ${agentKey} "$SESSION_ID" \${CWD:+--cwd "$CWD"} \${CHANNEL:+--channel "$CHANNEL"}
57
- `;
58
- }
59
- function generateTunnelCommand() {
60
- return `---
61
- description: 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.
62
- ---
63
-
64
- You 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.
65
-
66
- ## Commands
67
-
68
- \`\`\`bash
69
- # Create a tunnel \u2014 exposes local port to the internet
70
- openacp tunnel add <port> --label <name>
71
-
72
- # List all active tunnels with their public URLs
73
- openacp tunnel list
74
-
75
- # Stop a specific tunnel
76
- openacp tunnel stop <port>
77
-
78
- # Stop all tunnels
79
- openacp tunnel stop-all
80
- \`\`\`
81
-
82
- ## When to use
83
-
84
- User wants to:
85
- - **Share their local app** \u2014 "share this on my phone", "let my friend see this", "preview on mobile"
86
- - **Expose a port** \u2014 "expose port 3000", "map port 5173", "make port 8080 public"
87
- - **Get a public URL** \u2014 "give me a public URL", "I need an external link", "make localhost accessible"
88
- - **Open a tunnel** \u2014 "open tunnel", "start tunnel", "tunnel this", "b\u1EADt tunnel"
89
- - **Forward/proxy a port** \u2014 "forward port 3000", "proxy my server"
90
- - **Deploy preview** \u2014 "deploy preview", "share a preview link"
91
- - **Access remotely** \u2014 "access from my phone", "access from outside"
92
- - **Manage tunnels** \u2014 "show tunnels", "list tunnels", "stop tunnel", "close tunnel", "kill tunnel"
93
-
94
- ## How to respond
95
-
96
- 1. Run the CLI command
97
- 2. Share the public URL with the user
98
- 3. Mention the URL works on any device (phone, tablet, other computer)
99
- 4. If the user hasn't started a dev server yet, remind them to start one first
100
-
101
- ## Example flow
102
-
103
- User: "I want to see this React app on my phone"
104
- \u2192 Check if dev server is running (e.g. port 5173 for Vite)
105
- \u2192 Run: \`openacp tunnel add 5173 --label react-app\`
106
- \u2192 Share the public URL
107
- `;
108
- }
109
- function generateHandoffCommand(_agentKey, spec) {
110
- const sidVar = spec.sessionIdVar ?? "SESSION_ID";
111
- const cwdVar = spec.workingDirVar ?? "WORKING_DIR";
112
- const hooksDir = expandPath(spec.hooksDirPath);
113
- return `---
114
- description: Transfer current session to OpenACP (Telegram/Discord)
115
- ---
116
-
117
- Look at the context injected at the start of this message to find
118
- ${sidVar} and ${cwdVar}, then run:
119
-
120
- bash ${hooksDir}openacp-handoff.sh <${sidVar}> <${cwdVar}> <args if any>
121
-
122
- Usage: /openacp:handoff [channel]
123
- channel: telegram, discord, or omit for default adapter
124
-
125
- Examples:
126
- /openacp:handoff
127
- /openacp:handoff discord
128
- /openacp:handoff telegram
129
- `;
130
- }
131
- function mergeSettingsJson(settingsPath, hookEvent, hookScriptPath) {
132
- const fullPath = expandPath(settingsPath);
133
- let settings = {};
134
- if (existsSync(fullPath)) {
135
- const raw = readFileSync(fullPath, "utf-8");
136
- writeFileSync(`${fullPath}.bak`, raw);
137
- settings = JSON.parse(raw);
138
- }
139
- const hooks = settings.hooks ?? {};
140
- settings.hooks = hooks;
141
- const eventHooks = hooks[hookEvent] ?? [];
142
- hooks[hookEvent] = eventHooks;
143
- const alreadyInstalled = eventHooks.some(
144
- (group) => group.hooks?.some((h) => h.command?.includes(HOOK_MARKER))
145
- );
146
- if (!alreadyInstalled) {
147
- eventHooks.push({
148
- hooks: [{ type: "command", command: hookScriptPath }]
149
- });
150
- }
151
- mkdirSync(dirname(fullPath), { recursive: true });
152
- writeFileSync(fullPath, JSON.stringify(settings, null, 2) + "\n");
153
- }
154
- function mergeHooksJson(settingsPath, hookEvent, hookScriptPath) {
155
- const fullPath = expandPath(settingsPath);
156
- let config = { version: 1 };
157
- if (existsSync(fullPath)) {
158
- const raw = readFileSync(fullPath, "utf-8");
159
- writeFileSync(`${fullPath}.bak`, raw);
160
- config = JSON.parse(raw);
161
- }
162
- const hooks = config.hooks ?? {};
163
- config.hooks = hooks;
164
- const eventHooks = hooks[hookEvent] ?? [];
165
- hooks[hookEvent] = eventHooks;
166
- const alreadyInstalled = eventHooks.some((h) => h.command?.includes(HOOK_MARKER));
167
- if (!alreadyInstalled) {
168
- eventHooks.push({ command: hookScriptPath });
169
- }
170
- mkdirSync(dirname(fullPath), { recursive: true });
171
- writeFileSync(fullPath, JSON.stringify(config, null, 2) + "\n");
172
- }
173
- function removeFromSettingsJson(settingsPath, hookEvent) {
174
- const fullPath = expandPath(settingsPath);
175
- if (!existsSync(fullPath)) return;
176
- const raw = readFileSync(fullPath, "utf-8");
177
- const settings = JSON.parse(raw);
178
- const hooks = settings.hooks;
179
- if (!hooks?.[hookEvent]) return;
180
- hooks[hookEvent] = hooks[hookEvent].filter(
181
- (group) => !group.hooks?.some((h) => h.command?.includes("openacp-"))
182
- );
183
- if (hooks[hookEvent].length === 0) {
184
- delete hooks[hookEvent];
185
- }
186
- writeFileSync(fullPath, JSON.stringify(settings, null, 2) + "\n");
187
- }
188
- function removeFromHooksJson(settingsPath, hookEvent) {
189
- const fullPath = expandPath(settingsPath);
190
- if (!existsSync(fullPath)) return;
191
- const raw = readFileSync(fullPath, "utf-8");
192
- const config = JSON.parse(raw);
193
- const hooks = config.hooks;
194
- if (!hooks?.[hookEvent]) return;
195
- hooks[hookEvent] = hooks[hookEvent].filter(
196
- (h) => !h.command?.includes("openacp-")
197
- );
198
- if (hooks[hookEvent].length === 0) {
199
- delete hooks[hookEvent];
200
- }
201
- writeFileSync(fullPath, JSON.stringify(config, null, 2) + "\n");
202
- }
203
- async function installIntegration(agentKey, spec) {
204
- const logs = [];
205
- try {
206
- if (!commandExists("jq")) {
207
- return {
208
- success: false,
209
- logs: ["jq is required for handoff hooks. Install: brew install jq (macOS) or apt install jq (Linux)"]
210
- };
211
- }
212
- const hooksDir = expandPath(spec.hooksDirPath);
213
- mkdirSync(hooksDir, { recursive: true });
214
- const injectPath = join(hooksDir, "openacp-inject-session.sh");
215
- writeFileSync(injectPath, generateInjectScript(agentKey, spec));
216
- chmodSync(injectPath, 493);
217
- logs.push(`Created ${injectPath}`);
218
- const handoffPath = join(hooksDir, "openacp-handoff.sh");
219
- writeFileSync(handoffPath, generateHandoffScript(agentKey));
220
- chmodSync(handoffPath, 493);
221
- logs.push(`Created ${handoffPath}`);
222
- if (spec.commandsPath && spec.handoffCommandName) {
223
- if (spec.commandFormat === "skill") {
224
- const skillDir = expandPath(join(spec.commandsPath, spec.handoffCommandName));
225
- mkdirSync(skillDir, { recursive: true });
226
- const skillPath = join(skillDir, "SKILL.md");
227
- writeFileSync(skillPath, generateHandoffCommand(agentKey, spec));
228
- logs.push(`Created ${skillPath}`);
229
- } else {
230
- const cmdsDir = expandPath(spec.commandsPath);
231
- mkdirSync(cmdsDir, { recursive: true });
232
- const cmdPath = join(cmdsDir, `${spec.handoffCommandName}.md`);
233
- writeFileSync(cmdPath, generateHandoffCommand(agentKey, spec));
234
- logs.push(`Created ${cmdPath}`);
235
- }
236
- }
237
- const injectFullPath = join(hooksDir, "openacp-inject-session.sh");
238
- if (spec.settingsFormat === "hooks_json") {
239
- mergeHooksJson(spec.settingsPath, spec.hookEvent, injectFullPath);
240
- } else {
241
- mergeSettingsJson(spec.settingsPath, spec.hookEvent, injectFullPath);
242
- }
243
- logs.push(`Updated ${expandPath(spec.settingsPath)}`);
244
- return { success: true, logs };
245
- } catch (err) {
246
- logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);
247
- return { success: false, logs };
248
- }
249
- }
250
- async function uninstallIntegration(agentKey, spec) {
251
- const logs = [];
252
- try {
253
- const hooksDir = expandPath(spec.hooksDirPath);
254
- for (const filename of ["openacp-inject-session.sh", "openacp-handoff.sh"]) {
255
- const filePath = join(hooksDir, filename);
256
- if (existsSync(filePath)) {
257
- unlinkSync(filePath);
258
- logs.push(`Removed ${filePath}`);
259
- }
260
- }
261
- if (spec.commandsPath && spec.handoffCommandName) {
262
- if (spec.commandFormat === "skill") {
263
- const skillDir = expandPath(join(spec.commandsPath, spec.handoffCommandName));
264
- const skillPath = join(skillDir, "SKILL.md");
265
- if (existsSync(skillPath)) {
266
- unlinkSync(skillPath);
267
- try {
268
- rmdirSync(skillDir);
269
- } catch {
270
- }
271
- logs.push(`Removed ${skillPath}`);
272
- }
273
- } else {
274
- const cmdPath = expandPath(join(spec.commandsPath, `${spec.handoffCommandName}.md`));
275
- if (existsSync(cmdPath)) {
276
- unlinkSync(cmdPath);
277
- logs.push(`Removed ${cmdPath}`);
278
- }
279
- }
280
- }
281
- if (spec.settingsFormat === "hooks_json") {
282
- removeFromHooksJson(spec.settingsPath, spec.hookEvent);
283
- } else {
284
- removeFromSettingsJson(spec.settingsPath, spec.hookEvent);
285
- }
286
- logs.push(`Updated ${expandPath(spec.settingsPath)}`);
287
- return { success: true, logs };
288
- } catch (err) {
289
- logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);
290
- return { success: false, logs };
291
- }
292
- }
293
- function buildHandoffItem(agentKey, spec) {
294
- const hooksDir = expandPath(spec.hooksDirPath);
295
- return {
296
- id: "handoff",
297
- name: "Handoff",
298
- description: "Transfer sessions between terminal and messaging platforms",
299
- isInstalled() {
300
- return existsSync(join(hooksDir, "openacp-inject-session.sh")) && existsSync(join(hooksDir, "openacp-handoff.sh"));
301
- },
302
- install: () => installIntegration(agentKey, spec),
303
- uninstall: () => uninstallIntegration(agentKey, spec)
304
- };
305
- }
306
- function getSkillBasePath(spec) {
307
- const base = spec.commandsPath;
308
- const skillsBase = base.replace(/\/commands\/?$/, "/skills/");
309
- return expandPath(skillsBase);
310
- }
311
- function buildTunnelItem(spec) {
312
- if (!spec.commandsPath) return null;
313
- function getTunnelPath() {
314
- return join(getSkillBasePath(spec), "openacp-tunnel", "SKILL.md");
315
- }
316
- return {
317
- id: "tunnel",
318
- name: "Tunnel",
319
- description: "Expose local ports to the internet via OpenACP tunnel",
320
- isInstalled() {
321
- return existsSync(getTunnelPath());
322
- },
323
- async install() {
324
- const logs = [];
325
- try {
326
- const skillPath = getTunnelPath();
327
- mkdirSync(dirname(skillPath), { recursive: true });
328
- writeFileSync(skillPath, generateTunnelCommand());
329
- logs.push(`Created ${skillPath}`);
330
- return { success: true, logs };
331
- } catch (err) {
332
- logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);
333
- return { success: false, logs };
334
- }
335
- },
336
- async uninstall() {
337
- const logs = [];
338
- try {
339
- const skillPath = getTunnelPath();
340
- if (existsSync(skillPath)) {
341
- unlinkSync(skillPath);
342
- try {
343
- rmdirSync(dirname(skillPath));
344
- } catch {
345
- }
346
- logs.push(`Removed ${skillPath}`);
347
- }
348
- return { success: true, logs };
349
- } catch (err) {
350
- logs.push(`Error: ${err instanceof Error ? err.message : String(err)}`);
351
- return { success: false, logs };
352
- }
353
- }
354
- };
355
- }
356
- function getIntegration(agentName) {
357
- const caps = getAgentCapabilities(agentName);
358
- if (!caps.integration) return void 0;
359
- const items = [buildHandoffItem(agentName, caps.integration)];
360
- const tunnelItem = buildTunnelItem(caps.integration);
361
- if (tunnelItem) items.push(tunnelItem);
362
- return { items };
363
- }
364
- function listIntegrations() {
365
- return listAgentsWithIntegration();
366
- }
367
- export {
368
- getIntegration,
369
- installIntegration,
370
- listIntegrations,
371
- uninstallIntegration
372
- };
373
- //# sourceMappingURL=integrate-PNEHRY2I.js.map
@@ -1 +0,0 @@
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,24 +0,0 @@
1
- import {
2
- cleanupOldSessionLogs,
3
- createChildLogger,
4
- createSessionLogger,
5
- initLogger,
6
- log,
7
- muteLogger,
8
- setLogLevel,
9
- shutdownLogger,
10
- unmuteLogger
11
- } from "./chunk-GAK6PIBW.js";
12
- import "./chunk-VUNV25KB.js";
13
- export {
14
- cleanupOldSessionLogs,
15
- createChildLogger,
16
- createSessionLogger,
17
- initLogger,
18
- log,
19
- muteLogger,
20
- setLogLevel,
21
- shutdownLogger,
22
- unmuteLogger
23
- };
24
- //# sourceMappingURL=log-NXABYJTT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}