@johpaz/hive-sdk 0.1.6 → 0.3.0

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 (238) hide show
  1. package/CHANGELOG.md +441 -0
  2. package/README.md +21 -3
  3. package/package.json +27 -5
  4. package/packages/core/src/agent/acceptance-checks.ts +9 -9
  5. package/packages/core/src/agent/agent-catalog.ts +82 -25
  6. package/packages/core/src/agent/agent-loop.ts +115 -26
  7. package/packages/core/src/agent/capability-search.ts +2 -2
  8. package/packages/core/src/agent/catalog-selector.ts +4 -4
  9. package/packages/core/src/agent/compaction.ts +30 -10
  10. package/packages/core/src/agent/context-compiler.ts +63 -36
  11. package/packages/core/src/agent/conversation-store.ts +167 -9
  12. package/packages/core/src/agent/curator.ts +16 -7
  13. package/packages/core/src/agent/delegation-runtime.ts +5 -5
  14. package/packages/core/src/agent/goal-runner.ts +9 -9
  15. package/packages/core/src/agent/index.ts +1 -0
  16. package/packages/core/src/agent/llm-client.ts +98 -37
  17. package/packages/core/src/agent/llm-providers/anthropic.ts +4 -4
  18. package/packages/core/src/agent/llm-providers/deepseek.ts +1 -1
  19. package/packages/core/src/agent/llm-providers/gemini.ts +4 -4
  20. package/packages/core/src/agent/llm-providers/groq.ts +1 -1
  21. package/packages/core/src/agent/llm-providers/hiveagents.ts +3 -3
  22. package/packages/core/src/agent/llm-providers/interface.ts +2 -2
  23. package/packages/core/src/agent/llm-providers/kimi.ts +1 -1
  24. package/packages/core/src/agent/llm-providers/minimax.ts +1 -1
  25. package/packages/core/src/agent/llm-providers/mistral.ts +1 -1
  26. package/packages/core/src/agent/llm-providers/modelscope.ts +1 -1
  27. package/packages/core/src/agent/llm-providers/nvidia.ts +40 -1
  28. package/packages/core/src/agent/llm-providers/ollama.ts +4 -4
  29. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +47 -7
  30. package/packages/core/src/agent/llm-providers/openai.ts +1 -1
  31. package/packages/core/src/agent/llm-providers/opencode-go.ts +1 -1
  32. package/packages/core/src/agent/llm-providers/openrouter.ts +1 -1
  33. package/packages/core/src/agent/llm-providers/qwen.ts +1 -1
  34. package/packages/core/src/agent/llm-providers/z-ai.ts +1 -1
  35. package/packages/core/src/agent/mcp-result-normalizer.ts +192 -0
  36. package/packages/core/src/agent/playbook-selector.ts +22 -7
  37. package/packages/core/src/agent/prompt-builder.ts +5 -5
  38. package/packages/core/src/agent/proof-packet.ts +5 -5
  39. package/packages/core/src/agent/providers/index.ts +39 -4
  40. package/packages/core/src/agent/realtime-providers/gemini-live.ts +238 -0
  41. package/packages/core/src/agent/realtime-providers/index.ts +29 -0
  42. package/packages/core/src/agent/realtime-providers/interface.ts +108 -0
  43. package/packages/core/src/agent/reflector.ts +38 -15
  44. package/packages/core/src/agent/run-store.ts +8 -8
  45. package/packages/core/src/agent/service.ts +10 -10
  46. package/packages/core/src/agent/skill-selector.ts +6 -6
  47. package/packages/core/src/agent/thread-id.ts +71 -0
  48. package/packages/core/src/agent/thread-store.ts +293 -0
  49. package/packages/core/src/agent/tool-selector.ts +9 -5
  50. package/packages/core/src/agent/tracer.ts +5 -5
  51. package/packages/core/src/api/createAgent.ts +67 -2
  52. package/packages/core/src/artifacts/index.ts +15 -0
  53. package/packages/core/src/artifacts/store.ts +161 -5
  54. package/packages/core/src/canvas/emitter.ts +2 -2
  55. package/packages/core/src/canvas/index.ts +9 -0
  56. package/packages/core/src/channels/telegram.ts +1 -1
  57. package/packages/core/src/channels/webchat.ts +1 -1
  58. package/packages/core/src/config/loader.ts +14 -5
  59. package/packages/core/src/ethics/EthicsGuard.ts +7 -1
  60. package/packages/core/src/events/agent-bus.ts +3 -3
  61. package/packages/core/src/events/channel-narration.ts +3 -3
  62. package/packages/core/src/events/event-bus.ts +1 -1
  63. package/packages/core/src/events/index.ts +18 -0
  64. package/packages/core/src/events/narration.ts +3 -3
  65. package/packages/core/src/events/tool-narration.ts +4 -0
  66. package/packages/core/src/gateway/channel-notify.ts +103 -6
  67. package/packages/core/src/gateway/delegation-groups.ts +4 -4
  68. package/packages/core/src/gateway/durable-queue.ts +18 -6
  69. package/packages/core/src/gateway/index.ts +3 -0
  70. package/packages/core/src/gateway/job-store.ts +11 -5
  71. package/packages/core/src/gateway/notification-inbox.ts +2 -2
  72. package/packages/core/src/gateway/server.ts +2 -2
  73. package/packages/core/src/harness/executors.ts +493 -0
  74. package/packages/core/src/harness/index.ts +12 -2
  75. package/packages/core/src/hooks/index.ts +203 -0
  76. package/packages/core/src/images/index.ts +161 -0
  77. package/packages/core/src/index.ts +1 -0
  78. package/packages/core/src/mcp/MCPClient.ts +3 -3
  79. package/packages/core/src/mcp/hot-reload.ts +5 -5
  80. package/packages/core/src/mcp/tool-sync.ts +5 -5
  81. package/packages/core/src/mcp/transports/index.ts +2 -2
  82. package/packages/core/src/mcp/transports/sse.ts +1 -1
  83. package/packages/core/src/models/index.ts +36 -0
  84. package/packages/core/src/multimodal/index.ts +2 -2
  85. package/packages/core/src/multimodal/vision-service.ts +51 -19
  86. package/packages/core/src/plugins/loader.ts +4 -1
  87. package/packages/core/src/resilience/circuit-breaker.ts +16 -5
  88. package/packages/core/src/resilience/index.ts +13 -0
  89. package/packages/core/src/resilience/retry.ts +1 -1
  90. package/packages/core/src/scheduler/CronScheduler.ts +54 -27
  91. package/packages/core/src/scheduler/cron/expression.ts +165 -0
  92. package/packages/core/src/scheduler/cron/index.ts +10 -0
  93. package/packages/core/src/scheduler/cron/job.ts +339 -0
  94. package/packages/core/src/scheduler/cron/next-run.ts +121 -0
  95. package/packages/core/src/scheduler/cron/zoned-time.ts +138 -0
  96. package/packages/core/src/scheduler/index.ts +21 -3
  97. package/packages/core/src/scheduler/integration.ts +25 -14
  98. package/packages/core/src/scheduler/types.ts +3 -18
  99. package/packages/core/src/services/agents.ts +268 -0
  100. package/packages/core/src/services/cron.ts +257 -0
  101. package/packages/core/src/services/endpoints.ts +289 -0
  102. package/packages/core/src/services/ethics.ts +107 -0
  103. package/packages/core/src/services/images.ts +212 -0
  104. package/packages/core/src/services/index.ts +112 -0
  105. package/packages/core/src/services/mcp.ts +201 -0
  106. package/packages/core/src/services/memory.ts +133 -0
  107. package/packages/core/src/services/models.ts +179 -0
  108. package/packages/core/src/services/providers.ts +152 -0
  109. package/packages/core/src/services/setup.ts +222 -0
  110. package/packages/core/src/services/skills.ts +241 -0
  111. package/packages/core/src/services/swarms.ts +307 -0
  112. package/packages/core/src/services/tools.ts +106 -0
  113. package/packages/core/src/sessions/index.ts +268 -0
  114. package/packages/core/src/sessions/resolve.ts +108 -0
  115. package/packages/core/src/skills/SkillLoader.ts +8 -1
  116. package/packages/core/src/skills/bundled/artifacts/artifact_reader/SKILL.md +105 -0
  117. package/packages/core/src/skills/bundled/cron_manager/SKILL.md +21 -11
  118. package/packages/core/src/skills/bundled/images/image_editor/SKILL.md +120 -0
  119. package/packages/core/src/skills/bundled/web/browser_automate/SKILL.md +12 -3
  120. package/packages/core/src/skills/bundled/web/browser_scrape/SKILL.md +22 -7
  121. package/packages/core/src/skills/bundled-data.generated.ts +110 -12
  122. package/packages/core/src/storage/bootstrap.ts +107 -12
  123. package/packages/core/src/storage/causal-events.ts +1 -1
  124. package/packages/core/src/storage/collections.ts +138 -2
  125. package/packages/core/src/storage/crypto.ts +35 -4
  126. package/packages/core/src/storage/hive.ts +1 -1
  127. package/packages/core/src/storage/hivedb.ts +10 -1
  128. package/packages/core/src/storage/index.ts +2 -1
  129. package/packages/core/src/storage/onboarding.ts +61 -45
  130. package/packages/core/src/storage/reconcile.ts +11 -6
  131. package/packages/core/src/storage/seed.ts +191 -23
  132. package/packages/core/src/storage/usage.ts +3 -3
  133. package/packages/core/src/swarm/AgentExecutor.ts +2 -2
  134. package/packages/core/src/swarm/Coordinator.ts +8 -8
  135. package/packages/core/src/swarm/EventBridge.ts +2 -2
  136. package/packages/core/src/swarm/RoleSwarm.ts +234 -0
  137. package/packages/core/src/swarm/TaskGraph.ts +2 -2
  138. package/packages/core/src/swarm/index.ts +7 -0
  139. package/packages/core/src/swarm/presets/HiveLearnPreset.ts +2 -2
  140. package/packages/core/src/swarm/presets/ResearchPreset.ts +2 -2
  141. package/packages/core/src/swarm/strategies/ParallelStrategy.ts +1 -1
  142. package/packages/core/src/swarm/strategies/PriorityStrategy.ts +3 -3
  143. package/packages/core/src/swarm/types.ts +3 -18
  144. package/packages/core/src/tool-runtime/embedded-worker.generated.ts +21 -0
  145. package/packages/core/src/tool-runtime/index.ts +129 -14
  146. package/packages/core/src/tools/ToolExecutor.ts +7 -3
  147. package/packages/core/src/tools/agents/index.ts +18 -60
  148. package/packages/core/src/tools/cli/index.ts +55 -0
  149. package/packages/core/src/tools/core/index.ts +52 -4
  150. package/packages/core/src/tools/cron/index.ts +8 -8
  151. package/packages/core/src/tools/images/index.ts +130 -0
  152. package/packages/core/src/tools/index.ts +14 -1
  153. package/packages/core/src/tools/office/office-escribir-xlsx.ts +2 -1
  154. package/packages/core/src/tools/office/office-leer-xlsx.ts +2 -1
  155. package/packages/core/src/tools/office/xlsx-loader.ts +19 -0
  156. package/packages/core/src/tools/web/artifact-inspect.ts +2 -2
  157. package/packages/core/src/tools/web/artifact-read.ts +162 -0
  158. package/packages/core/src/tools/web/browser-backend.ts +141 -44
  159. package/packages/core/src/tools/web/browser-click.ts +2 -2
  160. package/packages/core/src/tools/web/browser-extract.ts +2 -2
  161. package/packages/core/src/tools/web/browser-navigate.ts +2 -2
  162. package/packages/core/src/tools/web/browser-screenshot.ts +12 -5
  163. package/packages/core/src/tools/web/browser-script.ts +2 -2
  164. package/packages/core/src/tools/web/browser-service.ts +63 -384
  165. package/packages/core/src/tools/web/browser-session.ts +125 -0
  166. package/packages/core/src/tools/web/browser-type.ts +2 -2
  167. package/packages/core/src/tools/web/browser-wait.ts +2 -2
  168. package/packages/core/src/tools/web/computer-use.ts +553 -0
  169. package/packages/core/src/tools/web/index.ts +8 -1
  170. package/packages/core/src/tools/web/webview-backend.ts +460 -21
  171. package/packages/core/src/utils/index.ts +1 -0
  172. package/packages/core/src/utils/logger.ts +12 -4
  173. package/packages/core/src/utils/redact-binary.ts +17 -0
  174. package/packages/core/src/utils/toon.ts +1 -1
  175. package/packages/core/src/voice/index.ts +6 -6
  176. package/bun.lock +0 -859
  177. package/bunfig.toml +0 -9
  178. package/docs/API-AGENTS.md +0 -367
  179. package/docs/API-CONTEXT-COMPILER.md +0 -249
  180. package/docs/API-DAG-SCHEDULER.md +0 -273
  181. package/docs/API-TOOLS-SKILLS-CHANNELS.md +0 -446
  182. package/docs/API-WORKERS-EVENTS.md +0 -299
  183. package/docs/HIVE-HARNESS.md +0 -113
  184. package/docs/INDEX.md +0 -190
  185. package/docs/TEMPLATE-HIVE-APP.md +0 -360
  186. package/packages/cli/package.json +0 -17
  187. package/packages/cli/src/commands/create-app.test.ts +0 -180
  188. package/packages/core/package.json +0 -70
  189. package/packages/core/src/api/createAgent.test.ts +0 -160
  190. package/packages/core/src/canvas/canvas.test.ts +0 -36
  191. package/packages/core/src/channels/channels.test.ts +0 -18
  192. package/packages/core/src/ethics/EthicsGuard.test.ts +0 -108
  193. package/packages/core/src/gateway/gateway.test.ts +0 -38
  194. package/packages/core/src/memory/Scratchpad.test.ts +0 -68
  195. package/packages/core/src/scheduler/scheduler.test.ts +0 -15
  196. package/packages/core/src/skills/skills.test.ts +0 -62
  197. package/packages/core/src/swarm/swarm.test.ts +0 -24
  198. package/packages/core/src/tool-runtime/tool-runtime.test.ts +0 -99
  199. package/packages/core/src/tools/ToolRegistry.test.ts +0 -98
  200. package/packages/core/src/tools/api/api-request.test.ts +0 -164
  201. package/packages/core/src/tools/web/browser-service.test.ts +0 -83
  202. package/packages/core/src/workers/workers.test.ts +0 -41
  203. package/scripts/bump-version.ts +0 -248
  204. package/scripts/generate-skill-bundle.ts +0 -108
  205. package/test/acceptance-checks.test.ts +0 -403
  206. package/test/agent-loop-terminal-synthesis.test.ts +0 -32
  207. package/test/browser-backend.test.ts +0 -308
  208. package/test/catalog-agents-stay-enabled.test.ts +0 -117
  209. package/test/causal-events.test.ts +0 -117
  210. package/test/compaction.test.ts +0 -105
  211. package/test/context-compiler.test.ts +0 -269
  212. package/test/curator.test.ts +0 -130
  213. package/test/durable-queue.test.ts +0 -114
  214. package/test/harness-barrel.test.ts +0 -64
  215. package/test/hive-helpers.test.ts +0 -130
  216. package/test/hivedb-search.test.ts +0 -189
  217. package/test/internal-turns.test.ts +0 -166
  218. package/test/job-idempotency.test.ts +0 -68
  219. package/test/job-retry-backoff.test.ts +0 -184
  220. package/test/job-store.test.ts +0 -381
  221. package/test/llm-retry.test.ts +0 -97
  222. package/test/memory-perf.test.ts +0 -774
  223. package/test/minimal-loadout.test.ts +0 -78
  224. package/test/model-catalog.test.ts +0 -105
  225. package/test/preload.ts +0 -12
  226. package/test/reflector.test.ts +0 -320
  227. package/test/retention-cap.test.ts +0 -91
  228. package/test/retired-capabilities-pruned.test.ts +0 -192
  229. package/test/run-store.test.ts +0 -355
  230. package/test/scratchpad.test.ts +0 -74
  231. package/test/secrets-durability.test.ts +0 -119
  232. package/test/seed-model-reseed.test.ts +0 -155
  233. package/test/setup-agent-seed.test.ts +0 -264
  234. package/test/tool-inventory.test.ts +0 -65
  235. package/test/tool-runtime.test.ts +0 -258
  236. package/test/tool-selector-runtime-tools.test.ts +0 -117
  237. package/test/toon.test.ts +0 -429
  238. package/tsconfig.json +0 -42
@@ -2,8 +2,8 @@ import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto"
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
3
3
  import * as path from "node:path"
4
4
  import { getHiveDir } from "../config/loader.ts"
5
- import { logger } from "../utils/logger"
6
- import { col } from "./hive"
5
+ import { logger } from "../utils/logger.ts"
6
+ import { col } from "./hive.ts"
7
7
 
8
8
  const log = logger.child("crypto")
9
9
  const SERVICE = "hive"
@@ -29,6 +29,22 @@ interface SecretDoc {
29
29
  const _mem = new Map<string, string>()
30
30
  let _keychainOk: boolean | null = null // null = untested
31
31
 
32
+ let _keychainApi: unknown = undefined
33
+
34
+ /**
35
+ * A test double or a recovered runtime may replace Bun.secrets. Reset the
36
+ * cached availability result when that API object changes so a previous
37
+ * headless failure cannot poison the replacement backend forever.
38
+ */
39
+ function _getKeychainApi(): any {
40
+ const api = (Bun as any).secrets
41
+ if (api !== _keychainApi) {
42
+ _keychainApi = api
43
+ _keychainOk = null
44
+ }
45
+ return api
46
+ }
47
+
32
48
  async function _get(name: string): Promise<string | null> {
33
49
  const cached = _mem.get(name)
34
50
  if (cached !== undefined) return cached
@@ -79,10 +95,24 @@ async function _readCollectionSecret(name: string): Promise<string | null> {
79
95
  }
80
96
  }
81
97
 
98
+ /**
99
+ * Olvida si el keychain del SO respondió o no.
100
+ *
101
+ * Sustituir `Bun.secrets` por un doble ya NO necesita esto: `_getKeychainApi()`
102
+ * detecta que el objeto cambió e invalida el sondeo solo. Queda para el caso
103
+ * que aquello no cubre —vaciar además el caché en memoria (`_mem`)— y porque
104
+ * ya salió publicado.
105
+ */
106
+ export function resetKeychainProbe(): void {
107
+ _keychainOk = null
108
+ _mem.clear()
109
+ }
110
+
82
111
  async function _keychainGet(name: string): Promise<string | null> {
112
+ const keychain = _getKeychainApi()
83
113
  if (_keychainOk === false) return null
84
114
  try {
85
- const val = await (Bun as any).secrets.get({ service: SERVICE, name })
115
+ const val = await keychain.get({ service: SERVICE, name })
86
116
  _keychainOk = true
87
117
  return val ?? null
88
118
  } catch {
@@ -92,9 +122,10 @@ async function _keychainGet(name: string): Promise<string | null> {
92
122
  }
93
123
 
94
124
  async function _keychainSet(name: string, value: string): Promise<boolean> {
125
+ const keychain = _getKeychainApi()
95
126
  if (_keychainOk === false) return false
96
127
  try {
97
- await (Bun as any).secrets.set({ service: SERVICE, name, value })
128
+ await keychain.set({ service: SERVICE, name, value })
98
129
  _keychainOk = true
99
130
  return true
100
131
  } catch {
@@ -7,7 +7,7 @@
7
7
  * SUM/AVG/GROUP BY (`bumpRollup`).
8
8
  */
9
9
 
10
- import { getHiveDb } from "./hivedb";
10
+ import { getHiveDb } from "./hivedb.ts";
11
11
 
12
12
  const MAX_RETRIES = 5;
13
13
 
@@ -15,7 +15,7 @@
15
15
  import path from "node:path";
16
16
  import { HiveDB } from "@johpaz/hive-db";
17
17
  import { getHiveDir } from "../config/loader.ts";
18
- import { logger } from "../utils/logger";
18
+ import { logger } from "../utils/logger.ts";
19
19
 
20
20
  const log = logger.child("hivedb");
21
21
 
@@ -48,6 +48,15 @@ export async function getHiveDb(): Promise<HiveDB> {
48
48
  return opening;
49
49
  }
50
50
 
51
+ /**
52
+ * Return the currently open database without opening one.
53
+ * Used by lifecycle-aware consumers that need to invalidate state after a
54
+ * close/reopen cycle.
55
+ */
56
+ export function getOpenHiveDb(): HiveDB | null {
57
+ return db;
58
+ }
59
+
51
60
  export function closeHiveDb(): void {
52
61
  if (db) {
53
62
  try {
@@ -34,7 +34,7 @@ export type * from "./collections.ts";
34
34
  export { catalogModelKey, wireModelId, isResellerProvider } from "./model-id.ts";
35
35
 
36
36
  // ─── Seed del catálogo ───────────────────────────────────────────────────────
37
- export type { SeedData } from "./seed.ts";
37
+ export type { SeedData, SeedOptions, SpecialistSeedMode } from "./seed.ts";
38
38
  export {
39
39
  SEED_DATA,
40
40
  seedAllData,
@@ -88,6 +88,7 @@ export {
88
88
 
89
89
  // ─── Onboarding e identidad ──────────────────────────────────────────────────
90
90
  export type { OnboardingSection } from "./onboarding.ts";
91
+ export { activateBrowserTools } from "./onboarding.ts";
91
92
  export {
92
93
  resolveUserId,
93
94
  resolveAgentId,
@@ -1,19 +1,19 @@
1
1
  import { logger } from "../utils/logger.ts";
2
- import { ensureHiveDb } from "./bootstrap";
3
- import { col, toIndexable, fromIndexable } from "./hive";
2
+ import { ensureHiveDb } from "./bootstrap.ts";
3
+ import { col, toIndexable, fromIndexable } from "./hive.ts";
4
4
  import {
5
5
  storeProviderApiKey,
6
6
  storeChannelConfig,
7
7
  storeMcpEnv,
8
8
  loadProviderApiKey,
9
9
  loadChannelConfig,
10
- } from "./crypto";
10
+ } from "./crypto.ts";
11
11
  import { SkillLoader } from "../skills/index.ts";
12
12
  import type {
13
13
  UserDoc, ProviderDoc, ModelDoc, AgentDoc, ChannelDoc, McpServerDoc,
14
14
  UserIdentityDoc, OnboardingProgressDoc, EthicsDoc, SkillDoc, ToolDoc,
15
15
  } from "./collections";
16
- import { normalizeUserEmail } from "./user-email";
16
+ import { normalizeUserEmail } from "./user-email.ts";
17
17
 
18
18
  export interface OnboardingSection {
19
19
  step: "user" | "skills" | "ethics" | "tools" | "provider" | "model" | "channel" | "mcp" | "agent" | "complete";
@@ -27,101 +27,117 @@ const log = logger.child("onboarding");
27
27
  const HIVE_SYSTEM_PROMPT = `
28
28
  # HIVE — Agente Coordinador
29
29
 
30
- Sos Bee, coordinador de Hive. Sos el único agente que conversa con el usuario, y no trabajás solo: dirigís una colmena de workers especializados que corren en paralelo.
30
+ Eres el coordinador de Hive. Eres el único agente que conversa con el usuario, y no trabajas solo: diriges una colmena de workers especializados que corren en paralelo.
31
31
 
32
- **Tu oficio es repartir trabajo, no hacerlo todo vos.** Ante cada pedido buscás primero quién puede resolverlo; solo lo hacés con tus propias manos cuando no hay nadie que lo cubra.
32
+ **Tu oficio es repartir trabajo, no hacerlo todo tú.** Ante cada pedido buscas primero quién puede resolverlo; solo lo haces con tus propias manos cuando no hay nadie que lo cubra.
33
33
 
34
34
  ## 1. ANTES DE ACTUAR
35
35
 
36
- Leé el pedido completo y mirá lo que ya sabés: la sección SCRATCHPAD trae tus notas de esta conversación y \`memory_read\` / \`memory_search\` lo guardado en conversaciones anteriores. No rehagas trabajo ya hecho ni vuelvas a preguntar algo que ya te dijeron.
36
+ Lee el pedido completo y mira lo que ya sabes: la sección SCRATCHPAD trae tus notas de esta conversación y \`memory_read\` / \`memory_search\` lo guardado en conversaciones anteriores. No rehagas trabajo ya hecho ni vuelvas a preguntar algo que ya te dijeron.
37
37
 
38
- **Si es un saludo, una charla o una pregunta que respondés de memoria: respondé y terminá.** Eso no se delega nunca ni necesita herramientas.
38
+ **Si es un saludo, una charla o una pregunta que respondes de memoria: responde y termina.** Eso no se delega nunca ni necesita herramientas.
39
39
 
40
- ## 2. DESCOMPONER
40
+ ## 2. MAPA RÁPIDO DE ESPECIALISTAS
41
41
 
42
- Separá el pedido en partes y clasificá cada una:
42
+ Para cualquier pedido operativo, compáralo primero con este mapa y delega al especialista más cercano:
43
43
 
44
- | Tipo de parte | Qué hacés |
44
+ - \`web_researcher\`: investiga información actual en la web y entrega fuentes.
45
+ - \`browser_operator\`: navega sitios, completa formularios y verifica el resultado.
46
+ - \`workspace_file_operator\`: crea, lee, edita y organiza archivos del workspace.
47
+ - \`software_engineer\`: implementa, depura y prueba software en un repositorio.
48
+ - \`office_document_agent\`: lee y genera PDF, Word, Excel y PowerPoint.
49
+ - \`a2ui_builder\`: construye formularios, dashboards y flujos interactivos A2UI.
50
+ - \`schedule_automation_agent\`: crea y administra jobs, recordatorios y automatizaciones de Hive.
51
+ - \`api_operator\`: ejecuta y verifica operaciones contra APIs REST autorizadas.
52
+ - Especialistas MCP del usuario: workers con integraciones específicas; encuéntralos con \`agent_find\` antes de usar una tool MCP.
53
+
54
+ **Regla de prioridad:** primero elige un agente de este mapa y usa \`task_delegate\`, pero verifica antes que aparezca activo en la COLMENA; el mapa describe roles y no garantiza disponibilidad. Si no está activo o ninguno encaja, busca otro worker con \`agent_find\`; solo después descubre herramientas y resuelve directamente. No delegues a un ID asumido ni elijas herramientas directas antes de hacer esta comprobación, salvo saludos, charla o preguntas que respondes de memoria.
55
+
56
+ ## 3. DESCOMPONER
57
+
58
+ Separa el pedido en partes y clasifica cada una:
59
+
60
+ | Tipo de parte | Qué haces |
45
61
  |---|---|
46
62
  | Independientes entre sí | Van juntas, en paralelo, en este mismo turno |
47
63
  | Una necesita el resultado de otra | Va en una fase posterior |
48
- | Trivial o conversacional | La resolvés vos, sin herramientas |
64
+ | Trivial o conversacional | La resuelves tú, sin herramientas |
49
65
 
50
- ## 3. POR CADA PARTE: ¿HAY UN AGENTE QUE LA HAGA?
66
+ ## 4. POR CADA PARTE: ¿HAY UN AGENTE QUE LA HAGA?
51
67
 
52
68
  **Esta es la pregunta central de tu rol, y contestarla es gratis:** el roster está en la sección COLMENA DE AGENTES de este mismo prompt, no hace falta ninguna llamada para consultarlo.
53
69
 
54
70
  1. **¿Encaja un agente de la colmena?** → \`task_delegate\`. Este es el camino por defecto.
55
71
  2. **¿Ninguno encaja?** → \`agent_find\` por si existe un worker propio para esa especialidad.
56
- 3. **¿Tampoco hay?** → recién ahí \`search_knowledge\` para encontrar las herramientas. Preferí siempre herramientas nativas sobre MCP.
57
- 4. **Si encontraste una tool nativa** → resolvelo vos directamente.
72
+ 3. **¿Tampoco hay?** → recién ahí \`search_knowledge\` para encontrar las herramientas. Prefiere siempre herramientas nativas sobre MCP.
73
+ 4. **Si encontraste una tool nativa** → resuélvelo directamente.
58
74
  5. **Si al menos una parte requiere MCP**:
59
- - Agrupá las tools por \`server_id\` y usá \`agent_find\` para buscar un especialista del usuario que ya tenga ese servidor.
60
- - Si existe y está habilitado, delegale la parte correspondiente. No preguntes ni crees otro.
61
- - Si no existe, **antes de ejecutar cualquier tool de ese servidor**, preguntale al usuario si quiere crear un agente persistente para esa integración.
62
- - Si acepta: usá \`get_available_models\`, descubrí \`agent_create\`, creá un worker con \`mcp_server_id\` y delegale la tarea actual. El agente recibe todas las tools actuales y futuras de ese servidor.
63
- - Si rechaza: ejecutá vos directamente las tools MCP necesarias solo para esta solicitud.
64
- - Si intervienen varios servidores sin especialista, tratá cada servidor por separado: un agente por servidor, nunca uno combinado.
75
+ - Agrupa las tools por \`server_id\` y usa \`agent_find\` para buscar un especialista del usuario que ya tenga ese servidor.
76
+ - Si existe y está habilitado, delégale la parte correspondiente. No preguntes ni crees otro.
77
+ - Si no existe, **antes de ejecutar cualquier tool de ese servidor**, pregúntale al usuario si quiere crear un agente persistente para esa integración.
78
+ - Si acepta: usa \`get_available_models\`, descubre \`agent_create\`, crea un worker con \`mcp_server_id\` y delégale la tarea actual. El agente recibe todas las tools actuales y futuras de ese servidor.
79
+ - Si rechaza: ejecuta directamente las tools MCP necesarias solo para esta solicitud.
80
+ - Si intervienen varios servidores sin especialista, trata cada servidor por separado: un agente por servidor, nunca uno combinado.
65
81
 
66
82
  ### CALENDARIO NO ES CRON
67
83
 
68
84
  - \`schedule_automation_agent\` administra jobs que Hive ejecutará después: tareas recurrentes, reportes automáticos, monitoreos y recordatorios de una sola ejecución.
69
85
  - Crear, consultar o modificar eventos, citas o reuniones; invitar asistentes; o revisar disponibilidad pertenece al servidor de calendario y a su especialista MCP.
70
- - Una frase como “agenda una reunión” significa calendario, no \`cron.create\`. Solo usá cron cuando el usuario quiere que Hive ejecute una instrucción en el futuro.
86
+ - Una frase como “agenda una reunión” significa calendario, no \`cron.create\`. Solo usa cron cuando el usuario quiere que Hive ejecute una instrucción en el futuro.
71
87
 
72
- Si \`search_knowledge\` no devuelve nada y el pedido es corto o ambiguo, **preguntale al usuario** en vez de adivinar y encadenar más búsquedas. Una pregunta cuesta un turno; adivinar mal cuesta varios.
88
+ Si \`search_knowledge\` no devuelve nada y el pedido es corto o ambiguo, **pregúntale al usuario** en vez de adivinar y encadenar más búsquedas. Una pregunta cuesta un turno; adivinar mal cuesta varios.
73
89
 
74
- ## 4. DELEGAR EN PARALELO
90
+ ## 5. DELEGAR EN PARALELO
75
91
 
76
92
  Las partes independientes se lanzan **todas en el mismo turno**: una \`task_delegate\` por parte, con \`mode="async"\`. Hive las agrupa por turno y los workers corren simultáneamente.
77
93
 
78
94
  Si el usuario pide tres cosas que no dependen entre sí, son tres \`task_delegate\` en la misma respuesta — no una, esperar, y después la siguiente. **Paralelizar es el caso normal, no la excepción.**
79
95
 
80
- Cada delegación lleva: \`worker_id\`, una subtarea acotada, contexto mínimo y \`acceptance\` verificable. Antes de delegar, si el worker va a necesitar herramientas puntuales, buscalas con \`search_knowledge\` e incluilas en la instrucción. Reservá \`mode="sync"\` solo para un lookup cuyo resultado esperás en segundos.
96
+ Cada delegación lleva: \`worker_id\`, una subtarea acotada, contexto mínimo y \`acceptance\` verificable. Antes de delegar, si el worker va a necesitar herramientas puntuales, búscalas con \`search_knowledge\` e inclúyelas en la instrucción. Reserva \`mode="sync"\` solo para un lookup cuyo resultado esperas en segundos.
81
97
 
82
- Si más adelante una entrega no cumple sus criterios, \`task_revise\` reencola al mismo worker sobre el mismo hilo (ver sección 6) — no crees una delegación nueva para corregir algo ya delegado.
98
+ Si más adelante una entrega no cumple sus criterios, \`task_revise\` reencola al mismo worker sobre el mismo hilo (ver sección 7) — no crees una delegación nueva para corregir algo ya delegado.
83
99
 
84
- ## 5. ESPERAR: NO ESPERÁS
100
+ ## 6. ESPERAR: NO ESPERAS
85
101
 
86
- Después de delegar, contale al usuario en una línea qué pusiste a correr y **terminá tu turno**.
102
+ Después de delegar, cuéntale al usuario en una línea qué pusiste a correr y **termina tu turno**.
87
103
 
88
104
  Cuando todas las tareas del turno alcanzan estado terminal, Hive te reinvoca automáticamente con un mensaje \`[Sistema]\` que trae el resultado de cada una.
89
105
 
90
- - **No hagas polling** con \`task_status\` en loop. Usalo solo si el usuario pide el estado antes de tiempo.
91
- - No anuncies resultados que todavía no tenés ni declares éxito antes del \`[Sistema]\`.
106
+ - **No hagas polling** con \`task_status\` en loop. Úsalo solo si el usuario pide el estado antes de tiempo.
107
+ - No anuncies resultados que todavía no tienes ni declares éxito antes del \`[Sistema]\`.
92
108
  - No re-delegues una tarea porque "no contestó": ya está encolada.
93
109
 
94
- ## 6. CERRAR
110
+ ## 7. CERRAR
95
111
 
96
112
  Al recibir el \`[Sistema]\`, cada entrega trae sus \`acceptance\` (criterios) y sus \`checks\` (resultado determinístico, sin LLM, ya calculado):
97
113
 
98
- - \`checks.status="passed"\` → un check automático ya lo confirmó. Aceptalo.
114
+ - \`checks.status="passed"\` → un check automático ya lo confirmó. Acéptalo.
99
115
  - \`checks.status="failed"\` (implica \`ok=false\`) → no cumplió. Nunca lo reportes como éxito.
100
- - \`checks.status="unchecked"\` o ausente → no hay check automático para ese criterio: **vos sos quien juzga**, con el contenido y la evidencia que trae la entrega.
116
+ - \`checks.status="unchecked"\` o ausente → no hay check automático para ese criterio: ** eres quien juzga**, con el contenido y la evidencia que trae la entrega.
101
117
 
102
- Si una entrega no cumple sus criterios: usá \`task_revise\` con el \`task_id\` y un feedback concreto y accionable — el worker retoma con su contexto, no hace falta repetirle todo el pedido. Si el problema es trivial y tenés las tools, corregilo vos directamente en vez de re-delegar. No inventes trabajo ni evidencia.
118
+ Si una entrega no cumple sus criterios: usa \`task_revise\` con el \`task_id\` y un feedback concreto y accionable — el worker retoma con su contexto, no hace falta repetirle todo el pedido. Si el problema es trivial y tienes las tools, corrígelo directamente en vez de re-delegar. No inventes trabajo ni evidencia.
103
119
 
104
- Cuando todo lo delegado en esta ronda cumple, escribí **una sola** respuesta final integrando todo. Las entradas con \`ok=false\` se reportan con su motivo real, nunca como éxito.
120
+ Cuando todo lo delegado en esta ronda cumple, escribe **una sola** respuesta final integrando todo. Las entradas con \`ok=false\` se reportan con su motivo real, nunca como éxito.
105
121
 
106
- Guardá lo que vaya a servir después: \`save_note\` para esta conversación, \`memory_write\` para lo que deba sobrevivir a ella. Confirmá con el usuario antes de persistir datos suyos.
122
+ Guarda lo que vaya a servir después: \`save_note\` para esta conversación, \`memory_write\` para lo que deba sobrevivir a ella. Confirma con el usuario antes de persistir datos suyos.
107
123
 
108
124
  ## REGLAS PERMANENTES
109
125
 
110
- 1. **Ética primero** — Operás bajo un Código de Ética obligatorio que no podés ignorar.
111
- 2. **Verdad de ejecución** — \`TaskDoc\`/\`JobDoc\` son la fuente de verdad. \`agent_find\` solo descubre workers; nunca prueba si algo está corriendo: para eso están \`task_list\` y \`task_status\`. Si \`task_delegate\` devuelve \`ok=true\` con \`task_id\`, \`job_id\` y \`run_id\`, la tarea se persistió de verdad y no es una simulación. Si una herramienta falla, reportá su resultado exacto: no inventes IDs, estados ni ejecuciones.
112
- 3. **Vos aceptás las entregas** — cada entrega vuelve con sus criterios, su evidencia y el resultado de los checks determinísticos (ver sección 6). Si cumple, la integrás; si no, \`task_revise\` con feedback concreto, o la corregís vos si es trivial. Si un worker devuelve \`needs_input\`, vos formulás la pregunta al usuario con contexto.
113
- 4. **Buscá antes de crear** — nunca crees un worker si el catálogo ya cubre la tarea.
126
+ 1. **Ética primero** — Operas bajo un Código de Ética obligatorio que no puedes ignorar.
127
+ 2. **Verdad de ejecución** — \`TaskDoc\`/\`JobDoc\` son la fuente de verdad. \`agent_find\` solo descubre workers; nunca prueba si algo está corriendo: para eso están \`task_list\` y \`task_status\`. Si \`task_delegate\` devuelve \`ok=true\` con \`task_id\`, \`job_id\` y \`run_id\`, la tarea se persistió de verdad y no es una simulación. Si una herramienta falla, reporta su resultado exacto: no inventes IDs, estados ni ejecuciones.
128
+ 3. ** aceptas las entregas** — cada entrega vuelve con sus criterios, su evidencia y el resultado de los checks determinísticos (ver sección 7). Si cumple, la integras; si no, \`task_revise\` con feedback concreto, o la corriges si es trivial. Si un worker devuelve \`needs_input\`, formulas la pregunta al usuario con contexto.
129
+ 4. **Busca antes de crear** — nunca crees un worker si el catálogo ya cubre la tarea.
114
130
  5. **Mínimo privilegio** — solo las herramientas necesarias a cada worker. La única excepción explícita es un especialista MCP aprobado por el usuario: recibe el servidor completo que figura en \`mcp_server_ids_json\`, nunca otros servidores.
115
- 6. **Nunca \`cli_exec\` para cron** — usá \`cron.create\`, y preguntá al usuario cada cuánto ejecutar.
131
+ 6. **Nunca \`cli_exec\` para cron** — usa \`cron.create\`, y pregunta al usuario cada cuánto ejecutar.
116
132
  7. **Calendario ≠ cron** — los eventos y reuniones van al especialista MCP de calendario; cron solo programa futuras ejecuciones de Hive.
117
133
 
118
134
  ## QUÉ HAY EN TU CONTEXTO
119
135
 
120
- - **COLMENA DE AGENTES** — los workers disponibles ahora mismo. Consultalo antes de decidir nada.
121
- - **HERRAMIENTAS SIEMPRE DISPONIBLES** — con las que arrancás cada turno. El resto se descubre con \`search_knowledge\` y queda usable de inmediato.
136
+ - **COLMENA DE AGENTES** — los workers disponibles ahora mismo. Consúltalo antes de decidir nada.
137
+ - **HERRAMIENTAS SIEMPRE DISPONIBLES** — con las que arrancas cada turno. El resto se descubre con \`search_knowledge\` y queda usable de inmediato.
122
138
  - **SCRATCHPAD** — tus notas de esta conversación; sobreviven a la compresión del historial.
123
- - **PLAYBOOK APRENDIDO** — reglas aprendidas de turnos anteriores, ya filtradas por relevancia. Aplicalas.
124
- - **SKILLS DESCUBIERTAS** — nombres de skills que el sistema considera relevantes para este pedido. Son una pista, no instrucciones: su contenido llega cuando descubrís sus herramientas con \`search_knowledge\`.
139
+ - **PLAYBOOK APRENDIDO** — reglas aprendidas de turnos anteriores, ya filtradas por relevancia. Aplícalas.
140
+ - **SKILLS DESCUBIERTAS** — nombres de skills que el sistema considera relevantes para este pedido. Son una pista, no instrucciones: su contenido llega cuando descubres sus herramientas con \`search_knowledge\`.
125
141
 
126
142
  ## CANALES
127
143
 
@@ -12,12 +12,12 @@
12
12
  * durable queue are activated.
13
13
  */
14
14
 
15
- import { col, updateDoc } from "./hive";
16
- import type { TaskRunDoc, MeetingSessionDoc, AgentRunDoc, JobDoc, TaskDoc } from "./collections";
17
- import { logger } from "../utils/logger";
15
+ import { col, updateDoc } from "./hive.ts";
16
+ import type { TaskRunDoc, MeetingSessionDoc, AgentRunDoc, JobDoc, TaskDoc } from "./collections.ts";
17
+ import { logger } from "../utils/logger.ts";
18
18
  import { reclaimOrInterrupt } from "../gateway/job-store.ts";
19
- import { interruptRun } from "../agent/run-store";
20
- import { sendToUserChannel } from "../gateway/channel-notify";
19
+ import { interruptRun } from "../agent/run-store.ts";
20
+ import { sendToUserChannel } from "../gateway/channel-notify.ts";
21
21
 
22
22
  const log = logger.child("reconcile");
23
23
 
@@ -100,7 +100,12 @@ export async function reconcileOnBoot(bootId: string): Promise<ReconcileResult>
100
100
  result.runsInterrupted++;
101
101
  try {
102
102
  if (run.channel && run.user_id) {
103
- await sendToUserChannel(run.channel, run.user_id, "Se interrumpió un turno en progreso por un reinicio del proceso.");
103
+ await sendToUserChannel(
104
+ run.channel,
105
+ run.user_id,
106
+ "Se interrumpió un turno en progreso por un reinicio del proceso.",
107
+ { threadId: run.thread_id }
108
+ );
104
109
  }
105
110
  } catch {
106
111
  // non-critical