@ouro.bot/cli 0.1.0-alpha.51 → 0.1.0-alpha.510

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 (372) hide show
  1. package/README.md +133 -19
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +3245 -0
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +867 -35
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +426 -0
  28. package/dist/heart/background-operations.js +281 -0
  29. package/dist/heart/bundle-state.js +168 -0
  30. package/dist/heart/commitments.js +111 -0
  31. package/dist/heart/config-registry.js +304 -0
  32. package/dist/heart/config.js +119 -129
  33. package/dist/heart/core.js +878 -244
  34. package/dist/heart/cross-chat-delivery.js +131 -0
  35. package/dist/heart/daemon/agent-config-check.js +490 -0
  36. package/dist/heart/daemon/agent-discovery.js +79 -3
  37. package/dist/heart/daemon/agent-service.js +360 -0
  38. package/dist/heart/daemon/agentic-repair.js +216 -0
  39. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  40. package/dist/heart/daemon/cadence.js +70 -0
  41. package/dist/heart/daemon/cli-defaults.js +640 -0
  42. package/dist/heart/daemon/cli-exec.js +7239 -0
  43. package/dist/heart/daemon/cli-help.js +493 -0
  44. package/dist/heart/daemon/cli-parse.js +1533 -0
  45. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  46. package/dist/heart/daemon/cli-render.js +561 -0
  47. package/dist/heart/daemon/cli-types.js +8 -0
  48. package/dist/heart/daemon/connect-bay.js +323 -0
  49. package/dist/heart/daemon/daemon-cli.js +29 -1631
  50. package/dist/heart/daemon/daemon-entry.js +345 -3
  51. package/dist/heart/daemon/daemon-health.js +141 -0
  52. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  53. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  54. package/dist/heart/daemon/daemon.js +677 -58
  55. package/dist/heart/daemon/dns-workflow.js +394 -0
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +750 -0
  58. package/dist/heart/daemon/health-monitor.js +92 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/human-command-screens.js +234 -0
  63. package/dist/heart/daemon/human-readiness.js +114 -0
  64. package/dist/heart/daemon/inner-status.js +89 -0
  65. package/dist/heart/daemon/interactive-repair.js +394 -0
  66. package/dist/heart/daemon/launchd.js +25 -5
  67. package/dist/heart/daemon/log-tailer.js +82 -12
  68. package/dist/heart/daemon/logs-prune.js +110 -0
  69. package/dist/heart/daemon/message-router.js +2 -2
  70. package/dist/heart/daemon/os-cron-deps.js +134 -0
  71. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  72. package/dist/heart/daemon/ouro-entry.js +3 -1
  73. package/dist/heart/daemon/process-manager.js +214 -0
  74. package/dist/heart/daemon/provider-discovery.js +137 -0
  75. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  76. package/dist/heart/daemon/pulse.js +475 -0
  77. package/dist/heart/daemon/readiness-repair.js +365 -0
  78. package/dist/heart/daemon/run-hooks.js +2 -0
  79. package/dist/heart/daemon/runtime-logging.js +67 -16
  80. package/dist/heart/daemon/runtime-metadata.js +73 -0
  81. package/dist/heart/daemon/runtime-mode.js +67 -0
  82. package/dist/heart/daemon/safe-mode.js +161 -0
  83. package/dist/heart/daemon/sense-manager.js +178 -37
  84. package/dist/heart/daemon/session-id-resolver.js +131 -0
  85. package/dist/heart/daemon/skill-management-installer.js +94 -0
  86. package/dist/heart/daemon/socket-client.js +109 -4
  87. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  88. package/dist/heart/daemon/startup-tui.js +264 -0
  89. package/dist/heart/daemon/task-scheduler.js +3 -25
  90. package/dist/heart/daemon/terminal-ui.js +499 -0
  91. package/dist/heart/daemon/thoughts.js +162 -17
  92. package/dist/heart/daemon/up-progress.js +366 -0
  93. package/dist/heart/daemon/vault-items.js +56 -0
  94. package/dist/heart/delegation.js +1 -1
  95. package/dist/heart/habits/habit-migration.js +189 -0
  96. package/dist/heart/habits/habit-parser.js +140 -0
  97. package/dist/heart/habits/habit-runtime-state.js +100 -0
  98. package/dist/heart/habits/habit-scheduler.js +372 -0
  99. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  100. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  101. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  102. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  103. package/dist/heart/identity.js +205 -66
  104. package/dist/heart/kept-notes.js +357 -0
  105. package/dist/heart/kicks.js +1 -1
  106. package/dist/heart/machine-identity.js +161 -0
  107. package/dist/heart/mail-import-discovery.js +353 -0
  108. package/dist/heart/mcp/mcp-server.js +653 -0
  109. package/dist/heart/migrate-config.js +100 -0
  110. package/dist/heart/model-capabilities.js +19 -0
  111. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  112. package/dist/heart/outlook/outlook-http-response.js +7 -0
  113. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  114. package/dist/heart/outlook/outlook-http-static.js +103 -0
  115. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  116. package/dist/heart/outlook/outlook-http.js +99 -0
  117. package/dist/heart/outlook/outlook-read.js +31 -0
  118. package/dist/heart/outlook/outlook-types.js +27 -0
  119. package/dist/heart/outlook/outlook-view.js +195 -0
  120. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  121. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  122. package/dist/heart/outlook/readers/mail.js +362 -0
  123. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  124. package/dist/heart/outlook/readers/sessions.js +232 -0
  125. package/dist/heart/outlook/readers/shared.js +111 -0
  126. package/dist/heart/platform.js +81 -0
  127. package/dist/heart/provider-attempt.js +134 -0
  128. package/dist/heart/provider-binding-resolver.js +255 -0
  129. package/dist/heart/provider-credentials.js +424 -0
  130. package/dist/heart/provider-failover.js +301 -0
  131. package/dist/heart/provider-models.js +81 -0
  132. package/dist/heart/provider-ping.js +262 -0
  133. package/dist/heart/provider-state.js +216 -0
  134. package/dist/heart/provider-visibility.js +188 -0
  135. package/dist/heart/providers/anthropic-token.js +131 -0
  136. package/dist/heart/providers/anthropic.js +139 -52
  137. package/dist/heart/providers/azure.js +97 -13
  138. package/dist/heart/providers/error-classification.js +127 -0
  139. package/dist/heart/providers/github-copilot.js +145 -0
  140. package/dist/heart/providers/minimax-vlm.js +189 -0
  141. package/dist/heart/providers/minimax.js +26 -8
  142. package/dist/heart/providers/openai-codex.js +55 -40
  143. package/dist/heart/runtime-capability-check.js +170 -0
  144. package/dist/heart/runtime-credentials.js +260 -0
  145. package/dist/heart/sense-truth.js +11 -4
  146. package/dist/heart/session-activity.js +43 -22
  147. package/dist/heart/session-events.js +1150 -0
  148. package/dist/heart/session-playback-cli-main.js +5 -0
  149. package/dist/heart/session-playback-cli.js +36 -0
  150. package/dist/heart/session-playback.js +231 -0
  151. package/dist/heart/session-stats-cli-main.js +5 -0
  152. package/dist/heart/session-stats.js +182 -0
  153. package/dist/heart/session-transcript.js +167 -0
  154. package/dist/heart/start-of-turn-packet.js +345 -0
  155. package/dist/heart/streaming.js +44 -27
  156. package/dist/heart/sync.js +332 -0
  157. package/dist/heart/target-resolution.js +127 -0
  158. package/dist/heart/tempo.js +93 -0
  159. package/dist/heart/temporal-view.js +41 -0
  160. package/dist/heart/tool-activity-callbacks.js +36 -0
  161. package/dist/heart/tool-description.js +135 -0
  162. package/dist/heart/tool-friction.js +55 -0
  163. package/dist/heart/tool-loop.js +200 -0
  164. package/dist/heart/turn-context.js +372 -0
  165. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  166. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  167. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  168. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  169. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  170. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  171. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  172. package/dist/mailroom/attention.js +167 -0
  173. package/dist/mailroom/autonomy.js +209 -0
  174. package/dist/mailroom/blob-store.js +606 -0
  175. package/dist/mailroom/body-cache.js +61 -0
  176. package/dist/mailroom/core.js +672 -0
  177. package/dist/mailroom/entry.js +160 -0
  178. package/dist/mailroom/file-store.js +426 -0
  179. package/dist/mailroom/mbox-import.js +382 -0
  180. package/dist/mailroom/outbound.js +380 -0
  181. package/dist/mailroom/policy.js +263 -0
  182. package/dist/mailroom/reader.js +219 -0
  183. package/dist/mailroom/search-cache.js +182 -0
  184. package/dist/mailroom/search-relevance.js +319 -0
  185. package/dist/mailroom/smtp-ingress.js +176 -0
  186. package/dist/mailroom/source-state.js +176 -0
  187. package/dist/mailroom/thread.js +109 -0
  188. package/dist/mailroom/travel-extract.js +89 -0
  189. package/dist/mind/bundle-manifest.js +7 -1
  190. package/dist/mind/context.js +165 -101
  191. package/dist/mind/diary-integrity.js +60 -0
  192. package/dist/mind/{memory.js → diary.js} +74 -93
  193. package/dist/mind/embedding-provider.js +60 -0
  194. package/dist/mind/file-state.js +179 -0
  195. package/dist/mind/friends/channel.js +30 -0
  196. package/dist/mind/friends/group-context.js +144 -0
  197. package/dist/mind/friends/resolver.js +54 -2
  198. package/dist/mind/friends/store-file.js +39 -3
  199. package/dist/mind/friends/trust-explanation.js +74 -0
  200. package/dist/mind/friends/types.js +2 -2
  201. package/dist/mind/journal-index.js +161 -0
  202. package/dist/mind/note-search.js +268 -0
  203. package/dist/mind/obligation-steering.js +221 -0
  204. package/dist/mind/pending.js +4 -0
  205. package/dist/mind/prompt-refresh.js +3 -2
  206. package/dist/mind/prompt.js +940 -111
  207. package/dist/mind/provenance-trust.js +26 -0
  208. package/dist/mind/scrutiny.js +173 -0
  209. package/dist/nerves/cli-logging.js +7 -1
  210. package/dist/nerves/coverage/audit-rules.js +15 -6
  211. package/dist/nerves/coverage/audit.js +28 -2
  212. package/dist/nerves/coverage/cli.js +1 -1
  213. package/dist/nerves/coverage/contract.js +5 -5
  214. package/dist/nerves/coverage/file-completeness.js +114 -5
  215. package/dist/nerves/coverage/run-artifacts.js +1 -1
  216. package/dist/nerves/event-buffer.js +111 -0
  217. package/dist/nerves/index.js +224 -4
  218. package/dist/nerves/observation.js +20 -0
  219. package/dist/nerves/redact.js +79 -0
  220. package/dist/nerves/review/cli-main.js +5 -0
  221. package/dist/nerves/review/cli.js +156 -0
  222. package/dist/nerves/review/core.js +152 -0
  223. package/dist/nerves/runtime.js +5 -1
  224. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  225. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  226. package/dist/outlook-ui/index.html +15 -0
  227. package/dist/repertoire/ado-client.js +15 -56
  228. package/dist/repertoire/ado-semantic.js +11 -10
  229. package/dist/repertoire/api-client.js +97 -0
  230. package/dist/repertoire/bitwarden-store.js +774 -0
  231. package/dist/repertoire/bundle-templates.js +72 -0
  232. package/dist/repertoire/bw-installer.js +180 -0
  233. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  234. package/dist/repertoire/coding/context-pack.js +330 -0
  235. package/dist/repertoire/coding/feedback.js +197 -30
  236. package/dist/repertoire/coding/manager.js +158 -9
  237. package/dist/repertoire/coding/spawner.js +55 -9
  238. package/dist/repertoire/coding/tools.js +170 -7
  239. package/dist/repertoire/commerce-errors.js +109 -0
  240. package/dist/repertoire/commerce-self-test.js +156 -0
  241. package/dist/repertoire/credential-access.js +111 -0
  242. package/dist/repertoire/duffel-client.js +185 -0
  243. package/dist/repertoire/github-client.js +14 -55
  244. package/dist/repertoire/graph-client.js +11 -52
  245. package/dist/repertoire/guardrails.js +396 -0
  246. package/dist/repertoire/mcp-client.js +255 -0
  247. package/dist/repertoire/mcp-manager.js +305 -0
  248. package/dist/repertoire/mcp-tools.js +63 -0
  249. package/dist/repertoire/shell-sessions.js +133 -0
  250. package/dist/repertoire/skills.js +15 -24
  251. package/dist/repertoire/stripe-client.js +131 -0
  252. package/dist/repertoire/tasks/board.js +31 -5
  253. package/dist/repertoire/tasks/fix.js +182 -0
  254. package/dist/repertoire/tasks/index.js +16 -4
  255. package/dist/repertoire/tasks/lifecycle.js +2 -2
  256. package/dist/repertoire/tasks/parser.js +3 -2
  257. package/dist/repertoire/tasks/scanner.js +194 -37
  258. package/dist/repertoire/tasks/transitions.js +16 -78
  259. package/dist/repertoire/tool-results.js +29 -0
  260. package/dist/repertoire/tools-attachments.js +317 -0
  261. package/dist/repertoire/tools-base.js +46 -955
  262. package/dist/repertoire/tools-bluebubbles.js +1 -0
  263. package/dist/repertoire/tools-bridge.js +141 -0
  264. package/dist/repertoire/tools-bundle.js +984 -0
  265. package/dist/repertoire/tools-config.js +185 -0
  266. package/dist/repertoire/tools-continuity.js +248 -0
  267. package/dist/repertoire/tools-credential.js +381 -0
  268. package/dist/repertoire/tools-files.js +342 -0
  269. package/dist/repertoire/tools-flight.js +224 -0
  270. package/dist/repertoire/tools-flow.js +105 -0
  271. package/dist/repertoire/tools-github.js +1 -7
  272. package/dist/repertoire/tools-mail.js +1477 -0
  273. package/dist/repertoire/tools-notes.js +376 -0
  274. package/dist/repertoire/tools-session.js +749 -0
  275. package/dist/repertoire/tools-shell.js +120 -0
  276. package/dist/repertoire/tools-stripe.js +180 -0
  277. package/dist/repertoire/tools-surface.js +243 -0
  278. package/dist/repertoire/tools-teams.js +9 -39
  279. package/dist/repertoire/tools-travel.js +125 -0
  280. package/dist/repertoire/tools-trip.js +422 -0
  281. package/dist/repertoire/tools-user-profile.js +144 -0
  282. package/dist/repertoire/tools-vault.js +40 -0
  283. package/dist/repertoire/tools.js +107 -100
  284. package/dist/repertoire/travel-api-client.js +360 -0
  285. package/dist/repertoire/user-profile.js +131 -0
  286. package/dist/repertoire/vault-setup.js +246 -0
  287. package/dist/repertoire/vault-unlock.js +561 -0
  288. package/dist/scripts/claude-code-hook.js +41 -0
  289. package/dist/scripts/claude-code-stop-hook.js +47 -0
  290. package/dist/senses/attention-queue.js +116 -0
  291. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  292. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  293. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  294. package/dist/senses/bluebubbles/entry.js +73 -0
  295. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  296. package/dist/senses/bluebubbles/index.js +1881 -0
  297. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  298. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  299. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  300. package/dist/senses/bluebubbles/processed-log.js +111 -0
  301. package/dist/senses/bluebubbles/replay.js +129 -0
  302. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  303. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  304. package/dist/senses/cli/bracketed-paste.js +82 -0
  305. package/dist/senses/cli/image-paste.js +287 -0
  306. package/dist/senses/cli/image-ref-navigation.js +75 -0
  307. package/dist/senses/cli/ink-app.js +156 -0
  308. package/dist/senses/cli/inline-diff.js +64 -0
  309. package/dist/senses/cli/input-keys.js +174 -0
  310. package/dist/senses/cli/kill-ring.js +86 -0
  311. package/dist/senses/cli/message-list.js +51 -0
  312. package/dist/senses/cli/ouro-tui.js +605 -0
  313. package/dist/senses/cli/spinner-imperative.js +135 -0
  314. package/dist/senses/cli/spinner.js +101 -0
  315. package/dist/senses/cli/status-line.js +60 -0
  316. package/dist/senses/cli/streaming-markdown.js +526 -0
  317. package/dist/senses/cli/tool-display.js +83 -0
  318. package/dist/senses/cli/tool-render.js +85 -0
  319. package/dist/senses/cli/tui-store.js +240 -0
  320. package/dist/senses/cli/virtual-list.js +35 -0
  321. package/dist/senses/cli-entry.js +60 -8
  322. package/dist/senses/cli-layout.js +187 -0
  323. package/dist/senses/cli.js +511 -209
  324. package/dist/senses/commands.js +66 -3
  325. package/dist/senses/habit-turn-message.js +108 -0
  326. package/dist/senses/inner-dialog-worker.js +175 -21
  327. package/dist/senses/inner-dialog.js +330 -27
  328. package/dist/senses/mail-entry.js +66 -0
  329. package/dist/senses/mail.js +379 -0
  330. package/dist/senses/pipeline.js +573 -164
  331. package/dist/senses/proactive-content-guard.js +51 -0
  332. package/dist/senses/shared-turn.js +248 -0
  333. package/dist/senses/surface-tool.js +68 -0
  334. package/dist/senses/teams-entry.js +60 -8
  335. package/dist/senses/teams.js +405 -170
  336. package/dist/senses/trust-gate.js +100 -5
  337. package/dist/trips/core.js +138 -0
  338. package/dist/trips/store.js +146 -0
  339. package/package.json +37 -7
  340. package/skills/agent-commerce.md +106 -0
  341. package/skills/browser-navigation.md +117 -0
  342. package/skills/commerce-setup-guide.md +116 -0
  343. package/skills/commerce-setup.md +84 -0
  344. package/skills/configure-dev-tools.md +101 -0
  345. package/skills/travel-planning.md +138 -0
  346. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  347. package/dist/heart/daemon/subagent-installer.js +0 -166
  348. package/dist/heart/session-recall.js +0 -116
  349. package/dist/mind/associative-recall.js +0 -209
  350. package/dist/senses/bluebubbles-entry.js +0 -13
  351. package/dist/senses/bluebubbles.js +0 -1142
  352. package/dist/senses/debug-activity.js +0 -148
  353. package/subagents/README.md +0 -86
  354. package/subagents/work-doer.md +0 -237
  355. package/subagents/work-merger.md +0 -618
  356. package/subagents/work-planner.md +0 -390
  357. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  358. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  359. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  360. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  361. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  362. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  363. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  364. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  365. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  366. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  367. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  368. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  369. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  370. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  371. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  372. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,332 @@
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.preTurnPull = preTurnPull;
37
+ exports.postTurnPush = postTurnPush;
38
+ const child_process_1 = require("child_process");
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const runtime_1 = require("../nerves/runtime");
42
+ function writePendingSync(agentRoot, error, classification, conflictFiles) {
43
+ const pendingSyncPath = path.join(agentRoot, "state", "pending-sync.json");
44
+ fs.mkdirSync(path.join(agentRoot, "state"), { recursive: true });
45
+ const record = {
46
+ error,
47
+ failedAt: new Date().toISOString(),
48
+ classification,
49
+ conflictFiles,
50
+ };
51
+ fs.writeFileSync(pendingSyncPath, JSON.stringify(record, null, 2), "utf-8");
52
+ }
53
+ function collectRebaseConflictFiles(agentRoot) {
54
+ try {
55
+ const output = (0, child_process_1.execFileSync)("git", ["status", "--porcelain=v1"], {
56
+ cwd: agentRoot,
57
+ stdio: "pipe",
58
+ timeout: 5000,
59
+ }).toString();
60
+ const files = [];
61
+ for (const line of output.split("\n")) {
62
+ // Unmerged paths in porcelain v1 are prefixed with UU/AA/DD/AU/UA/DU/UD
63
+ if (/^(UU|AA|DD|AU|UA|DU|UD) /.test(line)) {
64
+ files.push(line.slice(3).trim());
65
+ }
66
+ }
67
+ return files;
68
+ }
69
+ catch {
70
+ /* v8 ignore next -- git status --porcelain failure inside a repo would require a corrupt repo @preserve */
71
+ return [];
72
+ }
73
+ }
74
+ /**
75
+ * Check whether the bundle is initialized as a git repo.
76
+ * Used by both pre-turn pull and post-turn push to surface a clear,
77
+ * actionable error when sync is enabled but the user never ran `git init`
78
+ * inside their bundle. This error is propagated all the way into the
79
+ * agent's start-of-turn packet as a Sync warning, so the agent can
80
+ * either ask the user or run `git init` itself.
81
+ */
82
+ function ensureGitRepo(agentRoot) {
83
+ if (fs.existsSync(path.join(agentRoot, ".git"))) {
84
+ return { ok: true };
85
+ }
86
+ const error = `bundle is not a git repo; run \`git init\` inside ${agentRoot} to enable sync (or disable sync in agent.json)`;
87
+ return { ok: false, error };
88
+ }
89
+ /**
90
+ * Pre-turn pull: sync the agent bundle from remote before assembling the start-of-turn packet.
91
+ *
92
+ * If the bundle has no git remote configured, the pull is skipped and the function
93
+ * returns ok — matching the no-remote behavior of postTurnPush. This supports the
94
+ * "local-only sync" mode where the bundle accumulates a commit log without ever
95
+ * pushing or pulling from a remote.
96
+ */
97
+ function preTurnPull(agentRoot, config) {
98
+ (0, runtime_1.emitNervesEvent)({
99
+ component: "heart",
100
+ event: "heart.sync_pull_start",
101
+ message: "pre-turn pull starting",
102
+ meta: { agentRoot, remote: config.remote },
103
+ });
104
+ // Check that the bundle is actually a git repo before touching git at all.
105
+ // Surfaces a clear, actionable error via syncFailure → start-of-turn packet
106
+ // so the agent can propose running `git init` (or just do it).
107
+ const repoCheck = ensureGitRepo(agentRoot);
108
+ if (!repoCheck.ok) {
109
+ (0, runtime_1.emitNervesEvent)({
110
+ level: "warn",
111
+ component: "heart",
112
+ event: "heart.sync_not_a_repo",
113
+ message: "pre-turn pull failed: bundle is not a git repo",
114
+ meta: { agentRoot },
115
+ });
116
+ return repoCheck;
117
+ }
118
+ // Check if any remote is configured. If not, skip the pull (local-only mode).
119
+ try {
120
+ const remoteOutput = (0, child_process_1.execFileSync)("git", ["remote"], {
121
+ cwd: agentRoot,
122
+ stdio: "pipe",
123
+ timeout: 5000,
124
+ }).toString().trim();
125
+ if (remoteOutput.length === 0) {
126
+ (0, runtime_1.emitNervesEvent)({
127
+ component: "heart",
128
+ event: "heart.sync_pull_end",
129
+ message: "pre-turn pull skipped: no remote configured",
130
+ meta: { agentRoot },
131
+ });
132
+ return { ok: true };
133
+ }
134
+ }
135
+ catch (err) {
136
+ const error = err instanceof Error ? err.message : String(err);
137
+ (0, runtime_1.emitNervesEvent)({
138
+ component: "heart",
139
+ event: "heart.sync_pull_error",
140
+ message: "pre-turn pull failed: git remote check failed",
141
+ meta: { agentRoot, error },
142
+ });
143
+ return { ok: false, error };
144
+ }
145
+ try {
146
+ (0, child_process_1.execFileSync)("git", ["pull", config.remote], {
147
+ cwd: agentRoot,
148
+ stdio: "pipe",
149
+ timeout: 30000,
150
+ });
151
+ (0, runtime_1.emitNervesEvent)({
152
+ component: "heart",
153
+ event: "heart.sync_pull_end",
154
+ message: "pre-turn pull complete",
155
+ meta: { agentRoot },
156
+ });
157
+ return { ok: true };
158
+ }
159
+ catch (err) {
160
+ const error = err instanceof Error ? err.message : String(err);
161
+ (0, runtime_1.emitNervesEvent)({
162
+ component: "heart",
163
+ event: "heart.sync_pull_error",
164
+ message: "pre-turn pull failed",
165
+ meta: { agentRoot, error },
166
+ });
167
+ return { ok: false, error };
168
+ }
169
+ }
170
+ /**
171
+ * Post-turn push: discover dirty files via `git status`, commit, and push.
172
+ * Uses git-status-based discovery instead of explicit path tracking, ensuring
173
+ * all file writers are captured regardless of whether they call a tracking API.
174
+ */
175
+ function postTurnPush(agentRoot, config) {
176
+ (0, runtime_1.emitNervesEvent)({
177
+ component: "heart",
178
+ event: "heart.sync_push_start",
179
+ message: "post-turn push starting",
180
+ meta: { agentRoot, remote: config.remote },
181
+ });
182
+ // Same git-repo check as preTurnPull. This is the more common failure path
183
+ // since postTurnPush runs after every turn while preTurnPull only runs on
184
+ // user-initiated turns. Prior to this guard, an un-init'd bundle would fail
185
+ // the git-status invocation below with a generic "not a git repository"
186
+ // error; now we catch it explicitly with an actionable message.
187
+ const repoCheck = ensureGitRepo(agentRoot);
188
+ if (!repoCheck.ok) {
189
+ (0, runtime_1.emitNervesEvent)({
190
+ level: "warn",
191
+ component: "heart",
192
+ event: "heart.sync_not_a_repo",
193
+ message: "post-turn push failed: bundle is not a git repo",
194
+ meta: { agentRoot },
195
+ });
196
+ return repoCheck;
197
+ }
198
+ let statusOutput;
199
+ try {
200
+ statusOutput = (0, child_process_1.execFileSync)("git", ["status", "--porcelain"], {
201
+ cwd: agentRoot,
202
+ stdio: "pipe",
203
+ timeout: 10000,
204
+ }).toString().trim();
205
+ }
206
+ catch (err) {
207
+ const error = err instanceof Error ? err.message : String(err);
208
+ (0, runtime_1.emitNervesEvent)({
209
+ component: "heart",
210
+ event: "heart.sync_push_error",
211
+ message: "post-turn push: git status failed",
212
+ meta: { agentRoot, error },
213
+ });
214
+ return { ok: false, error };
215
+ }
216
+ if (statusOutput.length === 0) {
217
+ (0, runtime_1.emitNervesEvent)({
218
+ component: "heart",
219
+ event: "heart.sync_push_end",
220
+ message: "post-turn push: no changes to sync",
221
+ meta: { agentRoot },
222
+ });
223
+ return { ok: true };
224
+ }
225
+ const changedCount = statusOutput.split("\n").length;
226
+ try {
227
+ (0, child_process_1.execFileSync)("git", ["add", "-A"], {
228
+ cwd: agentRoot,
229
+ stdio: "pipe",
230
+ timeout: 10000,
231
+ });
232
+ (0, child_process_1.execFileSync)("git", ["commit", "-m", "sync: post-turn update"], {
233
+ cwd: agentRoot,
234
+ stdio: "pipe",
235
+ timeout: 10000,
236
+ });
237
+ // Check if a remote exists
238
+ const remoteOutput = (0, child_process_1.execFileSync)("git", ["remote"], {
239
+ cwd: agentRoot,
240
+ stdio: "pipe",
241
+ timeout: 5000,
242
+ }).toString().trim();
243
+ if (remoteOutput.length === 0) {
244
+ (0, runtime_1.emitNervesEvent)({
245
+ component: "heart",
246
+ event: "heart.sync_push_end",
247
+ message: "post-turn push: committed locally, no remote configured",
248
+ meta: { agentRoot, changedCount },
249
+ });
250
+ return { ok: true };
251
+ }
252
+ try {
253
+ (0, child_process_1.execFileSync)("git", ["push", config.remote], {
254
+ cwd: agentRoot,
255
+ stdio: "pipe",
256
+ timeout: 30000,
257
+ });
258
+ }
259
+ catch {
260
+ // Push rejected -- try pull-rebase-push
261
+ let rebaseError = null;
262
+ try {
263
+ (0, child_process_1.execFileSync)("git", ["pull", "--rebase", config.remote], {
264
+ cwd: agentRoot,
265
+ stdio: "pipe",
266
+ timeout: 30000,
267
+ });
268
+ }
269
+ catch (err) {
270
+ rebaseError = err instanceof Error ? err.message : String(err);
271
+ }
272
+ if (rebaseError === null) {
273
+ try {
274
+ (0, child_process_1.execFileSync)("git", ["push", config.remote], {
275
+ cwd: agentRoot,
276
+ stdio: "pipe",
277
+ timeout: 30000,
278
+ });
279
+ // rebase + retry push both succeeded — fall through to success
280
+ (0, runtime_1.emitNervesEvent)({
281
+ component: "heart",
282
+ event: "heart.sync_push_end",
283
+ message: "post-turn push complete after rebase retry",
284
+ meta: { agentRoot, changedCount },
285
+ });
286
+ return { ok: true };
287
+ }
288
+ catch (retryErr) {
289
+ // Second push rejected — remote advanced again during rebase
290
+ const retryError = retryErr instanceof Error ? retryErr.message : /* v8 ignore next -- defensive non-Error catch @preserve */ String(retryErr);
291
+ writePendingSync(agentRoot, retryError, "push_rejected", []);
292
+ (0, runtime_1.emitNervesEvent)({
293
+ component: "heart",
294
+ event: "heart.sync_push_error",
295
+ message: "post-turn push failed after retry: push_rejected",
296
+ meta: { agentRoot, error: retryError, classification: "push_rejected" },
297
+ });
298
+ return { ok: false, error: retryError };
299
+ }
300
+ }
301
+ // Rebase failed — detect conflict files via git status. Preserve
302
+ // the original rebase error message so callers see the real cause.
303
+ const conflictFiles = collectRebaseConflictFiles(agentRoot);
304
+ const classification = conflictFiles.length > 0 ? "pull_rebase_conflict" : "unknown";
305
+ writePendingSync(agentRoot, rebaseError, classification, conflictFiles);
306
+ (0, runtime_1.emitNervesEvent)({
307
+ component: "heart",
308
+ event: "heart.sync_push_error",
309
+ message: `post-turn push failed: ${classification}`,
310
+ meta: { agentRoot, error: rebaseError, classification, conflictFiles },
311
+ });
312
+ return { ok: false, error: rebaseError };
313
+ }
314
+ (0, runtime_1.emitNervesEvent)({
315
+ component: "heart",
316
+ event: "heart.sync_push_end",
317
+ message: "post-turn push complete",
318
+ meta: { agentRoot, changedCount },
319
+ });
320
+ return { ok: true };
321
+ }
322
+ catch (err) {
323
+ const error = err instanceof Error ? err.message : String(err);
324
+ (0, runtime_1.emitNervesEvent)({
325
+ component: "heart",
326
+ event: "heart.sync_push_error",
327
+ message: "post-turn push failed",
328
+ meta: { agentRoot, error },
329
+ });
330
+ return { ok: false, error };
331
+ }
332
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listTargetSessionCandidates = listTargetSessionCandidates;
4
+ exports.formatTargetSessionCandidates = formatTargetSessionCandidates;
5
+ const session_transcript_1 = require("./session-transcript");
6
+ const session_activity_1 = require("./session-activity");
7
+ const trust_explanation_1 = require("../mind/friends/trust-explanation");
8
+ const runtime_1 = require("../nerves/runtime");
9
+ function synthesizeFriendRecord(candidate) {
10
+ return {
11
+ id: candidate.friendId,
12
+ name: candidate.friendName,
13
+ role: "stranger",
14
+ trustLevel: "stranger",
15
+ connections: [],
16
+ externalIds: [],
17
+ tenantMemberships: [],
18
+ toolPreferences: {},
19
+ notes: {},
20
+ totalTokens: 0,
21
+ createdAt: new Date(0).toISOString(),
22
+ updatedAt: new Date(0).toISOString(),
23
+ schemaVersion: 1,
24
+ };
25
+ }
26
+ function deliveryPriority(mode) {
27
+ if (mode === "deliver_now")
28
+ return 0;
29
+ if (mode === "queue_only")
30
+ return 1;
31
+ return 2;
32
+ }
33
+ function activityPriority(source) {
34
+ return source === "friend-facing" ? 0 : 1;
35
+ }
36
+ function describeDelivery(candidate) {
37
+ if (candidate.channel === "mcp") {
38
+ // MCP can't push (no proactive API), but can queue — dev tool picks up via check_response
39
+ return { mode: "queue_only", reason: "MCP session — message queued for dev tool to pick up via check_response" };
40
+ }
41
+ if (candidate.channel !== "bluebubbles" && candidate.channel !== "teams") {
42
+ return { mode: "blocked", reason: "this channel does not support proactive outward delivery yet" };
43
+ }
44
+ if (candidate.trust.level === "family" || candidate.trust.level === "friend") {
45
+ return { mode: "deliver_now", reason: "directly trusted target on a proactive-delivery channel" };
46
+ }
47
+ return { mode: "queue_only", reason: "visible as a live chat, but immediate delivery still needs explicit cross-chat authorization" };
48
+ }
49
+ async function listTargetSessionCandidates(input) {
50
+ (0, runtime_1.emitNervesEvent)({
51
+ component: "engine",
52
+ event: "engine.target_resolution_start",
53
+ message: "listing live target session candidates",
54
+ meta: {
55
+ sessionsDir: input.sessionsDir,
56
+ currentSession: input.currentSession
57
+ ? `${input.currentSession.friendId}/${input.currentSession.channel}/${input.currentSession.key}`
58
+ : null,
59
+ },
60
+ });
61
+ const activity = (0, session_activity_1.listSessionActivity)({
62
+ sessionsDir: input.sessionsDir,
63
+ friendsDir: input.friendsDir,
64
+ agentName: input.agentName,
65
+ currentSession: input.currentSession ?? null,
66
+ }).filter((entry) => entry.channel !== "inner");
67
+ const candidates = [];
68
+ for (const entry of activity) {
69
+ const friend = await input.friendStore.get(entry.friendId) ?? synthesizeFriendRecord(entry);
70
+ const trust = (0, trust_explanation_1.describeTrustContext)({
71
+ friend,
72
+ channel: entry.channel,
73
+ });
74
+ const sessionTail = await (0, session_transcript_1.summarizeSessionTail)({
75
+ sessionPath: entry.sessionPath,
76
+ friendId: entry.friendId,
77
+ channel: entry.channel,
78
+ key: entry.key,
79
+ messageCount: 6,
80
+ summarize: input.summarize,
81
+ trustLevel: trust.level,
82
+ });
83
+ const snapshot = sessionTail.kind === "ok"
84
+ ? sessionTail.snapshot
85
+ : sessionTail.kind === "empty"
86
+ ? "recent focus: no recent visible messages"
87
+ : "recent focus: session transcript unavailable";
88
+ const delivery = describeDelivery({
89
+ channel: entry.channel,
90
+ trust,
91
+ });
92
+ candidates.push({
93
+ friendId: entry.friendId,
94
+ friendName: entry.friendName,
95
+ channel: entry.channel,
96
+ key: entry.key,
97
+ sessionPath: entry.sessionPath,
98
+ snapshot,
99
+ trust,
100
+ delivery,
101
+ lastActivityAt: entry.lastActivityAt,
102
+ lastActivityMs: entry.lastActivityMs,
103
+ activitySource: entry.activitySource,
104
+ });
105
+ }
106
+ return candidates.sort((a, b) => {
107
+ const deliveryDiff = deliveryPriority(a.delivery.mode) - deliveryPriority(b.delivery.mode);
108
+ if (deliveryDiff !== 0)
109
+ return deliveryDiff;
110
+ const sourceDiff = activityPriority(a.activitySource) - activityPriority(b.activitySource);
111
+ if (sourceDiff !== 0)
112
+ return sourceDiff;
113
+ return b.lastActivityMs - a.lastActivityMs;
114
+ });
115
+ }
116
+ function formatTargetSessionCandidates(candidates) {
117
+ if (candidates.length === 0)
118
+ return "";
119
+ const lines = ["## candidate target chats"];
120
+ for (const candidate of candidates) {
121
+ lines.push(`- ${candidate.friendName} [${candidate.friendId}] via ${candidate.channel}/${candidate.key}`);
122
+ lines.push(` trust: ${candidate.trust.level} (${candidate.trust.basis}) — ${candidate.trust.summary}`);
123
+ lines.push(` delivery: ${candidate.delivery.mode} — ${candidate.delivery.reason}`);
124
+ lines.push(` snapshot: ${candidate.snapshot}`);
125
+ }
126
+ return lines.join("\n");
127
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TEMPO_BUDGETS = void 0;
4
+ exports.deriveTempo = deriveTempo;
5
+ exports.getTokenBudget = getTokenBudget;
6
+ exports.detectTempoShift = detectTempoShift;
7
+ const runtime_1 = require("../nerves/runtime");
8
+ exports.TEMPO_BUDGETS = {
9
+ brief: { min: 150, max: 250 },
10
+ standard: { min: 450, max: 700 },
11
+ dense: { min: 900, max: 1100 },
12
+ crisis: { min: 700, max: 1000 },
13
+ };
14
+ const FIVE_MINUTES_MS = 5 * 60 * 1000;
15
+ const TWO_HOURS_MS = 2 * 60 * 60 * 1000;
16
+ function deriveMode(inputs) {
17
+ if (inputs.hasBlockers)
18
+ return "crisis";
19
+ if (inputs.openObligations > 3 || inputs.recentEpisodeCount > 10)
20
+ return "dense";
21
+ if (inputs.activeSessions > 0)
22
+ return "standard";
23
+ return "brief";
24
+ }
25
+ function deriveSignificance(inputs) {
26
+ if (inputs.highSalienceEpisodes > 0 || inputs.atRiskCareCount > 0)
27
+ return "high";
28
+ if (inputs.activeCareCount > 0)
29
+ return "medium";
30
+ return "low";
31
+ }
32
+ function deriveReentryDepth(inputs) {
33
+ if (inputs.lastActivityAgeMs < FIVE_MINUTES_MS)
34
+ return "warm";
35
+ if (inputs.lastActivityAgeMs < TWO_HOURS_MS)
36
+ return "cooled";
37
+ return "cold";
38
+ }
39
+ function computeEffectiveBudget(mode, significance, reentryDepth) {
40
+ const base = exports.TEMPO_BUDGETS[mode];
41
+ // Crisis always uses crisis budget regardless
42
+ if (mode === "crisis")
43
+ return { ...base };
44
+ const range = base.max - base.min;
45
+ // Start at the mode minimum
46
+ let effectiveMin = base.min;
47
+ // Significance pushes up within range
48
+ if (significance === "high") {
49
+ effectiveMin += Math.round(range * 0.5);
50
+ }
51
+ else if (significance === "medium") {
52
+ effectiveMin += Math.round(range * 0.25);
53
+ }
54
+ // Cold re-entry pushes up (need more context to re-orient)
55
+ if (reentryDepth === "cold") {
56
+ effectiveMin += Math.round(range * 0.3);
57
+ }
58
+ else if (reentryDepth === "cooled") {
59
+ effectiveMin += Math.round(range * 0.1);
60
+ }
61
+ // Clamp within mode range
62
+ effectiveMin = Math.min(effectiveMin, base.max);
63
+ return { min: effectiveMin, max: base.max };
64
+ }
65
+ function deriveTempo(inputs) {
66
+ const mode = deriveMode(inputs);
67
+ const significance = deriveSignificance(inputs);
68
+ const reentryDepth = deriveReentryDepth(inputs);
69
+ const effectiveBudget = computeEffectiveBudget(mode, significance, reentryDepth);
70
+ (0, runtime_1.emitNervesEvent)({
71
+ component: "heart",
72
+ event: "heart.tempo_derived",
73
+ message: `tempo derived: ${mode}/${significance}/${reentryDepth}`,
74
+ meta: {
75
+ mode,
76
+ significance,
77
+ reentryDepth,
78
+ effectiveMin: effectiveBudget.min,
79
+ effectiveMax: effectiveBudget.max,
80
+ },
81
+ });
82
+ return { mode, significance, reentryDepth, effectiveBudget };
83
+ }
84
+ function getTokenBudget(state) {
85
+ return state.effectiveBudget;
86
+ }
87
+ function detectTempoShift(previous, current) {
88
+ if (!previous)
89
+ return true;
90
+ return (previous.mode !== current.mode
91
+ || previous.significance !== current.significance
92
+ || previous.reentryDepth !== current.reentryDepth);
93
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildTemporalView = buildTemporalView;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ const episodes_1 = require("../arc/episodes");
6
+ const obligations_1 = require("../arc/obligations");
7
+ const cares_1 = require("../arc/cares");
8
+ const intentions_1 = require("../arc/intentions");
9
+ const presence_1 = require("../arc/presence");
10
+ function buildTemporalView(agentRoot, options) {
11
+ const episodeLimit = options?.episodeLimit ?? 20;
12
+ const tempo = options?.tempo ?? "brief";
13
+ const recentEpisodes = options?.preloaded?.recentEpisodes ?? (0, episodes_1.readRecentEpisodes)(agentRoot, { limit: episodeLimit });
14
+ const activeObligations = options?.preloaded?.activeObligations ?? (0, obligations_1.readPendingObligations)(agentRoot);
15
+ const activeCares = options?.preloaded?.activeCares ?? (0, cares_1.readActiveCares)(agentRoot);
16
+ const openIntentions = (0, intentions_1.readOpenIntentions)(agentRoot);
17
+ const peerPresence = (0, presence_1.readPeerPresence)(agentRoot);
18
+ const view = {
19
+ recentEpisodes,
20
+ activeObligations,
21
+ activeCares,
22
+ openIntentions,
23
+ peerPresence,
24
+ tempo,
25
+ assembledAt: new Date().toISOString(),
26
+ };
27
+ (0, runtime_1.emitNervesEvent)({
28
+ component: "heart",
29
+ event: "heart.temporal_view_assembled",
30
+ message: `temporal view assembled: ${recentEpisodes.length} episodes, ${activeObligations.length} obligations, ${activeCares.length} cares, ${openIntentions.length} intentions`,
31
+ meta: {
32
+ episodeCount: recentEpisodes.length,
33
+ obligationCount: activeObligations.length,
34
+ careCount: activeCares.length,
35
+ intentionCount: openIntentions.length,
36
+ peerCount: peerPresence.length,
37
+ tempo,
38
+ },
39
+ });
40
+ return view;
41
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToolActivityCallbacks = createToolActivityCallbacks;
4
+ const tool_description_1 = require("./tool-description");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ function createToolActivityCallbacks(options) {
7
+ (0, runtime_1.emitNervesEvent)({
8
+ component: "engine",
9
+ event: "engine.tool_activity_callbacks_created",
10
+ message: "tool activity callbacks initialized",
11
+ meta: {},
12
+ });
13
+ // Track the last description so we can reference it in END messages
14
+ let lastDescription = null;
15
+ return {
16
+ onToolStart(name, args) {
17
+ const description = (0, tool_description_1.humanReadableToolDescription)(name, args);
18
+ if (description === null)
19
+ return; // hidden tool (settle, rest, descend)
20
+ lastDescription = description;
21
+ options.onDescription(description);
22
+ },
23
+ onToolEnd(name, summary, success) {
24
+ const desc = lastDescription ?? name;
25
+ // Strip trailing "..." from description for the result line
26
+ const cleanDesc = desc.endsWith("...") ? desc.slice(0, -3) : desc;
27
+ if (!success) {
28
+ options.onFailure(`\u2717 ${cleanDesc} — ${summary}`);
29
+ return;
30
+ }
31
+ if (options.isDebug()) {
32
+ options.onResult(`\u2713 ${cleanDesc}`);
33
+ }
34
+ },
35
+ };
36
+ }