@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.560

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 (392) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3596 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +248 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/elevenlabs.js +125 -0
  350. package/dist/senses/voice/index.js +22 -0
  351. package/dist/senses/voice/transcript.js +70 -0
  352. package/dist/senses/voice/turn.js +85 -0
  353. package/dist/senses/voice/types.js +2 -0
  354. package/dist/senses/voice/whisper.js +133 -0
  355. package/dist/senses/voice-entry.js +80 -0
  356. package/dist/trips/core.js +138 -0
  357. package/dist/trips/store.js +146 -0
  358. package/package.json +38 -7
  359. package/skills/agent-commerce.md +106 -0
  360. package/skills/browser-navigation.md +117 -0
  361. package/skills/commerce-setup-guide.md +116 -0
  362. package/skills/commerce-setup.md +84 -0
  363. package/skills/configure-dev-tools.md +101 -0
  364. package/skills/travel-planning.md +138 -0
  365. package/dist/heart/daemon/auth-flow.js +0 -351
  366. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  367. package/dist/heart/daemon/subagent-installer.js +0 -166
  368. package/dist/heart/session-recall.js +0 -116
  369. package/dist/mind/associative-recall.js +0 -209
  370. package/dist/senses/bluebubbles-entry.js +0 -13
  371. package/dist/senses/bluebubbles.js +0 -1177
  372. package/dist/senses/debug-activity.js +0 -148
  373. package/subagents/README.md +0 -86
  374. package/subagents/work-doer.md +0 -237
  375. package/subagents/work-merger.md +0 -618
  376. package/subagents/work-planner.md +0 -390
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  389. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  390. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  391. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  392. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,522 @@
1
+ "use strict";
2
+ /**
3
+ * Agent service layer — handles MCP-facing daemon commands.
4
+ * Each handler receives { agent, friendId, ...params } and returns DaemonResponse.
5
+ *
6
+ * DRY: uses the same shared functions the agent's own tools use (diary, session transcript).
7
+ * This file is a thin adapter — no reimplemented search, parsing, or state reading.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.handleAgentStatus = handleAgentStatus;
44
+ exports.handleAgentAsk = handleAgentAsk;
45
+ exports.handleAgentCatchup = handleAgentCatchup;
46
+ exports.handleAgentDelegate = handleAgentDelegate;
47
+ exports.handleAgentGetContext = handleAgentGetContext;
48
+ exports.handleAgentSearchNotes = handleAgentSearchNotes;
49
+ exports.handleAgentGetTask = handleAgentGetTask;
50
+ exports.handleAgentCheckScope = handleAgentCheckScope;
51
+ exports.handleAgentRequestDecision = handleAgentRequestDecision;
52
+ exports.handleAgentCheckGuidance = handleAgentCheckGuidance;
53
+ exports.handleAgentReportProgress = handleAgentReportProgress;
54
+ exports.handleAgentReportBlocker = handleAgentReportBlocker;
55
+ exports.handleAgentReportComplete = handleAgentReportComplete;
56
+ const fs = __importStar(require("fs"));
57
+ const path = __importStar(require("path"));
58
+ const identity_1 = require("../identity");
59
+ const diary_1 = require("../../mind/diary");
60
+ const runtime_1 = require("../../nerves/runtime");
61
+ const socket_client_1 = require("./socket-client");
62
+ /** Format diary hits the same way the search_notes tool does. */
63
+ function formatDiaryHits(hits) {
64
+ return hits.map((f) => `[diary] ${f.text} (source=${f.source}, createdAt=${f.createdAt})`);
65
+ }
66
+ /** Read a file from the agent root, returning null if it doesn't exist. */
67
+ function readAgentFile(agent, ...segments) {
68
+ const filePath = path.join((0, identity_1.getAgentRoot)(agent), ...segments);
69
+ if (!fs.existsSync(filePath))
70
+ return null;
71
+ return fs.readFileSync(filePath, "utf-8");
72
+ }
73
+ /** Resolve the diary root for a specific agent. */
74
+ function agentDiaryRoot(agent) {
75
+ return (0, diary_1.resolveDiaryRoot)(path.join((0, identity_1.getAgentRoot)(agent), "diary"));
76
+ }
77
+ /** Read inner dialog runtime status. */
78
+ function readInnerDialogStatus(agent) {
79
+ const content = readAgentFile(agent, "state", "sessions", "self", "inner", "runtime.json");
80
+ if (!content)
81
+ return null;
82
+ try {
83
+ const data = JSON.parse(content);
84
+ return { status: data.status ?? "unknown", lastCompletedAt: data.lastCompletedAt ?? "" };
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ function safeReaddir(dirPath) {
91
+ try {
92
+ return fs.readdirSync(dirPath).map(String);
93
+ /* v8 ignore start — catch is defensive; tested paths don't trigger fs errors */
94
+ }
95
+ catch {
96
+ return [];
97
+ }
98
+ /* v8 ignore stop */
99
+ }
100
+ function safeIsDir(dirPath) {
101
+ try {
102
+ return fs.statSync(dirPath).isDirectory();
103
+ /* v8 ignore start — catch is defensive; tested paths don't trigger fs errors */
104
+ }
105
+ catch {
106
+ return false;
107
+ }
108
+ /* v8 ignore stop */
109
+ }
110
+ /** Enumerate sessions from state/sessions/, reading session.json files. */
111
+ function enumerateSessions(agent) {
112
+ const sessionsDir = path.join((0, identity_1.getAgentRoot)(agent), "state", "sessions");
113
+ if (!fs.existsSync(sessionsDir))
114
+ return [];
115
+ const sessions = [];
116
+ for (const friendId of safeReaddir(sessionsDir)) {
117
+ const friendPath = path.join(sessionsDir, friendId);
118
+ if (!safeIsDir(friendPath))
119
+ continue;
120
+ for (const channel of safeReaddir(friendPath)) {
121
+ const channelPath = path.join(friendPath, channel);
122
+ if (!safeIsDir(channelPath))
123
+ continue;
124
+ for (const key of safeReaddir(channelPath)) {
125
+ const sessionFile = path.join(channelPath, key, "session.json");
126
+ if (!fs.existsSync(sessionFile))
127
+ continue;
128
+ try {
129
+ const data = JSON.parse(fs.readFileSync(sessionFile, "utf-8"));
130
+ sessions.push({ friendId, channel, key, lastUsage: data.lastUsage ?? "" });
131
+ }
132
+ catch { /* skip malformed */ }
133
+ }
134
+ }
135
+ }
136
+ return sessions;
137
+ }
138
+ /** List markdown files in {agentRoot}/tasks/. */
139
+ function listTaskFiles(agent) {
140
+ const tasksDir = path.join((0, identity_1.getAgentRoot)(agent), "tasks");
141
+ if (!fs.existsSync(tasksDir))
142
+ return [];
143
+ try {
144
+ return fs.readdirSync(tasksDir).map(String).filter((f) => f.endsWith(".md"));
145
+ }
146
+ catch {
147
+ return [];
148
+ }
149
+ }
150
+ function emit(event, message, meta) {
151
+ (0, runtime_1.emitNervesEvent)({ component: "daemon", event, message, meta });
152
+ }
153
+ function objectRecord(value) {
154
+ return value && typeof value === "object" && !Array.isArray(value)
155
+ ? value
156
+ : null;
157
+ }
158
+ function stringValue(value) {
159
+ return typeof value === "string" ? value : null;
160
+ }
161
+ function booleanValue(value) {
162
+ return typeof value === "boolean" ? value : null;
163
+ }
164
+ function numberValue(value) {
165
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
166
+ }
167
+ function readMcpRuntimeVersion() {
168
+ const packagePath = path.resolve(__dirname, "..", "..", "..", "package.json");
169
+ try {
170
+ const parsed = JSON.parse(fs.readFileSync(packagePath, "utf-8"));
171
+ return stringValue(parsed.version);
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ }
177
+ function summarizeRuntimeStatus(data, agent) {
178
+ const payload = objectRecord(data);
179
+ if (!payload)
180
+ return null;
181
+ const overview = objectRecord(payload.overview);
182
+ const workers = Array.isArray(payload.workers) ? payload.workers : [];
183
+ const senses = Array.isArray(payload.senses) ? payload.senses : [];
184
+ return {
185
+ daemonReachable: true,
186
+ overview: overview
187
+ ? {
188
+ daemon: stringValue(overview.daemon) ?? "unknown",
189
+ health: stringValue(overview.health) ?? "unknown",
190
+ version: stringValue(overview.version),
191
+ mode: stringValue(overview.mode),
192
+ }
193
+ : undefined,
194
+ workers: workers.flatMap((row) => {
195
+ const record = objectRecord(row);
196
+ if (!record || stringValue(record.agent) !== agent)
197
+ return [];
198
+ const worker = stringValue(record.worker);
199
+ const status = stringValue(record.status);
200
+ return worker && status ? [{ worker, status }] : [];
201
+ }),
202
+ senses: senses.flatMap((row) => {
203
+ const record = objectRecord(row);
204
+ if (!record || stringValue(record.agent) !== agent)
205
+ return [];
206
+ const sense = stringValue(record.sense);
207
+ const status = stringValue(record.status);
208
+ const enabled = booleanValue(record.enabled);
209
+ if (!sense || !status || enabled === null)
210
+ return [];
211
+ return [{
212
+ sense,
213
+ status,
214
+ enabled,
215
+ detail: stringValue(record.detail),
216
+ proofMethod: stringValue(record.proofMethod),
217
+ lastProofAt: stringValue(record.lastProofAt),
218
+ proofAgeMs: numberValue(record.proofAgeMs),
219
+ pendingRecoveryCount: numberValue(record.pendingRecoveryCount),
220
+ failedRecoveryCount: numberValue(record.failedRecoveryCount),
221
+ failureLayer: stringValue(record.failureLayer),
222
+ lastFailure: stringValue(record.lastFailure),
223
+ recoveryAction: stringValue(record.recoveryAction),
224
+ }];
225
+ }),
226
+ };
227
+ }
228
+ async function readRuntimeStatus(socketPath, agent) {
229
+ if (!socketPath)
230
+ return null;
231
+ try {
232
+ const response = await (0, socket_client_1.sendDaemonCommand)(socketPath, { kind: "daemon.status" });
233
+ if (!response.ok) {
234
+ return {
235
+ daemonReachable: false,
236
+ workers: [],
237
+ senses: [],
238
+ error: response.error ?? response.message ?? "daemon status did not answer cleanly",
239
+ };
240
+ }
241
+ return summarizeRuntimeStatus(response.data, agent);
242
+ }
243
+ catch (error) {
244
+ return {
245
+ daemonReachable: false,
246
+ workers: [],
247
+ senses: [],
248
+ error: error instanceof Error ? error.message : String(error),
249
+ };
250
+ }
251
+ }
252
+ function formatRuntimeStatusLines(runtime, mcpVersion) {
253
+ if (!runtime)
254
+ return mcpVersion ? [`mcpVersion=${mcpVersion}`] : [];
255
+ if (!runtime.daemonReachable) {
256
+ return [
257
+ `daemon=unreachable${runtime.error ? `\terror=${runtime.error}` : ""}`,
258
+ ...(mcpVersion ? [`mcpVersion=${mcpVersion}`] : []),
259
+ ];
260
+ }
261
+ const lines = [];
262
+ if (runtime.overview) {
263
+ const versionPart = runtime.overview.version ? `\tdaemonVersion=${runtime.overview.version}` : "";
264
+ const modePart = runtime.overview.mode ? `\tmode=${runtime.overview.mode}` : "";
265
+ const mcpVersionPart = mcpVersion ? `\tmcpVersion=${mcpVersion}` : "";
266
+ const mismatchPart = mcpVersion && runtime.overview.version && mcpVersion !== runtime.overview.version
267
+ ? `\tversionMismatch=mcp:${mcpVersion},daemon:${runtime.overview.version}`
268
+ : "";
269
+ lines.push(`daemon=${runtime.overview.daemon}\thealth=${runtime.overview.health}${versionPart}${modePart}${mcpVersionPart}${mismatchPart}`);
270
+ }
271
+ for (const worker of runtime.workers) {
272
+ lines.push(`worker=${worker.worker}:${worker.status}`);
273
+ }
274
+ for (const sense of runtime.senses) {
275
+ const detailPart = sense.detail ? `\tdetail=${sense.detail}` : "";
276
+ const proofPart = sense.proofMethod ? `\tproof=${sense.proofMethod}` : "";
277
+ const lastProofPart = sense.lastProofAt ? `\tlastProofAt=${sense.lastProofAt}` : "";
278
+ const proofAgePart = sense.proofAgeMs !== null ? `\tproofAgeMs=${sense.proofAgeMs}` : "";
279
+ const pendingPart = sense.pendingRecoveryCount !== null ? `\tpendingRecovery=${sense.pendingRecoveryCount}` : "";
280
+ const failedPart = sense.failedRecoveryCount !== null ? `\tfailedRecovery=${sense.failedRecoveryCount}` : "";
281
+ const failureLayerPart = sense.failureLayer ? `\tfailureLayer=${sense.failureLayer}` : "";
282
+ const failurePart = sense.lastFailure ? `\tlastFailure=${sense.lastFailure}` : "";
283
+ const recoveryPart = sense.recoveryAction ? `\trecovery=${sense.recoveryAction}` : "";
284
+ lines.push(`sense=${sense.sense}:${sense.enabled ? sense.status : "disabled"}`
285
+ + detailPart
286
+ + proofPart
287
+ + lastProofPart
288
+ + proofAgePart
289
+ + pendingPart
290
+ + failedPart
291
+ + failureLayerPart
292
+ + failurePart
293
+ + recoveryPart);
294
+ }
295
+ if (lines.length === 0 && mcpVersion)
296
+ lines.push(`mcpVersion=${mcpVersion}`);
297
+ return lines;
298
+ }
299
+ // ─── Handlers ────────────────────────────────────────────────────────────────
300
+ async function handleAgentStatus(params) {
301
+ (0, runtime_1.emitNervesEvent)({ component: "daemon", event: "daemon.agent_service_start", message: "handling agent.status", meta: { agent: params.agent } });
302
+ const diaryRoot = agentDiaryRoot(params.agent);
303
+ const facts = (0, diary_1.readDiaryEntries)(diaryRoot);
304
+ const innerStatus = readInnerDialogStatus(params.agent);
305
+ const sessions = enumerateSessions(params.agent);
306
+ const mcpVersion = readMcpRuntimeVersion();
307
+ const runtime = await readRuntimeStatus(params.socketPath ?? socket_client_1.DEFAULT_DAEMON_SOCKET_PATH, params.agent);
308
+ emit("daemon.agent_service_end", "completed agent.status", { agent: params.agent });
309
+ const innerStatusValue = innerStatus?.status ?? "unknown";
310
+ const lastThoughtAt = innerStatus?.lastCompletedAt ?? null;
311
+ const agentLine = [
312
+ `agent=${params.agent}`,
313
+ `innerStatus=${innerStatusValue}`,
314
+ `lastThoughtAt=${lastThoughtAt ?? "never"}`,
315
+ `sessionCount=${sessions.length}`,
316
+ `diaryEntries=${facts.length}`,
317
+ ].join("\t");
318
+ const runtimeLines = formatRuntimeStatusLines(runtime, mcpVersion);
319
+ const message = [agentLine, ...runtimeLines].join("\n");
320
+ return {
321
+ ok: true,
322
+ message,
323
+ data: {
324
+ agent: params.agent,
325
+ innerStatus: innerStatusValue,
326
+ lastThoughtAt,
327
+ sessionCount: sessions.length,
328
+ hasDiaryEntries: facts.length > 0,
329
+ factCount: facts.length,
330
+ runtime,
331
+ mcpVersion,
332
+ },
333
+ };
334
+ }
335
+ async function handleAgentAsk(params) {
336
+ emit("daemon.agent_service_start", "handling agent.ask", { agent: params.agent });
337
+ const question = params.question;
338
+ if (!question) {
339
+ emit("daemon.agent_service_error", "agent.ask missing question", { agent: params.agent });
340
+ return { ok: false, error: "Missing required parameter: question" };
341
+ }
342
+ // Use the same searchDiaryEntries the search_notes tool uses (substring fallback — no embedding provider in shim)
343
+ const diaryRoot = agentDiaryRoot(params.agent);
344
+ const hits = await (0, diary_1.searchDiaryEntries)(question, (0, diary_1.readDiaryEntries)(diaryRoot));
345
+ const context = hits.length > 0
346
+ ? hits.slice(0, 10).map((f) => f.text).join("\n")
347
+ : `No relevant notes found for: ${question}`;
348
+ emit("daemon.agent_service_end", "completed agent.ask", { agent: params.agent });
349
+ return { ok: true, message: context };
350
+ }
351
+ async function handleAgentCatchup(params) {
352
+ emit("daemon.agent_service_start", "handling agent.catchup", { agent: params.agent });
353
+ const sessions = enumerateSessions(params.agent);
354
+ const sorted = sessions.sort((a, b) => (b.lastUsage || "").localeCompare(a.lastUsage || ""));
355
+ const recentSessions = sorted.slice(0, 5);
356
+ const innerStatus = readInnerDialogStatus(params.agent);
357
+ const parts = [];
358
+ if (innerStatus) {
359
+ parts.push(`Inner dialog: ${innerStatus.status} (last completed: ${innerStatus.lastCompletedAt || "never"})`);
360
+ }
361
+ if (recentSessions.length > 0) {
362
+ parts.push(`Recent sessions (${recentSessions.length}):`);
363
+ for (const s of recentSessions) {
364
+ parts.push(` - ${s.friendId}/${s.channel}/${s.key} (${s.lastUsage || "unknown"})`);
365
+ }
366
+ }
367
+ else {
368
+ parts.push("No recent sessions");
369
+ }
370
+ emit("daemon.agent_service_end", "completed agent.catchup", { agent: params.agent });
371
+ return {
372
+ ok: true,
373
+ /* v8 ignore next — parts always has at least one element (either sessions or "No recent sessions") */
374
+ message: parts.length > 0 ? parts.join("\n") : `No recent activity for ${params.agent}`,
375
+ data: { recentSessions, innerStatus },
376
+ };
377
+ }
378
+ async function handleAgentDelegate(params) {
379
+ emit("daemon.agent_service_start", "handling agent.delegate", { agent: params.agent });
380
+ const task = params.task;
381
+ if (!task) {
382
+ emit("daemon.agent_service_error", "agent.delegate missing task", { agent: params.agent });
383
+ return { ok: false, error: "Missing required parameter: task" };
384
+ }
385
+ emit("daemon.agent_service_end", "completed agent.delegate", { agent: params.agent });
386
+ return { ok: true, message: `Task queued: ${task}`, data: { task, context: params.context ?? null, queuedAt: new Date().toISOString() } };
387
+ }
388
+ async function handleAgentGetContext(params) {
389
+ emit("daemon.agent_service_start", "handling agent.getContext", { agent: params.agent });
390
+ const query = (params.question ?? params.query ?? params.topic);
391
+ const diaryRoot = agentDiaryRoot(params.agent);
392
+ const facts = (0, diary_1.readDiaryEntries)(diaryRoot);
393
+ const innerStatus = readInnerDialogStatus(params.agent);
394
+ const sessions = enumerateSessions(params.agent);
395
+ const taskFiles = listTaskFiles(params.agent);
396
+ let noteSummary = null;
397
+ if (query) {
398
+ const hits = await (0, diary_1.searchDiaryEntries)(query, facts);
399
+ noteSummary = hits.length > 0
400
+ ? hits.slice(0, 10).map((f) => f.text).join("\n")
401
+ : `No relevant notes for: ${query}`;
402
+ }
403
+ else {
404
+ const recent = facts.slice(-10);
405
+ if (recent.length > 0)
406
+ noteSummary = recent.map((f) => f.text).join("\n");
407
+ }
408
+ emit("daemon.agent_service_end", "completed agent.getContext", { agent: params.agent });
409
+ return {
410
+ ok: true,
411
+ data: {
412
+ agent: params.agent,
413
+ hasDiaryEntries: facts.length > 0,
414
+ factCount: facts.length,
415
+ noteSummary,
416
+ taskCount: taskFiles.length,
417
+ sessionCount: sessions.length,
418
+ innerStatus: innerStatus?.status ?? null,
419
+ },
420
+ };
421
+ }
422
+ async function handleAgentSearchNotes(params) {
423
+ emit("daemon.agent_service_start", "handling agent.searchNotes", { agent: params.agent });
424
+ const query = params.query;
425
+ if (!query) {
426
+ emit("daemon.agent_service_error", "agent.searchNotes missing query", { agent: params.agent });
427
+ return { ok: false, error: "Missing required parameter: query" };
428
+ }
429
+ // Same searchDiaryEntries as the search_notes tool
430
+ const diaryRoot = agentDiaryRoot(params.agent);
431
+ const hits = await (0, diary_1.searchDiaryEntries)(query, (0, diary_1.readDiaryEntries)(diaryRoot));
432
+ const formatted = formatDiaryHits(hits.slice(0, 20));
433
+ emit("daemon.agent_service_end", "completed agent.searchNotes", { agent: params.agent, matchCount: hits.length });
434
+ return {
435
+ ok: true,
436
+ message: hits.length > 0 ? `Found ${hits.length} matches` : "No matches found",
437
+ data: { query, matches: formatted },
438
+ };
439
+ }
440
+ async function handleAgentGetTask(params) {
441
+ emit("daemon.agent_service_start", "handling agent.getTask", { agent: params.agent });
442
+ const taskFiles = listTaskFiles(params.agent);
443
+ const activeTasks = taskFiles.filter((f) => f.toLowerCase().includes("doing") && !f.toLowerCase().includes("done"));
444
+ const taskNames = activeTasks.length > 0 ? activeTasks : taskFiles;
445
+ const tasks = taskNames.map((name) => {
446
+ const content = readAgentFile(params.agent, "tasks", name);
447
+ const firstLine = content?.split("\n").find((l) => l.trim().length > 0)?.trim() ?? "";
448
+ return { name, statusLine: firstLine };
449
+ });
450
+ emit("daemon.agent_service_end", "completed agent.getTask", { agent: params.agent });
451
+ return {
452
+ ok: true,
453
+ message: tasks.length > 0 ? `Tasks (${tasks.length}): ${tasks.map((t) => t.name).join(", ")}` : `No active tasks for ${params.agent}`,
454
+ data: { tasks, activeCount: activeTasks.length, totalCount: taskFiles.length },
455
+ };
456
+ }
457
+ async function handleAgentCheckScope(params) {
458
+ emit("daemon.agent_service_start", "handling agent.checkScope", { agent: params.agent });
459
+ const item = params.item;
460
+ if (!item) {
461
+ emit("daemon.agent_service_error", "agent.checkScope missing item", { agent: params.agent });
462
+ return { ok: false, error: "Missing required parameter: item" };
463
+ }
464
+ emit("daemon.agent_service_end", "completed agent.checkScope", { agent: params.agent });
465
+ return { ok: true, message: `Scope check for: ${item}`, data: { item, inScope: true, reason: "MVP: scope check requires inference — defaulting to in-scope" } };
466
+ }
467
+ async function handleAgentRequestDecision(params) {
468
+ emit("daemon.agent_service_start", "handling agent.requestDecision", { agent: params.agent });
469
+ const topic = params.topic;
470
+ if (!topic) {
471
+ emit("daemon.agent_service_error", "agent.requestDecision missing topic", { agent: params.agent });
472
+ return { ok: false, error: "Missing required parameter: topic" };
473
+ }
474
+ emit("daemon.agent_service_end", "completed agent.requestDecision", { agent: params.agent });
475
+ return { ok: true, message: `Decision request queued: ${topic}`, data: { topic, options: params.options ?? null, status: "pending" } };
476
+ }
477
+ async function handleAgentCheckGuidance(params) {
478
+ emit("daemon.agent_service_start", "handling agent.checkGuidance", { agent: params.agent });
479
+ const topic = params.topic;
480
+ if (!topic) {
481
+ emit("daemon.agent_service_error", "agent.checkGuidance missing topic", { agent: params.agent });
482
+ return { ok: false, error: "Missing required parameter: topic" };
483
+ }
484
+ // Same searchDiaryEntries as the search_notes tool
485
+ const diaryRoot = agentDiaryRoot(params.agent);
486
+ const hits = await (0, diary_1.searchDiaryEntries)(topic, (0, diary_1.readDiaryEntries)(diaryRoot));
487
+ const guidance = hits.length > 0
488
+ ? `Relevant guidance:\n${hits.slice(0, 10).map((f) => f.text).join("\n")}`
489
+ : `No specific guidance found for: ${topic}`;
490
+ emit("daemon.agent_service_end", "completed agent.checkGuidance", { agent: params.agent });
491
+ return { ok: true, message: guidance };
492
+ }
493
+ async function handleAgentReportProgress(params) {
494
+ emit("daemon.agent_service_start", "handling agent.reportProgress", { agent: params.agent });
495
+ const summary = params.summary;
496
+ if (!summary) {
497
+ emit("daemon.agent_service_error", "agent.reportProgress missing summary", { agent: params.agent });
498
+ return { ok: false, error: "Missing required parameter: summary" };
499
+ }
500
+ emit("daemon.agent_service_end", "completed agent.reportProgress", { agent: params.agent });
501
+ return { ok: true, message: `Progress noted: ${summary}`, data: { summary, receivedAt: new Date().toISOString() } };
502
+ }
503
+ async function handleAgentReportBlocker(params) {
504
+ emit("daemon.agent_service_start", "handling agent.reportBlocker", { agent: params.agent });
505
+ const blocker = params.blocker;
506
+ if (!blocker) {
507
+ emit("daemon.agent_service_error", "agent.reportBlocker missing blocker", { agent: params.agent });
508
+ return { ok: false, error: "Missing required parameter: blocker" };
509
+ }
510
+ emit("daemon.agent_service_end", "completed agent.reportBlocker", { agent: params.agent });
511
+ return { ok: true, message: `Blocker reported: ${blocker}`, data: { blocker, receivedAt: new Date().toISOString() } };
512
+ }
513
+ async function handleAgentReportComplete(params) {
514
+ emit("daemon.agent_service_start", "handling agent.reportComplete", { agent: params.agent });
515
+ const summary = params.summary;
516
+ if (!summary) {
517
+ emit("daemon.agent_service_error", "agent.reportComplete missing summary", { agent: params.agent });
518
+ return { ok: false, error: "Missing required parameter: summary" };
519
+ }
520
+ emit("daemon.agent_service_end", "completed agent.reportComplete", { agent: params.agent });
521
+ return { ok: true, message: `Completion reported: ${summary}`, data: { summary, receivedAt: new Date().toISOString() } };
522
+ }