@ouro.bot/cli 0.1.0-alpha.7 → 0.1.0-alpha.700

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 (514) hide show
  1. package/README.md +235 -183
  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/SerpentGuide.ouro/agent.json +83 -0
  10. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/ouroboros.png +0 -0
  14. package/changelog.json +4827 -0
  15. package/dist/a2a/card.js +57 -0
  16. package/dist/a2a/client.js +180 -0
  17. package/dist/a2a/config.js +50 -0
  18. package/dist/a2a/delegation-stores.js +56 -0
  19. package/dist/a2a/did-resolution.js +93 -0
  20. package/dist/a2a/identity.js +170 -0
  21. package/dist/a2a/inbound-share.js +107 -0
  22. package/dist/a2a/mission-result-wire.js +196 -0
  23. package/dist/a2a/onboarding.js +115 -0
  24. package/dist/a2a/pin-store.js +132 -0
  25. package/dist/a2a/seen-ledger.js +120 -0
  26. package/dist/a2a/server.js +604 -0
  27. package/dist/a2a/task-store.js +69 -0
  28. package/dist/a2a/transport.js +45 -0
  29. package/dist/a2a/types.js +3 -0
  30. package/dist/arc/attention-types.js +8 -0
  31. package/dist/arc/cares.js +144 -0
  32. package/dist/arc/episodes.js +118 -0
  33. package/dist/arc/evolution.js +490 -0
  34. package/dist/arc/flight-recorder.js +928 -0
  35. package/dist/arc/intentions.js +134 -0
  36. package/dist/arc/json-store.js +117 -0
  37. package/dist/arc/obligations.js +348 -0
  38. package/dist/arc/packets.js +336 -0
  39. package/dist/arc/presence.js +185 -0
  40. package/dist/arc/task-lifecycle.js +57 -0
  41. package/dist/commerce/store.js +755 -0
  42. package/dist/commerce/types.js +3 -0
  43. package/dist/heart/active-work.js +1002 -0
  44. package/dist/heart/agent-entry.js +190 -3
  45. package/dist/heart/attachments/image-normalize.js +194 -0
  46. package/dist/heart/attachments/materialize.js +97 -0
  47. package/dist/heart/attachments/originals.js +88 -0
  48. package/dist/heart/attachments/render.js +29 -0
  49. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  50. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  51. package/dist/heart/attachments/sources/index.js +16 -0
  52. package/dist/heart/attachments/store.js +103 -0
  53. package/dist/heart/attachments/types.js +93 -0
  54. package/dist/heart/auth/auth-flow.js +479 -0
  55. package/dist/heart/autonomy-budget.js +434 -0
  56. package/dist/heart/awaiting/await-alert.js +146 -0
  57. package/dist/heart/awaiting/await-expiry.js +108 -0
  58. package/dist/heart/awaiting/await-loader.js +91 -0
  59. package/dist/heart/awaiting/await-parser.js +141 -0
  60. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  61. package/dist/heart/awaiting/await-scheduler.js +378 -0
  62. package/dist/heart/background-operations.js +281 -0
  63. package/dist/heart/bridges/manager.js +478 -0
  64. package/dist/heart/bridges/state-machine.js +135 -0
  65. package/dist/heart/bridges/store.js +135 -0
  66. package/dist/heart/bundle-state.js +168 -0
  67. package/dist/heart/commitments.js +135 -0
  68. package/dist/heart/config-registry.js +331 -0
  69. package/dist/heart/config.js +172 -135
  70. package/dist/heart/context-loss-gauntlet.js +354 -0
  71. package/dist/heart/context-loss-sentinel.js +1155 -0
  72. package/dist/heart/core.js +1480 -262
  73. package/dist/heart/cross-chat-delivery.js +132 -0
  74. package/dist/heart/daemon/agent-config-check.js +451 -0
  75. package/dist/heart/daemon/agent-discovery.js +263 -0
  76. package/dist/heart/daemon/agent-service.js +523 -0
  77. package/dist/heart/daemon/agentic-repair.js +547 -0
  78. package/dist/heart/daemon/await-private-wake.js +59 -0
  79. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  80. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  81. package/dist/heart/daemon/cadence.js +180 -0
  82. package/dist/heart/daemon/cli-defaults.js +780 -0
  83. package/dist/heart/daemon/cli-desk.js +322 -0
  84. package/dist/heart/daemon/cli-exec.js +8142 -0
  85. package/dist/heart/daemon/cli-help.js +675 -0
  86. package/dist/heart/daemon/cli-parse.js +2461 -0
  87. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  88. package/dist/heart/daemon/cli-render.js +770 -0
  89. package/dist/heart/daemon/cli-types.js +8 -0
  90. package/dist/heart/daemon/connect-bay.js +323 -0
  91. package/dist/heart/daemon/daemon-cli.js +30 -784
  92. package/dist/heart/daemon/daemon-entry.js +874 -13
  93. package/dist/heart/daemon/daemon-health.js +176 -0
  94. package/dist/heart/daemon/daemon-rollup.js +57 -0
  95. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  96. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  97. package/dist/heart/daemon/daemon.js +1412 -26
  98. package/dist/heart/daemon/dns-workflow.js +394 -0
  99. package/dist/heart/daemon/doctor-types.js +8 -0
  100. package/dist/heart/daemon/doctor.js +1126 -0
  101. package/dist/heart/daemon/habit-private-wake.js +56 -0
  102. package/dist/heart/daemon/health-monitor.js +142 -11
  103. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  104. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  105. package/dist/heart/daemon/http-health-probe.js +80 -0
  106. package/dist/heart/daemon/human-command-screens.js +234 -0
  107. package/dist/heart/daemon/human-readiness.js +114 -0
  108. package/dist/heart/daemon/inner-status.js +78 -0
  109. package/dist/heart/daemon/interactive-repair.js +394 -0
  110. package/dist/heart/daemon/launchd.js +188 -0
  111. package/dist/heart/daemon/log-tailer.js +82 -12
  112. package/dist/heart/daemon/logs-prune.js +110 -0
  113. package/dist/heart/daemon/mcp-canary.js +297 -0
  114. package/dist/heart/daemon/message-router.js +60 -11
  115. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  116. package/dist/heart/daemon/os-cron-deps.js +135 -0
  117. package/dist/heart/daemon/os-cron.js +22 -14
  118. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  119. package/dist/heart/daemon/ouro-entry.js +3 -1
  120. package/dist/heart/daemon/plugin-cli.js +432 -0
  121. package/dist/heart/daemon/process-manager.js +525 -33
  122. package/dist/heart/daemon/provider-discovery.js +137 -0
  123. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  124. package/dist/heart/daemon/pulse.js +511 -0
  125. package/dist/heart/daemon/readiness-repair.js +365 -0
  126. package/dist/heart/daemon/run-hooks.js +39 -0
  127. package/dist/heart/daemon/runtime-logging.js +86 -16
  128. package/dist/heart/daemon/runtime-metadata.js +191 -0
  129. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +26 -39
  130. package/dist/heart/daemon/safe-mode.js +161 -0
  131. package/dist/heart/daemon/sense-manager.js +929 -0
  132. package/dist/heart/daemon/session-id-resolver.js +131 -0
  133. package/dist/heart/daemon/skill-management-installer.js +94 -0
  134. package/dist/heart/daemon/socket-client.js +361 -0
  135. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  136. package/dist/heart/daemon/startup-tui.js +338 -0
  137. package/dist/heart/daemon/task-scheduler.js +117 -39
  138. package/dist/heart/daemon/terminal-ui.js +499 -0
  139. package/dist/heart/daemon/thoughts.js +591 -0
  140. package/dist/heart/daemon/up-progress.js +366 -0
  141. package/dist/heart/daemon/vault-items.js +56 -0
  142. package/dist/heart/delegation.js +59 -0
  143. package/dist/heart/external-events/router.js +121 -0
  144. package/dist/heart/habits/habit-migration.js +189 -0
  145. package/dist/heart/habits/habit-parser.js +214 -0
  146. package/dist/heart/habits/habit-runtime-state.js +114 -0
  147. package/dist/heart/habits/habit-scheduler.js +431 -0
  148. package/dist/heart/habits/habit-session-summary.js +318 -0
  149. package/dist/heart/habits/habit-session.js +617 -0
  150. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  151. package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -137
  152. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  153. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  154. package/dist/heart/hatch/specialist-prompt.js +102 -0
  155. package/dist/heart/hatch/specialist-tools.js +318 -0
  156. package/dist/heart/identity.js +287 -67
  157. package/dist/heart/kept-notes.js +289 -0
  158. package/dist/heart/kicks.js +2 -20
  159. package/dist/heart/machine-identity.js +161 -0
  160. package/dist/heart/mail-import-discovery.js +353 -0
  161. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  162. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  163. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  164. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  165. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  166. package/dist/heart/mailbox/mailbox-http.js +99 -0
  167. package/dist/heart/mailbox/mailbox-read.js +37 -0
  168. package/dist/heart/mailbox/mailbox-types.js +27 -0
  169. package/dist/heart/mailbox/mailbox-view.js +197 -0
  170. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  171. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  172. package/dist/heart/mailbox/readers/mail.js +375 -0
  173. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  174. package/dist/heart/mailbox/readers/sessions.js +232 -0
  175. package/dist/heart/mailbox/readers/shared.js +111 -0
  176. package/dist/heart/mcp/mcp-server.js +696 -0
  177. package/dist/heart/migrate-config.js +100 -0
  178. package/dist/heart/model-capabilities.js +59 -0
  179. package/dist/heart/orientation-frame.js +217 -0
  180. package/dist/heart/platform.js +81 -0
  181. package/dist/heart/primitives.js +1 -1
  182. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  183. package/dist/heart/private-runtime/index.js +18 -0
  184. package/dist/heart/private-runtime/ledger.js +218 -0
  185. package/dist/heart/private-runtime/policy.js +214 -0
  186. package/dist/heart/private-runtime/types.js +2 -0
  187. package/dist/heart/progress-story.js +42 -0
  188. package/dist/heart/provider-attempt.js +134 -0
  189. package/dist/heart/provider-binding-resolver.js +273 -0
  190. package/dist/heart/provider-credentials.js +441 -0
  191. package/dist/heart/provider-failover.js +311 -0
  192. package/dist/heart/provider-models.js +81 -0
  193. package/dist/heart/provider-ping.js +262 -0
  194. package/dist/heart/provider-readiness-cache.js +119 -0
  195. package/dist/heart/provider-visibility.js +188 -0
  196. package/dist/heart/providers/anthropic-token.js +131 -0
  197. package/dist/heart/providers/anthropic.js +202 -50
  198. package/dist/heart/providers/azure.js +104 -13
  199. package/dist/heart/providers/error-classification.js +127 -0
  200. package/dist/heart/providers/github-copilot.js +145 -0
  201. package/dist/heart/providers/minimax-vlm.js +189 -0
  202. package/dist/heart/providers/minimax.js +29 -7
  203. package/dist/heart/providers/openai-codex-token.js +349 -0
  204. package/dist/heart/providers/openai-codex.js +63 -39
  205. package/dist/heart/run-ledger.js +247 -0
  206. package/dist/heart/runtime-capability-check.js +170 -0
  207. package/dist/heart/runtime-credentials.js +398 -0
  208. package/dist/heart/runtime-cwd.js +87 -0
  209. package/dist/heart/sense-truth.js +77 -0
  210. package/dist/heart/session-activity.js +235 -0
  211. package/dist/heart/session-events.js +1133 -0
  212. package/dist/heart/session-playback-cli-main.js +5 -0
  213. package/dist/heart/session-playback-cli.js +36 -0
  214. package/dist/heart/session-playback.js +231 -0
  215. package/dist/heart/session-stats-cli-main.js +5 -0
  216. package/dist/heart/session-stats.js +182 -0
  217. package/dist/heart/session-transcript.js +133 -0
  218. package/dist/heart/start-of-turn-packet.js +365 -0
  219. package/dist/heart/streaming.js +129 -34
  220. package/dist/heart/structured-output.js +196 -0
  221. package/dist/heart/sync-classification.js +176 -0
  222. package/dist/heart/sync.js +449 -0
  223. package/dist/heart/target-resolution.js +127 -0
  224. package/dist/heart/tempo.js +93 -0
  225. package/dist/heart/temporal-view.js +41 -0
  226. package/dist/heart/timeouts.js +101 -0
  227. package/dist/heart/tool-activity-callbacks.js +59 -0
  228. package/dist/heart/tool-description.js +155 -0
  229. package/dist/heart/tool-friction.js +55 -0
  230. package/dist/heart/tool-loop.js +200 -0
  231. package/dist/heart/turn-context.js +472 -0
  232. package/dist/heart/turn-coordinator.js +28 -0
  233. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  234. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  235. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  236. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  237. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  238. package/dist/heart/versioning/staged-restart.js +146 -0
  239. package/dist/heart/versioning/update-checker.js +116 -0
  240. package/dist/heart/versioning/update-hooks.js +154 -0
  241. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  242. package/dist/heart/work-card.js +380 -0
  243. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  244. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  245. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  246. package/dist/mailbox-ui/index.html +16 -0
  247. package/dist/mailroom/attention.js +167 -0
  248. package/dist/mailroom/autonomy.js +209 -0
  249. package/dist/mailroom/blob-store.js +715 -0
  250. package/dist/mailroom/body-cache.js +61 -0
  251. package/dist/mailroom/core.js +788 -0
  252. package/dist/mailroom/entry.js +160 -0
  253. package/dist/mailroom/file-store.js +568 -0
  254. package/dist/mailroom/mbox-import.js +393 -0
  255. package/dist/mailroom/migration.js +164 -0
  256. package/dist/mailroom/outbound.js +380 -0
  257. package/dist/mailroom/policy.js +263 -0
  258. package/dist/mailroom/reader.js +233 -0
  259. package/dist/mailroom/search-cache.js +334 -0
  260. package/dist/mailroom/search-relevance.js +319 -0
  261. package/dist/mailroom/smtp-ingress.js +176 -0
  262. package/dist/mailroom/source-state.js +176 -0
  263. package/dist/mailroom/thread.js +109 -0
  264. package/dist/mailroom/travel-extract.js +89 -0
  265. package/dist/mind/bundle-manifest.js +93 -1
  266. package/dist/mind/context.js +259 -94
  267. package/dist/mind/desk-section.js +362 -0
  268. package/dist/mind/diary-integrity.js +60 -0
  269. package/dist/mind/{memory.js → diary.js} +90 -98
  270. package/dist/mind/embedding-provider.js +60 -0
  271. package/dist/mind/file-state.js +179 -0
  272. package/dist/mind/first-impressions.js +16 -2
  273. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  274. package/dist/mind/obligation-steering.js +221 -0
  275. package/dist/mind/pending.js +77 -9
  276. package/dist/mind/phrases.js +1 -0
  277. package/dist/mind/prompt-budget.js +380 -0
  278. package/dist/mind/prompt-refresh.js +3 -2
  279. package/dist/mind/prompt.js +1279 -139
  280. package/dist/mind/provenance-trust.js +26 -0
  281. package/dist/mind/record-paths.js +312 -0
  282. package/dist/mind/scrutiny.js +173 -0
  283. package/dist/mind/token-estimate.js +8 -12
  284. package/dist/nerves/cli-logging.js +22 -3
  285. package/dist/nerves/coverage/audit-rules.js +15 -6
  286. package/dist/nerves/coverage/audit.js +28 -2
  287. package/dist/nerves/coverage/cli.js +1 -1
  288. package/dist/nerves/coverage/contract.js +5 -5
  289. package/dist/nerves/coverage/file-completeness.js +139 -5
  290. package/dist/nerves/coverage/run-artifacts.js +1 -1
  291. package/dist/nerves/event-buffer.js +111 -0
  292. package/dist/nerves/index.js +234 -4
  293. package/dist/nerves/observation.js +20 -0
  294. package/dist/nerves/redact.js +79 -0
  295. package/dist/nerves/review/cli-main.js +5 -0
  296. package/dist/nerves/review/cli.js +156 -0
  297. package/dist/nerves/review/core.js +152 -0
  298. package/dist/nerves/runtime.js +5 -1
  299. package/dist/repertoire/ado-client.js +17 -56
  300. package/dist/repertoire/ado-semantic.js +16 -10
  301. package/dist/repertoire/api-client.js +97 -0
  302. package/dist/repertoire/bitwarden-store.js +1042 -0
  303. package/dist/repertoire/bundle-templates.js +71 -0
  304. package/dist/repertoire/bw-installer.js +180 -0
  305. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  306. package/dist/repertoire/coding/context-pack.js +331 -0
  307. package/dist/repertoire/coding/feedback.js +322 -0
  308. package/dist/repertoire/coding/index.js +18 -3
  309. package/dist/repertoire/coding/manager.js +228 -14
  310. package/dist/repertoire/coding/spawner.js +61 -14
  311. package/dist/repertoire/coding/tools.js +279 -12
  312. package/dist/repertoire/coding/workbench-client.js +272 -0
  313. package/dist/repertoire/coding/workbench-manager.js +346 -0
  314. package/dist/repertoire/commerce-errors.js +109 -0
  315. package/dist/repertoire/commerce-self-test.js +156 -0
  316. package/dist/repertoire/credential-access.js +178 -0
  317. package/dist/repertoire/data/ado-endpoints.json +188 -0
  318. package/dist/repertoire/desk/classifier.js +362 -0
  319. package/dist/repertoire/duffel-client.js +185 -0
  320. package/dist/repertoire/github-client.js +14 -55
  321. package/dist/repertoire/graph-client.js +11 -52
  322. package/dist/repertoire/guardrails.js +408 -0
  323. package/dist/repertoire/mcp-client.js +295 -0
  324. package/dist/repertoire/mcp-manager.js +434 -0
  325. package/dist/repertoire/mcp-tools.js +83 -0
  326. package/dist/repertoire/plugin-mcp.js +175 -0
  327. package/dist/repertoire/plugins.js +253 -0
  328. package/dist/repertoire/shell-sessions.js +133 -0
  329. package/dist/repertoire/skills.js +45 -24
  330. package/dist/repertoire/stripe-client.js +131 -0
  331. package/dist/repertoire/tool-results.js +29 -0
  332. package/dist/repertoire/tools-a2a.js +699 -0
  333. package/dist/repertoire/tools-attachments.js +317 -0
  334. package/dist/repertoire/tools-awaiting.js +372 -0
  335. package/dist/repertoire/tools-base.js +68 -707
  336. package/dist/repertoire/tools-bluebubbles.js +95 -0
  337. package/dist/repertoire/tools-bridge.js +144 -0
  338. package/dist/repertoire/tools-bundle.js +993 -0
  339. package/dist/repertoire/tools-commerce.js +253 -0
  340. package/dist/repertoire/tools-config.js +186 -0
  341. package/dist/repertoire/tools-continuity.js +252 -0
  342. package/dist/repertoire/tools-credential.js +383 -0
  343. package/dist/repertoire/tools-evolution.js +527 -0
  344. package/dist/repertoire/tools-files.js +344 -0
  345. package/dist/repertoire/tools-flight.js +290 -0
  346. package/dist/repertoire/tools-flow.js +119 -0
  347. package/dist/repertoire/tools-github.js +3 -8
  348. package/dist/repertoire/tools-mail.js +1975 -0
  349. package/dist/repertoire/tools-notes.js +459 -0
  350. package/dist/repertoire/tools-obligations.js +182 -0
  351. package/dist/repertoire/tools-orientation.js +31 -0
  352. package/dist/repertoire/tools-record.js +482 -0
  353. package/dist/repertoire/tools-rsvp.js +139 -0
  354. package/dist/repertoire/tools-runtime.js +150 -0
  355. package/dist/repertoire/tools-session.js +881 -0
  356. package/dist/repertoire/tools-shell.js +120 -0
  357. package/dist/repertoire/tools-stripe.js +224 -0
  358. package/dist/repertoire/tools-surface.js +355 -0
  359. package/dist/repertoire/tools-teams.js +67 -61
  360. package/dist/repertoire/tools-travel.js +125 -0
  361. package/dist/repertoire/tools-trip.js +982 -0
  362. package/dist/repertoire/tools-user-profile.js +146 -0
  363. package/dist/repertoire/tools-vault.js +40 -0
  364. package/dist/repertoire/tools-voice.js +145 -0
  365. package/dist/repertoire/tools.js +313 -102
  366. package/dist/repertoire/travel-api-client.js +360 -0
  367. package/dist/repertoire/user-profile.js +131 -0
  368. package/dist/repertoire/vault-setup.js +246 -0
  369. package/dist/repertoire/vault-unlock.js +594 -0
  370. package/dist/rsvp/aisleplanner-client.js +354 -0
  371. package/dist/rsvp/cli.js +704 -0
  372. package/dist/rsvp/config.js +327 -0
  373. package/dist/rsvp/cutover.js +431 -0
  374. package/dist/rsvp/diagnostics.js +222 -0
  375. package/dist/rsvp/diff-renderer.js +161 -0
  376. package/dist/rsvp/habit-policy.js +85 -0
  377. package/dist/rsvp/habit-stage.js +93 -0
  378. package/dist/rsvp/incident-bundle.js +97 -0
  379. package/dist/rsvp/migration.js +204 -0
  380. package/dist/rsvp/outbound-state.js +254 -0
  381. package/dist/rsvp/query.js +118 -0
  382. package/dist/rsvp/replay.js +233 -0
  383. package/dist/rsvp/snapshot.js +232 -0
  384. package/dist/scripts/claude-code-hook.js +41 -0
  385. package/dist/scripts/claude-code-stop-hook.js +47 -0
  386. package/dist/senses/a2a-entry.js +115 -0
  387. package/dist/senses/attention-queue.js +186 -0
  388. package/dist/senses/await-turn-message.js +58 -0
  389. package/dist/senses/bluebubbles/active-turns.js +216 -0
  390. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  391. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  392. package/dist/senses/bluebubbles/client.js +691 -0
  393. package/dist/senses/bluebubbles/entry.js +77 -0
  394. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  395. package/dist/senses/bluebubbles/index.js +2937 -0
  396. package/dist/senses/bluebubbles/media.js +389 -0
  397. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
  398. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  399. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  400. package/dist/senses/bluebubbles/processed-log.js +133 -0
  401. package/dist/senses/bluebubbles/replay.js +284 -0
  402. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  403. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  404. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  405. package/dist/senses/cli/bracketed-paste.js +82 -0
  406. package/dist/senses/cli/image-paste.js +287 -0
  407. package/dist/senses/cli/image-ref-navigation.js +75 -0
  408. package/dist/senses/cli/ink-app.js +156 -0
  409. package/dist/senses/cli/inline-diff.js +64 -0
  410. package/dist/senses/cli/input-keys.js +174 -0
  411. package/dist/senses/cli/kill-ring.js +86 -0
  412. package/dist/senses/cli/message-list.js +51 -0
  413. package/dist/senses/cli/ouro-tui.js +607 -0
  414. package/dist/senses/cli/spinner-imperative.js +135 -0
  415. package/dist/senses/cli/spinner.js +101 -0
  416. package/dist/senses/cli/status-line.js +60 -0
  417. package/dist/senses/cli/streaming-markdown.js +526 -0
  418. package/dist/senses/cli/tool-display.js +85 -0
  419. package/dist/senses/cli/tool-render.js +85 -0
  420. package/dist/senses/cli/tui-store.js +240 -0
  421. package/dist/senses/cli/virtual-list.js +35 -0
  422. package/dist/senses/cli-entry.js +60 -8
  423. package/dist/senses/cli-layout.js +187 -0
  424. package/dist/senses/cli.js +780 -269
  425. package/dist/senses/commands.js +66 -3
  426. package/dist/senses/context-packet-ledger.js +245 -0
  427. package/dist/senses/context-packets.js +154 -0
  428. package/dist/senses/continuity.js +94 -0
  429. package/dist/senses/habit-turn-message.js +160 -0
  430. package/dist/senses/mail-entry.js +66 -0
  431. package/dist/senses/mail.js +395 -0
  432. package/dist/senses/pipeline.js +1052 -0
  433. package/dist/senses/private-runtime-worker.js +723 -0
  434. package/dist/senses/private-runtime.js +1157 -0
  435. package/dist/senses/proactive-content-guard.js +51 -0
  436. package/dist/senses/shared-turn.js +416 -0
  437. package/dist/senses/surface-tool.js +109 -0
  438. package/dist/senses/teams-entry.js +60 -8
  439. package/dist/senses/teams.js +928 -199
  440. package/dist/senses/trust-gate.js +207 -2
  441. package/dist/senses/voice/audio-playback.js +237 -0
  442. package/dist/senses/voice/audio-routing.js +119 -0
  443. package/dist/senses/voice/elevenlabs.js +202 -0
  444. package/dist/senses/voice/floor-control.js +431 -0
  445. package/dist/senses/voice/floor-controller.js +115 -0
  446. package/dist/senses/voice/golden-path.js +116 -0
  447. package/dist/senses/voice/index.js +29 -0
  448. package/dist/senses/voice/meeting.js +113 -0
  449. package/dist/senses/voice/outbound.js +190 -0
  450. package/dist/senses/voice/phone.js +33 -0
  451. package/dist/senses/voice/playback.js +139 -0
  452. package/dist/senses/voice/realtime-eval.js +496 -0
  453. package/dist/senses/voice/realtime-trace.js +531 -0
  454. package/dist/senses/voice/transcript.js +70 -0
  455. package/dist/senses/voice/turn.js +191 -0
  456. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  457. package/dist/senses/voice/twilio-phone.js +5081 -0
  458. package/dist/senses/voice/types.js +2 -0
  459. package/dist/senses/voice/whisper.js +161 -0
  460. package/dist/senses/voice-entry.js +81 -0
  461. package/dist/senses/voice-realtime-eval-command.js +99 -0
  462. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  463. package/dist/senses/voice-twilio-entry.js +87 -0
  464. package/dist/trips/core.js +138 -0
  465. package/dist/trips/store.js +265 -0
  466. package/dist/util/frontmatter.js +69 -0
  467. package/package.json +67 -11
  468. package/skills/agent-commerce.md +113 -0
  469. package/skills/browser-navigation.md +117 -0
  470. package/skills/commerce-setup-guide.md +116 -0
  471. package/skills/commerce-setup.md +84 -0
  472. package/skills/configure-dev-tools.md +99 -0
  473. package/skills/travel-planning.md +138 -0
  474. package/AdoptionSpecialist.ouro/agent.json +0 -20
  475. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  476. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  477. package/dist/heart/daemon/specialist-prompt.js +0 -40
  478. package/dist/heart/daemon/specialist-session.js +0 -142
  479. package/dist/heart/daemon/specialist-tools.js +0 -128
  480. package/dist/heart/daemon/subagent-installer.js +0 -125
  481. package/dist/inner-worker-entry.js +0 -4
  482. package/dist/mind/friends/channel.js +0 -49
  483. package/dist/mind/friends/resolver.js +0 -84
  484. package/dist/mind/friends/store-file.js +0 -171
  485. package/dist/mind/friends/store.js +0 -4
  486. package/dist/mind/friends/tokens.js +0 -26
  487. package/dist/mind/friends/types.js +0 -21
  488. package/dist/repertoire/tasks/board.js +0 -122
  489. package/dist/repertoire/tasks/index.js +0 -210
  490. package/dist/repertoire/tasks/middleware.js +0 -65
  491. package/dist/repertoire/tasks/parser.js +0 -173
  492. package/dist/repertoire/tasks/scanner.js +0 -132
  493. package/dist/repertoire/tasks/transitions.js +0 -145
  494. package/dist/senses/bluebubbles-client.js +0 -279
  495. package/dist/senses/bluebubbles-entry.js +0 -11
  496. package/dist/senses/bluebubbles.js +0 -332
  497. package/dist/senses/inner-dialog-worker.js +0 -61
  498. package/dist/senses/inner-dialog.js +0 -231
  499. package/subagents/README.md +0 -73
  500. package/subagents/work-doer.md +0 -233
  501. package/subagents/work-merger.md +0 -624
  502. package/subagents/work-planner.md +0 -373
  503. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  504. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  505. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  506. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  507. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  508. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  509. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  510. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  511. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  512. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  513. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  514. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
@@ -0,0 +1,482 @@
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 embedding_provider_1 = require("../mind/embedding-provider");
41
+ const note_search_1 = require("../mind/note-search");
42
+ const record_paths_1 = require("../mind/record-paths");
43
+ const friends_1 = require("@ouro.bot/friends");
44
+ const runtime_1 = require("../nerves/runtime");
45
+ const identity_1 = require("../heart/identity");
46
+ const NOTES_INDEX_VERSION = 1;
47
+ const NOTE_SLUG_MAX_CHARS = 40;
48
+ const DEFAULT_LIMIT = 5;
49
+ const MAX_LIMIT = 25;
50
+ const DEFAULT_MIN_SCORE = 0.5;
51
+ const PREVIEW_CHAR_LIMIT = 500;
52
+ function hasSelfTrust(ctx) {
53
+ const channel = ctx?.context?.channel?.channel;
54
+ if (channel !== "inner")
55
+ return false;
56
+ const friend = ctx?.context?.friend;
57
+ return !friend || friend.id === "self";
58
+ }
59
+ function hasRecordReadTrust(ctx) {
60
+ if (hasSelfTrust(ctx))
61
+ return true;
62
+ const friend = ctx?.context?.friend;
63
+ return Boolean(friend) && (0, friends_1.isTrustedLevel)(friend?.trustLevel);
64
+ }
65
+ function bundleRelativeLocator(filePath, ctx) {
66
+ const agentRoot = ctx?.agentRoot ?? (0, identity_1.getAgentRoot)();
67
+ const relativePath = path.relative(agentRoot, filePath);
68
+ if (relativePath && !relativePath.startsWith("..") && !path.isAbsolute(relativePath)) {
69
+ return relativePath.split(path.sep).join("/");
70
+ }
71
+ return filePath.split(path.sep).join("/");
72
+ }
73
+ function normalizeTags(value) {
74
+ if (value === undefined || value === null)
75
+ return undefined;
76
+ const rawTags = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
77
+ const tags = rawTags
78
+ .map((tag) => (typeof tag === "string" ? tag.trim() : ""))
79
+ .filter((tag) => tag.length > 0);
80
+ return tags.length > 0 ? tags : undefined;
81
+ }
82
+ function slugForContent(content) {
83
+ const slug = content
84
+ .toLowerCase()
85
+ .replace(/[^a-z0-9]+/g, "-")
86
+ .replace(/^-+|-+$/g, "")
87
+ .slice(0, NOTE_SLUG_MAX_CHARS)
88
+ .replace(/-+$/g, "");
89
+ return slug || "note";
90
+ }
91
+ function renderNote(createdAt, content, tags) {
92
+ const frontmatter = [`created_at: ${createdAt}`];
93
+ if (tags?.length) {
94
+ frontmatter.push("tags:");
95
+ for (const tag of tags) {
96
+ frontmatter.push(` - ${JSON.stringify(tag)}`);
97
+ }
98
+ }
99
+ return `---\n${frontmatter.join("\n")}\n---\n${content}\n`;
100
+ }
101
+ function ensureUniquePath(notesDir, date, slug) {
102
+ let candidate = path.join(notesDir, `${date}-${slug}.md`);
103
+ let suffix = 2;
104
+ while (fs.existsSync(candidate)) {
105
+ const suffixText = `-${suffix}`;
106
+ const cappedSlug = `${slug.slice(0, Math.max(0, NOTE_SLUG_MAX_CHARS - suffixText.length)).replace(/-+$/g, "")}${suffixText}`;
107
+ candidate = path.join(notesDir, `${date}-${cappedSlug}.md`);
108
+ suffix += 1;
109
+ }
110
+ return candidate;
111
+ }
112
+ function extractPreview(body) {
113
+ const firstLine = body.trim().split("\n").find((line) => line.trim().length > 0);
114
+ return (0, session_events_1.capStructuredRecordString)(firstLine.trim()).slice(0, PREVIEW_CHAR_LIMIT);
115
+ }
116
+ function parseTagsFromFrontmatter(lines, startIndex) {
117
+ const tags = [];
118
+ let i = startIndex;
119
+ while (lines[i + 1]?.trimStart().startsWith("- ")) {
120
+ i += 1;
121
+ tags.push(lines[i].trimStart().slice(2).trim().replace(/^"|"$/g, ""));
122
+ }
123
+ return { tags, nextIndex: i };
124
+ }
125
+ function parseCanonicalNote(filePath, stat) {
126
+ const raw = fs.readFileSync(filePath, "utf8");
127
+ let body = raw;
128
+ let createdAt;
129
+ let tags;
130
+ if (raw.startsWith("---\n")) {
131
+ const end = raw.indexOf("\n---\n", 4);
132
+ if (end > 0) {
133
+ const frontmatterRaw = raw.slice(4, end);
134
+ body = raw.slice(end + "\n---\n".length);
135
+ const lines = frontmatterRaw.split("\n");
136
+ for (let i = 0; i < lines.length; i++) {
137
+ const line = lines[i];
138
+ if (!line.trim())
139
+ continue;
140
+ const colonIndex = line.indexOf(":");
141
+ if (colonIndex < 0)
142
+ continue;
143
+ const key = line.slice(0, colonIndex);
144
+ const value = line.slice(colonIndex + 1).trim();
145
+ if (key === "created_at" && value) {
146
+ createdAt = value.replace(/^"|"$/g, "");
147
+ }
148
+ if (key === "tags") {
149
+ if (value.startsWith("[") && value.endsWith("]")) {
150
+ try {
151
+ const parsed = JSON.parse(value);
152
+ tags = parsed.filter((tag) => typeof tag === "string");
153
+ }
154
+ catch {
155
+ tags = undefined;
156
+ }
157
+ }
158
+ else {
159
+ const parsedTags = parseTagsFromFrontmatter(lines, i);
160
+ tags = parsedTags.tags.length > 0 ? parsedTags.tags : undefined;
161
+ i = parsedTags.nextIndex;
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+ const trimmedBody = body.trim();
168
+ if (!trimmedBody)
169
+ return null;
170
+ return {
171
+ filename: path.basename(filePath),
172
+ filePath,
173
+ body: trimmedBody,
174
+ preview: extractPreview(trimmedBody),
175
+ createdAt,
176
+ tags,
177
+ mtimeMs: stat.mtimeMs,
178
+ size: stat.size,
179
+ };
180
+ }
181
+ function listCanonicalNotes(notesDir) {
182
+ let dirEntries;
183
+ try {
184
+ dirEntries = fs.readdirSync(notesDir, { withFileTypes: true });
185
+ }
186
+ catch {
187
+ return [];
188
+ }
189
+ return dirEntries
190
+ .filter((entry) => entry.isFile() && !entry.name.startsWith(".") && entry.name.endsWith(".md"))
191
+ .map((entry) => {
192
+ const filePath = path.join(notesDir, entry.name);
193
+ try {
194
+ return parseCanonicalNote(filePath, fs.statSync(filePath));
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ })
200
+ .filter((record) => record !== null)
201
+ .sort((left, right) => left.filename.localeCompare(right.filename));
202
+ }
203
+ function readIndex(indexPath) {
204
+ try {
205
+ const parsed = JSON.parse(fs.readFileSync(indexPath, "utf8"));
206
+ if (parsed.version !== NOTES_INDEX_VERSION || !Array.isArray(parsed.entries))
207
+ return null;
208
+ if (!parsed.entries.every(isIndexEntry))
209
+ return null;
210
+ return parsed;
211
+ }
212
+ catch {
213
+ return null;
214
+ }
215
+ }
216
+ function isIndexEntry(value) {
217
+ if (!value || typeof value !== "object")
218
+ return false;
219
+ const entry = value;
220
+ return (typeof entry.filename === "string" &&
221
+ typeof entry.path === "string" &&
222
+ typeof entry.preview === "string" &&
223
+ Array.isArray(entry.embedding) &&
224
+ entry.embedding.every((item) => typeof item === "number") &&
225
+ typeof entry.mtimeMs === "number" &&
226
+ typeof entry.size === "number");
227
+ }
228
+ function entryMatchesRecord(entry, record) {
229
+ return (entry.filename === record.filename &&
230
+ entry.path === record.filePath &&
231
+ entry.mtimeMs === record.mtimeMs &&
232
+ entry.size === record.size &&
233
+ entry.preview === record.preview);
234
+ }
235
+ function indexFreshForRecords(index, records) {
236
+ if (!index)
237
+ return false;
238
+ if (index.entries.length !== records.length)
239
+ return false;
240
+ const recordsByFilename = new Map(records.map((record) => [record.filename, record]));
241
+ const seenFilenames = new Set();
242
+ for (const entry of index.entries) {
243
+ const record = recordsByFilename.get(entry.filename);
244
+ if (!record || !entryMatchesRecord(entry, record))
245
+ return false;
246
+ seenFilenames.add(entry.filename);
247
+ }
248
+ return seenFilenames.size === recordsByFilename.size;
249
+ }
250
+ function indexFreshExcept(index, records, filename) {
251
+ if (!index)
252
+ return false;
253
+ const otherRecords = records.filter((record) => record.filename !== filename);
254
+ const otherEntries = index.entries.filter((entry) => entry.filename !== filename);
255
+ return indexFreshForRecords({ version: NOTES_INDEX_VERSION, entries: otherEntries }, otherRecords);
256
+ }
257
+ function makeEntry(record, embedding) {
258
+ return {
259
+ filename: record.filename,
260
+ path: record.filePath,
261
+ preview: record.preview,
262
+ embedding,
263
+ ...(record.createdAt ? { created_at: record.createdAt } : {}),
264
+ ...(record.tags ? { tags: record.tags } : {}),
265
+ mtimeMs: record.mtimeMs,
266
+ size: record.size,
267
+ };
268
+ }
269
+ function writeIndex(indexPath, index) {
270
+ fs.writeFileSync(indexPath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
271
+ }
272
+ async function embedRecord(provider, record) {
273
+ const [embedding] = await provider.embed([record.body]);
274
+ return makeEntry(record, embedding);
275
+ }
276
+ async function rebuildNotesIndex(notesDir, indexPath, provider) {
277
+ const records = listCanonicalNotes(notesDir);
278
+ const entries = [];
279
+ for (const record of records) {
280
+ entries.push(await embedRecord(provider, record));
281
+ }
282
+ const index = { version: NOTES_INDEX_VERSION, entries };
283
+ writeIndex(indexPath, index);
284
+ (0, runtime_1.emitNervesEvent)({
285
+ component: "repertoire",
286
+ event: "repertoire.record_notes_index_rebuilt",
287
+ message: "notes native index rebuilt",
288
+ meta: { notesDir, count: entries.length },
289
+ });
290
+ return index;
291
+ }
292
+ async function updateIndexForSavedNote(notesDir, indexPath, savedPath, provider) {
293
+ const savedRecord = parseCanonicalNote(savedPath, fs.statSync(savedPath));
294
+ const records = [
295
+ ...listCanonicalNotes(notesDir).filter((record) => record.filePath !== savedPath),
296
+ savedRecord,
297
+ ].sort((left, right) => left.filename.localeCompare(right.filename));
298
+ const existing = readIndex(indexPath);
299
+ if (!indexFreshExcept(existing, records, savedRecord.filename)) {
300
+ await rebuildNotesIndex(notesDir, indexPath, provider);
301
+ return;
302
+ }
303
+ const savedEntry = await embedRecord(provider, savedRecord);
304
+ const entries = [
305
+ ...existing.entries.filter((entry) => entry.filename !== savedRecord.filename),
306
+ savedEntry,
307
+ ].sort((left, right) => left.filename.localeCompare(right.filename));
308
+ writeIndex(indexPath, { version: NOTES_INDEX_VERSION, entries });
309
+ }
310
+ async function getFreshIndex(notesDir, indexPath, provider) {
311
+ const records = listCanonicalNotes(notesDir);
312
+ const existing = readIndex(indexPath);
313
+ if (indexFreshForRecords(existing, records))
314
+ return existing;
315
+ return rebuildNotesIndex(notesDir, indexPath, provider);
316
+ }
317
+ function createProviderForTool(toolName) {
318
+ const provider = (0, embedding_provider_1.createDefaultEmbeddingProvider)();
319
+ if (!provider) {
320
+ return `error: ${toolName} couldn't use notes because embeddings are not configured.`;
321
+ }
322
+ return provider;
323
+ }
324
+ function parseLimit(raw) {
325
+ const parsed = typeof raw === "string" ? Number.parseInt(raw, 10) : typeof raw === "number" ? raw : DEFAULT_LIMIT;
326
+ if (!Number.isFinite(parsed) || parsed <= 0)
327
+ return DEFAULT_LIMIT;
328
+ return Math.min(Math.floor(parsed), MAX_LIMIT);
329
+ }
330
+ function parseMinScore(raw) {
331
+ const parsed = typeof raw === "string" ? Number.parseFloat(raw) : typeof raw === "number" ? raw : DEFAULT_MIN_SCORE;
332
+ if (!Number.isFinite(parsed))
333
+ return DEFAULT_MIN_SCORE;
334
+ return parsed;
335
+ }
336
+ function parseCursor(raw) {
337
+ const parsed = typeof raw === "string" ? Number.parseInt(raw, 10) : typeof raw === "number" ? raw : 0;
338
+ if (!Number.isFinite(parsed) || parsed < 0)
339
+ return 0;
340
+ return Math.floor(parsed);
341
+ }
342
+ exports.recordToolDefinitions = [
343
+ {
344
+ tool: {
345
+ type: "function",
346
+ function: {
347
+ name: "note",
348
+ description: "Write a durable self note as canonical markdown in my Desk record notes. Only available to my self/private-runtime context, not external callers.",
349
+ parameters: {
350
+ type: "object",
351
+ properties: {
352
+ content: { type: "string" },
353
+ tags: {
354
+ type: "array",
355
+ items: { type: "string" },
356
+ },
357
+ },
358
+ required: ["content"],
359
+ },
360
+ },
361
+ },
362
+ handler: async (args, ctx) => {
363
+ if (!hasSelfTrust(ctx))
364
+ return "error: note requires self trust and cannot be used from an external caller context.";
365
+ const rawArgs = args;
366
+ const content = typeof rawArgs.content === "string" ? rawArgs.content.trim() : "";
367
+ if (!content)
368
+ return "content is required";
369
+ const provider = createProviderForTool("note");
370
+ if (typeof provider === "string")
371
+ return provider;
372
+ const cappedContent = (0, session_events_1.capStructuredRecordString)(content);
373
+ const createdAt = new Date().toISOString();
374
+ const date = createdAt.slice(0, 10);
375
+ const tags = normalizeTags(rawArgs.tags);
376
+ try {
377
+ const notesDir = (0, record_paths_1.resolveRecordNotesRoot)();
378
+ const indexPath = path.join(notesDir, ".index.json");
379
+ fs.mkdirSync(notesDir, { recursive: true });
380
+ const savedPath = ensureUniquePath(notesDir, date, slugForContent(content));
381
+ fs.writeFileSync(savedPath, renderNote(createdAt, cappedContent, tags), "utf8");
382
+ await updateIndexForSavedNote(notesDir, indexPath, savedPath, provider);
383
+ ctx?.habitSession?.recordProducedRef?.({
384
+ kind: "desk_record",
385
+ locator: bundleRelativeLocator(savedPath, ctx),
386
+ });
387
+ (0, runtime_1.emitNervesEvent)({
388
+ component: "repertoire",
389
+ event: "repertoire.record_note_saved",
390
+ message: "canonical note saved",
391
+ meta: { path: savedPath, hasTags: Boolean(tags?.length) },
392
+ });
393
+ return savedPath;
394
+ }
395
+ catch (error) {
396
+ (0, runtime_1.emitNervesEvent)({
397
+ level: "warn",
398
+ component: "repertoire",
399
+ event: "repertoire.record_note_save_error",
400
+ message: "canonical note save failed",
401
+ meta: { reason: error instanceof Error ? error.message : String(error) },
402
+ });
403
+ return "error: couldn't save the note right now.";
404
+ }
405
+ },
406
+ summaryKeys: ["content", "tags"],
407
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "writes canonical Desk record note" },
408
+ },
409
+ {
410
+ tool: {
411
+ type: "function",
412
+ function: {
413
+ name: "consult_notes",
414
+ description: "Search my canonical markdown Desk record notes semantically using the notes-native index. Read-only orientation lookup for trusted callers.",
415
+ parameters: {
416
+ type: "object",
417
+ properties: {
418
+ query: { type: "string" },
419
+ cursor: { type: "string" },
420
+ limit: { type: "string" },
421
+ minScore: { type: "string" },
422
+ },
423
+ required: ["query"],
424
+ },
425
+ },
426
+ },
427
+ handler: async (args, ctx) => {
428
+ if (!hasRecordReadTrust(ctx))
429
+ return "error: consult_notes requires trusted record-read access.";
430
+ const rawArgs = args;
431
+ const query = typeof rawArgs.query === "string" ? rawArgs.query.trim() : "";
432
+ if (!query)
433
+ return JSON.stringify({ items: [] });
434
+ const notesDir = (0, record_paths_1.resolveRecordNotesRoot)();
435
+ const indexPath = path.join(notesDir, ".index.json");
436
+ const records = listCanonicalNotes(notesDir);
437
+ if (records.length === 0)
438
+ return JSON.stringify({ items: [] });
439
+ const provider = createProviderForTool("consult_notes");
440
+ if (typeof provider === "string")
441
+ return provider;
442
+ try {
443
+ const index = await getFreshIndex(notesDir, indexPath, provider);
444
+ const [queryEmbedding] = await provider.embed([query]);
445
+ const minScore = parseMinScore(rawArgs.minScore);
446
+ const offset = parseCursor(rawArgs.cursor);
447
+ const limit = parseLimit(rawArgs.limit);
448
+ const ranked = index.entries
449
+ .filter((entry) => entry.embedding.length > 0)
450
+ .map((entry) => ({
451
+ path: entry.path,
452
+ filename: entry.filename,
453
+ excerpt: entry.preview,
454
+ score: (0, note_search_1.cosineSimilarity)(queryEmbedding, entry.embedding),
455
+ }))
456
+ .filter((entry) => entry.score >= minScore)
457
+ .sort((left, right) => right.score - left.score);
458
+ const items = ranked.slice(offset, offset + limit);
459
+ const nextOffset = offset + limit;
460
+ const result = nextOffset < ranked.length ? { items, nextCursor: String(nextOffset) } : { items };
461
+ (0, runtime_1.emitNervesEvent)({
462
+ component: "repertoire",
463
+ event: "repertoire.record_notes_consulted",
464
+ message: "canonical notes consulted",
465
+ meta: { count: items.length, totalMatches: ranked.length },
466
+ });
467
+ return JSON.stringify(result);
468
+ }
469
+ catch (error) {
470
+ (0, runtime_1.emitNervesEvent)({
471
+ level: "warn",
472
+ component: "repertoire",
473
+ event: "repertoire.record_notes_consult_error",
474
+ message: "canonical notes consult failed",
475
+ meta: { reason: error instanceof Error ? error.message : String(error) },
476
+ });
477
+ return "error: consult_notes couldn't search notes right now.";
478
+ }
479
+ },
480
+ summaryKeys: ["query"],
481
+ },
482
+ ];
@@ -0,0 +1,139 @@
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.rsvpToolDefinitions = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const runtime_1 = require("../nerves/runtime");
39
+ const query_1 = require("../rsvp/query");
40
+ const snapshot_1 = require("../rsvp/snapshot");
41
+ function readSnapshot(snapshotPath) {
42
+ if (!snapshotPath || snapshotPath.trim().length === 0) {
43
+ return { ok: false, reason: "missing", message: "RSVP snapshot not found." };
44
+ }
45
+ try {
46
+ const raw = fs.readFileSync(snapshotPath, "utf-8");
47
+ const parsed = (0, snapshot_1.parseRsvpSnapshot)(JSON.parse(raw));
48
+ if (!parsed.ok) {
49
+ return { ok: false, reason: "invalid", message: "RSVP snapshot could not be read or failed integrity validation." };
50
+ }
51
+ return { ok: true, snapshot: parsed.snapshot };
52
+ }
53
+ catch (error) {
54
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
55
+ return { ok: false, reason: "missing", message: "RSVP snapshot not found." };
56
+ }
57
+ return { ok: false, reason: "invalid", message: "RSVP snapshot could not be read or failed integrity validation." };
58
+ }
59
+ }
60
+ function emitToolRead(toolName, result) {
61
+ (0, runtime_1.emitNervesEvent)({
62
+ component: "repertoire",
63
+ event: "repertoire.rsvp_tool_read",
64
+ message: "RSVP tool read snapshot",
65
+ meta: result.ok
66
+ ? { toolName, snapshotId: result.snapshot.snapshotId, total: result.snapshot.summary.total }
67
+ : { toolName, reason: result.reason },
68
+ });
69
+ }
70
+ exports.rsvpToolDefinitions = [
71
+ {
72
+ tool: {
73
+ type: "function",
74
+ function: {
75
+ name: "rsvp_query",
76
+ description: "answer deterministic questions about a native RSVP snapshot file, such as who is pending, declined, attending, unknown, or matching a guest name.",
77
+ parameters: {
78
+ type: "object",
79
+ properties: {
80
+ snapshot_path: {
81
+ type: "string",
82
+ description: "absolute path to a native RSVP snapshot JSON file.",
83
+ },
84
+ query: {
85
+ type: "string",
86
+ description: "natural-language query or guest-name filter.",
87
+ },
88
+ status: {
89
+ type: "string",
90
+ enum: ["attending", "declined", "pending", "unknown", "all"],
91
+ description: "optional explicit RSVP status filter.",
92
+ },
93
+ },
94
+ required: ["snapshot_path"],
95
+ },
96
+ },
97
+ },
98
+ handler: async (args) => {
99
+ const result = readSnapshot(args.snapshot_path);
100
+ emitToolRead("rsvp_query", result);
101
+ if (!result.ok)
102
+ return result.message;
103
+ return (0, query_1.queryRsvpSnapshot)(result.snapshot, {
104
+ query: args.query,
105
+ status: args.status,
106
+ }).text;
107
+ },
108
+ summaryKeys: ["snapshot_path", "query", "status"],
109
+ riskProfile: { mutates: "none", risk: "low", reason: "reads a local native RSVP snapshot" },
110
+ },
111
+ {
112
+ tool: {
113
+ type: "function",
114
+ function: {
115
+ name: "rsvp_summary",
116
+ description: "summarize counts and provenance for a native RSVP snapshot file.",
117
+ parameters: {
118
+ type: "object",
119
+ properties: {
120
+ snapshot_path: {
121
+ type: "string",
122
+ description: "absolute path to a native RSVP snapshot JSON file.",
123
+ },
124
+ },
125
+ required: ["snapshot_path"],
126
+ },
127
+ },
128
+ },
129
+ handler: async (args) => {
130
+ const result = readSnapshot(args.snapshot_path);
131
+ emitToolRead("rsvp_summary", result);
132
+ if (!result.ok)
133
+ return result.message;
134
+ return (0, query_1.summarizeRsvpSnapshot)(result.snapshot);
135
+ },
136
+ summaryKeys: ["snapshot_path"],
137
+ riskProfile: { mutates: "none", risk: "low", reason: "reads a local native RSVP snapshot" },
138
+ },
139
+ ];