@johpaz/hive-sdk 0.1.3 → 0.1.5

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 (272) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/README.md +78 -23
  3. package/bunfig.toml +4 -2
  4. package/docs/API-AGENTS.md +78 -27
  5. package/docs/API-CONTEXT-COMPILER.md +31 -34
  6. package/docs/API-TOOLS-SKILLS-CHANNELS.md +58 -22
  7. package/docs/HIVE-HARNESS.md +1 -1
  8. package/docs/INDEX.md +4 -4
  9. package/docs/TEMPLATE-HIVE-APP.md +10 -10
  10. package/package.json +9 -4
  11. package/packages/cli/package.json +2 -2
  12. package/packages/cli/src/commands/create-app.test.ts +36 -7
  13. package/packages/cli/src/commands/init.ts +3 -3
  14. package/packages/cli/src/commands/run.ts +1 -1
  15. package/packages/cli/src/commands/test.ts +37 -25
  16. package/packages/cli/src/commands/trace.ts +30 -28
  17. package/packages/cli/templates/hive-app/.env.example +10 -2
  18. package/packages/cli/templates/hive-app/README.md +103 -0
  19. package/packages/cli/templates/hive-app/hive.config.ts +9 -3
  20. package/packages/cli/templates/hive-app/src/agents/coordinator.ts +8 -1
  21. package/packages/cli/templates/hive-app/src/main.ts +12 -19
  22. package/packages/core/package.json +5 -4
  23. package/packages/core/src/agent/acceptance-checks.ts +166 -0
  24. package/packages/core/src/agent/agent-catalog.ts +348 -0
  25. package/packages/core/src/agent/agent-loop.ts +1373 -0
  26. package/packages/core/src/agent/capability-search.ts +186 -0
  27. package/packages/core/src/agent/catalog-selector.ts +103 -0
  28. package/packages/core/src/agent/{Compaction.ts → compaction.ts} +86 -63
  29. package/packages/core/src/agent/context-compiler.ts +689 -0
  30. package/packages/core/src/agent/conversation-store.ts +381 -0
  31. package/packages/core/src/agent/curator.ts +276 -0
  32. package/packages/core/src/agent/delegation-runtime.ts +241 -0
  33. package/packages/core/src/agent/goal-runner.ts +323 -0
  34. package/packages/core/src/agent/index.ts +17 -12
  35. package/packages/core/src/agent/llm-client.ts +266 -0
  36. package/packages/core/src/agent/llm-providers/anthropic.ts +264 -0
  37. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  38. package/packages/core/src/agent/{providers → llm-providers}/gemini.ts +98 -60
  39. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  40. package/packages/core/src/agent/llm-providers/hiveagents.ts +253 -0
  41. package/packages/core/src/agent/{providers → llm-providers}/interface.ts +73 -13
  42. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  43. package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
  44. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  45. package/packages/core/src/agent/llm-providers/modelscope.ts +5 -0
  46. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  47. package/packages/core/src/agent/{providers → llm-providers}/ollama.ts +31 -5
  48. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +418 -0
  49. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  50. package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
  51. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  52. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  53. package/packages/core/src/agent/llm-providers/z-ai.ts +5 -0
  54. package/packages/core/src/agent/minimal-loadout.ts +47 -0
  55. package/packages/core/src/agent/playbook-selector.ts +119 -0
  56. package/packages/core/src/agent/{PromptBuilder.ts → prompt-builder.ts} +21 -22
  57. package/packages/core/src/{harness → agent}/proof-packet.ts +16 -21
  58. package/packages/core/src/agent/providers/index.ts +35 -16
  59. package/packages/core/src/agent/reflector.ts +320 -0
  60. package/packages/core/src/agent/routing-intent.ts +22 -0
  61. package/packages/core/src/{harness → agent}/run-epoch.ts +4 -3
  62. package/packages/core/src/{harness → agent}/run-store.ts +142 -81
  63. package/packages/core/src/agent/{Service.ts → service.ts} +37 -26
  64. package/packages/core/src/agent/skill-selector.ts +374 -0
  65. package/packages/core/src/agent/stuck-loop.ts +209 -0
  66. package/packages/core/src/agent/{selectors/ToolSelector.ts → tool-selector.ts} +188 -178
  67. package/packages/core/src/{ace/Tracer.ts → agent/tracer.ts} +37 -27
  68. package/packages/core/src/api/createAgent.test.ts +139 -27
  69. package/packages/core/src/api/createAgent.ts +232 -44
  70. package/packages/core/src/artifacts/store.ts +162 -0
  71. package/packages/core/src/canvas/canvas-manager.ts +161 -0
  72. package/packages/core/src/canvas/canvas.test.ts +8 -4
  73. package/packages/core/src/canvas/emitter.ts +131 -80
  74. package/packages/core/src/canvas/index.ts +1 -3
  75. package/packages/core/src/channels/base.ts +9 -1
  76. package/packages/core/src/channels/discord.ts +5 -4
  77. package/packages/core/src/channels/manager.ts +122 -30
  78. package/packages/core/src/channels/slack.ts +5 -4
  79. package/packages/core/src/channels/telegram.ts +36 -6
  80. package/packages/core/src/channels/webchat.ts +11 -10
  81. package/packages/core/src/channels/whatsapp.ts +23 -7
  82. package/packages/core/src/config/index.ts +13 -2
  83. package/packages/core/src/config/loader.ts +71 -29
  84. package/packages/core/src/ethics/EthicsGuard.test.ts +90 -36
  85. package/packages/core/src/ethics/EthicsGuard.ts +51 -47
  86. package/packages/core/src/events/agent-bus.ts +44 -68
  87. package/packages/core/src/events/channel-narration.ts +150 -0
  88. package/packages/core/src/events/narration.ts +82 -0
  89. package/packages/core/src/events/tool-narration.ts +62 -0
  90. package/packages/core/src/gateway/delegation-groups.ts +258 -0
  91. package/packages/core/src/{harness → gateway}/durable-queue.ts +102 -42
  92. package/packages/core/src/{harness → gateway}/job-store.ts +85 -48
  93. package/packages/core/src/gateway/lane-queue.ts +173 -0
  94. package/packages/core/src/gateway/notification-inbox.ts +57 -0
  95. package/packages/core/src/gateway/server.ts +1 -1
  96. package/packages/core/src/harness/index.ts +46 -27
  97. package/packages/core/src/index.ts +33 -20
  98. package/packages/core/src/mcp/hot-reload.ts +32 -23
  99. package/packages/core/src/mcp/index.ts +6 -3
  100. package/packages/core/src/mcp/singleton.ts +1 -4
  101. package/packages/core/src/mcp/tool-sync.ts +138 -0
  102. package/packages/core/src/memory/Scratchpad.test.ts +39 -20
  103. package/packages/core/src/memory/Scratchpad.ts +27 -34
  104. package/packages/core/src/multimodal/vision-service.ts +44 -38
  105. package/packages/core/src/resilience/retry.ts +95 -0
  106. package/packages/core/src/scheduler/CronScheduler.ts +334 -287
  107. package/packages/core/src/scheduler/index.ts +9 -7
  108. package/packages/core/src/scheduler/integration.ts +46 -26
  109. package/packages/core/src/scheduler/scheduler.test.ts +9 -13
  110. package/packages/core/src/scheduler/types.ts +7 -2
  111. package/packages/core/src/security/Pairing.ts +1 -1
  112. package/packages/core/src/skills/bundled/a2ui/a2ui_dashboard/SKILL.md +176 -0
  113. package/packages/core/src/skills/bundled/a2ui/a2ui_form/SKILL.md +202 -0
  114. package/packages/core/src/skills/bundled/a2ui/a2ui_interactive/SKILL.md +206 -0
  115. package/packages/core/src/skills/bundled/agents/agent_spawner/SKILL.md +173 -0
  116. package/packages/core/src/skills/bundled/agents/memory_manager/SKILL.md +143 -0
  117. package/packages/core/src/skills/bundled/agents/research_and_remember/SKILL.md +139 -0
  118. package/packages/core/src/skills/bundled/agents/task_orchestrator/SKILL.md +98 -0
  119. package/packages/core/src/skills/bundled/api/api_client/SKILL.md +132 -0
  120. package/packages/core/src/skills/bundled/cli/cli_pipeline/SKILL.md +135 -0
  121. package/packages/core/src/skills/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  122. package/packages/core/src/skills/bundled/cli/software_engineering/SKILL.md +23 -0
  123. package/packages/core/src/skills/bundled/cron_manager/SKILL.md +188 -0
  124. package/packages/core/src/skills/bundled/cron_reminder/SKILL.md +112 -0
  125. package/packages/core/src/skills/bundled/filesystem/file_manager/SKILL.md +118 -0
  126. package/packages/core/src/skills/bundled/filesystem/file_read_and_summarize/SKILL.md +109 -0
  127. package/packages/core/src/skills/bundled/filesystem/file_writer/SKILL.md +129 -0
  128. package/packages/core/src/skills/bundled/filesystem/workspace_file_operator/SKILL.md +22 -0
  129. package/packages/core/src/skills/bundled/office/office_document_manager/SKILL.md +262 -0
  130. package/packages/core/src/skills/bundled/search_knowledge/capability_discovery/SKILL.md +75 -0
  131. package/packages/core/src/skills/bundled/web/browser_automate/SKILL.md +120 -0
  132. package/packages/core/src/skills/bundled/web/browser_scrape/SKILL.md +109 -0
  133. package/packages/core/src/skills/bundled/web/web_monitor/SKILL.md +127 -0
  134. package/packages/core/src/skills/bundled/web/web_research/SKILL.md +119 -0
  135. package/packages/core/src/skills/bundled-data.generated.ts +731 -2678
  136. package/packages/core/src/skills/skills.test.ts +52 -11
  137. package/packages/core/src/{harness → storage}/boot-id.ts +5 -2
  138. package/packages/core/src/storage/bootstrap.ts +151 -0
  139. package/packages/core/src/storage/causal-events.ts +84 -0
  140. package/packages/core/src/storage/collections.ts +680 -0
  141. package/packages/core/src/storage/crypto.ts +205 -74
  142. package/packages/core/src/{harness/db-helpers.ts → storage/hive.ts} +63 -7
  143. package/packages/core/src/storage/hivedb.ts +61 -0
  144. package/packages/core/src/storage/index.ts +111 -17
  145. package/packages/core/src/storage/model-id.ts +53 -0
  146. package/packages/core/src/storage/onboarding.ts +540 -972
  147. package/packages/core/src/storage/reconcile.ts +238 -0
  148. package/packages/core/src/storage/seed.ts +572 -406
  149. package/packages/core/src/storage/usage.ts +285 -225
  150. package/packages/core/src/storage/user-email.ts +11 -0
  151. package/packages/core/src/swarm/AgentExecutor.ts +1 -1
  152. package/packages/core/src/swarm/EventBridge.ts +1 -1
  153. package/packages/core/src/swarm/index.ts +12 -9
  154. package/packages/core/src/tool-runtime/index.ts +146 -23
  155. package/packages/core/src/tool-runtime/tool-worker.ts +2 -2
  156. package/packages/core/src/tool-runtime/worker-tools.ts +27 -0
  157. package/packages/core/src/{canvas/a2ui-tools.ts → tools/a2ui/index.ts} +17 -8
  158. package/packages/core/src/tools/agents/get-available-models.ts +36 -54
  159. package/packages/core/src/tools/agents/index.ts +784 -292
  160. package/packages/core/src/tools/api/api-request.test.ts +164 -0
  161. package/packages/core/src/tools/api/api-request.ts +174 -0
  162. package/packages/core/src/tools/api/index.ts +16 -0
  163. package/packages/core/src/tools/cli/index.ts +4 -0
  164. package/packages/core/src/tools/core/index.ts +281 -112
  165. package/packages/core/src/tools/cron/index.ts +121 -124
  166. package/packages/core/src/tools/index.ts +63 -78
  167. package/packages/core/src/tools/office/office-escribir-xlsx.ts +3 -1
  168. package/packages/core/src/tools/types.ts +3 -1
  169. package/packages/core/src/tools/web/artifact-inspect.ts +23 -0
  170. package/packages/core/src/tools/web/browser-screenshot.ts +26 -5
  171. package/packages/core/src/tools/web/browser-service.ts +5 -0
  172. package/packages/core/src/tools/web/browser-type.ts +3 -8
  173. package/packages/core/src/tools/web/index.ts +4 -4
  174. package/packages/core/src/voice/index.ts +89 -63
  175. package/packages/core/src/workers/agent.worker.ts +2 -2
  176. package/packages/core/src/workers/workers.test.ts +3 -10
  177. package/scripts/bump-version.ts +248 -0
  178. package/scripts/generate-skill-bundle.ts +108 -0
  179. package/test/agent-loop-terminal-synthesis.test.ts +32 -0
  180. package/test/catalog-agents-stay-enabled.test.ts +117 -0
  181. package/test/causal-events.test.ts +117 -0
  182. package/test/compaction.test.ts +105 -0
  183. package/test/context-compiler.test.ts +269 -0
  184. package/test/curator.test.ts +130 -0
  185. package/test/durable-queue.test.ts +114 -0
  186. package/test/harness-barrel.test.ts +64 -0
  187. package/test/hive-helpers.test.ts +130 -0
  188. package/test/hivedb-search.test.ts +189 -0
  189. package/test/internal-turns.test.ts +166 -0
  190. package/test/job-idempotency.test.ts +68 -0
  191. package/test/job-retry-backoff.test.ts +184 -0
  192. package/test/job-store.test.ts +381 -0
  193. package/test/llm-retry.test.ts +97 -0
  194. package/test/memory-perf.test.ts +774 -0
  195. package/test/minimal-loadout.test.ts +78 -0
  196. package/test/model-catalog.test.ts +105 -0
  197. package/test/preload.ts +12 -0
  198. package/test/reflector.test.ts +320 -0
  199. package/test/retention-cap.test.ts +91 -0
  200. package/test/retired-capabilities-pruned.test.ts +192 -0
  201. package/test/run-store.test.ts +355 -0
  202. package/test/scratchpad.test.ts +74 -0
  203. package/test/secrets-durability.test.ts +119 -0
  204. package/test/seed-model-reseed.test.ts +155 -0
  205. package/test/setup-agent-seed.test.ts +264 -0
  206. package/test/tool-inventory.test.ts +65 -0
  207. package/test/tool-runtime.test.ts +258 -0
  208. package/test/toon.test.ts +429 -0
  209. package/tsconfig.json +2 -0
  210. package/packages/core/src/ace/Curator.ts +0 -158
  211. package/packages/core/src/ace/Reflector.ts +0 -200
  212. package/packages/core/src/ace/index.ts +0 -4
  213. package/packages/core/src/agent/AgentRunner.ts +0 -711
  214. package/packages/core/src/agent/ContextCompiler.ts +0 -567
  215. package/packages/core/src/agent/ContextGuard.ts +0 -91
  216. package/packages/core/src/agent/ConversationStore.ts +0 -254
  217. package/packages/core/src/agent/Hooks.ts +0 -166
  218. package/packages/core/src/agent/StuckLoop.ts +0 -133
  219. package/packages/core/src/agent/providers/LLMClient.ts +0 -149
  220. package/packages/core/src/agent/providers/anthropic.ts +0 -212
  221. package/packages/core/src/agent/providers/openai-compat.ts +0 -231
  222. package/packages/core/src/agent/selectors/PlaybookSelector.ts +0 -121
  223. package/packages/core/src/agent/selectors/SkillSelector.ts +0 -322
  224. package/packages/core/src/agent/selectors/index.ts +0 -6
  225. package/packages/core/src/auth/auth.ts +0 -121
  226. package/packages/core/src/auth/index.ts +0 -1
  227. package/packages/core/src/canvas/CanvasManager.ts +0 -390
  228. package/packages/core/src/canvas/canvas-tools.ts +0 -448
  229. package/packages/core/src/harness/collections.ts +0 -98
  230. package/packages/core/src/harness/goal-verifier.ts +0 -141
  231. package/packages/core/src/harness/harness.test.ts +0 -236
  232. package/packages/core/src/harness/reconcile.ts +0 -149
  233. package/packages/core/src/mcp/MCPToolAdapter.ts +0 -176
  234. package/packages/core/src/multimodal/VisionService.ts +0 -293
  235. package/packages/core/src/scheduler/dag/AgentExecutor.ts +0 -53
  236. package/packages/core/src/scheduler/dag/DAGScheduler.ts +0 -250
  237. package/packages/core/src/scheduler/dag/EventBridge.ts +0 -122
  238. package/packages/core/src/scheduler/dag/TaskGraph.ts +0 -192
  239. package/packages/core/src/scheduler/dag/TaskNode.ts +0 -97
  240. package/packages/core/src/scheduler/dag/TaskResult.ts +0 -22
  241. package/packages/core/src/scheduler/dag/errors.ts +0 -37
  242. package/packages/core/src/scheduler/dag/index.ts +0 -26
  243. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +0 -97
  244. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +0 -21
  245. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +0 -46
  246. package/packages/core/src/storage/HiveDBStorage.ts +0 -64
  247. package/packages/core/src/storage/SQLiteStorage.ts +0 -414
  248. package/packages/core/src/storage/hiveSeed.ts +0 -308
  249. package/packages/core/src/storage/hiveStorage.test.ts +0 -38
  250. package/packages/core/src/storage/schema.ts +0 -689
  251. package/packages/core/src/storage/storage.test.ts +0 -37
  252. package/packages/core/src/swarm/AgentBus.ts +0 -460
  253. package/packages/core/src/swarm/EventBus.ts +0 -169
  254. package/packages/core/src/swarm/WorkerPool.ts +0 -236
  255. package/packages/core/src/tools/bridge-events.ts +0 -26
  256. package/packages/core/src/tools/canvas/index.ts +0 -375
  257. package/packages/core/src/tools/codebridge/index.ts +0 -342
  258. package/packages/core/src/tools/meeting/index.ts +0 -353
  259. package/packages/core/src/tools/projects/index.ts +0 -37
  260. package/packages/core/src/tools/projects/project-create.ts +0 -94
  261. package/packages/core/src/tools/projects/project-done.ts +0 -66
  262. package/packages/core/src/tools/projects/project-fail.ts +0 -66
  263. package/packages/core/src/tools/projects/project-list.ts +0 -96
  264. package/packages/core/src/tools/projects/project-update.ts +0 -72
  265. package/packages/core/src/tools/projects/task-create.ts +0 -68
  266. package/packages/core/src/tools/projects/task-evaluate.ts +0 -93
  267. package/packages/core/src/tools/projects/task-update.ts +0 -93
  268. package/packages/core/src/tools/voice/index.ts +0 -104
  269. package/packages/core/src/tools/web/api-request.test.ts +0 -170
  270. package/packages/core/src/tools/web/api-request.ts +0 -239
  271. package/test/setup-db.ts +0 -216
  272. /package/packages/core/src/agent/{NativeTools.ts → native-tools.ts} +0 -0
@@ -1,158 +0,0 @@
1
- /**
2
- * ACE Curator — converts reflections into playbook rules.
3
- *
4
- * Runs after the Reflector. Performs incremental edits to the playbook:
5
- * - New insights → new rules
6
- * - Repeated patterns → increment helpful_count
7
- * - Contradicted rules → increment harmful_count or deactivate
8
- * - Deactivate rules where harmful_count > helpful_count
9
- * - Archive unused workers
10
- *
11
- * Never rewrites the whole playbook — only incremental edits.
12
- */
13
-
14
- import { logger } from "../utils/logger.ts"
15
-
16
- const log = logger.child("curator")
17
-
18
- const DAYS_BEFORE_ARCHIVE = 14 // archive workers not used in N days
19
- const MAX_HARMFUL_BEFORE_PRUNE = 3
20
-
21
- /** Entry point — called by reflector.ts after it inserts new reflections */
22
- export async function runCurator(): Promise<void> {
23
- try {
24
- const { getDb } = await import("../storage/SQLiteStorage.ts")
25
- const db = getDb()
26
-
27
- // Process unprocessed reflections (those newer than last run)
28
- const lastProcessed = (db.query<any, []>(
29
- "SELECT COALESCE(MAX(source_reflection_id), 0) as mid FROM playbook"
30
- ).get() as any)?.mid ?? 0
31
-
32
- const reflections = (db.query as any)(
33
- "SELECT * FROM reflections WHERE id > ? ORDER BY id ASC"
34
- ).all(lastProcessed)
35
-
36
- if (reflections.length === 0) {
37
- log.debug("[curator] No new reflections to process")
38
- } else {
39
- log.info(`[curator] Processing ${reflections.length} new reflections`)
40
- for (const reflection of reflections) {
41
- processReflection(db, reflection)
42
- }
43
- }
44
-
45
- // Prune rules where harmful > helpful (consistently bad rules)
46
- db.query(`
47
- UPDATE playbook
48
- SET active = 0, updated_at = unixepoch()
49
- WHERE active = 1
50
- AND harmful_count > helpful_count
51
- AND harmful_count >= ?
52
- `).run(MAX_HARMFUL_BEFORE_PRUNE)
53
-
54
- // Archive unused workers
55
- const cutoff = Math.floor(Date.now() / 1000) - (DAYS_BEFORE_ARCHIVE * 86400)
56
- const staleworkers = (db.query as any)(`
57
- SELECT a.id, a.name
58
- FROM agents a
59
- WHERE a.role = 'worker'
60
- AND a.status != 'archived'
61
- AND a.enabled = 1
62
- AND (
63
- SELECT MAX(t.created_at) FROM traces t WHERE t.agent_id = a.id
64
- ) < ?
65
- `).all(cutoff)
66
-
67
- for (const worker of staleworkers) {
68
- db.query(
69
- "UPDATE agents SET status = 'archived', updated_at = unixepoch() WHERE id = ?"
70
- ).run(worker.id)
71
-
72
- // Add playbook note about archival
73
- addOrUpdateRule(db, {
74
- rule: `Worker '${worker.name}' was archived due to inactivity (>${DAYS_BEFORE_ARCHIVE} days unused).`,
75
- category: "agent_creation",
76
- applicable_to: null,
77
- sourceReflectionId: null,
78
- })
79
-
80
- log.info(`[curator] Archived inactive worker: ${worker.name} (${worker.id})`)
81
- }
82
-
83
- log.info("[curator] Playbook updated")
84
- } catch (err) {
85
- log.warn("[curator] Error:", err)
86
- }
87
- }
88
-
89
- // ─── Process a single reflection ─────────────────────────────────────────────
90
-
91
- function processReflection(db: any, reflection: any): void {
92
- const category = mapInsightTypeToCategory(reflection.insight_type)
93
-
94
- // Check if a similar rule already exists (fuzzy check by first 60 chars)
95
- const prefix = reflection.description.substring(0, 60)
96
- const existing = (db.query as any)(
97
- "SELECT id, helpful_count FROM playbook WHERE rule LIKE ? AND active = 1 LIMIT 1"
98
- ).get(`${prefix}%`)
99
-
100
- if (existing) {
101
- // Reinforce existing rule
102
- db.query(
103
- "UPDATE playbook SET helpful_count = helpful_count + 1, updated_at = unixepoch() WHERE id = ?"
104
- ).run(existing.id)
105
- return
106
- }
107
-
108
- // Insert new rule
109
- db.query(`
110
- INSERT INTO playbook (rule, category, applicable_to, helpful_count, source_reflection_id)
111
- VALUES (?, ?, ?, 1, ?)
112
- `).run(
113
- reflection.description,
114
- category,
115
- reflection.affected_tools
116
- ? JSON.stringify(JSON.parse(reflection.affected_tools))
117
- : null,
118
- reflection.id,
119
- )
120
- }
121
-
122
- function mapInsightTypeToCategory(
123
- type: string
124
- ): "tool_selection" | "response_quality" | "error_avoidance" | "optimization" | "agent_creation" {
125
- const map: Record<string, any> = {
126
- success_pattern: "tool_selection",
127
- failure_pattern: "error_avoidance",
128
- optimization: "optimization",
129
- ethics_violation: "error_avoidance",
130
- }
131
- return map[type] ?? "optimization"
132
- }
133
-
134
- function addOrUpdateRule(
135
- db: any,
136
- opts: {
137
- rule: string
138
- category: string
139
- applicable_to: string | null
140
- sourceReflectionId: number | null
141
- }
142
- ): void {
143
- const prefix = opts.rule.substring(0, 60)
144
- const existing = (db.query as any)(
145
- "SELECT id FROM playbook WHERE rule LIKE ? LIMIT 1"
146
- ).get(`${prefix}%`)
147
-
148
- if (existing) {
149
- db.query(
150
- "UPDATE playbook SET helpful_count = helpful_count + 1, updated_at = unixepoch() WHERE id = ?"
151
- ).run(existing.id)
152
- } else {
153
- db.query(`
154
- INSERT INTO playbook (rule, category, applicable_to, helpful_count, source_reflection_id)
155
- VALUES (?, ?, ?, 1, ?)
156
- `).run(opts.rule, opts.category, opts.applicable_to, opts.sourceReflectionId)
157
- }
158
- }
@@ -1,200 +0,0 @@
1
- /**
2
- * ACE Reflector — analyzes recent traces and produces insights.
3
- *
4
- * Runs in the background (never blocks the main agent loop).
5
- * Triggered by the tracer after N new traces.
6
- *
7
- * Output → `reflections` table → picked up by Curator.
8
- */
9
-
10
- import { logger } from "../utils/logger.ts"
11
-
12
- const log = logger.child("reflector")
13
-
14
- const MAX_TRACES_TO_ANALYZE = 30
15
- const MIN_TRACES_TO_RUN = 10
16
-
17
- /** Main entry point — called from tracer.ts */
18
- export async function runReflector(): Promise<void> {
19
- try {
20
- const { getDb } = await import("../storage/SQLiteStorage.ts")
21
- const db = getDb()
22
-
23
- log.info(`[reflector] Starting reflection cycle...`)
24
-
25
- // Fetch traces not yet covered by any reflection
26
- log.debug(`[reflector] Querying last reflection ID...`)
27
- const lastReflectionId = (db.query<any, []>(
28
- "SELECT MAX(id) as mid FROM reflections"
29
- ).get() as any)?.mid ?? 0
30
- log.debug(`[reflector] Last reflection ID: ${lastReflectionId}`)
31
-
32
- // Get last processed trace ID from reflections
33
- log.debug(`[reflector] Querying last processed trace ID with json_each...`)
34
- let lastProcessedTrace = 0
35
- try {
36
- const result = (db.query<any, []>(
37
- `SELECT MAX(CAST(json_each.value AS INTEGER)) as max_id
38
- FROM reflections, json_each(reflections.trace_ids)
39
- WHERE reflections.id = (SELECT MAX(id) FROM reflections)`
40
- ).get() as any)?.max_id ?? 0
41
- lastProcessedTrace = result
42
- log.debug(`[reflector] Last processed trace ID: ${lastProcessedTrace}`)
43
- } catch (jsonErr) {
44
- log.error(`[reflector] json_each query failed:`, jsonErr)
45
- log.error(`[reflector] Full error details:`, {
46
- message: (jsonErr as Error).message,
47
- stack: (jsonErr as Error).stack,
48
- errno: (jsonErr as any).errno,
49
- byteOffset: (jsonErr as any).byteOffset,
50
- })
51
- throw jsonErr // Re-throw to see full stack trace in main catch
52
- }
53
-
54
- log.debug(`[reflector] Fetching traces from DB, lastProcessedTrace=${lastProcessedTrace}, limit=${MAX_TRACES_TO_ANALYZE}`)
55
- const traces = db.query<any, [number, number]>(`
56
- SELECT id, agent_id, agent_name, tool_used, input_summary,
57
- output_summary, success, error_message, duration_ms, tokens_used, created_at
58
- FROM traces
59
- WHERE id > ?
60
- ORDER BY id ASC
61
- LIMIT ?
62
- `).all(lastProcessedTrace, MAX_TRACES_TO_ANALYZE)
63
-
64
- log.debug(`[reflector] Fetched ${traces.length} traces from DB`)
65
-
66
- if (traces.length < MIN_TRACES_TO_RUN) {
67
- log.debug(`[reflector] Not enough traces (${traces.length}/${MIN_TRACES_TO_RUN}), skipping`)
68
- return
69
- }
70
-
71
- log.info(`[reflector] Analyzing ${traces.length} traces...`)
72
-
73
- const insights = analyzeTracesLocally(traces)
74
-
75
- if (insights.length === 0) {
76
- log.debug("[reflector] No insights generated")
77
- return
78
- }
79
-
80
- const traceIds = JSON.stringify(traces.map((t: any) => t.id))
81
-
82
- for (const insight of insights) {
83
- db.query(`
84
- INSERT INTO reflections (trace_ids, insight_type, description, affected_tools, affected_agents, confidence)
85
- VALUES (?, ?, ?, ?, ?, ?)
86
- `).run(
87
- traceIds,
88
- insight.type,
89
- insight.description,
90
- insight.affectedTools ? JSON.stringify(insight.affectedTools) : null,
91
- insight.affectedAgents ? JSON.stringify(insight.affectedAgents) : null,
92
- insight.confidence,
93
- )
94
- }
95
-
96
- log.info(`[reflector] Generated ${insights.length} insights`)
97
-
98
- // Trigger curator
99
- const { runCurator } = await import("./Curator.ts")
100
- await runCurator()
101
-
102
- log.info(`[reflector] Reflection cycle completed successfully`)
103
- } catch (err) {
104
- log.error(`[reflector] Error during reflection:`, {
105
- message: (err as Error).message,
106
- stack: (err as Error).stack,
107
- errno: (err as any).errno,
108
- byteOffset: (err as any).byteOffset,
109
- code: (err as any).code,
110
- })
111
- }
112
- }
113
-
114
- // ─── Local analysis (heuristic, no LLM call needed for basic patterns) ────────
115
-
116
- interface Insight {
117
- type: "success_pattern" | "failure_pattern" | "optimization" | "ethics_violation"
118
- description: string
119
- affectedTools?: string[]
120
- affectedAgents?: string[]
121
- confidence: number
122
- }
123
-
124
- function analyzeTracesLocally(traces: any[]): Insight[] {
125
- const insights: Insight[] = []
126
-
127
- // ── Failure patterns ─────────────────────────────────────────────────────
128
- const failures = traces.filter((t: any) => !t.success)
129
- if (failures.length > 3) {
130
- // Group by tool
131
- const toolFailures: Record<string, number> = {}
132
- for (const f of failures) {
133
- if (f.tool_used) {
134
- toolFailures[f.tool_used] = (toolFailures[f.tool_used] || 0) + 1
135
- }
136
- }
137
- for (const [tool, count] of Object.entries(toolFailures)) {
138
- if (count >= 3) {
139
- insights.push({
140
- type: "failure_pattern",
141
- description: `Tool '${tool}' failed ${count} times recently. Consider verifying its configuration or avoiding it for this type of task.`,
142
- affectedTools: [tool],
143
- confidence: Math.min(0.9, count / 10),
144
- })
145
- }
146
- }
147
- }
148
-
149
- // ── Slow tools ───────────────────────────────────────────────────────────
150
- const slowThresholdMs = 5000
151
- const slowTools: Record<string, number[]> = {}
152
- for (const t of traces) {
153
- if (t.tool_used && t.duration_ms > slowThresholdMs) {
154
- if (!slowTools[t.tool_used]) slowTools[t.tool_used] = []
155
- slowTools[t.tool_used].push(t.duration_ms)
156
- }
157
- }
158
- for (const [tool, durations] of Object.entries(slowTools)) {
159
- if (durations.length >= 3) {
160
- const avg = Math.round(durations.reduce((a, b) => a + b, 0) / durations.length)
161
- insights.push({
162
- type: "optimization",
163
- description: `Tool '${tool}' is consistently slow (avg ${avg}ms). Cache results when possible or use a faster alternative.`,
164
- affectedTools: [tool],
165
- confidence: 0.6,
166
- })
167
- }
168
- }
169
-
170
- // ── High success pattern ─────────────────────────────────────────────────
171
- const successByTool: Record<string, { ok: number; total: number }> = {}
172
- for (const t of traces) {
173
- if (!t.tool_used) continue
174
- if (!successByTool[t.tool_used]) successByTool[t.tool_used] = { ok: 0, total: 0 }
175
- successByTool[t.tool_used].total++
176
- if (t.success) successByTool[t.tool_used].ok++
177
- }
178
- for (const [tool, stats] of Object.entries(successByTool)) {
179
- if (stats.total >= 5 && stats.ok / stats.total >= 0.9) {
180
- insights.push({
181
- type: "success_pattern",
182
- description: `Tool '${tool}' has a high success rate (${stats.ok}/${stats.total}). Prefer it for related tasks.`,
183
- affectedTools: [tool],
184
- confidence: stats.ok / stats.total,
185
- })
186
- }
187
- }
188
-
189
- // ── High token usage ─────────────────────────────────────────────────────
190
- const highTokenTraces = traces.filter((t: any) => t.tokens_used > 4000)
191
- if (highTokenTraces.length > 3) {
192
- insights.push({
193
- type: "optimization",
194
- description: `${highTokenTraces.length} recent calls used >4000 tokens. Be more concise and use tool results as summaries, not raw dumps.`,
195
- confidence: 0.7,
196
- })
197
- }
198
-
199
- return insights
200
- }
@@ -1,4 +0,0 @@
1
- export { runCurator } from "./Curator.ts";
2
- export { runReflector } from "./Reflector.ts";
3
- export type { TraceInput } from "./Tracer.ts";
4
- export { saveTrace } from "./Tracer.ts";