@ouro.bot/cli 0.1.0-alpha.75 → 0.1.0-alpha.750

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 (602) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -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/assets/bluebubbles-host +264 -0
  14. package/changelog.json +4812 -16
  15. package/deploy/unraid/Dockerfile +48 -0
  16. package/deploy/unraid/README.txt +2373 -0
  17. package/deploy/unraid/audit-container-spec.sh +4 -0
  18. package/deploy/unraid/container-runtime.json +1 -0
  19. package/deploy/unraid/migrate-sanctuary-bundle.mjs +21 -0
  20. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  21. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  22. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  23. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  24. package/deploy/unraid/ouro-events/usenet-health.sh +178 -0
  25. package/deploy/unraid/sanctuary-acceptance-adapter.sh +37 -0
  26. package/deploy/unraid/sanctuary-acceptance-contract.json +201 -0
  27. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  28. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  29. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  30. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +1800 -0
  31. package/deploy/unraid/sanctuary-unit16-run.sh +520 -0
  32. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  33. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  34. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  35. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  36. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  37. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  38. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  39. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  40. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +9 -0
  41. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +9 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +9 -0
  43. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  44. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  45. package/deploy/unraid/sanctuary.xml +28 -0
  46. package/dist/a2a/card.js +57 -0
  47. package/dist/a2a/client.js +180 -0
  48. package/dist/a2a/config.js +50 -0
  49. package/dist/a2a/delegation-stores.js +56 -0
  50. package/dist/a2a/did-resolution.js +93 -0
  51. package/dist/a2a/identity.js +170 -0
  52. package/dist/a2a/inbound-share.js +107 -0
  53. package/dist/a2a/mission-result-wire.js +196 -0
  54. package/dist/a2a/onboarding.js +115 -0
  55. package/dist/a2a/pin-store.js +132 -0
  56. package/dist/a2a/seen-ledger.js +120 -0
  57. package/dist/a2a/server.js +604 -0
  58. package/dist/a2a/task-store.js +69 -0
  59. package/dist/a2a/transport.js +45 -0
  60. package/dist/a2a/types.js +3 -0
  61. package/dist/arc/attention-types.js +8 -0
  62. package/dist/arc/cares.js +278 -0
  63. package/dist/arc/episodes.js +118 -0
  64. package/dist/arc/evolution.js +490 -0
  65. package/dist/arc/flight-recorder.js +1034 -0
  66. package/dist/arc/intentions.js +134 -0
  67. package/dist/arc/json-store.js +117 -0
  68. package/dist/arc/obligations.js +386 -0
  69. package/dist/arc/packets.js +336 -0
  70. package/dist/arc/presence.js +185 -0
  71. package/dist/arc/task-lifecycle.js +57 -0
  72. package/dist/commerce/store.js +755 -0
  73. package/dist/commerce/types.js +3 -0
  74. package/dist/heart/active-work.js +820 -28
  75. package/dist/heart/agent-entry.js +190 -3
  76. package/dist/heart/approval-files.js +113 -0
  77. package/dist/heart/approval-store.js +950 -0
  78. package/dist/heart/attachments/image-normalize.js +194 -0
  79. package/dist/heart/attachments/materialize.js +97 -0
  80. package/dist/heart/attachments/originals.js +88 -0
  81. package/dist/heart/attachments/render.js +29 -0
  82. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  83. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  84. package/dist/heart/attachments/sources/index.js +16 -0
  85. package/dist/heart/attachments/store.js +103 -0
  86. package/dist/heart/attachments/types.js +93 -0
  87. package/dist/heart/auth/auth-flow.js +495 -0
  88. package/dist/heart/autonomy-budget.js +477 -0
  89. package/dist/heart/awaiting/await-alert.js +148 -0
  90. package/dist/heart/awaiting/await-expiry.js +143 -0
  91. package/dist/heart/awaiting/await-loader.js +91 -0
  92. package/dist/heart/awaiting/await-parser.js +149 -0
  93. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  94. package/dist/heart/awaiting/await-scheduler.js +382 -0
  95. package/dist/heart/background-operations.js +281 -0
  96. package/dist/heart/bridges/manager.js +137 -17
  97. package/dist/heart/bridges/store.js +14 -2
  98. package/dist/heart/bundle-state.js +168 -0
  99. package/dist/heart/commitments.js +68 -15
  100. package/dist/heart/config-registry.js +331 -0
  101. package/dist/heart/config.js +128 -129
  102. package/dist/heart/context-loss-gauntlet.js +383 -0
  103. package/dist/heart/context-loss-sentinel.js +1157 -0
  104. package/dist/heart/core.js +1761 -456
  105. package/dist/heart/cross-chat-delivery.js +9 -22
  106. package/dist/heart/daemon/agent-config-check.js +451 -0
  107. package/dist/heart/daemon/agent-discovery.js +185 -3
  108. package/dist/heart/daemon/agent-service.js +542 -0
  109. package/dist/heart/daemon/agentic-repair.js +547 -0
  110. package/dist/heart/daemon/await-private-wake.js +59 -0
  111. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  112. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  113. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  114. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  115. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  116. package/dist/heart/daemon/cadence.js +180 -0
  117. package/dist/heart/daemon/cli-defaults.js +832 -0
  118. package/dist/heart/daemon/cli-desk.js +322 -0
  119. package/dist/heart/daemon/cli-exec.js +8692 -0
  120. package/dist/heart/daemon/cli-help.js +710 -0
  121. package/dist/heart/daemon/cli-parse.js +2714 -0
  122. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  123. package/dist/heart/daemon/cli-render.js +777 -0
  124. package/dist/heart/daemon/cli-types.js +8 -0
  125. package/dist/heart/daemon/connect-bay.js +323 -0
  126. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  127. package/dist/heart/daemon/container-healthcheck.js +96 -0
  128. package/dist/heart/daemon/container-runtime.js +97 -0
  129. package/dist/heart/daemon/container-spec-auditor-main.js +160 -0
  130. package/dist/heart/daemon/container-spec-auditor.js +178 -0
  131. package/dist/heart/daemon/daemon-bootstrap-startup.js +41 -0
  132. package/dist/heart/daemon/daemon-cli.js +29 -2144
  133. package/dist/heart/daemon/daemon-entry.js +944 -10
  134. package/dist/heart/daemon/daemon-health.js +186 -0
  135. package/dist/heart/daemon/daemon-rollup.js +57 -0
  136. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  137. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  138. package/dist/heart/daemon/daemon.js +1830 -88
  139. package/dist/heart/daemon/dns-workflow.js +394 -0
  140. package/dist/heart/daemon/doctor-types.js +8 -0
  141. package/dist/heart/daemon/doctor.js +1755 -0
  142. package/dist/heart/daemon/freshness.js +345 -0
  143. package/dist/heart/daemon/habit-private-wake.js +61 -0
  144. package/dist/heart/daemon/health-monitor.js +142 -11
  145. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  146. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  147. package/dist/heart/daemon/http-health-probe.js +80 -0
  148. package/dist/heart/daemon/human-command-screens.js +234 -0
  149. package/dist/heart/daemon/human-readiness.js +114 -0
  150. package/dist/heart/daemon/inner-status.js +78 -0
  151. package/dist/heart/daemon/interactive-repair.js +394 -0
  152. package/dist/heart/daemon/launchd.js +37 -8
  153. package/dist/heart/daemon/log-tailer.js +79 -10
  154. package/dist/heart/daemon/logs-prune.js +132 -0
  155. package/dist/heart/daemon/mcp-canary.js +524 -0
  156. package/dist/heart/daemon/message-router.js +45 -5
  157. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  158. package/dist/heart/daemon/os-cron-deps.js +135 -0
  159. package/dist/heart/daemon/os-cron.js +22 -14
  160. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  161. package/dist/heart/daemon/ouro-entry.js +3 -1
  162. package/dist/heart/daemon/plugin-cli.js +432 -0
  163. package/dist/heart/daemon/process-manager.js +624 -61
  164. package/dist/heart/daemon/provider-discovery.js +137 -0
  165. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  166. package/dist/heart/daemon/prunable-bundle.js +144 -0
  167. package/dist/heart/daemon/pulse.js +511 -0
  168. package/dist/heart/daemon/readiness-repair.js +365 -0
  169. package/dist/heart/daemon/run-hooks.js +2 -0
  170. package/dist/heart/daemon/runtime-logging.js +47 -14
  171. package/dist/heart/daemon/runtime-metadata.js +2 -30
  172. package/dist/heart/daemon/runtime-mode.js +13 -2
  173. package/dist/heart/daemon/safe-mode.js +161 -0
  174. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2426 -0
  175. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1621 -0
  176. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  177. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  178. package/dist/heart/daemon/sanctuary-bundle-migration.js +398 -0
  179. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  180. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  181. package/dist/heart/daemon/sense-manager.js +689 -48
  182. package/dist/heart/daemon/session-id-resolver.js +131 -0
  183. package/dist/heart/daemon/skill-management-installer.js +1 -1
  184. package/dist/heart/daemon/socket-client.js +180 -12
  185. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  186. package/dist/heart/daemon/startup-tui.js +338 -0
  187. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  188. package/dist/heart/daemon/task-scheduler.js +117 -39
  189. package/dist/heart/daemon/terminal-ui.js +499 -0
  190. package/dist/heart/daemon/thoughts.js +138 -54
  191. package/dist/heart/daemon/up-progress.js +366 -0
  192. package/dist/heart/daemon/vault-items.js +56 -0
  193. package/dist/heart/delegation.js +1 -4
  194. package/dist/heart/external-events/router.js +1103 -0
  195. package/dist/heart/habits/habit-cancel.js +810 -0
  196. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  197. package/dist/heart/habits/habit-migration.js +194 -0
  198. package/dist/heart/habits/habit-parser.js +278 -0
  199. package/dist/heart/habits/habit-runtime-state.js +93 -0
  200. package/dist/heart/habits/habit-scheduler.js +653 -0
  201. package/dist/heart/habits/habit-session-summary.js +318 -0
  202. package/dist/heart/habits/habit-session.js +636 -0
  203. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  204. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  205. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  206. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  207. package/dist/heart/identity.js +184 -59
  208. package/dist/heart/kept-notes.js +289 -0
  209. package/dist/heart/kicks.js +1 -1
  210. package/dist/heart/machine-identity.js +161 -0
  211. package/dist/heart/mail-import-discovery.js +353 -0
  212. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  213. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  214. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  215. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  216. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  217. package/dist/heart/mailbox/mailbox-http.js +99 -0
  218. package/dist/heart/mailbox/mailbox-read.js +39 -0
  219. package/dist/heart/mailbox/mailbox-types.js +27 -0
  220. package/dist/heart/mailbox/mailbox-view.js +197 -0
  221. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  222. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  223. package/dist/heart/mailbox/readers/mail.js +375 -0
  224. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  225. package/dist/heart/mailbox/readers/sessions.js +232 -0
  226. package/dist/heart/mailbox/readers/shared.js +111 -0
  227. package/dist/heart/mcp/mcp-server.js +696 -0
  228. package/dist/heart/migrate-config.js +100 -0
  229. package/dist/heart/model-capabilities.js +11 -0
  230. package/dist/heart/orientation-frame.js +345 -0
  231. package/dist/heart/platform.js +81 -0
  232. package/dist/heart/primitives.js +1 -1
  233. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  234. package/dist/heart/private-runtime/index.js +18 -0
  235. package/dist/heart/private-runtime/ledger.js +218 -0
  236. package/dist/heart/private-runtime/policy.js +214 -0
  237. package/dist/heart/private-runtime/types.js +2 -0
  238. package/dist/heart/progress-story.js +1 -1
  239. package/dist/heart/provider-attempt.js +137 -0
  240. package/dist/heart/provider-binding-resolver.js +273 -0
  241. package/dist/heart/provider-credentials.js +449 -0
  242. package/dist/heart/provider-failover.js +311 -0
  243. package/dist/heart/provider-models.js +96 -0
  244. package/dist/heart/provider-ping.js +265 -0
  245. package/dist/heart/provider-readiness-cache.js +119 -0
  246. package/dist/heart/provider-visibility.js +188 -0
  247. package/dist/heart/providers/anthropic-token.js +131 -0
  248. package/dist/heart/providers/anthropic.js +173 -60
  249. package/dist/heart/providers/azure.js +23 -11
  250. package/dist/heart/providers/error-classification.js +127 -0
  251. package/dist/heart/providers/github-copilot.js +34 -38
  252. package/dist/heart/providers/minimax-vlm.js +189 -0
  253. package/dist/heart/providers/minimax.js +26 -8
  254. package/dist/heart/providers/openai-codex-token.js +349 -0
  255. package/dist/heart/providers/openai-codex.js +55 -40
  256. package/dist/heart/providers/openai-compatible.js +177 -0
  257. package/dist/heart/run-ledger.js +247 -0
  258. package/dist/heart/runtime-capability-check.js +170 -0
  259. package/dist/heart/runtime-credentials.js +607 -0
  260. package/dist/heart/runtime-cwd.js +87 -0
  261. package/dist/heart/sense-truth.js +22 -4
  262. package/dist/heart/session-activity.js +90 -24
  263. package/dist/heart/session-events.js +1318 -0
  264. package/dist/heart/session-playback-cli-main.js +5 -0
  265. package/dist/heart/session-playback-cli.js +36 -0
  266. package/dist/heart/session-playback.js +231 -0
  267. package/dist/heart/session-stats-cli-main.js +5 -0
  268. package/dist/heart/session-stats.js +182 -0
  269. package/dist/heart/session-transcript.js +133 -0
  270. package/dist/heart/start-of-turn-packet.js +368 -0
  271. package/dist/heart/steward-policy.js +302 -0
  272. package/dist/heart/streaming.js +604 -207
  273. package/dist/heart/structured-output.js +196 -0
  274. package/dist/heart/sync-classification.js +176 -0
  275. package/dist/heart/sync.js +449 -0
  276. package/dist/heart/target-resolution.js +11 -7
  277. package/dist/heart/tempo.js +93 -0
  278. package/dist/heart/temporal-view.js +41 -0
  279. package/dist/heart/timeouts.js +101 -0
  280. package/dist/heart/tool-activity-callbacks.js +59 -0
  281. package/dist/heart/tool-approval.js +342 -0
  282. package/dist/heart/tool-description.js +155 -0
  283. package/dist/heart/tool-friction.js +55 -0
  284. package/dist/heart/tool-loop.js +200 -0
  285. package/dist/heart/turn-context.js +481 -0
  286. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  287. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  288. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  289. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  290. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  291. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  292. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  293. package/dist/heart/versioning/update-hooks.js +154 -0
  294. package/dist/heart/versioning/version-intent.js +114 -0
  295. package/dist/heart/work-card.js +380 -0
  296. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  297. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  298. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  299. package/dist/mailbox-ui/index.html +16 -0
  300. package/dist/mailroom/attention.js +167 -0
  301. package/dist/mailroom/autonomy.js +209 -0
  302. package/dist/mailroom/blob-store.js +889 -0
  303. package/dist/mailroom/body-cache.js +61 -0
  304. package/dist/mailroom/cache-sync-cli.js +58 -0
  305. package/dist/mailroom/core.js +803 -0
  306. package/dist/mailroom/entry.js +160 -0
  307. package/dist/mailroom/file-store.js +568 -0
  308. package/dist/mailroom/hosted-cache-sync.js +384 -0
  309. package/dist/mailroom/mbox-import.js +393 -0
  310. package/dist/mailroom/migration.js +164 -0
  311. package/dist/mailroom/outbound.js +380 -0
  312. package/dist/mailroom/policy.js +263 -0
  313. package/dist/mailroom/reader.js +292 -0
  314. package/dist/mailroom/search-cache.js +513 -0
  315. package/dist/mailroom/search-relevance.js +319 -0
  316. package/dist/mailroom/smtp-ingress.js +176 -0
  317. package/dist/mailroom/source-state.js +176 -0
  318. package/dist/mailroom/thread.js +109 -0
  319. package/dist/mailroom/travel-extract.js +89 -0
  320. package/dist/mind/bundle-manifest.js +24 -2
  321. package/dist/mind/context.js +278 -111
  322. package/dist/mind/desk-section.js +362 -0
  323. package/dist/mind/diary-integrity.js +60 -0
  324. package/dist/mind/{memory.js → diary.js} +68 -77
  325. package/dist/mind/embedding-provider.js +60 -0
  326. package/dist/mind/file-state.js +179 -0
  327. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  328. package/dist/mind/obligation-steering.js +227 -0
  329. package/dist/mind/pending.js +34 -8
  330. package/dist/mind/prompt-budget.js +479 -0
  331. package/dist/mind/prompt-refresh.js +3 -2
  332. package/dist/mind/prompt.js +1050 -187
  333. package/dist/mind/provenance-trust.js +26 -0
  334. package/dist/mind/record-paths.js +312 -0
  335. package/dist/mind/scrutiny.js +173 -0
  336. package/dist/mind/session-transaction.js +379 -0
  337. package/dist/nerves/cli-logging.js +7 -1
  338. package/dist/nerves/coverage/audit-rules.js +15 -6
  339. package/dist/nerves/coverage/audit.js +28 -2
  340. package/dist/nerves/coverage/cli.js +1 -1
  341. package/dist/nerves/coverage/contract.js +5 -5
  342. package/dist/nerves/coverage/file-completeness.js +139 -5
  343. package/dist/nerves/coverage/run-artifacts.js +55 -35
  344. package/dist/nerves/coverage/source-scanner.js +4 -4
  345. package/dist/nerves/event-buffer.js +111 -0
  346. package/dist/nerves/index.js +293 -9
  347. package/dist/nerves/observation.js +20 -0
  348. package/dist/nerves/redact.js +79 -0
  349. package/dist/nerves/review/cli-main.js +5 -0
  350. package/dist/nerves/review/cli.js +156 -0
  351. package/dist/nerves/review/core.js +159 -0
  352. package/dist/nerves/runtime.js +17 -1
  353. package/dist/repertoire/ado-client.js +15 -56
  354. package/dist/repertoire/ado-semantic.js +16 -10
  355. package/dist/repertoire/api-client.js +97 -0
  356. package/dist/repertoire/bitwarden-store.js +1045 -0
  357. package/dist/repertoire/bundle-templates.js +71 -0
  358. package/dist/repertoire/bw-installer.js +180 -0
  359. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  360. package/dist/repertoire/coding/context-pack.js +331 -0
  361. package/dist/repertoire/coding/feedback.js +218 -30
  362. package/dist/repertoire/coding/index.js +15 -3
  363. package/dist/repertoire/coding/manager.js +166 -10
  364. package/dist/repertoire/coding/spawner.js +58 -11
  365. package/dist/repertoire/coding/tools.js +242 -14
  366. package/dist/repertoire/coding/workbench-client.js +272 -0
  367. package/dist/repertoire/coding/workbench-manager.js +346 -0
  368. package/dist/repertoire/commerce-errors.js +109 -0
  369. package/dist/repertoire/commerce-self-test.js +156 -0
  370. package/dist/repertoire/credential-access.js +178 -0
  371. package/dist/repertoire/desk/classifier.js +362 -0
  372. package/dist/repertoire/duffel-client.js +185 -0
  373. package/dist/repertoire/github-client.js +14 -55
  374. package/dist/repertoire/graph-client.js +11 -52
  375. package/dist/repertoire/guardrails.js +813 -18
  376. package/dist/repertoire/mcp-client.js +44 -3
  377. package/dist/repertoire/mcp-manager.js +259 -20
  378. package/dist/repertoire/mcp-tools.js +83 -0
  379. package/dist/repertoire/plugin-mcp.js +175 -0
  380. package/dist/repertoire/plugins.js +253 -0
  381. package/dist/repertoire/relationship-authorization.js +194 -0
  382. package/dist/repertoire/shell-sessions.js +133 -0
  383. package/dist/repertoire/skills.js +48 -4
  384. package/dist/repertoire/stripe-client.js +131 -0
  385. package/dist/repertoire/tool-arguments.js +143 -0
  386. package/dist/repertoire/tool-results.js +29 -0
  387. package/dist/repertoire/tools-a2a.js +699 -0
  388. package/dist/repertoire/tools-attachments.js +317 -0
  389. package/dist/repertoire/tools-awaiting.js +575 -0
  390. package/dist/repertoire/tools-base.js +82 -1124
  391. package/dist/repertoire/tools-bluebubbles.js +2 -0
  392. package/dist/repertoire/tools-bridge.js +144 -0
  393. package/dist/repertoire/tools-bundle.js +993 -0
  394. package/dist/repertoire/tools-commerce.js +253 -0
  395. package/dist/repertoire/tools-config.js +186 -0
  396. package/dist/repertoire/tools-continuity.js +507 -0
  397. package/dist/repertoire/tools-credential.js +383 -0
  398. package/dist/repertoire/tools-evolution.js +527 -0
  399. package/dist/repertoire/tools-files.js +344 -0
  400. package/dist/repertoire/tools-flight.js +290 -0
  401. package/dist/repertoire/tools-flow.js +119 -0
  402. package/dist/repertoire/tools-github.js +3 -8
  403. package/dist/repertoire/tools-habits.js +103 -0
  404. package/dist/repertoire/tools-mail.js +1828 -0
  405. package/dist/repertoire/tools-notes.js +485 -0
  406. package/dist/repertoire/tools-obligations.js +182 -0
  407. package/dist/repertoire/tools-orientation.js +31 -0
  408. package/dist/repertoire/tools-record.js +482 -0
  409. package/dist/repertoire/tools-rsvp.js +139 -0
  410. package/dist/repertoire/tools-runtime.js +150 -0
  411. package/dist/repertoire/tools-session.js +1096 -0
  412. package/dist/repertoire/tools-shell.js +133 -0
  413. package/dist/repertoire/tools-steward-policy.js +88 -0
  414. package/dist/repertoire/tools-stripe.js +224 -0
  415. package/dist/repertoire/tools-surface.js +355 -0
  416. package/dist/repertoire/tools-teams.js +12 -39
  417. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  418. package/dist/repertoire/tools-travel.js +125 -0
  419. package/dist/repertoire/tools-trip.js +982 -0
  420. package/dist/repertoire/tools-unraid.js +460 -0
  421. package/dist/repertoire/tools-user-profile.js +146 -0
  422. package/dist/repertoire/tools-vault.js +40 -0
  423. package/dist/repertoire/tools-voice.js +145 -0
  424. package/dist/repertoire/tools.js +371 -80
  425. package/dist/repertoire/travel-api-client.js +360 -0
  426. package/dist/repertoire/unraid-client.js +155 -0
  427. package/dist/repertoire/unraid-restart.js +212 -0
  428. package/dist/repertoire/user-profile.js +131 -0
  429. package/dist/repertoire/vault-setup.js +246 -0
  430. package/dist/repertoire/vault-unlock.js +628 -0
  431. package/dist/rsvp/aisleplanner-client.js +354 -0
  432. package/dist/rsvp/cli.js +926 -0
  433. package/dist/rsvp/config.js +327 -0
  434. package/dist/rsvp/cutover.js +433 -0
  435. package/dist/rsvp/diagnostics.js +232 -0
  436. package/dist/rsvp/diff-renderer.js +176 -0
  437. package/dist/rsvp/habit-policy.js +110 -0
  438. package/dist/rsvp/habit-stage.js +123 -0
  439. package/dist/rsvp/incident-bundle.js +97 -0
  440. package/dist/rsvp/migration.js +204 -0
  441. package/dist/rsvp/native-habit-runner.js +630 -0
  442. package/dist/rsvp/outbound-state.js +628 -0
  443. package/dist/rsvp/query.js +118 -0
  444. package/dist/rsvp/replay.js +233 -0
  445. package/dist/rsvp/snapshot.js +232 -0
  446. package/dist/rsvp/spend-ledger.js +175 -0
  447. package/dist/scripts/claude-code-hook.js +41 -0
  448. package/dist/scripts/claude-code-stop-hook.js +47 -0
  449. package/dist/senses/a2a-entry.js +115 -0
  450. package/dist/senses/attention-queue.js +186 -0
  451. package/dist/senses/await-turn-message.js +58 -0
  452. package/dist/senses/bluebubbles/active-turns.js +216 -0
  453. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  454. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  455. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  456. package/dist/senses/bluebubbles/context-packet.js +207 -0
  457. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  458. package/dist/senses/bluebubbles/entry.js +90 -0
  459. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  460. package/dist/senses/bluebubbles/index.js +3839 -0
  461. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  462. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  463. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  464. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  465. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  466. package/dist/senses/bluebubbles/processed-log.js +133 -0
  467. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  468. package/dist/senses/bluebubbles/replay.js +284 -0
  469. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  470. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  471. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  472. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  473. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  474. package/dist/senses/cli/bracketed-paste.js +82 -0
  475. package/dist/senses/cli/image-paste.js +287 -0
  476. package/dist/senses/cli/image-ref-navigation.js +75 -0
  477. package/dist/senses/cli/ink-app.js +156 -0
  478. package/dist/senses/cli/inline-diff.js +64 -0
  479. package/dist/senses/cli/input-keys.js +174 -0
  480. package/dist/senses/cli/kill-ring.js +86 -0
  481. package/dist/senses/cli/message-list.js +51 -0
  482. package/dist/senses/cli/ouro-tui.js +607 -0
  483. package/dist/senses/cli/spinner-imperative.js +135 -0
  484. package/dist/senses/cli/spinner.js +101 -0
  485. package/dist/senses/cli/status-line.js +60 -0
  486. package/dist/senses/cli/streaming-markdown.js +526 -0
  487. package/dist/senses/cli/tool-display.js +85 -0
  488. package/dist/senses/cli/tool-render.js +85 -0
  489. package/dist/senses/cli/tui-store.js +241 -0
  490. package/dist/senses/cli/virtual-list.js +35 -0
  491. package/dist/senses/cli-entry.js +60 -8
  492. package/dist/senses/cli-layout.js +100 -0
  493. package/dist/senses/cli.js +621 -321
  494. package/dist/senses/commands.js +66 -3
  495. package/dist/senses/context-packet-ledger.js +371 -0
  496. package/dist/senses/context-packets.js +154 -0
  497. package/dist/senses/habit-lifecycle-guard.js +24 -0
  498. package/dist/senses/habit-turn-message.js +160 -0
  499. package/dist/senses/ingress-evidence.js +2 -0
  500. package/dist/senses/mail-entry.js +66 -0
  501. package/dist/senses/mail.js +524 -0
  502. package/dist/senses/pipeline.js +1074 -193
  503. package/dist/senses/private-runtime-worker.js +774 -0
  504. package/dist/senses/private-runtime.js +1459 -0
  505. package/dist/senses/proactive-content-guard.js +51 -0
  506. package/dist/senses/sanctuary-grounding.js +118 -0
  507. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  508. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  509. package/dist/senses/sanctuary-health-runner.js +101 -0
  510. package/dist/senses/sanctuary-health.js +408 -0
  511. package/dist/senses/sanctuary-interactive-control.js +306 -0
  512. package/dist/senses/sanctuary-runtime.js +240 -0
  513. package/dist/senses/sanctuary-sab.js +80 -0
  514. package/dist/senses/shared-turn.js +487 -0
  515. package/dist/senses/surface-tool.js +109 -0
  516. package/dist/senses/teams-entry.js +60 -8
  517. package/dist/senses/teams.js +515 -217
  518. package/dist/senses/telegram-admission.js +695 -0
  519. package/dist/senses/telegram-approval-runtime.js +566 -0
  520. package/dist/senses/telegram-audit-ledger.js +220 -0
  521. package/dist/senses/telegram-client.js +1635 -0
  522. package/dist/senses/telegram-effect-adapter.js +787 -0
  523. package/dist/senses/telegram-entry.js +83 -0
  524. package/dist/senses/telegram.js +1914 -0
  525. package/dist/senses/trust-gate.js +104 -9
  526. package/dist/senses/voice/audio-playback.js +237 -0
  527. package/dist/senses/voice/audio-routing.js +119 -0
  528. package/dist/senses/voice/elevenlabs.js +202 -0
  529. package/dist/senses/voice/floor-control.js +431 -0
  530. package/dist/senses/voice/floor-controller.js +115 -0
  531. package/dist/senses/voice/golden-path.js +116 -0
  532. package/dist/senses/voice/index.js +29 -0
  533. package/dist/senses/voice/meeting.js +113 -0
  534. package/dist/senses/voice/outbound.js +190 -0
  535. package/dist/senses/voice/phone.js +33 -0
  536. package/dist/senses/voice/playback.js +139 -0
  537. package/dist/senses/voice/realtime-eval.js +496 -0
  538. package/dist/senses/voice/realtime-trace.js +531 -0
  539. package/dist/senses/voice/transcript.js +70 -0
  540. package/dist/senses/voice/turn.js +191 -0
  541. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  542. package/dist/senses/voice/twilio-phone.js +5081 -0
  543. package/dist/senses/voice/types.js +2 -0
  544. package/dist/senses/voice/whisper.js +161 -0
  545. package/dist/senses/voice-entry.js +81 -0
  546. package/dist/senses/voice-realtime-eval-command.js +99 -0
  547. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  548. package/dist/senses/voice-twilio-entry.js +87 -0
  549. package/dist/trips/core.js +138 -0
  550. package/dist/trips/store.js +265 -0
  551. package/dist/util/frontmatter.js +69 -0
  552. package/npm-shrinkwrap.json +8129 -0
  553. package/package.json +71 -12
  554. package/skills/agent-commerce.md +113 -0
  555. package/skills/browser-navigation.md +117 -0
  556. package/skills/commerce-setup-guide.md +116 -0
  557. package/skills/commerce-setup.md +84 -0
  558. package/skills/configure-dev-tools.md +99 -0
  559. package/skills/travel-planning.md +138 -0
  560. package/dist/heart/daemon/auth-flow.js +0 -430
  561. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  562. package/dist/heart/daemon/update-hooks.js +0 -138
  563. package/dist/heart/safe-workspace.js +0 -228
  564. package/dist/heart/session-recall.js +0 -116
  565. package/dist/mind/friends/channel.js +0 -84
  566. package/dist/mind/friends/group-context.js +0 -144
  567. package/dist/mind/friends/resolver.js +0 -84
  568. package/dist/mind/friends/store-file.js +0 -190
  569. package/dist/mind/friends/store.js +0 -4
  570. package/dist/mind/friends/tokens.js +0 -26
  571. package/dist/mind/friends/trust-explanation.js +0 -74
  572. package/dist/mind/friends/types.js +0 -29
  573. package/dist/repertoire/tasks/board.js +0 -134
  574. package/dist/repertoire/tasks/index.js +0 -224
  575. package/dist/repertoire/tasks/lifecycle.js +0 -80
  576. package/dist/repertoire/tasks/middleware.js +0 -65
  577. package/dist/repertoire/tasks/parser.js +0 -173
  578. package/dist/repertoire/tasks/scanner.js +0 -132
  579. package/dist/repertoire/tasks/transitions.js +0 -144
  580. package/dist/senses/bluebubbles-entry.js +0 -13
  581. package/dist/senses/bluebubbles.js +0 -1180
  582. package/dist/senses/debug-activity.js +0 -148
  583. package/dist/senses/inner-dialog-worker.js +0 -90
  584. package/dist/senses/inner-dialog.js +0 -509
  585. package/subagents/README.md +0 -7
  586. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  587. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  588. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  589. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  590. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  591. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  592. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  593. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  594. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  595. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  596. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  597. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  598. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  599. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  600. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  601. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  602. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.orientationToolDefinitions = void 0;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ exports.orientationToolDefinitions = [
6
+ {
7
+ tool: {
8
+ type: "function",
9
+ function: {
10
+ name: "orientation_get",
11
+ description: "return my current turn orientation frame: user-visible speech, channel/source metadata, active referents from the previous assistant response, and the current action policy. use this before mutating durable state when the user's latest message is terse, corrective, or referent-dependent.",
12
+ parameters: {
13
+ type: "object",
14
+ properties: {},
15
+ required: [],
16
+ },
17
+ },
18
+ },
19
+ handler: (_args, ctx) => {
20
+ (0, runtime_1.emitNervesEvent)({
21
+ component: "repertoire",
22
+ event: "repertoire.orientation_get",
23
+ message: "orientation frame requested",
24
+ meta: { available: !!ctx?.orientationFrame },
25
+ });
26
+ if (!ctx?.orientationFrame)
27
+ return "no orientation frame is available for this turn.";
28
+ return JSON.stringify(ctx.orientationFrame, null, 2);
29
+ },
30
+ },
31
+ ];
@@ -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
+ ];