@ouro.bot/cli 0.1.0-alpha.61 → 0.1.0-alpha.612

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 (418) 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 +3912 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +144 -0
  15. package/dist/arc/episodes.js +118 -0
  16. package/dist/arc/intentions.js +134 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +266 -0
  19. package/dist/arc/packets.js +194 -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 +69 -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/awaiting/await-alert.js +146 -0
  36. package/dist/heart/awaiting/await-expiry.js +108 -0
  37. package/dist/heart/awaiting/await-loader.js +91 -0
  38. package/dist/heart/awaiting/await-parser.js +141 -0
  39. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  40. package/dist/heart/awaiting/await-scheduler.js +377 -0
  41. package/dist/heart/background-operations.js +281 -0
  42. package/dist/heart/bridges/store.js +14 -2
  43. package/dist/heart/bundle-state.js +168 -0
  44. package/dist/heart/commitments.js +142 -0
  45. package/dist/heart/config-registry.js +322 -0
  46. package/dist/heart/config.js +114 -119
  47. package/dist/heart/core.js +909 -246
  48. package/dist/heart/cross-chat-delivery.js +3 -18
  49. package/dist/heart/daemon/agent-config-check.js +419 -0
  50. package/dist/heart/daemon/agent-discovery.js +102 -3
  51. package/dist/heart/daemon/agent-service.js +522 -0
  52. package/dist/heart/daemon/agentic-repair.js +547 -0
  53. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  54. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  55. package/dist/heart/daemon/cadence.js +70 -0
  56. package/dist/heart/daemon/cli-defaults.js +776 -0
  57. package/dist/heart/daemon/cli-exec.js +7579 -0
  58. package/dist/heart/daemon/cli-help.js +498 -0
  59. package/dist/heart/daemon/cli-parse.js +1599 -0
  60. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  61. package/dist/heart/daemon/cli-render.js +763 -0
  62. package/dist/heart/daemon/cli-types.js +8 -0
  63. package/dist/heart/daemon/connect-bay.js +323 -0
  64. package/dist/heart/daemon/daemon-cli.js +29 -1700
  65. package/dist/heart/daemon/daemon-entry.js +485 -2
  66. package/dist/heart/daemon/daemon-health.js +176 -0
  67. package/dist/heart/daemon/daemon-rollup.js +57 -0
  68. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  69. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  70. package/dist/heart/daemon/daemon.js +904 -70
  71. package/dist/heart/daemon/dns-workflow.js +394 -0
  72. package/dist/heart/daemon/doctor-types.js +8 -0
  73. package/dist/heart/daemon/doctor.js +873 -0
  74. package/dist/heart/daemon/health-monitor.js +122 -1
  75. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  76. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  77. package/dist/heart/daemon/http-health-probe.js +80 -0
  78. package/dist/heart/daemon/human-command-screens.js +234 -0
  79. package/dist/heart/daemon/human-readiness.js +114 -0
  80. package/dist/heart/daemon/inner-status.js +89 -0
  81. package/dist/heart/daemon/interactive-repair.js +394 -0
  82. package/dist/heart/daemon/launchd.js +37 -8
  83. package/dist/heart/daemon/log-tailer.js +78 -9
  84. package/dist/heart/daemon/logs-prune.js +110 -0
  85. package/dist/heart/daemon/mcp-canary.js +297 -0
  86. package/dist/heart/daemon/os-cron-deps.js +135 -0
  87. package/dist/heart/daemon/os-cron.js +14 -12
  88. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  89. package/dist/heart/daemon/ouro-entry.js +3 -1
  90. package/dist/heart/daemon/process-manager.js +463 -34
  91. package/dist/heart/daemon/provider-discovery.js +137 -0
  92. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  93. package/dist/heart/daemon/pulse.js +475 -0
  94. package/dist/heart/daemon/readiness-repair.js +365 -0
  95. package/dist/heart/daemon/run-hooks.js +2 -0
  96. package/dist/heart/daemon/runtime-logging.js +10 -2
  97. package/dist/heart/daemon/runtime-metadata.js +2 -30
  98. package/dist/heart/daemon/safe-mode.js +161 -0
  99. package/dist/heart/daemon/sense-manager.js +493 -38
  100. package/dist/heart/daemon/session-id-resolver.js +131 -0
  101. package/dist/heart/daemon/skill-management-installer.js +28 -7
  102. package/dist/heart/daemon/socket-client.js +158 -11
  103. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  104. package/dist/heart/daemon/startup-tui.js +330 -0
  105. package/dist/heart/daemon/task-scheduler.js +3 -25
  106. package/dist/heart/daemon/terminal-ui.js +499 -0
  107. package/dist/heart/daemon/thoughts.js +229 -17
  108. package/dist/heart/daemon/up-progress.js +366 -0
  109. package/dist/heart/daemon/vault-items.js +56 -0
  110. package/dist/heart/delegation.js +1 -1
  111. package/dist/heart/habits/habit-migration.js +189 -0
  112. package/dist/heart/habits/habit-parser.js +140 -0
  113. package/dist/heart/habits/habit-runtime-state.js +100 -0
  114. package/dist/heart/habits/habit-scheduler.js +372 -0
  115. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  116. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  117. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  118. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  119. package/dist/heart/identity.js +166 -55
  120. package/dist/heart/kept-notes.js +357 -0
  121. package/dist/heart/kicks.js +1 -1
  122. package/dist/heart/machine-identity.js +161 -0
  123. package/dist/heart/mail-import-discovery.js +353 -0
  124. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  125. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  126. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  127. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  128. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  129. package/dist/heart/mailbox/mailbox-http.js +99 -0
  130. package/dist/heart/mailbox/mailbox-read.js +31 -0
  131. package/dist/heart/mailbox/mailbox-types.js +27 -0
  132. package/dist/heart/mailbox/mailbox-view.js +197 -0
  133. package/dist/heart/mailbox/readers/agent-machine.js +425 -0
  134. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  135. package/dist/heart/mailbox/readers/mail.js +375 -0
  136. package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
  137. package/dist/heart/mailbox/readers/sessions.js +232 -0
  138. package/dist/heart/mailbox/readers/shared.js +111 -0
  139. package/dist/heart/mcp/mcp-server.js +656 -0
  140. package/dist/heart/migrate-config.js +100 -0
  141. package/dist/heart/model-capabilities.js +19 -0
  142. package/dist/heart/platform.js +81 -0
  143. package/dist/heart/provider-attempt.js +134 -0
  144. package/dist/heart/provider-binding-resolver.js +267 -0
  145. package/dist/heart/provider-credentials.js +425 -0
  146. package/dist/heart/provider-failover.js +301 -0
  147. package/dist/heart/provider-models.js +81 -0
  148. package/dist/heart/provider-ping.js +262 -0
  149. package/dist/heart/provider-readiness-cache.js +40 -0
  150. package/dist/heart/provider-visibility.js +188 -0
  151. package/dist/heart/providers/anthropic-token.js +131 -0
  152. package/dist/heart/providers/anthropic.js +139 -52
  153. package/dist/heart/providers/azure.js +23 -11
  154. package/dist/heart/providers/error-classification.js +127 -0
  155. package/dist/heart/providers/github-copilot.js +145 -0
  156. package/dist/heart/providers/minimax-vlm.js +189 -0
  157. package/dist/heart/providers/minimax.js +26 -8
  158. package/dist/heart/providers/openai-codex.js +55 -40
  159. package/dist/heart/runtime-capability-check.js +170 -0
  160. package/dist/heart/runtime-credentials.js +367 -0
  161. package/dist/heart/runtime-cwd.js +87 -0
  162. package/dist/heart/sense-truth.js +13 -4
  163. package/dist/heart/session-activity.js +48 -24
  164. package/dist/heart/session-events.js +1156 -0
  165. package/dist/heart/session-playback-cli-main.js +5 -0
  166. package/dist/heart/session-playback-cli.js +36 -0
  167. package/dist/heart/session-playback.js +231 -0
  168. package/dist/heart/session-stats-cli-main.js +5 -0
  169. package/dist/heart/session-stats.js +182 -0
  170. package/dist/heart/session-transcript.js +133 -0
  171. package/dist/heart/start-of-turn-packet.js +345 -0
  172. package/dist/heart/streaming.js +44 -27
  173. package/dist/heart/sync-classification.js +176 -0
  174. package/dist/heart/sync.js +449 -0
  175. package/dist/heart/target-resolution.js +9 -5
  176. package/dist/heart/tempo.js +93 -0
  177. package/dist/heart/temporal-view.js +41 -0
  178. package/dist/heart/timeouts.js +101 -0
  179. package/dist/heart/tool-activity-callbacks.js +59 -0
  180. package/dist/heart/tool-description.js +143 -0
  181. package/dist/heart/tool-friction.js +55 -0
  182. package/dist/heart/tool-loop.js +200 -0
  183. package/dist/heart/turn-context.js +421 -0
  184. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  185. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  186. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  187. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  188. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  189. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  190. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  191. package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
  192. package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
  193. package/dist/mailbox-ui/index.html +15 -0
  194. package/dist/mailroom/attention.js +167 -0
  195. package/dist/mailroom/autonomy.js +209 -0
  196. package/dist/mailroom/blob-store.js +712 -0
  197. package/dist/mailroom/body-cache.js +61 -0
  198. package/dist/mailroom/core.js +788 -0
  199. package/dist/mailroom/entry.js +160 -0
  200. package/dist/mailroom/file-store.js +460 -0
  201. package/dist/mailroom/mbox-import.js +393 -0
  202. package/dist/mailroom/migration.js +164 -0
  203. package/dist/mailroom/outbound.js +380 -0
  204. package/dist/mailroom/policy.js +263 -0
  205. package/dist/mailroom/reader.js +233 -0
  206. package/dist/mailroom/search-cache.js +268 -0
  207. package/dist/mailroom/search-relevance.js +319 -0
  208. package/dist/mailroom/smtp-ingress.js +176 -0
  209. package/dist/mailroom/source-state.js +176 -0
  210. package/dist/mailroom/thread.js +109 -0
  211. package/dist/mailroom/travel-extract.js +89 -0
  212. package/dist/mind/bundle-manifest.js +7 -1
  213. package/dist/mind/context.js +250 -101
  214. package/dist/mind/diary-integrity.js +60 -0
  215. package/dist/mind/{memory.js → diary.js} +68 -76
  216. package/dist/mind/embedding-provider.js +60 -0
  217. package/dist/mind/file-state.js +179 -0
  218. package/dist/mind/friends/channel.js +39 -0
  219. package/dist/mind/friends/resolver.js +54 -2
  220. package/dist/mind/friends/store-file.js +48 -4
  221. package/dist/mind/friends/types.js +2 -2
  222. package/dist/mind/journal-index.js +162 -0
  223. package/dist/mind/note-search.js +268 -0
  224. package/dist/mind/obligation-steering.js +221 -0
  225. package/dist/mind/pending.js +6 -1
  226. package/dist/mind/prompt-refresh.js +3 -2
  227. package/dist/mind/prompt.js +1051 -135
  228. package/dist/mind/provenance-trust.js +26 -0
  229. package/dist/mind/scrutiny.js +173 -0
  230. package/dist/nerves/cli-logging.js +7 -1
  231. package/dist/nerves/coverage/audit-rules.js +15 -6
  232. package/dist/nerves/coverage/audit.js +28 -2
  233. package/dist/nerves/coverage/cli.js +1 -1
  234. package/dist/nerves/coverage/contract.js +5 -5
  235. package/dist/nerves/coverage/file-completeness.js +129 -5
  236. package/dist/nerves/event-buffer.js +111 -0
  237. package/dist/nerves/index.js +224 -4
  238. package/dist/nerves/observation.js +20 -0
  239. package/dist/nerves/redact.js +79 -0
  240. package/dist/nerves/review/cli-main.js +5 -0
  241. package/dist/nerves/review/cli.js +156 -0
  242. package/dist/nerves/review/core.js +152 -0
  243. package/dist/nerves/runtime.js +5 -1
  244. package/dist/repertoire/ado-client.js +15 -56
  245. package/dist/repertoire/ado-semantic.js +11 -10
  246. package/dist/repertoire/api-client.js +97 -0
  247. package/dist/repertoire/bitwarden-store.js +997 -0
  248. package/dist/repertoire/bundle-templates.js +72 -0
  249. package/dist/repertoire/bw-installer.js +180 -0
  250. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  251. package/dist/repertoire/coding/context-pack.js +331 -0
  252. package/dist/repertoire/coding/feedback.js +197 -30
  253. package/dist/repertoire/coding/manager.js +163 -10
  254. package/dist/repertoire/coding/spawner.js +55 -9
  255. package/dist/repertoire/coding/tools.js +170 -7
  256. package/dist/repertoire/commerce-errors.js +109 -0
  257. package/dist/repertoire/commerce-self-test.js +156 -0
  258. package/dist/repertoire/credential-access.js +178 -0
  259. package/dist/repertoire/duffel-client.js +185 -0
  260. package/dist/repertoire/github-client.js +14 -55
  261. package/dist/repertoire/graph-client.js +11 -52
  262. package/dist/repertoire/guardrails.js +396 -0
  263. package/dist/repertoire/mcp-client.js +295 -0
  264. package/dist/repertoire/mcp-manager.js +362 -0
  265. package/dist/repertoire/mcp-tools.js +63 -0
  266. package/dist/repertoire/shell-sessions.js +133 -0
  267. package/dist/repertoire/skills.js +18 -4
  268. package/dist/repertoire/stripe-client.js +131 -0
  269. package/dist/repertoire/tasks/board.js +31 -5
  270. package/dist/repertoire/tasks/fix.js +182 -0
  271. package/dist/repertoire/tasks/index.js +16 -4
  272. package/dist/repertoire/tasks/lifecycle.js +2 -2
  273. package/dist/repertoire/tasks/parser.js +3 -2
  274. package/dist/repertoire/tasks/scanner.js +194 -37
  275. package/dist/repertoire/tasks/transitions.js +16 -78
  276. package/dist/repertoire/tool-results.js +29 -0
  277. package/dist/repertoire/tools-attachments.js +317 -0
  278. package/dist/repertoire/tools-awaiting.js +365 -0
  279. package/dist/repertoire/tools-base.js +55 -1082
  280. package/dist/repertoire/tools-bluebubbles.js +1 -0
  281. package/dist/repertoire/tools-bridge.js +141 -0
  282. package/dist/repertoire/tools-bundle.js +984 -0
  283. package/dist/repertoire/tools-config.js +185 -0
  284. package/dist/repertoire/tools-continuity.js +248 -0
  285. package/dist/repertoire/tools-credential.js +381 -0
  286. package/dist/repertoire/tools-files.js +342 -0
  287. package/dist/repertoire/tools-flight.js +224 -0
  288. package/dist/repertoire/tools-flow.js +119 -0
  289. package/dist/repertoire/tools-github.js +1 -7
  290. package/dist/repertoire/tools-mail.js +1916 -0
  291. package/dist/repertoire/tools-notes.js +421 -0
  292. package/dist/repertoire/tools-obligations.js +142 -0
  293. package/dist/repertoire/tools-record.js +463 -0
  294. package/dist/repertoire/tools-runtime.js +148 -0
  295. package/dist/repertoire/tools-session.js +781 -0
  296. package/dist/repertoire/tools-shell.js +120 -0
  297. package/dist/repertoire/tools-stripe.js +180 -0
  298. package/dist/repertoire/tools-surface.js +345 -0
  299. package/dist/repertoire/tools-teams.js +9 -39
  300. package/dist/repertoire/tools-travel.js +125 -0
  301. package/dist/repertoire/tools-trip.js +604 -0
  302. package/dist/repertoire/tools-user-profile.js +144 -0
  303. package/dist/repertoire/tools-vault.js +40 -0
  304. package/dist/repertoire/tools-voice.js +144 -0
  305. package/dist/repertoire/tools.js +115 -103
  306. package/dist/repertoire/travel-api-client.js +360 -0
  307. package/dist/repertoire/user-profile.js +131 -0
  308. package/dist/repertoire/vault-setup.js +246 -0
  309. package/dist/repertoire/vault-unlock.js +594 -0
  310. package/dist/scripts/claude-code-hook.js +41 -0
  311. package/dist/scripts/claude-code-stop-hook.js +47 -0
  312. package/dist/senses/attention-queue.js +116 -0
  313. package/dist/senses/await-turn-message.js +58 -0
  314. package/dist/senses/bluebubbles/active-turns.js +216 -0
  315. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  316. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  317. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  318. package/dist/senses/bluebubbles/entry.js +77 -0
  319. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  320. package/dist/senses/bluebubbles/index.js +2613 -0
  321. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  322. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  323. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  324. package/dist/senses/bluebubbles/processed-log.js +133 -0
  325. package/dist/senses/bluebubbles/replay.js +137 -0
  326. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  327. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  328. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  329. package/dist/senses/cli/bracketed-paste.js +82 -0
  330. package/dist/senses/cli/image-paste.js +287 -0
  331. package/dist/senses/cli/image-ref-navigation.js +75 -0
  332. package/dist/senses/cli/ink-app.js +156 -0
  333. package/dist/senses/cli/inline-diff.js +64 -0
  334. package/dist/senses/cli/input-keys.js +174 -0
  335. package/dist/senses/cli/kill-ring.js +86 -0
  336. package/dist/senses/cli/message-list.js +51 -0
  337. package/dist/senses/cli/ouro-tui.js +607 -0
  338. package/dist/senses/cli/spinner-imperative.js +135 -0
  339. package/dist/senses/cli/spinner.js +101 -0
  340. package/dist/senses/cli/status-line.js +60 -0
  341. package/dist/senses/cli/streaming-markdown.js +526 -0
  342. package/dist/senses/cli/tool-display.js +85 -0
  343. package/dist/senses/cli/tool-render.js +85 -0
  344. package/dist/senses/cli/tui-store.js +240 -0
  345. package/dist/senses/cli/virtual-list.js +35 -0
  346. package/dist/senses/cli-entry.js +60 -8
  347. package/dist/senses/cli-layout.js +100 -0
  348. package/dist/senses/cli.js +516 -204
  349. package/dist/senses/commands.js +66 -3
  350. package/dist/senses/habit-turn-message.js +108 -0
  351. package/dist/senses/inner-dialog-worker.js +185 -21
  352. package/dist/senses/inner-dialog.js +469 -39
  353. package/dist/senses/mail-entry.js +66 -0
  354. package/dist/senses/mail.js +379 -0
  355. package/dist/senses/pipeline.js +654 -181
  356. package/dist/senses/proactive-content-guard.js +51 -0
  357. package/dist/senses/shared-turn.js +392 -0
  358. package/dist/senses/surface-tool.js +70 -0
  359. package/dist/senses/teams-entry.js +60 -8
  360. package/dist/senses/teams.js +387 -98
  361. package/dist/senses/trust-gate.js +100 -5
  362. package/dist/senses/voice/audio-playback.js +237 -0
  363. package/dist/senses/voice/audio-routing.js +119 -0
  364. package/dist/senses/voice/elevenlabs.js +202 -0
  365. package/dist/senses/voice/floor-control.js +431 -0
  366. package/dist/senses/voice/floor-controller.js +115 -0
  367. package/dist/senses/voice/golden-path.js +116 -0
  368. package/dist/senses/voice/index.js +29 -0
  369. package/dist/senses/voice/meeting.js +113 -0
  370. package/dist/senses/voice/outbound.js +190 -0
  371. package/dist/senses/voice/phone.js +33 -0
  372. package/dist/senses/voice/playback.js +139 -0
  373. package/dist/senses/voice/realtime-eval.js +496 -0
  374. package/dist/senses/voice/realtime-trace.js +531 -0
  375. package/dist/senses/voice/transcript.js +70 -0
  376. package/dist/senses/voice/turn.js +191 -0
  377. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  378. package/dist/senses/voice/twilio-phone.js +5079 -0
  379. package/dist/senses/voice/types.js +2 -0
  380. package/dist/senses/voice/whisper.js +161 -0
  381. package/dist/senses/voice-entry.js +81 -0
  382. package/dist/senses/voice-realtime-eval-command.js +99 -0
  383. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  384. package/dist/senses/voice-twilio-entry.js +87 -0
  385. package/dist/trips/core.js +138 -0
  386. package/dist/trips/store.js +265 -0
  387. package/package.json +41 -7
  388. package/skills/agent-commerce.md +106 -0
  389. package/skills/browser-navigation.md +117 -0
  390. package/skills/commerce-setup-guide.md +116 -0
  391. package/skills/commerce-setup.md +84 -0
  392. package/skills/configure-dev-tools.md +99 -0
  393. package/skills/travel-planning.md +138 -0
  394. package/dist/heart/daemon/auth-flow.js +0 -351
  395. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  396. package/dist/heart/safe-workspace.js +0 -228
  397. package/dist/heart/session-recall.js +0 -116
  398. package/dist/mind/associative-recall.js +0 -209
  399. package/dist/senses/bluebubbles-entry.js +0 -13
  400. package/dist/senses/bluebubbles.js +0 -1177
  401. package/dist/senses/debug-activity.js +0 -148
  402. package/subagents/README.md +0 -7
  403. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  404. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  405. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  406. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  407. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  408. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  409. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  410. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  411. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  412. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  413. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  414. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  415. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  416. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  417. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  418. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.recordToolDefinitions = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const session_events_1 = require("../heart/session-events");
40
+ const identity_1 = require("../heart/identity");
41
+ const embedding_provider_1 = require("../mind/embedding-provider");
42
+ const note_search_1 = require("../mind/note-search");
43
+ const runtime_1 = require("../nerves/runtime");
44
+ const NOTES_INDEX_VERSION = 1;
45
+ const NOTE_SLUG_MAX_CHARS = 40;
46
+ const DEFAULT_LIMIT = 5;
47
+ const MAX_LIMIT = 25;
48
+ const DEFAULT_MIN_SCORE = 0.5;
49
+ const PREVIEW_CHAR_LIMIT = 500;
50
+ function hasSelfTrust(ctx) {
51
+ const channel = ctx?.context?.channel?.channel;
52
+ if (channel !== "inner")
53
+ return false;
54
+ const friend = ctx?.context?.friend;
55
+ return !friend || friend.id === "self";
56
+ }
57
+ function normalizeTags(value) {
58
+ if (value === undefined || value === null)
59
+ return undefined;
60
+ const rawTags = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
61
+ const tags = rawTags
62
+ .map((tag) => (typeof tag === "string" ? tag.trim() : ""))
63
+ .filter((tag) => tag.length > 0);
64
+ return tags.length > 0 ? tags : undefined;
65
+ }
66
+ function slugForContent(content) {
67
+ const slug = content
68
+ .toLowerCase()
69
+ .replace(/[^a-z0-9]+/g, "-")
70
+ .replace(/^-+|-+$/g, "")
71
+ .slice(0, NOTE_SLUG_MAX_CHARS)
72
+ .replace(/-+$/g, "");
73
+ return slug || "note";
74
+ }
75
+ function renderNote(createdAt, content, tags) {
76
+ const frontmatter = [`created_at: ${createdAt}`];
77
+ if (tags?.length) {
78
+ frontmatter.push("tags:");
79
+ for (const tag of tags) {
80
+ frontmatter.push(` - ${JSON.stringify(tag)}`);
81
+ }
82
+ }
83
+ return `---\n${frontmatter.join("\n")}\n---\n${content}\n`;
84
+ }
85
+ function ensureUniquePath(notesDir, date, slug) {
86
+ let candidate = path.join(notesDir, `${date}-${slug}.md`);
87
+ let suffix = 2;
88
+ while (fs.existsSync(candidate)) {
89
+ const suffixText = `-${suffix}`;
90
+ const cappedSlug = `${slug.slice(0, Math.max(0, NOTE_SLUG_MAX_CHARS - suffixText.length)).replace(/-+$/g, "")}${suffixText}`;
91
+ candidate = path.join(notesDir, `${date}-${cappedSlug}.md`);
92
+ suffix += 1;
93
+ }
94
+ return candidate;
95
+ }
96
+ function extractPreview(body) {
97
+ const firstLine = body.trim().split("\n").find((line) => line.trim().length > 0);
98
+ return (0, session_events_1.capStructuredRecordString)(firstLine.trim()).slice(0, PREVIEW_CHAR_LIMIT);
99
+ }
100
+ function parseTagsFromFrontmatter(lines, startIndex) {
101
+ const tags = [];
102
+ let i = startIndex;
103
+ while (lines[i + 1]?.trimStart().startsWith("- ")) {
104
+ i += 1;
105
+ tags.push(lines[i].trimStart().slice(2).trim().replace(/^"|"$/g, ""));
106
+ }
107
+ return { tags, nextIndex: i };
108
+ }
109
+ function parseCanonicalNote(filePath, stat) {
110
+ const raw = fs.readFileSync(filePath, "utf8");
111
+ let body = raw;
112
+ let createdAt;
113
+ let tags;
114
+ if (raw.startsWith("---\n")) {
115
+ const end = raw.indexOf("\n---\n", 4);
116
+ if (end > 0) {
117
+ const frontmatterRaw = raw.slice(4, end);
118
+ body = raw.slice(end + "\n---\n".length);
119
+ const lines = frontmatterRaw.split("\n");
120
+ for (let i = 0; i < lines.length; i++) {
121
+ const line = lines[i];
122
+ if (!line.trim())
123
+ continue;
124
+ const colonIndex = line.indexOf(":");
125
+ if (colonIndex < 0)
126
+ continue;
127
+ const key = line.slice(0, colonIndex);
128
+ const value = line.slice(colonIndex + 1).trim();
129
+ if (key === "created_at" && value) {
130
+ createdAt = value.replace(/^"|"$/g, "");
131
+ }
132
+ if (key === "tags") {
133
+ if (value.startsWith("[") && value.endsWith("]")) {
134
+ try {
135
+ const parsed = JSON.parse(value);
136
+ tags = parsed.filter((tag) => typeof tag === "string");
137
+ }
138
+ catch {
139
+ tags = undefined;
140
+ }
141
+ }
142
+ else {
143
+ const parsedTags = parseTagsFromFrontmatter(lines, i);
144
+ tags = parsedTags.tags.length > 0 ? parsedTags.tags : undefined;
145
+ i = parsedTags.nextIndex;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ const trimmedBody = body.trim();
152
+ if (!trimmedBody)
153
+ return null;
154
+ return {
155
+ filename: path.basename(filePath),
156
+ filePath,
157
+ body: trimmedBody,
158
+ preview: extractPreview(trimmedBody),
159
+ createdAt,
160
+ tags,
161
+ mtimeMs: stat.mtimeMs,
162
+ size: stat.size,
163
+ };
164
+ }
165
+ function listCanonicalNotes(notesDir) {
166
+ let dirEntries;
167
+ try {
168
+ dirEntries = fs.readdirSync(notesDir, { withFileTypes: true });
169
+ }
170
+ catch {
171
+ return [];
172
+ }
173
+ return dirEntries
174
+ .filter((entry) => entry.isFile() && !entry.name.startsWith(".") && entry.name.endsWith(".md"))
175
+ .map((entry) => {
176
+ const filePath = path.join(notesDir, entry.name);
177
+ try {
178
+ return parseCanonicalNote(filePath, fs.statSync(filePath));
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ })
184
+ .filter((record) => record !== null)
185
+ .sort((left, right) => left.filename.localeCompare(right.filename));
186
+ }
187
+ function readIndex(indexPath) {
188
+ try {
189
+ const parsed = JSON.parse(fs.readFileSync(indexPath, "utf8"));
190
+ if (parsed.version !== NOTES_INDEX_VERSION || !Array.isArray(parsed.entries))
191
+ return null;
192
+ if (!parsed.entries.every(isIndexEntry))
193
+ return null;
194
+ return parsed;
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ }
200
+ function isIndexEntry(value) {
201
+ if (!value || typeof value !== "object")
202
+ return false;
203
+ const entry = value;
204
+ return (typeof entry.filename === "string" &&
205
+ typeof entry.path === "string" &&
206
+ typeof entry.preview === "string" &&
207
+ Array.isArray(entry.embedding) &&
208
+ entry.embedding.every((item) => typeof item === "number") &&
209
+ typeof entry.mtimeMs === "number" &&
210
+ typeof entry.size === "number");
211
+ }
212
+ function entryMatchesRecord(entry, record) {
213
+ return (entry.filename === record.filename &&
214
+ entry.path === record.filePath &&
215
+ entry.mtimeMs === record.mtimeMs &&
216
+ entry.size === record.size &&
217
+ entry.preview === record.preview);
218
+ }
219
+ function indexFreshForRecords(index, records) {
220
+ if (!index)
221
+ return false;
222
+ if (index.entries.length !== records.length)
223
+ return false;
224
+ const recordsByFilename = new Map(records.map((record) => [record.filename, record]));
225
+ const seenFilenames = new Set();
226
+ for (const entry of index.entries) {
227
+ if (seenFilenames.has(entry.filename))
228
+ return false;
229
+ const record = recordsByFilename.get(entry.filename);
230
+ if (!record || !entryMatchesRecord(entry, record))
231
+ return false;
232
+ seenFilenames.add(entry.filename);
233
+ }
234
+ return seenFilenames.size === recordsByFilename.size;
235
+ }
236
+ function indexFreshExcept(index, records, filename) {
237
+ if (!index)
238
+ return false;
239
+ const otherRecords = records.filter((record) => record.filename !== filename);
240
+ const otherEntries = index.entries.filter((entry) => entry.filename !== filename);
241
+ return indexFreshForRecords({ version: NOTES_INDEX_VERSION, entries: otherEntries }, otherRecords);
242
+ }
243
+ function makeEntry(record, embedding) {
244
+ return {
245
+ filename: record.filename,
246
+ path: record.filePath,
247
+ preview: record.preview,
248
+ embedding,
249
+ ...(record.createdAt ? { created_at: record.createdAt } : {}),
250
+ ...(record.tags ? { tags: record.tags } : {}),
251
+ mtimeMs: record.mtimeMs,
252
+ size: record.size,
253
+ };
254
+ }
255
+ function writeIndex(indexPath, index) {
256
+ fs.writeFileSync(indexPath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
257
+ }
258
+ async function embedRecord(provider, record) {
259
+ const [embedding] = await provider.embed([record.body]);
260
+ return makeEntry(record, embedding);
261
+ }
262
+ async function rebuildNotesIndex(notesDir, indexPath, provider) {
263
+ const records = listCanonicalNotes(notesDir);
264
+ const entries = [];
265
+ for (const record of records) {
266
+ entries.push(await embedRecord(provider, record));
267
+ }
268
+ const index = { version: NOTES_INDEX_VERSION, entries };
269
+ writeIndex(indexPath, index);
270
+ (0, runtime_1.emitNervesEvent)({
271
+ component: "repertoire",
272
+ event: "repertoire.record_notes_index_rebuilt",
273
+ message: "notes native index rebuilt",
274
+ meta: { notesDir, count: entries.length },
275
+ });
276
+ return index;
277
+ }
278
+ async function updateIndexForSavedNote(notesDir, indexPath, savedPath, provider) {
279
+ const savedRecord = parseCanonicalNote(savedPath, fs.statSync(savedPath));
280
+ const records = [
281
+ ...listCanonicalNotes(notesDir).filter((record) => record.filePath !== savedPath),
282
+ savedRecord,
283
+ ].sort((left, right) => left.filename.localeCompare(right.filename));
284
+ const existing = readIndex(indexPath);
285
+ if (!indexFreshExcept(existing, records, savedRecord.filename)) {
286
+ await rebuildNotesIndex(notesDir, indexPath, provider);
287
+ return;
288
+ }
289
+ const savedEntry = await embedRecord(provider, savedRecord);
290
+ const entries = [
291
+ ...existing.entries.filter((entry) => entry.filename !== savedRecord.filename),
292
+ savedEntry,
293
+ ].sort((left, right) => left.filename.localeCompare(right.filename));
294
+ writeIndex(indexPath, { version: NOTES_INDEX_VERSION, entries });
295
+ }
296
+ async function getFreshIndex(notesDir, indexPath, provider) {
297
+ const records = listCanonicalNotes(notesDir);
298
+ const existing = readIndex(indexPath);
299
+ if (indexFreshForRecords(existing, records))
300
+ return existing;
301
+ return rebuildNotesIndex(notesDir, indexPath, provider);
302
+ }
303
+ function createProviderForTool(toolName) {
304
+ const provider = (0, embedding_provider_1.createDefaultEmbeddingProvider)();
305
+ if (!provider) {
306
+ return `error: ${toolName} couldn't use notes because embeddings are not configured.`;
307
+ }
308
+ return provider;
309
+ }
310
+ function parseLimit(raw) {
311
+ const parsed = typeof raw === "string" ? Number.parseInt(raw, 10) : typeof raw === "number" ? raw : DEFAULT_LIMIT;
312
+ if (!Number.isFinite(parsed) || parsed <= 0)
313
+ return DEFAULT_LIMIT;
314
+ return Math.min(Math.floor(parsed), MAX_LIMIT);
315
+ }
316
+ function parseMinScore(raw) {
317
+ const parsed = typeof raw === "string" ? Number.parseFloat(raw) : typeof raw === "number" ? raw : DEFAULT_MIN_SCORE;
318
+ if (!Number.isFinite(parsed))
319
+ return DEFAULT_MIN_SCORE;
320
+ return parsed;
321
+ }
322
+ function parseCursor(raw) {
323
+ const parsed = typeof raw === "string" ? Number.parseInt(raw, 10) : typeof raw === "number" ? raw : 0;
324
+ if (!Number.isFinite(parsed) || parsed < 0)
325
+ return 0;
326
+ return Math.floor(parsed);
327
+ }
328
+ exports.recordToolDefinitions = [
329
+ {
330
+ tool: {
331
+ type: "function",
332
+ function: {
333
+ name: "note",
334
+ description: "Write a durable self note as canonical markdown in my notes folder. Only available to my self/inner context, not external callers.",
335
+ parameters: {
336
+ type: "object",
337
+ properties: {
338
+ content: { type: "string" },
339
+ tags: {
340
+ type: "array",
341
+ items: { type: "string" },
342
+ },
343
+ },
344
+ required: ["content"],
345
+ },
346
+ },
347
+ },
348
+ handler: async (args, ctx) => {
349
+ if (!hasSelfTrust(ctx))
350
+ return "error: note requires self trust and cannot be used from an external caller context.";
351
+ const rawArgs = args;
352
+ const content = typeof rawArgs.content === "string" ? rawArgs.content.trim() : "";
353
+ if (!content)
354
+ return "content is required";
355
+ const provider = createProviderForTool("note");
356
+ if (typeof provider === "string")
357
+ return provider;
358
+ const cappedContent = (0, session_events_1.capStructuredRecordString)(content);
359
+ const createdAt = new Date().toISOString();
360
+ const date = createdAt.slice(0, 10);
361
+ const tags = normalizeTags(rawArgs.tags);
362
+ const notesDir = path.join((0, identity_1.getAgentRoot)(), "notes");
363
+ const indexPath = path.join(notesDir, ".index.json");
364
+ try {
365
+ fs.mkdirSync(notesDir, { recursive: true });
366
+ const savedPath = ensureUniquePath(notesDir, date, slugForContent(content));
367
+ fs.writeFileSync(savedPath, renderNote(createdAt, cappedContent, tags), "utf8");
368
+ await updateIndexForSavedNote(notesDir, indexPath, savedPath, provider);
369
+ (0, runtime_1.emitNervesEvent)({
370
+ component: "repertoire",
371
+ event: "repertoire.record_note_saved",
372
+ message: "canonical note saved",
373
+ meta: { path: savedPath, hasTags: Boolean(tags?.length) },
374
+ });
375
+ return savedPath;
376
+ }
377
+ catch (error) {
378
+ (0, runtime_1.emitNervesEvent)({
379
+ level: "warn",
380
+ component: "repertoire",
381
+ event: "repertoire.record_note_save_error",
382
+ message: "canonical note save failed",
383
+ meta: { reason: error instanceof Error ? error.message : String(error) },
384
+ });
385
+ return "error: couldn't save the note right now.";
386
+ }
387
+ },
388
+ summaryKeys: ["content", "tags"],
389
+ },
390
+ {
391
+ tool: {
392
+ type: "function",
393
+ function: {
394
+ name: "consult_notes",
395
+ description: "Search my canonical markdown notes semantically using the notes-native index. Only available to my self/inner context, not external callers.",
396
+ parameters: {
397
+ type: "object",
398
+ properties: {
399
+ query: { type: "string" },
400
+ cursor: { type: "string" },
401
+ limit: { type: "string" },
402
+ minScore: { type: "string" },
403
+ },
404
+ required: ["query"],
405
+ },
406
+ },
407
+ },
408
+ handler: async (args, ctx) => {
409
+ if (!hasSelfTrust(ctx))
410
+ return "error: consult_notes requires self trust and cannot be used from an external caller context.";
411
+ const rawArgs = args;
412
+ const query = typeof rawArgs.query === "string" ? rawArgs.query.trim() : "";
413
+ if (!query)
414
+ return JSON.stringify({ items: [] });
415
+ const notesDir = path.join((0, identity_1.getAgentRoot)(), "notes");
416
+ const indexPath = path.join(notesDir, ".index.json");
417
+ const records = listCanonicalNotes(notesDir);
418
+ if (records.length === 0)
419
+ return JSON.stringify({ items: [] });
420
+ const provider = createProviderForTool("consult_notes");
421
+ if (typeof provider === "string")
422
+ return provider;
423
+ try {
424
+ const index = await getFreshIndex(notesDir, indexPath, provider);
425
+ const [queryEmbedding] = await provider.embed([query]);
426
+ const minScore = parseMinScore(rawArgs.minScore);
427
+ const offset = parseCursor(rawArgs.cursor);
428
+ const limit = parseLimit(rawArgs.limit);
429
+ const ranked = index.entries
430
+ .filter((entry) => entry.embedding.length > 0)
431
+ .map((entry) => ({
432
+ path: entry.path,
433
+ filename: entry.filename,
434
+ excerpt: entry.preview,
435
+ score: (0, note_search_1.cosineSimilarity)(queryEmbedding, entry.embedding),
436
+ }))
437
+ .filter((entry) => entry.score >= minScore)
438
+ .sort((left, right) => right.score - left.score);
439
+ const items = ranked.slice(offset, offset + limit);
440
+ const nextOffset = offset + limit;
441
+ const result = nextOffset < ranked.length ? { items, nextCursor: String(nextOffset) } : { items };
442
+ (0, runtime_1.emitNervesEvent)({
443
+ component: "repertoire",
444
+ event: "repertoire.record_notes_consulted",
445
+ message: "canonical notes consulted",
446
+ meta: { count: items.length, totalMatches: ranked.length },
447
+ });
448
+ return JSON.stringify(result);
449
+ }
450
+ catch (error) {
451
+ (0, runtime_1.emitNervesEvent)({
452
+ level: "warn",
453
+ component: "repertoire",
454
+ event: "repertoire.record_notes_consult_error",
455
+ message: "canonical notes consult failed",
456
+ meta: { reason: error instanceof Error ? error.message : String(error) },
457
+ });
458
+ return "error: consult_notes couldn't search notes right now.";
459
+ }
460
+ },
461
+ summaryKeys: ["query"],
462
+ },
463
+ ];
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runtimeToolDefinitions = void 0;
4
+ const identity_1 = require("../heart/identity");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ const socket_client_1 = require("../heart/daemon/socket-client");
7
+ async function restartRuntime(args, agentName) {
8
+ if (typeof args.reason !== "string" || args.reason.trim().length === 0) {
9
+ return JSON.stringify({ error: "reason is required (one-line audit string)" });
10
+ }
11
+ const reason = args.reason.trim();
12
+ (0, runtime_1.emitNervesEvent)({
13
+ component: "repertoire",
14
+ event: "repertoire.runtime_restart_requested",
15
+ message: "agent requested runtime restart",
16
+ meta: { agent: agentName, reason },
17
+ });
18
+ try {
19
+ const response = await (0, socket_client_1.sendDaemonCommand)(socket_client_1.DEFAULT_DAEMON_SOCKET_PATH, {
20
+ kind: "daemon.restart",
21
+ reason,
22
+ requestedBy: agentName,
23
+ });
24
+ return JSON.stringify({
25
+ requested: true,
26
+ reason,
27
+ detail: response.message ?? "daemon restart requested",
28
+ });
29
+ }
30
+ catch (error) {
31
+ return JSON.stringify({
32
+ error: "failed to reach daemon socket",
33
+ detail: error instanceof Error ? error.message : String(error),
34
+ });
35
+ }
36
+ }
37
+ async function reviveSense(args, agentName) {
38
+ if (args.agent !== undefined) {
39
+ return "cross-agent revive is unsupported; revive_sense can only revive this agent's own senses.";
40
+ }
41
+ if (typeof args.sense !== "string" || args.sense.trim().length === 0) {
42
+ return JSON.stringify({ error: "sense is required (for example, 'bluebubbles')" });
43
+ }
44
+ if (typeof args.reason !== "string" || args.reason.trim().length === 0) {
45
+ return JSON.stringify({ error: "reason is required (one-line audit string)" });
46
+ }
47
+ const sense = args.sense.trim();
48
+ const reason = args.reason.trim();
49
+ (0, runtime_1.emitNervesEvent)({
50
+ component: "repertoire",
51
+ event: "repertoire.sense_revive_requested",
52
+ message: "agent requested sense revive",
53
+ meta: { agent: agentName, sense, reason },
54
+ });
55
+ try {
56
+ const response = await (0, socket_client_1.sendDaemonCommand)(socket_client_1.DEFAULT_DAEMON_SOCKET_PATH, {
57
+ kind: "daemon.sense_revive",
58
+ agent: agentName,
59
+ sense,
60
+ reason,
61
+ });
62
+ if (!response.ok) {
63
+ if (response.error === "Unknown daemon command kind 'daemon.sense_revive'.") {
64
+ return JSON.stringify({
65
+ error: "daemon does not support this command; try restart_runtime",
66
+ detail: response.error,
67
+ agent: agentName,
68
+ sense,
69
+ });
70
+ }
71
+ return JSON.stringify({
72
+ error: response.error ?? "daemon failed to revive sense",
73
+ agent: agentName,
74
+ sense,
75
+ });
76
+ }
77
+ return JSON.stringify({
78
+ revived: true,
79
+ agent: agentName,
80
+ sense,
81
+ detail: response.message ?? "sense revive requested",
82
+ snapshot: response.data,
83
+ });
84
+ }
85
+ catch (error) {
86
+ return JSON.stringify({
87
+ error: "failed to reach daemon socket",
88
+ detail: error instanceof Error ? error.message : String(error),
89
+ agent: agentName,
90
+ sense,
91
+ });
92
+ }
93
+ }
94
+ exports.runtimeToolDefinitions = [
95
+ {
96
+ tool: {
97
+ type: "function",
98
+ function: {
99
+ name: "restart_runtime",
100
+ description: "ask my runtime (the daemon hosting me) to restart itself. for when something is wedged — stale state, recovery queue jammed, version mismatch, or i just need a fresh boot. under launchctl the daemon auto-respawns, so i come back on the other side with a clean slate. takes a one-line reason that lands in the audit log. i will NOT see this tool's response — my process exits with the daemon and i wake up fresh.",
101
+ parameters: {
102
+ type: "object",
103
+ properties: {
104
+ reason: {
105
+ type: "string",
106
+ description: "one-line audit reason (e.g. 'bluebubbles recovery queue wedged for 4h', 'picking up daemon version update').",
107
+ },
108
+ },
109
+ required: ["reason"],
110
+ },
111
+ },
112
+ },
113
+ handler: async (args) => {
114
+ const agentName = (0, identity_1.getAgentName)();
115
+ return restartRuntime({ reason: args.reason }, agentName);
116
+ },
117
+ },
118
+ {
119
+ tool: {
120
+ type: "function",
121
+ function: {
122
+ name: "revive_sense",
123
+ description: "revive one of my managed senses after it has wedged or landed in permanent failure. this only works for my own senses, requires family trust, and sends the daemon a one-line reason for the audit log. use restart_runtime instead if the daemon is too old to support sense-level revive.",
124
+ parameters: {
125
+ type: "object",
126
+ properties: {
127
+ sense: {
128
+ type: "string",
129
+ description: "managed sense name to revive, for example 'bluebubbles'.",
130
+ },
131
+ reason: {
132
+ type: "string",
133
+ description: "one-line audit reason for the revive request.",
134
+ },
135
+ },
136
+ required: ["sense", "reason"],
137
+ },
138
+ },
139
+ },
140
+ handler: async (args, ctx) => {
141
+ if (ctx?.context?.friend?.trustLevel !== "family") {
142
+ return "revive_sense requires family trust before I can revive runtime senses.";
143
+ }
144
+ const agentName = (0, identity_1.getAgentName)();
145
+ return reviveSense({ agent: args.agent, sense: args.sense, reason: args.reason }, agentName);
146
+ },
147
+ },
148
+ ];