@ouro.bot/cli 0.1.0-alpha.80 → 0.1.0-alpha.800

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 (613) 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 +5117 -16
  15. package/deploy/unraid/Dockerfile +48 -0
  16. package/deploy/unraid/README.txt +3012 -0
  17. package/deploy/unraid/audit-container-spec.sh +4 -0
  18. package/deploy/unraid/container-runtime.json +1 -0
  19. package/deploy/unraid/docker-man-template-transaction.mjs +526 -0
  20. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  21. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  22. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  23. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  24. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  25. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  26. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  27. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  28. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  29. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  30. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  31. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  32. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  33. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  34. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  35. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  36. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  37. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  38. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  39. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  40. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  41. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  43. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  45. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  46. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  47. package/deploy/unraid/sanctuary.xml +27 -0
  48. package/dist/a2a/card.js +57 -0
  49. package/dist/a2a/client.js +180 -0
  50. package/dist/a2a/config.js +50 -0
  51. package/dist/a2a/delegation-stores.js +56 -0
  52. package/dist/a2a/did-resolution.js +93 -0
  53. package/dist/a2a/identity.js +170 -0
  54. package/dist/a2a/inbound-share.js +107 -0
  55. package/dist/a2a/mission-result-wire.js +196 -0
  56. package/dist/a2a/onboarding.js +115 -0
  57. package/dist/a2a/pin-store.js +132 -0
  58. package/dist/a2a/seen-ledger.js +120 -0
  59. package/dist/a2a/server.js +604 -0
  60. package/dist/a2a/task-store.js +69 -0
  61. package/dist/a2a/transport.js +45 -0
  62. package/dist/a2a/types.js +3 -0
  63. package/dist/arc/attention-types.js +8 -0
  64. package/dist/arc/cares.js +360 -0
  65. package/dist/arc/episodes.js +118 -0
  66. package/dist/arc/evolution.js +490 -0
  67. package/dist/arc/flight-recorder.js +1034 -0
  68. package/dist/arc/intentions.js +134 -0
  69. package/dist/arc/json-store.js +117 -0
  70. package/dist/arc/obligations.js +386 -0
  71. package/dist/arc/packets.js +336 -0
  72. package/dist/arc/presence.js +185 -0
  73. package/dist/arc/task-lifecycle.js +57 -0
  74. package/dist/commerce/store.js +755 -0
  75. package/dist/commerce/types.js +3 -0
  76. package/dist/heart/active-work.js +820 -29
  77. package/dist/heart/agent-entry.js +252 -3
  78. package/dist/heart/approval-files.js +113 -0
  79. package/dist/heart/approval-store.js +950 -0
  80. package/dist/heart/attachments/image-normalize.js +194 -0
  81. package/dist/heart/attachments/materialize.js +97 -0
  82. package/dist/heart/attachments/originals.js +88 -0
  83. package/dist/heart/attachments/render.js +29 -0
  84. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  85. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  86. package/dist/heart/attachments/sources/index.js +18 -0
  87. package/dist/heart/attachments/sources/telegram.js +71 -0
  88. package/dist/heart/attachments/store.js +132 -0
  89. package/dist/heart/attachments/types.js +93 -0
  90. package/dist/heart/auth/auth-flow.js +495 -0
  91. package/dist/heart/autonomy-budget.js +478 -0
  92. package/dist/heart/awaiting/await-alert.js +148 -0
  93. package/dist/heart/awaiting/await-expiry.js +143 -0
  94. package/dist/heart/awaiting/await-loader.js +91 -0
  95. package/dist/heart/awaiting/await-parser.js +149 -0
  96. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  97. package/dist/heart/awaiting/await-scheduler.js +382 -0
  98. package/dist/heart/background-operations.js +281 -0
  99. package/dist/heart/bridges/manager.js +137 -17
  100. package/dist/heart/bridges/store.js +14 -2
  101. package/dist/heart/bundle-state.js +168 -0
  102. package/dist/heart/commitments.js +64 -18
  103. package/dist/heart/config-registry.js +331 -0
  104. package/dist/heart/config.js +142 -129
  105. package/dist/heart/context-loss-gauntlet.js +387 -0
  106. package/dist/heart/context-loss-sentinel.js +1157 -0
  107. package/dist/heart/core.js +2132 -572
  108. package/dist/heart/cross-chat-delivery.js +9 -22
  109. package/dist/heart/daemon/agent-config-check.js +451 -0
  110. package/dist/heart/daemon/agent-discovery.js +185 -3
  111. package/dist/heart/daemon/agent-service.js +542 -0
  112. package/dist/heart/daemon/agentic-repair.js +547 -0
  113. package/dist/heart/daemon/await-private-wake.js +59 -0
  114. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  115. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  116. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  117. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  118. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  119. package/dist/heart/daemon/cadence.js +180 -0
  120. package/dist/heart/daemon/cli-defaults.js +836 -0
  121. package/dist/heart/daemon/cli-desk.js +322 -0
  122. package/dist/heart/daemon/cli-exec.js +8730 -0
  123. package/dist/heart/daemon/cli-help.js +710 -0
  124. package/dist/heart/daemon/cli-parse.js +2719 -0
  125. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  126. package/dist/heart/daemon/cli-render.js +777 -0
  127. package/dist/heart/daemon/cli-types.js +8 -0
  128. package/dist/heart/daemon/connect-bay.js +323 -0
  129. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  130. package/dist/heart/daemon/container-healthcheck.js +112 -0
  131. package/dist/heart/daemon/container-runtime.js +97 -0
  132. package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
  133. package/dist/heart/daemon/container-spec-auditor.js +236 -0
  134. package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
  135. package/dist/heart/daemon/daemon-cli.js +29 -2284
  136. package/dist/heart/daemon/daemon-entry.js +920 -11
  137. package/dist/heart/daemon/daemon-health.js +186 -0
  138. package/dist/heart/daemon/daemon-rollup.js +57 -0
  139. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  140. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  141. package/dist/heart/daemon/daemon.js +2010 -88
  142. package/dist/heart/daemon/dns-workflow.js +394 -0
  143. package/dist/heart/daemon/doctor-types.js +8 -0
  144. package/dist/heart/daemon/doctor.js +1755 -0
  145. package/dist/heart/daemon/freshness.js +345 -0
  146. package/dist/heart/daemon/habit-private-wake.js +61 -0
  147. package/dist/heart/daemon/health-monitor.js +142 -11
  148. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  149. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  150. package/dist/heart/daemon/http-health-probe.js +80 -0
  151. package/dist/heart/daemon/human-command-screens.js +234 -0
  152. package/dist/heart/daemon/human-readiness.js +114 -0
  153. package/dist/heart/daemon/inner-status.js +78 -0
  154. package/dist/heart/daemon/interactive-repair.js +394 -0
  155. package/dist/heart/daemon/launchd.js +37 -8
  156. package/dist/heart/daemon/log-tailer.js +79 -10
  157. package/dist/heart/daemon/logs-prune.js +132 -0
  158. package/dist/heart/daemon/mcp-canary.js +524 -0
  159. package/dist/heart/daemon/message-router.js +65 -5
  160. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  161. package/dist/heart/daemon/os-cron-deps.js +135 -0
  162. package/dist/heart/daemon/os-cron.js +22 -14
  163. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  164. package/dist/heart/daemon/ouro-entry.js +3 -1
  165. package/dist/heart/daemon/plugin-cli.js +432 -0
  166. package/dist/heart/daemon/process-manager.js +733 -61
  167. package/dist/heart/daemon/provider-discovery.js +137 -0
  168. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  169. package/dist/heart/daemon/prunable-bundle.js +144 -0
  170. package/dist/heart/daemon/pulse.js +511 -0
  171. package/dist/heart/daemon/readiness-repair.js +365 -0
  172. package/dist/heart/daemon/run-hooks.js +2 -0
  173. package/dist/heart/daemon/runtime-logging.js +47 -14
  174. package/dist/heart/daemon/runtime-metadata.js +2 -30
  175. package/dist/heart/daemon/runtime-mode.js +13 -2
  176. package/dist/heart/daemon/safe-mode.js +161 -0
  177. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  178. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  179. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  180. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  181. package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
  182. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  183. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  184. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  185. package/dist/heart/daemon/sense-manager.js +689 -48
  186. package/dist/heart/daemon/session-id-resolver.js +131 -0
  187. package/dist/heart/daemon/skill-management-installer.js +1 -1
  188. package/dist/heart/daemon/socket-client.js +180 -12
  189. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  190. package/dist/heart/daemon/startup-tui.js +339 -0
  191. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  192. package/dist/heart/daemon/task-scheduler.js +117 -39
  193. package/dist/heart/daemon/terminal-ui.js +499 -0
  194. package/dist/heart/daemon/thoughts.js +138 -54
  195. package/dist/heart/daemon/up-progress.js +366 -0
  196. package/dist/heart/daemon/vault-items.js +56 -0
  197. package/dist/heart/delegation.js +1 -4
  198. package/dist/heart/external-events/router.js +1414 -0
  199. package/dist/heart/habits/habit-cancel.js +810 -0
  200. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  201. package/dist/heart/habits/habit-migration.js +194 -0
  202. package/dist/heart/habits/habit-parser.js +278 -0
  203. package/dist/heart/habits/habit-runtime-state.js +93 -0
  204. package/dist/heart/habits/habit-scheduler.js +653 -0
  205. package/dist/heart/habits/habit-session-summary.js +318 -0
  206. package/dist/heart/habits/habit-session.js +636 -0
  207. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  208. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  209. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  210. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  211. package/dist/heart/identity.js +184 -59
  212. package/dist/heart/kept-notes.js +289 -0
  213. package/dist/heart/kicks.js +1 -1
  214. package/dist/heart/machine-identity.js +161 -0
  215. package/dist/heart/mail-import-discovery.js +353 -0
  216. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  217. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  218. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  219. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  220. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  221. package/dist/heart/mailbox/mailbox-http.js +99 -0
  222. package/dist/heart/mailbox/mailbox-read.js +39 -0
  223. package/dist/heart/mailbox/mailbox-types.js +27 -0
  224. package/dist/heart/mailbox/mailbox-view.js +197 -0
  225. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  226. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  227. package/dist/heart/mailbox/readers/mail.js +375 -0
  228. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  229. package/dist/heart/mailbox/readers/sessions.js +232 -0
  230. package/dist/heart/mailbox/readers/shared.js +111 -0
  231. package/dist/heart/mcp/mcp-server.js +696 -0
  232. package/dist/heart/migrate-config.js +100 -0
  233. package/dist/heart/model-capabilities.js +11 -0
  234. package/dist/heart/orientation-frame.js +345 -0
  235. package/dist/heart/platform.js +81 -0
  236. package/dist/heart/primitives.js +1 -1
  237. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  238. package/dist/heart/private-runtime/index.js +18 -0
  239. package/dist/heart/private-runtime/ledger.js +221 -0
  240. package/dist/heart/private-runtime/policy.js +252 -0
  241. package/dist/heart/private-runtime/types.js +2 -0
  242. package/dist/heart/progress-story.js +1 -1
  243. package/dist/heart/provider-attempt.js +137 -0
  244. package/dist/heart/provider-binding-resolver.js +273 -0
  245. package/dist/heart/provider-credentials.js +449 -0
  246. package/dist/heart/provider-failover.js +311 -0
  247. package/dist/heart/provider-models.js +96 -0
  248. package/dist/heart/provider-ping.js +265 -0
  249. package/dist/heart/provider-readiness-cache.js +119 -0
  250. package/dist/heart/provider-visibility.js +188 -0
  251. package/dist/heart/providers/anthropic-token.js +131 -0
  252. package/dist/heart/providers/anthropic.js +173 -60
  253. package/dist/heart/providers/azure.js +23 -11
  254. package/dist/heart/providers/error-classification.js +127 -0
  255. package/dist/heart/providers/github-copilot.js +34 -38
  256. package/dist/heart/providers/minimax-vlm.js +189 -0
  257. package/dist/heart/providers/minimax.js +26 -8
  258. package/dist/heart/providers/openai-codex-token.js +349 -0
  259. package/dist/heart/providers/openai-codex.js +55 -40
  260. package/dist/heart/providers/openai-compatible.js +177 -0
  261. package/dist/heart/run-ledger.js +247 -0
  262. package/dist/heart/runtime-capability-check.js +170 -0
  263. package/dist/heart/runtime-credentials.js +607 -0
  264. package/dist/heart/runtime-cwd.js +87 -0
  265. package/dist/heart/sense-truth.js +22 -4
  266. package/dist/heart/session-activity.js +90 -24
  267. package/dist/heart/session-events.js +1318 -0
  268. package/dist/heart/session-playback-cli-main.js +5 -0
  269. package/dist/heart/session-playback-cli.js +36 -0
  270. package/dist/heart/session-playback.js +231 -0
  271. package/dist/heart/session-stats-cli-main.js +5 -0
  272. package/dist/heart/session-stats.js +182 -0
  273. package/dist/heart/session-transcript.js +133 -0
  274. package/dist/heart/start-of-turn-packet.js +372 -0
  275. package/dist/heart/steward-policy.js +302 -0
  276. package/dist/heart/streaming.js +604 -207
  277. package/dist/heart/structured-output.js +196 -0
  278. package/dist/heart/sync-classification.js +176 -0
  279. package/dist/heart/sync.js +449 -0
  280. package/dist/heart/target-resolution.js +11 -7
  281. package/dist/heart/tempo.js +93 -0
  282. package/dist/heart/temporal-view.js +41 -0
  283. package/dist/heart/timeouts.js +101 -0
  284. package/dist/heart/tool-activity-callbacks.js +59 -0
  285. package/dist/heart/tool-approval.js +342 -0
  286. package/dist/heart/tool-description.js +155 -0
  287. package/dist/heart/tool-friction.js +55 -0
  288. package/dist/heart/tool-loop.js +200 -0
  289. package/dist/heart/turn-context.js +481 -0
  290. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  291. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  292. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  293. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  294. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  295. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  296. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  297. package/dist/heart/versioning/update-hooks.js +154 -0
  298. package/dist/heart/versioning/version-intent.js +114 -0
  299. package/dist/heart/work-card.js +380 -0
  300. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  301. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  302. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  303. package/dist/mailbox-ui/index.html +16 -0
  304. package/dist/mailroom/attention.js +167 -0
  305. package/dist/mailroom/autonomy.js +209 -0
  306. package/dist/mailroom/blob-store.js +889 -0
  307. package/dist/mailroom/body-cache.js +61 -0
  308. package/dist/mailroom/cache-sync-cli.js +58 -0
  309. package/dist/mailroom/core.js +803 -0
  310. package/dist/mailroom/entry.js +160 -0
  311. package/dist/mailroom/file-store.js +568 -0
  312. package/dist/mailroom/hosted-cache-sync.js +384 -0
  313. package/dist/mailroom/mbox-import.js +393 -0
  314. package/dist/mailroom/migration.js +164 -0
  315. package/dist/mailroom/outbound.js +380 -0
  316. package/dist/mailroom/policy.js +263 -0
  317. package/dist/mailroom/reader.js +292 -0
  318. package/dist/mailroom/search-cache.js +513 -0
  319. package/dist/mailroom/search-relevance.js +319 -0
  320. package/dist/mailroom/smtp-ingress.js +176 -0
  321. package/dist/mailroom/source-state.js +176 -0
  322. package/dist/mailroom/thread.js +109 -0
  323. package/dist/mailroom/travel-extract.js +89 -0
  324. package/dist/mind/bundle-manifest.js +24 -2
  325. package/dist/mind/context.js +278 -111
  326. package/dist/mind/desk-section.js +362 -0
  327. package/dist/mind/diary-integrity.js +60 -0
  328. package/dist/mind/{memory.js → diary.js} +68 -77
  329. package/dist/mind/embedding-provider.js +60 -0
  330. package/dist/mind/file-state.js +179 -0
  331. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  332. package/dist/mind/obligation-steering.js +227 -0
  333. package/dist/mind/pending.js +34 -8
  334. package/dist/mind/prompt-budget.js +479 -0
  335. package/dist/mind/prompt-refresh.js +3 -2
  336. package/dist/mind/prompt.js +1056 -187
  337. package/dist/mind/provenance-trust.js +26 -0
  338. package/dist/mind/record-paths.js +312 -0
  339. package/dist/mind/scrutiny.js +173 -0
  340. package/dist/mind/session-transaction.js +415 -0
  341. package/dist/nerves/cli-logging.js +7 -1
  342. package/dist/nerves/coverage/audit-rules.js +15 -6
  343. package/dist/nerves/coverage/audit.js +28 -2
  344. package/dist/nerves/coverage/cli.js +1 -1
  345. package/dist/nerves/coverage/contract.js +5 -5
  346. package/dist/nerves/coverage/file-completeness.js +139 -5
  347. package/dist/nerves/coverage/run-artifacts.js +55 -35
  348. package/dist/nerves/coverage/source-scanner.js +4 -4
  349. package/dist/nerves/event-buffer.js +111 -0
  350. package/dist/nerves/index.js +293 -9
  351. package/dist/nerves/observation.js +20 -0
  352. package/dist/nerves/redact.js +79 -0
  353. package/dist/nerves/review/cli-main.js +5 -0
  354. package/dist/nerves/review/cli.js +156 -0
  355. package/dist/nerves/review/core.js +159 -0
  356. package/dist/nerves/runtime.js +17 -1
  357. package/dist/repertoire/ado-client.js +15 -56
  358. package/dist/repertoire/ado-semantic.js +16 -10
  359. package/dist/repertoire/api-client.js +97 -0
  360. package/dist/repertoire/bitwarden-store.js +1045 -0
  361. package/dist/repertoire/bundle-templates.js +71 -0
  362. package/dist/repertoire/bw-installer.js +180 -0
  363. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  364. package/dist/repertoire/coding/context-pack.js +331 -0
  365. package/dist/repertoire/coding/feedback.js +218 -30
  366. package/dist/repertoire/coding/index.js +15 -3
  367. package/dist/repertoire/coding/manager.js +166 -10
  368. package/dist/repertoire/coding/spawner.js +58 -11
  369. package/dist/repertoire/coding/tools.js +242 -14
  370. package/dist/repertoire/coding/workbench-client.js +272 -0
  371. package/dist/repertoire/coding/workbench-manager.js +346 -0
  372. package/dist/repertoire/commerce-errors.js +109 -0
  373. package/dist/repertoire/commerce-self-test.js +156 -0
  374. package/dist/repertoire/credential-access.js +178 -0
  375. package/dist/repertoire/desk/classifier.js +362 -0
  376. package/dist/repertoire/duffel-client.js +185 -0
  377. package/dist/repertoire/github-client.js +14 -55
  378. package/dist/repertoire/graph-client.js +11 -52
  379. package/dist/repertoire/guardrails.js +811 -18
  380. package/dist/repertoire/mcp-client.js +44 -3
  381. package/dist/repertoire/mcp-manager.js +259 -20
  382. package/dist/repertoire/mcp-tools.js +83 -0
  383. package/dist/repertoire/plugin-mcp.js +175 -0
  384. package/dist/repertoire/plugins.js +253 -0
  385. package/dist/repertoire/relationship-authorization.js +194 -0
  386. package/dist/repertoire/shell-sessions.js +133 -0
  387. package/dist/repertoire/skills.js +48 -4
  388. package/dist/repertoire/stripe-client.js +131 -0
  389. package/dist/repertoire/tool-arguments.js +148 -0
  390. package/dist/repertoire/tool-results.js +29 -0
  391. package/dist/repertoire/tools-a2a.js +699 -0
  392. package/dist/repertoire/tools-attachments.js +322 -0
  393. package/dist/repertoire/tools-awaiting.js +575 -0
  394. package/dist/repertoire/tools-base.js +82 -1139
  395. package/dist/repertoire/tools-bluebubbles.js +2 -0
  396. package/dist/repertoire/tools-bridge.js +144 -0
  397. package/dist/repertoire/tools-bundle.js +993 -0
  398. package/dist/repertoire/tools-commerce.js +253 -0
  399. package/dist/repertoire/tools-config.js +186 -0
  400. package/dist/repertoire/tools-continuity.js +575 -0
  401. package/dist/repertoire/tools-credential.js +383 -0
  402. package/dist/repertoire/tools-evolution.js +527 -0
  403. package/dist/repertoire/tools-files.js +344 -0
  404. package/dist/repertoire/tools-flight.js +290 -0
  405. package/dist/repertoire/tools-flow.js +119 -0
  406. package/dist/repertoire/tools-github.js +3 -8
  407. package/dist/repertoire/tools-habits.js +103 -0
  408. package/dist/repertoire/tools-mail.js +1828 -0
  409. package/dist/repertoire/tools-notes.js +485 -0
  410. package/dist/repertoire/tools-obligations.js +182 -0
  411. package/dist/repertoire/tools-orientation.js +31 -0
  412. package/dist/repertoire/tools-record.js +482 -0
  413. package/dist/repertoire/tools-rsvp.js +139 -0
  414. package/dist/repertoire/tools-runtime.js +150 -0
  415. package/dist/repertoire/tools-session.js +1108 -0
  416. package/dist/repertoire/tools-shell.js +133 -0
  417. package/dist/repertoire/tools-steward-policy.js +95 -0
  418. package/dist/repertoire/tools-stripe.js +224 -0
  419. package/dist/repertoire/tools-surface.js +369 -0
  420. package/dist/repertoire/tools-teams.js +12 -39
  421. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  422. package/dist/repertoire/tools-travel.js +125 -0
  423. package/dist/repertoire/tools-trip.js +982 -0
  424. package/dist/repertoire/tools-unraid.js +484 -0
  425. package/dist/repertoire/tools-user-profile.js +146 -0
  426. package/dist/repertoire/tools-vault.js +40 -0
  427. package/dist/repertoire/tools-voice.js +145 -0
  428. package/dist/repertoire/tools.js +377 -80
  429. package/dist/repertoire/travel-api-client.js +360 -0
  430. package/dist/repertoire/unraid-client.js +155 -0
  431. package/dist/repertoire/unraid-restart.js +212 -0
  432. package/dist/repertoire/user-profile.js +131 -0
  433. package/dist/repertoire/vault-setup.js +246 -0
  434. package/dist/repertoire/vault-unlock.js +628 -0
  435. package/dist/rsvp/aisleplanner-client.js +354 -0
  436. package/dist/rsvp/cli.js +926 -0
  437. package/dist/rsvp/config.js +327 -0
  438. package/dist/rsvp/cutover.js +433 -0
  439. package/dist/rsvp/diagnostics.js +232 -0
  440. package/dist/rsvp/diff-renderer.js +176 -0
  441. package/dist/rsvp/habit-policy.js +110 -0
  442. package/dist/rsvp/habit-stage.js +123 -0
  443. package/dist/rsvp/incident-bundle.js +97 -0
  444. package/dist/rsvp/migration.js +204 -0
  445. package/dist/rsvp/native-habit-runner.js +630 -0
  446. package/dist/rsvp/outbound-state.js +628 -0
  447. package/dist/rsvp/query.js +118 -0
  448. package/dist/rsvp/replay.js +233 -0
  449. package/dist/rsvp/snapshot.js +232 -0
  450. package/dist/rsvp/spend-ledger.js +175 -0
  451. package/dist/scripts/claude-code-hook.js +41 -0
  452. package/dist/scripts/claude-code-stop-hook.js +47 -0
  453. package/dist/senses/a2a-entry.js +115 -0
  454. package/dist/senses/attention-queue.js +186 -0
  455. package/dist/senses/await-turn-message.js +58 -0
  456. package/dist/senses/bluebubbles/active-turns.js +216 -0
  457. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  458. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  459. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  460. package/dist/senses/bluebubbles/context-packet.js +207 -0
  461. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  462. package/dist/senses/bluebubbles/entry.js +90 -0
  463. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  464. package/dist/senses/bluebubbles/index.js +3839 -0
  465. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  466. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  467. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  468. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  469. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  470. package/dist/senses/bluebubbles/processed-log.js +133 -0
  471. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  472. package/dist/senses/bluebubbles/replay.js +284 -0
  473. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  474. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  475. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  476. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  477. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  478. package/dist/senses/cli/bracketed-paste.js +82 -0
  479. package/dist/senses/cli/image-paste.js +287 -0
  480. package/dist/senses/cli/image-ref-navigation.js +75 -0
  481. package/dist/senses/cli/ink-app.js +156 -0
  482. package/dist/senses/cli/inline-diff.js +64 -0
  483. package/dist/senses/cli/input-keys.js +174 -0
  484. package/dist/senses/cli/kill-ring.js +86 -0
  485. package/dist/senses/cli/message-list.js +51 -0
  486. package/dist/senses/cli/ouro-tui.js +607 -0
  487. package/dist/senses/cli/spinner-imperative.js +135 -0
  488. package/dist/senses/cli/spinner.js +101 -0
  489. package/dist/senses/cli/status-line.js +60 -0
  490. package/dist/senses/cli/streaming-markdown.js +526 -0
  491. package/dist/senses/cli/tool-display.js +85 -0
  492. package/dist/senses/cli/tool-render.js +85 -0
  493. package/dist/senses/cli/tui-store.js +241 -0
  494. package/dist/senses/cli/virtual-list.js +35 -0
  495. package/dist/senses/cli-entry.js +60 -8
  496. package/dist/senses/cli.js +600 -317
  497. package/dist/senses/commands.js +66 -3
  498. package/dist/senses/context-packet-ledger.js +371 -0
  499. package/dist/senses/context-packets.js +154 -0
  500. package/dist/senses/habit-lifecycle-guard.js +24 -0
  501. package/dist/senses/habit-turn-message.js +160 -0
  502. package/dist/senses/ingress-evidence.js +2 -0
  503. package/dist/senses/mail-entry.js +66 -0
  504. package/dist/senses/mail.js +524 -0
  505. package/dist/senses/pipeline.js +1110 -204
  506. package/dist/senses/private-runtime-worker.js +859 -0
  507. package/dist/senses/private-runtime.js +1496 -0
  508. package/dist/senses/proactive-content-guard.js +51 -0
  509. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  510. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  511. package/dist/senses/sanctuary-grounding.js +118 -0
  512. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  513. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  514. package/dist/senses/sanctuary-health-runner.js +101 -0
  515. package/dist/senses/sanctuary-health.js +408 -0
  516. package/dist/senses/sanctuary-interactive-control.js +306 -0
  517. package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
  518. package/dist/senses/sanctuary-media-optimization.js +514 -0
  519. package/dist/senses/sanctuary-runtime.js +338 -0
  520. package/dist/senses/sanctuary-sab.js +85 -0
  521. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  522. package/dist/senses/shared-turn.js +571 -0
  523. package/dist/senses/surface-tool.js +109 -0
  524. package/dist/senses/teams-entry.js +60 -8
  525. package/dist/senses/teams.js +515 -217
  526. package/dist/senses/telegram-admission.js +711 -0
  527. package/dist/senses/telegram-approval-runtime.js +566 -0
  528. package/dist/senses/telegram-attachments.js +182 -0
  529. package/dist/senses/telegram-audit-ledger.js +220 -0
  530. package/dist/senses/telegram-client.js +1677 -0
  531. package/dist/senses/telegram-effect-adapter.js +859 -0
  532. package/dist/senses/telegram-entry.js +83 -0
  533. package/dist/senses/telegram.js +2026 -0
  534. package/dist/senses/trust-gate.js +104 -9
  535. package/dist/senses/voice/audio-playback.js +237 -0
  536. package/dist/senses/voice/audio-routing.js +119 -0
  537. package/dist/senses/voice/elevenlabs.js +202 -0
  538. package/dist/senses/voice/floor-control.js +431 -0
  539. package/dist/senses/voice/floor-controller.js +115 -0
  540. package/dist/senses/voice/golden-path.js +116 -0
  541. package/dist/senses/voice/index.js +29 -0
  542. package/dist/senses/voice/meeting.js +113 -0
  543. package/dist/senses/voice/outbound.js +190 -0
  544. package/dist/senses/voice/phone.js +33 -0
  545. package/dist/senses/voice/playback.js +139 -0
  546. package/dist/senses/voice/realtime-eval.js +496 -0
  547. package/dist/senses/voice/realtime-trace.js +531 -0
  548. package/dist/senses/voice/transcript.js +70 -0
  549. package/dist/senses/voice/turn.js +191 -0
  550. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  551. package/dist/senses/voice/twilio-phone.js +5081 -0
  552. package/dist/senses/voice/types.js +2 -0
  553. package/dist/senses/voice/whisper.js +161 -0
  554. package/dist/senses/voice-entry.js +81 -0
  555. package/dist/senses/voice-realtime-eval-command.js +99 -0
  556. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  557. package/dist/senses/voice-twilio-entry.js +87 -0
  558. package/dist/trips/core.js +138 -0
  559. package/dist/trips/store.js +265 -0
  560. package/dist/util/frontmatter.js +69 -0
  561. package/npm-shrinkwrap.json +8144 -0
  562. package/package.json +72 -13
  563. package/skills/agent-commerce.md +113 -0
  564. package/skills/browser-navigation.md +117 -0
  565. package/skills/commerce-setup-guide.md +116 -0
  566. package/skills/commerce-setup.md +84 -0
  567. package/skills/configure-dev-tools.md +99 -0
  568. package/skills/travel-planning.md +138 -0
  569. package/dist/heart/daemon/auth-flow.js +0 -430
  570. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  571. package/dist/heart/daemon/ouro-version-manager.js +0 -164
  572. package/dist/heart/daemon/update-hooks.js +0 -138
  573. package/dist/heart/obligations.js +0 -141
  574. package/dist/heart/safe-workspace.js +0 -228
  575. package/dist/heart/session-recall.js +0 -116
  576. package/dist/mind/friends/channel.js +0 -84
  577. package/dist/mind/friends/group-context.js +0 -144
  578. package/dist/mind/friends/resolver.js +0 -84
  579. package/dist/mind/friends/store-file.js +0 -190
  580. package/dist/mind/friends/store.js +0 -4
  581. package/dist/mind/friends/tokens.js +0 -26
  582. package/dist/mind/friends/trust-explanation.js +0 -74
  583. package/dist/mind/friends/types.js +0 -29
  584. package/dist/repertoire/tasks/board.js +0 -134
  585. package/dist/repertoire/tasks/index.js +0 -224
  586. package/dist/repertoire/tasks/lifecycle.js +0 -80
  587. package/dist/repertoire/tasks/middleware.js +0 -65
  588. package/dist/repertoire/tasks/parser.js +0 -173
  589. package/dist/repertoire/tasks/scanner.js +0 -132
  590. package/dist/repertoire/tasks/transitions.js +0 -144
  591. package/dist/senses/bluebubbles-entry.js +0 -13
  592. package/dist/senses/bluebubbles.js +0 -1181
  593. package/dist/senses/debug-activity.js +0 -154
  594. package/dist/senses/inner-dialog-worker.js +0 -90
  595. package/dist/senses/inner-dialog.js +0 -525
  596. package/subagents/README.md +0 -7
  597. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  598. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  599. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  600. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  601. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  602. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  603. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  604. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  605. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  606. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  607. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  608. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  609. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  610. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  611. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  612. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  613. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shellToolDefinitions = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const shell_sessions_1 = require("./shell-sessions");
6
+ const identity_1 = require("../heart/identity");
7
+ const runtime_1 = require("../nerves/runtime");
8
+ exports.shellToolDefinitions = [
9
+ {
10
+ tool: {
11
+ type: "function",
12
+ function: {
13
+ name: "shell",
14
+ description: "Run a shell command and return stdout/stderr. Working directory persists between calls. Use dedicated tools instead of shell when available: read_file instead of cat, edit_file instead of sed, glob instead of find, grep instead of grep/rg. Reserve shell for operations that genuinely need the shell: installing packages, running builds/tests, git operations, process management. Be careful with destructive commands -- consider reversibility before running. If a command fails, read the error output before retrying with a different approach.",
15
+ parameters: {
16
+ type: "object",
17
+ properties: {
18
+ command: { type: "string" },
19
+ timeout_ms: {
20
+ type: "number",
21
+ description: "Timeout in milliseconds. Default: 30000. Max: 600000.",
22
+ },
23
+ background: {
24
+ type: "boolean",
25
+ description: "Run in background. Returns immediately with a process ID. Use shell_status/shell_tail to monitor.",
26
+ },
27
+ },
28
+ required: ["command"],
29
+ additionalProperties: false,
30
+ },
31
+ },
32
+ },
33
+ approvalPolicy: (args) => {
34
+ const command = typeof args.command === "string" ? args.command.trim().split(/\s+/) : [];
35
+ if (command[0] === "docker" && command[1] === "restart" && command.length > 2) {
36
+ return {
37
+ kind: "required",
38
+ policyId: "shell.docker-lifecycle.v1",
39
+ actionClass: "service-control",
40
+ requiresSoleCall: true,
41
+ };
42
+ }
43
+ return { kind: "not_required" };
44
+ },
45
+ handler: (a) => {
46
+ // Destructive pattern detection (friction, not a block)
47
+ const destructivePatterns = (0, shell_sessions_1.detectDestructivePatterns)(a.command);
48
+ if (destructivePatterns.length > 0) {
49
+ (0, runtime_1.emitNervesEvent)({
50
+ level: "warn",
51
+ event: "tool.shell.destructive_detected",
52
+ component: "tools",
53
+ message: `destructive pattern detected: ${destructivePatterns.join(", ")}`,
54
+ meta: { command: a.command, patterns: destructivePatterns },
55
+ });
56
+ }
57
+ // Background mode: spawn and return immediately
58
+ if (a.background === "true") {
59
+ const session = (0, shell_sessions_1.spawnBackgroundShell)(a.command);
60
+ return JSON.stringify({ id: session.id, command: session.command, status: session.status });
61
+ }
62
+ const MAX_TIMEOUT = 600000;
63
+ const requestedTimeout = Number(a.timeout_ms) || 0;
64
+ let configDefault = 30000;
65
+ try {
66
+ configDefault = (0, identity_1.loadAgentConfig)().shell?.defaultTimeout ?? 30000;
67
+ }
68
+ catch { /* test env: no --agent flag */ }
69
+ const baseTimeout = requestedTimeout > 0 ? requestedTimeout : configDefault;
70
+ const timeout = Math.min(baseTimeout, MAX_TIMEOUT);
71
+ const output = (0, child_process_1.execSync)(a.command, {
72
+ encoding: "utf-8",
73
+ timeout,
74
+ });
75
+ if (destructivePatterns.length > 0) {
76
+ return `${output}\n\n--- destructive pattern detected: ${destructivePatterns.join(", ")} ---`;
77
+ }
78
+ return output;
79
+ },
80
+ summaryKeys: ["command"],
81
+ },
82
+ {
83
+ tool: {
84
+ type: "function",
85
+ function: {
86
+ name: "shell_status",
87
+ description: "Check status of background shell processes. Omit id to list all.",
88
+ parameters: {
89
+ type: "object",
90
+ properties: {
91
+ id: { type: "string", description: "Background shell process ID" },
92
+ },
93
+ },
94
+ },
95
+ },
96
+ handler: (a) => {
97
+ if (!a.id) {
98
+ return JSON.stringify((0, shell_sessions_1.listShellSessions)());
99
+ }
100
+ const session = (0, shell_sessions_1.getShellSession)(a.id);
101
+ if (!session)
102
+ return `process not found: ${a.id}`;
103
+ return JSON.stringify(session);
104
+ },
105
+ summaryKeys: ["id"],
106
+ },
107
+ {
108
+ tool: {
109
+ type: "function",
110
+ function: {
111
+ name: "shell_tail",
112
+ description: "Show recent output from a background shell process.",
113
+ parameters: {
114
+ type: "object",
115
+ properties: {
116
+ id: { type: "string", description: "Background shell process ID" },
117
+ },
118
+ required: ["id"],
119
+ },
120
+ },
121
+ },
122
+ handler: (a) => {
123
+ /* v8 ignore next -- schema requires id, defensive guard @preserve */
124
+ if (!a.id)
125
+ return "id is required";
126
+ const output = (0, shell_sessions_1.tailShellSession)(a.id);
127
+ if (output === undefined)
128
+ return `process not found: ${a.id}`;
129
+ return output || "(no output yet)";
130
+ },
131
+ summaryKeys: ["id"],
132
+ },
133
+ ];
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stewardPolicyToolDefinition = void 0;
4
+ const steward_policy_1 = require("../heart/steward-policy");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ function arrayArgument(raw, label) {
7
+ if (!raw)
8
+ throw new Error(`${label} is required`);
9
+ const value = JSON.parse(raw);
10
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string"))
11
+ throw new Error(`${label} must be a JSON string array`);
12
+ return value;
13
+ }
14
+ exports.stewardPolicyToolDefinition = {
15
+ tool: {
16
+ type: "function",
17
+ function: {
18
+ name: "steward_policy_manage",
19
+ description: "Read or update the household steward's typed desired-state and routine-action policy. Updates require the current authenticated family request. expectedVersion is optional; omit it to apply against the current policy version, or supply a version from read for explicit stale-write detection.",
20
+ parameters: {
21
+ type: "object",
22
+ properties: {
23
+ action: { type: "string", enum: ["read", "set_desired_state", "grant_routine_action"] },
24
+ expectedVersion: { type: "integer", minimum: 0, description: "Optional version returned by read. When omitted, the runtime uses the current policy version." },
25
+ key: { type: "string" },
26
+ value: { type: "string" },
27
+ provenance: { type: "string", enum: ["stated", "observed", "default", "installed_explicit_policy"] },
28
+ source: { type: "string" },
29
+ routineAction: { type: "string" },
30
+ targetsJson: { type: "string", description: "JSON array of exact target names" },
31
+ maxCount: { type: "integer", minimum: 1 },
32
+ windowMs: { type: "integer", minimum: 1 },
33
+ verificationRequired: { type: "boolean" },
34
+ exclusionsJson: { type: "string", description: "JSON array of exact excluded target names" },
35
+ expiresAt: { type: "string" },
36
+ },
37
+ required: ["action"],
38
+ additionalProperties: false,
39
+ },
40
+ },
41
+ },
42
+ handler: (args, ctx) => {
43
+ if (!ctx?.agentRoot)
44
+ throw new Error("steward policy runtime is unavailable");
45
+ if (!ctx.relationshipAuthorization)
46
+ throw new Error("steward policy access requires authenticated relationship authority");
47
+ if (args.action === "read") {
48
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.steward_policy_tool_call", message: "read steward policy", meta: { action: "read" } });
49
+ return JSON.stringify((0, steward_policy_1.readStewardPolicy)(ctx.agentRoot));
50
+ }
51
+ const actor = ctx.relationshipAuthorization?.actor;
52
+ if (!actor)
53
+ throw new Error("steward policy mutation requires authenticated relationship authority");
54
+ const expectedVersion = args.expectedVersion === undefined
55
+ ? (0, steward_policy_1.readStewardPolicy)(ctx.agentRoot).version
56
+ : Number(args.expectedVersion);
57
+ if (!Number.isInteger(expectedVersion) || expectedVersion < 0)
58
+ throw new Error("expectedVersion must be a nonnegative integer");
59
+ let mutation;
60
+ if (args.action === "set_desired_state") {
61
+ if (args.provenance !== "stated" && args.provenance !== "observed" && args.provenance !== "default")
62
+ throw new Error("desired state provenance is invalid");
63
+ mutation = { kind: "set_desired_state", key: args.key ?? "", value: args.value ?? "", provenance: args.provenance, source: args.source ?? "", ...(args.expiresAt ? { expiresAt: args.expiresAt } : {}) };
64
+ }
65
+ else if (args.action === "grant_routine_action") {
66
+ if (args.provenance !== "stated" && args.provenance !== "installed_explicit_policy")
67
+ throw new Error("routine action provenance is invalid");
68
+ const targets = arrayArgument(args.targetsJson, "targetsJson");
69
+ const exclusions = arrayArgument(args.exclusionsJson, "exclusionsJson");
70
+ const verificationRequired = args.verificationRequired;
71
+ if (verificationRequired !== true)
72
+ throw new Error("verificationRequired must be true");
73
+ mutation = {
74
+ kind: "grant_routine_action",
75
+ key: args.key ?? "",
76
+ action: args.routineAction ?? "",
77
+ targets,
78
+ maxCount: Number(args.maxCount),
79
+ windowMs: Number(args.windowMs),
80
+ verificationRequired,
81
+ exclusions,
82
+ provenance: args.provenance,
83
+ ...(args.expiresAt ? { expiresAt: args.expiresAt } : {}),
84
+ };
85
+ }
86
+ else
87
+ throw new Error("steward policy action is invalid");
88
+ const result = (0, steward_policy_1.updateStewardPolicy)(ctx.agentRoot, { expectedVersion, actor, mutation });
89
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.steward_policy_tool_call", message: "updated steward policy", meta: { action: args.action } });
90
+ return JSON.stringify(result);
91
+ },
92
+ riskProfile: (args) => args.action === "read"
93
+ ? { mutates: "none", risk: "low" }
94
+ : { mutates: "durable_state_write", risk: "high", reason: "updates typed household steward policy under authenticated family authority" },
95
+ };
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripeToolDefinitions = void 0;
4
+ exports.resetStripeClient = resetStripeClient;
5
+ const stripe_client_1 = require("./stripe-client");
6
+ const runtime_1 = require("../nerves/runtime");
7
+ const store_1 = require("../commerce/store");
8
+ // Lazy-initialized Stripe client singleton
9
+ let _stripeClient = null;
10
+ async function getStripeClient() {
11
+ if (!_stripeClient) {
12
+ _stripeClient = await (0, stripe_client_1.createStripeClient)();
13
+ }
14
+ return _stripeClient;
15
+ }
16
+ function requireFamilyContext(ctx) {
17
+ if (!ctx?.context?.friend?.id) {
18
+ return "no friend context — cannot access payment tools.";
19
+ }
20
+ if (ctx.context.friend.trustLevel !== "family") {
21
+ return "payment tools require family trust level.";
22
+ }
23
+ return { friendId: ctx.context.friend.id };
24
+ }
25
+ function parseExactSpendLimit(raw) {
26
+ const value = raw.trim();
27
+ if (!/^\d+(?:\.\d{1,2})?$/.test(value))
28
+ throw new Error("spend_limit must be an exact decimal with at most two places");
29
+ return Number(value);
30
+ }
31
+ function consumeReservedCommerce(ctx, toolName) {
32
+ if (!ctx?.commerceAuthority || !ctx.agentRoot)
33
+ return null;
34
+ const result = (0, store_1.consumeReservedCommerceAuthority)({
35
+ agentRoot: ctx.agentRoot,
36
+ checkoutId: ctx.commerceAuthority.checkoutId,
37
+ reservationToken: ctx.commerceAuthority.reservationToken,
38
+ toolName,
39
+ friendId: ctx.context?.friend?.id,
40
+ });
41
+ return result.ok ? null : `commerce authority consume error: ${result.reason}`;
42
+ }
43
+ function markCommerceAttempted(ctx, toolName) {
44
+ if (!ctx?.commerceAuthority || !ctx.agentRoot)
45
+ return null;
46
+ const result = (0, store_1.markReservedCommerceAuthorityAttempted)({
47
+ agentRoot: ctx.agentRoot,
48
+ checkoutId: ctx.commerceAuthority.checkoutId,
49
+ reservationToken: ctx.commerceAuthority.reservationToken,
50
+ toolName,
51
+ friendId: ctx.context?.friend?.id,
52
+ });
53
+ return result.ok ? null : `commerce authority attempt error: ${result.reason}`;
54
+ }
55
+ exports.stripeToolDefinitions = [
56
+ {
57
+ tool: {
58
+ type: "function",
59
+ function: {
60
+ name: "stripe_create_card",
61
+ description: "Create a virtual card for an approved transaction. Returns card ID and last 4 digits (never the full card number). Requires family trust level and a matching confirmed commerce checkout.",
62
+ parameters: {
63
+ type: "object",
64
+ properties: {
65
+ type: {
66
+ type: "string",
67
+ enum: ["single_use", "persistent"],
68
+ description: "Card type: single_use (one transaction) or persistent (recurring)",
69
+ },
70
+ spend_limit: {
71
+ type: "string",
72
+ description: "Maximum spend limit in dollars (e.g. '500')",
73
+ },
74
+ currency: {
75
+ type: "string",
76
+ description: "Currency code (e.g. 'usd')",
77
+ },
78
+ merchant_categories: {
79
+ type: "string",
80
+ description: "Comma-separated allowed merchant categories from the confirmed commerce constraints.",
81
+ },
82
+ commerce_authority: {
83
+ type: "string",
84
+ description: "Optional explicit authority token for external/manual flows; normally omit so Ouro consumes the matching confirmed checkout without exposing a bearer token.",
85
+ },
86
+ },
87
+ required: ["type", "spend_limit", "currency", "merchant_categories"],
88
+ },
89
+ },
90
+ },
91
+ handler: async (args, ctx) => {
92
+ (0, runtime_1.emitNervesEvent)({
93
+ component: "repertoire",
94
+ event: "repertoire.tool_stripe_create_card",
95
+ message: "stripe_create_card invoked",
96
+ meta: { tool: "stripe_create_card" },
97
+ });
98
+ const guard = requireFamilyContext(ctx);
99
+ if (typeof guard === "string")
100
+ return guard;
101
+ try {
102
+ const categories = args.merchant_categories.split(",").map((c) => c.trim()).filter(Boolean);
103
+ if (categories.length === 0)
104
+ throw new Error("merchant_categories is required");
105
+ const spendLimit = parseExactSpendLimit(args.spend_limit);
106
+ const attemptError = markCommerceAttempted(ctx, "stripe_create_card");
107
+ if (attemptError)
108
+ return attemptError;
109
+ const client = await getStripeClient();
110
+ const card = await client.createVirtualCard({
111
+ type: args.type,
112
+ spendLimit,
113
+ currency: args.currency,
114
+ merchantCategories: categories,
115
+ });
116
+ const consumeError = consumeReservedCommerce(ctx, "stripe_create_card");
117
+ if (consumeError)
118
+ return consumeError;
119
+ return JSON.stringify({
120
+ cardId: card.cardId,
121
+ last4: card.last4,
122
+ status: card.status,
123
+ spendLimit: args.spend_limit,
124
+ });
125
+ }
126
+ catch (err) {
127
+ /* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
128
+ return `card creation error: ${err instanceof Error ? err.message : String(err)}`;
129
+ }
130
+ },
131
+ summaryKeys: ["type", "spend_limit", "currency"],
132
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "creates a virtual payment card" },
133
+ },
134
+ {
135
+ tool: {
136
+ type: "function",
137
+ function: {
138
+ name: "stripe_deactivate_card",
139
+ description: "Deactivate (cancel) a virtual card. Use after a transaction is complete or to revoke access. Requires family trust level.",
140
+ parameters: {
141
+ type: "object",
142
+ properties: {
143
+ card_id: {
144
+ type: "string",
145
+ description: "The Stripe card ID to deactivate (e.g. 'ic_...')",
146
+ },
147
+ },
148
+ required: ["card_id"],
149
+ },
150
+ },
151
+ },
152
+ handler: async (args, ctx) => {
153
+ (0, runtime_1.emitNervesEvent)({
154
+ component: "repertoire",
155
+ event: "repertoire.tool_stripe_deactivate_card",
156
+ message: "stripe_deactivate_card invoked",
157
+ meta: { tool: "stripe_deactivate_card", cardId: args.card_id },
158
+ });
159
+ const guard = requireFamilyContext(ctx);
160
+ if (typeof guard === "string")
161
+ return guard;
162
+ try {
163
+ const client = await getStripeClient();
164
+ const card = await client.deactivateCard(args.card_id);
165
+ return JSON.stringify({
166
+ cardId: card.cardId,
167
+ last4: card.last4,
168
+ status: card.status,
169
+ });
170
+ }
171
+ catch (err) {
172
+ /* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
173
+ return `card deactivation error: ${err instanceof Error ? err.message : String(err)}`;
174
+ }
175
+ },
176
+ summaryKeys: ["card_id"],
177
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "deactivates a virtual payment card" },
178
+ },
179
+ {
180
+ tool: {
181
+ type: "function",
182
+ function: {
183
+ name: "stripe_list_cards",
184
+ description: "List all active virtual cards. Shows card IDs and last 4 digits only. Requires family trust level.",
185
+ parameters: {
186
+ type: "object",
187
+ properties: {},
188
+ },
189
+ },
190
+ },
191
+ handler: async (_args, ctx) => {
192
+ (0, runtime_1.emitNervesEvent)({
193
+ component: "repertoire",
194
+ event: "repertoire.tool_stripe_list_cards",
195
+ message: "stripe_list_cards invoked",
196
+ meta: { tool: "stripe_list_cards" },
197
+ });
198
+ const guard = requireFamilyContext(ctx);
199
+ if (typeof guard === "string")
200
+ return guard;
201
+ try {
202
+ const client = await getStripeClient();
203
+ const cards = await client.listCards();
204
+ if (cards.length === 0) {
205
+ return "no active cards.";
206
+ }
207
+ return JSON.stringify(cards.map((c) => ({
208
+ cardId: c.cardId,
209
+ last4: c.last4,
210
+ status: c.status,
211
+ })));
212
+ }
213
+ catch (err) {
214
+ /* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
215
+ return `card listing error: ${err instanceof Error ? err.message : String(err)}`;
216
+ }
217
+ },
218
+ summaryKeys: [],
219
+ },
220
+ ];
221
+ /** Reset the Stripe client singleton (for testing). */
222
+ function resetStripeClient() {
223
+ _stripeClient = null;
224
+ }