@ouro.bot/cli 0.1.0-alpha.69 → 0.1.0-alpha.691

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 (480) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4398 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +810 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +326 -0
  36. package/dist/arc/packets.js +288 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +160 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/awaiting/await-alert.js +146 -0
  54. package/dist/heart/awaiting/await-expiry.js +108 -0
  55. package/dist/heart/awaiting/await-loader.js +91 -0
  56. package/dist/heart/awaiting/await-parser.js +141 -0
  57. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  58. package/dist/heart/awaiting/await-scheduler.js +378 -0
  59. package/dist/heart/background-operations.js +281 -0
  60. package/dist/heart/bridges/manager.js +137 -17
  61. package/dist/heart/bridges/store.js +14 -2
  62. package/dist/heart/bundle-state.js +168 -0
  63. package/dist/heart/commitments.js +135 -0
  64. package/dist/heart/config-registry.js +331 -0
  65. package/dist/heart/config.js +122 -119
  66. package/dist/heart/context-loss-gauntlet.js +354 -0
  67. package/dist/heart/context-loss-sentinel.js +993 -0
  68. package/dist/heart/core.js +1297 -269
  69. package/dist/heart/cross-chat-delivery.js +8 -22
  70. package/dist/heart/daemon/agent-config-check.js +451 -0
  71. package/dist/heart/daemon/agent-discovery.js +185 -3
  72. package/dist/heart/daemon/agent-service.js +523 -0
  73. package/dist/heart/daemon/agentic-repair.js +547 -0
  74. package/dist/heart/daemon/await-private-wake.js +59 -0
  75. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  76. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  77. package/dist/heart/daemon/cadence.js +70 -0
  78. package/dist/heart/daemon/cli-defaults.js +780 -0
  79. package/dist/heart/daemon/cli-desk.js +322 -0
  80. package/dist/heart/daemon/cli-exec.js +8100 -0
  81. package/dist/heart/daemon/cli-help.js +601 -0
  82. package/dist/heart/daemon/cli-parse.js +1995 -0
  83. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  84. package/dist/heart/daemon/cli-render.js +770 -0
  85. package/dist/heart/daemon/cli-types.js +8 -0
  86. package/dist/heart/daemon/connect-bay.js +323 -0
  87. package/dist/heart/daemon/daemon-cli.js +29 -1814
  88. package/dist/heart/daemon/daemon-entry.js +668 -6
  89. package/dist/heart/daemon/daemon-health.js +176 -0
  90. package/dist/heart/daemon/daemon-rollup.js +57 -0
  91. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  92. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  93. package/dist/heart/daemon/daemon.js +1222 -84
  94. package/dist/heart/daemon/dns-workflow.js +394 -0
  95. package/dist/heart/daemon/doctor-types.js +8 -0
  96. package/dist/heart/daemon/doctor.js +873 -0
  97. package/dist/heart/daemon/habit-private-wake.js +56 -0
  98. package/dist/heart/daemon/health-monitor.js +131 -3
  99. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  100. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  101. package/dist/heart/daemon/http-health-probe.js +80 -0
  102. package/dist/heart/daemon/human-command-screens.js +234 -0
  103. package/dist/heart/daemon/human-readiness.js +114 -0
  104. package/dist/heart/daemon/inner-status.js +78 -0
  105. package/dist/heart/daemon/interactive-repair.js +394 -0
  106. package/dist/heart/daemon/launchd.js +37 -8
  107. package/dist/heart/daemon/log-tailer.js +79 -10
  108. package/dist/heart/daemon/logs-prune.js +110 -0
  109. package/dist/heart/daemon/mcp-canary.js +297 -0
  110. package/dist/heart/daemon/message-router.js +45 -5
  111. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  112. package/dist/heart/daemon/os-cron-deps.js +135 -0
  113. package/dist/heart/daemon/os-cron.js +14 -12
  114. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  115. package/dist/heart/daemon/ouro-entry.js +3 -1
  116. package/dist/heart/daemon/plugin-cli.js +432 -0
  117. package/dist/heart/daemon/process-manager.js +519 -40
  118. package/dist/heart/daemon/provider-discovery.js +137 -0
  119. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  120. package/dist/heart/daemon/pulse.js +511 -0
  121. package/dist/heart/daemon/readiness-repair.js +365 -0
  122. package/dist/heart/daemon/run-hooks.js +2 -0
  123. package/dist/heart/daemon/runtime-logging.js +41 -14
  124. package/dist/heart/daemon/runtime-metadata.js +2 -30
  125. package/dist/heart/daemon/safe-mode.js +161 -0
  126. package/dist/heart/daemon/sense-manager.js +583 -43
  127. package/dist/heart/daemon/session-id-resolver.js +131 -0
  128. package/dist/heart/daemon/skill-management-installer.js +1 -1
  129. package/dist/heart/daemon/socket-client.js +171 -12
  130. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  131. package/dist/heart/daemon/startup-tui.js +338 -0
  132. package/dist/heart/daemon/task-scheduler.js +117 -39
  133. package/dist/heart/daemon/terminal-ui.js +499 -0
  134. package/dist/heart/daemon/thoughts.js +255 -43
  135. package/dist/heart/daemon/up-progress.js +366 -0
  136. package/dist/heart/daemon/vault-items.js +56 -0
  137. package/dist/heart/delegation.js +1 -4
  138. package/dist/heart/external-events/router.js +121 -0
  139. package/dist/heart/habits/habit-migration.js +189 -0
  140. package/dist/heart/habits/habit-parser.js +211 -0
  141. package/dist/heart/habits/habit-runtime-state.js +114 -0
  142. package/dist/heart/habits/habit-scheduler.js +411 -0
  143. package/dist/heart/habits/habit-session-summary.js +318 -0
  144. package/dist/heart/habits/habit-session.js +618 -0
  145. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -57
  146. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  147. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  148. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  149. package/dist/heart/identity.js +174 -58
  150. package/dist/heart/kept-notes.js +289 -0
  151. package/dist/heart/kicks.js +1 -1
  152. package/dist/heart/machine-identity.js +161 -0
  153. package/dist/heart/mail-import-discovery.js +353 -0
  154. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  155. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  156. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  157. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  158. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  159. package/dist/heart/mailbox/mailbox-http.js +99 -0
  160. package/dist/heart/mailbox/mailbox-read.js +37 -0
  161. package/dist/heart/mailbox/mailbox-types.js +27 -0
  162. package/dist/heart/mailbox/mailbox-view.js +197 -0
  163. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  164. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  165. package/dist/heart/mailbox/readers/mail.js +375 -0
  166. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  167. package/dist/heart/mailbox/readers/sessions.js +232 -0
  168. package/dist/heart/mailbox/readers/shared.js +111 -0
  169. package/dist/heart/mcp/mcp-server.js +696 -0
  170. package/dist/heart/migrate-config.js +100 -0
  171. package/dist/heart/model-capabilities.js +19 -0
  172. package/dist/heart/orientation-frame.js +217 -0
  173. package/dist/heart/platform.js +81 -0
  174. package/dist/heart/primitives.js +1 -1
  175. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  176. package/dist/heart/private-runtime/index.js +18 -0
  177. package/dist/heart/private-runtime/ledger.js +218 -0
  178. package/dist/heart/private-runtime/policy.js +214 -0
  179. package/dist/heart/private-runtime/types.js +2 -0
  180. package/dist/heart/progress-story.js +1 -1
  181. package/dist/heart/provider-attempt.js +134 -0
  182. package/dist/heart/provider-binding-resolver.js +273 -0
  183. package/dist/heart/provider-credentials.js +425 -0
  184. package/dist/heart/provider-failover.js +311 -0
  185. package/dist/heart/provider-models.js +81 -0
  186. package/dist/heart/provider-ping.js +262 -0
  187. package/dist/heart/provider-readiness-cache.js +119 -0
  188. package/dist/heart/provider-visibility.js +188 -0
  189. package/dist/heart/providers/anthropic-token.js +131 -0
  190. package/dist/heart/providers/anthropic.js +139 -52
  191. package/dist/heart/providers/azure.js +23 -11
  192. package/dist/heart/providers/error-classification.js +127 -0
  193. package/dist/heart/providers/github-copilot.js +145 -0
  194. package/dist/heart/providers/minimax-vlm.js +189 -0
  195. package/dist/heart/providers/minimax.js +26 -8
  196. package/dist/heart/providers/openai-codex-token.js +349 -0
  197. package/dist/heart/providers/openai-codex.js +55 -40
  198. package/dist/heart/runtime-capability-check.js +170 -0
  199. package/dist/heart/runtime-credentials.js +389 -0
  200. package/dist/heart/runtime-cwd.js +87 -0
  201. package/dist/heart/sense-truth.js +17 -4
  202. package/dist/heart/session-activity.js +90 -24
  203. package/dist/heart/session-events.js +1133 -0
  204. package/dist/heart/session-playback-cli-main.js +5 -0
  205. package/dist/heart/session-playback-cli.js +36 -0
  206. package/dist/heart/session-playback.js +231 -0
  207. package/dist/heart/session-stats-cli-main.js +5 -0
  208. package/dist/heart/session-stats.js +182 -0
  209. package/dist/heart/session-transcript.js +133 -0
  210. package/dist/heart/start-of-turn-packet.js +365 -0
  211. package/dist/heart/streaming.js +44 -27
  212. package/dist/heart/structured-output.js +196 -0
  213. package/dist/heart/sync-classification.js +176 -0
  214. package/dist/heart/sync.js +449 -0
  215. package/dist/heart/target-resolution.js +11 -7
  216. package/dist/heart/tempo.js +93 -0
  217. package/dist/heart/temporal-view.js +41 -0
  218. package/dist/heart/timeouts.js +101 -0
  219. package/dist/heart/tool-activity-callbacks.js +59 -0
  220. package/dist/heart/tool-description.js +155 -0
  221. package/dist/heart/tool-friction.js +55 -0
  222. package/dist/heart/tool-loop.js +200 -0
  223. package/dist/heart/turn-context.js +450 -0
  224. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  225. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  226. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  227. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  228. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  229. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  230. package/dist/heart/versioning/update-hooks.js +154 -0
  231. package/dist/heart/work-card.js +390 -0
  232. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  233. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  234. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  235. package/dist/mailbox-ui/index.html +16 -0
  236. package/dist/mailroom/attention.js +167 -0
  237. package/dist/mailroom/autonomy.js +209 -0
  238. package/dist/mailroom/blob-store.js +715 -0
  239. package/dist/mailroom/body-cache.js +61 -0
  240. package/dist/mailroom/core.js +788 -0
  241. package/dist/mailroom/entry.js +160 -0
  242. package/dist/mailroom/file-store.js +568 -0
  243. package/dist/mailroom/mbox-import.js +393 -0
  244. package/dist/mailroom/migration.js +164 -0
  245. package/dist/mailroom/outbound.js +380 -0
  246. package/dist/mailroom/policy.js +263 -0
  247. package/dist/mailroom/reader.js +233 -0
  248. package/dist/mailroom/search-cache.js +334 -0
  249. package/dist/mailroom/search-relevance.js +319 -0
  250. package/dist/mailroom/smtp-ingress.js +176 -0
  251. package/dist/mailroom/source-state.js +176 -0
  252. package/dist/mailroom/thread.js +109 -0
  253. package/dist/mailroom/travel-extract.js +89 -0
  254. package/dist/mind/bundle-manifest.js +24 -2
  255. package/dist/mind/context.js +250 -101
  256. package/dist/mind/desk-section.js +362 -0
  257. package/dist/mind/diary-integrity.js +60 -0
  258. package/dist/mind/{memory.js → diary.js} +68 -77
  259. package/dist/mind/embedding-provider.js +60 -0
  260. package/dist/mind/file-state.js +179 -0
  261. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  262. package/dist/mind/obligation-steering.js +221 -0
  263. package/dist/mind/pending.js +13 -8
  264. package/dist/mind/prompt-refresh.js +3 -2
  265. package/dist/mind/prompt.js +1009 -169
  266. package/dist/mind/provenance-trust.js +26 -0
  267. package/dist/mind/record-paths.js +312 -0
  268. package/dist/mind/scrutiny.js +173 -0
  269. package/dist/nerves/cli-logging.js +7 -1
  270. package/dist/nerves/coverage/audit-rules.js +15 -6
  271. package/dist/nerves/coverage/audit.js +28 -2
  272. package/dist/nerves/coverage/cli.js +1 -1
  273. package/dist/nerves/coverage/contract.js +5 -5
  274. package/dist/nerves/coverage/file-completeness.js +139 -5
  275. package/dist/nerves/event-buffer.js +111 -0
  276. package/dist/nerves/index.js +224 -4
  277. package/dist/nerves/observation.js +20 -0
  278. package/dist/nerves/redact.js +79 -0
  279. package/dist/nerves/review/cli-main.js +5 -0
  280. package/dist/nerves/review/cli.js +156 -0
  281. package/dist/nerves/review/core.js +152 -0
  282. package/dist/nerves/runtime.js +5 -1
  283. package/dist/repertoire/ado-client.js +15 -56
  284. package/dist/repertoire/ado-semantic.js +16 -10
  285. package/dist/repertoire/api-client.js +97 -0
  286. package/dist/repertoire/bitwarden-store.js +1042 -0
  287. package/dist/repertoire/bundle-templates.js +71 -0
  288. package/dist/repertoire/bw-installer.js +180 -0
  289. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  290. package/dist/repertoire/coding/context-pack.js +331 -0
  291. package/dist/repertoire/coding/feedback.js +218 -30
  292. package/dist/repertoire/coding/index.js +15 -3
  293. package/dist/repertoire/coding/manager.js +166 -10
  294. package/dist/repertoire/coding/spawner.js +58 -11
  295. package/dist/repertoire/coding/tools.js +242 -14
  296. package/dist/repertoire/coding/workbench-client.js +272 -0
  297. package/dist/repertoire/coding/workbench-manager.js +346 -0
  298. package/dist/repertoire/commerce-errors.js +109 -0
  299. package/dist/repertoire/commerce-self-test.js +156 -0
  300. package/dist/repertoire/credential-access.js +178 -0
  301. package/dist/repertoire/desk/classifier.js +362 -0
  302. package/dist/repertoire/duffel-client.js +185 -0
  303. package/dist/repertoire/github-client.js +14 -55
  304. package/dist/repertoire/graph-client.js +11 -52
  305. package/dist/repertoire/guardrails.js +159 -27
  306. package/dist/repertoire/mcp-client.js +44 -3
  307. package/dist/repertoire/mcp-manager.js +259 -20
  308. package/dist/repertoire/mcp-tools.js +83 -0
  309. package/dist/repertoire/plugin-mcp.js +175 -0
  310. package/dist/repertoire/plugins.js +253 -0
  311. package/dist/repertoire/shell-sessions.js +133 -0
  312. package/dist/repertoire/skills.js +48 -4
  313. package/dist/repertoire/stripe-client.js +131 -0
  314. package/dist/repertoire/tool-results.js +29 -0
  315. package/dist/repertoire/tools-a2a.js +699 -0
  316. package/dist/repertoire/tools-attachments.js +317 -0
  317. package/dist/repertoire/tools-awaiting.js +372 -0
  318. package/dist/repertoire/tools-base.js +63 -1095
  319. package/dist/repertoire/tools-bluebubbles.js +2 -0
  320. package/dist/repertoire/tools-bridge.js +144 -0
  321. package/dist/repertoire/tools-bundle.js +993 -0
  322. package/dist/repertoire/tools-commerce.js +253 -0
  323. package/dist/repertoire/tools-config.js +186 -0
  324. package/dist/repertoire/tools-continuity.js +252 -0
  325. package/dist/repertoire/tools-credential.js +383 -0
  326. package/dist/repertoire/tools-evolution.js +527 -0
  327. package/dist/repertoire/tools-files.js +344 -0
  328. package/dist/repertoire/tools-flight.js +290 -0
  329. package/dist/repertoire/tools-flow.js +119 -0
  330. package/dist/repertoire/tools-github.js +3 -8
  331. package/dist/repertoire/tools-mail.js +1975 -0
  332. package/dist/repertoire/tools-notes.js +459 -0
  333. package/dist/repertoire/tools-obligations.js +143 -0
  334. package/dist/repertoire/tools-orientation.js +31 -0
  335. package/dist/repertoire/tools-record.js +482 -0
  336. package/dist/repertoire/tools-runtime.js +150 -0
  337. package/dist/repertoire/tools-session.js +881 -0
  338. package/dist/repertoire/tools-shell.js +120 -0
  339. package/dist/repertoire/tools-stripe.js +224 -0
  340. package/dist/repertoire/tools-surface.js +355 -0
  341. package/dist/repertoire/tools-teams.js +12 -39
  342. package/dist/repertoire/tools-travel.js +125 -0
  343. package/dist/repertoire/tools-trip.js +982 -0
  344. package/dist/repertoire/tools-user-profile.js +146 -0
  345. package/dist/repertoire/tools-vault.js +40 -0
  346. package/dist/repertoire/tools-voice.js +145 -0
  347. package/dist/repertoire/tools.js +250 -80
  348. package/dist/repertoire/travel-api-client.js +360 -0
  349. package/dist/repertoire/user-profile.js +131 -0
  350. package/dist/repertoire/vault-setup.js +246 -0
  351. package/dist/repertoire/vault-unlock.js +594 -0
  352. package/dist/scripts/claude-code-hook.js +41 -0
  353. package/dist/scripts/claude-code-stop-hook.js +47 -0
  354. package/dist/senses/a2a-entry.js +115 -0
  355. package/dist/senses/attention-queue.js +186 -0
  356. package/dist/senses/await-turn-message.js +58 -0
  357. package/dist/senses/bluebubbles/active-turns.js +216 -0
  358. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  359. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  360. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  361. package/dist/senses/bluebubbles/entry.js +77 -0
  362. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  363. package/dist/senses/bluebubbles/index.js +2732 -0
  364. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  365. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  366. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  367. package/dist/senses/bluebubbles/processed-log.js +133 -0
  368. package/dist/senses/bluebubbles/replay.js +137 -0
  369. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  370. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  371. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  372. package/dist/senses/cli/bracketed-paste.js +82 -0
  373. package/dist/senses/cli/image-paste.js +287 -0
  374. package/dist/senses/cli/image-ref-navigation.js +75 -0
  375. package/dist/senses/cli/ink-app.js +156 -0
  376. package/dist/senses/cli/inline-diff.js +64 -0
  377. package/dist/senses/cli/input-keys.js +174 -0
  378. package/dist/senses/cli/kill-ring.js +86 -0
  379. package/dist/senses/cli/message-list.js +51 -0
  380. package/dist/senses/cli/ouro-tui.js +607 -0
  381. package/dist/senses/cli/spinner-imperative.js +135 -0
  382. package/dist/senses/cli/spinner.js +101 -0
  383. package/dist/senses/cli/status-line.js +60 -0
  384. package/dist/senses/cli/streaming-markdown.js +526 -0
  385. package/dist/senses/cli/tool-display.js +85 -0
  386. package/dist/senses/cli/tool-render.js +85 -0
  387. package/dist/senses/cli/tui-store.js +240 -0
  388. package/dist/senses/cli/virtual-list.js +35 -0
  389. package/dist/senses/cli-entry.js +60 -8
  390. package/dist/senses/cli-layout.js +100 -0
  391. package/dist/senses/cli.js +521 -214
  392. package/dist/senses/commands.js +66 -3
  393. package/dist/senses/habit-turn-message.js +160 -0
  394. package/dist/senses/mail-entry.js +66 -0
  395. package/dist/senses/mail.js +395 -0
  396. package/dist/senses/pipeline.js +873 -179
  397. package/dist/senses/private-runtime-worker.js +584 -0
  398. package/dist/senses/private-runtime.js +1145 -0
  399. package/dist/senses/proactive-content-guard.js +51 -0
  400. package/dist/senses/shared-turn.js +416 -0
  401. package/dist/senses/surface-tool.js +109 -0
  402. package/dist/senses/teams-entry.js +60 -8
  403. package/dist/senses/teams.js +397 -112
  404. package/dist/senses/trust-gate.js +104 -9
  405. package/dist/senses/voice/audio-playback.js +237 -0
  406. package/dist/senses/voice/audio-routing.js +119 -0
  407. package/dist/senses/voice/elevenlabs.js +202 -0
  408. package/dist/senses/voice/floor-control.js +431 -0
  409. package/dist/senses/voice/floor-controller.js +115 -0
  410. package/dist/senses/voice/golden-path.js +116 -0
  411. package/dist/senses/voice/index.js +29 -0
  412. package/dist/senses/voice/meeting.js +113 -0
  413. package/dist/senses/voice/outbound.js +190 -0
  414. package/dist/senses/voice/phone.js +33 -0
  415. package/dist/senses/voice/playback.js +139 -0
  416. package/dist/senses/voice/realtime-eval.js +496 -0
  417. package/dist/senses/voice/realtime-trace.js +531 -0
  418. package/dist/senses/voice/transcript.js +70 -0
  419. package/dist/senses/voice/turn.js +191 -0
  420. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  421. package/dist/senses/voice/twilio-phone.js +5077 -0
  422. package/dist/senses/voice/types.js +2 -0
  423. package/dist/senses/voice/whisper.js +161 -0
  424. package/dist/senses/voice-entry.js +81 -0
  425. package/dist/senses/voice-realtime-eval-command.js +99 -0
  426. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  427. package/dist/senses/voice-twilio-entry.js +87 -0
  428. package/dist/trips/core.js +138 -0
  429. package/dist/trips/store.js +265 -0
  430. package/dist/util/frontmatter.js +69 -0
  431. package/package.json +57 -12
  432. package/skills/agent-commerce.md +113 -0
  433. package/skills/browser-navigation.md +117 -0
  434. package/skills/commerce-setup-guide.md +116 -0
  435. package/skills/commerce-setup.md +84 -0
  436. package/skills/configure-dev-tools.md +99 -0
  437. package/skills/travel-planning.md +138 -0
  438. package/dist/heart/daemon/auth-flow.js +0 -351
  439. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  440. package/dist/heart/daemon/update-hooks.js +0 -138
  441. package/dist/heart/safe-workspace.js +0 -228
  442. package/dist/heart/session-recall.js +0 -116
  443. package/dist/mind/friends/channel.js +0 -84
  444. package/dist/mind/friends/group-context.js +0 -144
  445. package/dist/mind/friends/resolver.js +0 -84
  446. package/dist/mind/friends/store-file.js +0 -190
  447. package/dist/mind/friends/store.js +0 -4
  448. package/dist/mind/friends/tokens.js +0 -26
  449. package/dist/mind/friends/trust-explanation.js +0 -74
  450. package/dist/mind/friends/types.js +0 -29
  451. package/dist/repertoire/tasks/board.js +0 -134
  452. package/dist/repertoire/tasks/index.js +0 -224
  453. package/dist/repertoire/tasks/lifecycle.js +0 -80
  454. package/dist/repertoire/tasks/middleware.js +0 -65
  455. package/dist/repertoire/tasks/parser.js +0 -173
  456. package/dist/repertoire/tasks/scanner.js +0 -132
  457. package/dist/repertoire/tasks/transitions.js +0 -144
  458. package/dist/senses/bluebubbles-entry.js +0 -13
  459. package/dist/senses/bluebubbles.js +0 -1180
  460. package/dist/senses/debug-activity.js +0 -148
  461. package/dist/senses/inner-dialog-worker.js +0 -90
  462. package/dist/senses/inner-dialog.js +0 -480
  463. package/subagents/README.md +0 -7
  464. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  465. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  466. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  467. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  468. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  469. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  470. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  471. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  472. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  473. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  474. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  475. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  476. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  477. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  478. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  479. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  480. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,881 @@
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.sessionToolDefinitions = void 0;
37
+ exports.renderInnerProgressStatus = renderInnerProgressStatus;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const config_1 = require("../heart/config");
41
+ const identity_1 = require("../heart/identity");
42
+ const session_events_1 = require("../heart/session-events");
43
+ const runtime_1 = require("../nerves/runtime");
44
+ const socket_client_1 = require("../heart/daemon/socket-client");
45
+ const thoughts_1 = require("../heart/daemon/thoughts");
46
+ const manager_1 = require("../heart/bridges/manager");
47
+ const session_transcript_1 = require("../heart/session-transcript");
48
+ const session_activity_1 = require("../heart/session-activity");
49
+ const active_work_1 = require("../heart/active-work");
50
+ const coding_1 = require("./coding");
51
+ const pending_1 = require("../mind/pending");
52
+ const obligations_1 = require("../arc/obligations");
53
+ const progress_story_1 = require("../heart/progress-story");
54
+ const habit_session_summary_1 = require("../heart/habits/habit-session-summary");
55
+ const cross_chat_delivery_1 = require("../heart/cross-chat-delivery");
56
+ const mail_import_discovery_1 = require("../heart/mail-import-discovery");
57
+ const outbound_1 = require("../senses/voice/outbound");
58
+ const NO_SESSION_FOUND_MESSAGE = "no session found for that friend/channel/key combination.";
59
+ const EMPTY_SESSION_MESSAGE = "session exists but has no non-system messages.";
60
+ const VALID_HABIT_SUMMARY_WHICH = new Set(["latest", "previous", "latest-success", "latest-failure"]);
61
+ async function summarizeSessionTailSafely(options) {
62
+ try {
63
+ return await (0, session_transcript_1.summarizeSessionTail)(options);
64
+ }
65
+ catch (error) {
66
+ if (options.summarize) {
67
+ (0, runtime_1.emitNervesEvent)({
68
+ component: "daemon",
69
+ event: "daemon.session_tail_summary_summary_fallback",
70
+ message: "session tail summarization failed; using raw transcript",
71
+ meta: {
72
+ friendId: options.friendId,
73
+ channel: options.channel,
74
+ key: options.key,
75
+ error: error instanceof Error ? error.message : String(error),
76
+ },
77
+ });
78
+ try {
79
+ return await (0, session_transcript_1.summarizeSessionTail)({
80
+ ...options,
81
+ summarize: undefined,
82
+ });
83
+ /* v8 ignore start -- defensive: session tail fallback @preserve */
84
+ }
85
+ catch {
86
+ return { kind: "missing" };
87
+ }
88
+ /* v8 ignore stop */
89
+ }
90
+ return { kind: "missing" };
91
+ }
92
+ }
93
+ function optionalArg(args, key) {
94
+ const value = args[key];
95
+ if (value === undefined || value === null)
96
+ return undefined;
97
+ if (typeof value !== "string")
98
+ return null;
99
+ const trimmed = value.trim();
100
+ return trimmed ? trimmed : undefined;
101
+ }
102
+ function validateSessionSummarySelector(args) {
103
+ const runId = optionalArg(args, "runId");
104
+ const habitName = optionalArg(args, "habitName");
105
+ const operationId = optionalArg(args, "operationId");
106
+ const which = optionalArg(args, "which");
107
+ if (runId === null || habitName === null || operationId === null || which === null) {
108
+ return {
109
+ ok: false,
110
+ code: which === null ? "invalid_which" : "selector_required",
111
+ message: which === null
112
+ ? "which must be latest, previous, latest-success, or latest-failure"
113
+ : "selector fields must be strings",
114
+ };
115
+ }
116
+ if (runId !== undefined) {
117
+ if (habitName !== undefined || operationId !== undefined || which !== undefined) {
118
+ return {
119
+ ok: false,
120
+ code: "run_id_exclusive",
121
+ message: "runId cannot be combined with habitName, operationId, or which",
122
+ };
123
+ }
124
+ return { ok: true, selector: { runId } };
125
+ }
126
+ if (habitName === undefined && operationId === undefined) {
127
+ return {
128
+ ok: false,
129
+ code: "selector_required",
130
+ message: "provide runId, habitName, or operationId",
131
+ };
132
+ }
133
+ if (which !== undefined && !VALID_HABIT_SUMMARY_WHICH.has(which)) {
134
+ return {
135
+ ok: false,
136
+ code: "invalid_which",
137
+ message: "which must be latest, previous, latest-success, or latest-failure",
138
+ };
139
+ }
140
+ return {
141
+ ok: true,
142
+ selector: {
143
+ ...(habitName !== undefined ? { habitName } : {}),
144
+ ...(operationId !== undefined ? { operationId } : {}),
145
+ ...(which !== undefined ? { which } : {}),
146
+ },
147
+ };
148
+ }
149
+ function renderSessionSummaryText(summary) {
150
+ const lines = [
151
+ `habit ${summary.habitName} run ${summary.runId} finished with ${summary.status}.`,
152
+ summary.operationId ? `operation: ${summary.operationId}` : null,
153
+ summary.summary,
154
+ summary.nextLikelyStep ? `next: ${summary.nextLikelyStep}` : null,
155
+ summary.decisions.length > 0 ? `decisions: ${summary.decisions.join("; ")}` : null,
156
+ summary.pending.count > 0 ? `pending: ${summary.pending.count} file(s) (${summary.pending.files.join(", ")})` : "pending: none",
157
+ summary.messagesSent.length > 0 ? `messages: ${summary.messagesSent.length}` : "messages: none",
158
+ summary.toolsUsed.length > 0 ? `tools: ${summary.toolsUsed.join(", ")}` : "tools: none",
159
+ summary.errors.length > 0 ? `errors: ${summary.errors.join("; ")}` : null,
160
+ summary.warnings.length > 0 ? `warnings: ${summary.warnings.join("; ")}` : null,
161
+ `receipt: ${summary.sources.receipt}`,
162
+ `session: ${summary.sources.session}`,
163
+ ];
164
+ return lines.filter((line) => Boolean(line)).join("\n");
165
+ }
166
+ function writePendingEnvelope(queueDir, message) {
167
+ fs.mkdirSync(queueDir, { recursive: true });
168
+ const fileName = `${message.timestamp}-${Math.random().toString(36).slice(2, 10)}.json`;
169
+ const filePath = path.join(queueDir, fileName);
170
+ fs.writeFileSync(filePath, JSON.stringify({ ...message, content: (0, session_events_1.capStructuredRecordString)(message.content) }, null, 2));
171
+ return fileName.replace(/\.json$/, "");
172
+ }
173
+ function renderCrossChatDeliveryStatus(target, result) {
174
+ const phase = result.status === "delivered_now"
175
+ ? "completed"
176
+ : result.status === "queued_for_later"
177
+ ? "queued"
178
+ : result.status === "blocked"
179
+ ? "blocked"
180
+ : "errored";
181
+ const lead = result.status === "delivered_now"
182
+ ? "delivered now"
183
+ : result.status === "queued_for_later"
184
+ ? "queued for later"
185
+ : result.status === "blocked"
186
+ ? "blocked"
187
+ : "failed";
188
+ return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
189
+ scope: "shared-work",
190
+ phase,
191
+ objective: `message to ${target}`,
192
+ outcomeText: `${lead}\n${result.detail}`,
193
+ }));
194
+ }
195
+ function normalizeHabitSendStatus(status) {
196
+ return status === "queued_for_later" ? "queued" : status;
197
+ }
198
+ function recordHabitSendAttempt(ctx, args, result) {
199
+ ctx?.habitSession?.recordSurfaceAttempt?.({
200
+ recipient: args.friendId,
201
+ channel: args.channel,
202
+ reason: result.status === "blocked" ? "blocked" : result.status === "failed" ? "other" : "status",
203
+ result: normalizeHabitSendStatus(result.status),
204
+ rawStatus: result.rawStatus ?? result.status,
205
+ ...(result.status === "blocked" || result.status === "failed" ? { error: result.detail } : {}),
206
+ });
207
+ }
208
+ async function deliverVoiceChannelMessage(request, agentName, initialAudio) {
209
+ const result = await (0, outbound_1.placeTrustedFriendVoiceOutboundCall)({
210
+ agentName,
211
+ agentRoot: (0, identity_1.getAgentRoot)(),
212
+ friendId: request.friendId,
213
+ reason: request.content,
214
+ ...(initialAudio ? { initialAudio } : {}),
215
+ });
216
+ if (result.status === "placed") {
217
+ return {
218
+ status: "delivered_now",
219
+ detail: result.detail,
220
+ };
221
+ }
222
+ return {
223
+ status: result.status,
224
+ detail: result.detail,
225
+ };
226
+ }
227
+ /* v8 ignore start -- voice initial-audio parsing is exercised by voice transport tests; session tool keeps a thin argument adapter @preserve */
228
+ function parseVoiceInitialAudio(args) {
229
+ const source = args.voiceAudioSource === "url" || args.voiceAudioSource === "file" || args.voiceAudioSource === "tone"
230
+ ? args.voiceAudioSource
231
+ : undefined;
232
+ const hasAudioHint = Boolean(source
233
+ || args.voiceAudioUrl?.trim()
234
+ || args.voiceAudioPath?.trim()
235
+ || args.voiceAudioLabel?.trim()
236
+ || args.voiceAudioToneHz?.trim()
237
+ || args.voiceAudioDurationMs?.trim());
238
+ if (!hasAudioHint)
239
+ return undefined;
240
+ const toneHz = args.voiceAudioToneHz?.trim() ? Number(args.voiceAudioToneHz) : undefined;
241
+ const durationMs = args.voiceAudioDurationMs?.trim() ? Number(args.voiceAudioDurationMs) : undefined;
242
+ return {
243
+ source: source ?? "tone",
244
+ ...(args.voiceAudioUrl?.trim() ? { url: args.voiceAudioUrl.trim() } : {}),
245
+ ...(args.voiceAudioPath?.trim() ? { path: args.voiceAudioPath.trim() } : {}),
246
+ ...(args.voiceAudioLabel?.trim() ? { label: args.voiceAudioLabel.trim() } : {}),
247
+ ...(Number.isFinite(toneHz) ? { toneHz } : {}),
248
+ ...(Number.isFinite(durationMs) ? { durationMs } : {}),
249
+ };
250
+ }
251
+ /* v8 ignore stop */
252
+ function isLiveCodingSessionStatus(status) {
253
+ return status === "spawning"
254
+ || status === "running"
255
+ || status === "waiting_input"
256
+ || status === "stalled";
257
+ }
258
+ function readActiveWorkInnerState() {
259
+ const defaultJob = {
260
+ status: "idle",
261
+ content: null,
262
+ origin: null,
263
+ mode: "reflect",
264
+ obligationStatus: null,
265
+ surfacedResult: null,
266
+ queuedAt: null,
267
+ startedAt: null,
268
+ surfacedAt: null,
269
+ };
270
+ try {
271
+ const agentRoot = (0, identity_1.getAgentRoot)();
272
+ const pendingDir = (0, pending_1.getPrivateRuntimePendingDir)((0, identity_1.getAgentName)());
273
+ const sessionPath = (0, thoughts_1.getPrivateRuntimeSessionPath)(agentRoot);
274
+ const { pendingMessages, turns, runtimeState } = (0, thoughts_1.readPrivateRuntimeRawData)(sessionPath, pendingDir);
275
+ const dialogStatus = (0, thoughts_1.derivePrivateRuntimeStatus)(pendingMessages, turns, runtimeState);
276
+ const job = (0, thoughts_1.deriveInnerJob)(pendingMessages, turns, runtimeState);
277
+ const storeObligationPending = (0, obligations_1.readPendingObligations)(agentRoot).length > 0;
278
+ return {
279
+ status: dialogStatus.processing === "started" ? "running" : "idle",
280
+ hasPending: dialogStatus.queue !== "clear",
281
+ origin: dialogStatus.origin,
282
+ contentSnippet: dialogStatus.contentSnippet,
283
+ obligationPending: dialogStatus.obligationPending || storeObligationPending,
284
+ job,
285
+ };
286
+ }
287
+ catch {
288
+ return {
289
+ status: "idle",
290
+ hasPending: false,
291
+ job: defaultJob,
292
+ };
293
+ }
294
+ }
295
+ async function buildToolActiveWorkFrame(ctx) {
296
+ const currentSession = ctx?.currentSession
297
+ ? {
298
+ friendId: ctx.currentSession.friendId,
299
+ channel: ctx.currentSession.channel,
300
+ key: ctx.currentSession.key,
301
+ sessionPath: (0, config_1.resolveSessionPath)(ctx.currentSession.friendId, ctx.currentSession.channel, ctx.currentSession.key),
302
+ }
303
+ : null;
304
+ const agentRoot = (0, identity_1.getAgentRoot)();
305
+ const bridges = currentSession
306
+ ? (0, manager_1.createBridgeManager)().findBridgesForSession({
307
+ friendId: currentSession.friendId,
308
+ channel: currentSession.channel,
309
+ key: currentSession.key,
310
+ })
311
+ : [];
312
+ let friendActivity = [];
313
+ try {
314
+ friendActivity = (0, session_activity_1.listSessionActivity)({
315
+ sessionsDir: `${agentRoot}/state/sessions`,
316
+ friendsDir: `${agentRoot}/friends`,
317
+ agentName: (0, identity_1.getAgentName)(),
318
+ currentSession,
319
+ });
320
+ }
321
+ catch {
322
+ friendActivity = [];
323
+ }
324
+ const pendingObligations = (() => {
325
+ try {
326
+ return (0, obligations_1.readPendingObligations)(agentRoot);
327
+ }
328
+ catch {
329
+ return [];
330
+ }
331
+ })();
332
+ let codingSessions = [];
333
+ let otherCodingSessions = [];
334
+ try {
335
+ const liveCodingSessions = (0, coding_1.getCodingSessionManager)()
336
+ .listSessions()
337
+ .filter((session) => isLiveCodingSessionStatus(session.status) && Boolean(session.originSession));
338
+ if (currentSession) {
339
+ codingSessions = liveCodingSessions.filter((session) => session.originSession?.friendId === currentSession.friendId
340
+ && session.originSession.channel === currentSession.channel
341
+ && session.originSession.key === currentSession.key);
342
+ otherCodingSessions = liveCodingSessions.filter((session) => !(session.originSession?.friendId === currentSession.friendId
343
+ && session.originSession.channel === currentSession.channel
344
+ && session.originSession.key === currentSession.key));
345
+ }
346
+ else {
347
+ codingSessions = [];
348
+ otherCodingSessions = liveCodingSessions;
349
+ }
350
+ }
351
+ catch {
352
+ codingSessions = [];
353
+ otherCodingSessions = [];
354
+ }
355
+ const currentObligation = currentSession
356
+ ? pendingObligations.find((obligation) => obligation.status !== "fulfilled"
357
+ && obligation.origin.friendId === currentSession.friendId
358
+ && obligation.origin.channel === currentSession.channel
359
+ && obligation.origin.key === currentSession.key)?.content ?? null
360
+ : null;
361
+ const backgroundOperations = (0, mail_import_discovery_1.listVisibleBackgroundOperations)({
362
+ agentName: (0, identity_1.getAgentName)(),
363
+ agentRoot,
364
+ repoRoot: process.cwd(),
365
+ homeDir: process.env.HOME,
366
+ nowMs: Date.now(),
367
+ limit: 5,
368
+ });
369
+ return (0, active_work_1.buildActiveWorkFrame)({
370
+ currentSession,
371
+ currentObligation,
372
+ mustResolveBeforeHandoff: false,
373
+ inner: readActiveWorkInnerState(),
374
+ bridges,
375
+ codingSessions,
376
+ backgroundOperations,
377
+ otherCodingSessions,
378
+ pendingObligations,
379
+ friendActivity,
380
+ targetCandidates: [],
381
+ });
382
+ }
383
+ function findDelegatingBridgeId(ctx) {
384
+ const currentSession = ctx?.currentSession;
385
+ if (!currentSession)
386
+ return undefined;
387
+ return ctx?.activeBridges?.find((bridge) => bridge.lifecycle === "active"
388
+ && bridge.attachedSessions.some((session) => session.friendId === currentSession.friendId
389
+ && session.channel === currentSession.channel
390
+ && session.key === currentSession.key))?.id;
391
+ }
392
+ function sendMessageRiskProfile(args) {
393
+ if (args.friendId?.trim() === "self") {
394
+ return {
395
+ mutates: "private_attention_write",
396
+ risk: "high",
397
+ reason: "queues private-runtime attention without contacting an external session",
398
+ };
399
+ }
400
+ return {
401
+ mutates: ["durable_state_write", "external_side_effect"],
402
+ risk: "high",
403
+ reason: "queues or delivers messages across sessions/channels",
404
+ };
405
+ }
406
+ function renderInnerProgressStatus(status) {
407
+ if (status.processing === "pending") {
408
+ return "i've queued this thought for private attention. it'll come up when my private runtime is free.";
409
+ }
410
+ if (status.processing === "started") {
411
+ return "i'm working through this privately right now.";
412
+ }
413
+ // processed / completed
414
+ if (status.surfaced && status.surfaced !== "nothing recent" && status.surfaced !== "no outward result") {
415
+ return `i thought about this privately and came to something: ${status.surfaced}`;
416
+ }
417
+ return "i thought about this privately. i'll bring it back when the time is right.";
418
+ }
419
+ exports.sessionToolDefinitions = [
420
+ {
421
+ tool: {
422
+ type: "function",
423
+ function: {
424
+ name: "query_active_work",
425
+ description: "read the current live world-state across visible sessions, coding lanes, private-runtime work, and return obligations. use this instead of piecing status together from separate session and coding tools.",
426
+ parameters: {
427
+ type: "object",
428
+ properties: {},
429
+ },
430
+ },
431
+ },
432
+ handler: async (_args, ctx) => {
433
+ const frame = await buildToolActiveWorkFrame(ctx);
434
+ return `this is my current top-level live world-state.\nanswer whole-self status questions from this before drilling into individual sessions.\n\n${(0, active_work_1.formatActiveWorkFrame)(frame)}`;
435
+ },
436
+ },
437
+ {
438
+ tool: {
439
+ type: "function",
440
+ function: {
441
+ name: "session_summary",
442
+ description: "read-only orientation for habit runs. returns a structured live summary from habit receipts, session files, pending dirs, and runtime cursors without writing state.",
443
+ parameters: {
444
+ type: "object",
445
+ properties: {
446
+ runId: { type: "string", description: "exact habit run id; cannot be combined with habitName, operationId, or which" },
447
+ habitName: { type: "string", description: "habit name to select from" },
448
+ operationId: { type: "string", description: "operation id for stateful habit run groups, such as habit:heartbeat" },
449
+ which: {
450
+ type: "string",
451
+ enum: ["latest", "previous", "latest-success", "latest-failure"],
452
+ description: "which matching run to read; defaults to latest",
453
+ },
454
+ },
455
+ },
456
+ },
457
+ },
458
+ handler: (args) => {
459
+ const validation = validateSessionSummarySelector(args);
460
+ if (!validation.ok) {
461
+ return JSON.stringify({
462
+ kind: "invalid_selector",
463
+ code: validation.code,
464
+ message: validation.message,
465
+ }, null, 2);
466
+ }
467
+ const summary = (0, habit_session_summary_1.readHabitSessionSummary)((0, identity_1.getAgentRoot)(), validation.selector);
468
+ if (!summary) {
469
+ return JSON.stringify({
470
+ kind: "not_found",
471
+ message: "no habit run matched selector",
472
+ selector: validation.selector,
473
+ }, null, 2);
474
+ }
475
+ return JSON.stringify({
476
+ kind: "habit_session_summary",
477
+ text: renderSessionSummaryText(summary),
478
+ summary,
479
+ }, null, 2);
480
+ },
481
+ riskProfile: {
482
+ mutates: "none",
483
+ risk: "low",
484
+ reason: "reads habit run summaries from local receipts and session artifacts",
485
+ },
486
+ summaryKeys: ["runId", "habitName", "operationId", "which"],
487
+ },
488
+ {
489
+ tool: {
490
+ type: "function",
491
+ function: {
492
+ name: "query_session",
493
+ description: "inspect another session. use transcript for recent context or status for self/private-runtime progress. deprecated search invocations should use search_facts, consult_diary, or consult_notes instead.",
494
+ parameters: {
495
+ type: "object",
496
+ properties: {
497
+ friendId: { type: "string", description: "the friend UUID (or 'self')" },
498
+ channel: { type: "string", description: "the channel: cli, teams, bluebubbles, voice, mcp, or legacy inner for private-runtime compatibility" },
499
+ key: { type: "string", description: "session key (defaults to 'session')" },
500
+ messageCount: { type: "string", description: "how many recent messages to return (default 20)" },
501
+ mode: {
502
+ type: "string",
503
+ enum: ["transcript", "status", "search"],
504
+ description: "transcript (default), lightweight status for self/private-runtime checks, or deprecated search; use search_facts, consult_diary, or consult_notes instead",
505
+ },
506
+ query: { type: "string", description: "deprecated when mode=search; use search_facts, consult_diary, or consult_notes instead" },
507
+ },
508
+ required: ["friendId", "channel"],
509
+ },
510
+ },
511
+ },
512
+ handler: async (args, ctx) => {
513
+ let friendId = args.friendId;
514
+ const channel = args.channel;
515
+ const key = args.key || "session";
516
+ const count = parseInt(args.messageCount || "20", 10);
517
+ const mode = args.mode || "transcript";
518
+ // Resolve friend name -> UUID if not already a UUID or "self"
519
+ if (friendId && friendId !== "self" && !/^[0-9a-f]{8}-[0-9a-f]{4}-/.test(friendId) && ctx?.friendStore?.listAll) {
520
+ const allFriends = await ctx.friendStore.listAll();
521
+ const match = allFriends.find(f => f.name.toLowerCase() === friendId.toLowerCase());
522
+ if (match) {
523
+ friendId = match.id;
524
+ }
525
+ }
526
+ if (mode === "status") {
527
+ if (friendId !== "self" || channel !== "inner") {
528
+ return "status mode is only available for self/private runtime.";
529
+ }
530
+ const sessionPath = (0, thoughts_1.getPrivateRuntimeSessionPath)((0, identity_1.getAgentRoot)());
531
+ const pendingDir = (0, pending_1.getPrivateRuntimePendingDir)((0, identity_1.getAgentName)());
532
+ return renderInnerProgressStatus((0, thoughts_1.readPrivateRuntimeStatus)(sessionPath, pendingDir));
533
+ }
534
+ if (mode === "search") {
535
+ return JSON.stringify({
536
+ kind: "deprecated",
537
+ message: "query_session mode=search is no longer available; use search_facts, consult_diary, or consult_notes instead.",
538
+ removalCycle: "alpha.616",
539
+ });
540
+ }
541
+ const sessFile = (0, config_1.resolveSessionPath)(friendId, channel, key);
542
+ const sessionTail = await summarizeSessionTailSafely({
543
+ sessionPath: sessFile,
544
+ friendId,
545
+ channel,
546
+ key,
547
+ messageCount: count,
548
+ trustLevel: ctx?.context?.friend?.trustLevel,
549
+ summarize: ctx?.summarize,
550
+ });
551
+ if (sessionTail.kind === "missing") {
552
+ return NO_SESSION_FOUND_MESSAGE;
553
+ }
554
+ if (sessionTail.kind === "empty") {
555
+ return EMPTY_SESSION_MESSAGE;
556
+ }
557
+ return sessionTail.summary;
558
+ },
559
+ },
560
+ {
561
+ tool: {
562
+ type: "function",
563
+ function: {
564
+ name: "send_message",
565
+ description: "send a message to a friend's session. when the request is explicitly authorized from a trusted live chat, the harness will try to deliver immediately; otherwise it reports truthful queued/block/failure state. do not use friendId=self for user-requested private-return work; use ponder so the typed return contract can be tracked and surfaced once.",
566
+ parameters: {
567
+ type: "object",
568
+ properties: {
569
+ friendId: { type: "string", description: "the friend UUID (or 'self')" },
570
+ channel: { type: "string", description: "the channel: cli, teams, bluebubbles, voice, mcp, or legacy inner for private-runtime compatibility. channel=voice intentionally starts a live phone call to a trusted friend through the Voice sense." },
571
+ key: { type: "string", description: "session key (defaults to 'session')" },
572
+ content: { type: "string", description: "the message content to send" },
573
+ voiceAudioSource: { type: "string", enum: ["tone", "url", "file"], description: "optional initial non-speech audio to play after the opening greeting when channel=voice" },
574
+ voiceAudioUrl: { type: "string", description: "short audio URL for voiceAudioSource=url" },
575
+ voiceAudioPath: { type: "string", description: "local audio file path for voiceAudioSource=file" },
576
+ voiceAudioLabel: { type: "string", description: "short label for the initial voice audio" },
577
+ voiceAudioToneHz: { type: "number", description: "tone frequency for voiceAudioSource=tone" },
578
+ voiceAudioDurationMs: { type: "number", description: "initial audio duration in milliseconds" },
579
+ },
580
+ required: ["friendId", "channel", "content"],
581
+ },
582
+ },
583
+ },
584
+ handler: async (args, ctx) => {
585
+ let friendId = args.friendId;
586
+ const channel = args.channel;
587
+ const key = args.key || "session";
588
+ const content = args.content;
589
+ const voiceInitialAudio = channel === "voice" ? parseVoiceInitialAudio(args) : undefined;
590
+ const now = Date.now();
591
+ const agentName = (0, identity_1.getAgentName)();
592
+ // Resolve friend name → UUID if needed
593
+ /* v8 ignore start -- name resolution: reads real filesystem, tested via live integration @preserve */
594
+ if (friendId !== "self") {
595
+ const originalFriendId = friendId;
596
+ try {
597
+ const agentRoot = (0, identity_1.getAgentRoot)();
598
+ const sessionsDir = path.join(agentRoot, "state", "sessions");
599
+ const friendsDir = path.join(agentRoot, "friends");
600
+ const sessionDirExists = fs.existsSync(path.join(sessionsDir, friendId));
601
+ if (!sessionDirExists) {
602
+ const friendFiles = fs.readdirSync(friendsDir).filter((f) => f.endsWith(".json"));
603
+ for (const file of friendFiles) {
604
+ const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
605
+ const record = JSON.parse(raw);
606
+ if (record.name?.toLowerCase() === friendId.toLowerCase() && record.id) {
607
+ friendId = record.id;
608
+ break;
609
+ }
610
+ }
611
+ (0, runtime_1.emitNervesEvent)({
612
+ component: "repertoire",
613
+ event: "repertoire.send_message_name_resolve",
614
+ message: friendId !== originalFriendId ? "resolved friend name to UUID" : "friend name resolution failed",
615
+ meta: { original: originalFriendId, resolved: friendId, friendsDir, fileCount: friendFiles.length },
616
+ });
617
+ }
618
+ }
619
+ catch (err) {
620
+ (0, runtime_1.emitNervesEvent)({
621
+ level: "warn",
622
+ component: "repertoire",
623
+ event: "repertoire.send_message_name_resolve_error",
624
+ message: "friend name resolution threw",
625
+ meta: { friendId: originalFriendId, error: err instanceof Error ? err.message : String(err) },
626
+ });
627
+ }
628
+ }
629
+ /* v8 ignore stop */
630
+ // Self-routing: messages to "self" always go to the private-runtime pending dir,
631
+ // regardless of the channel or key the agent specified.
632
+ const isSelf = friendId === "self";
633
+ const pendingDir = isSelf
634
+ ? (0, pending_1.getPrivateRuntimePendingDir)(agentName)
635
+ : (0, pending_1.getPendingDir)(agentName, friendId, channel, key);
636
+ const delegatingBridgeId = findDelegatingBridgeId(ctx);
637
+ const delegatedFrom = isSelf
638
+ && ctx?.currentSession
639
+ && !(ctx.currentSession.friendId === "self" && ctx.currentSession.channel === "inner")
640
+ ? {
641
+ friendId: ctx.currentSession.friendId,
642
+ channel: ctx.currentSession.channel,
643
+ key: ctx.currentSession.key,
644
+ ...(delegatingBridgeId ? { bridgeId: delegatingBridgeId } : {}),
645
+ }
646
+ : undefined;
647
+ const obligationId = delegatedFrom ? (0, obligations_1.generateObligationId)(now) : undefined;
648
+ const envelope = {
649
+ from: agentName,
650
+ friendId,
651
+ channel,
652
+ key,
653
+ content,
654
+ timestamp: now,
655
+ ...(delegatedFrom ? { delegatedFrom, obligationStatus: "pending" } : {}),
656
+ ...(obligationId ? { obligationId } : {}),
657
+ };
658
+ if (isSelf) {
659
+ const pendingMessageId = writePendingEnvelope(pendingDir, envelope);
660
+ if (delegatedFrom) {
661
+ try {
662
+ (0, obligations_1.createObligation)((0, identity_1.getAgentRoot)(), {
663
+ origin: {
664
+ friendId: delegatedFrom.friendId,
665
+ channel: delegatedFrom.channel,
666
+ key: delegatedFrom.key,
667
+ },
668
+ ...(delegatedFrom.bridgeId ? { bridgeId: delegatedFrom.bridgeId } : {}),
669
+ content,
670
+ });
671
+ }
672
+ catch {
673
+ /* v8 ignore next -- defensive: obligation store write failure should not break send_message @preserve */
674
+ }
675
+ /* v8 ignore next -- obligationId always set when delegatedFrom is set (see generateObligationId above) @preserve */
676
+ if (obligationId) {
677
+ (0, obligations_1.createReturnObligation)(agentName, {
678
+ id: obligationId,
679
+ origin: delegatedFrom,
680
+ status: "queued",
681
+ delegatedContent: content.length > 120 ? `${content.slice(0, 117)}...` : content,
682
+ createdAt: now,
683
+ });
684
+ }
685
+ (0, runtime_1.emitNervesEvent)({
686
+ event: "repertoire.obligation_created",
687
+ component: "repertoire",
688
+ message: "obligation created for private-runtime delegation",
689
+ meta: {
690
+ friendId: delegatedFrom.friendId,
691
+ channel: delegatedFrom.channel,
692
+ key: delegatedFrom.key,
693
+ },
694
+ });
695
+ }
696
+ try {
697
+ await (0, socket_client_1.requestPrivateWake)(agentName, ctx?.daemonSocketPath, {
698
+ reason: "send_message self-route private attention",
699
+ triggerSource: "send-message-self-route",
700
+ budgetClass: "interactive",
701
+ idempotencyKey: `send-message-self-route:${agentName}:${pendingMessageId}`,
702
+ originRefs: [
703
+ { kind: "tool", id: "send_message" },
704
+ { kind: "pending-queue", id: "self/inner/dialog" },
705
+ { kind: "pending-message", id: pendingMessageId },
706
+ ],
707
+ });
708
+ }
709
+ catch {
710
+ // Queue-first self routing must not inline-run private work when the daemon is unavailable.
711
+ }
712
+ return renderInnerProgressStatus({
713
+ queue: "queued to private runtime",
714
+ wake: "daemon requested",
715
+ processing: "pending",
716
+ surfaced: "nothing yet",
717
+ });
718
+ }
719
+ // Resolve BB session key if using default — agents don't know the real session key
720
+ /* v8 ignore start -- BB session key resolution: reads real filesystem @preserve */
721
+ let resolvedKey = key;
722
+ if (channel === "bluebubbles" && key === "session") {
723
+ try {
724
+ const agentRoot = (0, identity_1.getAgentRoot)();
725
+ const bbDir = path.join(agentRoot, "state", "sessions", friendId, "bluebubbles");
726
+ if (fs.existsSync(bbDir)) {
727
+ const files = fs.readdirSync(bbDir).filter((f) => f.endsWith(".json"));
728
+ // Only use DM sessions (;-;) for proactive delivery — never group chats (;+;)
729
+ const dmFile = files.find((f) => f.includes(";-;"));
730
+ if (dmFile) {
731
+ resolvedKey = dmFile.replace(/\.json$/, "");
732
+ }
733
+ }
734
+ }
735
+ catch { /* continue with default key */ }
736
+ }
737
+ /* v8 ignore stop */
738
+ const deliveryResult = await (0, cross_chat_delivery_1.deliverCrossChatMessage)({
739
+ friendId,
740
+ channel,
741
+ key: resolvedKey,
742
+ content,
743
+ intent: ctx?.currentSession && ctx.currentSession.friendId !== "self"
744
+ ? "explicit_cross_chat"
745
+ : "generic_outreach",
746
+ ...(ctx?.currentSession && ctx.currentSession.friendId !== "self"
747
+ ? {
748
+ authorizingSession: {
749
+ friendId: ctx.currentSession.friendId,
750
+ channel: ctx.currentSession.channel,
751
+ key: ctx.currentSession.key,
752
+ trustLevel: ctx?.context?.friend?.trustLevel,
753
+ },
754
+ }
755
+ : {}),
756
+ }, {
757
+ agentName,
758
+ queuePending: (message) => writePendingEnvelope(pendingDir, message),
759
+ deliverers: {
760
+ bluebubbles: async (request) => {
761
+ const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
762
+ const result = await sendProactiveBlueBubblesMessageToSession({
763
+ friendId: request.friendId,
764
+ sessionKey: request.key,
765
+ text: request.content,
766
+ intent: request.intent,
767
+ authorizingSession: request.authorizingSession,
768
+ });
769
+ if (result.delivered) {
770
+ return {
771
+ status: "delivered_now",
772
+ detail: "sent to the active bluebubbles chat now",
773
+ };
774
+ }
775
+ if (result.reason === "missing_target") {
776
+ return {
777
+ status: "blocked",
778
+ detail: "bluebubbles could not resolve a routable target for that session",
779
+ };
780
+ }
781
+ if (result.reason === "blocked_meta_content") {
782
+ return {
783
+ status: "blocked",
784
+ detail: "blocked: contains internal meta markers",
785
+ };
786
+ }
787
+ if (result.reason === "send_error") {
788
+ return {
789
+ status: "failed",
790
+ detail: "bluebubbles send failed",
791
+ };
792
+ }
793
+ return {
794
+ status: "unavailable",
795
+ detail: "live delivery unavailable right now; queued for the next active turn",
796
+ };
797
+ },
798
+ teams: async (request) => {
799
+ if (!ctx?.botApi) {
800
+ return {
801
+ status: "unavailable",
802
+ detail: "live delivery unavailable right now; queued for the next active turn",
803
+ };
804
+ }
805
+ const { sendProactiveTeamsMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/teams")));
806
+ const result = await sendProactiveTeamsMessageToSession({
807
+ friendId: request.friendId,
808
+ sessionKey: request.key,
809
+ text: request.content,
810
+ intent: request.intent,
811
+ authorizingSession: request.authorizingSession,
812
+ }, {
813
+ botApi: ctx.botApi,
814
+ });
815
+ if (result.delivered) {
816
+ return {
817
+ status: "delivered_now",
818
+ detail: "sent to the active teams chat now",
819
+ };
820
+ }
821
+ if (result.reason === "missing_target") {
822
+ return {
823
+ status: "blocked",
824
+ detail: "teams could not resolve a routable target for that session",
825
+ };
826
+ }
827
+ if (result.reason === "send_error") {
828
+ return {
829
+ status: "failed",
830
+ detail: "teams send failed",
831
+ };
832
+ }
833
+ return {
834
+ status: "unavailable",
835
+ detail: "live delivery unavailable right now; queued for the next active turn",
836
+ };
837
+ },
838
+ voice: async (request) => deliverVoiceChannelMessage(request, agentName, voiceInitialAudio),
839
+ },
840
+ });
841
+ recordHabitSendAttempt(ctx, { friendId, channel, key }, deliveryResult);
842
+ return renderCrossChatDeliveryStatus(`${friendId} on ${channel}/${key}`, deliveryResult);
843
+ },
844
+ riskProfile: sendMessageRiskProfile,
845
+ },
846
+ {
847
+ tool: {
848
+ type: "function",
849
+ function: {
850
+ name: "set_reasoning_effort",
851
+ description: "adjust your own reasoning depth for subsequent turns. use higher effort for complex analysis, lower for simple tasks.",
852
+ parameters: {
853
+ type: "object",
854
+ properties: {
855
+ level: { type: "string", description: "the reasoning effort level to set" },
856
+ },
857
+ required: ["level"],
858
+ },
859
+ },
860
+ },
861
+ handler: (args, ctx) => {
862
+ if (!ctx?.supportedReasoningEfforts || !ctx.setReasoningEffort) {
863
+ return "reasoning effort adjustment is not available in this context.";
864
+ }
865
+ const level = (args.level || "").trim();
866
+ if (!ctx.supportedReasoningEfforts.includes(level)) {
867
+ return `invalid reasoning effort level "${level}". accepted levels: ${ctx.supportedReasoningEfforts.join(", ")}`;
868
+ }
869
+ ctx.setReasoningEffort(level);
870
+ (0, runtime_1.emitNervesEvent)({
871
+ component: "repertoire",
872
+ event: "repertoire.reasoning_effort_changed",
873
+ message: `reasoning effort set to ${level}`,
874
+ meta: { level },
875
+ });
876
+ return `reasoning effort set to "${level}".`;
877
+ },
878
+ requiredCapability: "reasoning-effort",
879
+ summaryKeys: ["level"],
880
+ },
881
+ ];