@hahnfeld/teams-adapter 1.0.9

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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/dist/activity.d.ts +23 -0
  4. package/dist/activity.d.ts.map +1 -0
  5. package/dist/activity.js +3 -0
  6. package/dist/activity.js.map +1 -0
  7. package/dist/adapter.d.ts +174 -0
  8. package/dist/adapter.d.ts.map +1 -0
  9. package/dist/adapter.js +1583 -0
  10. package/dist/adapter.js.map +1 -0
  11. package/dist/app-package.d.ts +7 -0
  12. package/dist/app-package.d.ts.map +1 -0
  13. package/dist/app-package.js +158 -0
  14. package/dist/app-package.js.map +1 -0
  15. package/dist/assistant.d.ts +7 -0
  16. package/dist/assistant.d.ts.map +1 -0
  17. package/dist/assistant.js +32 -0
  18. package/dist/assistant.js.map +1 -0
  19. package/dist/commands/admin.d.ts +27 -0
  20. package/dist/commands/admin.d.ts.map +1 -0
  21. package/dist/commands/admin.js +146 -0
  22. package/dist/commands/admin.js.map +1 -0
  23. package/dist/commands/agents.d.ts +13 -0
  24. package/dist/commands/agents.d.ts.map +1 -0
  25. package/dist/commands/agents.js +98 -0
  26. package/dist/commands/agents.js.map +1 -0
  27. package/dist/commands/doctor.d.ts +8 -0
  28. package/dist/commands/doctor.d.ts.map +1 -0
  29. package/dist/commands/doctor.js +49 -0
  30. package/dist/commands/doctor.js.map +1 -0
  31. package/dist/commands/index.d.ts +16 -0
  32. package/dist/commands/index.d.ts.map +1 -0
  33. package/dist/commands/index.js +253 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/integrate.d.ts +8 -0
  36. package/dist/commands/integrate.d.ts.map +1 -0
  37. package/dist/commands/integrate.js +45 -0
  38. package/dist/commands/integrate.js.map +1 -0
  39. package/dist/commands/menu.d.ts +16 -0
  40. package/dist/commands/menu.d.ts.map +1 -0
  41. package/dist/commands/menu.js +92 -0
  42. package/dist/commands/menu.js.map +1 -0
  43. package/dist/commands/new-session.d.ts +13 -0
  44. package/dist/commands/new-session.d.ts.map +1 -0
  45. package/dist/commands/new-session.js +105 -0
  46. package/dist/commands/new-session.js.map +1 -0
  47. package/dist/commands/session.d.ts +22 -0
  48. package/dist/commands/session.d.ts.map +1 -0
  49. package/dist/commands/session.js +110 -0
  50. package/dist/commands/session.js.map +1 -0
  51. package/dist/commands/settings.d.ts +8 -0
  52. package/dist/commands/settings.d.ts.map +1 -0
  53. package/dist/commands/settings.js +54 -0
  54. package/dist/commands/settings.js.map +1 -0
  55. package/dist/conversation-store.d.ts +38 -0
  56. package/dist/conversation-store.d.ts.map +1 -0
  57. package/dist/conversation-store.js +101 -0
  58. package/dist/conversation-store.js.map +1 -0
  59. package/dist/draft-manager.d.ts +47 -0
  60. package/dist/draft-manager.d.ts.map +1 -0
  61. package/dist/draft-manager.js +136 -0
  62. package/dist/draft-manager.js.map +1 -0
  63. package/dist/formatting.d.ts +121 -0
  64. package/dist/formatting.d.ts.map +1 -0
  65. package/dist/formatting.js +392 -0
  66. package/dist/formatting.js.map +1 -0
  67. package/dist/graph.d.ts +59 -0
  68. package/dist/graph.d.ts.map +1 -0
  69. package/dist/graph.js +261 -0
  70. package/dist/graph.js.map +1 -0
  71. package/dist/index.d.ts +16 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +10 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/media.d.ts +29 -0
  76. package/dist/media.d.ts.map +1 -0
  77. package/dist/media.js +120 -0
  78. package/dist/media.js.map +1 -0
  79. package/dist/permissions.d.ts +15 -0
  80. package/dist/permissions.d.ts.map +1 -0
  81. package/dist/permissions.js +221 -0
  82. package/dist/permissions.js.map +1 -0
  83. package/dist/plugin.d.ts +13 -0
  84. package/dist/plugin.d.ts.map +1 -0
  85. package/dist/plugin.js +689 -0
  86. package/dist/plugin.js.map +1 -0
  87. package/dist/renderer.d.ts +49 -0
  88. package/dist/renderer.d.ts.map +1 -0
  89. package/dist/renderer.js +55 -0
  90. package/dist/renderer.js.map +1 -0
  91. package/dist/send-utils.d.ts +15 -0
  92. package/dist/send-utils.d.ts.map +1 -0
  93. package/dist/send-utils.js +64 -0
  94. package/dist/send-utils.js.map +1 -0
  95. package/dist/task-modules.d.ts +34 -0
  96. package/dist/task-modules.d.ts.map +1 -0
  97. package/dist/task-modules.js +136 -0
  98. package/dist/task-modules.js.map +1 -0
  99. package/dist/types.d.ts +26 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +3 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/validators.d.ts +54 -0
  104. package/dist/validators.d.ts.map +1 -0
  105. package/dist/validators.js +142 -0
  106. package/dist/validators.js.map +1 -0
  107. package/package.json +56 -0
@@ -0,0 +1,98 @@
1
+ import { log } from "@openacp/plugin-sdk";
2
+ /**
3
+ * Handle /agents — list installed and available agents.
4
+ * Mirrors Telegram's handleAgents with install buttons.
5
+ */
6
+ export async function handleAgents(ctx) {
7
+ const catalog = ctx.adapter.core.agentCatalog;
8
+ if (!catalog) {
9
+ await ctx.reply("❌ Agent catalog not available.");
10
+ return;
11
+ }
12
+ const items = catalog.getAvailable();
13
+ const installed = items.filter((i) => i.installed);
14
+ const available = items.filter((i) => !i.installed);
15
+ let text = "**🤖 Agents**\n\n";
16
+ if (installed.length > 0) {
17
+ text += "**Installed:**\n\n";
18
+ for (const item of installed) {
19
+ text += `✅ **${item.name}**`;
20
+ if (item.description)
21
+ text += ` — ${truncate(item.description, 50)}`;
22
+ text += "\n\n";
23
+ }
24
+ }
25
+ if (available.length > 0) {
26
+ if (installed.length > 0)
27
+ text += "---\n\n";
28
+ text += "**Available to install:**\n\n";
29
+ for (const item of available.slice(0, 10)) {
30
+ if (item.available) {
31
+ text += `⬇️ **${item.name}**`;
32
+ }
33
+ else {
34
+ const deps = item.missingDeps?.join(", ") ?? "requirements not met";
35
+ text += `⚠️ **${item.name}** (needs: ${deps})`;
36
+ }
37
+ if (item.description)
38
+ text += `\n\n ${truncate(item.description, 60)}`;
39
+ text += "\n\n";
40
+ }
41
+ if (available.length > 10) {
42
+ text += `...and ${available.length - 10} more. Use \`/install <name>\` to install.`;
43
+ }
44
+ }
45
+ else if (installed.length > 0) {
46
+ text += "All agents are already installed!";
47
+ }
48
+ await ctx.reply(text);
49
+ }
50
+ /**
51
+ * Handle /install <agent> — install an agent by name.
52
+ * Mirrors Telegram's installAgentWithProgress.
53
+ */
54
+ export async function handleInstall(ctx, name) {
55
+ if (!name) {
56
+ await ctx.reply("**Install an agent**\n\nUsage: `/install <agent-name>`\n\nUse `/agents` to browse available agents.");
57
+ return;
58
+ }
59
+ const catalog = ctx.adapter.core.agentCatalog;
60
+ if (!catalog) {
61
+ await ctx.reply("❌ Agent catalog not available.");
62
+ return;
63
+ }
64
+ await ctx.reply(`⏳ Installing **${name}**...`);
65
+ try {
66
+ const result = await catalog.install(name, {
67
+ onStart: () => { },
68
+ onStep: async () => { },
69
+ onDownloadProgress: async () => { },
70
+ onSuccess: async () => { },
71
+ onError: async () => { },
72
+ });
73
+ if (result.ok) {
74
+ let msg = `✅ **${name}** installed!`;
75
+ if (result.setupSteps?.length) {
76
+ msg += "\n\n**Setup steps:**\n\n";
77
+ for (const step of result.setupSteps) {
78
+ msg += `- ${step}\n\n`;
79
+ }
80
+ }
81
+ await ctx.reply(msg);
82
+ }
83
+ else {
84
+ await ctx.reply(`❌ Installation failed: ${result.error ?? "Unknown error"}`);
85
+ }
86
+ }
87
+ catch (err) {
88
+ log.error({ err, name }, "[agents] Install failed");
89
+ await ctx.reply(`❌ Failed to install: ${err instanceof Error ? err.message : String(err)}`);
90
+ }
91
+ }
92
+ export async function handleAgentButton(ctx) {
93
+ await handleAgents(ctx);
94
+ }
95
+ function truncate(text, maxLen) {
96
+ return text.length <= maxLen ? text : text.slice(0, maxLen - 1) + "…";
97
+ }
98
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CommandContext } from "./index.js";
2
+ /**
3
+ * Handle /doctor — run system diagnostics.
4
+ * Delegates to the core doctor command if available, otherwise checks basics.
5
+ */
6
+ export declare function handleDoctor(ctx: CommandContext): Promise<void>;
7
+ export declare function handleDoctorButton(ctx: CommandContext): Promise<void>;
8
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Handle /doctor — run system diagnostics.
3
+ * Delegates to the core doctor command if available, otherwise checks basics.
4
+ */
5
+ export async function handleDoctor(ctx) {
6
+ const registry = ctx.adapter.core.lifecycleManager?.serviceRegistry?.get("command-registry");
7
+ if (registry) {
8
+ const def = registry.get("doctor");
9
+ if (def) {
10
+ try {
11
+ const response = await registry.execute("/doctor", {
12
+ raw: "",
13
+ sessionId: null,
14
+ channelId: "teams",
15
+ userId: ctx.userId,
16
+ reply: async (content) => { await ctx.reply(content); },
17
+ });
18
+ if (response.type === "text") {
19
+ await ctx.reply(response.text);
20
+ }
21
+ return;
22
+ }
23
+ catch { /* fall through */ }
24
+ }
25
+ }
26
+ // Basic self-diagnostics
27
+ const checks = [];
28
+ // Bot connectivity
29
+ checks.push("✅ Bot is running and receiving messages");
30
+ // Session manager
31
+ const allRecords = ctx.adapter.core.sessionManager.listRecords();
32
+ const active = allRecords.filter((r) => r.status === "active" || r.status === "initializing");
33
+ const errors = allRecords.filter((r) => r.status === "error");
34
+ checks.push(`✅ Session store: ${allRecords.length} sessions (${active.length} active, ${errors.length} errors)`);
35
+ // Agent manager
36
+ const agents = ctx.adapter.core.agentManager.getAvailableAgents();
37
+ checks.push(`${agents.length > 0 ? "✅" : "⚠️"} Agents available: ${agents.length}`);
38
+ // Graph API
39
+ const hasGraph = ctx.adapter.getTeamId() && ctx.adapter.getChannelId();
40
+ checks.push(`${hasGraph ? "✅" : "ℹ️"} Teams config: teamId=${ctx.adapter.getTeamId() ? "set" : "missing"}, channelId=${ctx.adapter.getChannelId() ? "set" : "missing"}`);
41
+ // Assistant
42
+ const assistantId = ctx.adapter.getAssistantSessionId();
43
+ checks.push(`${assistantId ? "✅" : "ℹ️"} Assistant session: ${assistantId ? "active" : "not configured"}`);
44
+ await ctx.reply(`**🔍 System Diagnostics**\n\n${checks.join("\n\n")}`);
45
+ }
46
+ export async function handleDoctorButton(ctx) {
47
+ await handleDoctor(ctx);
48
+ }
49
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { TurnContext } from "@microsoft/agents-hosting";
2
+ import type { TeamsAdapter } from "../adapter.js";
3
+ export interface CommandContext {
4
+ context: TurnContext;
5
+ adapter: TeamsAdapter;
6
+ userId: string;
7
+ sessionId: string | null;
8
+ reply: (text: string) => Promise<void>;
9
+ }
10
+ export declare const SLASH_COMMANDS: {
11
+ command: string;
12
+ description: string;
13
+ }[];
14
+ export declare function handleCommand(context: TurnContext, adapter: TeamsAdapter, userId: string, sessionId: string | null): Promise<boolean>;
15
+ export declare function setupCardActionCallbacks(context: TurnContext, adapter: TeamsAdapter): Promise<void>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAWlD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAID,eAAO,MAAM,cAAc;;;GAwB1B,CAAC;AAEF,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,OAAO,CAAC,CA4GlB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAmEf"}
@@ -0,0 +1,253 @@
1
+ import { log } from "@openacp/plugin-sdk";
2
+ import { handleNew, handleNewChat } from "./new-session.js";
3
+ import { handleCancel, handleStatus, handleSessions, handleHandoff } from "./session.js";
4
+ import { handleBypass, handleTTS, handleRestart, handleRespawn, handleUpdate, handleOutputMode } from "./admin.js";
5
+ import { handleMenu, handleHelp, handleClear } from "./menu.js";
6
+ import { handleAgents, handleInstall } from "./agents.js";
7
+ import { handleDoctor } from "./doctor.js";
8
+ import { handleIntegrate } from "./integrate.js";
9
+ import { handleSettings } from "./settings.js";
10
+ const COMMAND_PREFIX = "/";
11
+ export const SLASH_COMMANDS = [
12
+ { command: "new", description: "Create a new agent session" },
13
+ { command: "newchat", description: "New chat, same agent & workspace" },
14
+ { command: "cancel", description: "Cancel the current session" },
15
+ { command: "status", description: "Show session or global status" },
16
+ { command: "sessions", description: "List all sessions" },
17
+ { command: "agents", description: "List available agents" },
18
+ { command: "install", description: "Install an agent by name" },
19
+ { command: "menu", description: "Show the action menu" },
20
+ { command: "help", description: "Show help" },
21
+ { command: "integrate", description: "Manage agent integrations" },
22
+ { command: "handoff", description: "Generate terminal resume command" },
23
+ { command: "restart", description: "Restart OpenACP" },
24
+ { command: "respawn", description: "Restart the assistant session" },
25
+ { command: "update", description: "Update to latest version" },
26
+ { command: "doctor", description: "Run system diagnostics" },
27
+ { command: "tts", description: "Toggle Text to Speech" },
28
+ { command: "outputmode", description: "Set output detail level (low/medium/high)" },
29
+ { command: "bypass", description: "Auto-approve permissions" },
30
+ { command: "mode", description: "Switch session mode" },
31
+ { command: "model", description: "Switch AI model" },
32
+ { command: "thought", description: "Adjust thinking level" },
33
+ { command: "settings", description: "Show configuration settings" },
34
+ { command: "clear", description: "Reset the assistant session" },
35
+ ];
36
+ export async function handleCommand(context, adapter, userId, sessionId) {
37
+ const text = (context.activity?.text ?? "").replace(/<at[^>]*>.*?<\/at>/gi, "").trim();
38
+ if (!text.startsWith(COMMAND_PREFIX))
39
+ return false;
40
+ const parts = text.slice(1).split(/\s+/);
41
+ const commandName = parts[0].toLowerCase();
42
+ const args = parts.slice(1);
43
+ const ctx = {
44
+ context,
45
+ adapter,
46
+ userId,
47
+ sessionId,
48
+ reply: async (content) => {
49
+ if (typeof context.send === "function") {
50
+ await context.send({ type: "message", text: content, textFormat: "markdown" });
51
+ }
52
+ else {
53
+ await context.sendActivity({ text: content });
54
+ }
55
+ },
56
+ };
57
+ try {
58
+ switch (commandName) {
59
+ case "new":
60
+ await handleNew(ctx, args);
61
+ break;
62
+ case "newchat":
63
+ await handleNewChat(ctx);
64
+ break;
65
+ case "cancel":
66
+ await handleCancel(ctx);
67
+ break;
68
+ case "status":
69
+ await handleStatus(ctx);
70
+ break;
71
+ case "sessions":
72
+ await handleSessions(ctx);
73
+ break;
74
+ case "agents":
75
+ await handleAgents(ctx);
76
+ break;
77
+ case "install":
78
+ await handleInstall(ctx, args[0]);
79
+ break;
80
+ case "menu":
81
+ await handleMenu(ctx);
82
+ break;
83
+ case "help":
84
+ await handleHelp(ctx);
85
+ break;
86
+ case "bypass":
87
+ await handleBypass(ctx);
88
+ break;
89
+ case "restart":
90
+ await handleRestart(ctx);
91
+ break;
92
+ case "respawn":
93
+ await handleRespawn(ctx);
94
+ break;
95
+ case "update":
96
+ await handleUpdate(ctx);
97
+ break;
98
+ case "integrate":
99
+ await handleIntegrate(ctx);
100
+ break;
101
+ case "settings":
102
+ await handleSettings(ctx);
103
+ break;
104
+ case "doctor":
105
+ await handleDoctor(ctx);
106
+ break;
107
+ case "handoff":
108
+ await handleHandoff(ctx);
109
+ break;
110
+ case "clear":
111
+ await handleClear(ctx);
112
+ break;
113
+ case "tts":
114
+ await handleTTS(ctx, args[0]);
115
+ break;
116
+ case "outputmode":
117
+ await handleOutputMode(ctx, args[0], args[1]);
118
+ break;
119
+ case "verbosity":
120
+ await handleOutputMode(ctx, args[0], args[1]);
121
+ break;
122
+ case "mode":
123
+ await handleModeSwitch(ctx, args[0]);
124
+ break;
125
+ case "model":
126
+ await handleModelSwitch(ctx, args[0]);
127
+ break;
128
+ case "thought":
129
+ await handleThoughtLevel(ctx, args[0]);
130
+ break;
131
+ default:
132
+ return false; // Not a locally handled command — let registry try
133
+ }
134
+ return true;
135
+ }
136
+ catch (err) {
137
+ log.error({ err, commandName }, "[teams-router] Command handler failed");
138
+ const errMsg = `❌ Command failed: ${err instanceof Error ? err.message : String(err)}`;
139
+ try {
140
+ await ctx.reply(errMsg);
141
+ }
142
+ catch { /* ignore */ }
143
+ return true;
144
+ }
145
+ }
146
+ export async function setupCardActionCallbacks(context, adapter) {
147
+ const value = context.activity.value;
148
+ if (!value)
149
+ return;
150
+ // Support both Action.Execute (value.action.verb) and Action.Submit (value.verb) formats
151
+ const action = value.action;
152
+ const verb = (action?.verb ?? value.verb);
153
+ const data = (action?.data ?? value);
154
+ if (!verb)
155
+ return;
156
+ const ctx = {
157
+ context,
158
+ adapter,
159
+ userId: context.activity.from?.id ?? "unknown",
160
+ sessionId: data.sessionId ?? null,
161
+ reply: async (content) => {
162
+ if (typeof context.send === "function") {
163
+ await context.send({ type: "message", text: content, textFormat: "markdown" });
164
+ }
165
+ else {
166
+ await context.sendActivity({ text: content });
167
+ }
168
+ },
169
+ };
170
+ // Route command verbs from Adaptive Card buttons
171
+ if (verb.startsWith("cmd:")) {
172
+ const command = verb.slice(4);
173
+ try {
174
+ switch (command) {
175
+ case "menu":
176
+ await handleMenu(ctx);
177
+ break;
178
+ case "help":
179
+ await handleHelp(ctx);
180
+ break;
181
+ case "new":
182
+ await handleNew(ctx, []);
183
+ break;
184
+ case "cancel":
185
+ await handleCancel(ctx);
186
+ break;
187
+ case "status":
188
+ await handleStatus(ctx);
189
+ break;
190
+ case "sessions":
191
+ await handleSessions(ctx);
192
+ break;
193
+ case "agents":
194
+ await handleAgents(ctx);
195
+ break;
196
+ case "doctor":
197
+ await handleDoctor(ctx);
198
+ break;
199
+ case "settings":
200
+ await handleSettings(ctx);
201
+ break;
202
+ case "noop":
203
+ break;
204
+ default:
205
+ await ctx.reply(`Unknown action: ${command}`);
206
+ }
207
+ }
208
+ catch (err) {
209
+ log.error({ err, command }, "[teams-router] Card action command failed");
210
+ await ctx.reply(`❌ Command failed`);
211
+ }
212
+ }
213
+ }
214
+ // ─── Session config commands ──────────────────────────────────────────────
215
+ /**
216
+ * Delegate a session-scoped command to the adapter's handleCommand, which
217
+ * dispatches through the CommandRegistry. Avoids duplicating registry
218
+ * lookup logic that the adapter already handles.
219
+ */
220
+ async function delegateToRegistry(ctx, commandText, fallbackMsg) {
221
+ if (!ctx.sessionId) {
222
+ await ctx.reply("❌ No active session.");
223
+ return;
224
+ }
225
+ try {
226
+ await ctx.adapter.handleCommand(commandText, ctx.context, ctx.sessionId, ctx.userId);
227
+ }
228
+ catch {
229
+ await ctx.reply(fallbackMsg);
230
+ }
231
+ }
232
+ async function handleModeSwitch(ctx, mode) {
233
+ if (!mode) {
234
+ await ctx.reply("Usage: `/mode <mode-name>`\n\nExample: `/mode plan`, `/mode code`");
235
+ return;
236
+ }
237
+ await delegateToRegistry(ctx, `/mode ${mode}`, `🔄 Mode set to **${mode}** (may require core command support)`);
238
+ }
239
+ async function handleModelSwitch(ctx, model) {
240
+ if (!model) {
241
+ await ctx.reply("Usage: `/model <model-name>`\n\nExample: `/model claude-sonnet`, `/model gpt-4o`");
242
+ return;
243
+ }
244
+ await delegateToRegistry(ctx, `/model ${model}`, `🤖 Model set to **${model}** (may require core command support)`);
245
+ }
246
+ async function handleThoughtLevel(ctx, level) {
247
+ if (!level) {
248
+ await ctx.reply("Usage: `/thought <level>`\n\nExample: `/thought high`, `/thought low`, `/thought off`");
249
+ return;
250
+ }
251
+ await delegateToRegistry(ctx, `/thought ${level}`, `🧠 Thinking level set to **${level}** (may require core command support)`);
252
+ }
253
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CommandContext } from "./index.js";
2
+ /**
3
+ * Handle /integrate — manage agent integrations (handoff, tools, etc.).
4
+ * Delegates to core integrate command if available.
5
+ */
6
+ export declare function handleIntegrate(ctx: CommandContext): Promise<void>;
7
+ export declare function handleIntegrateButton(ctx: CommandContext): Promise<void>;
8
+ //# sourceMappingURL=integrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrate.d.ts","sourceRoot":"","sources":["../../src/commands/integrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCxE;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Handle /integrate — manage agent integrations (handoff, tools, etc.).
3
+ * Delegates to core integrate command if available.
4
+ */
5
+ export async function handleIntegrate(ctx) {
6
+ const registry = ctx.adapter.core.lifecycleManager?.serviceRegistry?.get("command-registry");
7
+ if (registry) {
8
+ const def = registry.get("integrate");
9
+ if (def) {
10
+ try {
11
+ const response = await registry.execute("/integrate", {
12
+ raw: "",
13
+ sessionId: ctx.sessionId,
14
+ channelId: "teams",
15
+ userId: ctx.userId,
16
+ reply: async (content) => { await ctx.reply(content); },
17
+ });
18
+ if (response.type !== "silent") {
19
+ if (response.type === "text")
20
+ await ctx.reply(response.text);
21
+ else if (response.type === "list") {
22
+ const items = response.items.map((i) => `- **${i.label}**${i.detail ? ` — ${i.detail}` : ""}`).join("\n\n");
23
+ await ctx.reply(`${response.title}\n\n${items}`);
24
+ }
25
+ }
26
+ return;
27
+ }
28
+ catch { /* fall through */ }
29
+ }
30
+ }
31
+ // Show available integrations
32
+ const agents = ctx.adapter.core.agentManager.getAvailableAgents();
33
+ if (agents.length === 0) {
34
+ await ctx.reply("No agents installed. Use `/agents` to browse and install.");
35
+ return;
36
+ }
37
+ const lines = agents.map((a) => `- **${a.name}**`);
38
+ await ctx.reply(`**🔗 Integrations**\n\n` +
39
+ `Installed agents:\n\n${lines.join("\n\n")}\n\n` +
40
+ `Use \`openacp integrate <agent>\` from the terminal for detailed integration management.`);
41
+ }
42
+ export async function handleIntegrateButton(ctx) {
43
+ await handleIntegrate(ctx);
44
+ }
45
+ //# sourceMappingURL=integrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrate.js","sourceRoot":"","sources":["../../src/commands/integrate.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAmB;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,EAAE,GAAG,CAAkB,kBAAkB,CAAC,CAAC;IAC9G,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;oBACpD,GAAG,EAAE,EAAE;oBACP,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,SAAS,EAAE,OAAO;oBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,KAAK,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBAChE,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC/B,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;wBAAE,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;yBACxD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACjH,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;gBACD,OAAO;YACT,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACnD,MAAM,GAAG,CAAC,KAAK,CACb,yBAAyB;QACzB,wBAAwB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QAChD,0FAA0F,CAC3F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAmB;IAC7D,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CommandContext } from "./index.js";
2
+ /**
3
+ * Handle /menu — show the main action menu as an Adaptive Card with buttons.
4
+ * Mirrors Telegram's buildMenuKeyboard pattern.
5
+ */
6
+ export declare function handleMenu(ctx: CommandContext): Promise<void>;
7
+ /**
8
+ * Handle /help — show available commands.
9
+ */
10
+ export declare function handleHelp(ctx: CommandContext): Promise<void>;
11
+ /**
12
+ * Handle /clear — reset the assistant session.
13
+ */
14
+ export declare function handleClear(ctx: CommandContext): Promise<void>;
15
+ export declare function handleMenuButton(ctx: CommandContext): Promise<void>;
16
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDnE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE"}
@@ -0,0 +1,92 @@
1
+ import { sendCard, sendActivity } from "../send-utils.js";
2
+ /**
3
+ * Handle /menu — show the main action menu as an Adaptive Card with buttons.
4
+ * Mirrors Telegram's buildMenuKeyboard pattern.
5
+ */
6
+ export async function handleMenu(ctx) {
7
+ const card = {
8
+ type: "AdaptiveCard",
9
+ version: "1.2",
10
+ body: [
11
+ { type: "TextBlock", text: "📋 **OpenACP Menu**", weight: "Bolder", size: "Medium" },
12
+ { type: "TextBlock", text: "Quick actions for managing sessions and agents.", wrap: true, isSubtle: true },
13
+ ],
14
+ actions: [
15
+ { type: "Action.Submit", title: "➕ New Session", data: { verb: "cmd:new" } },
16
+ { type: "Action.Submit", title: "⚙️ Settings", data: { verb: "cmd:settings" } },
17
+ // Inline commands
18
+ { type: "Action.Submit", title: "📊 Status", data: { verb: "cmd:status" } },
19
+ { type: "Action.Submit", title: "📋 Sessions", data: { verb: "cmd:sessions" } },
20
+ { type: "Action.Submit", title: "🔍 Doctor", data: { verb: "cmd:doctor" } },
21
+ ],
22
+ };
23
+ await sendCard(ctx.context, card);
24
+ }
25
+ /**
26
+ * Handle /help — show available commands.
27
+ */
28
+ export async function handleHelp(ctx) {
29
+ const sections = [
30
+ [
31
+ "**Session Management:**",
32
+ "`/new [agent] [workspace]` — Create new session",
33
+ "`/newchat` — New chat, same agent & workspace",
34
+ "`/cancel` — Abort current prompt",
35
+ "`/status` — Show session status",
36
+ "`/sessions` — List all sessions",
37
+ "`/handoff` — Generate terminal resume command",
38
+ ],
39
+ [
40
+ "**Agent Management:**",
41
+ "`/agents` — List available agents",
42
+ "`/install <name>` — Install an agent",
43
+ ],
44
+ [
45
+ "**Settings:**",
46
+ "`/outputmode low|medium|high` — Set output detail",
47
+ "`/bypass` — Toggle auto-approve permissions",
48
+ "`/tts on|off` — Toggle text-to-speech",
49
+ "`/mode <mode>` — Switch session mode",
50
+ "`/model <model>` — Switch AI model",
51
+ "`/thought <level>` — Adjust thinking level",
52
+ "`/settings` — Show configuration",
53
+ ],
54
+ [
55
+ "**System:**",
56
+ "`/menu` — Show action menu",
57
+ "`/doctor` — Run diagnostics",
58
+ "`/restart` — Restart OpenACP",
59
+ "`/clear` — Reset assistant session",
60
+ ],
61
+ ];
62
+ // Teams requires \n\n for any visible line break; separate sections with ---
63
+ const text = sections.map((s) => s.join("\n\n")).join("\n\n---\n\n");
64
+ // Send with suggested action buttons for quick access (1:1 chat only)
65
+ await sendActivity(ctx.context, {
66
+ text,
67
+ suggestedActions: {
68
+ actions: [
69
+ { type: "imBack", title: "➕ New", value: "/new" },
70
+ { type: "imBack", title: "📊 Status", value: "/status" },
71
+ { type: "imBack", title: "🤖 Agents", value: "/agents" },
72
+ { type: "imBack", title: "📋 Menu", value: "/menu" },
73
+ ],
74
+ },
75
+ });
76
+ }
77
+ /**
78
+ * Handle /clear — reset the assistant session.
79
+ */
80
+ export async function handleClear(ctx) {
81
+ try {
82
+ await ctx.adapter.respawnAssistant();
83
+ await ctx.reply("🗑️ Assistant session cleared and restarted.");
84
+ }
85
+ catch (err) {
86
+ await ctx.reply(`❌ Clear failed: ${err instanceof Error ? err.message : String(err)}`);
87
+ }
88
+ }
89
+ export async function handleMenuButton(ctx) {
90
+ await handleMenu(ctx);
91
+ }
92
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"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"}