@ouro.bot/cli 0.1.0-alpha.4 → 0.1.0-alpha.400

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 (338) hide show
  1. package/README.md +208 -184
  2. package/SerpentGuide.ouro/agent.json +82 -0
  3. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  5. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  6. package/assets/ouroboros.png +0 -0
  7. package/changelog.json +2610 -0
  8. package/dist/arc/attention-types.js +8 -0
  9. package/dist/arc/cares.js +140 -0
  10. package/dist/arc/episodes.js +117 -0
  11. package/dist/arc/intentions.js +133 -0
  12. package/dist/arc/json-store.js +117 -0
  13. package/dist/arc/obligations.js +237 -0
  14. package/dist/arc/packets.js +193 -0
  15. package/dist/arc/presence.js +185 -0
  16. package/dist/arc/task-lifecycle.js +65 -0
  17. package/dist/heart/active-work.js +832 -0
  18. package/dist/heart/agent-entry.js +58 -3
  19. package/dist/heart/attachments/image-normalize.js +194 -0
  20. package/dist/heart/attachments/materialize.js +97 -0
  21. package/dist/heart/attachments/originals.js +88 -0
  22. package/dist/heart/attachments/render.js +29 -0
  23. package/dist/heart/attachments/sources/adapter.js +2 -0
  24. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  25. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  26. package/dist/heart/attachments/sources/index.js +16 -0
  27. package/dist/heart/attachments/store.js +103 -0
  28. package/dist/heart/attachments/types.js +93 -0
  29. package/dist/heart/auth/auth-flow.js +417 -0
  30. package/dist/heart/bridges/manager.js +358 -0
  31. package/dist/heart/bridges/state-machine.js +135 -0
  32. package/dist/heart/bridges/store.js +123 -0
  33. package/dist/heart/bundle-state.js +168 -0
  34. package/dist/heart/commitments.js +111 -0
  35. package/dist/heart/config-registry.js +304 -0
  36. package/dist/heart/config.js +176 -130
  37. package/dist/heart/core.js +872 -255
  38. package/dist/heart/cross-chat-delivery.js +131 -0
  39. package/dist/heart/daemon/agent-config-check.js +397 -0
  40. package/dist/heart/daemon/agent-discovery.js +157 -0
  41. package/dist/heart/daemon/agent-service.js +360 -0
  42. package/dist/heart/daemon/agentic-repair.js +213 -0
  43. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  44. package/dist/heart/daemon/cadence.js +70 -0
  45. package/dist/heart/daemon/cli-defaults.js +599 -0
  46. package/dist/heart/daemon/cli-exec.js +3616 -0
  47. package/dist/heart/daemon/cli-help.js +396 -0
  48. package/dist/heart/daemon/cli-parse.js +1118 -0
  49. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  50. package/dist/heart/daemon/cli-render.js +560 -0
  51. package/dist/heart/daemon/cli-types.js +8 -0
  52. package/dist/heart/daemon/daemon-cli.js +29 -673
  53. package/dist/heart/daemon/daemon-entry.js +370 -8
  54. package/dist/heart/daemon/daemon-health.js +141 -0
  55. package/dist/heart/daemon/daemon-runtime-sync.js +235 -0
  56. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  57. package/dist/heart/daemon/daemon.js +813 -19
  58. package/dist/heart/daemon/doctor-types.js +8 -0
  59. package/dist/heart/daemon/doctor.js +419 -0
  60. package/dist/heart/daemon/health-monitor.js +79 -1
  61. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  62. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  63. package/dist/heart/daemon/http-health-probe.js +80 -0
  64. package/dist/heart/daemon/inner-status.js +89 -0
  65. package/dist/heart/daemon/interactive-repair.js +209 -0
  66. package/dist/heart/daemon/launchd.js +171 -0
  67. package/dist/heart/daemon/log-tailer.js +82 -12
  68. package/dist/heart/daemon/logs-prune.js +105 -0
  69. package/dist/heart/daemon/message-router.js +17 -8
  70. package/dist/heart/daemon/os-cron-deps.js +134 -0
  71. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  72. package/dist/heart/daemon/ouro-entry.js +3 -1
  73. package/dist/heart/daemon/process-manager.js +202 -1
  74. package/dist/heart/daemon/provider-discovery.js +137 -0
  75. package/dist/heart/daemon/pulse.js +475 -0
  76. package/dist/heart/daemon/readiness-repair.js +216 -0
  77. package/dist/heart/daemon/run-hooks.js +39 -0
  78. package/dist/heart/daemon/runtime-logging.js +67 -16
  79. package/dist/heart/daemon/runtime-metadata.js +191 -0
  80. package/dist/heart/daemon/runtime-mode.js +67 -0
  81. package/dist/heart/daemon/safe-mode.js +161 -0
  82. package/dist/heart/daemon/sense-manager.js +355 -0
  83. package/dist/heart/daemon/session-id-resolver.js +131 -0
  84. package/dist/heart/daemon/skill-management-installer.js +94 -0
  85. package/dist/heart/daemon/socket-client.js +307 -0
  86. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  87. package/dist/heart/daemon/startup-tui.js +237 -0
  88. package/dist/heart/daemon/task-scheduler.js +3 -25
  89. package/dist/heart/daemon/thoughts.js +510 -0
  90. package/dist/heart/daemon/up-progress.js +135 -0
  91. package/dist/heart/delegation.js +62 -0
  92. package/dist/heart/habits/habit-migration.js +181 -0
  93. package/dist/heart/habits/habit-parser.js +140 -0
  94. package/dist/heart/habits/habit-scheduler.js +371 -0
  95. package/dist/heart/hatch/hatch-animation.js +35 -0
  96. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -135
  97. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  98. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  99. package/dist/heart/hatch/specialist-prompt.js +102 -0
  100. package/dist/heart/hatch/specialist-tools.js +304 -0
  101. package/dist/heart/identity.js +246 -58
  102. package/dist/heart/kept-notes.js +357 -0
  103. package/dist/heart/kicks.js +2 -20
  104. package/dist/heart/machine-identity.js +161 -0
  105. package/dist/heart/mcp/mcp-server.js +653 -0
  106. package/dist/heart/migrate-config.js +100 -0
  107. package/dist/heart/model-capabilities.js +59 -0
  108. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  109. package/dist/heart/outlook/outlook-http-response.js +7 -0
  110. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  111. package/dist/heart/outlook/outlook-http-static.js +99 -0
  112. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  113. package/dist/heart/outlook/outlook-http.js +99 -0
  114. package/dist/heart/outlook/outlook-read.js +28 -0
  115. package/dist/heart/outlook/outlook-types.js +27 -0
  116. package/dist/heart/outlook/outlook-view.js +195 -0
  117. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  118. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  119. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  120. package/dist/heart/outlook/readers/sessions.js +232 -0
  121. package/dist/heart/outlook/readers/shared.js +111 -0
  122. package/dist/heart/platform.js +81 -0
  123. package/dist/heart/progress-story.js +42 -0
  124. package/dist/heart/provider-attempt.js +133 -0
  125. package/dist/heart/provider-binding-resolver.js +239 -0
  126. package/dist/heart/provider-credentials.js +383 -0
  127. package/dist/heart/provider-failover.js +266 -0
  128. package/dist/heart/provider-models.js +81 -0
  129. package/dist/heart/provider-ping.js +237 -0
  130. package/dist/heart/provider-state.js +216 -0
  131. package/dist/heart/provider-visibility.js +186 -0
  132. package/dist/heart/providers/anthropic-token.js +131 -0
  133. package/dist/heart/providers/anthropic.js +202 -50
  134. package/dist/heart/providers/azure.js +103 -12
  135. package/dist/heart/providers/error-classification.js +63 -0
  136. package/dist/heart/providers/github-copilot.js +145 -0
  137. package/dist/heart/providers/minimax-vlm.js +189 -0
  138. package/dist/heart/providers/minimax.js +29 -7
  139. package/dist/heart/providers/openai-codex.js +39 -29
  140. package/dist/heart/runtime-credentials.js +181 -0
  141. package/dist/heart/sense-truth.js +61 -0
  142. package/dist/heart/session-activity.js +190 -0
  143. package/dist/heart/session-events.js +855 -0
  144. package/dist/heart/session-transcript.js +167 -0
  145. package/dist/heart/start-of-turn-packet.js +345 -0
  146. package/dist/heart/streaming.js +117 -33
  147. package/dist/heart/sync.js +332 -0
  148. package/dist/heart/target-resolution.js +127 -0
  149. package/dist/heart/tempo.js +93 -0
  150. package/dist/heart/temporal-view.js +41 -0
  151. package/dist/heart/tool-activity-callbacks.js +36 -0
  152. package/dist/heart/tool-description.js +135 -0
  153. package/dist/heart/tool-friction.js +55 -0
  154. package/dist/heart/tool-loop.js +200 -0
  155. package/dist/heart/turn-context.js +351 -0
  156. package/dist/heart/turn-coordinator.js +28 -0
  157. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  158. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  159. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  160. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  161. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  162. package/dist/heart/versioning/staged-restart.js +146 -0
  163. package/dist/heart/versioning/update-checker.js +113 -0
  164. package/dist/heart/versioning/update-hooks.js +142 -0
  165. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  166. package/dist/mind/bundle-manifest.js +77 -1
  167. package/dist/mind/context.js +141 -94
  168. package/dist/mind/diary-integrity.js +60 -0
  169. package/dist/mind/{memory.js → diary.js} +84 -96
  170. package/dist/mind/embedding-provider.js +60 -0
  171. package/dist/mind/file-state.js +179 -0
  172. package/dist/mind/first-impressions.js +16 -2
  173. package/dist/mind/friends/channel.js +64 -0
  174. package/dist/mind/friends/group-context.js +144 -0
  175. package/dist/mind/friends/resolver.js +38 -1
  176. package/dist/mind/friends/store-file.js +58 -3
  177. package/dist/mind/friends/trust-explanation.js +74 -0
  178. package/dist/mind/friends/types.js +10 -2
  179. package/dist/mind/journal-index.js +161 -0
  180. package/dist/mind/note-search.js +268 -0
  181. package/dist/mind/obligation-steering.js +221 -0
  182. package/dist/mind/pending.js +76 -9
  183. package/dist/mind/phrases.js +1 -0
  184. package/dist/mind/prompt-refresh.js +3 -2
  185. package/dist/mind/prompt.js +1111 -117
  186. package/dist/mind/provenance-trust.js +26 -0
  187. package/dist/mind/scrutiny.js +173 -0
  188. package/dist/mind/token-estimate.js +8 -12
  189. package/dist/nerves/cli-logging.js +22 -3
  190. package/dist/nerves/coverage/audit-rules.js +15 -6
  191. package/dist/nerves/coverage/audit.js +28 -2
  192. package/dist/nerves/coverage/cli.js +1 -1
  193. package/dist/nerves/coverage/contract.js +5 -5
  194. package/dist/nerves/coverage/file-completeness.js +83 -5
  195. package/dist/nerves/coverage/run-artifacts.js +1 -1
  196. package/dist/nerves/event-buffer.js +111 -0
  197. package/dist/nerves/index.js +224 -4
  198. package/dist/nerves/observation.js +20 -0
  199. package/dist/nerves/redact.js +79 -0
  200. package/dist/nerves/runtime.js +5 -1
  201. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  202. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  203. package/dist/outlook-ui/index.html +15 -0
  204. package/dist/repertoire/ado-client.js +17 -56
  205. package/dist/repertoire/ado-semantic.js +11 -10
  206. package/dist/repertoire/api-client.js +97 -0
  207. package/dist/repertoire/bitwarden-store.js +461 -0
  208. package/dist/repertoire/bundle-templates.js +72 -0
  209. package/dist/repertoire/bw-installer.js +79 -0
  210. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  211. package/dist/repertoire/coding/context-pack.js +330 -0
  212. package/dist/repertoire/coding/feedback.js +301 -0
  213. package/dist/repertoire/coding/index.js +4 -1
  214. package/dist/repertoire/coding/manager.js +220 -13
  215. package/dist/repertoire/coding/spawner.js +58 -12
  216. package/dist/repertoire/coding/tools.js +209 -7
  217. package/dist/repertoire/commerce-errors.js +109 -0
  218. package/dist/repertoire/commerce-self-test.js +156 -0
  219. package/dist/repertoire/credential-access.js +107 -0
  220. package/dist/repertoire/data/ado-endpoints.json +188 -0
  221. package/dist/repertoire/duffel-client.js +185 -0
  222. package/dist/repertoire/github-client.js +14 -55
  223. package/dist/repertoire/graph-client.js +11 -52
  224. package/dist/repertoire/guardrails.js +371 -0
  225. package/dist/repertoire/mcp-client.js +255 -0
  226. package/dist/repertoire/mcp-manager.js +305 -0
  227. package/dist/repertoire/mcp-tools.js +63 -0
  228. package/dist/repertoire/shell-sessions.js +133 -0
  229. package/dist/repertoire/skills.js +15 -24
  230. package/dist/repertoire/stripe-client.js +131 -0
  231. package/dist/repertoire/tasks/board.js +43 -5
  232. package/dist/repertoire/tasks/fix.js +182 -0
  233. package/dist/repertoire/tasks/index.js +28 -10
  234. package/dist/repertoire/tasks/lifecycle.js +2 -2
  235. package/dist/repertoire/tasks/parser.js +3 -2
  236. package/dist/repertoire/tasks/scanner.js +194 -37
  237. package/dist/repertoire/tasks/transitions.js +16 -79
  238. package/dist/repertoire/tool-results.js +29 -0
  239. package/dist/repertoire/tools-attachments.js +317 -0
  240. package/dist/repertoire/tools-base.js +45 -707
  241. package/dist/repertoire/tools-bluebubbles.js +94 -0
  242. package/dist/repertoire/tools-bridge.js +141 -0
  243. package/dist/repertoire/tools-bundle.js +984 -0
  244. package/dist/repertoire/tools-config.js +185 -0
  245. package/dist/repertoire/tools-continuity.js +248 -0
  246. package/dist/repertoire/tools-credential.js +182 -0
  247. package/dist/repertoire/tools-files.js +342 -0
  248. package/dist/repertoire/tools-flight.js +224 -0
  249. package/dist/repertoire/tools-flow.js +105 -0
  250. package/dist/repertoire/tools-github.js +1 -7
  251. package/dist/repertoire/tools-notes.js +376 -0
  252. package/dist/repertoire/tools-session.js +739 -0
  253. package/dist/repertoire/tools-shell.js +120 -0
  254. package/dist/repertoire/tools-stripe.js +180 -0
  255. package/dist/repertoire/tools-surface.js +243 -0
  256. package/dist/repertoire/tools-teams.js +64 -61
  257. package/dist/repertoire/tools-travel.js +125 -0
  258. package/dist/repertoire/tools-user-profile.js +144 -0
  259. package/dist/repertoire/tools-vault.js +40 -0
  260. package/dist/repertoire/tools.js +149 -98
  261. package/dist/repertoire/travel-api-client.js +360 -0
  262. package/dist/repertoire/user-profile.js +118 -0
  263. package/dist/repertoire/vault-setup.js +246 -0
  264. package/dist/repertoire/vault-unlock.js +382 -0
  265. package/dist/scripts/claude-code-hook.js +41 -0
  266. package/dist/scripts/claude-code-stop-hook.js +47 -0
  267. package/dist/senses/attention-queue.js +116 -0
  268. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  269. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  270. package/dist/senses/bluebubbles/client.js +685 -0
  271. package/dist/senses/bluebubbles/entry.js +70 -0
  272. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  273. package/dist/senses/bluebubbles/index.js +1620 -0
  274. package/dist/senses/bluebubbles/media.js +389 -0
  275. package/dist/senses/bluebubbles/model.js +282 -0
  276. package/dist/senses/bluebubbles/mutation-log.js +116 -0
  277. package/dist/senses/bluebubbles/replay.js +129 -0
  278. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  279. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  280. package/dist/senses/cli/bracketed-paste.js +82 -0
  281. package/dist/senses/cli/image-paste.js +287 -0
  282. package/dist/senses/cli/image-ref-navigation.js +75 -0
  283. package/dist/senses/cli/ink-app.js +156 -0
  284. package/dist/senses/cli/inline-diff.js +64 -0
  285. package/dist/senses/cli/input-keys.js +174 -0
  286. package/dist/senses/cli/kill-ring.js +86 -0
  287. package/dist/senses/cli/message-list.js +51 -0
  288. package/dist/senses/cli/ouro-tui.js +605 -0
  289. package/dist/senses/cli/spinner-imperative.js +135 -0
  290. package/dist/senses/cli/spinner.js +101 -0
  291. package/dist/senses/cli/status-line.js +60 -0
  292. package/dist/senses/cli/streaming-markdown.js +526 -0
  293. package/dist/senses/cli/tool-display.js +83 -0
  294. package/dist/senses/cli/tool-render.js +85 -0
  295. package/dist/senses/cli/tui-store.js +240 -0
  296. package/dist/senses/cli/virtual-list.js +35 -0
  297. package/dist/senses/cli-entry.js +60 -8
  298. package/dist/senses/cli-layout.js +187 -0
  299. package/dist/senses/cli.js +768 -264
  300. package/dist/senses/commands.js +66 -3
  301. package/dist/senses/continuity.js +94 -0
  302. package/dist/senses/habit-turn-message.js +108 -0
  303. package/dist/senses/inner-dialog-worker.js +112 -19
  304. package/dist/senses/inner-dialog.js +636 -86
  305. package/dist/senses/pipeline.js +602 -0
  306. package/dist/senses/proactive-content-guard.js +51 -0
  307. package/dist/senses/shared-turn.js +205 -0
  308. package/dist/senses/surface-tool.js +68 -0
  309. package/dist/senses/teams-entry.js +60 -8
  310. package/dist/senses/teams.js +844 -197
  311. package/dist/senses/trust-gate.js +112 -2
  312. package/package.json +38 -6
  313. package/skills/agent-commerce.md +106 -0
  314. package/skills/browser-navigation.md +110 -0
  315. package/skills/commerce-setup-guide.md +116 -0
  316. package/skills/commerce-setup.md +84 -0
  317. package/skills/configure-dev-tools.md +101 -0
  318. package/skills/travel-planning.md +134 -0
  319. package/AdoptionSpecialist.ouro/agent.json +0 -20
  320. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  321. package/dist/heart/daemon/subagent-installer.js +0 -125
  322. package/dist/inner-worker-entry.js +0 -4
  323. package/dist/mind/associative-recall.js +0 -197
  324. package/subagents/README.md +0 -73
  325. package/subagents/work-doer.md +0 -233
  326. package/subagents/work-merger.md +0 -624
  327. package/subagents/work-planner.md +0 -373
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  329. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  330. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  331. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  332. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  333. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  334. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  335. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  336. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  337. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  338. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
@@ -0,0 +1,371 @@
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.HabitScheduler = void 0;
37
+ const path = __importStar(require("path"));
38
+ const runtime_1 = require("../../nerves/runtime");
39
+ const habit_parser_1 = require("./habit-parser");
40
+ const cadence_1 = require("../daemon/cadence");
41
+ const WATCH_DEBOUNCE_MS = 200;
42
+ class HabitScheduler {
43
+ agent;
44
+ habitsDir;
45
+ osCronManager;
46
+ onHabitFire;
47
+ deps;
48
+ execForVerify;
49
+ platform;
50
+ watcher = null;
51
+ debounceTimer = null;
52
+ parseErrors = [];
53
+ timerFallbacks = new Map();
54
+ degradedHabitNames = new Map();
55
+ periodicTimer = null;
56
+ constructor(options) {
57
+ this.agent = options.agent;
58
+ this.habitsDir = options.habitsDir;
59
+ this.osCronManager = options.osCronManager;
60
+ this.onHabitFire = options.onHabitFire;
61
+ this.deps = options.deps;
62
+ this.execForVerify = options.execForVerify;
63
+ this.platform = options.platform ?? process.platform;
64
+ }
65
+ start() {
66
+ (0, runtime_1.emitNervesEvent)({
67
+ component: "daemon",
68
+ event: "daemon.habit_scheduler_start",
69
+ message: "habit scheduler starting",
70
+ meta: { agent: this.agent, habitsDir: this.habitsDir },
71
+ });
72
+ const habits = this.scanHabits();
73
+ const jobs = this.buildJobs(habits);
74
+ this.osCronManager.sync(jobs);
75
+ this.verifyCronAndCreateFallbacks(jobs);
76
+ this.fireOverdueHabits(habits);
77
+ }
78
+ reconcile() {
79
+ (0, runtime_1.emitNervesEvent)({
80
+ component: "daemon",
81
+ event: "daemon.habit_scheduler_reconcile",
82
+ message: "habit scheduler reconciling",
83
+ meta: { agent: this.agent },
84
+ });
85
+ // Clear ALL existing timers FIRST to prevent overlap window
86
+ this.clearAllTimerFallbacks();
87
+ const habits = this.scanHabits();
88
+ const jobs = this.buildJobs(habits);
89
+ this.osCronManager.sync(jobs);
90
+ this.verifyCronAndCreateFallbacks(jobs);
91
+ this.fireOverdueHabits(habits);
92
+ }
93
+ fireOverdueHabits(habits) {
94
+ for (const habit of habits) {
95
+ if (habit.status !== "active")
96
+ continue;
97
+ if (!habit.cadence)
98
+ continue;
99
+ const cadenceMs = (0, cadence_1.parseCadenceToMs)(habit.cadence);
100
+ if (cadenceMs === null)
101
+ continue;
102
+ const nowMs = this.deps.now();
103
+ if (habit.lastRun === null) {
104
+ (0, runtime_1.emitNervesEvent)({
105
+ component: "daemon",
106
+ event: "daemon.habit_fire",
107
+ message: "firing overdue habit (never run)",
108
+ meta: { habitName: habit.name, agent: this.agent },
109
+ });
110
+ this.onHabitFire(habit.name);
111
+ continue;
112
+ }
113
+ const lastRunMs = new Date(habit.lastRun).getTime();
114
+ const elapsed = nowMs - lastRunMs;
115
+ if (elapsed >= cadenceMs) {
116
+ (0, runtime_1.emitNervesEvent)({
117
+ component: "daemon",
118
+ event: "daemon.habit_fire",
119
+ message: "firing overdue habit",
120
+ meta: { habitName: habit.name, agent: this.agent, elapsedMs: elapsed },
121
+ });
122
+ this.onHabitFire(habit.name);
123
+ }
124
+ }
125
+ }
126
+ stop() {
127
+ // `_end` (not `_stop`) to pair with `daemon.habit_scheduler_start`
128
+ // under the nerves audit start/end pairing rule.
129
+ (0, runtime_1.emitNervesEvent)({
130
+ component: "daemon",
131
+ event: "daemon.habit_scheduler_end",
132
+ message: "habit scheduler stopping",
133
+ meta: { agent: this.agent },
134
+ });
135
+ this.stopPeriodicReconciliation();
136
+ this.clearAllTimerFallbacks();
137
+ this.osCronManager.removeAll();
138
+ }
139
+ listOverdueHabits() {
140
+ const habits = this.scanHabits();
141
+ const nowMs = this.deps.now();
142
+ const overdue = [];
143
+ for (const habit of habits) {
144
+ if (habit.status !== "active")
145
+ continue;
146
+ if (!habit.cadence)
147
+ continue;
148
+ const cadenceMs = (0, cadence_1.parseCadenceToMs)(habit.cadence);
149
+ if (cadenceMs === null)
150
+ continue;
151
+ if (habit.lastRun === null) {
152
+ overdue.push({ name: habit.name, elapsedMs: Infinity });
153
+ continue;
154
+ }
155
+ const lastRunMs = new Date(habit.lastRun).getTime();
156
+ const elapsed = nowMs - lastRunMs;
157
+ if (elapsed >= cadenceMs) {
158
+ overdue.push({ name: habit.name, elapsedMs: elapsed });
159
+ }
160
+ }
161
+ return overdue;
162
+ }
163
+ getParseErrors() {
164
+ return [...this.parseErrors];
165
+ }
166
+ getHabitFile(name) {
167
+ const filePath = path.join(this.habitsDir, `${name}.md`);
168
+ try {
169
+ const content = this.deps.readFile(filePath, "utf-8");
170
+ return (0, habit_parser_1.parseHabitFile)(content, filePath);
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ watchForChanges() {
177
+ const watchFn = this.deps.watch;
178
+ if (!watchFn)
179
+ return;
180
+ // Ensure habits directory exists before watching — agents may not have one yet
181
+ try {
182
+ this.watcher = watchFn(this.habitsDir, (_event, _filename) => {
183
+ if (this.debounceTimer !== null) {
184
+ clearTimeout(this.debounceTimer);
185
+ }
186
+ this.debounceTimer = setTimeout(() => {
187
+ this.debounceTimer = null;
188
+ this.reconcile();
189
+ }, WATCH_DEBOUNCE_MS);
190
+ });
191
+ /* v8 ignore start — ENOENT catch requires real missing directory @preserve */
192
+ }
193
+ catch {
194
+ // habits directory may not exist for all agents — skip watching silently
195
+ }
196
+ /* v8 ignore stop */
197
+ }
198
+ stopWatching() {
199
+ if (this.debounceTimer !== null) {
200
+ clearTimeout(this.debounceTimer);
201
+ this.debounceTimer = null;
202
+ }
203
+ if (this.watcher !== null) {
204
+ this.watcher.close();
205
+ this.watcher = null;
206
+ }
207
+ }
208
+ getDegradedHabits() {
209
+ const result = [];
210
+ for (const [name, reason] of this.degradedHabitNames) {
211
+ result.push({ name, reason });
212
+ }
213
+ return result;
214
+ }
215
+ static DEFAULT_PERIODIC_INTERVAL_MS = 300_000; // 5 minutes
216
+ static INITIAL_RECONCILIATION_DELAY_MS = 30_000; // 30 seconds
217
+ startPeriodicReconciliation(intervalMs) {
218
+ const interval = intervalMs ?? HabitScheduler.DEFAULT_PERIODIC_INTERVAL_MS;
219
+ // First reconciliation after a short delay (30s)
220
+ this.periodicTimer = setTimeout(() => {
221
+ this.reconcile();
222
+ this.scheduleNextReconciliation(interval);
223
+ }, HabitScheduler.INITIAL_RECONCILIATION_DELAY_MS);
224
+ }
225
+ stopPeriodicReconciliation() {
226
+ if (this.periodicTimer !== null) {
227
+ clearTimeout(this.periodicTimer);
228
+ this.periodicTimer = null;
229
+ }
230
+ }
231
+ scheduleNextReconciliation(intervalMs) {
232
+ this.periodicTimer = setTimeout(() => {
233
+ this.reconcile();
234
+ this.scheduleNextReconciliation(intervalMs);
235
+ }, intervalMs);
236
+ }
237
+ verifyCronAndCreateFallbacks(jobs) {
238
+ if (!this.execForVerify)
239
+ return;
240
+ const verifiedLabels = this.verifyCronEntries();
241
+ for (const job of jobs) {
242
+ const label = `bot.ouro.${job.agent}.${job.taskId}`;
243
+ const isVerified = this.platform === "darwin"
244
+ ? verifiedLabels.has(label)
245
+ : verifiedLabels.has(job.taskId);
246
+ if (!isVerified) {
247
+ (0, runtime_1.emitNervesEvent)({
248
+ component: "daemon",
249
+ event: "daemon.habit_cron_verification_failed",
250
+ message: `cron verification failed for habit: ${job.taskId}`,
251
+ meta: { habitName: job.taskId, agent: job.agent, label },
252
+ });
253
+ // Parse cadence from the original habit file for timer interval
254
+ const habitFile = this.getHabitFile(job.taskId);
255
+ const ms = habitFile?.cadence ? (0, cadence_1.parseCadenceToMs)(habitFile.cadence) : null;
256
+ if (ms !== null) {
257
+ this.createTimerFallback(job.taskId, ms);
258
+ }
259
+ this.degradedHabitNames.set(job.taskId, "cron registration failed — using timer fallback");
260
+ }
261
+ }
262
+ }
263
+ verifyCronEntries() {
264
+ const verified = new Set();
265
+ try {
266
+ if (this.platform === "darwin") {
267
+ const output = this.execForVerify("launchctl list");
268
+ const lines = output.split("\n");
269
+ for (const line of lines) {
270
+ const match = line.match(/bot\.ouro\.\S+\.\S+/);
271
+ if (match) {
272
+ verified.add(match[0]);
273
+ }
274
+ }
275
+ }
276
+ else {
277
+ const output = this.execForVerify("crontab -l");
278
+ const lines = output.split("\n");
279
+ for (const line of lines) {
280
+ const match = line.match(/ouro poke \S+ --habit (\S+)/);
281
+ if (match) {
282
+ verified.add(match[1]);
283
+ }
284
+ }
285
+ }
286
+ }
287
+ catch {
288
+ // Verification command failed — return empty set (all habits unverified)
289
+ }
290
+ return verified;
291
+ }
292
+ createTimerFallback(habitName, cadenceMs) {
293
+ const schedule = () => {
294
+ const timer = setTimeout(() => {
295
+ this.onHabitFire(habitName);
296
+ schedule();
297
+ }, cadenceMs);
298
+ this.timerFallbacks.set(habitName, timer);
299
+ };
300
+ schedule();
301
+ }
302
+ clearAllTimerFallbacks() {
303
+ for (const timer of this.timerFallbacks.values()) {
304
+ clearTimeout(timer);
305
+ }
306
+ this.timerFallbacks.clear();
307
+ this.degradedHabitNames.clear();
308
+ }
309
+ scanHabits() {
310
+ let files;
311
+ try {
312
+ files = this.deps.readdir(this.habitsDir);
313
+ }
314
+ catch {
315
+ this.parseErrors = [];
316
+ return [];
317
+ }
318
+ const habits = [];
319
+ const errors = [];
320
+ for (const file of files) {
321
+ if (!file.endsWith(".md"))
322
+ continue;
323
+ const filePath = path.join(this.habitsDir, file);
324
+ try {
325
+ const content = this.deps.readFile(filePath, "utf-8");
326
+ const habit = (0, habit_parser_1.parseHabitFile)(content, filePath);
327
+ habits.push(habit);
328
+ }
329
+ catch (error) {
330
+ const errorMessage = error instanceof Error ? error.message : String(error);
331
+ errors.push({ file, error: errorMessage });
332
+ (0, runtime_1.emitNervesEvent)({
333
+ level: "error",
334
+ component: "daemon",
335
+ event: "daemon.habit_parse_error",
336
+ message: "failed to parse habit file",
337
+ meta: {
338
+ file,
339
+ error: errorMessage,
340
+ agent: this.agent,
341
+ },
342
+ });
343
+ }
344
+ }
345
+ this.parseErrors = errors;
346
+ return habits;
347
+ }
348
+ buildJobs(habits) {
349
+ const jobs = [];
350
+ for (const habit of habits) {
351
+ if (habit.status !== "active")
352
+ continue;
353
+ if (!habit.cadence)
354
+ continue;
355
+ const cronSchedule = (0, cadence_1.parseCadenceToCron)(habit.cadence);
356
+ if (cronSchedule === null)
357
+ continue;
358
+ jobs.push({
359
+ id: `${this.agent}:${habit.name}:cadence`,
360
+ agent: this.agent,
361
+ taskId: habit.name,
362
+ schedule: cronSchedule,
363
+ lastRun: habit.lastRun,
364
+ command: `${this.deps.ouroPath} poke ${this.agent} --habit ${habit.name}`,
365
+ taskPath: path.join(this.habitsDir, `${habit.name}.md`),
366
+ });
367
+ }
368
+ return jobs;
369
+ }
370
+ }
371
+ exports.HabitScheduler = HabitScheduler;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.playHatchAnimation = playHatchAnimation;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ const EGG = "\uD83E\uDD5A";
6
+ const SNAKE = "\uD83D\uDC0D";
7
+ const DOTS = " . . . ";
8
+ function wait(ms) {
9
+ return new Promise((resolve) => setTimeout(resolve, ms));
10
+ }
11
+ /**
12
+ * Play the hatch animation: egg -> dots -> snake + name.
13
+ * The writer function receives each chunk. Default writer is process.stderr.write.
14
+ */
15
+ async function playHatchAnimation(hatchlingName, writer) {
16
+ (0, runtime_1.emitNervesEvent)({
17
+ component: "daemon",
18
+ event: "daemon.hatch_animation_start",
19
+ message: "playing hatch animation",
20
+ meta: { hatchlingName },
21
+ });
22
+ const write = writer ?? ((text) => process.stderr.write(text));
23
+ // Total animation time randomized between 3–5 seconds
24
+ const totalMs = 3000 + Math.floor(Math.random() * 2000);
25
+ const eggPhase = Math.floor(totalMs * 0.4);
26
+ const dotsPhase = Math.floor(totalMs * 0.4);
27
+ const revealPause = totalMs - eggPhase - dotsPhase;
28
+ write(`\n ${EGG}`);
29
+ await wait(eggPhase);
30
+ write(DOTS);
31
+ await wait(dotsPhase);
32
+ write(`${SNAKE} \x1b[1m${hatchlingName}\x1b[0m`);
33
+ await wait(revealPause);
34
+ write("\n\n");
35
+ }
@@ -33,21 +33,23 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.storeHatchlingProviderCredentials = storeHatchlingProviderCredentials;
36
37
  exports.runHatchFlow = runHatchFlow;
37
38
  const fs = __importStar(require("fs"));
38
39
  const os = __importStar(require("os"));
39
40
  const path = __importStar(require("path"));
40
41
  const identity_1 = require("../identity");
42
+ const config_1 = require("../config");
41
43
  const runtime_1 = require("../../nerves/runtime");
44
+ const auth_flow_1 = require("../auth/auth-flow");
45
+ const provider_models_1 = require("../provider-models");
46
+ const habit_parser_1 = require("../habits/habit-parser");
47
+ const machine_identity_1 = require("../machine-identity");
48
+ const provider_credentials_1 = require("../provider-credentials");
49
+ const provider_state_1 = require("../provider-state");
42
50
  const hatch_specialist_1 = require("./hatch-specialist");
43
51
  function requiredCredentialKeys(provider) {
44
- if (provider === "anthropic")
45
- return ["setupToken"];
46
- if (provider === "openai-codex")
47
- return ["oauthAccessToken"];
48
- if (provider === "minimax")
49
- return ["apiKey"];
50
- return ["apiKey", "endpoint", "deployment"];
52
+ return identity_1.PROVIDER_CREDENTIALS[provider].required;
51
53
  }
52
54
  function validateCredentials(provider, credentials) {
53
55
  const missing = requiredCredentialKeys(provider).filter((key) => {
@@ -65,70 +67,8 @@ function validateCredentials(provider, credentials) {
65
67
  throw new Error(`Missing required credentials for ${provider}: ${missing.join(", ")}`);
66
68
  }
67
69
  }
68
- function buildSecretsTemplate() {
69
- return {
70
- providers: {
71
- azure: {
72
- modelName: "gpt-4o-mini",
73
- apiKey: "",
74
- endpoint: "",
75
- deployment: "",
76
- apiVersion: "2025-04-01-preview",
77
- },
78
- minimax: {
79
- model: "minimax-text-01",
80
- apiKey: "",
81
- },
82
- anthropic: {
83
- model: "claude-opus-4-6",
84
- setupToken: "",
85
- },
86
- "openai-codex": {
87
- model: "gpt-5.2",
88
- oauthAccessToken: "",
89
- },
90
- },
91
- teams: {
92
- clientId: "",
93
- clientSecret: "",
94
- tenantId: "",
95
- },
96
- oauth: {
97
- graphConnectionName: "graph",
98
- adoConnectionName: "ado",
99
- githubConnectionName: "",
100
- },
101
- teamsChannel: {
102
- skipConfirmation: true,
103
- port: 3978,
104
- },
105
- integrations: {
106
- perplexityApiKey: "",
107
- openaiEmbeddingsApiKey: "",
108
- },
109
- };
110
- }
111
- function writeSecretsFile(agentName, provider, credentials, secretsRoot) {
112
- const secrets = buildSecretsTemplate();
113
- if (provider === "anthropic") {
114
- secrets.providers.anthropic.setupToken = credentials.setupToken.trim();
115
- }
116
- else if (provider === "openai-codex") {
117
- secrets.providers["openai-codex"].oauthAccessToken = credentials.oauthAccessToken.trim();
118
- }
119
- else if (provider === "minimax") {
120
- secrets.providers.minimax.apiKey = credentials.apiKey.trim();
121
- }
122
- else {
123
- secrets.providers.azure.apiKey = credentials.apiKey.trim();
124
- secrets.providers.azure.endpoint = credentials.endpoint.trim();
125
- secrets.providers.azure.deployment = credentials.deployment.trim();
126
- }
127
- const secretsDir = path.join(secretsRoot, agentName);
128
- fs.mkdirSync(secretsDir, { recursive: true });
129
- const secretsPath = path.join(secretsDir, "secrets.json");
130
- fs.writeFileSync(secretsPath, `${JSON.stringify(secrets, null, 2)}\n`, "utf-8");
131
- return secretsPath;
70
+ async function storeHatchlingProviderCredentials(agentName, provider, credentials) {
71
+ return (await (0, auth_flow_1.storeProviderCredentials)(agentName, provider, credentials)).credentialPath;
132
72
  }
133
73
  function writeReadme(dir, purpose) {
134
74
  fs.mkdirSync(dir, { recursive: true });
@@ -137,52 +77,25 @@ function writeReadme(dir, purpose) {
137
77
  fs.writeFileSync(readmePath, `# ${path.basename(dir)}\n\n${purpose}\n`, "utf-8");
138
78
  }
139
79
  }
140
- function slugify(value) {
141
- const trimmed = value.trim().toLowerCase();
142
- const slug = trimmed
143
- .replace(/[^a-z0-9]+/g, "-")
144
- .replace(/^-+/, "")
145
- .replace(/-+$/, "");
146
- return slug || "friend";
147
- }
148
- function pad(value) {
149
- return String(value).padStart(2, "0");
150
- }
151
- function formatTaskStem(now) {
152
- return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}`;
153
- }
154
- function writeHeartbeatTask(bundleRoot, now) {
155
- const habitsDir = path.join(bundleRoot, "tasks", "habits");
80
+ function writeHeartbeatHabit(bundleRoot, now) {
81
+ const habitsDir = path.join(bundleRoot, "habits");
156
82
  fs.mkdirSync(habitsDir, { recursive: true });
157
- const stem = formatTaskStem(now);
158
- const filePath = path.join(habitsDir, `${stem}-heartbeat.md`);
159
- const iso = now.toISOString();
160
- const content = [
161
- "---",
162
- "type: habit",
163
- "category: runtime",
164
- "title: Heartbeat check-in",
165
- "status: processing",
166
- `created: ${iso}`,
167
- `updated: ${iso}`,
168
- "requester: system",
169
- "validator: null",
170
- "cadence: \"30m\"",
171
- "scheduledAt: null",
172
- "lastRun: null",
173
- "---",
174
- "",
175
- "Run a lightweight heartbeat cycle. Review task board and inbox.",
176
- "",
177
- ].join("\n");
83
+ const filePath = path.join(habitsDir, "heartbeat.md");
84
+ const content = (0, habit_parser_1.renderHabitFile)({
85
+ title: "Heartbeat check-in",
86
+ cadence: "30m",
87
+ status: "active",
88
+ lastRun: "null",
89
+ created: now.toISOString(),
90
+ }, "Run a lightweight heartbeat cycle. Review task board and inbox.\nCheck on pending obligations. Journal anything important.");
178
91
  fs.writeFileSync(filePath, content, "utf-8");
179
92
  }
180
93
  function writeFriendImprint(bundleRoot, humanName, now) {
181
94
  const friendsDir = path.join(bundleRoot, "friends");
182
95
  fs.mkdirSync(friendsDir, { recursive: true });
183
96
  const nowIso = now.toISOString();
184
- const id = `friend-${slugify(humanName)}`;
185
- const localExternalId = `${os.userInfo().username}@${os.hostname()}`;
97
+ const id = `friend-${(0, config_1.slugify)(humanName) || "friend"}`;
98
+ const localExternalId = os.userInfo().username;
186
99
  const record = {
187
100
  id,
188
101
  name: humanName,
@@ -206,28 +119,38 @@ function writeFriendImprint(bundleRoot, humanName, now) {
206
119
  };
207
120
  fs.writeFileSync(path.join(friendsDir, `${id}.json`), `${JSON.stringify(record, null, 2)}\n`, "utf-8");
208
121
  }
209
- function writeHatchlingPsyche(bundleRoot, input, identityFileName) {
210
- const psycheDir = path.join(bundleRoot, "psyche");
211
- fs.mkdirSync(psycheDir, { recursive: true });
212
- fs.writeFileSync(path.join(psycheDir, "SOUL.md"), "# SOUL\n\nI am a practical, collaborative agent. I keep commitments and communicate clearly.\n", "utf-8");
213
- fs.writeFileSync(path.join(psycheDir, "IDENTITY.md"), `# IDENTITY\n\nI'm ${input.agentName}, newly hatched and ready to help ${input.humanName}.`, "utf-8");
214
- fs.writeFileSync(path.join(psycheDir, "LORE.md"), `# LORE\n\nHatched with specialist identity seed: ${identityFileName}.`, "utf-8");
215
- fs.writeFileSync(path.join(psycheDir, "TACIT.md"), "# TACIT\n\n- Save what I learn.\n- Keep tasks current.\n", "utf-8");
216
- fs.writeFileSync(path.join(psycheDir, "ASPIRATIONS.md"), "# ASPIRATIONS\n\n- Become a reliable partner for my primary friend.\n", "utf-8");
217
- }
218
- function writeMemoryScaffold(bundleRoot) {
219
- const memoryRoot = path.join(bundleRoot, "psyche", "memory");
220
- fs.mkdirSync(path.join(memoryRoot, "daily"), { recursive: true });
221
- fs.mkdirSync(path.join(memoryRoot, "archive"), { recursive: true });
222
- fs.writeFileSync(path.join(memoryRoot, "facts.jsonl"), "", "utf-8");
223
- fs.writeFileSync(path.join(memoryRoot, "entities.json"), "{}\n", "utf-8");
122
+ function writeDiaryScaffold(bundleRoot) {
123
+ const diaryRoot = path.join(bundleRoot, "diary");
124
+ fs.mkdirSync(path.join(diaryRoot, "daily"), { recursive: true });
125
+ fs.mkdirSync(path.join(diaryRoot, "archive"), { recursive: true });
126
+ fs.writeFileSync(path.join(diaryRoot, "facts.jsonl"), "", "utf-8");
127
+ fs.writeFileSync(path.join(diaryRoot, "entities.json"), "{}\n", "utf-8");
224
128
  }
225
129
  function writeHatchlingAgentConfig(bundleRoot, input) {
226
130
  const template = (0, identity_1.buildDefaultAgentTemplate)(input.agentName);
131
+ const model = (0, provider_models_1.getDefaultModelForProvider)(input.provider);
227
132
  template.provider = input.provider;
133
+ template.humanFacing = { provider: input.provider, model };
134
+ template.agentFacing = { provider: input.provider, model };
228
135
  template.enabled = true;
229
136
  fs.writeFileSync(path.join(bundleRoot, "agent.json"), `${JSON.stringify(template, null, 2)}\n`, "utf-8");
230
137
  }
138
+ function writeHatchlingProviderState(bundleRoot, input, now) {
139
+ const model = (0, provider_models_1.getDefaultModelForProvider)(input.provider);
140
+ const machine = (0, machine_identity_1.loadOrCreateMachineIdentity)({
141
+ homeDir: (0, provider_credentials_1.providerCredentialMachineHomeDir)(),
142
+ now: () => now,
143
+ });
144
+ const state = (0, provider_state_1.bootstrapProviderStateFromAgentConfig)({
145
+ machineId: machine.machineId,
146
+ now,
147
+ agentConfig: {
148
+ humanFacing: { provider: input.provider, model },
149
+ agentFacing: { provider: input.provider, model },
150
+ },
151
+ });
152
+ (0, provider_state_1.writeProviderState)(bundleRoot, state);
153
+ }
231
154
  async function runHatchFlow(input, deps = {}) {
232
155
  (0, runtime_1.emitNervesEvent)({
233
156
  component: "daemon",
@@ -237,7 +160,6 @@ async function runHatchFlow(input, deps = {}) {
237
160
  });
238
161
  validateCredentials(input.provider, input.credentials);
239
162
  const bundlesRoot = deps.bundlesRoot ?? path.join(os.homedir(), "AgentBundles");
240
- const secretsRoot = deps.secretsRoot ?? path.join(os.homedir(), ".agentsecrets");
241
163
  const sourceIdentities = deps.specialistIdentitySourceDir ?? (0, hatch_specialist_1.getSpecialistIdentitySourceDir)();
242
164
  const targetIdentities = deps.specialistIdentityTargetDir ?? (0, hatch_specialist_1.getRepoSpecialistIdentitiesDir)();
243
165
  const now = deps.now ? deps.now() : new Date();
@@ -250,26 +172,25 @@ async function runHatchFlow(input, deps = {}) {
250
172
  identitiesDir: targetIdentities,
251
173
  random,
252
174
  });
253
- const specialistSecretsPath = writeSecretsFile("AdoptionSpecialist", input.provider, input.credentials, secretsRoot);
254
- const hatchlingSecretsPath = writeSecretsFile(input.agentName, input.provider, input.credentials, secretsRoot);
255
175
  const bundleRoot = path.join(bundlesRoot, `${input.agentName}.ouro`);
256
176
  fs.mkdirSync(bundleRoot, { recursive: true });
257
177
  writeReadme(bundleRoot, "Root of this agent bundle.");
258
178
  writeReadme(path.join(bundleRoot, "psyche"), "Identity and behavior files.");
259
- writeReadme(path.join(bundleRoot, "psyche", "memory"), "Persistent memory store.");
179
+ writeReadme(path.join(bundleRoot, "diary"), "Persistent diary -- things I have learned and chosen to keep.");
260
180
  writeReadme(path.join(bundleRoot, "friends"), "Known friend records.");
261
181
  writeReadme(path.join(bundleRoot, "tasks"), "Task files.");
262
- writeReadme(path.join(bundleRoot, "tasks", "habits"), "Recurring tasks.");
263
182
  writeReadme(path.join(bundleRoot, "tasks", "one-shots"), "One-shot tasks.");
264
183
  writeReadme(path.join(bundleRoot, "tasks", "ongoing"), "Ongoing tasks.");
184
+ writeReadme(path.join(bundleRoot, "habits"), "Recurring habits and autonomous rhythms.");
265
185
  writeReadme(path.join(bundleRoot, "skills"), "Local skill files.");
266
186
  writeReadme(path.join(bundleRoot, "senses"), "Sense-specific config.");
267
187
  writeReadme(path.join(bundleRoot, "senses", "teams"), "Teams sense config.");
268
188
  writeHatchlingAgentConfig(bundleRoot, input);
269
- writeHatchlingPsyche(bundleRoot, input, selected.fileName);
270
- writeMemoryScaffold(bundleRoot);
189
+ const credentialPath = await storeHatchlingProviderCredentials(input.agentName, input.provider, input.credentials);
190
+ writeHatchlingProviderState(bundleRoot, input, now);
191
+ writeDiaryScaffold(bundleRoot);
271
192
  writeFriendImprint(bundleRoot, input.humanName, now);
272
- writeHeartbeatTask(bundleRoot, now);
193
+ writeHeartbeatHabit(bundleRoot, now);
273
194
  (0, runtime_1.emitNervesEvent)({
274
195
  component: "daemon",
275
196
  event: "daemon.hatch_flow_end",
@@ -279,7 +200,6 @@ async function runHatchFlow(input, deps = {}) {
279
200
  return {
280
201
  bundleRoot,
281
202
  selectedIdentity: selected.fileName,
282
- specialistSecretsPath,
283
- hatchlingSecretsPath,
203
+ credentialPath,
284
204
  };
285
205
  }