@johpaz/hive-sdk 0.0.12 → 0.0.15

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 (199) hide show
  1. package/.github/CODEOWNERS +9 -0
  2. package/.github/workflows/publish.yml +89 -0
  3. package/.github/workflows/version-bump.yml +102 -0
  4. package/CHANGELOG.md +38 -0
  5. package/README.md +158 -0
  6. package/bun.lock +543 -0
  7. package/bunfig.toml +7 -0
  8. package/docs/API-AGENTS.md +316 -0
  9. package/docs/API-CONTEXT-COMPILER.md +252 -0
  10. package/docs/API-DAG-SCHEDULER.md +273 -0
  11. package/docs/API-TOOLS-SKILLS-CHANNELS.md +293 -0
  12. package/docs/API-WORKERS-EVENTS.md +152 -0
  13. package/docs/INDEX.md +141 -0
  14. package/docs/README.md +68 -0
  15. package/package.json +54 -105
  16. package/packages/cli/package.json +17 -0
  17. package/packages/cli/src/commands/init.ts +56 -0
  18. package/packages/cli/src/commands/run.ts +45 -0
  19. package/packages/cli/src/commands/test.ts +42 -0
  20. package/packages/cli/src/commands/trace.ts +55 -0
  21. package/packages/cli/src/index.ts +43 -0
  22. package/packages/core/package.json +58 -0
  23. package/packages/core/src/ace/Curator.ts +158 -0
  24. package/packages/core/src/ace/Reflector.ts +200 -0
  25. package/packages/core/src/ace/Tracer.ts +100 -0
  26. package/packages/core/src/ace/index.ts +4 -0
  27. package/packages/core/src/agent/AgentRunner.ts +699 -0
  28. package/packages/core/src/agent/Compaction.ts +221 -0
  29. package/packages/core/src/agent/ContextCompiler.ts +567 -0
  30. package/packages/core/src/agent/ContextGuard.ts +91 -0
  31. package/packages/core/src/agent/ConversationStore.ts +244 -0
  32. package/packages/core/src/agent/Hooks.ts +166 -0
  33. package/packages/core/src/agent/NativeTools.ts +31 -0
  34. package/packages/core/src/agent/PromptBuilder.ts +169 -0
  35. package/packages/core/src/agent/Service.ts +267 -0
  36. package/packages/core/src/agent/StuckLoop.ts +133 -0
  37. package/packages/core/src/agent/index.ts +12 -0
  38. package/packages/core/src/agent/providers/LLMClient.ts +149 -0
  39. package/packages/core/src/agent/providers/anthropic.ts +212 -0
  40. package/packages/core/src/agent/providers/gemini.ts +215 -0
  41. package/packages/core/src/agent/providers/index.ts +199 -0
  42. package/packages/core/src/agent/providers/interface.ts +195 -0
  43. package/packages/core/src/agent/providers/ollama.ts +175 -0
  44. package/packages/core/src/agent/providers/openai-compat.ts +231 -0
  45. package/packages/core/src/agent/providers.ts +1 -0
  46. package/packages/core/src/agent/selectors/PlaybookSelector.ts +147 -0
  47. package/packages/core/src/agent/selectors/SkillSelector.ts +478 -0
  48. package/packages/core/src/agent/selectors/ToolSelector.ts +577 -0
  49. package/packages/core/src/agent/selectors/index.ts +6 -0
  50. package/packages/core/src/api/createAgent.test.ts +48 -0
  51. package/packages/core/src/api/createAgent.ts +122 -0
  52. package/packages/core/src/api/index.ts +2 -0
  53. package/packages/core/src/canvas/CanvasManager.ts +390 -0
  54. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  55. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  56. package/packages/core/src/canvas/emitter.ts +149 -0
  57. package/packages/core/src/canvas/index.ts +6 -0
  58. package/packages/core/src/config/index.ts +2 -0
  59. package/packages/core/src/config/loader.ts +554 -0
  60. package/packages/core/src/ethics/EthicsGuard.test.ts +54 -0
  61. package/packages/core/src/ethics/EthicsGuard.ts +66 -0
  62. package/packages/core/src/ethics/index.ts +2 -0
  63. package/packages/core/src/gateway/channel-notify.test.ts +14 -0
  64. package/packages/core/src/gateway/channel-notify.ts +12 -0
  65. package/packages/core/src/gateway/index.ts +1 -0
  66. package/packages/core/src/index.ts +37 -0
  67. package/packages/core/src/mcp/MCPClient.ts +439 -0
  68. package/packages/core/src/mcp/MCPToolAdapter.ts +176 -0
  69. package/packages/core/src/mcp/config.ts +13 -0
  70. package/packages/core/src/mcp/hot-reload.ts +147 -0
  71. package/packages/core/src/mcp/index.ts +11 -0
  72. package/packages/core/src/mcp/logger.ts +42 -0
  73. package/packages/core/src/mcp/singleton.ts +21 -0
  74. package/packages/core/src/mcp/transports/index.ts +67 -0
  75. package/packages/core/src/mcp/transports/sse.ts +241 -0
  76. package/packages/core/src/mcp/transports/websocket.ts +159 -0
  77. package/packages/core/src/memory/Scratchpad.test.ts +47 -0
  78. package/packages/core/src/memory/Scratchpad.ts +37 -0
  79. package/packages/core/src/memory/Storage.ts +6 -0
  80. package/packages/core/src/memory/index.ts +2 -0
  81. package/packages/core/src/multimodal/VisionService.ts +293 -0
  82. package/packages/core/src/multimodal/index.ts +2 -0
  83. package/packages/core/src/multimodal/types.ts +28 -0
  84. package/packages/core/src/security/Pairing.ts +250 -0
  85. package/packages/core/src/security/RateLimit.ts +270 -0
  86. package/packages/core/src/security/index.ts +4 -0
  87. package/packages/core/src/skills/SkillLoader.ts +388 -0
  88. package/packages/core/src/skills/bundled-data.generated.ts +3332 -0
  89. package/packages/core/src/skills/defineSkill.ts +18 -0
  90. package/packages/core/src/skills/index.ts +4 -0
  91. package/packages/core/src/state/index.ts +2 -0
  92. package/packages/core/src/state/store.ts +312 -0
  93. package/packages/core/src/storage/SQLiteStorage.ts +407 -0
  94. package/packages/core/src/storage/crypto.ts +101 -0
  95. package/packages/core/src/storage/index.ts +10 -0
  96. package/packages/core/src/storage/onboarding.ts +1603 -0
  97. package/packages/core/src/storage/schema.ts +689 -0
  98. package/packages/core/src/storage/seed.ts +740 -0
  99. package/packages/core/src/storage/usage.ts +374 -0
  100. package/packages/core/src/swarm/AgentBus.ts +460 -0
  101. package/packages/core/src/swarm/AgentExecutor.ts +53 -0
  102. package/packages/core/src/swarm/Coordinator.ts +251 -0
  103. package/packages/core/src/swarm/EventBridge.ts +122 -0
  104. package/packages/core/src/swarm/EventBus.ts +169 -0
  105. package/packages/core/src/swarm/TaskGraph.ts +192 -0
  106. package/packages/core/src/swarm/TaskNode.ts +97 -0
  107. package/packages/core/src/swarm/TaskResult.ts +22 -0
  108. package/packages/core/src/swarm/WorkerPool.ts +236 -0
  109. package/packages/core/src/swarm/errors.ts +37 -0
  110. package/packages/core/src/swarm/index.ts +30 -0
  111. package/packages/core/src/swarm/presets/HiveLearnPreset.ts +99 -0
  112. package/packages/core/src/swarm/presets/ResearchPreset.ts +97 -0
  113. package/packages/core/src/swarm/presets/index.ts +4 -0
  114. package/packages/core/src/swarm/strategies/ParallelStrategy.ts +21 -0
  115. package/packages/core/src/swarm/strategies/PriorityStrategy.ts +46 -0
  116. package/packages/core/src/swarm/strategies/index.ts +3 -0
  117. package/packages/core/src/swarm/types.ts +164 -0
  118. package/packages/core/src/tools/ToolExecutor.ts +58 -0
  119. package/packages/core/src/tools/ToolRegistry.test.ts +98 -0
  120. package/packages/core/src/tools/ToolRegistry.ts +61 -0
  121. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  122. package/packages/core/src/tools/agents/index.ts +715 -0
  123. package/packages/core/src/tools/bridge-events.ts +26 -0
  124. package/packages/core/src/tools/canvas/index.ts +375 -0
  125. package/packages/core/src/tools/cli/index.ts +142 -0
  126. package/packages/core/src/tools/codebridge/index.ts +342 -0
  127. package/packages/core/src/tools/core/index.ts +476 -0
  128. package/packages/core/src/tools/cron/index.ts +626 -0
  129. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  130. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  131. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  132. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  133. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  134. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  135. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  136. package/packages/core/src/tools/filesystem/index.ts +34 -0
  137. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  138. package/packages/core/src/tools/index.ts +231 -0
  139. package/packages/core/src/tools/meeting/index.ts +363 -0
  140. package/packages/core/src/tools/office/index.ts +47 -0
  141. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  142. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  143. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  144. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  145. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  146. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  147. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  148. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  149. package/packages/core/src/tools/projects/index.ts +37 -0
  150. package/packages/core/src/tools/projects/project-create.ts +94 -0
  151. package/packages/core/src/tools/projects/project-done.ts +66 -0
  152. package/packages/core/src/tools/projects/project-fail.ts +66 -0
  153. package/packages/core/src/tools/projects/project-list.ts +96 -0
  154. package/packages/core/src/tools/projects/project-update.ts +72 -0
  155. package/packages/core/src/tools/projects/task-create.ts +68 -0
  156. package/packages/core/src/tools/projects/task-evaluate.ts +93 -0
  157. package/packages/core/src/tools/projects/task-update.ts +93 -0
  158. package/packages/core/src/tools/types.ts +39 -0
  159. package/packages/core/src/tools/voice/index.ts +104 -0
  160. package/packages/core/src/tools/web/browser-click.ts +78 -0
  161. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  162. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  163. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  164. package/packages/core/src/tools/web/browser-script.ts +88 -0
  165. package/packages/core/src/tools/web/browser-service.ts +554 -0
  166. package/packages/core/src/tools/web/browser-type.ts +101 -0
  167. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  168. package/packages/core/src/tools/web/index.ts +41 -0
  169. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  170. package/packages/core/src/tools/web/web-search.ts +123 -0
  171. package/packages/core/src/utils/benchmark.ts +80 -0
  172. package/packages/core/src/utils/crypto.ts +73 -0
  173. package/packages/core/src/utils/date.ts +42 -0
  174. package/packages/core/src/utils/index.ts +10 -0
  175. package/packages/core/src/utils/logger.ts +389 -0
  176. package/packages/core/src/utils/retry.ts +70 -0
  177. package/packages/core/src/utils/toon.ts +253 -0
  178. package/packages/core/src/voice/index.ts +656 -0
  179. package/test/setup-db.ts +216 -0
  180. package/tsconfig.json +39 -0
  181. package/src/agents.ts +0 -1
  182. package/src/canvas.ts +0 -1
  183. package/src/channels.ts +0 -1
  184. package/src/config.ts +0 -1
  185. package/src/events.ts +0 -1
  186. package/src/gateway.ts +0 -1
  187. package/src/index.ts +0 -304
  188. package/src/mcp.ts +0 -1
  189. package/src/multimodal.ts +0 -1
  190. package/src/scheduler.ts +0 -1
  191. package/src/security.ts +0 -1
  192. package/src/skills.ts +0 -1
  193. package/src/state.ts +0 -1
  194. package/src/storage.ts +0 -1
  195. package/src/tools.ts +0 -1
  196. package/src/tts.ts +0 -1
  197. package/src/types.ts +0 -82
  198. package/src/utils.ts +0 -1
  199. package/src/voice.ts +0 -1
@@ -0,0 +1,255 @@
1
+ import type { Tool } from "../agent/NativeTools.ts";
2
+ import type { Config } from "../config/loader.ts";
3
+ import { canvasManager } from "./CanvasManager.ts";
4
+ import { logger } from "../utils/logger.ts";
5
+
6
+ export function createA2UISurfaceTool(_config: Config): Tool {
7
+ const log = logger.child("a2ui-surface");
8
+
9
+ return {
10
+ name: "a2ui_create_surface",
11
+ description: "Create an A2UI v0.9 surface on the user's canvas for rendering rich interactive UIs",
12
+ parameters: {
13
+ type: "object",
14
+ properties: {
15
+ sessionId: {
16
+ type: "string",
17
+ description: "Session ID to render to (auto-resolved from user context if omitted)",
18
+ },
19
+ surfaceId: {
20
+ type: "string",
21
+ description: "Unique identifier for the UI surface (e.g. 'booking_form', 'user_profile'). Must be unique within the session.",
22
+ },
23
+ catalogId: {
24
+ type: "string",
25
+ description: "Catalog ID for the component set. Use 'https://a2ui.org/specification/v0_9/basic_catalog.json' for the standard catalog.",
26
+ },
27
+ theme: {
28
+ type: "object",
29
+ description: "Theme configuration for the surface",
30
+ properties: {
31
+ primaryColor: {
32
+ type: "string",
33
+ description: "Primary color in hex format (e.g. '#3B82F6')",
34
+ },
35
+ iconUrl: {
36
+ type: "string",
37
+ description: "URL for an icon/logo image",
38
+ },
39
+ agentDisplayName: {
40
+ type: "string",
41
+ description: "Display name for the agent that created this surface",
42
+ },
43
+ },
44
+ },
45
+ sendDataModel: {
46
+ type: "boolean",
47
+ description: "If true, the client will send the full data model with every action. Default: false.",
48
+ },
49
+ },
50
+ required: ["surfaceId", "catalogId"],
51
+ },
52
+ execute: async (params: Record<string, unknown>, config?: any) => {
53
+ const userId = config?.configurable?.user_id;
54
+ const rawSessionId = params.sessionId as string;
55
+ const sessionId = rawSessionId
56
+ ? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
57
+ : (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
58
+
59
+ if (!canvasManager.isSessionConnected(sessionId)) {
60
+ const connected = canvasManager.getConnectedSessions();
61
+ log.warn(`No canvas sessions connected. Rendering to ${sessionId} anyway. Available: ${connected.join(", ")}`);
62
+ }
63
+
64
+ await canvasManager.sendA2UIMessage(sessionId, "a2ui:createSurface", {
65
+ surfaceId: params.surfaceId as string,
66
+ catalogId: params.catalogId as string,
67
+ theme: params.theme as Record<string, unknown> ?? {},
68
+ sendDataModel: params.sendDataModel as boolean ?? false,
69
+ });
70
+
71
+ log.info(`Created A2UI surface '${params.surfaceId}' on session ${sessionId}`);
72
+ return JSON.stringify({
73
+ status: "created",
74
+ surfaceId: params.surfaceId,
75
+ sessionId,
76
+ });
77
+ },
78
+ };
79
+ }
80
+
81
+ export function createA2UIUpdateComponentsTool(_config: Config): Tool {
82
+ const log = logger.child("a2ui-components");
83
+
84
+ return {
85
+ name: "a2ui_update_components",
86
+ description: `Send A2UI v0.9 components to an existing surface. Components are a FLAT list with ID references (adjacency list).
87
+
88
+ CHILDREN (spec oficial A2UI v0.9):
89
+ Static: "children": ["id1", "id2"] ← array crudo, formato oficial
90
+ Template: "children": {"path": "/items", "componentId": "item_tmpl"} ← formato oficial
91
+ Single child (Card/Modal): "child": "child_id"
92
+
93
+ COMPONENT PROPS (nombres oficiales del spec):
94
+ Text: text (string|{path}), variant ("h1"|"h2"|"h3"|"h4"|"h5"|"body"|"caption"|"code")
95
+ Button: child (id del texto), variant ("default"|"primary"|"borderless"), action (required)
96
+ TextField: label, value: {path:"/..."}, variant ("shortText"|"longText"|"number"|"obscured"), validationRegexp, action
97
+ - action fires on blur or Enter key
98
+ ChoicePicker: options [{label, value}], value: {path:"/..."}, variant ("mutuallyExclusive"|"multipleSelection"), displayStyle ("checkbox"|"chips"), filterable, action
99
+ - value es DynamicStringList; two-way binding con value; action fires inmediatamente
100
+ Slider: label, value: {path:"/..."}, min, max, step, action (fires on release)
101
+ CheckBox: label, value: {path:"/..."} (DynamicBoolean, two-way binding)
102
+ DateTimeInput: value: {path:"/..."}, enableDate, enableTime, min, max, label
103
+ Tabs: tabs: [{title: "string plano", child: "id"}] ← title es string, NO {literalString:...}
104
+ Modal: trigger (id del botón), content (id del dialog)
105
+ Card: child (único hijo), weight
106
+ Row: children, justify ("start"|"center"|"end"|"spaceBetween"|"spaceAround"|"spaceEvenly"), align ("start"|"center"|"end"|"stretch"), weight
107
+ Column: children, justify, align, weight
108
+ List: children (con template path), direction ("vertical"|"horizontal"), align, weight
109
+ Image: url, description, fit ("contain"|"cover"|"fill"|"none"|"scaleDown"), variant ("icon"|"avatar"|"smallFeature"|"mediumFeature"|"largeFeature"|"header")
110
+ Divider: axis ("horizontal"|"vertical")
111
+
112
+ ACTION FORMAT (oficial: con wrapper event):
113
+ {event: {name: "action_name", context: {key: {path: "/data/key"}}}}
114
+
115
+ DATA BINDING: "prop": "literal" | {path: "/json/pointer"} | {call: "fn", args: {...}}
116
+
117
+ Root component: usar id="root" explícito.`,
118
+ parameters: {
119
+ type: "object",
120
+ properties: {
121
+ sessionId: {
122
+ type: "string",
123
+ description: "Session ID to render to",
124
+ },
125
+ surfaceId: {
126
+ type: "string",
127
+ description: "The surface ID to update",
128
+ },
129
+ components: {
130
+ type: "array",
131
+ description: "Flat list of A2UI component definitions.",
132
+ items: {
133
+ type: "object",
134
+ properties: {
135
+ id: { type: "string", description: "Unique component ID within the surface" },
136
+ component: { type: "string", description: "Component type: Text, Button, Row, Column, Card, List, Divider, Image, Icon, Video, AudioPlayer, TextField, CheckBox, ChoicePicker, Slider, DateTimeInput, Tabs, Modal" },
137
+ weight: { type: "number", description: "Flex weight for proportional sizing inside Row/Column" },
138
+ },
139
+ },
140
+ },
141
+ },
142
+ required: ["surfaceId", "components"],
143
+ },
144
+ execute: async (params: Record<string, unknown>, config?: any) => {
145
+ const userId = config?.configurable?.user_id;
146
+ const rawSessionId = params.sessionId as string;
147
+ const sessionId = rawSessionId
148
+ ? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
149
+ : (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
150
+
151
+ await canvasManager.sendA2UIMessage(sessionId, "a2ui:updateComponents", {
152
+ surfaceId: params.surfaceId as string,
153
+ components: params.components,
154
+ });
155
+
156
+ log.info(`Updated A2UI components on surface '${params.surfaceId}' (${(params.components as any[]).length} components)`);
157
+ return JSON.stringify({
158
+ status: "updated",
159
+ surfaceId: params.surfaceId,
160
+ componentCount: (params.components as any[]).length,
161
+ });
162
+ },
163
+ };
164
+ }
165
+
166
+ export function createA2UIUpdateDataModelTool(_config: Config): Tool {
167
+ const log = logger.child("a2ui-data");
168
+
169
+ return {
170
+ name: "a2ui_update_data_model",
171
+ description: "Update the data model for an A2UI v0.9 surface. The data model provides dynamic values that components can bind to via paths (e.g. '/user/name').",
172
+ parameters: {
173
+ type: "object",
174
+ properties: {
175
+ sessionId: {
176
+ type: "string",
177
+ description: "Session ID to render to",
178
+ },
179
+ surfaceId: {
180
+ type: "string",
181
+ description: "The surface ID whose data model to update",
182
+ },
183
+ path: {
184
+ type: "string",
185
+ description: "JSON Pointer path to update (e.g. '/user/name'). If omitted, replaces the entire data model.",
186
+ },
187
+ value: {
188
+ type: "object",
189
+ description: "The new value for the specified path. Can be any JSON value.",
190
+ },
191
+ },
192
+ required: ["surfaceId"],
193
+ },
194
+ execute: async (params: Record<string, unknown>, config?: any) => {
195
+ const userId = config?.configurable?.user_id;
196
+ const rawSessionId = params.sessionId as string;
197
+ const sessionId = rawSessionId
198
+ ? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
199
+ : (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
200
+
201
+ await canvasManager.sendA2UIMessage(sessionId, "a2ui:updateDataModel", {
202
+ surfaceId: params.surfaceId as string,
203
+ path: params.path as string | undefined,
204
+ value: params.value,
205
+ });
206
+
207
+ log.info(`Updated A2UI data model on surface '${params.surfaceId}' (path: ${params.path ?? "/"})`);
208
+ return JSON.stringify({
209
+ status: "updated",
210
+ surfaceId: params.surfaceId,
211
+ path: params.path ?? "/",
212
+ });
213
+ },
214
+ };
215
+ }
216
+
217
+ export function createA2UIDeleteSurfaceTool(_config: Config): Tool {
218
+ const log = logger.child("a2ui-delete");
219
+
220
+ return {
221
+ name: "a2ui_delete_surface",
222
+ description: "Delete an A2UI v0.9 surface and remove it from the user's canvas",
223
+ parameters: {
224
+ type: "object",
225
+ properties: {
226
+ sessionId: {
227
+ type: "string",
228
+ description: "Session ID",
229
+ },
230
+ surfaceId: {
231
+ type: "string",
232
+ description: "The surface ID to delete",
233
+ },
234
+ },
235
+ required: ["surfaceId"],
236
+ },
237
+ execute: async (params: Record<string, unknown>, config?: any) => {
238
+ const userId = config?.configurable?.user_id;
239
+ const rawSessionId = params.sessionId as string;
240
+ const sessionId = rawSessionId
241
+ ? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
242
+ : (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
243
+
244
+ await canvasManager.sendA2UIMessage(sessionId, "a2ui:deleteSurface", {
245
+ surfaceId: params.surfaceId as string,
246
+ });
247
+
248
+ log.info(`Deleted A2UI surface '${params.surfaceId}'`);
249
+ return JSON.stringify({
250
+ status: "deleted",
251
+ surfaceId: params.surfaceId,
252
+ });
253
+ },
254
+ };
255
+ }