@ouro.bot/cli 0.1.0-alpha.49 → 0.1.0-alpha.491

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 (365) 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 +3126 -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 +989 -0
  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/bridges/manager.js +37 -0
  30. package/dist/heart/bridges/state-machine.js +20 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +119 -129
  35. package/dist/heart/core.js +845 -229
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +490 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +216 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +640 -0
  44. package/dist/heart/daemon/cli-exec.js +7239 -0
  45. package/dist/heart/daemon/cli-help.js +493 -0
  46. package/dist/heart/daemon/cli-parse.js +1533 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +561 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/connect-bay.js +323 -0
  51. package/dist/heart/daemon/daemon-cli.js +29 -1616
  52. package/dist/heart/daemon/daemon-entry.js +345 -3
  53. package/dist/heart/daemon/daemon-health.js +141 -0
  54. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  55. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  56. package/dist/heart/daemon/daemon.js +677 -58
  57. package/dist/heart/daemon/dns-workflow.js +394 -0
  58. package/dist/heart/daemon/doctor-types.js +8 -0
  59. package/dist/heart/daemon/doctor.js +486 -0
  60. package/dist/heart/daemon/health-monitor.js +92 -1
  61. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  62. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  63. package/dist/heart/daemon/http-health-probe.js +80 -0
  64. package/dist/heart/daemon/human-command-screens.js +234 -0
  65. package/dist/heart/daemon/human-readiness.js +114 -0
  66. package/dist/heart/daemon/inner-status.js +89 -0
  67. package/dist/heart/daemon/interactive-repair.js +394 -0
  68. package/dist/heart/daemon/launchd.js +25 -5
  69. package/dist/heart/daemon/log-tailer.js +82 -12
  70. package/dist/heart/daemon/logs-prune.js +110 -0
  71. package/dist/heart/daemon/message-router.js +2 -2
  72. package/dist/heart/daemon/os-cron-deps.js +134 -0
  73. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  74. package/dist/heart/daemon/ouro-entry.js +3 -1
  75. package/dist/heart/daemon/process-manager.js +214 -0
  76. package/dist/heart/daemon/provider-discovery.js +137 -0
  77. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  78. package/dist/heart/daemon/pulse.js +475 -0
  79. package/dist/heart/daemon/readiness-repair.js +365 -0
  80. package/dist/heart/daemon/run-hooks.js +2 -0
  81. package/dist/heart/daemon/runtime-logging.js +67 -16
  82. package/dist/heart/daemon/runtime-metadata.js +73 -0
  83. package/dist/heart/daemon/runtime-mode.js +67 -0
  84. package/dist/heart/daemon/safe-mode.js +161 -0
  85. package/dist/heart/daemon/sense-manager.js +178 -37
  86. package/dist/heart/daemon/session-id-resolver.js +131 -0
  87. package/dist/heart/daemon/skill-management-installer.js +94 -0
  88. package/dist/heart/daemon/socket-client.js +109 -4
  89. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  90. package/dist/heart/daemon/startup-tui.js +264 -0
  91. package/dist/heart/daemon/task-scheduler.js +3 -25
  92. package/dist/heart/daemon/terminal-ui.js +499 -0
  93. package/dist/heart/daemon/thoughts.js +162 -17
  94. package/dist/heart/daemon/up-progress.js +366 -0
  95. package/dist/heart/daemon/vault-items.js +56 -0
  96. package/dist/heart/delegation.js +62 -0
  97. package/dist/heart/habits/habit-migration.js +189 -0
  98. package/dist/heart/habits/habit-parser.js +140 -0
  99. package/dist/heart/habits/habit-runtime-state.js +100 -0
  100. package/dist/heart/habits/habit-scheduler.js +372 -0
  101. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  102. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  103. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  104. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  105. package/dist/heart/identity.js +201 -66
  106. package/dist/heart/kept-notes.js +357 -0
  107. package/dist/heart/kicks.js +1 -1
  108. package/dist/heart/machine-identity.js +161 -0
  109. package/dist/heart/mail-import-discovery.js +353 -0
  110. package/dist/heart/mcp/mcp-server.js +653 -0
  111. package/dist/heart/migrate-config.js +100 -0
  112. package/dist/heart/model-capabilities.js +59 -0
  113. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  114. package/dist/heart/outlook/outlook-http-response.js +7 -0
  115. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  116. package/dist/heart/outlook/outlook-http-static.js +103 -0
  117. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  118. package/dist/heart/outlook/outlook-http.js +99 -0
  119. package/dist/heart/outlook/outlook-read.js +31 -0
  120. package/dist/heart/outlook/outlook-types.js +27 -0
  121. package/dist/heart/outlook/outlook-view.js +195 -0
  122. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  123. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  124. package/dist/heart/outlook/readers/mail.js +362 -0
  125. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  126. package/dist/heart/outlook/readers/sessions.js +232 -0
  127. package/dist/heart/outlook/readers/shared.js +111 -0
  128. package/dist/heart/platform.js +81 -0
  129. package/dist/heart/progress-story.js +42 -0
  130. package/dist/heart/provider-attempt.js +134 -0
  131. package/dist/heart/provider-binding-resolver.js +255 -0
  132. package/dist/heart/provider-credentials.js +424 -0
  133. package/dist/heart/provider-failover.js +301 -0
  134. package/dist/heart/provider-models.js +81 -0
  135. package/dist/heart/provider-ping.js +262 -0
  136. package/dist/heart/provider-state.js +216 -0
  137. package/dist/heart/provider-visibility.js +188 -0
  138. package/dist/heart/providers/anthropic-token.js +131 -0
  139. package/dist/heart/providers/anthropic.js +193 -55
  140. package/dist/heart/providers/azure.js +104 -13
  141. package/dist/heart/providers/error-classification.js +63 -0
  142. package/dist/heart/providers/github-copilot.js +145 -0
  143. package/dist/heart/providers/minimax-vlm.js +189 -0
  144. package/dist/heart/providers/minimax.js +29 -7
  145. package/dist/heart/providers/openai-codex.js +63 -39
  146. package/dist/heart/runtime-capability-check.js +170 -0
  147. package/dist/heart/runtime-credentials.js +260 -0
  148. package/dist/heart/sense-truth.js +11 -4
  149. package/dist/heart/session-activity.js +190 -0
  150. package/dist/heart/session-events.js +981 -0
  151. package/dist/heart/session-transcript.js +167 -0
  152. package/dist/heart/start-of-turn-packet.js +345 -0
  153. package/dist/heart/streaming.js +48 -28
  154. package/dist/heart/sync.js +332 -0
  155. package/dist/heart/target-resolution.js +127 -0
  156. package/dist/heart/tempo.js +93 -0
  157. package/dist/heart/temporal-view.js +41 -0
  158. package/dist/heart/tool-activity-callbacks.js +36 -0
  159. package/dist/heart/tool-description.js +135 -0
  160. package/dist/heart/tool-friction.js +55 -0
  161. package/dist/heart/tool-loop.js +200 -0
  162. package/dist/heart/turn-context.js +372 -0
  163. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  164. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  165. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  166. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  167. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  168. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  169. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  170. package/dist/mailroom/attention.js +167 -0
  171. package/dist/mailroom/autonomy.js +209 -0
  172. package/dist/mailroom/blob-store.js +600 -0
  173. package/dist/mailroom/core.js +658 -0
  174. package/dist/mailroom/entry.js +160 -0
  175. package/dist/mailroom/file-store.js +426 -0
  176. package/dist/mailroom/mbox-import.js +382 -0
  177. package/dist/mailroom/outbound.js +380 -0
  178. package/dist/mailroom/policy.js +263 -0
  179. package/dist/mailroom/reader.js +219 -0
  180. package/dist/mailroom/search-cache.js +182 -0
  181. package/dist/mailroom/search-relevance.js +319 -0
  182. package/dist/mailroom/smtp-ingress.js +176 -0
  183. package/dist/mailroom/source-state.js +176 -0
  184. package/dist/mailroom/travel-extract.js +89 -0
  185. package/dist/mind/bundle-manifest.js +7 -1
  186. package/dist/mind/context.js +164 -93
  187. package/dist/mind/diary-integrity.js +60 -0
  188. package/dist/mind/{memory.js → diary.js} +74 -93
  189. package/dist/mind/embedding-provider.js +60 -0
  190. package/dist/mind/file-state.js +179 -0
  191. package/dist/mind/friends/channel.js +30 -0
  192. package/dist/mind/friends/group-context.js +144 -0
  193. package/dist/mind/friends/resolver.js +54 -2
  194. package/dist/mind/friends/store-file.js +39 -3
  195. package/dist/mind/friends/trust-explanation.js +74 -0
  196. package/dist/mind/friends/types.js +2 -2
  197. package/dist/mind/journal-index.js +161 -0
  198. package/dist/mind/note-search.js +268 -0
  199. package/dist/mind/obligation-steering.js +221 -0
  200. package/dist/mind/pending.js +56 -8
  201. package/dist/mind/prompt-refresh.js +3 -2
  202. package/dist/mind/prompt.js +973 -168
  203. package/dist/mind/provenance-trust.js +26 -0
  204. package/dist/mind/scrutiny.js +173 -0
  205. package/dist/nerves/cli-logging.js +7 -1
  206. package/dist/nerves/coverage/audit-rules.js +15 -6
  207. package/dist/nerves/coverage/audit.js +28 -2
  208. package/dist/nerves/coverage/cli.js +1 -1
  209. package/dist/nerves/coverage/contract.js +5 -5
  210. package/dist/nerves/coverage/file-completeness.js +93 -5
  211. package/dist/nerves/coverage/run-artifacts.js +1 -1
  212. package/dist/nerves/event-buffer.js +111 -0
  213. package/dist/nerves/index.js +224 -4
  214. package/dist/nerves/observation.js +20 -0
  215. package/dist/nerves/redact.js +79 -0
  216. package/dist/nerves/runtime.js +5 -1
  217. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  218. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  219. package/dist/outlook-ui/index.html +15 -0
  220. package/dist/repertoire/ado-client.js +15 -56
  221. package/dist/repertoire/ado-semantic.js +11 -10
  222. package/dist/repertoire/api-client.js +97 -0
  223. package/dist/repertoire/bitwarden-store.js +774 -0
  224. package/dist/repertoire/bundle-templates.js +72 -0
  225. package/dist/repertoire/bw-installer.js +180 -0
  226. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  227. package/dist/repertoire/coding/context-pack.js +330 -0
  228. package/dist/repertoire/coding/feedback.js +197 -30
  229. package/dist/repertoire/coding/manager.js +158 -9
  230. package/dist/repertoire/coding/spawner.js +55 -9
  231. package/dist/repertoire/coding/tools.js +170 -7
  232. package/dist/repertoire/commerce-errors.js +109 -0
  233. package/dist/repertoire/commerce-self-test.js +156 -0
  234. package/dist/repertoire/credential-access.js +111 -0
  235. package/dist/repertoire/duffel-client.js +185 -0
  236. package/dist/repertoire/github-client.js +14 -55
  237. package/dist/repertoire/graph-client.js +11 -52
  238. package/dist/repertoire/guardrails.js +396 -0
  239. package/dist/repertoire/mcp-client.js +255 -0
  240. package/dist/repertoire/mcp-manager.js +305 -0
  241. package/dist/repertoire/mcp-tools.js +63 -0
  242. package/dist/repertoire/shell-sessions.js +133 -0
  243. package/dist/repertoire/skills.js +15 -24
  244. package/dist/repertoire/stripe-client.js +131 -0
  245. package/dist/repertoire/tasks/board.js +31 -5
  246. package/dist/repertoire/tasks/fix.js +182 -0
  247. package/dist/repertoire/tasks/index.js +16 -4
  248. package/dist/repertoire/tasks/lifecycle.js +2 -2
  249. package/dist/repertoire/tasks/parser.js +3 -2
  250. package/dist/repertoire/tasks/scanner.js +194 -37
  251. package/dist/repertoire/tasks/transitions.js +16 -78
  252. package/dist/repertoire/tool-results.js +29 -0
  253. package/dist/repertoire/tools-attachments.js +317 -0
  254. package/dist/repertoire/tools-base.js +46 -842
  255. package/dist/repertoire/tools-bluebubbles.js +1 -0
  256. package/dist/repertoire/tools-bridge.js +141 -0
  257. package/dist/repertoire/tools-bundle.js +984 -0
  258. package/dist/repertoire/tools-config.js +185 -0
  259. package/dist/repertoire/tools-continuity.js +248 -0
  260. package/dist/repertoire/tools-credential.js +381 -0
  261. package/dist/repertoire/tools-files.js +342 -0
  262. package/dist/repertoire/tools-flight.js +224 -0
  263. package/dist/repertoire/tools-flow.js +105 -0
  264. package/dist/repertoire/tools-github.js +1 -7
  265. package/dist/repertoire/tools-mail.js +1281 -0
  266. package/dist/repertoire/tools-notes.js +376 -0
  267. package/dist/repertoire/tools-session.js +749 -0
  268. package/dist/repertoire/tools-shell.js +120 -0
  269. package/dist/repertoire/tools-stripe.js +180 -0
  270. package/dist/repertoire/tools-surface.js +243 -0
  271. package/dist/repertoire/tools-teams.js +9 -39
  272. package/dist/repertoire/tools-travel.js +125 -0
  273. package/dist/repertoire/tools-trip.js +356 -0
  274. package/dist/repertoire/tools-user-profile.js +144 -0
  275. package/dist/repertoire/tools-vault.js +40 -0
  276. package/dist/repertoire/tools.js +144 -115
  277. package/dist/repertoire/travel-api-client.js +360 -0
  278. package/dist/repertoire/user-profile.js +131 -0
  279. package/dist/repertoire/vault-setup.js +246 -0
  280. package/dist/repertoire/vault-unlock.js +561 -0
  281. package/dist/scripts/claude-code-hook.js +41 -0
  282. package/dist/scripts/claude-code-stop-hook.js +47 -0
  283. package/dist/senses/attention-queue.js +116 -0
  284. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  285. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  286. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  287. package/dist/senses/bluebubbles/entry.js +73 -0
  288. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  289. package/dist/senses/bluebubbles/index.js +1835 -0
  290. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  291. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  292. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  293. package/dist/senses/bluebubbles/processed-log.js +111 -0
  294. package/dist/senses/bluebubbles/replay.js +129 -0
  295. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  296. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  297. package/dist/senses/cli/bracketed-paste.js +82 -0
  298. package/dist/senses/cli/image-paste.js +287 -0
  299. package/dist/senses/cli/image-ref-navigation.js +75 -0
  300. package/dist/senses/cli/ink-app.js +156 -0
  301. package/dist/senses/cli/inline-diff.js +64 -0
  302. package/dist/senses/cli/input-keys.js +174 -0
  303. package/dist/senses/cli/kill-ring.js +86 -0
  304. package/dist/senses/cli/message-list.js +51 -0
  305. package/dist/senses/cli/ouro-tui.js +605 -0
  306. package/dist/senses/cli/spinner-imperative.js +135 -0
  307. package/dist/senses/cli/spinner.js +101 -0
  308. package/dist/senses/cli/status-line.js +60 -0
  309. package/dist/senses/cli/streaming-markdown.js +526 -0
  310. package/dist/senses/cli/tool-display.js +83 -0
  311. package/dist/senses/cli/tool-render.js +85 -0
  312. package/dist/senses/cli/tui-store.js +240 -0
  313. package/dist/senses/cli/virtual-list.js +35 -0
  314. package/dist/senses/cli-entry.js +60 -8
  315. package/dist/senses/cli-layout.js +187 -0
  316. package/dist/senses/cli.js +515 -211
  317. package/dist/senses/commands.js +66 -3
  318. package/dist/senses/habit-turn-message.js +108 -0
  319. package/dist/senses/inner-dialog-worker.js +110 -20
  320. package/dist/senses/inner-dialog.js +408 -21
  321. package/dist/senses/mail-entry.js +66 -0
  322. package/dist/senses/mail.js +379 -0
  323. package/dist/senses/pipeline.js +588 -81
  324. package/dist/senses/proactive-content-guard.js +51 -0
  325. package/dist/senses/shared-turn.js +248 -0
  326. package/dist/senses/surface-tool.js +68 -0
  327. package/dist/senses/teams-entry.js +60 -8
  328. package/dist/senses/teams.js +412 -163
  329. package/dist/senses/trust-gate.js +100 -5
  330. package/dist/trips/core.js +138 -0
  331. package/dist/trips/store.js +146 -0
  332. package/package.json +37 -7
  333. package/skills/agent-commerce.md +106 -0
  334. package/skills/browser-navigation.md +117 -0
  335. package/skills/commerce-setup-guide.md +116 -0
  336. package/skills/commerce-setup.md +84 -0
  337. package/skills/configure-dev-tools.md +101 -0
  338. package/skills/travel-planning.md +138 -0
  339. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  340. package/dist/heart/daemon/subagent-installer.js +0 -166
  341. package/dist/heart/session-recall.js +0 -116
  342. package/dist/mind/associative-recall.js +0 -209
  343. package/dist/senses/bluebubbles-entry.js +0 -13
  344. package/dist/senses/bluebubbles.js +0 -1032
  345. package/dist/senses/debug-activity.js +0 -127
  346. package/subagents/README.md +0 -86
  347. package/subagents/work-doer.md +0 -237
  348. package/subagents/work-merger.md +0 -618
  349. package/subagents/work-planner.md +0 -390
  350. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  351. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  352. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  353. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  354. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  355. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  356. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  357. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  358. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  359. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  360. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  361. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  362. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  363. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  364. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  365. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createCommandRegistry = createCommandRegistry;
4
4
  exports.getToolChoiceRequired = getToolChoiceRequired;
5
5
  exports.resetToolChoiceRequired = resetToolChoiceRequired;
6
+ exports.getDebugMode = getDebugMode;
7
+ exports.resetDebugMode = resetDebugMode;
6
8
  exports.registerDefaultCommands = registerDefaultCommands;
9
+ exports.getSharedCommandRegistry = getSharedCommandRegistry;
10
+ exports.resetSharedCommandRegistry = resetSharedCommandRegistry;
7
11
  exports.parseSlashCommand = parseSlashCommand;
8
12
  const identity_1 = require("../heart/identity");
9
13
  const runtime_1 = require("../nerves/runtime");
@@ -21,7 +25,7 @@ function createCommandRegistry() {
21
25
  },
22
26
  dispatch(name, ctx) {
23
27
  const cmd = commands.get(name);
24
- if (!cmd)
28
+ if (!cmd || !cmd.channels.includes(ctx.channel))
25
29
  return { handled: false };
26
30
  return { handled: true, result: cmd.handler(ctx) };
27
31
  },
@@ -35,6 +39,14 @@ function getToolChoiceRequired() {
35
39
  function resetToolChoiceRequired() {
36
40
  _toolChoiceRequired = false;
37
41
  }
42
+ // Module-level toggle for debug mode
43
+ let _debugMode = false;
44
+ function getDebugMode() {
45
+ return _debugMode;
46
+ }
47
+ function resetDebugMode() {
48
+ _debugMode = false;
49
+ }
38
50
  function registerDefaultCommands(registry) {
39
51
  (0, runtime_1.emitNervesEvent)({
40
52
  event: "repertoire.load_start",
@@ -51,7 +63,7 @@ function registerDefaultCommands(registry) {
51
63
  registry.register({
52
64
  name: "new",
53
65
  description: "start a new conversation",
54
- channels: ["cli", "teams"],
66
+ channels: ["teams"],
55
67
  handler: () => ({ action: "new" }),
56
68
  });
57
69
  registry.register({
@@ -60,10 +72,36 @@ function registerDefaultCommands(registry) {
60
72
  channels: ["cli", "teams"],
61
73
  handler: (ctx) => {
62
74
  const cmds = registry.list(ctx.channel);
63
- const lines = cmds.map((c) => `/${c.name} - ${c.description}`);
75
+ const lines = cmds.map((c) => `/${c.name} \u2014 ${c.description}`);
64
76
  return { action: "response", message: lines.join("\n") };
65
77
  },
66
78
  });
79
+ registry.register({
80
+ name: "help",
81
+ description: "show keyboard shortcuts and tips",
82
+ channels: ["cli"],
83
+ /* v8 ignore start -- integration: /help command tested via E2E @preserve */
84
+ handler: () => ({
85
+ action: "response",
86
+ message: [
87
+ "Keyboard shortcuts:",
88
+ " Ctrl-C abort current generation / clear input / exit (twice within 2s)",
89
+ " Escape clear input",
90
+ " ↑ / ↓ browse input history (includes previous sessions)",
91
+ " Option+← / → jump between words",
92
+ " Ctrl+A / E jump to start / end of line",
93
+ " Option+Delete delete word backward",
94
+ " Option+D delete word forward",
95
+ " Alt+Enter insert newline (multi-line input)",
96
+ "",
97
+ "Commands:",
98
+ " /help this help",
99
+ " /commands list all commands",
100
+ " /exit quit",
101
+ ].join("\n"),
102
+ }),
103
+ /* v8 ignore stop */
104
+ });
67
105
  registry.register({
68
106
  name: "tool-required",
69
107
  description: "toggle tool_choice required mode (forces tool calls)",
@@ -73,6 +111,20 @@ function registerDefaultCommands(registry) {
73
111
  return { action: "response", message: `tool-required mode: ${_toolChoiceRequired ? "ON" : "OFF"}` };
74
112
  },
75
113
  });
114
+ registry.register({
115
+ name: "debug",
116
+ description: "toggle debug mode — see more detail about what I'm doing",
117
+ channels: ["cli", "teams", "bluebubbles", "mail", "mcp"],
118
+ handler: () => {
119
+ _debugMode = !_debugMode;
120
+ return {
121
+ action: "response",
122
+ message: _debugMode
123
+ ? "debug mode on — you'll see more detail about what I'm doing"
124
+ : "debug mode off — back to clean output",
125
+ };
126
+ },
127
+ });
76
128
  (0, runtime_1.emitNervesEvent)({
77
129
  event: "repertoire.load_end",
78
130
  component: "repertoire",
@@ -80,6 +132,17 @@ function registerDefaultCommands(registry) {
80
132
  meta: {},
81
133
  });
82
134
  }
135
+ let _sharedRegistry = null;
136
+ function getSharedCommandRegistry() {
137
+ if (!_sharedRegistry) {
138
+ _sharedRegistry = createCommandRegistry();
139
+ registerDefaultCommands(_sharedRegistry);
140
+ }
141
+ return _sharedRegistry;
142
+ }
143
+ function resetSharedCommandRegistry() {
144
+ _sharedRegistry = null;
145
+ }
83
146
  function parseSlashCommand(input) {
84
147
  const trimmed = input.trim();
85
148
  if (!trimmed.startsWith("/"))
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildHabitTurnMessage = buildHabitTurnMessage;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ function formatElapsed(ms) {
6
+ const minutes = Math.floor(ms / 60000);
7
+ if (minutes < 60) {
8
+ return `${minutes} ${minutes === 1 ? "minute" : "minutes"}`;
9
+ }
10
+ const hours = Math.floor(minutes / 60);
11
+ return `${hours} ${hours === 1 ? "hour" : "hours"}`;
12
+ }
13
+ function buildHabitTurnMessage(options) {
14
+ const { habitName, habitTitle, habitBody, lastRun, checkpoint, alsoDue, staleObligations, parseErrors, degradedComponents, now, } = options;
15
+ const hasBody = habitBody !== undefined && habitBody !== "";
16
+ // First beat: lastRun is null
17
+ if (lastRun === null) {
18
+ // Cold start: no checkpoint, no body — bare awareness
19
+ if (!checkpoint && !hasBody) {
20
+ (0, runtime_1.emitNervesEvent)({
21
+ component: "senses",
22
+ event: "senses.habit_turn_message_built",
23
+ message: "habit turn message built (cold start)",
24
+ meta: { habitName, coldStart: true },
25
+ });
26
+ return "...time passing. anything stirring?";
27
+ }
28
+ if (!hasBody) {
29
+ // First beat with no body: nudge
30
+ const sections = [
31
+ `your ${habitTitle} fired but has no instructions \u2014 add a body to \`habits/${habitName}.md\``,
32
+ ];
33
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
34
+ (0, runtime_1.emitNervesEvent)({
35
+ component: "senses",
36
+ event: "senses.habit_turn_message_built",
37
+ message: "habit turn message built (first beat, no body)",
38
+ meta: { habitName, firstBeat: true, hasBody: false },
39
+ });
40
+ return sections.join("\n\n");
41
+ }
42
+ const sections = [
43
+ `your ${habitTitle} is alive. this is its first breath.`,
44
+ habitBody,
45
+ ];
46
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
47
+ (0, runtime_1.emitNervesEvent)({
48
+ component: "senses",
49
+ event: "senses.habit_turn_message_built",
50
+ message: "habit turn message built (first beat)",
51
+ meta: { habitName, firstBeat: true },
52
+ });
53
+ return sections.join("\n\n");
54
+ }
55
+ // Normal turn
56
+ const sections = [];
57
+ // 1. Checkpoint
58
+ if (checkpoint) {
59
+ sections.push(`you were thinking about ${checkpoint}.`);
60
+ }
61
+ // 2. Elapsed time
62
+ const nowMs = now().getTime();
63
+ const lastRunMs = new Date(lastRun).getTime();
64
+ const elapsed = nowMs - lastRunMs;
65
+ sections.push(`${formatElapsed(elapsed)} have passed.`);
66
+ // 3. Body or no-body nudge
67
+ if (hasBody) {
68
+ sections.push(habitBody);
69
+ }
70
+ else {
71
+ sections.push(`your ${habitTitle} fired but has no instructions \u2014 add a body to \`habits/${habitName}.md\``);
72
+ }
73
+ // 4-7. Trailing extras
74
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
75
+ (0, runtime_1.emitNervesEvent)({
76
+ component: "senses",
77
+ event: "senses.habit_turn_message_built",
78
+ message: "habit turn message built",
79
+ meta: {
80
+ habitName,
81
+ hasCheckpoint: !!checkpoint,
82
+ hasBody: hasBody,
83
+ staleObligationCount: staleObligations.length,
84
+ },
85
+ });
86
+ return sections.join("\n\n");
87
+ }
88
+ function appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents) {
89
+ // 4. Also-due
90
+ if (alsoDue) {
91
+ sections.push(alsoDue);
92
+ }
93
+ // 5. Stale obligations
94
+ if (staleObligations.length > 0) {
95
+ const lines = staleObligations.map((o) => `[internal] obligation: ${o.friendName} — waiting ${formatElapsed(o.stalenessMs)}`);
96
+ sections.push(lines.join("\n"));
97
+ }
98
+ // 6. Parse errors
99
+ if (parseErrors.length > 0) {
100
+ const lines = parseErrors.map((e) => `I noticed my habit file \`${e.file}\` has invalid frontmatter \u2014 I should fix it. (${e.error})`);
101
+ sections.push(lines.join("\n"));
102
+ }
103
+ // 7. Degraded state
104
+ if (degradedComponents.length > 0) {
105
+ const reasons = degradedComponents.map((d) => `${d.component}: ${d.reason}`).join("; ");
106
+ sections.push(`[note: my scheduling is degraded: ${reasons}]`);
107
+ }
108
+ }
@@ -1,33 +1,78 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MAX_CONSECUTIVE_INSTINCT_TURNS = void 0;
3
37
  exports.createInnerDialogWorker = createInnerDialogWorker;
4
38
  exports.startInnerDialogWorker = startInnerDialogWorker;
39
+ const path = __importStar(require("path"));
5
40
  const inner_dialog_1 = require("./inner-dialog");
6
41
  const runtime_1 = require("../nerves/runtime");
7
42
  const identity_1 = require("../heart/identity");
8
43
  const pending_1 = require("../mind/pending");
44
+ const habit_runtime_state_1 = require("../heart/habits/habit-runtime-state");
45
+ /**
46
+ * Cap on consecutive `instinct` follow-on turns triggered by `hasPendingWork()`
47
+ * with no externally-queued work in between. Without this cap, a turn that
48
+ * writes anything back into the inner-dialog pending dir as a side effect of
49
+ * processing (e.g. a surface tool routing a response) puts the worker into
50
+ * a self-sustaining loop where the next turn's drain produces another write,
51
+ * and so on. Real workflows rarely chain more than 2–3 instinct turns; an
52
+ * external trigger (habit, poke, chat) resets the counter so legitimate
53
+ * follow-on work is unaffected.
54
+ *
55
+ * Three feels right: legitimate cascading follow-ups (e.g. processing a
56
+ * batch of delegated returns) get through; a true self-loop caps fast.
57
+ */
58
+ exports.MAX_CONSECUTIVE_INSTINCT_TURNS = 3;
9
59
  function createInnerDialogWorker(runTurn = (options) => (0, inner_dialog_1.runInnerDialogTurn)(options), hasPendingWork = () => (0, pending_1.hasPendingMessages)((0, pending_1.getInnerDialogPendingDir)((0, identity_1.getAgentName)()))) {
10
60
  let running = false;
11
- let rerunRequested = false;
12
- let rerunReason = "instinct";
13
- let rerunTaskId;
14
- async function run(reason, taskId) {
61
+ const queue = [];
62
+ async function run(reason, taskId, habitName) {
15
63
  if (running) {
16
- rerunRequested = true;
17
- rerunReason = reason;
18
- if (taskId !== undefined) {
19
- rerunTaskId = taskId;
20
- }
64
+ queue.push({ reason, taskId, habitName });
21
65
  return;
22
66
  }
23
67
  running = true;
24
68
  try {
25
69
  let nextReason = reason;
26
70
  let nextTaskId = taskId;
71
+ let nextHabitName = habitName;
72
+ let consecutiveInstinctTurns = reason === "instinct" ? 1 : 0;
27
73
  do {
28
- rerunRequested = false;
29
74
  try {
30
- await runTurn({ reason: nextReason, taskId: nextTaskId });
75
+ await runTurn({ reason: nextReason, taskId: nextTaskId, habitName: nextHabitName });
31
76
  }
32
77
  catch (error) {
33
78
  (0, runtime_1.emitNervesEvent)({
@@ -41,15 +86,55 @@ function createInnerDialogWorker(runTurn = (options) => (0, inner_dialog_1.runIn
41
86
  },
42
87
  });
43
88
  }
44
- if (!rerunRequested && hasPendingWork()) {
45
- rerunRequested = true;
46
- rerunReason = "instinct";
89
+ // Record lastRun after a habit turn without dirtying the tracked habit file.
90
+ if (nextReason === "habit" && nextHabitName) {
91
+ try {
92
+ const agentRoot = (0, identity_1.getAgentRoot)();
93
+ (0, habit_runtime_state_1.recordHabitRun)(agentRoot, nextHabitName, new Date().toISOString(), {
94
+ definitionPath: path.join(agentRoot, "habits", `${nextHabitName}.md`),
95
+ });
96
+ }
97
+ catch {
98
+ // Habit file/state may be unavailable during the turn — skip gracefully
99
+ }
100
+ }
101
+ // Drain queue first. Externally-queued work resets the instinct cap
102
+ // because a real outside trigger arrived between turns.
103
+ if (queue.length > 0) {
104
+ const next = queue.shift();
105
+ nextReason = next.reason;
106
+ nextTaskId = next.taskId;
107
+ nextHabitName = next.habitName;
108
+ consecutiveInstinctTurns = nextReason === "instinct" ? consecutiveInstinctTurns + 1 : 0;
109
+ continue;
110
+ }
111
+ // Then check hasPendingWork fallback. This is the loop site: any
112
+ // tool that writes to the inner-dialog pending dir during a turn
113
+ // would cause hasPendingWork() to be true here, producing a
114
+ // self-sustaining "instinct" loop with no external input. Cap it.
115
+ if (hasPendingWork()) {
116
+ if (consecutiveInstinctTurns >= exports.MAX_CONSECUTIVE_INSTINCT_TURNS) {
117
+ (0, runtime_1.emitNervesEvent)({
118
+ level: "warn",
119
+ component: "senses",
120
+ event: "senses.inner_dialog_worker_instinct_loop_capped",
121
+ message: "inner dialog worker stopped chaining instinct turns; pending work remains for next external trigger",
122
+ meta: {
123
+ consecutiveInstinctTurns,
124
+ cap: exports.MAX_CONSECUTIVE_INSTINCT_TURNS,
125
+ lastReason: nextReason,
126
+ },
127
+ });
128
+ break;
129
+ }
130
+ consecutiveInstinctTurns += 1;
131
+ nextReason = "instinct";
132
+ nextTaskId = undefined;
133
+ nextHabitName = undefined;
134
+ continue;
47
135
  }
48
- nextReason = rerunReason;
49
- nextTaskId = rerunTaskId;
50
- rerunReason = "instinct";
51
- rerunTaskId = undefined;
52
- } while (rerunRequested);
136
+ break;
137
+ } while (true);
53
138
  }
54
139
  finally {
55
140
  running = false;
@@ -59,8 +144,13 @@ function createInnerDialogWorker(runTurn = (options) => (0, inner_dialog_1.runIn
59
144
  if (!message || typeof message !== "object")
60
145
  return;
61
146
  const maybeMessage = message;
147
+ if (maybeMessage.type === "habit") {
148
+ await run("habit", undefined, maybeMessage.habitName);
149
+ return;
150
+ }
62
151
  if (maybeMessage.type === "heartbeat") {
63
- await run("heartbeat");
152
+ // Backward compatibility: heartbeat -> habit/heartbeat
153
+ await run("habit", undefined, "heartbeat");
64
154
  return;
65
155
  }
66
156
  if (maybeMessage.type === "poke") {