@openacp/cli 0.6.10 → 2026.41.1

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 +27787 -467
  4. package/dist/cli.js.map +1 -1
  5. package/dist/data/registry-snapshot.json +1 -1
  6. package/dist/index.d.ts +1944 -463
  7. package/dist/index.js +17365 -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,697 +0,0 @@
1
- // src/adapters/shared/format-types.ts
2
- var STATUS_ICONS = {
3
- pending: "\u23F3",
4
- in_progress: "\u{1F504}",
5
- completed: "\u2705",
6
- failed: "\u274C",
7
- cancelled: "\u{1F6AB}",
8
- running: "\u{1F504}",
9
- done: "\u2705",
10
- error: "\u274C"
11
- };
12
- var KIND_ICONS = {
13
- read: "\u{1F4D6}",
14
- edit: "\u270F\uFE0F",
15
- write: "\u270F\uFE0F",
16
- delete: "\u{1F5D1}\uFE0F",
17
- execute: "\u25B6\uFE0F",
18
- command: "\u25B6\uFE0F",
19
- bash: "\u25B6\uFE0F",
20
- search: "\u{1F50D}",
21
- web: "\u{1F310}",
22
- fetch: "\u{1F310}",
23
- agent: "\u{1F9E0}",
24
- think: "\u{1F9E0}",
25
- install: "\u{1F4E6}",
26
- move: "\u{1F4E6}",
27
- other: "\u{1F6E0}\uFE0F"
28
- };
29
-
30
- // src/adapters/shared/message-formatter.ts
31
- function extractContentText(content, depth = 0) {
32
- if (!content || depth > 5) return "";
33
- if (typeof content === "string") return content;
34
- if (Array.isArray(content)) {
35
- return content.map((c) => extractContentText(c, depth + 1)).filter(Boolean).join("\n");
36
- }
37
- if (typeof content !== "object") return String(content);
38
- const obj = content;
39
- if (obj.text && typeof obj.text === "string") return obj.text;
40
- if (obj.content) {
41
- if (typeof obj.content === "string") return obj.content;
42
- if (Array.isArray(obj.content)) {
43
- return obj.content.map((c) => extractContentText(c, depth + 1)).filter(Boolean).join("\n");
44
- }
45
- return extractContentText(obj.content, depth + 1);
46
- }
47
- if (obj.input) return extractContentText(obj.input, depth + 1);
48
- if (obj.output) return extractContentText(obj.output, depth + 1);
49
- const keys = Object.keys(obj).filter((k) => k !== "type");
50
- if (keys.length === 0) return "";
51
- try {
52
- return JSON.stringify(obj, null, 2);
53
- } catch {
54
- return "";
55
- }
56
- }
57
- function parseRawInput(rawInput) {
58
- try {
59
- if (typeof rawInput === "string") {
60
- return JSON.parse(rawInput);
61
- }
62
- if (typeof rawInput === "object" && rawInput !== null) {
63
- return rawInput;
64
- }
65
- } catch {
66
- }
67
- return {};
68
- }
69
- function formatToolSummary(name, rawInput, displaySummary) {
70
- if (displaySummary && typeof displaySummary === "string") {
71
- return displaySummary;
72
- }
73
- const args = parseRawInput(rawInput);
74
- const lowerName = name.toLowerCase();
75
- if (lowerName === "read") {
76
- const fp = args.file_path ?? args.filePath ?? "";
77
- const limit = args.limit ? ` (${args.limit} lines)` : "";
78
- return fp ? `\u{1F4D6} Read ${fp}${limit}` : `\u{1F527} ${name}`;
79
- }
80
- if (lowerName === "edit") {
81
- const fp = args.file_path ?? args.filePath ?? "";
82
- return fp ? `\u270F\uFE0F Edit ${fp}` : `\u{1F527} ${name}`;
83
- }
84
- if (lowerName === "write") {
85
- const fp = args.file_path ?? args.filePath ?? "";
86
- return fp ? `\u{1F4DD} Write ${fp}` : `\u{1F527} ${name}`;
87
- }
88
- if (lowerName === "bash") {
89
- const cmd = String(args.command ?? "").slice(0, 60);
90
- return cmd ? `\u25B6\uFE0F Run: ${cmd}` : `\u{1F527} ${name}`;
91
- }
92
- if (lowerName === "grep") {
93
- const pattern = args.pattern ?? "";
94
- const path = args.path ?? "";
95
- return pattern ? `\u{1F50D} Grep "${pattern}"${path ? ` in ${path}` : ""}` : `\u{1F527} ${name}`;
96
- }
97
- if (lowerName === "glob") {
98
- const pattern = args.pattern ?? "";
99
- return pattern ? `\u{1F50D} Glob ${pattern}` : `\u{1F527} ${name}`;
100
- }
101
- if (lowerName === "agent") {
102
- const desc = String(args.description ?? "").slice(0, 60);
103
- return desc ? `\u{1F9E0} Agent: ${desc}` : `\u{1F527} ${name}`;
104
- }
105
- if (lowerName === "webfetch" || lowerName === "web_fetch") {
106
- const url = String(args.url ?? "").slice(0, 60);
107
- return url ? `\u{1F310} Fetch ${url}` : `\u{1F527} ${name}`;
108
- }
109
- if (lowerName === "websearch" || lowerName === "web_search") {
110
- const query = String(args.query ?? "").slice(0, 60);
111
- return query ? `\u{1F310} Search "${query}"` : `\u{1F527} ${name}`;
112
- }
113
- return `\u{1F527} ${name}`;
114
- }
115
- function formatToolTitle(name, rawInput, displayTitle) {
116
- if (displayTitle && typeof displayTitle === "string") {
117
- return displayTitle;
118
- }
119
- const args = parseRawInput(rawInput);
120
- const lowerName = name.toLowerCase();
121
- if (["read", "edit", "write"].includes(lowerName)) {
122
- return String(args.file_path ?? args.filePath ?? name);
123
- }
124
- if (lowerName === "bash") {
125
- return String(args.command ?? name).slice(0, 60);
126
- }
127
- if (lowerName === "grep") {
128
- const pattern = args.pattern ?? "";
129
- const path = args.path ?? "";
130
- return pattern ? `"${pattern}"${path ? ` in ${path}` : ""}` : name;
131
- }
132
- if (lowerName === "glob") {
133
- return String(args.pattern ?? name);
134
- }
135
- if (lowerName === "agent") {
136
- return String(args.description ?? name).slice(0, 60);
137
- }
138
- if (["webfetch", "web_fetch"].includes(lowerName)) {
139
- return String(args.url ?? name).slice(0, 60);
140
- }
141
- if (["websearch", "web_search"].includes(lowerName)) {
142
- return String(args.query ?? name).slice(0, 60);
143
- }
144
- return name;
145
- }
146
- function resolveToolIcon(tool) {
147
- const statusIcon = STATUS_ICONS[tool.status || ""];
148
- if (statusIcon) return statusIcon;
149
- const kind = tool.displayKind ?? tool.kind;
150
- if (kind && KIND_ICONS[kind]) return KIND_ICONS[kind];
151
- return "\u{1F527}";
152
- }
153
- var NOISE_RULES = [
154
- {
155
- match: (name) => name.toLowerCase() === "ls",
156
- action: "hide"
157
- },
158
- {
159
- match: (_name, kind, rawInput) => {
160
- if (kind !== "read") return false;
161
- const args = parseRawInput(rawInput);
162
- const p = String(args.file_path ?? args.filePath ?? args.path ?? "");
163
- return p.endsWith("/");
164
- },
165
- action: "hide"
166
- },
167
- {
168
- match: (name) => name.toLowerCase() === "glob",
169
- action: "collapse"
170
- }
171
- ];
172
- function evaluateNoise(name, kind, rawInput) {
173
- for (const rule of NOISE_RULES) {
174
- if (rule.match(name, kind, rawInput)) return rule.action;
175
- }
176
- return null;
177
- }
178
-
179
- // src/adapters/shared/message-dispatcher.ts
180
- var HIDDEN_ON_LOW = /* @__PURE__ */ new Set(["thought", "plan", "usage"]);
181
- function shouldDispatch(type, verbosity) {
182
- if (verbosity === "low" && HIDDEN_ON_LOW.has(type)) return false;
183
- return true;
184
- }
185
- async function dispatchMessage(handlers, ctx, content, verbosity = "medium") {
186
- if (!shouldDispatch(content.type, verbosity)) return;
187
- switch (content.type) {
188
- case "text":
189
- return handlers.onText(ctx, content);
190
- case "thought":
191
- return handlers.onThought(ctx, content);
192
- case "tool_call":
193
- return handlers.onToolCall(ctx, content);
194
- case "tool_update":
195
- return handlers.onToolUpdate(ctx, content);
196
- case "plan":
197
- return handlers.onPlan(ctx, content);
198
- case "usage":
199
- return handlers.onUsage(ctx, content);
200
- case "session_end":
201
- return handlers.onSessionEnd(ctx, content);
202
- case "error":
203
- return handlers.onError(ctx, content);
204
- case "attachment":
205
- return handlers.onAttachment(ctx, content);
206
- case "system_message":
207
- return handlers.onSystemMessage(ctx, content);
208
- default:
209
- return;
210
- }
211
- }
212
-
213
- // src/adapters/shared/format-utils.ts
214
- function progressBar(ratio, length = 10) {
215
- const filled = Math.round(Math.min(ratio, 1) * length);
216
- return "\u2593".repeat(filled) + "\u2591".repeat(length - filled);
217
- }
218
- function formatTokens(n) {
219
- return n >= 1e3 ? `${Math.round(n / 1e3)}k` : String(n);
220
- }
221
- function stripCodeFences(text) {
222
- return text.replace(/```\w*\n?/g, "").replace(/```$/gm, "").trim();
223
- }
224
- function truncateContent(text, maxLen) {
225
- if (text.length <= maxLen) return text;
226
- return text.slice(0, maxLen) + "\n\u2026 (truncated)";
227
- }
228
- function splitMessage(text, maxLength) {
229
- if (text.length <= maxLength) return [text];
230
- const chunks = [];
231
- let remaining = text;
232
- while (remaining.length > 0) {
233
- if (remaining.length <= maxLength) {
234
- chunks.push(remaining);
235
- break;
236
- }
237
- const wouldLeaveSmall = remaining.length < maxLength * 1.3;
238
- const searchLimit = wouldLeaveSmall ? Math.floor(remaining.length / 2) + 300 : maxLength;
239
- const threshold = maxLength * 0.2;
240
- let splitAt = remaining.lastIndexOf("\n\n", searchLimit);
241
- if (splitAt === -1 || splitAt < threshold) {
242
- splitAt = remaining.lastIndexOf("\n", searchLimit);
243
- }
244
- if (splitAt === -1 || splitAt < threshold) {
245
- splitAt = searchLimit;
246
- }
247
- const candidate = remaining.slice(0, splitAt);
248
- const fences = candidate.match(/```/g);
249
- if (fences && fences.length % 2 !== 0) {
250
- const closingFence = remaining.indexOf("```", splitAt);
251
- if (closingFence !== -1) {
252
- const afterFence = remaining.indexOf("\n", closingFence + 3);
253
- const fenceSplit = afterFence !== -1 ? afterFence + 1 : closingFence + 3;
254
- if (fenceSplit <= maxLength * 2) {
255
- splitAt = fenceSplit;
256
- }
257
- }
258
- }
259
- chunks.push(remaining.slice(0, splitAt));
260
- remaining = remaining.slice(splitAt).replace(/^\n+/, "");
261
- }
262
- return chunks;
263
- }
264
-
265
- // src/product-guide.ts
266
- var PRODUCT_GUIDE = `
267
- # OpenACP \u2014 Product Guide
268
-
269
- OpenACP lets you chat with AI coding agents (like Claude Code) through messaging platforms (Telegram, Discord).
270
- You type messages in your chat platform, the agent reads/writes/runs code in your project folder, and results stream back in real time.
271
-
272
- ---
273
-
274
- ## Quick Start
275
-
276
- 1. Start OpenACP: \`openacp\` (or \`openacp start\` for background daemon)
277
- 2. Open your messaging platform (Telegram group or Discord server) \u2014 you'll see the Assistant topic/thread
278
- 3. Tap/click \u{1F195} New Session or type /new
279
- 4. Pick an agent and a project folder
280
- 5. Chat in the session topic/thread \u2014 the agent works on your code
281
-
282
- ---
283
-
284
- ## Core Concepts
285
-
286
- ### Sessions
287
- A session = one conversation with one AI agent working in one project folder.
288
- Each session gets its own topic (Telegram) or forum thread (Discord). Chat there to give instructions to the agent.
289
-
290
- ### Agents
291
- An agent is an AI coding tool (e.g., Claude Code, Gemini, Cursor, Codex, etc.).
292
- OpenACP supports 28+ agents from the official ACP Registry (agentclientprotocol.com).
293
- You can install multiple agents and choose which one to use per session.
294
- The default agent is used when you don't specify one.
295
-
296
- ### Agent Management
297
- - Browse agents: \`/agents\` in your chat platform or \`openacp agents\` in CLI
298
- - Install: tap the install button in /agents, or \`openacp agents install <name>\`
299
- - Uninstall: \`openacp agents uninstall <name>\`
300
- - Setup/login: \`openacp agents run <name> -- <args>\` (e.g., \`openacp agents run gemini -- auth login\`)
301
- - Details: \`openacp agents info <name>\` shows version, dependencies, and setup steps
302
-
303
- Some agents need additional setup before they can be used:
304
- - Claude: requires \`claude login\`
305
- - Gemini: requires \`openacp agents run gemini -- auth login\`
306
- - Codex: requires setting \`OPENAI_API_KEY\` environment variable
307
- - GitHub Copilot: requires \`openacp agents run copilot -- auth login\`
308
-
309
- Agents are installed in three ways depending on the agent:
310
- - **npx** \u2014 Node.js agents, downloaded automatically on first use
311
- - **uvx** \u2014 Python agents, downloaded automatically on first use
312
- - **binary** \u2014 Platform-specific binaries, downloaded to \`~/.openacp/agents/\`
313
-
314
- ### Project Folder (Workspace)
315
- The directory where the agent reads, writes, and runs code.
316
- When creating a session, you choose which folder the agent works in.
317
- You can type a full path like \`~/code/my-project\` or just a name like \`my-project\` (it becomes \`<base-dir>/my-project\`).
318
-
319
- ### System Topics
320
- - **Assistant** \u2014 Always-on helper that can answer questions, create sessions, check status, troubleshoot
321
- - **Notifications** \u2014 System alerts (permission requests, session errors, completions)
322
-
323
- ---
324
-
325
- ## Creating Sessions
326
-
327
- ### From menu
328
- Tap \u{1F195} New Session \u2192 choose agent (if multiple) \u2192 choose project folder \u2192 confirm
329
-
330
- ### From command
331
- - \`/new\` \u2014 Interactive flow (asks agent + folder)
332
- - \`/new claude ~/code/my-project\` \u2014 Create directly with specific agent and folder
333
-
334
- ### From Assistant topic
335
- Just ask: "Create a session for my-project with claude" \u2014 the assistant handles it
336
-
337
- ### Quick new chat
338
- \`/newchat\` in a session topic \u2014 creates new session with same agent and folder as current one
339
-
340
- ---
341
-
342
- ## Working with Sessions
343
-
344
- ### Chat
345
- Type messages in the session topic. The agent responds with code changes, explanations, tool outputs.
346
-
347
- ### What you see while the agent works
348
- - **\u{1F4AD} Thinking indicator** \u2014 Shows when the agent is reasoning, with elapsed time
349
- - **Text responses** \u2014 Streamed in real time, updated every few seconds
350
- - **Tool calls** \u2014 When the agent runs commands or edits files, you see tool name, input, status, and output
351
- - **\u{1F4CB} Plan card** \u2014 Visual task progress with completed/in-progress/pending items and progress bar
352
- - **"View File" / "View Diff" buttons** \u2014 Opens in browser with Monaco editor (requires tunnel)
353
-
354
- ### Session lifecycle
355
- 1. **Creating** \u2014 Topic created, agent spawning
356
- 2. **Warming up** \u2014 Agent primes its cache (happens automatically, invisible to you)
357
- 3. **Active** \u2014 Ready for your messages
358
- 4. **Auto-naming** \u2014 After your first message, the session gets a descriptive name (agent summarizes in ~5 words). The topic title updates automatically.
359
- 5. **Finished/Error** \u2014 Session completed or hit an error
360
-
361
- ### Agent skills
362
- Some agents provide slash commands (e.g., /compact, /review). Available skills are pinned in the session topic.
363
-
364
- ### Permission requests
365
- When the agent wants to run a command, it asks for permission.
366
- You see buttons: \u2705 Allow, \u274C Reject (and sometimes "Always Allow").
367
- A notification also appears in the Notifications topic with a link to the request.
368
-
369
- ### Dangerous mode
370
- Auto-approves ALL permission requests \u2014 the agent runs any command without asking.
371
- - Enable: \`/enable_dangerous\` or tap the \u2620\uFE0F button in the session
372
- - Disable: \`/disable_dangerous\` or tap the \u{1F510} button
373
- - \u26A0\uFE0F Use with caution \u2014 the agent can execute anything
374
-
375
- ### Session timeout
376
- Idle sessions are automatically cancelled after a configurable timeout (default: 60 minutes).
377
- Configure via \`security.sessionTimeoutMinutes\` in config.
378
-
379
- ---
380
-
381
- ## Session Transfer (Handoff)
382
-
383
- ### Chat \u2192 Terminal
384
- 1. Type \`/handoff\` in a session topic/thread
385
- 2. You get a command like \`claude --resume <SESSION_ID>\`
386
- 3. Copy and run it in your terminal \u2014 the session continues there with full conversation history
387
-
388
- ### Terminal \u2192 Chat
389
- 1. First time: run \`openacp integrate claude\` to install the handoff skill (one-time setup)
390
- 2. In Claude Code, use the /openacp:handoff slash command
391
- 3. The session appears as a new topic/thread and you can continue chatting there
392
-
393
- ### How it works
394
- - The agent session ID is shared between platforms
395
- - Conversation history is preserved \u2014 pick up where you left off
396
- - The agent that supports resume (e.g., Claude with \`--resume\`) handles the actual transfer
397
-
398
- ---
399
-
400
- ## Managing Sessions
401
-
402
- ### Status
403
- - \`/status\` \u2014 Shows active sessions count and details
404
- - Ask the Assistant: "What sessions are running?"
405
-
406
- ### List all sessions
407
- - \`/sessions\` \u2014 Shows all sessions with status (active, finished, error)
408
-
409
- ### Cancel
410
- - \`/cancel\` in a session topic \u2014 cancels that session
411
- - Ask the Assistant: "Cancel the stuck session"
412
-
413
- ### Cleanup
414
- - From \`/sessions\` \u2192 tap cleanup buttons (finished, errors, all)
415
- - Ask the Assistant: "Clean up old sessions"
416
-
417
- ---
418
-
419
- ## Assistant Topic
420
-
421
- The Assistant is an always-on AI helper in its own topic. It can:
422
- - Answer questions about OpenACP
423
- - Create sessions for you
424
- - Check status and health
425
- - Cancel sessions
426
- - Clean up old sessions
427
- - Troubleshoot issues
428
- - Manage configuration
429
-
430
- Just chat naturally: "How do I create a session?", "What's the status?", "Something is stuck"
431
-
432
- ### Clear history
433
- \`/clear\` in the Assistant topic \u2014 resets the conversation
434
-
435
- ---
436
-
437
- ## System Commands
438
-
439
- | Command | Where | What it does |
440
- |---------|-------|-------------|
441
- | \`/new [agent] [path]\` | Anywhere | Create new session |
442
- | \`/newchat\` | Session topic | New session, same agent + folder |
443
- | \`/cancel\` | Session topic | Cancel current session |
444
- | \`/status\` | Anywhere | Show status |
445
- | \`/sessions\` | Anywhere | List all sessions |
446
- | \`/agents\` | Anywhere | Browse & install agents from ACP Registry |
447
- | \`/install <name>\` | Anywhere | Install an agent |
448
- | \`/enable_dangerous\` | Session topic | Auto-approve all permissions |
449
- | \`/disable_dangerous\` | Session topic | Restore permission prompts |
450
- | \`/handoff\` | Session topic | Transfer session to terminal |
451
- | \`/clear\` | Assistant topic | Clear assistant history |
452
- | \`/menu\` | Anywhere | Show action menu |
453
- | \`/help\` | Anywhere | Show help |
454
- | \`/restart\` | Anywhere | Restart OpenACP |
455
- | \`/update\` | Anywhere | Update to latest version |
456
- | \`/integrate\` | Anywhere | Manage agent integrations |
457
-
458
- ---
459
-
460
- ## Menu Buttons
461
-
462
- | Button | Action |
463
- |--------|--------|
464
- | \u{1F195} New Session | Create new session (interactive) |
465
- | \u{1F4CB} Sessions | List all sessions with cleanup options |
466
- | \u{1F4CA} Status | Show active/total session count |
467
- | \u{1F916} Agents | List available agents |
468
- | \u{1F517} Integrate | Manage agent integrations |
469
- | \u2753 Help | Show help text |
470
- | \u{1F504} Restart | Restart OpenACP |
471
- | \u2B06\uFE0F Update | Check and install updates |
472
-
473
- ---
474
-
475
- ## CLI Commands
476
-
477
- ### Server
478
- - \`openacp\` \u2014 Start (uses configured mode: foreground or daemon)
479
- - \`openacp start\` \u2014 Start as background daemon
480
- - \`openacp stop\` \u2014 Stop daemon
481
- - \`openacp status\` \u2014 Show daemon status
482
- - \`openacp logs\` \u2014 Tail daemon logs
483
- - \`openacp --foreground\` \u2014 Force foreground mode (useful for debugging or containers)
484
-
485
- ### Auto-start (run on boot)
486
- - macOS: installs a LaunchAgent in \`~/Library/LaunchAgents/\`
487
- - Linux: installs a systemd user service in \`~/.config/systemd/user/\`
488
- - Enabled automatically when you start the daemon. Remove with \`openacp stop\`.
489
-
490
- ### Configuration
491
- - \`openacp config\` \u2014 Interactive config editor
492
- - \`openacp reset\` \u2014 Delete all data and start fresh
493
-
494
- ### Agent Management (CLI)
495
- - \`openacp agents\` \u2014 List all agents (installed + available from ACP Registry)
496
- - \`openacp agents install <name>\` \u2014 Install an agent
497
- - \`openacp agents uninstall <name>\` \u2014 Remove an agent
498
- - \`openacp agents info <name>\` \u2014 Show details, dependencies, and setup guide
499
- - \`openacp agents run <name> [-- args]\` \u2014 Run agent CLI directly (for login, config, etc.)
500
- - \`openacp agents refresh\` \u2014 Force-refresh registry cache
501
-
502
- ### Plugins
503
- - \`openacp install <package>\` \u2014 Install adapter plugin
504
- - \`openacp uninstall <package>\` \u2014 Remove adapter plugin
505
- - \`openacp plugins\` \u2014 List installed plugins
506
-
507
- ### Integration
508
- - \`openacp integrate <agent>\` \u2014 Install agent integration (e.g., Claude handoff skill)
509
- - \`openacp integrate <agent> --uninstall\` \u2014 Remove integration
510
-
511
- ### API (requires running daemon)
512
- \`openacp api <command>\` \u2014 Interact with running daemon:
513
-
514
- | Command | Description |
515
- |---------|-------------|
516
- | \`status\` | List active sessions |
517
- | \`session <id>\` | Session details |
518
- | \`new <agent> <path>\` | Create session |
519
- | \`send <id> "text"\` | Send prompt |
520
- | \`cancel <id>\` | Cancel session |
521
- | \`dangerous <id> on/off\` | Toggle dangerous mode |
522
- | \`topics [--status x,y]\` | List topics |
523
- | \`delete-topic <id> [--force]\` | Delete topic |
524
- | \`cleanup [--status x,y]\` | Cleanup old topics |
525
- | \`agents\` | List agents |
526
- | \`health\` | System health |
527
- | \`config\` | Show config |
528
- | \`config set <key> <value>\` | Update config |
529
- | \`adapters\` | List adapters |
530
- | \`tunnel\` | Tunnel status |
531
- | \`notify "message"\` | Send notification |
532
- | \`version\` | Daemon version |
533
- | \`restart\` | Restart daemon |
534
-
535
- ---
536
-
537
- ## File Viewer (Tunnel)
538
-
539
- When tunnel is enabled, file edits and diffs get "View" buttons that open in your browser:
540
- - **Monaco Editor** \u2014 Full VS Code editor with syntax highlighting
541
- - **Diff viewer** \u2014 Side-by-side or inline comparison
542
- - **Line highlighting** \u2014 Click lines to highlight
543
- - Dark/light theme toggle
544
-
545
- ### Setup
546
- Enable in config: set \`tunnel.enabled\` to \`true\`.
547
- Providers: Cloudflare (default, free), ngrok, bore, Tailscale Funnel.
548
-
549
- ### Port Tunneling
550
-
551
- Expose any local port (dev servers, APIs, etc.) to the internet:
552
-
553
- **CLI commands** (agent can call these directly):
554
- - \`openacp tunnel add <port> --label <name>\` \u2014 Create tunnel to a local port
555
- - \`openacp tunnel list\` \u2014 List active tunnels
556
- - \`openacp tunnel stop <port>\` \u2014 Stop a tunnel
557
- - \`openacp tunnel stop-all\` \u2014 Stop all user tunnels
558
-
559
- **Telegram commands**:
560
- - \`/tunnel <port> [label]\` \u2014 Create tunnel
561
- - \`/tunnels\` \u2014 List active tunnels
562
- - \`/tunnel stop <port>\` \u2014 Stop tunnel
563
-
564
- Example: after starting a dev server on port 3000, run \`openacp tunnel add 3000 --label my-app\` to get a public URL.
565
-
566
- ---
567
-
568
- ## Configuration
569
-
570
- Config file: \`~/.openacp/config.json\`
571
-
572
- ### Channels
573
- - **channels.telegram.botToken** \u2014 Your Telegram bot token
574
- - **channels.telegram.chatId** \u2014 Your Telegram supergroup ID
575
- - **channels.discord.botToken** \u2014 Your Discord bot token
576
- - **channels.discord.guildId** \u2014 Your Discord server (guild) ID
577
-
578
- ### Agents
579
- - **defaultAgent** \u2014 Which agent to use by default
580
- - Agents are managed via \`/agents\` (Telegram) or \`openacp agents\` (CLI)
581
- - Installed agents are stored in \`~/.openacp/agents.json\`
582
- - Agent list is fetched from the ACP Registry CDN and cached locally (24h)
583
-
584
- ### Workspace
585
- - **workspace.baseDir** \u2014 Base directory for project folders (default: \`~/openacp-workspace\`)
586
-
587
- ### Security
588
- - **security.allowedUserIds** \u2014 Restrict who can use the bot (empty = everyone)
589
- - **security.maxConcurrentSessions** \u2014 Max parallel sessions (default: 5)
590
- - **security.sessionTimeoutMinutes** \u2014 Auto-cancel idle sessions (default: 60)
591
-
592
- ### Tunnel / File Viewer
593
- - **tunnel.enabled** \u2014 Enable file viewer tunnel
594
- - **tunnel.provider** \u2014 Tunnel provider: cloudflare (default, free), ngrok, bore, tailscale
595
- - **tunnel.port** \u2014 Local port for tunnel server (default: 3100)
596
- - **tunnel.auth.enabled** \u2014 Enable authentication for tunnel URLs
597
- - **tunnel.auth.token** \u2014 Auth token for tunnel access
598
- - **tunnel.storeTtlMinutes** \u2014 How long viewer links stay cached (default: 60)
599
-
600
- ### Logging
601
- - **logging.level** \u2014 Log level: silent, debug, info, warn, error, fatal (default: info)
602
- - **logging.logDir** \u2014 Log directory (default: \`~/.openacp/logs\`)
603
- - **logging.maxFileSize** \u2014 Max log file size before rotation
604
- - **logging.maxFiles** \u2014 Max number of rotated log files
605
- - **logging.sessionLogRetentionDays** \u2014 Auto-delete old session logs (default: 30)
606
-
607
- ### Data Retention
608
- - **sessionStore.ttlDays** \u2014 How long session records persist (default: 30). Old records are cleaned up automatically.
609
-
610
- ### Environment variables
611
- Override config with env vars:
612
- - \`OPENACP_TELEGRAM_BOT_TOKEN\`
613
- - \`OPENACP_TELEGRAM_CHAT_ID\`
614
- - \`OPENACP_DISCORD_BOT_TOKEN\`
615
- - \`OPENACP_DISCORD_GUILD_ID\`
616
- - \`OPENACP_DEFAULT_AGENT\`
617
- - \`OPENACP_RUN_MODE\` \u2014 foreground or daemon
618
- - \`OPENACP_API_PORT\` \u2014 API server port (default: 21420)
619
- - \`OPENACP_TUNNEL_ENABLED\`
620
- - \`OPENACP_TUNNEL_PORT\`
621
- - \`OPENACP_TUNNEL_PROVIDER\`
622
- - \`OPENACP_LOG_LEVEL\`
623
- - \`OPENACP_LOG_DIR\`
624
- - \`OPENACP_DEBUG\` \u2014 Sets log level to debug
625
-
626
- ---
627
-
628
- ## Troubleshooting
629
-
630
- ### Session stuck / not responding
631
- - Check status: ask Assistant "Is anything stuck?"
632
- - Cancel and create new: \`/cancel\` then \`/new\`
633
- - Check system health: Assistant can run health check
634
-
635
- ### Agent not found
636
- - Check available agents: \`/agents\` or \`openacp agents\`
637
- - Install missing agent: \`openacp agents install <name>\`
638
- - Some agents need login first: \`openacp agents info <name>\` to see setup steps
639
- - Run agent CLI for setup: \`openacp agents run <name> -- <args>\`
640
-
641
- ### Permission request not showing
642
- - Check Notifications topic for the alert
643
- - Try \`/enable_dangerous\` to auto-approve (if you trust the agent)
644
-
645
- ### Session disappeared after restart
646
- - Sessions persist across restarts
647
- - Send a message in the old topic \u2014 it auto-resumes
648
- - If topic was deleted, the session record may still exist in status
649
-
650
- ### Bot not responding at all
651
- - Check daemon: \`openacp status\`
652
- - Check logs: \`openacp logs\`
653
- - Restart: \`openacp start\` or \`/restart\`
654
-
655
- ### Messages going to wrong topic
656
- - Each session is bound to a specific topic/thread
657
- - If you see messages appearing in the Assistant topic instead of the session topic, try creating a new session
658
-
659
- ### Viewing logs
660
- - Session-specific logs: \`~/.openacp/logs/sessions/\`
661
- - System logs: \`openacp logs\` to tail live
662
- - Set \`OPENACP_DEBUG=true\` for verbose output
663
-
664
- ---
665
-
666
- ## Data & Storage
667
-
668
- All data is stored in \`~/.openacp/\`:
669
- - \`config.json\` \u2014 Configuration
670
- - \`agents.json\` \u2014 Installed agents (managed by AgentCatalog)
671
- - \`registry-cache.json\` \u2014 Cached ACP Registry data (refreshes every 24h)
672
- - \`agents/\` \u2014 Downloaded binary agents
673
- - \`sessions/\` \u2014 Session records and state
674
- - \`topics/\` \u2014 Topic-to-session mappings
675
- - \`logs/\` \u2014 System and session logs
676
- - \`plugins/\` \u2014 Installed adapter plugins
677
- - \`openacp.pid\` \u2014 Daemon PID file
678
-
679
- Session records auto-cleanup: 30 days (configurable via \`sessionStore.ttlDays\`).
680
- Session logs auto-cleanup: 30 days (configurable via \`logging.sessionLogRetentionDays\`).
681
- `;
682
-
683
- export {
684
- progressBar,
685
- formatTokens,
686
- stripCodeFences,
687
- truncateContent,
688
- splitMessage,
689
- extractContentText,
690
- formatToolSummary,
691
- formatToolTitle,
692
- resolveToolIcon,
693
- evaluateNoise,
694
- PRODUCT_GUIDE,
695
- dispatchMessage
696
- };
697
- //# sourceMappingURL=chunk-OWP7RZ62.js.map