@johpaz/hive-sdk 0.0.14 → 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,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project_fail - Mark project as failed
|
|
3
|
+
*
|
|
4
|
+
* @category projects
|
|
5
|
+
* @seedId project_fail
|
|
6
|
+
* @spanish proyecto fallido, marcar fracaso, error
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { getDb } from "../../storage/SQLiteStorage.ts";
|
|
11
|
+
import { logger } from "../../utils/logger.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("project-fail");
|
|
14
|
+
|
|
15
|
+
export const projectFailTool: Tool = {
|
|
16
|
+
name: "project_fail",
|
|
17
|
+
description: "Mark project as failed and record reason. Spanish: proyecto fallido, marcar fracaso, error",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
projectId: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "ID del proyecto fallido",
|
|
24
|
+
},
|
|
25
|
+
reason: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Razón del fallo",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ["projectId", "reason"],
|
|
31
|
+
},
|
|
32
|
+
execute: async (params: Record<string, unknown>) => {
|
|
33
|
+
const db = getDb();
|
|
34
|
+
const projectId = params.projectId as string;
|
|
35
|
+
const reason = params.reason as string;
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
log.error(`Project ${projectId} failed: ${reason}`);
|
|
39
|
+
|
|
40
|
+
const result = db.query(`
|
|
41
|
+
UPDATE projects
|
|
42
|
+
SET status = 'failed', updated_at = unixepoch(), context = ?
|
|
43
|
+
WHERE id = ?
|
|
44
|
+
`).run(reason, projectId);
|
|
45
|
+
|
|
46
|
+
if (result.changes === 0) {
|
|
47
|
+
return {
|
|
48
|
+
ok: false,
|
|
49
|
+
error: `Project not found: ${projectId}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
projectId,
|
|
56
|
+
message: "Project marked as failed.",
|
|
57
|
+
};
|
|
58
|
+
} catch (error) {
|
|
59
|
+
log.error(`Failed to mark project as failed: ${(error as Error).message}`);
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
error: `Failed to mark project as failed: ${(error as Error).message}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project_list - List all projects with their status
|
|
3
|
+
*
|
|
4
|
+
* @category projects
|
|
5
|
+
* @seedId project_list
|
|
6
|
+
* @spanish listar proyectos, ver proyectos, historial
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { getDb } from "../../storage/SQLiteStorage.ts";
|
|
11
|
+
import { logger } from "../../utils/logger.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("project-list");
|
|
14
|
+
|
|
15
|
+
export const projectListTool: Tool = {
|
|
16
|
+
name: "project_list",
|
|
17
|
+
description: "List all projects with their status. Spanish: listar proyectos, ver proyectos, historial",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
status: {
|
|
22
|
+
type: "string",
|
|
23
|
+
enum: ["active", "done", "failed", "all"],
|
|
24
|
+
description: "Filter by status (default: all)",
|
|
25
|
+
},
|
|
26
|
+
limit: {
|
|
27
|
+
type: "number",
|
|
28
|
+
description: "Maximum results (default: 20)",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
execute: async (params: Record<string, unknown>, config?: any) => {
|
|
33
|
+
const db = getDb();
|
|
34
|
+
const userId = config?.configurable?.user_id;
|
|
35
|
+
const statusFilter = params.status as string | undefined;
|
|
36
|
+
const limit = (params.limit as number) ?? 20;
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
let query = `
|
|
40
|
+
SELECT id, name, description, type, status, progress, created_at, updated_at
|
|
41
|
+
FROM projects
|
|
42
|
+
WHERE user_id = ?
|
|
43
|
+
`;
|
|
44
|
+
const args: any[] = [userId];
|
|
45
|
+
|
|
46
|
+
if (statusFilter && statusFilter !== "all") {
|
|
47
|
+
query += ` AND status = ?`;
|
|
48
|
+
args.push(statusFilter);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
query += ` ORDER BY updated_at DESC LIMIT ?`;
|
|
52
|
+
args.push(limit);
|
|
53
|
+
|
|
54
|
+
const rows = db.query(query).all(...args) as any[];
|
|
55
|
+
|
|
56
|
+
const projects = rows.map((row) => {
|
|
57
|
+
const tasks = db.query(`
|
|
58
|
+
SELECT id, name, description, status, progress, agent_id, result
|
|
59
|
+
FROM tasks WHERE project_id = ? ORDER BY id ASC
|
|
60
|
+
`).all(row.id) as any[];
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
id: row.id,
|
|
64
|
+
name: row.name,
|
|
65
|
+
description: row.description,
|
|
66
|
+
type: row.type,
|
|
67
|
+
status: row.status,
|
|
68
|
+
progress: row.progress,
|
|
69
|
+
createdAt: new Date(row.created_at * 1000).toISOString(),
|
|
70
|
+
updatedAt: new Date(row.updated_at * 1000).toISOString(),
|
|
71
|
+
tasks: tasks.map((t) => ({
|
|
72
|
+
id: t.id,
|
|
73
|
+
name: t.name,
|
|
74
|
+
description: t.description,
|
|
75
|
+
status: t.status,
|
|
76
|
+
progress: t.progress,
|
|
77
|
+
agentId: t.agent_id,
|
|
78
|
+
result: t.result,
|
|
79
|
+
})),
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
ok: true,
|
|
85
|
+
projects,
|
|
86
|
+
count: projects.length,
|
|
87
|
+
};
|
|
88
|
+
} catch (error) {
|
|
89
|
+
log.error(`Failed to list projects: ${(error as Error).message}`);
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
error: `Failed to list projects: ${(error as Error).message}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project_update - Update project progress or metadata
|
|
3
|
+
*
|
|
4
|
+
* @category projects
|
|
5
|
+
* @seedId project_update
|
|
6
|
+
* @spanish actualizar proyecto, avance, porcentaje, estado
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { getDb } from "../../storage/SQLiteStorage.ts";
|
|
11
|
+
import { logger } from "../../utils/logger.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("project-update");
|
|
14
|
+
|
|
15
|
+
export const projectUpdateTool: Tool = {
|
|
16
|
+
name: "project_update",
|
|
17
|
+
description: "Update project progress or metadata. Spanish: actualizar proyecto, avance, porcentaje, estado",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
projectId: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "ID del proyecto a actualizar",
|
|
24
|
+
},
|
|
25
|
+
progress: {
|
|
26
|
+
type: "number",
|
|
27
|
+
description: "Progreso actual (0-100)",
|
|
28
|
+
},
|
|
29
|
+
stepDescription: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Descripción del paso actual o siguiente",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ["projectId", "progress", "stepDescription"],
|
|
35
|
+
},
|
|
36
|
+
execute: async (params: Record<string, unknown>) => {
|
|
37
|
+
const db = getDb();
|
|
38
|
+
const projectId = params.projectId as string;
|
|
39
|
+
const progress = params.progress as number;
|
|
40
|
+
const stepDescription = params.stepDescription as string;
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
log.info(`Updating project ${projectId}: ${progress}%`);
|
|
44
|
+
|
|
45
|
+
const result = db.query(`
|
|
46
|
+
UPDATE projects
|
|
47
|
+
SET progress = ?, context = ?, updated_at = unixepoch()
|
|
48
|
+
WHERE id = ?
|
|
49
|
+
`).run(progress, stepDescription, projectId);
|
|
50
|
+
|
|
51
|
+
if (result.changes === 0) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
error: `Project not found: ${projectId}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
ok: true,
|
|
60
|
+
projectId,
|
|
61
|
+
progress,
|
|
62
|
+
message: `Project updated: ${progress}%`,
|
|
63
|
+
};
|
|
64
|
+
} catch (error) {
|
|
65
|
+
log.error(`Failed to update project: ${(error as Error).message}`);
|
|
66
|
+
return {
|
|
67
|
+
ok: false,
|
|
68
|
+
error: `Failed to update project: ${(error as Error).message}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* task_create - Add a task or subtask to an existing project
|
|
3
|
+
*
|
|
4
|
+
* @category projects
|
|
5
|
+
* @seedId task_create
|
|
6
|
+
* @spanish crear tarea, agregar tarea, subtarea, pendiente
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { getDb } from "../../storage/SQLiteStorage.ts";
|
|
11
|
+
import { logger } from "../../utils/logger.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("task-create");
|
|
14
|
+
|
|
15
|
+
export const taskCreateTool: Tool = {
|
|
16
|
+
name: "task_create",
|
|
17
|
+
description: "Add a task or subtask to an existing project. Spanish: crear tarea, agregar tarea, subtarea, pendiente",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
project_id: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "ID del proyecto al que pertenece la tarea",
|
|
24
|
+
},
|
|
25
|
+
name: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Nombre corto de la tarea",
|
|
28
|
+
},
|
|
29
|
+
description: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Qué debe realizar esta tarea",
|
|
32
|
+
},
|
|
33
|
+
agent_id: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "ID del agente responsable (opcional)",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
required: ["project_id", "name"],
|
|
39
|
+
},
|
|
40
|
+
execute: async (params: Record<string, unknown>) => {
|
|
41
|
+
const db = getDb();
|
|
42
|
+
const projectId = params.project_id as string;
|
|
43
|
+
const name = params.name as string;
|
|
44
|
+
const description = (params.description as string) ?? null;
|
|
45
|
+
const agentId = (params.agent_id as string) ?? null;
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
const result = db.query(`
|
|
49
|
+
INSERT INTO tasks (project_id, agent_id, name, description, status, created_at, updated_at)
|
|
50
|
+
VALUES (?, ?, ?, ?, 'pending', unixepoch(), unixepoch())
|
|
51
|
+
`).run(projectId, agentId, name, description);
|
|
52
|
+
|
|
53
|
+
const taskId = result.lastInsertRowid as number;
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
ok: true,
|
|
57
|
+
taskId,
|
|
58
|
+
message: `Task "${name}" created (ID: ${taskId}).`,
|
|
59
|
+
};
|
|
60
|
+
} catch (error) {
|
|
61
|
+
log.error(`Failed to create task: ${(error as Error).message}`);
|
|
62
|
+
return {
|
|
63
|
+
ok: false,
|
|
64
|
+
error: `Failed to create task: ${(error as Error).message}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* task_evaluate - Evaluate task result against acceptance criteria
|
|
3
|
+
*
|
|
4
|
+
* @category projects
|
|
5
|
+
* @seedId task_evaluate
|
|
6
|
+
* @spanish evaluar tarea, validar resultado, criterios de aceptación
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { getDb } from "../../storage/SQLiteStorage.ts";
|
|
11
|
+
import { logger } from "../../utils/logger.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("task-evaluate");
|
|
14
|
+
|
|
15
|
+
export const taskEvaluateTool: Tool = {
|
|
16
|
+
name: "task_evaluate",
|
|
17
|
+
description: "Evaluate task result against acceptance criteria. Spanish: evaluar tarea, validar resultado, criterios de aceptación",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
task_id: {
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "ID numérico de la tarea a evaluar",
|
|
24
|
+
},
|
|
25
|
+
criteria: {
|
|
26
|
+
type: "array",
|
|
27
|
+
description: "Lista de criterios de aceptación",
|
|
28
|
+
items: { type: "string" },
|
|
29
|
+
},
|
|
30
|
+
auto_update: {
|
|
31
|
+
type: "boolean",
|
|
32
|
+
description: "Si pasa la evaluación, marca la tarea como completed (default: false)",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: ["task_id", "criteria"],
|
|
36
|
+
},
|
|
37
|
+
execute: async (params: Record<string, unknown>) => {
|
|
38
|
+
const db = getDb();
|
|
39
|
+
const taskId = params.task_id as number;
|
|
40
|
+
const criteria = params.criteria as string[];
|
|
41
|
+
const autoUpdate = (params.auto_update as boolean) ?? false;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const task = db.query<any, [number]>(
|
|
45
|
+
"SELECT id, name, status, result FROM tasks WHERE id = ?"
|
|
46
|
+
).get(taskId);
|
|
47
|
+
|
|
48
|
+
if (!task) {
|
|
49
|
+
return {
|
|
50
|
+
ok: false,
|
|
51
|
+
error: `Task not found: ${taskId}`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!task.result) {
|
|
56
|
+
return {
|
|
57
|
+
ok: false,
|
|
58
|
+
error: `Task has no result to evaluate.`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const evaluations = criteria.map((criterion) => {
|
|
63
|
+
const passed = task.result.toLowerCase().includes(criterion.toLowerCase());
|
|
64
|
+
return { criterion, passed };
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const allPassed = evaluations.every((e) => e.passed);
|
|
68
|
+
const passedCount = evaluations.filter((e) => e.passed).length;
|
|
69
|
+
|
|
70
|
+
if (autoUpdate && allPassed) {
|
|
71
|
+
db.query(`
|
|
72
|
+
UPDATE tasks SET status = 'completed', completed_at = unixepoch() WHERE id = ?
|
|
73
|
+
`).run(taskId);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
ok: true,
|
|
78
|
+
taskId,
|
|
79
|
+
allPassed,
|
|
80
|
+
passedCount,
|
|
81
|
+
totalCriteria: criteria.length,
|
|
82
|
+
evaluations,
|
|
83
|
+
autoUpdated: autoUpdate && allPassed,
|
|
84
|
+
};
|
|
85
|
+
} catch (error) {
|
|
86
|
+
log.error(`Failed to evaluate task: ${(error as Error).message}`);
|
|
87
|
+
return {
|
|
88
|
+
ok: false,
|
|
89
|
+
error: `Failed to evaluate task: ${(error as Error).message}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* task_update - Update task status
|
|
3
|
+
*
|
|
4
|
+
* @category projects
|
|
5
|
+
* @seedId task_update
|
|
6
|
+
* @spanish actualizar tarea, marcar completa, en progreso
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { getDb } from "../../storage/SQLiteStorage.ts";
|
|
11
|
+
import { logger } from "../../utils/logger.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("task-update");
|
|
14
|
+
|
|
15
|
+
export const taskUpdateTool: Tool = {
|
|
16
|
+
name: "task_update",
|
|
17
|
+
description: "Update task status (pending, in_progress, done). Spanish: actualizar tarea, marcar completa, en progreso",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
task_id: {
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "ID numérico de la tarea",
|
|
24
|
+
},
|
|
25
|
+
status: {
|
|
26
|
+
type: "string",
|
|
27
|
+
enum: ["pending", "in_progress", "completed", "failed", "blocked"],
|
|
28
|
+
description: "Nuevo estado de la tarea",
|
|
29
|
+
},
|
|
30
|
+
progress: {
|
|
31
|
+
type: "number",
|
|
32
|
+
description: "Progreso de la tarea (0-100)",
|
|
33
|
+
},
|
|
34
|
+
result: {
|
|
35
|
+
type: "string",
|
|
36
|
+
description: "Resultado o output de la tarea",
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
required: ["task_id"],
|
|
40
|
+
},
|
|
41
|
+
execute: async (params: Record<string, unknown>) => {
|
|
42
|
+
const db = getDb();
|
|
43
|
+
const taskId = params.task_id as number;
|
|
44
|
+
const status = params.status as string | undefined;
|
|
45
|
+
const progress = params.progress as number | undefined;
|
|
46
|
+
const result = params.result as string | undefined;
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
log.info(`Updating task ${taskId}`);
|
|
50
|
+
|
|
51
|
+
const updates: string[] = [];
|
|
52
|
+
const values: any[] = [];
|
|
53
|
+
|
|
54
|
+
if (status !== undefined) {
|
|
55
|
+
updates.push("status = ?");
|
|
56
|
+
values.push(status);
|
|
57
|
+
}
|
|
58
|
+
if (progress !== undefined) {
|
|
59
|
+
updates.push("progress = ?");
|
|
60
|
+
values.push(progress);
|
|
61
|
+
}
|
|
62
|
+
if (result !== undefined) {
|
|
63
|
+
updates.push("result = ?");
|
|
64
|
+
values.push(result);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
updates.push("updated_at = unixepoch()");
|
|
68
|
+
values.push(taskId);
|
|
69
|
+
|
|
70
|
+
const query = `UPDATE tasks SET ${updates.join(", ")} WHERE id = ?`;
|
|
71
|
+
const updateResult = db.query(query).run(...values);
|
|
72
|
+
|
|
73
|
+
if (updateResult.changes === 0) {
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
error: `Task not found: ${taskId}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
ok: true,
|
|
82
|
+
taskId,
|
|
83
|
+
message: `Task ${taskId} updated.`,
|
|
84
|
+
};
|
|
85
|
+
} catch (error) {
|
|
86
|
+
log.error(`Failed to update task: ${(error as Error).message}`);
|
|
87
|
+
return {
|
|
88
|
+
ok: false,
|
|
89
|
+
error: `Failed to update task: ${(error as Error).message}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Type Definitions
|
|
3
|
+
* Shared across all tool categories
|
|
4
|
+
*
|
|
5
|
+
* These types are used by all 52 native tools in Hive
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface Tool {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
parameters: {
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: Record<string, ToolParameter>;
|
|
14
|
+
required?: string[];
|
|
15
|
+
};
|
|
16
|
+
execute: (
|
|
17
|
+
params: Record<string, unknown>,
|
|
18
|
+
config?: any
|
|
19
|
+
) => Promise<string | object>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ToolParameter {
|
|
23
|
+
type: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
enum?: string[];
|
|
26
|
+
items?: ToolParameter;
|
|
27
|
+
properties?: Record<string, ToolParameter>;
|
|
28
|
+
required?: string[];
|
|
29
|
+
minimum?: number;
|
|
30
|
+
maximum?: number;
|
|
31
|
+
additionalProperties?: boolean | ToolParameter;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ToolResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
result?: any;
|
|
37
|
+
error?: string;
|
|
38
|
+
hint?: string;
|
|
39
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice Tools - 2 tools
|
|
3
|
+
*
|
|
4
|
+
* @category voice
|
|
5
|
+
*/
|
|
6
|
+
import type { Tool } from "../types.ts";
|
|
7
|
+
import { logger } from "../../utils/logger.ts";
|
|
8
|
+
|
|
9
|
+
const log = logger.child("voice");
|
|
10
|
+
|
|
11
|
+
// ─── voice_transcribe ────────────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
export const voiceTranscribeTool: Tool = {
|
|
14
|
+
name: "voice_transcribe",
|
|
15
|
+
description: "Transcribe audio input to text. Spanish: transcribir audio, voz a texto, reconocimiento de voz",
|
|
16
|
+
parameters: {
|
|
17
|
+
type: "object",
|
|
18
|
+
properties: {
|
|
19
|
+
audio: {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "Audio file path or base64 encoded audio",
|
|
22
|
+
},
|
|
23
|
+
language: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Language code (e.g., 'es', 'en'). Auto-detect if not specified.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ["audio"],
|
|
29
|
+
},
|
|
30
|
+
execute: async (params: Record<string, unknown>) => {
|
|
31
|
+
const audio = params.audio as string;
|
|
32
|
+
const language = (params.language as string) ?? "auto";
|
|
33
|
+
|
|
34
|
+
log.info(`Transcribing audio: ${audio.substring(0, 50)}...`);
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
// Placeholder implementation - real transcription would call STT API
|
|
38
|
+
return {
|
|
39
|
+
ok: true,
|
|
40
|
+
transcription: "[Transcription requires STT provider configuration]",
|
|
41
|
+
language: language,
|
|
42
|
+
duration: 0,
|
|
43
|
+
confidence: 0,
|
|
44
|
+
};
|
|
45
|
+
} catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
error: `Failed to transcribe: ${(error as Error).message}`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// ─── voice_speak ─────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
export const voiceSpeakTool: Tool = {
|
|
57
|
+
name: "voice_speak",
|
|
58
|
+
description: "Convert text to synthesized speech output. Spanish: texto a voz, sintetizar, hablar, leer en voz alta",
|
|
59
|
+
parameters: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
text: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Text to convert to speech",
|
|
65
|
+
},
|
|
66
|
+
voice_id: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Voice ID to use (provider-specific)",
|
|
69
|
+
},
|
|
70
|
+
language: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Language code (e.g., 'es', 'en')",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
required: ["text"],
|
|
76
|
+
},
|
|
77
|
+
execute: async (params: Record<string, unknown>) => {
|
|
78
|
+
const text = params.text as string;
|
|
79
|
+
const voiceId = (params.voice_id as string) ?? "default";
|
|
80
|
+
const language = (params.language as string) ?? "es";
|
|
81
|
+
|
|
82
|
+
log.info(`Synthesizing speech: ${text.substring(0, 50)}...`);
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// Placeholder implementation - real TTS would call TTS API
|
|
86
|
+
return {
|
|
87
|
+
ok: true,
|
|
88
|
+
audio_url: "[TTS requires provider configuration]",
|
|
89
|
+
voice_id: voiceId,
|
|
90
|
+
language: language,
|
|
91
|
+
duration: 0,
|
|
92
|
+
};
|
|
93
|
+
} catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
ok: false,
|
|
96
|
+
error: `Failed to synthesize speech: ${(error as Error).message}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export function createTools(): Tool[] {
|
|
103
|
+
return [voiceTranscribeTool, voiceSpeakTool];
|
|
104
|
+
}
|