@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,231 @@
1
+ /**
2
+ * Tools Registry - Exports all 66 tools
3
+ *
4
+ * Import this to get all tools:
5
+ * import { createAllTools } from "./tools";
6
+ */
7
+
8
+ import type { Tool } from "./types.ts";
9
+ import type { Config } from "../config/loader.ts";
10
+
11
+ // Filesystem (7)
12
+ import * as filesystem from "./filesystem/index.ts";
13
+
14
+ // Web (9)
15
+ import * as web from "./web/index.ts";
16
+
17
+ // Projects (8)
18
+ import * as projects from "./projects/index.ts";
19
+
20
+ // Cron (7) - Croner-based scheduler tools
21
+ import * as cron from "./cron/index.ts";
22
+
23
+ // CLI (1)
24
+ import * as cli from "./cli/index.ts";
25
+
26
+ // Agents (14)
27
+ import * as agents from "./agents/index.ts";
28
+
29
+ // Canvas (7)
30
+ import * as canvas from "./canvas/index.ts";
31
+
32
+ // Codebridge (3)
33
+ import * as codebridge from "./codebridge/index.ts";
34
+
35
+ // Voice (2)
36
+ import * as voice from "./voice/index.ts";
37
+
38
+ // Core (4)
39
+ import * as core from "./core/index.ts";
40
+
41
+ // Office (8)
42
+ import * as office from "./office/index.ts";
43
+
44
+ // Meeting (4)
45
+ import * as meeting from "./meeting/index.ts";
46
+
47
+ /**
48
+ * Creates all 70 tools with proper configuration
49
+ */
50
+ export function createAllTools(config: Config): Tool[] {
51
+ return [
52
+ // FILESYSTEM (7)
53
+ ...filesystem.createTools(),
54
+
55
+ // WEB (9)
56
+ ...web.createTools(),
57
+
58
+ // PROJECTS (8)
59
+ ...projects.createTools(),
60
+
61
+ // CRON (7)
62
+ ...cron.createTools(),
63
+
64
+ // CLI (1)
65
+ ...cli.createTools(),
66
+
67
+ // AGENTS (14)
68
+ ...agents.createTools(),
69
+
70
+ // CANVAS (7 + A2UI 4)
71
+ ...canvas.createTools(config),
72
+
73
+ // CODEBRIDGE (3)
74
+ ...codebridge.createTools(),
75
+
76
+ // VOICE (2)
77
+ ...voice.createTools(),
78
+
79
+ // CORE (4)
80
+ ...core.createTools(),
81
+
82
+ // OFFICE (8)
83
+ ...office.createTools(),
84
+
85
+ // MEETING (4)
86
+ ...meeting.createTools(),
87
+ ];
88
+ }
89
+
90
+ /**
91
+ * Creates tools by category (for selective loading)
92
+ */
93
+ export function createToolsByCategory(category: string, config: Config): Tool[] {
94
+ switch (category) {
95
+ case "filesystem":
96
+ return filesystem.createTools();
97
+ case "web":
98
+ return web.createTools();
99
+ case "projects":
100
+ return projects.createTools();
101
+ case "cron":
102
+ return cron.createTools();
103
+ case "cli":
104
+ return cli.createTools();
105
+ case "agents":
106
+ return agents.createTools();
107
+ case "canvas":
108
+ return canvas.createTools(config);
109
+ case "codebridge":
110
+ return codebridge.createTools();
111
+ case "voice":
112
+ return voice.createTools();
113
+ case "core":
114
+ return core.createTools();
115
+ case "office":
116
+ return office.createTools();
117
+ case "meeting":
118
+ return meeting.createTools();
119
+ default:
120
+ return [];
121
+ }
122
+ }
123
+
124
+ // Export types
125
+ export * from "./types.ts";
126
+
127
+ // Export tools by category (avoiding createTools name collisions)
128
+ // Use category-specific imports or createAllTools/createToolsByCategory
129
+ export {
130
+ fsEditTool,
131
+ fsReadTool,
132
+ fsWriteTool,
133
+ fsDeleteTool,
134
+ fsListTool,
135
+ fsGlobTool,
136
+ fsExistsTool,
137
+ } from "./filesystem/index.ts";
138
+
139
+ export {
140
+ webSearchTool,
141
+ webFetchTool,
142
+ browserNavigateTool,
143
+ browserScreenshotTool,
144
+ browserClickTool,
145
+ browserTypeTool,
146
+ browserExtractTool,
147
+ browserScriptTool,
148
+ browserWaitTool,
149
+ } from "./web/index.ts";
150
+
151
+ export {
152
+ projectCreateTool,
153
+ projectListTool,
154
+ projectUpdateTool,
155
+ projectDoneTool,
156
+ projectFailTool,
157
+ taskCreateTool,
158
+ taskUpdateTool,
159
+ taskEvaluateTool,
160
+ } from "./projects/index.ts";
161
+
162
+ export {
163
+ cronCreateTool,
164
+ cronListTool,
165
+ cronUpdateTool,
166
+ cronPauseTool,
167
+ cronResumeTool,
168
+ cronDeleteTool,
169
+ cronTriggerTool,
170
+ cronHistoryTool,
171
+ setSchedulerInstance,
172
+ resolveBestChannel,
173
+ } from "./cron/index.ts";
174
+
175
+ export { cliExecTool } from "./cli/index.ts";
176
+
177
+ export {
178
+ memoryWriteTool,
179
+ memoryReadTool,
180
+ memoryListTool,
181
+ memorySearchTool,
182
+ memoryDeleteTool,
183
+ agentCreateTool,
184
+ agentFindTool,
185
+ agentArchiveTool,
186
+ taskDelegateTool,
187
+ taskDelegateCodeTool,
188
+ taskStatusTool,
189
+ busPublishTool,
190
+ busReadTool,
191
+ projectUpdatesTool,
192
+ } from "./agents/index.ts";
193
+
194
+ export {
195
+ canvasRenderTool,
196
+ canvasAskTool,
197
+ canvasConfirmTool,
198
+ canvasShowCardTool,
199
+ canvasShowProgressTool,
200
+ canvasShowListTool,
201
+ canvasClearTool,
202
+ } from "./canvas/index.ts";
203
+
204
+ export {
205
+ codebridgeLaunchTool,
206
+ codebridgeStatusTool,
207
+ codebridgeCancelTool,
208
+ } from "./codebridge/index.ts";
209
+
210
+ export {
211
+ voiceTranscribeTool,
212
+ voiceSpeakTool,
213
+ } from "./voice/index.ts";
214
+
215
+ export {
216
+ searchKnowledgeTool,
217
+ notifyTool,
218
+ saveNoteTool,
219
+ reportProgressTool,
220
+ } from "./core/index.ts";
221
+
222
+ export {
223
+ officeLeerPdfTool,
224
+ officeEscribirPdfTool,
225
+ officeLeerDocxTool,
226
+ officeEscribirDocxTool,
227
+ officeLeerXlsxTool,
228
+ officeEscribirXlsxTool,
229
+ officeLeerPptxTool,
230
+ officeEscribirPptxTool,
231
+ } from "./office/index.ts";
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Meeting Tools - 4 tools para transcripción de reuniones
3
+ *
4
+ * @category meeting
5
+ *
6
+ * - meeting_start — Inicia una sesión de transcripción
7
+ * - meeting_add_segment — Transcribe un chunk de audio y lo agrega a la sesión
8
+ * - meeting_stop — Detiene la sesión de transcripción
9
+ * - meeting_report — Obtiene el transcript completo para que el agente genere el reporte
10
+ */
11
+
12
+ import type { Tool } from "../types.ts";
13
+ import { getDb } from "../../storage/SQLiteStorage.ts";
14
+ import { voiceService, type AudioInput } from "../../voice/index.ts";
15
+ import { logger } from "../../utils/logger.ts";
16
+
17
+ const log = logger.child("meeting");
18
+
19
+ // ─── meeting_start ───────────────────────────────────────────────────────────
20
+
21
+ export const meetingStartTool: Tool = {
22
+ name: "meeting_start",
23
+ description:
24
+ "Inicia una sesión de transcripción de reunión en tiempo real. | Start a real-time meeting transcription session.",
25
+ parameters: {
26
+ type: "object",
27
+ properties: {
28
+ title: {
29
+ type: "string",
30
+ description: "Título de la reunión (default: 'Reunión sin título')",
31
+ },
32
+ stt_model: {
33
+ type: "string",
34
+ description:
35
+ "Modelo STT a usar: 'whisper-large-v3-turbo' (default), 'whisper-large-v3', 'whisper-1'",
36
+ },
37
+ },
38
+ required: [],
39
+ },
40
+ execute: async (params) => {
41
+ const title = (params.title as string) || "Reunión sin título";
42
+ const sttModel =
43
+ (params.stt_model as string) || "whisper-large-v3-turbo";
44
+
45
+ try {
46
+ const db = getDb();
47
+ const result = db
48
+ .query(
49
+ `INSERT INTO meeting_sessions (title, stt_model)
50
+ VALUES (?, ?)
51
+ RETURNING id, title, status, stt_model, started_at`
52
+ )
53
+ .get(title, sttModel) as {
54
+ id: string;
55
+ title: string;
56
+ status: string;
57
+ stt_model: string;
58
+ started_at: number;
59
+ };
60
+
61
+ log.info(`Meeting session started: ${result.id} — "${title}"`);
62
+
63
+ return {
64
+ ok: true,
65
+ session_id: result.id,
66
+ title: result.title,
67
+ status: result.status,
68
+ stt_model: result.stt_model,
69
+ message: `✅ Sesión de reunión iniciada. ID: ${result.id}\nTítulo: "${title}"\nModelo STT: ${sttModel}`,
70
+ };
71
+ } catch (error) {
72
+ log.error(`meeting_start error: ${(error as Error).message}`);
73
+ return { ok: false, error: `Error al iniciar la sesión: ${(error as Error).message}` };
74
+ }
75
+ },
76
+ };
77
+
78
+ // ─── meeting_add_segment ─────────────────────────────────────────────────────
79
+
80
+ export const meetingAddSegmentTool: Tool = {
81
+ name: "meeting_add_segment",
82
+ description:
83
+ "Transcribe un chunk de audio y lo agrega a la sesión de reunión activa. | Transcribe an audio chunk and add it to the active meeting session.",
84
+ parameters: {
85
+ type: "object",
86
+ properties: {
87
+ session_id: {
88
+ type: "string",
89
+ description: "ID de la sesión de reunión activa",
90
+ },
91
+ audio_base64: {
92
+ type: "string",
93
+ description: "Audio codificado en base64 (webm, ogg, mp3)",
94
+ },
95
+ speaker: {
96
+ type: "string",
97
+ description: "Etiqueta del hablante (opcional, ej: 'Ana', 'Speaker 1')",
98
+ },
99
+ mime_type: {
100
+ type: "string",
101
+ description: "Tipo MIME del audio (default: 'audio/webm')",
102
+ },
103
+ },
104
+ required: ["session_id", "audio_base64"],
105
+ },
106
+ execute: async (params) => {
107
+ const sessionId = params.session_id as string;
108
+ const audioBase64 = params.audio_base64 as string;
109
+ const speaker = (params.speaker as string) || null;
110
+ const mimeType = (params.mime_type as string) || "audio/webm";
111
+
112
+ try {
113
+ const db = getDb();
114
+
115
+ const session = db
116
+ .query(
117
+ `SELECT id, stt_model, status FROM meeting_sessions WHERE id = ?`
118
+ )
119
+ .get(sessionId) as { id: string; stt_model: string; status: string } | undefined;
120
+
121
+ if (!session) {
122
+ return { ok: false, error: `Sesión ${sessionId} no encontrada.` };
123
+ }
124
+ if (session.status !== "active") {
125
+ return {
126
+ ok: false,
127
+ error: `La sesión está ${session.status}. Solo se pueden agregar segmentos a sesiones activas.`,
128
+ };
129
+ }
130
+
131
+ const audioInput: AudioInput = {
132
+ type: "base64",
133
+ data: audioBase64,
134
+ mimeType,
135
+ };
136
+
137
+ let transcription: string;
138
+ try {
139
+ transcription = await voiceService.transcribe(audioInput, session.stt_model);
140
+ } catch (transcribeError) {
141
+ return {
142
+ ok: false,
143
+ error: `Error de transcripción: ${(transcribeError as Error).message}`,
144
+ };
145
+ }
146
+
147
+ const seqResult = db
148
+ .query(
149
+ `SELECT COALESCE(MAX(seq) + 1, 0) as next_seq FROM meeting_segments WHERE session_id = ?`
150
+ )
151
+ .get(sessionId) as { next_seq: number };
152
+
153
+ const seq = seqResult.next_seq;
154
+
155
+ db.query(
156
+ `INSERT INTO meeting_segments (session_id, seq, speaker, text, duration_ms)
157
+ VALUES (?, ?, ?, ?, NULL)`
158
+ ).run(sessionId, seq, speaker, transcription);
159
+
160
+ log.info(`Segment ${seq} added to session ${sessionId}: "${transcription.substring(0, 60)}..."`);
161
+
162
+ return {
163
+ ok: true,
164
+ seq,
165
+ speaker: speaker || null,
166
+ text: transcription,
167
+ message: speaker ? `[${speaker}]: ${transcription}` : transcription,
168
+ };
169
+ } catch (error) {
170
+ log.error(`meeting_add_segment error: ${(error as Error).message}`);
171
+ return {
172
+ ok: false,
173
+ error: `Error al agregar segmento: ${(error as Error).message}`,
174
+ };
175
+ }
176
+ },
177
+ };
178
+
179
+ // ─── meeting_stop ────────────────────────────────────────────────────────────
180
+
181
+ export const meetingStopTool: Tool = {
182
+ name: "meeting_stop",
183
+ description:
184
+ "Detiene una sesión de transcripción de reunión. | Stop an active meeting transcription session.",
185
+ parameters: {
186
+ type: "object",
187
+ properties: {
188
+ session_id: {
189
+ type: "string",
190
+ description: "ID de la sesión de reunión a detener",
191
+ },
192
+ },
193
+ required: ["session_id"],
194
+ },
195
+ execute: async (params) => {
196
+ const sessionId = params.session_id as string;
197
+
198
+ try {
199
+ const db = getDb();
200
+
201
+ const session = db
202
+ .query(`SELECT id, title, status FROM meeting_sessions WHERE id = ?`)
203
+ .get(sessionId) as { id: string; title: string; status: string } | undefined;
204
+
205
+ if (!session) {
206
+ return { ok: false, error: `Sesión ${sessionId} no encontrada.` };
207
+ }
208
+ if (session.status === "stopped" || session.status === "report_ready") {
209
+ return {
210
+ ok: true,
211
+ session_id: sessionId,
212
+ message: `La sesión ya estaba detenida (status: ${session.status}).`,
213
+ };
214
+ }
215
+
216
+ db.query(
217
+ `UPDATE meeting_sessions SET status = 'stopped', stopped_at = unixepoch() WHERE id = ?`
218
+ ).run(sessionId);
219
+
220
+ const countResult = db
221
+ .query(`SELECT COUNT(*) as count FROM meeting_segments WHERE session_id = ?`)
222
+ .get(sessionId) as { count: number };
223
+
224
+ log.info(`Meeting session stopped: ${sessionId} — ${countResult.count} segments`);
225
+
226
+ return {
227
+ ok: true,
228
+ session_id: sessionId,
229
+ title: session.title,
230
+ segment_count: countResult.count,
231
+ message: `⏹️ Sesión "${session.title}" detenida.\n${countResult.count} segmentos transcritos.\n\nPuedes pedir el reporte con: "Genera el reporte de la reunión ${sessionId}"`,
232
+ };
233
+ } catch (error) {
234
+ log.error(`meeting_stop error: ${(error as Error).message}`);
235
+ return { ok: false, error: `Error al detener la sesión: ${(error as Error).message}` };
236
+ }
237
+ },
238
+ };
239
+
240
+ // ─── meeting_report ──────────────────────────────────────────────────────────
241
+
242
+ export const meetingReportTool: Tool = {
243
+ name: "meeting_report",
244
+ description:
245
+ "Obtiene el transcript completo de una sesión de reunión para que el agente genere el informe gerencial. | Get the full transcript of a meeting session so the agent can generate the managerial report.",
246
+ parameters: {
247
+ type: "object",
248
+ properties: {
249
+ session_id: {
250
+ type: "string",
251
+ description: "ID de la sesión de reunión",
252
+ },
253
+ },
254
+ required: ["session_id"],
255
+ },
256
+ execute: async (params) => {
257
+ const sessionId = params.session_id as string;
258
+
259
+ try {
260
+ const db = getDb();
261
+
262
+ const session = db
263
+ .query(
264
+ `SELECT id, title, status, stt_model, started_at, stopped_at
265
+ FROM meeting_sessions WHERE id = ?`
266
+ )
267
+ .get(sessionId) as {
268
+ id: string;
269
+ title: string;
270
+ status: string;
271
+ stt_model: string;
272
+ started_at: number;
273
+ stopped_at: number | null;
274
+ } | undefined;
275
+
276
+ if (!session) {
277
+ return { ok: false, error: `Sesión ${sessionId} no encontrada.` };
278
+ }
279
+
280
+ const segments = db
281
+ .query(
282
+ `SELECT seq, speaker, text, created_at
283
+ FROM meeting_segments WHERE session_id = ?
284
+ ORDER BY seq ASC`
285
+ )
286
+ .all(sessionId) as {
287
+ seq: number;
288
+ speaker: string | null;
289
+ text: string;
290
+ created_at: number;
291
+ }[];
292
+
293
+ if (segments.length === 0) {
294
+ return {
295
+ ok: false,
296
+ error: "La sesión no tiene segmentos transcritos. No se puede generar el reporte.",
297
+ };
298
+ }
299
+
300
+ const transcript = segments
301
+ .map((s) => (s.speaker ? `[${s.speaker}]: ${s.text}` : s.text))
302
+ .join("\n");
303
+
304
+ const durationSec = session.stopped_at
305
+ ? session.stopped_at - session.started_at
306
+ : Math.floor(Date.now() / 1000) - session.started_at;
307
+ const durationMin = Math.floor(durationSec / 60);
308
+ const durationSecRem = durationSec % 60;
309
+
310
+ return {
311
+ ok: true,
312
+ session_id: session.id,
313
+ title: session.title,
314
+ status: session.status,
315
+ duration: `${durationMin}m ${durationSecRem}s`,
316
+ segment_count: segments.length,
317
+ transcript,
318
+ instructions: `Con el transcript anterior, genera un INFORME GERENCIAL en español con estas secciones:
319
+
320
+ ## Informe de Reunión: ${session.title}
321
+
322
+ ### 1. Resumen Ejecutivo
323
+ (3-5 oraciones que capturen la esencia de la reunión)
324
+
325
+ ### 2. Participantes Detectados
326
+ (Lista de nombres o roles mencionados en el transcript)
327
+
328
+ ### 3. Decisiones Tomadas
329
+ (Lista numerada de cada decisión concreta)
330
+
331
+ ### 4. Action Items
332
+ | Qué | Quién | Cuándo |
333
+ |-----|-------|--------|
334
+ (Tabla con todas las tareas asignadas)
335
+
336
+ ### 5. Próximos Pasos
337
+ (Lista de acciones inmediatas)
338
+
339
+ ### 6. Temas de Seguimiento
340
+ (Puntos que quedaron pendientes o requieren más discusión)
341
+
342
+ Luego llama a office_escribir_docx para guardar el reporte como documento Word.`,
343
+ };
344
+ } catch (error) {
345
+ log.error(`meeting_report error: ${(error as Error).message}`);
346
+ return {
347
+ ok: false,
348
+ error: `Error al obtener el reporte: ${(error as Error).message}`,
349
+ };
350
+ }
351
+ },
352
+ };
353
+
354
+ // ─── Registry ────────────────────────────────────────────────────────────────
355
+
356
+ export function createTools(): Tool[] {
357
+ return [
358
+ meetingStartTool,
359
+ meetingAddSegmentTool,
360
+ meetingStopTool,
361
+ meetingReportTool,
362
+ ];
363
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Office Tools - 8 tools para manejo de archivos Office
3
+ *
4
+ * @category office
5
+ *
6
+ * Herramientas:
7
+ * - office_leer_pdf — Leer PDF y extraer texto + metadata
8
+ * - office_escribir_pdf — Generar PDF desde texto
9
+ * - office_leer_docx — Leer Word (.docx) y extraer texto
10
+ * - office_escribir_docx — Generar Word (.docx) con párrafos y tablas
11
+ * - office_leer_xlsx — Leer Excel (.xlsx) como JSON
12
+ * - office_escribir_xlsx — Generar Excel (.xlsx) desde JSON
13
+ * - office_leer_pptx — Leer PowerPoint (.pptx) y extraer texto por slide
14
+ * - office_escribir_pptx — Generar PowerPoint (.pptx) desde array de slides
15
+ */
16
+
17
+ import type { Tool } from "../types.ts";
18
+ import { officeLeerPdfTool } from "./office-leer-pdf.ts";
19
+ import { officeEscribirPdfTool } from "./office-escribir-pdf.ts";
20
+ import { officeLeerDocxTool } from "./office-leer-docx.ts";
21
+ import { officeEscribirDocxTool } from "./office-escribir-docx.ts";
22
+ import { officeLeerXlsxTool } from "./office-leer-xlsx.ts";
23
+ import { officeEscribirXlsxTool } from "./office-escribir-xlsx.ts";
24
+ import { officeLeerPptxTool } from "./office-leer-pptx.ts";
25
+ import { officeEscribirPptxTool } from "./office-escribir-pptx.ts";
26
+
27
+ export function createTools(): Tool[] {
28
+ return [
29
+ officeLeerPdfTool,
30
+ officeEscribirPdfTool,
31
+ officeLeerDocxTool,
32
+ officeEscribirDocxTool,
33
+ officeLeerXlsxTool,
34
+ officeEscribirXlsxTool,
35
+ officeLeerPptxTool,
36
+ officeEscribirPptxTool,
37
+ ];
38
+ }
39
+
40
+ export * from "./office-leer-pdf.ts";
41
+ export * from "./office-escribir-pdf.ts";
42
+ export * from "./office-leer-docx.ts";
43
+ export * from "./office-escribir-docx.ts";
44
+ export * from "./office-leer-xlsx.ts";
45
+ export * from "./office-escribir-xlsx.ts";
46
+ export * from "./office-leer-pptx.ts";
47
+ export * from "./office-escribir-pptx.ts";