@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.551

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 (386) hide show
  1. package/README.md +133 -19
  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-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3561 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +796 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,281 @@
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.readBackgroundOperation = readBackgroundOperation;
37
+ exports.listBackgroundOperations = listBackgroundOperations;
38
+ exports.startBackgroundOperation = startBackgroundOperation;
39
+ exports.markBackgroundOperationRunning = markBackgroundOperationRunning;
40
+ exports.updateBackgroundOperation = updateBackgroundOperation;
41
+ exports.completeBackgroundOperation = completeBackgroundOperation;
42
+ exports.failBackgroundOperation = failBackgroundOperation;
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const runtime_1 = require("../nerves/runtime");
46
+ const identity_1 = require("./identity");
47
+ function operationsDir(agentName, agentRoot = (0, identity_1.getAgentRoot)(agentName)) {
48
+ return path.join(agentRoot, "state", "background-operations");
49
+ }
50
+ function operationPath(locator) {
51
+ return path.join(operationsDir(locator.agentName, locator.agentRoot), `${locator.id}.json`);
52
+ }
53
+ function normalizeProgress(progress) {
54
+ if (!progress)
55
+ return undefined;
56
+ const normalized = {};
57
+ if (typeof progress.current === "number" && Number.isFinite(progress.current))
58
+ normalized.current = progress.current;
59
+ if (typeof progress.total === "number" && Number.isFinite(progress.total))
60
+ normalized.total = progress.total;
61
+ if (typeof progress.unit === "string" && progress.unit.trim().length > 0)
62
+ normalized.unit = progress.unit.trim();
63
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
64
+ }
65
+ function normalizeRecord(record) {
66
+ if (record.schemaVersion !== 1)
67
+ return null;
68
+ if (typeof record.id !== "string" || record.id.trim().length === 0)
69
+ return null;
70
+ if (typeof record.agentName !== "string" || record.agentName.trim().length === 0)
71
+ return null;
72
+ if (typeof record.kind !== "string" || record.kind.trim().length === 0)
73
+ return null;
74
+ if (typeof record.title !== "string" || record.title.trim().length === 0)
75
+ return null;
76
+ if (typeof record.summary !== "string" || record.summary.trim().length === 0)
77
+ return null;
78
+ if (typeof record.createdAt !== "string" || record.createdAt.trim().length === 0)
79
+ return null;
80
+ if (typeof record.updatedAt !== "string" || record.updatedAt.trim().length === 0)
81
+ return null;
82
+ if (record.status !== "queued"
83
+ && record.status !== "running"
84
+ && record.status !== "succeeded"
85
+ && record.status !== "failed") {
86
+ return null;
87
+ }
88
+ const normalized = {
89
+ schemaVersion: 1,
90
+ id: record.id,
91
+ agentName: record.agentName,
92
+ kind: record.kind,
93
+ title: record.title,
94
+ status: record.status,
95
+ summary: record.summary,
96
+ createdAt: record.createdAt,
97
+ updatedAt: record.updatedAt,
98
+ };
99
+ if (typeof record.detail === "string" && record.detail.trim().length > 0)
100
+ normalized.detail = record.detail.trim();
101
+ if (typeof record.startedAt === "string" && record.startedAt.trim().length > 0)
102
+ normalized.startedAt = record.startedAt;
103
+ if (typeof record.finishedAt === "string" && record.finishedAt.trim().length > 0)
104
+ normalized.finishedAt = record.finishedAt;
105
+ const progress = normalizeProgress(record.progress);
106
+ if (progress)
107
+ normalized.progress = progress;
108
+ if (record.spec && typeof record.spec === "object" && !Array.isArray(record.spec))
109
+ normalized.spec = { ...record.spec };
110
+ if (record.result && typeof record.result === "object" && !Array.isArray(record.result))
111
+ normalized.result = { ...record.result };
112
+ if (record.error && typeof record.error.message === "string" && record.error.message.trim().length > 0) {
113
+ normalized.error = { message: record.error.message.trim() };
114
+ }
115
+ if (record.failure && typeof record.failure === "object" && !Array.isArray(record.failure)) {
116
+ const failureClass = typeof record.failure.class === "string" ? record.failure.class.trim() : "";
117
+ const retryDisposition = record.failure.retryDisposition;
118
+ const hint = typeof record.failure.hint === "string" ? record.failure.hint.trim() : "";
119
+ if (failureClass) {
120
+ normalized.failure = {
121
+ class: failureClass,
122
+ ...(retryDisposition === "retry-safe" || retryDisposition === "fix-before-retry" || retryDisposition === "investigate-first"
123
+ ? { retryDisposition }
124
+ : {}),
125
+ ...(hint ? { hint } : {}),
126
+ };
127
+ }
128
+ }
129
+ if (Array.isArray(record.remediation)) {
130
+ const remediation = record.remediation.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
131
+ if (remediation.length > 0)
132
+ normalized.remediation = remediation;
133
+ }
134
+ return normalized;
135
+ }
136
+ function readRecord(filePath) {
137
+ try {
138
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf-8"));
139
+ return normalizeRecord(parsed);
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ function specText(spec, key) {
146
+ const value = spec?.[key];
147
+ return typeof value === "string" ? value.trim() : "";
148
+ }
149
+ function visibleOperationKey(record) {
150
+ if (record.kind !== "mail.import-mbox")
151
+ return null;
152
+ const filePath = specText(record.spec, "filePath");
153
+ if (!filePath)
154
+ return null;
155
+ const ownerEmail = specText(record.spec, "ownerEmail").toLowerCase();
156
+ const source = specText(record.spec, "source").toLowerCase();
157
+ return `${record.agentName.toLowerCase()}|${record.kind}|${filePath}|${ownerEmail}|${source}`;
158
+ }
159
+ function writeRecord(locator, record) {
160
+ const normalized = normalizeRecord(record);
161
+ if (!normalized) {
162
+ throw new Error(`invalid background operation record: ${locator.id}`);
163
+ }
164
+ fs.mkdirSync(operationsDir(locator.agentName, locator.agentRoot), { recursive: true });
165
+ fs.writeFileSync(operationPath(locator), `${JSON.stringify(normalized, null, 2)}\n`, "utf-8");
166
+ (0, runtime_1.emitNervesEvent)({
167
+ component: "engine",
168
+ event: "engine.background_operation_written",
169
+ message: "background operation state written",
170
+ meta: { agentName: locator.agentName, id: locator.id, kind: normalized.kind, status: normalized.status },
171
+ });
172
+ return normalized;
173
+ }
174
+ function requireRecord(locator) {
175
+ const record = readBackgroundOperation(locator);
176
+ if (!record) {
177
+ throw new Error(`background operation not found: ${locator.id}`);
178
+ }
179
+ return record;
180
+ }
181
+ function readBackgroundOperation(locator) {
182
+ return readRecord(operationPath(locator));
183
+ }
184
+ function listBackgroundOperations(input) {
185
+ const dir = operationsDir(input.agentName, input.agentRoot);
186
+ if (!fs.existsSync(dir))
187
+ return [];
188
+ let entries;
189
+ try {
190
+ entries = fs.readdirSync(dir);
191
+ }
192
+ catch {
193
+ return [];
194
+ }
195
+ const records = entries
196
+ .filter((entry) => entry.endsWith(".json"))
197
+ .map((entry) => readRecord(path.join(dir, entry)))
198
+ .filter((entry) => entry !== null)
199
+ .sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt));
200
+ const visibleKeys = new Set();
201
+ const visible = records.filter((record) => {
202
+ const key = visibleOperationKey(record);
203
+ if (!key)
204
+ return true;
205
+ if (visibleKeys.has(key))
206
+ return false;
207
+ visibleKeys.add(key);
208
+ return true;
209
+ });
210
+ return visible.slice(0, input.limit ?? 10);
211
+ }
212
+ function startBackgroundOperation(input) {
213
+ return writeRecord(input, {
214
+ schemaVersion: 1,
215
+ id: input.id,
216
+ agentName: input.agentName,
217
+ kind: input.kind,
218
+ title: input.title,
219
+ status: "queued",
220
+ summary: input.summary,
221
+ createdAt: input.createdAt,
222
+ updatedAt: input.createdAt,
223
+ ...(input.spec ? { spec: input.spec } : {}),
224
+ });
225
+ }
226
+ function markBackgroundOperationRunning(input) {
227
+ const current = requireRecord(input);
228
+ const updatedAt = input.updatedAt ?? input.startedAt;
229
+ return writeRecord(input, {
230
+ ...current,
231
+ status: "running",
232
+ summary: input.summary ?? current.summary,
233
+ ...(input.detail ? { detail: input.detail } : {}),
234
+ ...(normalizeProgress(input.progress) ? { progress: normalizeProgress(input.progress) } : {}),
235
+ startedAt: input.startedAt,
236
+ updatedAt,
237
+ ...(current.finishedAt ? { finishedAt: current.finishedAt } : {}),
238
+ });
239
+ }
240
+ function updateBackgroundOperation(input) {
241
+ const current = requireRecord(input);
242
+ return writeRecord(input, {
243
+ ...current,
244
+ summary: input.summary ?? current.summary,
245
+ ...(input.detail ? { detail: input.detail } : {}),
246
+ ...(normalizeProgress(input.progress) ? { progress: normalizeProgress(input.progress) } : {}),
247
+ ...(input.spec ? { spec: input.spec } : {}),
248
+ updatedAt: input.updatedAt ?? current.updatedAt,
249
+ });
250
+ }
251
+ function completeBackgroundOperation(input) {
252
+ const current = requireRecord(input);
253
+ return writeRecord(input, {
254
+ ...current,
255
+ status: "succeeded",
256
+ summary: input.summary ?? current.summary,
257
+ ...(input.detail ? { detail: input.detail } : {}),
258
+ ...(normalizeProgress(input.progress) ? { progress: normalizeProgress(input.progress) } : {}),
259
+ ...(input.result ? { result: input.result } : {}),
260
+ error: undefined,
261
+ remediation: undefined,
262
+ failure: undefined,
263
+ finishedAt: input.finishedAt,
264
+ updatedAt: input.updatedAt ?? input.finishedAt,
265
+ });
266
+ }
267
+ function failBackgroundOperation(input) {
268
+ const current = requireRecord(input);
269
+ return writeRecord(input, {
270
+ ...current,
271
+ status: "failed",
272
+ summary: input.summary ?? current.summary,
273
+ ...(input.detail ? { detail: input.detail } : {}),
274
+ ...(normalizeProgress(input.progress) ? { progress: normalizeProgress(input.progress) } : {}),
275
+ error: { message: input.error },
276
+ ...(input.failure ? { failure: input.failure } : {}),
277
+ ...(input.remediation && input.remediation.length > 0 ? { remediation: input.remediation } : {}),
278
+ finishedAt: input.finishedAt,
279
+ updatedAt: input.updatedAt ?? input.finishedAt,
280
+ });
281
+ }
@@ -0,0 +1,168 @@
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.detectBundleState = detectBundleState;
37
+ exports.renderBundleStateHint = renderBundleStateHint;
38
+ /**
39
+ * Bundle state detection: inspects an agent bundle's git + pending-sync
40
+ * state and returns a structured list of issues the agent needs to remediate
41
+ * via its `bundle_*` tools.
42
+ *
43
+ * Previously the sync pipeline surfaced a single free-form `syncFailure`
44
+ * string that was good for humans but hard for the agent to act on. The
45
+ * new `BundleStateIssue` enum lets the agent pattern-match on discrete
46
+ * cases and pick the correct remediation tool (shipping in PR 6).
47
+ *
48
+ * Detection never throws: every git call is wrapped in try/catch so a
49
+ * broken bundle or a missing git binary degrades to an empty array or a
50
+ * `not_a_git_repo` signal rather than exploding the turn pipeline.
51
+ *
52
+ * The classification returned here is detected from bundle state +
53
+ * the `classification` field of `state/pending-sync.json` (written by
54
+ * `postTurnPush` in sync.ts when it writes the pending-sync record).
55
+ *
56
+ * - `not_a_git_repo`: `.git` directory missing.
57
+ * - `no_remote_configured`: `git remote` returns empty.
58
+ * - `first_commit_never_happened`: `.git` exists but `git rev-parse HEAD`
59
+ * fails (fresh `git init` with nothing committed).
60
+ * - `pending_sync_exists`: `state/pending-sync.json` exists — the agent
61
+ * should inspect it and clear the pending state.
62
+ * - `remote_push_failed`: pending-sync classified as `push_rejected` —
63
+ * the remote advanced and a simple retry won't work.
64
+ * - `pull_rebase_conflict`: pending-sync classified as
65
+ * `pull_rebase_conflict` — the rebase left conflicted files the agent
66
+ * has to walk the user through resolving.
67
+ */
68
+ const child_process_1 = require("child_process");
69
+ const fs = __importStar(require("fs"));
70
+ const path = __importStar(require("path"));
71
+ const runtime_1 = require("../nerves/runtime");
72
+ function detectBundleState(agentRoot, deps = {}) {
73
+ const exec = deps.execFileSync ?? child_process_1.execFileSync;
74
+ const exists = deps.existsSync ?? fs.existsSync;
75
+ const readFile = deps.readFileSync ?? ((p, enc) => fs.readFileSync(p, enc));
76
+ const issues = [];
77
+ (0, runtime_1.emitNervesEvent)({
78
+ component: "heart",
79
+ event: "heart.bundle_state_detect_start",
80
+ message: "detecting bundle state",
81
+ meta: { agentRoot },
82
+ });
83
+ const gitDir = path.join(agentRoot, ".git");
84
+ const isGitRepo = exists(gitDir);
85
+ if (!isGitRepo) {
86
+ issues.push("not_a_git_repo");
87
+ }
88
+ else {
89
+ // Check remote presence
90
+ try {
91
+ const remoteOutput = exec("git", ["remote"], {
92
+ cwd: agentRoot,
93
+ stdio: "pipe",
94
+ timeout: 5000,
95
+ }).toString().trim();
96
+ if (remoteOutput.length === 0) {
97
+ issues.push("no_remote_configured");
98
+ }
99
+ }
100
+ catch {
101
+ // Git missing or broken — treat as no_remote_configured so the
102
+ // agent surfaces a "fix git" signal rather than a silent pass.
103
+ issues.push("no_remote_configured");
104
+ }
105
+ // Check for initial commit
106
+ try {
107
+ exec("git", ["rev-parse", "HEAD"], {
108
+ cwd: agentRoot,
109
+ stdio: "pipe",
110
+ timeout: 5000,
111
+ });
112
+ }
113
+ catch {
114
+ issues.push("first_commit_never_happened");
115
+ }
116
+ }
117
+ // Pending-sync file — independent of git state (could exist on a bundle
118
+ // that was a repo and then had its .git deleted). When present, also
119
+ // inspect the classification field to surface the specific failure
120
+ // mode as an additional issue.
121
+ const pendingSyncPath = path.join(agentRoot, "state", "pending-sync.json");
122
+ if (exists(pendingSyncPath)) {
123
+ issues.push("pending_sync_exists");
124
+ try {
125
+ const raw = readFile(pendingSyncPath, "utf-8");
126
+ const parsed = JSON.parse(raw);
127
+ if (parsed.classification === "push_rejected") {
128
+ issues.push("remote_push_failed");
129
+ }
130
+ else if (parsed.classification === "pull_rebase_conflict") {
131
+ issues.push("pull_rebase_conflict");
132
+ }
133
+ }
134
+ catch {
135
+ // Malformed or unreadable pending-sync.json — pending_sync_exists
136
+ // alone is enough signal for the agent to investigate.
137
+ }
138
+ }
139
+ (0, runtime_1.emitNervesEvent)({
140
+ component: "heart",
141
+ event: "heart.bundle_state_detect_end",
142
+ message: `bundle state detected: ${issues.length} issue(s)`,
143
+ meta: { agentRoot, issues },
144
+ });
145
+ return issues;
146
+ }
147
+ /**
148
+ * First-person remediation hint text for the start-of-turn packet. Reads
149
+ * as the agent's own voice per the declarative first-person note rule.
150
+ * Returns empty string when there are no issues (so the packet renderer
151
+ * can skip the section entirely).
152
+ */
153
+ function renderBundleStateHint(issues) {
154
+ if (issues.length === 0)
155
+ return "";
156
+ const labels = {
157
+ not_a_git_repo: "not a git repo",
158
+ no_remote_configured: "no remote configured",
159
+ first_commit_never_happened: "first commit never happened",
160
+ pending_sync_exists: "pending sync from a prior turn",
161
+ remote_push_failed: "remote push rejected (remote advanced)",
162
+ pull_rebase_conflict: "pull-rebase left conflicts i need to walk the user through",
163
+ };
164
+ const list = issues.map((issue) => labels[issue]).join(", ");
165
+ return (`my bundle has unresolved git state: ${list}. ` +
166
+ `i have the bundle_* tools available to fix this — i should run ` +
167
+ `bundle_check_sync_status first, then use the appropriate remediation tool.`);
168
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deriveCommitments = deriveCommitments;
4
+ exports.formatCommitments = formatCommitments;
5
+ const obligations_1 = require("../arc/obligations");
6
+ const runtime_1 = require("../nerves/runtime");
7
+ function describeActiveObligation(obligation) {
8
+ if (obligation.status === "pending") {
9
+ return `i owe ${obligation.origin.friendId}: ${obligation.content}`;
10
+ }
11
+ const surface = obligation.currentSurface?.label;
12
+ const statusText = obligation.status.replaceAll("_", " ");
13
+ if (surface) {
14
+ return `i owe ${obligation.origin.friendId}: ${obligation.content} (${statusText} in ${surface})`;
15
+ }
16
+ return `i owe ${obligation.origin.friendId}: ${obligation.content} (${statusText})`;
17
+ }
18
+ function deriveCommitments(activeWorkFrame, innerJob, pendingObligations) {
19
+ const committedTo = [];
20
+ const completionCriteria = [];
21
+ const safeToIgnore = [];
22
+ // Persistent obligations from the obligation store
23
+ // Sort by status priority: investigating/waiting/updating before pending
24
+ if (pendingObligations && pendingObligations.length > 0) {
25
+ const sorted = [...pendingObligations].sort((a, b) => {
26
+ const advancedA = a.status !== "pending" && a.status !== "fulfilled" ? 0 : 1;
27
+ const advancedB = b.status !== "pending" && b.status !== "fulfilled" ? 0 : 1;
28
+ return advancedA - advancedB;
29
+ });
30
+ let hasAdvancedObligation = false;
31
+ for (const ob of sorted) {
32
+ if (!(0, obligations_1.isOpenObligationStatus)(ob.status))
33
+ continue;
34
+ committedTo.push(describeActiveObligation(ob));
35
+ if (ob.status !== "pending")
36
+ hasAdvancedObligation = true;
37
+ }
38
+ completionCriteria.push("fulfill my outstanding obligations");
39
+ if (hasAdvancedObligation) {
40
+ completionCriteria.push("close my active obligation loops");
41
+ }
42
+ }
43
+ // Inner job
44
+ if (innerJob.status === "queued" || innerJob.status === "running") {
45
+ const contentSuffix = innerJob.content ? ` -- ${innerJob.content.slice(0, 60)}` : "";
46
+ committedTo.push(`i'm thinking through something privately${contentSuffix}`);
47
+ }
48
+ else if (innerJob.status === "surfaced") {
49
+ committedTo.push("i finished thinking about something and need to bring it back");
50
+ }
51
+ // mustResolveBeforeHandoff
52
+ if (activeWorkFrame.mustResolveBeforeHandoff) {
53
+ committedTo.push("i need to finish what i started before moving on");
54
+ completionCriteria.push("resolve the current thread before moving on");
55
+ }
56
+ // Bridges
57
+ for (const bridge of activeWorkFrame.bridges) {
58
+ committedTo.push(`i have shared work: ${bridge.summary || bridge.objective}`);
59
+ }
60
+ if (activeWorkFrame.bridges.length > 0) {
61
+ completionCriteria.push("keep shared work aligned across sessions");
62
+ }
63
+ // Tasks
64
+ for (const taskName of activeWorkFrame.taskPressure?.liveTaskNames ?? []) {
65
+ committedTo.push(`i'm tracking: ${taskName}`);
66
+ }
67
+ // Obligation completion criteria
68
+ if (innerJob.obligationStatus === "pending") {
69
+ const name = innerJob.origin?.friendName ?? innerJob.origin?.friendId ?? "them";
70
+ completionCriteria.push(`bring my answer back to ${name}`);
71
+ }
72
+ // Default completion criteria
73
+ if (completionCriteria.length === 0) {
74
+ completionCriteria.push("just be present in this conversation");
75
+ }
76
+ // Safe to ignore
77
+ if (innerJob.status === "idle" && !(activeWorkFrame.inner?.hasPending)) {
78
+ safeToIgnore.push("no private thinking in progress");
79
+ }
80
+ if (activeWorkFrame.bridges.length === 0) {
81
+ safeToIgnore.push("no shared work to coordinate");
82
+ }
83
+ if ((activeWorkFrame.taskPressure?.liveTaskNames ?? []).length === 0) {
84
+ safeToIgnore.push("no active tasks to track");
85
+ }
86
+ (0, runtime_1.emitNervesEvent)({
87
+ component: "engine",
88
+ event: "engine.commitments_derive",
89
+ message: "derived commitments frame",
90
+ meta: { committedCount: committedTo.length, criteriaCount: completionCriteria.length },
91
+ });
92
+ return { committedTo, completionCriteria, safeToIgnore };
93
+ }
94
+ function formatCommitments(commitments) {
95
+ const sections = [];
96
+ if (commitments.committedTo.length === 0) {
97
+ sections.push("i'm not holding anything specific right now. i'm free to be present.");
98
+ }
99
+ else {
100
+ sections.push("## what i'm holding right now");
101
+ sections.push("");
102
+ sections.push(commitments.committedTo.map((c) => `- ${c}`).join("\n"));
103
+ }
104
+ sections.push("");
105
+ sections.push("## what \"done\" looks like");
106
+ sections.push(commitments.completionCriteria.map((c) => `- ${c}`).join("\n"));
107
+ sections.push("");
108
+ sections.push("## what i can let go of");
109
+ sections.push(commitments.safeToIgnore.map((c) => `- ${c}`).join("\n"));
110
+ return sections.join("\n");
111
+ }