@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550

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 (386) hide show
  1. package/README.md +133 -19
  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-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3555 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +758 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,1085 +1,57 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.finalAnswerTool = exports.tools = exports.baseToolDefinitions = exports.editFileReadTracker = void 0;
37
- const fs = __importStar(require("fs"));
38
- const fg = __importStar(require("fast-glob"));
39
- const child_process_1 = require("child_process");
40
- const path = __importStar(require("path"));
41
- const skills_1 = require("./skills");
42
- const config_1 = require("../heart/config");
43
- const runtime_1 = require("../nerves/runtime");
44
- const identity_1 = require("../heart/identity");
45
- const socket_client_1 = require("../heart/daemon/socket-client");
46
- const thoughts_1 = require("../heart/daemon/thoughts");
47
- const manager_1 = require("../heart/bridges/manager");
48
- const session_recall_1 = require("../heart/session-recall");
3
+ exports.tools = exports.baseToolDefinitions = exports.editFileReadTracker = exports.renderInnerProgressStatus = exports.speakTool = exports.restTool = exports.settleTool = exports.observeTool = exports.ponderTool = void 0;
4
+ const tools_files_1 = require("./tools-files");
5
+ const tools_shell_1 = require("./tools-shell");
6
+ const tools_notes_1 = require("./tools-notes");
7
+ const tools_bridge_1 = require("./tools-bridge");
8
+ const tools_session_1 = require("./tools-session");
9
+ const tools_continuity_1 = require("./tools-continuity");
10
+ const tools_config_1 = require("./tools-config");
49
11
  const tools_1 = require("./coding/tools");
50
- const memory_1 = require("../mind/memory");
51
- const pending_1 = require("../mind/pending");
52
- const progress_story_1 = require("../heart/progress-story");
53
- const cross_chat_delivery_1 = require("../heart/cross-chat-delivery");
12
+ const tools_credential_1 = require("./tools-credential");
13
+ const tools_vault_1 = require("./tools-vault");
14
+ const tools_travel_1 = require("./tools-travel");
15
+ const tools_user_profile_1 = require("./tools-user-profile");
16
+ const tools_stripe_1 = require("./tools-stripe");
17
+ const tools_flight_1 = require("./tools-flight");
18
+ const tools_attachments_1 = require("./tools-attachments");
19
+ const tools_mail_1 = require("./tools-mail");
20
+ const tools_trip_1 = require("./tools-trip");
21
+ // Re-export flow tools for consumers that import them from tools-base
22
+ var tools_flow_1 = require("./tools-flow");
23
+ Object.defineProperty(exports, "ponderTool", { enumerable: true, get: function () { return tools_flow_1.ponderTool; } });
24
+ Object.defineProperty(exports, "observeTool", { enumerable: true, get: function () { return tools_flow_1.observeTool; } });
25
+ Object.defineProperty(exports, "settleTool", { enumerable: true, get: function () { return tools_flow_1.settleTool; } });
26
+ Object.defineProperty(exports, "restTool", { enumerable: true, get: function () { return tools_flow_1.restTool; } });
27
+ Object.defineProperty(exports, "speakTool", { enumerable: true, get: function () { return tools_flow_1.speakTool; } });
28
+ // Re-export renderInnerProgressStatus for consumers
29
+ var tools_session_2 = require("./tools-session");
30
+ Object.defineProperty(exports, "renderInnerProgressStatus", { enumerable: true, get: function () { return tools_session_2.renderInnerProgressStatus; } });
54
31
  // Tracks which file paths have been read via read_file in this session.
55
32
  // edit_file requires a file to be read first (must-read-first guard).
56
33
  exports.editFileReadTracker = new Set();
57
- function buildContextDiff(lines, changeStart, changeEnd, contextSize = 3) {
58
- const start = Math.max(0, changeStart - contextSize);
59
- const end = Math.min(lines.length, changeEnd + contextSize);
60
- const result = [];
61
- for (let i = start; i < end; i++) {
62
- const lineNum = i + 1;
63
- const prefix = (i >= changeStart && i < changeEnd) ? ">" : " ";
64
- result.push(`${prefix} ${lineNum} | ${lines[i]}`);
65
- }
66
- return result.join("\n");
67
- }
68
- const NO_SESSION_FOUND_MESSAGE = "no session found for that friend/channel/key combination.";
69
- const EMPTY_SESSION_MESSAGE = "session exists but has no non-system messages.";
70
- function findDelegatingBridgeId(ctx) {
71
- const currentSession = ctx?.currentSession;
72
- if (!currentSession)
73
- return undefined;
74
- return ctx?.activeBridges?.find((bridge) => bridge.lifecycle === "active"
75
- && bridge.attachedSessions.some((session) => session.friendId === currentSession.friendId
76
- && session.channel === currentSession.channel
77
- && session.key === currentSession.key))?.id;
78
- }
79
- async function recallSessionSafely(options) {
80
- try {
81
- return await (0, session_recall_1.recallSession)(options);
82
- }
83
- catch (error) {
84
- if (options.summarize) {
85
- (0, runtime_1.emitNervesEvent)({
86
- component: "daemon",
87
- event: "daemon.session_recall_summary_fallback",
88
- message: "session recall summarization failed; using raw transcript",
89
- meta: {
90
- friendId: options.friendId,
91
- channel: options.channel,
92
- key: options.key,
93
- error: error instanceof Error ? error.message : String(error),
94
- },
95
- });
96
- try {
97
- return await (0, session_recall_1.recallSession)({
98
- ...options,
99
- summarize: undefined,
100
- });
101
- }
102
- catch {
103
- return { kind: "missing" };
104
- }
105
- }
106
- return { kind: "missing" };
107
- }
108
- }
109
- function normalizeProgressOutcome(text) {
110
- const trimmed = text.trim();
111
- if (!trimmed || trimmed === "nothing yet" || trimmed === "nothing recent") {
112
- return null;
113
- }
114
- if (trimmed.startsWith("\"") && trimmed.endsWith("\"") && trimmed.length >= 2) {
115
- return trimmed.slice(1, -1);
116
- }
117
- return trimmed;
118
- }
119
- function writePendingEnvelope(queueDir, message) {
120
- fs.mkdirSync(queueDir, { recursive: true });
121
- const fileName = `${message.timestamp}-${Math.random().toString(36).slice(2, 10)}.json`;
122
- const filePath = path.join(queueDir, fileName);
123
- fs.writeFileSync(filePath, JSON.stringify(message, null, 2));
124
- }
125
- function renderCrossChatDeliveryStatus(target, result) {
126
- const phase = result.status === "delivered_now"
127
- ? "completed"
128
- : result.status === "queued_for_later"
129
- ? "queued"
130
- : result.status === "blocked"
131
- ? "blocked"
132
- : "errored";
133
- const lead = result.status === "delivered_now"
134
- ? "delivered now"
135
- : result.status === "queued_for_later"
136
- ? "queued for later"
137
- : result.status === "blocked"
138
- ? "blocked"
139
- : "failed";
140
- return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
141
- scope: "shared-work",
142
- phase,
143
- objective: `message to ${target}`,
144
- outcomeText: `${lead}\n${result.detail}`,
145
- }));
146
- }
147
- function renderInnerProgressStatus(status) {
148
- if (status.processing === "pending") {
149
- return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
150
- scope: "inner-delegation",
151
- phase: "queued",
152
- objective: status.queue,
153
- outcomeText: `wake: ${status.wake}`,
154
- }));
155
- }
156
- if (status.processing === "started") {
157
- return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
158
- scope: "inner-delegation",
159
- phase: "processing",
160
- outcomeText: `wake: ${status.wake}`,
161
- }));
162
- }
163
- const completedOutcome = normalizeProgressOutcome(status.surfaced) ?? status.surfaced;
164
- return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
165
- scope: "inner-delegation",
166
- phase: "completed",
167
- objective: null,
168
- outcomeText: completedOutcome,
169
- }));
170
- }
34
+ // Combined base tool definitions assembled from category modules.
35
+ // Order preserved: files, shell, notes, bridge, session, continuity, config, coding.
171
36
  exports.baseToolDefinitions = [
172
- {
173
- tool: {
174
- type: "function",
175
- function: {
176
- name: "read_file",
177
- description: "read file contents",
178
- parameters: {
179
- type: "object",
180
- properties: {
181
- path: { type: "string" },
182
- offset: { type: "number", description: "1-based line number to start reading from" },
183
- limit: { type: "number", description: "maximum number of lines to return" },
184
- },
185
- required: ["path"],
186
- },
187
- },
188
- },
189
- handler: (a) => {
190
- const content = fs.readFileSync(a.path, "utf-8");
191
- exports.editFileReadTracker.add(a.path);
192
- const offset = a.offset ? parseInt(a.offset, 10) : undefined;
193
- const limit = a.limit ? parseInt(a.limit, 10) : undefined;
194
- if (offset === undefined && limit === undefined)
195
- return content;
196
- const lines = content.split("\n");
197
- const start = offset ? offset - 1 : 0;
198
- const end = limit !== undefined ? start + limit : lines.length;
199
- return lines.slice(start, end).join("\n");
200
- },
201
- },
202
- {
203
- tool: {
204
- type: "function",
205
- function: {
206
- name: "write_file",
207
- description: "write content to file",
208
- parameters: {
209
- type: "object",
210
- properties: { path: { type: "string" }, content: { type: "string" } },
211
- required: ["path", "content"],
212
- },
213
- },
214
- },
215
- handler: (a) => {
216
- fs.mkdirSync(path.dirname(a.path), { recursive: true });
217
- fs.writeFileSync(a.path, a.content, "utf-8");
218
- return "ok";
219
- },
220
- },
221
- {
222
- tool: {
223
- type: "function",
224
- function: {
225
- name: "edit_file",
226
- description: "surgically edit a file by replacing an exact string. the file must have been read via read_file first. old_string must match exactly one location in the file.",
227
- parameters: {
228
- type: "object",
229
- properties: {
230
- path: { type: "string" },
231
- old_string: { type: "string" },
232
- new_string: { type: "string" },
233
- },
234
- required: ["path", "old_string", "new_string"],
235
- },
236
- },
237
- },
238
- handler: (a) => {
239
- if (!exports.editFileReadTracker.has(a.path)) {
240
- return `error: you must read the file with read_file before editing it. call read_file on ${a.path} first.`;
241
- }
242
- let content;
243
- try {
244
- content = fs.readFileSync(a.path, "utf-8");
245
- }
246
- catch (e) {
247
- return `error: could not read file: ${e instanceof Error ? e.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(e)}`;
248
- }
249
- // Count occurrences
250
- const occurrences = [];
251
- let searchFrom = 0;
252
- while (true) {
253
- const idx = content.indexOf(a.old_string, searchFrom);
254
- if (idx === -1)
255
- break;
256
- occurrences.push(idx);
257
- searchFrom = idx + 1;
258
- }
259
- if (occurrences.length === 0) {
260
- return `error: old_string not found in ${a.path}`;
261
- }
262
- if (occurrences.length > 1) {
263
- return `error: old_string is ambiguous -- found ${occurrences.length} matches in ${a.path}. provide more context to make the match unique.`;
264
- }
265
- // Single unique match -- replace
266
- const idx = occurrences[0];
267
- const updated = content.slice(0, idx) + a.new_string + content.slice(idx + a.old_string.length);
268
- fs.writeFileSync(a.path, updated, "utf-8");
269
- // Build contextual diff
270
- const lines = updated.split("\n");
271
- const prefixLines = content.slice(0, idx).split("\n");
272
- const changeStartLine = prefixLines.length - 1;
273
- const newStringLines = a.new_string.split("\n");
274
- const changeEndLine = changeStartLine + newStringLines.length;
275
- return buildContextDiff(lines, changeStartLine, changeEndLine);
276
- },
277
- },
278
- {
279
- tool: {
280
- type: "function",
281
- function: {
282
- name: "glob",
283
- description: "find files matching a glob pattern. returns matching paths sorted alphabetically, one per line.",
284
- parameters: {
285
- type: "object",
286
- properties: {
287
- pattern: { type: "string", description: "glob pattern (e.g. **/*.ts)" },
288
- cwd: { type: "string", description: "directory to search from (defaults to process.cwd())" },
289
- },
290
- required: ["pattern"],
291
- },
292
- },
293
- },
294
- handler: (a) => {
295
- const cwd = a.cwd || process.cwd();
296
- const matches = fg.globSync(a.pattern, { cwd, dot: true });
297
- return matches.sort().join("\n");
298
- },
299
- },
300
- {
301
- tool: {
302
- type: "function",
303
- function: {
304
- name: "grep",
305
- description: "search file contents for lines matching a regex pattern. searches recursively when given a directory. returns matching lines with file path and line numbers.",
306
- parameters: {
307
- type: "object",
308
- properties: {
309
- pattern: { type: "string", description: "regex pattern to search for" },
310
- path: { type: "string", description: "file or directory to search" },
311
- context_lines: { type: "number", description: "number of surrounding context lines (default 0)" },
312
- include: { type: "string", description: "glob filter to limit searched files (e.g. *.ts)" },
313
- },
314
- required: ["pattern", "path"],
315
- },
316
- },
317
- },
318
- handler: (a) => {
319
- const targetPath = a.path;
320
- const regex = new RegExp(a.pattern);
321
- const contextLines = parseInt(a.context_lines || "0", 10);
322
- const includeGlob = a.include || undefined;
323
- function searchFile(filePath) {
324
- let content;
325
- try {
326
- content = fs.readFileSync(filePath, "utf-8");
327
- }
328
- catch {
329
- return [];
330
- }
331
- const lines = content.split("\n");
332
- const matchIndices = new Set();
333
- for (let i = 0; i < lines.length; i++) {
334
- if (regex.test(lines[i])) {
335
- matchIndices.add(i);
336
- }
337
- }
338
- if (matchIndices.size === 0)
339
- return [];
340
- const outputIndices = new Set();
341
- for (const idx of matchIndices) {
342
- const start = Math.max(0, idx - contextLines);
343
- const end = Math.min(lines.length - 1, idx + contextLines);
344
- for (let i = start; i <= end; i++) {
345
- outputIndices.add(i);
346
- }
347
- }
348
- const sortedIndices = [...outputIndices].sort((a, b) => a - b);
349
- const results = [];
350
- for (const idx of sortedIndices) {
351
- const lineNum = idx + 1;
352
- if (matchIndices.has(idx)) {
353
- results.push(`${filePath}:${lineNum}: ${lines[idx]}`);
354
- }
355
- else {
356
- results.push(`-${filePath}:${lineNum}: ${lines[idx]}`);
357
- }
358
- }
359
- return results;
360
- }
361
- function collectFiles(dirPath) {
362
- const files = [];
363
- function walk(dir) {
364
- let entries;
365
- try {
366
- entries = fs.readdirSync(dir, { withFileTypes: true });
367
- }
368
- catch {
369
- return;
370
- }
371
- for (const entry of entries) {
372
- const fullPath = path.join(dir, entry.name);
373
- if (entry.isDirectory()) {
374
- walk(fullPath);
375
- }
376
- else if (entry.isFile()) {
377
- files.push(fullPath);
378
- }
379
- }
380
- }
381
- walk(dirPath);
382
- return files.sort();
383
- }
384
- function matchesGlob(filePath, glob) {
385
- const escaped = glob
386
- .replace(/[.+^${}()|[\]\\]/g, "\\$&")
387
- .replace(/\*/g, ".*")
388
- .replace(/\?/g, ".");
389
- return new RegExp(`(^|/)${escaped}$`).test(filePath);
390
- }
391
- const stat = fs.statSync(targetPath, { throwIfNoEntry: false });
392
- if (!stat)
393
- return "";
394
- if (stat.isFile()) {
395
- return searchFile(targetPath).join("\n");
396
- }
397
- let files = collectFiles(targetPath);
398
- if (includeGlob) {
399
- files = files.filter((f) => matchesGlob(f, includeGlob));
400
- }
401
- const allResults = [];
402
- for (const file of files) {
403
- allResults.push(...searchFile(file));
404
- }
405
- return allResults.join("\n");
406
- },
407
- },
408
- {
409
- tool: {
410
- type: "function",
411
- function: {
412
- name: "shell",
413
- description: "run shell command",
414
- parameters: {
415
- type: "object",
416
- properties: { command: { type: "string" } },
417
- required: ["command"],
418
- },
419
- },
420
- },
421
- handler: (a) => (0, child_process_1.execSync)(a.command, { encoding: "utf-8", timeout: 30000 }),
422
- },
423
- {
424
- tool: {
425
- type: "function",
426
- function: {
427
- name: "list_skills",
428
- description: "list all available skills",
429
- parameters: { type: "object", properties: {} },
430
- },
431
- },
432
- handler: () => JSON.stringify((0, skills_1.listSkills)()),
433
- },
434
- {
435
- tool: {
436
- type: "function",
437
- function: {
438
- name: "load_skill",
439
- description: "load a skill by name, returns its content",
440
- parameters: {
441
- type: "object",
442
- properties: { name: { type: "string" } },
443
- required: ["name"],
444
- },
445
- },
446
- },
447
- handler: (a) => {
448
- try {
449
- return (0, skills_1.loadSkill)(a.name);
450
- }
451
- catch (e) {
452
- return `error: ${e}`;
453
- }
454
- },
455
- },
456
- {
457
- tool: {
458
- type: "function",
459
- function: {
460
- name: "claude",
461
- description: "use claude code to query this codebase or get an outside perspective. useful for code review, second opinions, and asking questions about your own source.",
462
- parameters: {
463
- type: "object",
464
- properties: { prompt: { type: "string" } },
465
- required: ["prompt"],
466
- },
467
- },
468
- },
469
- handler: (a) => {
470
- try {
471
- const result = (0, child_process_1.spawnSync)("claude", ["-p", "--no-session-persistence", "--dangerously-skip-permissions", "--add-dir", "."], {
472
- input: a.prompt,
473
- encoding: "utf-8",
474
- timeout: 60000,
475
- });
476
- if (result.error)
477
- return `error: ${result.error}`;
478
- if (result.status !== 0)
479
- return `claude exited with code ${result.status}: ${result.stderr}`;
480
- return result.stdout || "(no output)";
481
- }
482
- catch (e) {
483
- return `error: ${e}`;
484
- }
485
- },
486
- },
487
- {
488
- tool: {
489
- type: "function",
490
- function: {
491
- name: "web_search",
492
- description: "search the web using perplexity. returns ranked results with titles, urls, and snippets",
493
- parameters: {
494
- type: "object",
495
- properties: { query: { type: "string" } },
496
- required: ["query"],
497
- },
498
- },
499
- },
500
- handler: async (a) => {
501
- try {
502
- const key = (0, config_1.getIntegrationsConfig)().perplexityApiKey;
503
- if (!key)
504
- return "error: perplexityApiKey not configured in secrets.json";
505
- const res = await fetch("https://api.perplexity.ai/search", {
506
- method: "POST",
507
- headers: {
508
- Authorization: `Bearer ${key}`,
509
- "Content-Type": "application/json",
510
- },
511
- body: JSON.stringify({ query: a.query, max_results: 5 }),
512
- });
513
- if (!res.ok)
514
- return `error: ${res.status} ${res.statusText}`;
515
- const data = (await res.json());
516
- if (!data.results?.length)
517
- return "no results found";
518
- return data.results
519
- .map((r) => `${r.title}\n${r.url}\n${r.snippet}`)
520
- .join("\n\n");
521
- }
522
- catch (e) {
523
- return `error: ${e}`;
524
- }
525
- },
526
- },
527
- {
528
- tool: {
529
- type: "function",
530
- function: {
531
- name: "memory_search",
532
- description: "search remembered facts stored in psyche memory and return relevant matches for a query",
533
- parameters: {
534
- type: "object",
535
- properties: { query: { type: "string" } },
536
- required: ["query"],
537
- },
538
- },
539
- },
540
- handler: async (a) => {
541
- try {
542
- const query = (a.query || "").trim();
543
- if (!query)
544
- return "query is required";
545
- const memoryRoot = path.join((0, identity_1.getAgentRoot)(), "psyche", "memory");
546
- const hits = await (0, memory_1.searchMemoryFacts)(query, (0, memory_1.readMemoryFacts)(memoryRoot));
547
- return hits
548
- .map((fact) => `- ${fact.text} (source=${fact.source}, createdAt=${fact.createdAt})`)
549
- .join("\n");
550
- }
551
- catch (e) {
552
- return `error: ${e instanceof Error ? e.message : String(e)}`;
553
- }
554
- },
555
- },
556
- {
557
- tool: {
558
- type: "function",
559
- function: {
560
- name: "memory_save",
561
- description: "save a general memory fact i want to recall later. optional 'about' can tag the fact to a person/topic/context",
562
- parameters: {
563
- type: "object",
564
- properties: {
565
- text: { type: "string" },
566
- about: { type: "string" },
567
- },
568
- required: ["text"],
569
- },
570
- },
571
- },
572
- handler: async (a) => {
573
- const text = (a.text || "").trim();
574
- if (!text)
575
- return "text is required";
576
- const result = await (0, memory_1.saveMemoryFact)({
577
- text,
578
- source: "tool:memory_save",
579
- about: typeof a.about === "string" ? a.about : undefined,
580
- });
581
- return `saved memory fact (added=${result.added}, skipped=${result.skipped})`;
582
- },
583
- },
584
- {
585
- tool: {
586
- type: "function",
587
- function: {
588
- name: "get_friend_note",
589
- description: "read a specific friend record by friend id. use this when i need notes/context about someone not currently active",
590
- parameters: {
591
- type: "object",
592
- properties: {
593
- friendId: { type: "string" },
594
- },
595
- required: ["friendId"],
596
- },
597
- },
598
- },
599
- handler: async (a, ctx) => {
600
- const friendId = (a.friendId || "").trim();
601
- if (!friendId)
602
- return "friendId is required";
603
- if (!ctx?.friendStore)
604
- return "i can't read friend notes -- friend store not available";
605
- const friend = await ctx.friendStore.get(friendId);
606
- if (!friend)
607
- return `friend not found: ${friendId}`;
608
- return JSON.stringify(friend, null, 2);
609
- },
610
- },
611
- {
612
- tool: {
613
- type: "function",
614
- function: {
615
- name: "save_friend_note",
616
- description: "save something i learned about my friend. use type 'name' to update their display name, 'tool_preference' for how they like a specific tool to behave (key = tool category like 'ado', 'graph'), or 'note' for general knowledge (key = topic). when updating an existing value, set override to true if i'm replacing/correcting it. omit override (or set false) if i'm unsure and want to check what's already saved.",
617
- parameters: {
618
- type: "object",
619
- properties: {
620
- type: { type: "string", enum: ["name", "tool_preference", "note"], description: "what kind of information to save" },
621
- key: { type: "string", description: "category key (required for tool_preference and note, e.g. 'ado', 'role')" },
622
- content: { type: "string", description: "the value to save" },
623
- override: { type: "string", enum: ["true", "false"], description: "set to 'true' to overwrite an existing value" },
624
- },
625
- required: ["type", "content"],
626
- },
627
- },
628
- },
629
- handler: async (a, ctx) => {
630
- (0, runtime_1.emitNervesEvent)({
631
- component: "repertoire",
632
- event: "repertoire.save_friend_note",
633
- message: "save friend note invoked",
634
- meta: { type: a.type },
635
- });
636
- if (!ctx?.context) {
637
- return "i can't save notes -- no friend context available";
638
- }
639
- if (!ctx.friendStore) {
640
- return "i can't save notes -- friend store not available";
641
- }
642
- const friendId = ctx.context.friend?.id;
643
- if (!friendId)
644
- return "i can't save notes -- no friend identity available";
645
- // Validate parameters
646
- if (!a.content)
647
- return "i need a content value to save";
648
- const validTypes = ["name", "tool_preference", "note"];
649
- if (!validTypes.includes(a.type))
650
- return `i don't recognize type '${a.type}' -- use name, tool_preference, or note`;
651
- if ((a.type === "tool_preference" || a.type === "note") && !a.key)
652
- return "i need a key for tool_preference or note type";
653
- try {
654
- // Read fresh record from disk
655
- const record = await ctx.friendStore.get(friendId);
656
- if (!record)
657
- return "i can't find the friend record on disk";
658
- const isOverride = a.override === "true";
659
- if (a.type === "name") {
660
- const updated = { ...record, name: a.content, updatedAt: new Date().toISOString() };
661
- await ctx.friendStore.put(friendId, updated);
662
- return `saved: name = ${a.content}`;
663
- }
664
- if (a.type === "tool_preference") {
665
- const existing = record.toolPreferences[a.key];
666
- if (existing && !isOverride) {
667
- return `i already have a preference for '${a.key}': "${existing}". if you want to replace it, call again with override: true. or merge both values into content and override.`;
668
- }
669
- const updated = { ...record, toolPreferences: { ...record.toolPreferences, [a.key]: a.content }, updatedAt: new Date().toISOString() };
670
- await ctx.friendStore.put(friendId, updated);
671
- return `saved: toolPreference ${a.key} = ${a.content}`;
672
- }
673
- // type === "note"
674
- // Redirect "name" key to name field
675
- if (a.key === "name") {
676
- const updated = { ...record, name: a.content, updatedAt: new Date().toISOString() };
677
- await ctx.friendStore.put(friendId, updated);
678
- return `updated friend's name to '${a.content}' (stored as name, not a note)`;
679
- }
680
- const existing = record.notes[a.key];
681
- if (existing && !isOverride) {
682
- return `i already have a note for '${a.key}': "${existing.value}". if you want to replace it, call again with override: true. or merge both values into content and override.`;
683
- }
684
- const updated = { ...record, notes: { ...record.notes, [a.key]: { value: a.content, savedAt: new Date().toISOString() } }, updatedAt: new Date().toISOString() };
685
- await ctx.friendStore.put(friendId, updated);
686
- return `saved: note ${a.key} = ${a.content}`;
687
- }
688
- catch (err) {
689
- /* v8 ignore next -- defensive: non-Error branch for String(err) @preserve */
690
- return `error saving note: ${err instanceof Error ? err.message : String(err)}`;
691
- }
692
- },
693
- },
694
- // -- cross-session awareness --
695
- {
696
- tool: {
697
- type: "function",
698
- function: {
699
- name: "bridge_manage",
700
- description: "create and manage shared live-work bridges across already-active sessions.",
701
- parameters: {
702
- type: "object",
703
- properties: {
704
- action: {
705
- type: "string",
706
- enum: ["begin", "attach", "status", "promote_task", "complete", "cancel"],
707
- },
708
- bridgeId: { type: "string", description: "bridge id for all actions except begin" },
709
- objective: { type: "string", description: "objective for begin" },
710
- summary: { type: "string", description: "optional concise shared-work summary" },
711
- friendId: { type: "string", description: "target friend id for attach" },
712
- channel: { type: "string", description: "target channel for attach" },
713
- key: { type: "string", description: "target session key for attach (defaults to 'session')" },
714
- title: { type: "string", description: "task title override for promote_task" },
715
- category: { type: "string", description: "task category override for promote_task" },
716
- body: { type: "string", description: "task body override for promote_task" },
717
- },
718
- required: ["action"],
719
- },
720
- },
721
- },
722
- handler: async (args, ctx) => {
723
- const manager = (0, manager_1.createBridgeManager)();
724
- const action = (args.action || "").trim();
725
- if (action === "begin") {
726
- if (!ctx?.currentSession) {
727
- return "bridge_manage begin requires an active session context.";
728
- }
729
- const objective = (args.objective || "").trim();
730
- if (!objective)
731
- return "objective is required for bridge begin.";
732
- return (0, manager_1.formatBridgeStatus)(manager.beginBridge({
733
- objective,
734
- summary: (args.summary || objective).trim(),
735
- session: ctx.currentSession,
736
- }));
737
- }
738
- const bridgeId = (args.bridgeId || "").trim();
739
- if (!bridgeId) {
740
- return "bridgeId is required for this bridge action.";
741
- }
742
- if (action === "attach") {
743
- const friendId = (args.friendId || "").trim();
744
- const channel = (args.channel || "").trim();
745
- const key = (args.key || "session").trim();
746
- if (!friendId || !channel) {
747
- return "friendId and channel are required for bridge attach.";
748
- }
749
- const sessionPath = (0, config_1.resolveSessionPath)(friendId, channel, key);
750
- const recall = await recallSessionSafely({
751
- sessionPath,
752
- friendId,
753
- channel,
754
- key,
755
- messageCount: 20,
756
- trustLevel: ctx?.context?.friend?.trustLevel,
757
- summarize: ctx?.summarize,
758
- });
759
- if (recall.kind === "missing") {
760
- return NO_SESSION_FOUND_MESSAGE;
761
- }
762
- return (0, manager_1.formatBridgeStatus)(manager.attachSession(bridgeId, {
763
- friendId,
764
- channel,
765
- key,
766
- sessionPath,
767
- snapshot: recall.kind === "ok" ? recall.snapshot : EMPTY_SESSION_MESSAGE,
768
- }));
769
- }
770
- if (action === "status") {
771
- const bridge = manager.getBridge(bridgeId);
772
- if (!bridge)
773
- return `bridge not found: ${bridgeId}`;
774
- return (0, manager_1.formatBridgeStatus)(bridge);
775
- }
776
- if (action === "promote_task") {
777
- return (0, manager_1.formatBridgeStatus)(manager.promoteBridgeToTask(bridgeId, {
778
- title: args.title,
779
- category: args.category,
780
- body: args.body,
781
- }));
782
- }
783
- if (action === "complete") {
784
- return (0, manager_1.formatBridgeStatus)(manager.completeBridge(bridgeId));
785
- }
786
- if (action === "cancel") {
787
- return (0, manager_1.formatBridgeStatus)(manager.cancelBridge(bridgeId));
788
- }
789
- return `unknown bridge action: ${action}`;
790
- },
791
- },
792
- {
793
- tool: {
794
- type: "function",
795
- function: {
796
- name: "query_session",
797
- description: "read the last messages from another session. use this to check on a conversation with a friend or review your own inner dialog.",
798
- parameters: {
799
- type: "object",
800
- properties: {
801
- friendId: { type: "string", description: "the friend UUID (or 'self')" },
802
- channel: { type: "string", description: "the channel: cli, teams, or inner" },
803
- key: { type: "string", description: "session key (defaults to 'session')" },
804
- messageCount: { type: "string", description: "how many recent messages to return (default 20)" },
805
- mode: { type: "string", enum: ["transcript", "status"], description: "transcript (default) or lightweight status for self/inner checks" },
806
- },
807
- required: ["friendId", "channel"],
808
- },
809
- },
810
- },
811
- handler: async (args, ctx) => {
812
- const friendId = args.friendId;
813
- const channel = args.channel;
814
- const key = args.key || "session";
815
- const count = parseInt(args.messageCount || "20", 10);
816
- const mode = args.mode || "transcript";
817
- if (mode === "status") {
818
- if (friendId !== "self" || channel !== "inner") {
819
- return "status mode is only available for self/inner dialog.";
820
- }
821
- const sessionPath = (0, thoughts_1.getInnerDialogSessionPath)((0, identity_1.getAgentRoot)());
822
- const pendingDir = (0, pending_1.getInnerDialogPendingDir)((0, identity_1.getAgentName)());
823
- return renderInnerProgressStatus((0, thoughts_1.readInnerDialogStatus)(sessionPath, pendingDir));
824
- }
825
- const sessFile = (0, config_1.resolveSessionPath)(friendId, channel, key);
826
- const recall = await recallSessionSafely({
827
- sessionPath: sessFile,
828
- friendId,
829
- channel,
830
- key,
831
- messageCount: count,
832
- trustLevel: ctx?.context?.friend?.trustLevel,
833
- summarize: ctx?.summarize,
834
- });
835
- if (recall.kind === "missing") {
836
- return NO_SESSION_FOUND_MESSAGE;
837
- }
838
- if (recall.kind === "empty") {
839
- return EMPTY_SESSION_MESSAGE;
840
- }
841
- return recall.summary;
842
- },
843
- },
844
- {
845
- tool: {
846
- type: "function",
847
- function: {
848
- name: "send_message",
849
- description: "send a message to a friend's session. when the request is explicitly authorized from a trusted live chat, the harness will try to deliver immediately; otherwise it reports truthful queued/block/failure state.",
850
- parameters: {
851
- type: "object",
852
- properties: {
853
- friendId: { type: "string", description: "the friend UUID (or 'self')" },
854
- channel: { type: "string", description: "the channel: cli, teams, or inner" },
855
- key: { type: "string", description: "session key (defaults to 'session')" },
856
- content: { type: "string", description: "the message content to send" },
857
- },
858
- required: ["friendId", "channel", "content"],
859
- },
860
- },
861
- },
862
- handler: async (args, ctx) => {
863
- const friendId = args.friendId;
864
- const channel = args.channel;
865
- const key = args.key || "session";
866
- const content = args.content;
867
- const now = Date.now();
868
- const agentName = (0, identity_1.getAgentName)();
869
- // Self-routing: messages to "self" always go to inner dialog pending dir,
870
- // regardless of the channel or key the agent specified.
871
- const isSelf = friendId === "self";
872
- const pendingDir = isSelf
873
- ? (0, pending_1.getInnerDialogPendingDir)(agentName)
874
- : (0, pending_1.getPendingDir)(agentName, friendId, channel, key);
875
- const delegatingBridgeId = findDelegatingBridgeId(ctx);
876
- const delegatedFrom = isSelf
877
- && ctx?.currentSession
878
- && !(ctx.currentSession.friendId === "self" && ctx.currentSession.channel === "inner")
879
- ? {
880
- friendId: ctx.currentSession.friendId,
881
- channel: ctx.currentSession.channel,
882
- key: ctx.currentSession.key,
883
- ...(delegatingBridgeId ? { bridgeId: delegatingBridgeId } : {}),
884
- }
885
- : undefined;
886
- const envelope = {
887
- from: agentName,
888
- friendId,
889
- channel,
890
- key,
891
- content,
892
- timestamp: now,
893
- ...(delegatedFrom ? { delegatedFrom } : {}),
894
- };
895
- if (isSelf) {
896
- writePendingEnvelope(pendingDir, envelope);
897
- let wakeResponse = null;
898
- try {
899
- wakeResponse = await (0, socket_client_1.requestInnerWake)(agentName);
900
- }
901
- catch {
902
- wakeResponse = null;
903
- }
904
- if (!wakeResponse?.ok) {
905
- const { runInnerDialogTurn } = await Promise.resolve().then(() => __importStar(require("../senses/inner-dialog")));
906
- if (ctx?.context?.channel.channel === "inner") {
907
- queueMicrotask(() => {
908
- void runInnerDialogTurn({ reason: "instinct" });
909
- });
910
- return renderInnerProgressStatus({
911
- queue: "queued to inner/dialog",
912
- wake: "inline scheduled",
913
- processing: "pending",
914
- surfaced: "nothing yet",
915
- });
916
- }
917
- else {
918
- const turnResult = await runInnerDialogTurn({ reason: "instinct" });
919
- const surfacedPreview = normalizeProgressOutcome((0, thoughts_1.formatSurfacedValue)((0, thoughts_1.extractThoughtResponseFromMessages)(turnResult?.messages ?? [])));
920
- return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
921
- scope: "inner-delegation",
922
- phase: "completed",
923
- objective: "queued to inner/dialog",
924
- outcomeText: `wake: inline fallback\n${surfacedPreview}`,
925
- }));
926
- }
927
- }
928
- return renderInnerProgressStatus({
929
- queue: "queued to inner/dialog",
930
- wake: "daemon requested",
931
- processing: "pending",
932
- surfaced: "nothing yet",
933
- });
934
- }
935
- const deliveryResult = await (0, cross_chat_delivery_1.deliverCrossChatMessage)({
936
- friendId,
937
- channel,
938
- key,
939
- content,
940
- intent: ctx?.currentSession && ctx.currentSession.friendId !== "self"
941
- ? "explicit_cross_chat"
942
- : "generic_outreach",
943
- ...(ctx?.currentSession && ctx.currentSession.friendId !== "self"
944
- ? {
945
- authorizingSession: {
946
- friendId: ctx.currentSession.friendId,
947
- channel: ctx.currentSession.channel,
948
- key: ctx.currentSession.key,
949
- trustLevel: ctx?.context?.friend?.trustLevel,
950
- },
951
- }
952
- : {}),
953
- }, {
954
- agentName,
955
- queuePending: (message) => writePendingEnvelope(pendingDir, message),
956
- deliverers: {
957
- bluebubbles: async (request) => {
958
- const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
959
- const result = await sendProactiveBlueBubblesMessageToSession({
960
- friendId: request.friendId,
961
- sessionKey: request.key,
962
- text: request.content,
963
- intent: request.intent,
964
- authorizingSession: request.authorizingSession,
965
- });
966
- if (result.delivered) {
967
- return {
968
- status: "delivered_now",
969
- detail: "sent to the active bluebubbles chat now",
970
- };
971
- }
972
- if (result.reason === "missing_target") {
973
- return {
974
- status: "blocked",
975
- detail: "bluebubbles could not resolve a routable target for that session",
976
- };
977
- }
978
- if (result.reason === "send_error") {
979
- return {
980
- status: "failed",
981
- detail: "bluebubbles send failed",
982
- };
983
- }
984
- return {
985
- status: "unavailable",
986
- detail: "live delivery unavailable right now; queued for the next active turn",
987
- };
988
- },
989
- teams: async (request) => {
990
- if (!ctx?.botApi) {
991
- return {
992
- status: "unavailable",
993
- detail: "live delivery unavailable right now; queued for the next active turn",
994
- };
995
- }
996
- const { sendProactiveTeamsMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/teams")));
997
- const result = await sendProactiveTeamsMessageToSession({
998
- friendId: request.friendId,
999
- sessionKey: request.key,
1000
- text: request.content,
1001
- intent: request.intent,
1002
- authorizingSession: request.authorizingSession,
1003
- }, {
1004
- botApi: ctx.botApi,
1005
- });
1006
- if (result.delivered) {
1007
- return {
1008
- status: "delivered_now",
1009
- detail: "sent to the active teams chat now",
1010
- };
1011
- }
1012
- if (result.reason === "missing_target") {
1013
- return {
1014
- status: "blocked",
1015
- detail: "teams could not resolve a routable target for that session",
1016
- };
1017
- }
1018
- if (result.reason === "send_error") {
1019
- return {
1020
- status: "failed",
1021
- detail: "teams send failed",
1022
- };
1023
- }
1024
- return {
1025
- status: "unavailable",
1026
- detail: "live delivery unavailable right now; queued for the next active turn",
1027
- };
1028
- },
1029
- },
1030
- });
1031
- return renderCrossChatDeliveryStatus(`${friendId} on ${channel}/${key}`, deliveryResult);
1032
- },
1033
- },
1034
- {
1035
- tool: {
1036
- type: "function",
1037
- function: {
1038
- name: "set_reasoning_effort",
1039
- description: "adjust your own reasoning depth for subsequent turns. use higher effort for complex analysis, lower for simple tasks.",
1040
- parameters: {
1041
- type: "object",
1042
- properties: {
1043
- level: { type: "string", description: "the reasoning effort level to set" },
1044
- },
1045
- required: ["level"],
1046
- },
1047
- },
1048
- },
1049
- handler: (args, ctx) => {
1050
- if (!ctx?.supportedReasoningEfforts || !ctx.setReasoningEffort) {
1051
- return "reasoning effort adjustment is not available in this context.";
1052
- }
1053
- const level = (args.level || "").trim();
1054
- if (!ctx.supportedReasoningEfforts.includes(level)) {
1055
- return `invalid reasoning effort level "${level}". accepted levels: ${ctx.supportedReasoningEfforts.join(", ")}`;
1056
- }
1057
- ctx.setReasoningEffort(level);
1058
- (0, runtime_1.emitNervesEvent)({
1059
- component: "repertoire",
1060
- event: "repertoire.reasoning_effort_changed",
1061
- message: `reasoning effort set to ${level}`,
1062
- meta: { level },
1063
- });
1064
- return `reasoning effort set to "${level}".`;
1065
- },
1066
- requiredCapability: "reasoning-effort",
1067
- },
37
+ ...tools_files_1.fileToolDefinitions,
38
+ ...tools_shell_1.shellToolDefinitions,
39
+ ...tools_notes_1.notesToolDefinitions,
40
+ ...tools_bridge_1.bridgeToolDefinitions,
41
+ ...tools_session_1.sessionToolDefinitions,
42
+ ...tools_continuity_1.continuityToolDefinitions,
43
+ ...tools_config_1.configToolDefinitions,
1068
44
  ...tools_1.codingToolDefinitions,
45
+ ...tools_credential_1.credentialToolDefinitions,
46
+ ...tools_vault_1.vaultToolDefinitions,
47
+ ...tools_travel_1.travelToolDefinitions,
48
+ ...tools_user_profile_1.userProfileToolDefinitions,
49
+ ...tools_stripe_1.stripeToolDefinitions,
50
+ ...tools_flight_1.flightToolDefinitions,
51
+ ...tools_attachments_1.attachmentToolDefinitions,
52
+ ...tools_mail_1.mailToolDefinitions,
53
+ ...tools_trip_1.tripToolDefinitions,
1069
54
  ];
55
+ // Convenience array of just the tool schemas (no handler/integration metadata).
56
+ // Used by consumers that need the OpenAI function-tool format.
1070
57
  exports.tools = exports.baseToolDefinitions.map((d) => d.tool);
1071
- exports.finalAnswerTool = {
1072
- type: "function",
1073
- function: {
1074
- name: "final_answer",
1075
- description: "respond to the user with your message. call this tool when you are ready to deliver your response.",
1076
- parameters: {
1077
- type: "object",
1078
- properties: {
1079
- answer: { type: "string" },
1080
- intent: { type: "string", enum: ["complete", "blocked", "direct_reply"] },
1081
- },
1082
- required: ["answer"],
1083
- },
1084
- },
1085
- };