@ouro.bot/cli 0.1.0-alpha.5 → 0.1.0-alpha.500

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 (380) hide show
  1. package/README.md +226 -183
  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 +3418 -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 +989 -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 +426 -0
  30. package/dist/heart/background-operations.js +281 -0
  31. package/dist/heart/bridges/manager.js +358 -0
  32. package/dist/heart/bridges/state-machine.js +135 -0
  33. package/dist/heart/bridges/store.js +123 -0
  34. package/dist/heart/bundle-state.js +168 -0
  35. package/dist/heart/commitments.js +111 -0
  36. package/dist/heart/config-registry.js +304 -0
  37. package/dist/heart/config.js +193 -130
  38. package/dist/heart/core.js +1010 -261
  39. package/dist/heart/cross-chat-delivery.js +131 -0
  40. package/dist/heart/daemon/agent-config-check.js +490 -0
  41. package/dist/heart/daemon/agent-discovery.js +157 -0
  42. package/dist/heart/daemon/agent-service.js +360 -0
  43. package/dist/heart/daemon/agentic-repair.js +216 -0
  44. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  45. package/dist/heart/daemon/cadence.js +70 -0
  46. package/dist/heart/daemon/cli-defaults.js +640 -0
  47. package/dist/heart/daemon/cli-exec.js +7239 -0
  48. package/dist/heart/daemon/cli-help.js +493 -0
  49. package/dist/heart/daemon/cli-parse.js +1533 -0
  50. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  51. package/dist/heart/daemon/cli-render.js +561 -0
  52. package/dist/heart/daemon/cli-types.js +8 -0
  53. package/dist/heart/daemon/connect-bay.js +323 -0
  54. package/dist/heart/daemon/daemon-cli.js +30 -697
  55. package/dist/heart/daemon/daemon-entry.js +359 -8
  56. package/dist/heart/daemon/daemon-health.js +141 -0
  57. package/dist/heart/daemon/daemon-runtime-sync.js +268 -0
  58. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  59. package/dist/heart/daemon/daemon.js +813 -19
  60. package/dist/heart/daemon/dns-workflow.js +394 -0
  61. package/dist/heart/daemon/doctor-types.js +8 -0
  62. package/dist/heart/daemon/doctor.js +615 -0
  63. package/dist/heart/daemon/health-monitor.js +92 -1
  64. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  65. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  66. package/dist/heart/daemon/http-health-probe.js +80 -0
  67. package/dist/heart/daemon/human-command-screens.js +234 -0
  68. package/dist/heart/daemon/human-readiness.js +114 -0
  69. package/dist/heart/daemon/inner-status.js +89 -0
  70. package/dist/heart/daemon/interactive-repair.js +394 -0
  71. package/dist/heart/daemon/launchd.js +171 -0
  72. package/dist/heart/daemon/log-tailer.js +82 -12
  73. package/dist/heart/daemon/logs-prune.js +110 -0
  74. package/dist/heart/daemon/message-router.js +17 -8
  75. package/dist/heart/daemon/os-cron-deps.js +134 -0
  76. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  77. package/dist/heart/daemon/ouro-entry.js +3 -1
  78. package/dist/heart/daemon/process-manager.js +215 -1
  79. package/dist/heart/daemon/provider-discovery.js +137 -0
  80. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  81. package/dist/heart/daemon/pulse.js +475 -0
  82. package/dist/heart/daemon/readiness-repair.js +365 -0
  83. package/dist/heart/daemon/run-hooks.js +39 -0
  84. package/dist/heart/daemon/runtime-logging.js +67 -16
  85. package/dist/heart/daemon/runtime-metadata.js +191 -0
  86. package/dist/heart/daemon/runtime-mode.js +67 -0
  87. package/dist/heart/daemon/safe-mode.js +161 -0
  88. package/dist/heart/daemon/sense-manager.js +431 -0
  89. package/dist/heart/daemon/session-id-resolver.js +131 -0
  90. package/dist/heart/daemon/skill-management-installer.js +94 -0
  91. package/dist/heart/daemon/socket-client.js +307 -0
  92. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  93. package/dist/heart/daemon/startup-tui.js +264 -0
  94. package/dist/heart/daemon/task-scheduler.js +3 -25
  95. package/dist/heart/daemon/terminal-ui.js +499 -0
  96. package/dist/heart/daemon/thoughts.js +524 -0
  97. package/dist/heart/daemon/up-progress.js +366 -0
  98. package/dist/heart/daemon/vault-items.js +56 -0
  99. package/dist/heart/delegation.js +62 -0
  100. package/dist/heart/habits/habit-migration.js +189 -0
  101. package/dist/heart/habits/habit-parser.js +140 -0
  102. package/dist/heart/habits/habit-runtime-state.js +100 -0
  103. package/dist/heart/habits/habit-scheduler.js +372 -0
  104. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  105. package/dist/heart/{daemon → hatch}/hatch-flow.js +54 -136
  106. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  107. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  108. package/dist/heart/hatch/specialist-prompt.js +102 -0
  109. package/dist/heart/hatch/specialist-tools.js +306 -0
  110. package/dist/heart/identity.js +274 -61
  111. package/dist/heart/kept-notes.js +357 -0
  112. package/dist/heart/kicks.js +2 -20
  113. package/dist/heart/machine-identity.js +161 -0
  114. package/dist/heart/mail-import-discovery.js +353 -0
  115. package/dist/heart/mcp/mcp-server.js +653 -0
  116. package/dist/heart/migrate-config.js +100 -0
  117. package/dist/heart/model-capabilities.js +59 -0
  118. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  119. package/dist/heart/outlook/outlook-http-response.js +7 -0
  120. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  121. package/dist/heart/outlook/outlook-http-static.js +103 -0
  122. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  123. package/dist/heart/outlook/outlook-http.js +99 -0
  124. package/dist/heart/outlook/outlook-read.js +31 -0
  125. package/dist/heart/outlook/outlook-types.js +27 -0
  126. package/dist/heart/outlook/outlook-view.js +195 -0
  127. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  128. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  129. package/dist/heart/outlook/readers/mail.js +362 -0
  130. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  131. package/dist/heart/outlook/readers/sessions.js +232 -0
  132. package/dist/heart/outlook/readers/shared.js +111 -0
  133. package/dist/heart/platform.js +81 -0
  134. package/dist/heart/progress-story.js +42 -0
  135. package/dist/heart/provider-attempt.js +134 -0
  136. package/dist/heart/provider-binding-resolver.js +255 -0
  137. package/dist/heart/provider-credentials.js +424 -0
  138. package/dist/heart/provider-failover.js +301 -0
  139. package/dist/heart/provider-models.js +81 -0
  140. package/dist/heart/provider-ping.js +262 -0
  141. package/dist/heart/provider-state.js +216 -0
  142. package/dist/heart/provider-visibility.js +188 -0
  143. package/dist/heart/providers/anthropic-token.js +131 -0
  144. package/dist/heart/providers/anthropic.js +202 -50
  145. package/dist/heart/providers/azure.js +104 -13
  146. package/dist/heart/providers/error-classification.js +63 -0
  147. package/dist/heart/providers/github-copilot.js +145 -0
  148. package/dist/heart/providers/minimax-vlm.js +189 -0
  149. package/dist/heart/providers/minimax.js +29 -7
  150. package/dist/heart/providers/openai-codex.js +63 -39
  151. package/dist/heart/runtime-capability-check.js +170 -0
  152. package/dist/heart/runtime-credentials.js +260 -0
  153. package/dist/heart/sense-truth.js +68 -0
  154. package/dist/heart/session-activity.js +190 -0
  155. package/dist/heart/session-events.js +1089 -0
  156. package/dist/heart/session-playback-cli-main.js +5 -0
  157. package/dist/heart/session-playback-cli.js +36 -0
  158. package/dist/heart/session-playback.js +231 -0
  159. package/dist/heart/session-transcript.js +167 -0
  160. package/dist/heart/start-of-turn-packet.js +345 -0
  161. package/dist/heart/streaming.js +129 -34
  162. package/dist/heart/sync.js +332 -0
  163. package/dist/heart/target-resolution.js +127 -0
  164. package/dist/heart/tempo.js +93 -0
  165. package/dist/heart/temporal-view.js +41 -0
  166. package/dist/heart/tool-activity-callbacks.js +36 -0
  167. package/dist/heart/tool-description.js +135 -0
  168. package/dist/heart/tool-friction.js +55 -0
  169. package/dist/heart/tool-loop.js +200 -0
  170. package/dist/heart/turn-context.js +372 -0
  171. package/dist/heart/turn-coordinator.js +28 -0
  172. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  173. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  174. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  175. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  176. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  177. package/dist/heart/versioning/staged-restart.js +146 -0
  178. package/dist/heart/versioning/update-checker.js +115 -0
  179. package/dist/heart/versioning/update-hooks.js +142 -0
  180. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  181. package/dist/mailroom/attention.js +167 -0
  182. package/dist/mailroom/autonomy.js +209 -0
  183. package/dist/mailroom/blob-store.js +606 -0
  184. package/dist/mailroom/core.js +672 -0
  185. package/dist/mailroom/entry.js +160 -0
  186. package/dist/mailroom/file-store.js +426 -0
  187. package/dist/mailroom/mbox-import.js +382 -0
  188. package/dist/mailroom/outbound.js +380 -0
  189. package/dist/mailroom/policy.js +263 -0
  190. package/dist/mailroom/reader.js +219 -0
  191. package/dist/mailroom/search-cache.js +182 -0
  192. package/dist/mailroom/search-relevance.js +319 -0
  193. package/dist/mailroom/smtp-ingress.js +176 -0
  194. package/dist/mailroom/source-state.js +176 -0
  195. package/dist/mailroom/thread.js +109 -0
  196. package/dist/mailroom/travel-extract.js +89 -0
  197. package/dist/mind/bundle-manifest.js +77 -1
  198. package/dist/mind/context.js +173 -94
  199. package/dist/mind/diary-integrity.js +60 -0
  200. package/dist/mind/{memory.js → diary.js} +84 -96
  201. package/dist/mind/embedding-provider.js +60 -0
  202. package/dist/mind/file-state.js +179 -0
  203. package/dist/mind/first-impressions.js +16 -2
  204. package/dist/mind/friends/channel.js +73 -0
  205. package/dist/mind/friends/group-context.js +144 -0
  206. package/dist/mind/friends/resolver.js +54 -2
  207. package/dist/mind/friends/store-file.js +58 -3
  208. package/dist/mind/friends/trust-explanation.js +74 -0
  209. package/dist/mind/friends/types.js +10 -2
  210. package/dist/mind/journal-index.js +161 -0
  211. package/dist/mind/note-search.js +268 -0
  212. package/dist/mind/obligation-steering.js +221 -0
  213. package/dist/mind/pending.js +76 -9
  214. package/dist/mind/phrases.js +1 -0
  215. package/dist/mind/prompt-refresh.js +3 -2
  216. package/dist/mind/prompt.js +1144 -117
  217. package/dist/mind/provenance-trust.js +26 -0
  218. package/dist/mind/scrutiny.js +173 -0
  219. package/dist/mind/token-estimate.js +8 -12
  220. package/dist/nerves/cli-logging.js +22 -3
  221. package/dist/nerves/coverage/audit-rules.js +15 -6
  222. package/dist/nerves/coverage/audit.js +28 -2
  223. package/dist/nerves/coverage/cli.js +1 -1
  224. package/dist/nerves/coverage/contract.js +5 -5
  225. package/dist/nerves/coverage/file-completeness.js +101 -5
  226. package/dist/nerves/coverage/run-artifacts.js +1 -1
  227. package/dist/nerves/event-buffer.js +111 -0
  228. package/dist/nerves/index.js +224 -4
  229. package/dist/nerves/observation.js +20 -0
  230. package/dist/nerves/redact.js +79 -0
  231. package/dist/nerves/runtime.js +5 -1
  232. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  233. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  234. package/dist/outlook-ui/index.html +15 -0
  235. package/dist/repertoire/ado-client.js +17 -56
  236. package/dist/repertoire/ado-semantic.js +11 -10
  237. package/dist/repertoire/api-client.js +97 -0
  238. package/dist/repertoire/bitwarden-store.js +774 -0
  239. package/dist/repertoire/bundle-templates.js +72 -0
  240. package/dist/repertoire/bw-installer.js +180 -0
  241. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  242. package/dist/repertoire/coding/context-pack.js +330 -0
  243. package/dist/repertoire/coding/feedback.js +301 -0
  244. package/dist/repertoire/coding/index.js +4 -1
  245. package/dist/repertoire/coding/manager.js +220 -13
  246. package/dist/repertoire/coding/spawner.js +58 -12
  247. package/dist/repertoire/coding/tools.js +209 -7
  248. package/dist/repertoire/commerce-errors.js +109 -0
  249. package/dist/repertoire/commerce-self-test.js +156 -0
  250. package/dist/repertoire/credential-access.js +111 -0
  251. package/dist/repertoire/data/ado-endpoints.json +188 -0
  252. package/dist/repertoire/duffel-client.js +185 -0
  253. package/dist/repertoire/github-client.js +14 -55
  254. package/dist/repertoire/graph-client.js +11 -52
  255. package/dist/repertoire/guardrails.js +396 -0
  256. package/dist/repertoire/mcp-client.js +255 -0
  257. package/dist/repertoire/mcp-manager.js +305 -0
  258. package/dist/repertoire/mcp-tools.js +63 -0
  259. package/dist/repertoire/shell-sessions.js +133 -0
  260. package/dist/repertoire/skills.js +15 -24
  261. package/dist/repertoire/stripe-client.js +131 -0
  262. package/dist/repertoire/tasks/board.js +43 -5
  263. package/dist/repertoire/tasks/fix.js +182 -0
  264. package/dist/repertoire/tasks/index.js +39 -13
  265. package/dist/repertoire/tasks/lifecycle.js +2 -2
  266. package/dist/repertoire/tasks/parser.js +3 -2
  267. package/dist/repertoire/tasks/scanner.js +194 -37
  268. package/dist/repertoire/tasks/transitions.js +16 -79
  269. package/dist/repertoire/tool-results.js +29 -0
  270. package/dist/repertoire/tools-attachments.js +317 -0
  271. package/dist/repertoire/tools-base.js +49 -707
  272. package/dist/repertoire/tools-bluebubbles.js +94 -0
  273. package/dist/repertoire/tools-bridge.js +141 -0
  274. package/dist/repertoire/tools-bundle.js +984 -0
  275. package/dist/repertoire/tools-config.js +185 -0
  276. package/dist/repertoire/tools-continuity.js +248 -0
  277. package/dist/repertoire/tools-credential.js +381 -0
  278. package/dist/repertoire/tools-files.js +342 -0
  279. package/dist/repertoire/tools-flight.js +224 -0
  280. package/dist/repertoire/tools-flow.js +105 -0
  281. package/dist/repertoire/tools-github.js +1 -7
  282. package/dist/repertoire/tools-mail.js +1377 -0
  283. package/dist/repertoire/tools-notes.js +376 -0
  284. package/dist/repertoire/tools-session.js +749 -0
  285. package/dist/repertoire/tools-shell.js +120 -0
  286. package/dist/repertoire/tools-stripe.js +180 -0
  287. package/dist/repertoire/tools-surface.js +243 -0
  288. package/dist/repertoire/tools-teams.js +64 -61
  289. package/dist/repertoire/tools-travel.js +125 -0
  290. package/dist/repertoire/tools-trip.js +356 -0
  291. package/dist/repertoire/tools-user-profile.js +144 -0
  292. package/dist/repertoire/tools-vault.js +40 -0
  293. package/dist/repertoire/tools.js +149 -98
  294. package/dist/repertoire/travel-api-client.js +360 -0
  295. package/dist/repertoire/user-profile.js +131 -0
  296. package/dist/repertoire/vault-setup.js +246 -0
  297. package/dist/repertoire/vault-unlock.js +561 -0
  298. package/dist/scripts/claude-code-hook.js +41 -0
  299. package/dist/scripts/claude-code-stop-hook.js +47 -0
  300. package/dist/senses/attention-queue.js +116 -0
  301. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  302. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  303. package/dist/senses/bluebubbles/client.js +685 -0
  304. package/dist/senses/bluebubbles/entry.js +73 -0
  305. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  306. package/dist/senses/bluebubbles/index.js +1881 -0
  307. package/dist/senses/bluebubbles/media.js +389 -0
  308. package/dist/senses/bluebubbles/model.js +282 -0
  309. package/dist/senses/bluebubbles/mutation-log.js +116 -0
  310. package/dist/senses/bluebubbles/processed-log.js +111 -0
  311. package/dist/senses/bluebubbles/replay.js +129 -0
  312. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  313. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  314. package/dist/senses/cli/bracketed-paste.js +82 -0
  315. package/dist/senses/cli/image-paste.js +287 -0
  316. package/dist/senses/cli/image-ref-navigation.js +75 -0
  317. package/dist/senses/cli/ink-app.js +156 -0
  318. package/dist/senses/cli/inline-diff.js +64 -0
  319. package/dist/senses/cli/input-keys.js +174 -0
  320. package/dist/senses/cli/kill-ring.js +86 -0
  321. package/dist/senses/cli/message-list.js +51 -0
  322. package/dist/senses/cli/ouro-tui.js +605 -0
  323. package/dist/senses/cli/spinner-imperative.js +135 -0
  324. package/dist/senses/cli/spinner.js +101 -0
  325. package/dist/senses/cli/status-line.js +60 -0
  326. package/dist/senses/cli/streaming-markdown.js +526 -0
  327. package/dist/senses/cli/tool-display.js +83 -0
  328. package/dist/senses/cli/tool-render.js +85 -0
  329. package/dist/senses/cli/tui-store.js +240 -0
  330. package/dist/senses/cli/virtual-list.js +35 -0
  331. package/dist/senses/cli-entry.js +60 -8
  332. package/dist/senses/cli-layout.js +187 -0
  333. package/dist/senses/cli.js +768 -264
  334. package/dist/senses/commands.js +66 -3
  335. package/dist/senses/continuity.js +94 -0
  336. package/dist/senses/habit-turn-message.js +108 -0
  337. package/dist/senses/inner-dialog-worker.js +199 -16
  338. package/dist/senses/inner-dialog.js +640 -91
  339. package/dist/senses/mail-entry.js +66 -0
  340. package/dist/senses/mail.js +379 -0
  341. package/dist/senses/pipeline.js +665 -0
  342. package/dist/senses/proactive-content-guard.js +51 -0
  343. package/dist/senses/shared-turn.js +248 -0
  344. package/dist/senses/surface-tool.js +68 -0
  345. package/dist/senses/teams-entry.js +60 -8
  346. package/dist/senses/teams.js +844 -197
  347. package/dist/senses/trust-gate.js +207 -2
  348. package/dist/trips/core.js +138 -0
  349. package/dist/trips/store.js +146 -0
  350. package/package.json +47 -6
  351. package/skills/agent-commerce.md +106 -0
  352. package/skills/browser-navigation.md +117 -0
  353. package/skills/commerce-setup-guide.md +116 -0
  354. package/skills/commerce-setup.md +84 -0
  355. package/skills/configure-dev-tools.md +101 -0
  356. package/skills/travel-planning.md +138 -0
  357. package/AdoptionSpecialist.ouro/agent.json +0 -20
  358. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  359. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  360. package/dist/heart/daemon/specialist-prompt.js +0 -40
  361. package/dist/heart/daemon/specialist-session.js +0 -142
  362. package/dist/heart/daemon/specialist-tools.js +0 -128
  363. package/dist/heart/daemon/subagent-installer.js +0 -125
  364. package/dist/inner-worker-entry.js +0 -4
  365. package/dist/mind/associative-recall.js +0 -197
  366. package/subagents/README.md +0 -73
  367. package/subagents/work-doer.md +0 -233
  368. package/subagents/work-merger.md +0 -624
  369. package/subagents/work-planner.md +0 -373
  370. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBufferedSink = createBufferedSink;
4
+ const runtime_1 = require("./runtime");
5
+ const DEFAULT_MAX_SIZE = 1000;
6
+ const DEFAULT_TTL_MS = 5 * 60 * 1000; // 5 minutes
7
+ function createBufferedSink(inner, options = {}) {
8
+ const maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
9
+ const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
10
+ const nowMs = options.nowMs ?? (() => Date.now());
11
+ const buffer = [];
12
+ let dropped = 0;
13
+ let sinkHealthy = true;
14
+ let unhealthySince = null;
15
+ function tryInner(event) {
16
+ try {
17
+ inner(event);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ function markUnhealthy() {
25
+ sinkHealthy = false;
26
+ unhealthySince = unhealthySince ?? nowMs();
27
+ }
28
+ function markHealthy() {
29
+ sinkHealthy = true;
30
+ unhealthySince = null;
31
+ }
32
+ function discardBuffer() {
33
+ const count = buffer.length;
34
+ dropped += count;
35
+ buffer.length = 0;
36
+ (0, runtime_1.emitNervesEvent)({
37
+ component: "nerves",
38
+ event: "nerves.buffer_ttl_discard",
39
+ message: `discarded ${count} buffered events after TTL`,
40
+ meta: { discarded: count, ttlMs },
41
+ });
42
+ }
43
+ function checkTtl() {
44
+ if (unhealthySince !== null && nowMs() - unhealthySince > ttlMs) {
45
+ discardBuffer();
46
+ // Reset unhealthySince to now so TTL starts fresh for newly buffered events
47
+ unhealthySince = nowMs();
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ function addToBuffer(event) {
53
+ if (buffer.length >= maxSize) {
54
+ buffer.shift();
55
+ dropped++;
56
+ }
57
+ buffer.push(event);
58
+ }
59
+ function flushBuffer() {
60
+ while (buffer.length > 0) {
61
+ const event = buffer[0];
62
+ if (tryInner(event)) {
63
+ buffer.shift();
64
+ }
65
+ else {
66
+ markUnhealthy();
67
+ return;
68
+ }
69
+ }
70
+ }
71
+ function sink(event) {
72
+ if (!sinkHealthy) {
73
+ checkTtl();
74
+ // Try sending the new event to see if inner has recovered
75
+ if (tryInner(event)) {
76
+ markHealthy();
77
+ flushBuffer();
78
+ }
79
+ else {
80
+ addToBuffer(event);
81
+ }
82
+ return;
83
+ }
84
+ if (tryInner(event)) {
85
+ return;
86
+ }
87
+ // Inner failed
88
+ markUnhealthy();
89
+ addToBuffer(event);
90
+ }
91
+ function flush() {
92
+ if (buffer.length === 0)
93
+ return;
94
+ // Test if inner is recovered by trying the first buffered event
95
+ const first = buffer[0];
96
+ if (tryInner(first)) {
97
+ buffer.shift();
98
+ markHealthy();
99
+ flushBuffer();
100
+ }
101
+ // If still broken, leave buffer intact
102
+ }
103
+ function state() {
104
+ return {
105
+ buffered: buffer.length,
106
+ dropped,
107
+ sinkHealthy,
108
+ };
109
+ }
110
+ return { sink, flush, state };
111
+ }
@@ -1,17 +1,60 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DEFAULT_MAX_GENERATIONS = exports.DEFAULT_MAX_LOG_SIZE_BYTES = void 0;
3
37
  exports.createTraceId = createTraceId;
4
38
  exports.ensureTraceId = ensureTraceId;
5
39
  exports.createFanoutSink = createFanoutSink;
6
40
  exports.formatTerminalEntry = formatTerminalEntry;
41
+ exports.registerSpinnerHooks = registerSpinnerHooks;
7
42
  exports.createTerminalSink = createTerminalSink;
8
43
  exports.createStderrSink = createStderrSink;
44
+ exports.rotateIfNeeded = rotateIfNeeded;
9
45
  exports.createNdjsonFileSink = createNdjsonFileSink;
10
46
  exports.registerGlobalLogSink = registerGlobalLogSink;
11
47
  exports.createLogger = createLogger;
12
48
  const fs_1 = require("fs");
13
49
  const path_1 = require("path");
14
50
  const crypto_1 = require("crypto");
51
+ const zlib = __importStar(require("zlib"));
52
+ // NOTE: runtime.ts imports `createLogger` and `ensureTraceId` from this file.
53
+ // The cycle is safe in CommonJS because runtime.ts only uses those values
54
+ // lazily inside `getRuntimeLogger()`, and we only call `emitNervesEvent` from
55
+ // inside `rotateIfNeeded` — never at module top level.
56
+ const runtime_1 = require("./runtime");
57
+ const redact_1 = require("./redact");
15
58
  const LEVEL_PRIORITY = {
16
59
  debug: 10,
17
60
  info: 20,
@@ -73,36 +116,213 @@ function formatTerminalEntry(entry) {
73
116
  const level = entry.level.toUpperCase();
74
117
  return `${formatTerminalTime(entry.ts)} ${level} [${entry.component}] ${entry.message}${formatTerminalMeta(entry.meta)}`;
75
118
  }
76
- function createTerminalSink(write = (chunk) => process.stderr.write(chunk), colorize = true) {
119
+ // Spinner coordination: the CLI sense registers these so log output
120
+ // doesn't interleave with the active spinner animation.
121
+ let _pauseSpinner = null;
122
+ let _resumeSpinner = null;
123
+ function registerSpinnerHooks(pause, resume) {
124
+ _pauseSpinner = pause;
125
+ _resumeSpinner = resume;
126
+ }
127
+ function createTerminalSink(write = (chunk) => { try {
128
+ process.stderr.write(chunk);
129
+ }
130
+ catch { /* EPIPE: daemon detached, no terminal */ } }, colorize = true) {
77
131
  return (entry) => {
132
+ _pauseSpinner?.();
78
133
  const line = formatTerminalEntry(entry);
79
134
  if (!colorize) {
80
135
  write(`${line}\n`);
136
+ _resumeSpinner?.();
81
137
  return;
82
138
  }
83
139
  const prefix = LEVEL_COLORS[entry.level];
84
140
  write(`${prefix}${line}\x1b[0m\n`);
141
+ _resumeSpinner?.();
85
142
  };
86
143
  }
87
- function createStderrSink(write = (chunk) => process.stderr.write(chunk)) {
144
+ function createStderrSink(write) {
88
145
  return createTerminalSink(write);
89
146
  }
90
- function createNdjsonFileSink(filePath) {
147
+ exports.DEFAULT_MAX_LOG_SIZE_BYTES = 25 * 1024 * 1024; // 25 MB per active stream
148
+ exports.DEFAULT_MAX_GENERATIONS = 5; // keep 5 gzipped historical generations
149
+ const DEFAULT_ROTATION_CHECK_INTERVAL_BYTES = 1024 * 1024; // ~1MB between stat checks
150
+ /** Internal: compute the gzipped generation path for a given ndjson file. */
151
+ function generationGzPath(base, ext, n) {
152
+ return ext === ".ndjson" ? `${base}.${n}.ndjson.gz` : `${base}.${n}.gz`;
153
+ }
154
+ /** Internal: compute the legacy uncompressed generation path for a given file. */
155
+ function generationPlainPath(base, ext, n) {
156
+ return ext === ".ndjson" ? `${base}.${n}.ndjson` : `${base}.${n}`;
157
+ }
158
+ /**
159
+ * Rotate a log file in place.
160
+ *
161
+ * Scheme (25 MB × 5 gzipped generations by default):
162
+ * active : foo.ndjson
163
+ * newest gen : foo.1.ndjson.gz
164
+ * oldest gen : foo.5.ndjson.gz (dropped on next rotation)
165
+ *
166
+ * Legacy tolerance: uncompressed `foo.1.ndjson` / `foo.2.ndjson` files from the
167
+ * old scheme are treated as the corresponding generation and gzipped on first
168
+ * rotation.
169
+ *
170
+ * Concurrent-writer safety: the active file is renamed (inode stays alive for
171
+ * any open writer fd) then gzipped at the renamed path. An active writer
172
+ * continues writing to its original fd; on the next write cycle it sees the
173
+ * old path is missing and creates a fresh file.
174
+ *
175
+ * Backwards-compatible signature: passing a `number` as the second argument
176
+ * (the old API) is still accepted and interpreted as `maxSizeBytes`.
177
+ */
178
+ function rotateIfNeeded(filePath, optionsOrMaxSize) {
179
+ const options = typeof optionsOrMaxSize === "number"
180
+ ? { maxSizeBytes: optionsOrMaxSize }
181
+ : optionsOrMaxSize ?? {};
182
+ const maxSizeBytes = options.maxSizeBytes ?? exports.DEFAULT_MAX_LOG_SIZE_BYTES;
183
+ const maxGenerations = options.maxGenerations ?? exports.DEFAULT_MAX_GENERATIONS;
184
+ const compress = options.compress ?? true;
185
+ let size;
186
+ try {
187
+ size = (0, fs_1.statSync)(filePath).size;
188
+ }
189
+ catch {
190
+ return false;
191
+ }
192
+ if (size < maxSizeBytes)
193
+ return false;
194
+ const ext = filePath.endsWith(".ndjson") ? ".ndjson" : "";
195
+ const base = ext ? filePath.slice(0, -ext.length) : filePath;
196
+ const traceId = (0, crypto_1.randomUUID)();
197
+ (0, runtime_1.emitNervesEvent)({
198
+ component: "nerves",
199
+ event: "nerves.rotation_start",
200
+ trace_id: traceId,
201
+ message: "rotating log file",
202
+ meta: { path: filePath, currentSize: size, threshold: maxSizeBytes, generation: 1 },
203
+ });
204
+ let completed = false;
205
+ try {
206
+ // Step 1: drop / shift existing generations starting from the oldest.
207
+ // For each slot N (maxGenerations..2), find whatever occupies slot (N-1)
208
+ // (as .gz or legacy uncompressed) and move it to slot N. Slot N occupants
209
+ // get overwritten (oldest is dropped). Non-existent slots are skipped.
210
+ for (let n = maxGenerations; n >= 2; n--) {
211
+ const destGz = generationGzPath(base, ext, n);
212
+ const srcGz = generationGzPath(base, ext, n - 1);
213
+ const srcPlain = generationPlainPath(base, ext, n - 1);
214
+ // Drop whatever currently occupies the destination slot (oldest generation).
215
+ if ((0, fs_1.existsSync)(destGz)) {
216
+ (0, fs_1.unlinkSync)(destGz);
217
+ }
218
+ const destPlain = generationPlainPath(base, ext, n);
219
+ if ((0, fs_1.existsSync)(destPlain)) {
220
+ (0, fs_1.unlinkSync)(destPlain);
221
+ }
222
+ // Prefer moving .gz → .gz (cheap rename).
223
+ if ((0, fs_1.existsSync)(srcGz)) {
224
+ (0, fs_1.renameSync)(srcGz, destGz);
225
+ continue;
226
+ }
227
+ // Legacy migration: if a plain .ndjson generation file exists from the
228
+ // old scheme, read it, gzip it into the destination slot, and delete
229
+ // the plain source.
230
+ if ((0, fs_1.existsSync)(srcPlain)) {
231
+ if (compress) {
232
+ const buf = (0, fs_1.readFileSync)(srcPlain);
233
+ const compressed = zlib.gzipSync(buf);
234
+ (0, fs_1.writeFileSync)(destGz, compressed);
235
+ (0, fs_1.unlinkSync)(srcPlain);
236
+ }
237
+ else {
238
+ // compress=false: just rename
239
+ (0, fs_1.renameSync)(srcPlain, destPlain);
240
+ }
241
+ }
242
+ }
243
+ // Step 2: rename the active file to the generation-1 plain path. The
244
+ // active writer keeps its open fd; the file path now points elsewhere.
245
+ const plain1 = generationPlainPath(base, ext, 1);
246
+ // If a stale .1 plain path exists (e.g. a previous compress=false run),
247
+ // remove it so the rename can claim the slot cleanly.
248
+ if ((0, fs_1.existsSync)(plain1)) {
249
+ (0, fs_1.unlinkSync)(plain1);
250
+ }
251
+ (0, fs_1.renameSync)(filePath, plain1);
252
+ // Step 3: gzip (or keep plain) the renamed file into the .1 generation.
253
+ if (compress) {
254
+ const gz1 = generationGzPath(base, ext, 1);
255
+ // Remove any lingering .1.ndjson.gz to avoid "file exists" on write.
256
+ if ((0, fs_1.existsSync)(gz1)) {
257
+ (0, fs_1.unlinkSync)(gz1);
258
+ }
259
+ const buf = (0, fs_1.readFileSync)(plain1);
260
+ const compressed = zlib.gzipSync(buf);
261
+ (0, fs_1.writeFileSync)(gz1, compressed);
262
+ (0, fs_1.unlinkSync)(plain1);
263
+ }
264
+ completed = true;
265
+ (0, runtime_1.emitNervesEvent)({
266
+ component: "nerves",
267
+ event: "nerves.rotation_end",
268
+ trace_id: traceId,
269
+ message: "log rotation complete",
270
+ meta: { path: filePath, compressedPath: compress ? generationGzPath(base, ext, 1) : plain1, bytesFreed: size },
271
+ });
272
+ return true;
273
+ }
274
+ catch (err) {
275
+ /* v8 ignore next -- defensive: completed=true only reached after the try block's return @preserve */
276
+ if (!completed) {
277
+ /* v8 ignore next -- defensive: fs ops throw real Errors @preserve */
278
+ const reason = err instanceof Error ? err.message : String(err);
279
+ (0, runtime_1.emitNervesEvent)({
280
+ component: "nerves",
281
+ event: "nerves.rotation_error",
282
+ trace_id: traceId,
283
+ level: "error",
284
+ message: "log rotation failed",
285
+ meta: { path: filePath, error: reason },
286
+ });
287
+ }
288
+ throw err;
289
+ }
290
+ }
291
+ function createNdjsonFileSink(filePath, optionsOrMaxSize) {
91
292
  (0, fs_1.mkdirSync)((0, path_1.dirname)(filePath), { recursive: true });
293
+ const options = typeof optionsOrMaxSize === "number"
294
+ ? { maxSizeBytes: optionsOrMaxSize }
295
+ : optionsOrMaxSize ?? {};
296
+ const rotationCheckInterval = options.rotationCheckIntervalBytes ?? DEFAULT_ROTATION_CHECK_INTERVAL_BYTES;
297
+ const verbose = process.env.OURO_LOG_VERBOSE === "1";
92
298
  const queue = [];
93
299
  let flushing = false;
300
+ let bytesSinceCheck = 0;
94
301
  function flush() {
95
302
  if (flushing || queue.length === 0)
96
303
  return;
97
304
  flushing = true;
98
305
  const line = queue.shift();
306
+ if (bytesSinceCheck >= rotationCheckInterval) {
307
+ bytesSinceCheck = 0;
308
+ try {
309
+ rotateIfNeeded(filePath, options);
310
+ }
311
+ catch {
312
+ // Rotation errors are surfaced via nerves events; never block writes.
313
+ }
314
+ }
99
315
  (0, fs_1.appendFile)(filePath, line, "utf8", () => {
100
316
  flushing = false;
101
317
  flush();
102
318
  });
103
319
  }
104
320
  return (entry) => {
105
- queue.push(`${JSON.stringify(entry)}\n`);
321
+ const line = verbose
322
+ ? `${JSON.stringify(entry)}\n`
323
+ : `${(0, redact_1.redactString)(JSON.stringify((0, redact_1.redactLogEntry)(entry)))}\n`;
324
+ bytesSinceCheck += line.length;
325
+ queue.push(line);
106
326
  flush();
107
327
  };
108
328
  }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Nerves observation layer — shared typed readers for runtime state.
4
+ *
5
+ * This module re-exports domain types that multiple consumers need
6
+ * (Mailbox, CLI, agent tools) so they don't maintain parallel type universes.
7
+ *
8
+ * The Mailbox UI consumes these through the HTTP API, but the same
9
+ * observation functions back CLI commands and future native clients.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ /* v8 ignore start — module-level observability event */
13
+ const runtime_1 = require("./runtime");
14
+ (0, runtime_1.emitNervesEvent)({
15
+ component: "nerves",
16
+ event: "nerves.observation_loaded",
17
+ message: "observation layer loaded",
18
+ meta: {},
19
+ });
20
+ /* v8 ignore stop */
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SENSITIVE_PATTERNS = exports.SENSITIVE_KEYS = void 0;
4
+ exports.redactMeta = redactMeta;
5
+ exports.redactString = redactString;
6
+ exports.redactLogEntry = redactLogEntry;
7
+ /**
8
+ * Lowercase key names that trigger structured redaction.
9
+ * Matched case-insensitively against meta object keys.
10
+ */
11
+ exports.SENSITIVE_KEYS = new Set([
12
+ "password",
13
+ "secret",
14
+ "token",
15
+ "accesstoken",
16
+ "refreshtoken",
17
+ "clientsecret",
18
+ "apikey",
19
+ "oauthaccesstoken",
20
+ "authorization",
21
+ "cookie",
22
+ "set-cookie",
23
+ ]);
24
+ /**
25
+ * Regex patterns for string-level fallback redaction.
26
+ * Applied in order; each match is replaced with `[REDACTED:name]`.
27
+ */
28
+ exports.SENSITIVE_PATTERNS = [
29
+ { name: "anthropic_key", pattern: /sk-ant-[A-Za-z0-9_-]+/g },
30
+ { name: "openai_key", pattern: /sk-proj-[A-Za-z0-9_-]+/g },
31
+ { name: "bearer_token", pattern: /Bearer [A-Za-z0-9\-_.]+/g },
32
+ { name: "api_key_assignment", pattern: /api[_-]?key[=:]\s*["']?[A-Za-z0-9\-_.]+/g },
33
+ { name: "url_token", pattern: /[?&](?:token|key|api_key|access_token)=[A-Za-z0-9\-_.%]+/g },
34
+ ];
35
+ /**
36
+ * Deep-clone meta and replace values at sensitive keys with `[REDACTED:key_name]`.
37
+ * Recurses into nested objects. Case-insensitive key matching.
38
+ */
39
+ function redactMeta(meta) {
40
+ const result = {};
41
+ for (const key of Object.keys(meta)) {
42
+ const value = meta[key];
43
+ if (exports.SENSITIVE_KEYS.has(key.toLowerCase())) {
44
+ result[key] = `[REDACTED:${key}]`;
45
+ }
46
+ else if (value !== null && typeof value === "object" && !Array.isArray(value)) {
47
+ result[key] = redactMeta(value);
48
+ }
49
+ else {
50
+ result[key] = value;
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ /**
56
+ * Apply all regex patterns to a string, replacing matches with `[REDACTED:pattern_name]`.
57
+ */
58
+ function redactString(text) {
59
+ let result = text;
60
+ for (const { name, pattern } of exports.SENSITIVE_PATTERNS) {
61
+ // Reset lastIndex for global regexes reused across calls
62
+ pattern.lastIndex = 0;
63
+ result = result.replace(pattern, `[REDACTED:${name}]`);
64
+ }
65
+ return result;
66
+ }
67
+ /**
68
+ * Full redaction pipeline: redact meta (structured keys), then redact message (regex patterns).
69
+ * Returns a new LogEvent -- never mutates the input.
70
+ */
71
+ function redactLogEntry(entry) {
72
+ const redactedMeta = redactMeta(entry.meta);
73
+ const redactedMessage = redactString(entry.message);
74
+ return {
75
+ ...entry,
76
+ meta: redactedMeta,
77
+ message: redactedMessage,
78
+ };
79
+ }
@@ -6,7 +6,11 @@ const index_1 = require("./index");
6
6
  let runtimeLogger = null;
7
7
  function getRuntimeLogger() {
8
8
  if (!runtimeLogger) {
9
- runtimeLogger = (0, index_1.createLogger)({ level: "info" });
9
+ // Default logger has no sinks — events emitted before the real logger is
10
+ // configured (e.g. identity resolution during startup) are silently dropped.
11
+ // This prevents INFO lines from leaking to stderr and interleaving with
12
+ // the CLI spinner when the ouro subprocess hasn't configured its logger yet.
13
+ runtimeLogger = (0, index_1.createLogger)({ level: "info", sinks: [] });
10
14
  }
11
15
  return runtimeLogger;
12
16
  }