@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.561

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 (396) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3604 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +251 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/audio-routing.js +119 -0
  350. package/dist/senses/voice/elevenlabs.js +178 -0
  351. package/dist/senses/voice/golden-path.js +116 -0
  352. package/dist/senses/voice/index.js +26 -0
  353. package/dist/senses/voice/meeting.js +113 -0
  354. package/dist/senses/voice/playback.js +139 -0
  355. package/dist/senses/voice/transcript.js +70 -0
  356. package/dist/senses/voice/turn.js +85 -0
  357. package/dist/senses/voice/types.js +2 -0
  358. package/dist/senses/voice/whisper.js +161 -0
  359. package/dist/senses/voice-entry.js +80 -0
  360. package/dist/trips/core.js +138 -0
  361. package/dist/trips/store.js +146 -0
  362. package/package.json +38 -7
  363. package/skills/agent-commerce.md +106 -0
  364. package/skills/browser-navigation.md +117 -0
  365. package/skills/commerce-setup-guide.md +116 -0
  366. package/skills/commerce-setup.md +84 -0
  367. package/skills/configure-dev-tools.md +101 -0
  368. package/skills/travel-planning.md +138 -0
  369. package/dist/heart/daemon/auth-flow.js +0 -351
  370. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  371. package/dist/heart/daemon/subagent-installer.js +0 -166
  372. package/dist/heart/session-recall.js +0 -116
  373. package/dist/mind/associative-recall.js +0 -209
  374. package/dist/senses/bluebubbles-entry.js +0 -13
  375. package/dist/senses/bluebubbles.js +0 -1177
  376. package/dist/senses/debug-activity.js +0 -148
  377. package/subagents/README.md +0 -86
  378. package/subagents/work-doer.md +0 -237
  379. package/subagents/work-merger.md +0 -618
  380. package/subagents/work-planner.md +0 -390
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  389. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  390. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  391. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  392. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  393. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  394. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  395. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  396. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,357 @@
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.gatherKeptNotesCandidates = gatherKeptNotesCandidates;
37
+ exports.renderKeptNotesOutcome = renderKeptNotesOutcome;
38
+ exports.injectKeptNotes = injectKeptNotes;
39
+ exports.createKeptNotesJudge = createKeptNotesJudge;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const diary_1 = require("../mind/diary");
43
+ const runtime_1 = require("../nerves/runtime");
44
+ const DEFAULT_TIMEOUT_MS = 2500;
45
+ const MAX_CANDIDATES = 8;
46
+ const NOOP_CALLBACKS = {
47
+ onModelStart() { },
48
+ onModelStreamStart() { },
49
+ onTextChunk() { },
50
+ onReasoningChunk() { },
51
+ onToolStart() { },
52
+ onToolEnd() { },
53
+ onError() { },
54
+ };
55
+ function elapsedSince(startedAt) {
56
+ return Math.max(0, Date.now() - startedAt);
57
+ }
58
+ function latestUserText(messages) {
59
+ for (let i = messages.length - 1; i >= 0; i--) {
60
+ const message = messages[i];
61
+ if (message.role !== "user" || typeof message.content !== "string")
62
+ continue;
63
+ const text = message.content.trim();
64
+ if (text)
65
+ return text;
66
+ }
67
+ return "";
68
+ }
69
+ function tokenize(text) {
70
+ return new Set(text
71
+ .toLowerCase()
72
+ .split(/[^a-z0-9]+/g)
73
+ .map((token) => token.trim())
74
+ .filter((token) => token.length > 2));
75
+ }
76
+ function scoreText(queryTerms, text) {
77
+ const textTerms = tokenize(text);
78
+ let matches = 0;
79
+ for (const term of queryTerms) {
80
+ if (textTerms.has(term))
81
+ matches += 1;
82
+ }
83
+ return matches / queryTerms.size;
84
+ }
85
+ function readJournalIndex(journalDir) {
86
+ try {
87
+ const parsed = JSON.parse(fs.readFileSync(path.join(journalDir, ".index.json"), "utf8"));
88
+ if (!Array.isArray(parsed))
89
+ return [];
90
+ return parsed
91
+ .filter((entry) => (typeof entry === "object" &&
92
+ entry !== null &&
93
+ typeof entry.filename === "string" &&
94
+ typeof entry.preview === "string"));
95
+ }
96
+ catch {
97
+ return [];
98
+ }
99
+ }
100
+ function journalDirForDiaryRoot(diaryRoot, explicitJournalDir) {
101
+ if (explicitJournalDir)
102
+ return explicitJournalDir;
103
+ return path.join(path.dirname(diaryRoot), "journal");
104
+ }
105
+ function diaryCandidate(fact) {
106
+ return {
107
+ text: fact.text,
108
+ source: { kind: "diary", label: "diary", ref: fact.id },
109
+ };
110
+ }
111
+ function friendNoteCandidates(friend, queryTerms) {
112
+ if (!friend)
113
+ return [];
114
+ return Object.entries(friend.notes ?? {})
115
+ .map(([key, note]) => {
116
+ const text = `${friend.name} / ${key}: ${note.value}`;
117
+ return {
118
+ candidate: {
119
+ text,
120
+ source: { kind: "friend-note", label: `friend note: ${friend.name}`, ref: key },
121
+ },
122
+ score: scoreText(queryTerms, `${key} ${note.value}`),
123
+ };
124
+ })
125
+ .filter((entry) => entry.score > 0);
126
+ }
127
+ function gatherKeptNotesCandidates(query, options = {}) {
128
+ const queryTerms = tokenize(query);
129
+ if (queryTerms.size === 0)
130
+ return [];
131
+ const diaryRoot = (0, diary_1.resolveDiaryRoot)(options.diaryRoot);
132
+ const diaryEntries = (0, diary_1.readDiaryEntries)(diaryRoot);
133
+ const diaryCandidates = diaryEntries
134
+ .map((fact) => ({ candidate: diaryCandidate(fact), score: scoreText(queryTerms, fact.text) }))
135
+ .filter((entry) => entry.score > 0);
136
+ const journalDir = journalDirForDiaryRoot(diaryRoot, options.journalDir);
137
+ const journalCandidates = readJournalIndex(journalDir)
138
+ .map((entry) => ({
139
+ candidate: {
140
+ text: `${entry.filename}: ${entry.preview}`,
141
+ source: { kind: "journal", label: "journal", ref: entry.filename },
142
+ },
143
+ score: scoreText(queryTerms, `${entry.filename} ${entry.preview}`),
144
+ }))
145
+ .filter((entry) => entry.score > 0);
146
+ return [...diaryCandidates, ...journalCandidates, ...friendNoteCandidates(options.friend, queryTerms)]
147
+ .sort((left, right) => right.score - left.score)
148
+ .slice(0, MAX_CANDIDATES)
149
+ .map((entry) => entry.candidate);
150
+ }
151
+ function selectedSources(candidates, indexes) {
152
+ if (!indexes || indexes.length === 0)
153
+ return [];
154
+ const sources = [];
155
+ for (const index of indexes) {
156
+ if (!Number.isInteger(index))
157
+ continue;
158
+ const candidate = candidates[index];
159
+ if (candidate)
160
+ sources.push(candidate.source);
161
+ }
162
+ return sources;
163
+ }
164
+ function isFirstPerson(text) {
165
+ return /^(i|i'm|i’ve|i've|my|me)\b/i.test(text.trim());
166
+ }
167
+ function foundLine(text) {
168
+ const trimmed = text.trim();
169
+ if (isFirstPerson(trimmed))
170
+ return trimmed;
171
+ return `I kept this: ${trimmed}`;
172
+ }
173
+ function fuzzyLine(text) {
174
+ const trimmed = text.trim();
175
+ if (isFirstPerson(trimmed))
176
+ return trimmed;
177
+ return `I may have kept something related: ${trimmed}`;
178
+ }
179
+ const SOURCE_KIND_ORDER = ["diary", "journal", "friend-note"];
180
+ const SOURCE_KIND_LABELS = {
181
+ diary: "my diary",
182
+ journal: "my journal",
183
+ "friend-note": "my friend notes",
184
+ };
185
+ function joinLabels(labels) {
186
+ if (labels.length === 1)
187
+ return labels[0];
188
+ if (labels.length === 2)
189
+ return `${labels[0]} and ${labels[1]}`;
190
+ return `${labels.slice(0, -1).join(", ")}, and ${labels[labels.length - 1]}`;
191
+ }
192
+ function sourceHeading(sources) {
193
+ const sourceKinds = new Set(sources.map((source) => source.kind));
194
+ const labels = SOURCE_KIND_ORDER
195
+ .filter((kind) => sourceKinds.has(kind))
196
+ .map((kind) => SOURCE_KIND_LABELS[kind]);
197
+ if (labels.length === 0)
198
+ return "## from notes i chose to keep";
199
+ return `## from ${joinLabels(labels)}`;
200
+ }
201
+ function renderKeptNotesOutcome(outcome) {
202
+ if (outcome.status === "found") {
203
+ return `${sourceHeading(outcome.sources)}\nThis may matter now:\n${foundLine(outcome.note)}`;
204
+ }
205
+ if (outcome.status === "fuzzy") {
206
+ return `${sourceHeading(outcome.sources)}\nThis is only a possible match; I should verify it before relying on it:\n${fuzzyLine(outcome.hint)}`;
207
+ }
208
+ return null;
209
+ }
210
+ function finish(outcome, traceId) {
211
+ (0, runtime_1.emitNervesEvent)({
212
+ component: "mind",
213
+ event: "mind.kept_notes_end",
214
+ trace_id: traceId,
215
+ message: "kept notes completed",
216
+ meta: { status: outcome.status, elapsedMs: outcome.elapsedMs },
217
+ });
218
+ return outcome;
219
+ }
220
+ async function withTimeout(promise, timeoutMs) {
221
+ return await new Promise((resolve, reject) => {
222
+ const timeout = setTimeout(() => resolve("timeout"), timeoutMs);
223
+ promise
224
+ .then((value) => {
225
+ clearTimeout(timeout);
226
+ resolve(value);
227
+ })
228
+ .catch((error) => {
229
+ clearTimeout(timeout);
230
+ reject(error);
231
+ });
232
+ });
233
+ }
234
+ async function injectKeptNotes(messages, options = {}) {
235
+ const startedAt = Date.now();
236
+ const systemMessage = messages[0];
237
+ const query = latestUserText(messages);
238
+ if (systemMessage?.role !== "system" || typeof systemMessage.content !== "string" || !query) {
239
+ return { status: "none", elapsedMs: elapsedSince(startedAt), pressure: [] };
240
+ }
241
+ (0, runtime_1.emitNervesEvent)({
242
+ component: "mind",
243
+ event: "mind.kept_notes_start",
244
+ trace_id: options.traceId,
245
+ message: "kept notes started",
246
+ meta: { channel: options.channel ?? "unknown" },
247
+ });
248
+ try {
249
+ const candidates = gatherKeptNotesCandidates(query, options);
250
+ if (candidates.length === 0 || !options.judge) {
251
+ return finish({ status: "none", elapsedMs: elapsedSince(startedAt), pressure: [] }, options.traceId);
252
+ }
253
+ const judged = await withTimeout(options.judge({ query, candidates }), options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
254
+ if (judged === "timeout") {
255
+ return finish({ status: "timeout", elapsedMs: elapsedSince(startedAt) }, options.traceId);
256
+ }
257
+ const elapsedMs = elapsedSince(startedAt);
258
+ const outcome = judged.status === "found"
259
+ ? { status: "found", note: judged.note, sources: selectedSources(candidates, judged.sourceIndexes), elapsedMs }
260
+ : judged.status === "fuzzy"
261
+ ? { status: "fuzzy", hint: judged.hint, sources: selectedSources(candidates, judged.sourceIndexes), elapsedMs }
262
+ : { status: "none", pressure: judged.pressure, elapsedMs };
263
+ if (outcome.status === "found" || outcome.status === "fuzzy") {
264
+ const rendered = renderKeptNotesOutcome(outcome);
265
+ messages[0] = { role: "system", content: `${systemMessage.content}\n\n${rendered}` };
266
+ (0, runtime_1.emitNervesEvent)({
267
+ component: "mind",
268
+ event: "mind.kept_notes_injected",
269
+ trace_id: options.traceId,
270
+ message: "kept notes injected",
271
+ meta: { status: outcome.status, sourceCount: outcome.sources.length },
272
+ });
273
+ }
274
+ return finish(outcome, options.traceId);
275
+ }
276
+ catch (error) {
277
+ const reason = error instanceof Error ? error.message : String(error);
278
+ const outcome = { status: "error", reason, elapsedMs: elapsedSince(startedAt) };
279
+ (0, runtime_1.emitNervesEvent)({
280
+ level: "warn",
281
+ component: "mind",
282
+ event: "mind.kept_notes_error",
283
+ trace_id: options.traceId,
284
+ message: "kept notes failed",
285
+ meta: { reason },
286
+ });
287
+ return finish(outcome, options.traceId);
288
+ }
289
+ }
290
+ function parseJudgeResult(content) {
291
+ try {
292
+ const parsed = JSON.parse(content);
293
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
294
+ return { status: "none", pressure: ["invalid kept notes judge output"] };
295
+ }
296
+ const record = parsed;
297
+ if (record.status === "found" && typeof record.note === "string" && record.note.trim()) {
298
+ return {
299
+ status: "found",
300
+ note: record.note.trim(),
301
+ sourceIndexes: Array.isArray(record.sourceIndexes) ? record.sourceIndexes.filter((index) => typeof index === "number") : undefined,
302
+ };
303
+ }
304
+ if (record.status === "fuzzy" && typeof record.hint === "string" && record.hint.trim()) {
305
+ return {
306
+ status: "fuzzy",
307
+ hint: record.hint.trim(),
308
+ sourceIndexes: Array.isArray(record.sourceIndexes) ? record.sourceIndexes.filter((index) => typeof index === "number") : undefined,
309
+ };
310
+ }
311
+ if (record.status === "none") {
312
+ return {
313
+ status: "none",
314
+ pressure: Array.isArray(record.pressure) ? record.pressure.filter((value) => typeof value === "string") : [],
315
+ };
316
+ }
317
+ return { status: "none", pressure: ["invalid kept notes judge output"] };
318
+ }
319
+ catch {
320
+ return { status: "none", pressure: ["invalid kept notes judge output"] };
321
+ }
322
+ }
323
+ function createJudgePrompt(input) {
324
+ const candidates = input.candidates
325
+ .map((candidate, index) => `${index}. [${candidate.source.kind}] ${candidate.text}`)
326
+ .join("\n");
327
+ return [
328
+ {
329
+ role: "system",
330
+ content: [
331
+ "Decide whether these intentionally kept notes matter to the user's current turn.",
332
+ "Return only JSON.",
333
+ "Use found when a note clearly helps, fuzzy when a note is close but uncertain, and none when nothing should be surfaced.",
334
+ "Shapes: {\"status\":\"found\",\"note\":\"...\",\"sourceIndexes\":[0]}, {\"status\":\"fuzzy\",\"hint\":\"...\",\"sourceIndexes\":[0]}, or {\"status\":\"none\",\"pressure\":[]}.",
335
+ ].join("\n"),
336
+ },
337
+ {
338
+ role: "user",
339
+ content: `Current turn:\n${input.query}\n\nCandidates:\n${candidates}`,
340
+ },
341
+ ];
342
+ }
343
+ function createKeptNotesJudge(runtime, signal) {
344
+ return async (input) => {
345
+ const messages = createJudgePrompt(input);
346
+ runtime.resetTurnState?.(messages);
347
+ const result = await runtime.streamTurn({
348
+ messages,
349
+ activeTools: [],
350
+ callbacks: NOOP_CALLBACKS,
351
+ signal,
352
+ toolChoiceRequired: false,
353
+ reasoningEffort: "low",
354
+ });
355
+ return parseJudgeResult(result.content ?? "");
356
+ };
357
+ }
@@ -5,7 +5,7 @@ exports.detectKick = detectKick;
5
5
  const runtime_1 = require("../nerves/runtime");
6
6
  const KICK_MESSAGES = {
7
7
  empty: "I sent an empty message by accident — let me try again.",
8
- narration: "I narrated instead of acting. Using the tool now -- if done, calling final_answer.",
8
+ narration: "I narrated instead of acting. Using the tool now -- if done, calling settle.",
9
9
  tool_required: "tool-required is on — I need to call a tool. use /tool-required to turn it off.",
10
10
  };
11
11
  const TOOL_INTENT_PATTERNS = [
@@ -0,0 +1,161 @@
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.getMachineIdentityPath = getMachineIdentityPath;
37
+ exports.loadOrCreateMachineIdentity = loadOrCreateMachineIdentity;
38
+ const crypto = __importStar(require("crypto"));
39
+ const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const runtime_1 = require("../nerves/runtime");
43
+ function nowIso(deps) {
44
+ return (deps.now?.() ?? new Date()).toISOString();
45
+ }
46
+ function currentHostname(deps) {
47
+ return (deps.hostname?.() ?? os.hostname()).trim();
48
+ }
49
+ function defaultRandomId() {
50
+ return `machine_${crypto.randomUUID()}`;
51
+ }
52
+ function normalizeAliases(value) {
53
+ if (!Array.isArray(value))
54
+ return [];
55
+ const aliases = [];
56
+ for (const alias of value) {
57
+ if (typeof alias !== "string")
58
+ continue;
59
+ const trimmed = alias.trim();
60
+ if (trimmed && !aliases.includes(trimmed))
61
+ aliases.push(trimmed);
62
+ }
63
+ return aliases;
64
+ }
65
+ function parseMachineIdentity(value) {
66
+ if (!value || typeof value !== "object" || Array.isArray(value))
67
+ return null;
68
+ const record = value;
69
+ const aliases = normalizeAliases(record.hostnameAliases);
70
+ if (record.schemaVersion !== 1 ||
71
+ typeof record.machineId !== "string" ||
72
+ record.machineId.trim().length === 0 ||
73
+ typeof record.createdAt !== "string" ||
74
+ record.createdAt.trim().length === 0 ||
75
+ typeof record.updatedAt !== "string" ||
76
+ record.updatedAt.trim().length === 0) {
77
+ return null;
78
+ }
79
+ return {
80
+ schemaVersion: 1,
81
+ machineId: record.machineId,
82
+ createdAt: record.createdAt,
83
+ updatedAt: record.updatedAt,
84
+ hostnameAliases: aliases,
85
+ };
86
+ }
87
+ function writeMachineIdentity(machinePath, identity) {
88
+ fs.mkdirSync(path.dirname(machinePath), { recursive: true, mode: 0o700 });
89
+ fs.writeFileSync(machinePath, `${JSON.stringify(identity, null, 2)}\n`, { encoding: "utf-8", mode: 0o600 });
90
+ }
91
+ function getMachineIdentityPath(homeDir = os.homedir()) {
92
+ return path.join(homeDir, ".ouro-cli", "machine.json");
93
+ }
94
+ function loadOrCreateMachineIdentity(deps = {}) {
95
+ const homeDir = deps.homeDir ?? os.homedir();
96
+ const machinePath = getMachineIdentityPath(homeDir);
97
+ const hostname = currentHostname(deps);
98
+ let existing = null;
99
+ let hadInvalidFile = false;
100
+ try {
101
+ existing = parseMachineIdentity(JSON.parse(fs.readFileSync(machinePath, "utf-8")));
102
+ if (!existing)
103
+ hadInvalidFile = true;
104
+ }
105
+ catch (error) {
106
+ const code = error && typeof error === "object" && "code" in error
107
+ ? error.code
108
+ : undefined;
109
+ if (code !== "ENOENT")
110
+ hadInvalidFile = true;
111
+ }
112
+ if (hadInvalidFile) {
113
+ (0, runtime_1.emitNervesEvent)({
114
+ level: "warn",
115
+ component: "config/identity",
116
+ event: "config.machine_identity_invalid",
117
+ message: "machine identity file is invalid; replacing it",
118
+ meta: { path: machinePath },
119
+ });
120
+ }
121
+ if (existing) {
122
+ if (hostname && !existing.hostnameAliases.includes(hostname)) {
123
+ const updated = {
124
+ ...existing,
125
+ updatedAt: nowIso(deps),
126
+ hostnameAliases: [...existing.hostnameAliases, hostname],
127
+ };
128
+ writeMachineIdentity(machinePath, updated);
129
+ (0, runtime_1.emitNervesEvent)({
130
+ component: "config/identity",
131
+ event: "config.machine_identity_alias_added",
132
+ message: "recorded hostname alias for stable machine identity",
133
+ meta: { machineId: updated.machineId, hostname },
134
+ });
135
+ return updated;
136
+ }
137
+ (0, runtime_1.emitNervesEvent)({
138
+ component: "config/identity",
139
+ event: "config.machine_identity_loaded",
140
+ message: "loaded stable machine identity",
141
+ meta: { machineId: existing.machineId },
142
+ });
143
+ return existing;
144
+ }
145
+ const timestamp = nowIso(deps);
146
+ const identity = {
147
+ schemaVersion: 1,
148
+ machineId: (deps.randomId?.() ?? defaultRandomId()).trim() || defaultRandomId(),
149
+ createdAt: timestamp,
150
+ updatedAt: timestamp,
151
+ hostnameAliases: hostname ? [hostname] : [],
152
+ };
153
+ writeMachineIdentity(machinePath, identity);
154
+ (0, runtime_1.emitNervesEvent)({
155
+ component: "config/identity",
156
+ event: "config.machine_identity_created",
157
+ message: "created stable machine identity",
158
+ meta: { machineId: identity.machineId },
159
+ });
160
+ return identity;
161
+ }