@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.
- package/.github/CODEOWNERS +9 -0
- package/.github/workflows/publish.yml +89 -0
- package/.github/workflows/version-bump.yml +102 -0
- package/CHANGELOG.md +38 -0
- package/README.md +158 -0
- package/bun.lock +543 -0
- package/bunfig.toml +7 -0
- package/docs/API-AGENTS.md +316 -0
- package/docs/API-CONTEXT-COMPILER.md +252 -0
- package/docs/API-DAG-SCHEDULER.md +273 -0
- package/docs/API-TOOLS-SKILLS-CHANNELS.md +293 -0
- package/docs/API-WORKERS-EVENTS.md +152 -0
- package/docs/INDEX.md +141 -0
- package/docs/README.md +68 -0
- package/package.json +54 -105
- package/packages/cli/package.json +17 -0
- package/packages/cli/src/commands/init.ts +56 -0
- package/packages/cli/src/commands/run.ts +45 -0
- package/packages/cli/src/commands/test.ts +42 -0
- package/packages/cli/src/commands/trace.ts +55 -0
- package/packages/cli/src/index.ts +43 -0
- package/packages/core/package.json +58 -0
- package/packages/core/src/ace/Curator.ts +158 -0
- package/packages/core/src/ace/Reflector.ts +200 -0
- package/packages/core/src/ace/Tracer.ts +100 -0
- package/packages/core/src/ace/index.ts +4 -0
- package/packages/core/src/agent/AgentRunner.ts +699 -0
- package/packages/core/src/agent/Compaction.ts +221 -0
- package/packages/core/src/agent/ContextCompiler.ts +567 -0
- package/packages/core/src/agent/ContextGuard.ts +91 -0
- package/packages/core/src/agent/ConversationStore.ts +244 -0
- package/packages/core/src/agent/Hooks.ts +166 -0
- package/packages/core/src/agent/NativeTools.ts +31 -0
- package/packages/core/src/agent/PromptBuilder.ts +169 -0
- package/packages/core/src/agent/Service.ts +267 -0
- package/packages/core/src/agent/StuckLoop.ts +133 -0
- package/packages/core/src/agent/index.ts +12 -0
- package/packages/core/src/agent/providers/LLMClient.ts +149 -0
- package/packages/core/src/agent/providers/anthropic.ts +212 -0
- package/packages/core/src/agent/providers/gemini.ts +215 -0
- package/packages/core/src/agent/providers/index.ts +199 -0
- package/packages/core/src/agent/providers/interface.ts +195 -0
- package/packages/core/src/agent/providers/ollama.ts +175 -0
- package/packages/core/src/agent/providers/openai-compat.ts +231 -0
- package/packages/core/src/agent/providers.ts +1 -0
- package/packages/core/src/agent/selectors/PlaybookSelector.ts +147 -0
- package/packages/core/src/agent/selectors/SkillSelector.ts +478 -0
- package/packages/core/src/agent/selectors/ToolSelector.ts +577 -0
- package/packages/core/src/agent/selectors/index.ts +6 -0
- package/packages/core/src/api/createAgent.test.ts +48 -0
- package/packages/core/src/api/createAgent.ts +122 -0
- package/packages/core/src/api/index.ts +2 -0
- package/packages/core/src/canvas/CanvasManager.ts +390 -0
- package/packages/core/src/canvas/a2ui-tools.ts +255 -0
- package/packages/core/src/canvas/canvas-tools.ts +448 -0
- package/packages/core/src/canvas/emitter.ts +149 -0
- package/packages/core/src/canvas/index.ts +6 -0
- package/packages/core/src/config/index.ts +2 -0
- package/packages/core/src/config/loader.ts +554 -0
- package/packages/core/src/ethics/EthicsGuard.test.ts +54 -0
- package/packages/core/src/ethics/EthicsGuard.ts +66 -0
- package/packages/core/src/ethics/index.ts +2 -0
- package/packages/core/src/gateway/channel-notify.test.ts +14 -0
- package/packages/core/src/gateway/channel-notify.ts +12 -0
- package/packages/core/src/gateway/index.ts +1 -0
- package/packages/core/src/index.ts +37 -0
- package/packages/core/src/mcp/MCPClient.ts +439 -0
- package/packages/core/src/mcp/MCPToolAdapter.ts +176 -0
- package/packages/core/src/mcp/config.ts +13 -0
- package/packages/core/src/mcp/hot-reload.ts +147 -0
- package/packages/core/src/mcp/index.ts +11 -0
- package/packages/core/src/mcp/logger.ts +42 -0
- package/packages/core/src/mcp/singleton.ts +21 -0
- package/packages/core/src/mcp/transports/index.ts +67 -0
- package/packages/core/src/mcp/transports/sse.ts +241 -0
- package/packages/core/src/mcp/transports/websocket.ts +159 -0
- package/packages/core/src/memory/Scratchpad.test.ts +47 -0
- package/packages/core/src/memory/Scratchpad.ts +37 -0
- package/packages/core/src/memory/Storage.ts +6 -0
- package/packages/core/src/memory/index.ts +2 -0
- package/packages/core/src/multimodal/VisionService.ts +293 -0
- package/packages/core/src/multimodal/index.ts +2 -0
- package/packages/core/src/multimodal/types.ts +28 -0
- package/packages/core/src/security/Pairing.ts +250 -0
- package/packages/core/src/security/RateLimit.ts +270 -0
- package/packages/core/src/security/index.ts +4 -0
- package/packages/core/src/skills/SkillLoader.ts +388 -0
- package/packages/core/src/skills/bundled-data.generated.ts +3332 -0
- package/packages/core/src/skills/defineSkill.ts +18 -0
- package/packages/core/src/skills/index.ts +4 -0
- package/packages/core/src/state/index.ts +2 -0
- package/packages/core/src/state/store.ts +312 -0
- package/packages/core/src/storage/SQLiteStorage.ts +407 -0
- package/packages/core/src/storage/crypto.ts +101 -0
- package/packages/core/src/storage/index.ts +10 -0
- package/packages/core/src/storage/onboarding.ts +1603 -0
- package/packages/core/src/storage/schema.ts +689 -0
- package/packages/core/src/storage/seed.ts +740 -0
- package/packages/core/src/storage/usage.ts +374 -0
- package/packages/core/src/swarm/AgentBus.ts +460 -0
- package/packages/core/src/swarm/AgentExecutor.ts +53 -0
- package/packages/core/src/swarm/Coordinator.ts +251 -0
- package/packages/core/src/swarm/EventBridge.ts +122 -0
- package/packages/core/src/swarm/EventBus.ts +169 -0
- package/packages/core/src/swarm/TaskGraph.ts +192 -0
- package/packages/core/src/swarm/TaskNode.ts +97 -0
- package/packages/core/src/swarm/TaskResult.ts +22 -0
- package/packages/core/src/swarm/WorkerPool.ts +236 -0
- package/packages/core/src/swarm/errors.ts +37 -0
- package/packages/core/src/swarm/index.ts +30 -0
- package/packages/core/src/swarm/presets/HiveLearnPreset.ts +99 -0
- package/packages/core/src/swarm/presets/ResearchPreset.ts +97 -0
- package/packages/core/src/swarm/presets/index.ts +4 -0
- package/packages/core/src/swarm/strategies/ParallelStrategy.ts +21 -0
- package/packages/core/src/swarm/strategies/PriorityStrategy.ts +46 -0
- package/packages/core/src/swarm/strategies/index.ts +3 -0
- package/packages/core/src/swarm/types.ts +164 -0
- package/packages/core/src/tools/ToolExecutor.ts +58 -0
- package/packages/core/src/tools/ToolRegistry.test.ts +98 -0
- package/packages/core/src/tools/ToolRegistry.ts +61 -0
- package/packages/core/src/tools/agents/get-available-models.ts +118 -0
- package/packages/core/src/tools/agents/index.ts +715 -0
- package/packages/core/src/tools/bridge-events.ts +26 -0
- package/packages/core/src/tools/canvas/index.ts +375 -0
- package/packages/core/src/tools/cli/index.ts +142 -0
- package/packages/core/src/tools/codebridge/index.ts +342 -0
- package/packages/core/src/tools/core/index.ts +476 -0
- package/packages/core/src/tools/cron/index.ts +626 -0
- package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
- package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
- package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
- package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
- package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
- package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
- package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
- package/packages/core/src/tools/filesystem/index.ts +34 -0
- package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
- package/packages/core/src/tools/index.ts +231 -0
- package/packages/core/src/tools/meeting/index.ts +363 -0
- package/packages/core/src/tools/office/index.ts +47 -0
- package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
- package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
- package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
- package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
- package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
- package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
- package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
- package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
- package/packages/core/src/tools/projects/index.ts +37 -0
- package/packages/core/src/tools/projects/project-create.ts +94 -0
- package/packages/core/src/tools/projects/project-done.ts +66 -0
- package/packages/core/src/tools/projects/project-fail.ts +66 -0
- package/packages/core/src/tools/projects/project-list.ts +96 -0
- package/packages/core/src/tools/projects/project-update.ts +72 -0
- package/packages/core/src/tools/projects/task-create.ts +68 -0
- package/packages/core/src/tools/projects/task-evaluate.ts +93 -0
- package/packages/core/src/tools/projects/task-update.ts +93 -0
- package/packages/core/src/tools/types.ts +39 -0
- package/packages/core/src/tools/voice/index.ts +104 -0
- package/packages/core/src/tools/web/browser-click.ts +78 -0
- package/packages/core/src/tools/web/browser-extract.ts +139 -0
- package/packages/core/src/tools/web/browser-navigate.ts +106 -0
- package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
- package/packages/core/src/tools/web/browser-script.ts +88 -0
- package/packages/core/src/tools/web/browser-service.ts +554 -0
- package/packages/core/src/tools/web/browser-type.ts +101 -0
- package/packages/core/src/tools/web/browser-wait.ts +136 -0
- package/packages/core/src/tools/web/index.ts +41 -0
- package/packages/core/src/tools/web/web-fetch.ts +78 -0
- package/packages/core/src/tools/web/web-search.ts +123 -0
- package/packages/core/src/utils/benchmark.ts +80 -0
- package/packages/core/src/utils/crypto.ts +73 -0
- package/packages/core/src/utils/date.ts +42 -0
- package/packages/core/src/utils/index.ts +10 -0
- package/packages/core/src/utils/logger.ts +389 -0
- package/packages/core/src/utils/retry.ts +70 -0
- package/packages/core/src/utils/toon.ts +253 -0
- package/packages/core/src/voice/index.ts +656 -0
- package/test/setup-db.ts +216 -0
- package/tsconfig.json +39 -0
- package/src/agents.ts +0 -1
- package/src/canvas.ts +0 -1
- package/src/channels.ts +0 -1
- package/src/config.ts +0 -1
- package/src/events.ts +0 -1
- package/src/gateway.ts +0 -1
- package/src/index.ts +0 -304
- package/src/mcp.ts +0 -1
- package/src/multimodal.ts +0 -1
- package/src/scheduler.ts +0 -1
- package/src/security.ts +0 -1
- package/src/skills.ts +0 -1
- package/src/state.ts +0 -1
- package/src/storage.ts +0 -1
- package/src/tools.ts +0 -1
- package/src/tts.ts +0 -1
- package/src/types.ts +0 -82
- package/src/utils.ts +0 -1
- 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";
|