@ouro.bot/cli 0.1.0-alpha.69 → 0.1.0-alpha.690

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 (480) hide show
  1. package/README.md +133 -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 +4392 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +810 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +326 -0
  36. package/dist/arc/packets.js +288 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +160 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/awaiting/await-alert.js +146 -0
  54. package/dist/heart/awaiting/await-expiry.js +108 -0
  55. package/dist/heart/awaiting/await-loader.js +91 -0
  56. package/dist/heart/awaiting/await-parser.js +141 -0
  57. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  58. package/dist/heart/awaiting/await-scheduler.js +378 -0
  59. package/dist/heart/background-operations.js +281 -0
  60. package/dist/heart/bridges/manager.js +137 -17
  61. package/dist/heart/bridges/store.js +14 -2
  62. package/dist/heart/bundle-state.js +168 -0
  63. package/dist/heart/commitments.js +135 -0
  64. package/dist/heart/config-registry.js +331 -0
  65. package/dist/heart/config.js +122 -119
  66. package/dist/heart/context-loss-gauntlet.js +354 -0
  67. package/dist/heart/context-loss-sentinel.js +946 -0
  68. package/dist/heart/core.js +1297 -269
  69. package/dist/heart/cross-chat-delivery.js +8 -22
  70. package/dist/heart/daemon/agent-config-check.js +451 -0
  71. package/dist/heart/daemon/agent-discovery.js +185 -3
  72. package/dist/heart/daemon/agent-service.js +523 -0
  73. package/dist/heart/daemon/agentic-repair.js +547 -0
  74. package/dist/heart/daemon/await-private-wake.js +59 -0
  75. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  76. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  77. package/dist/heart/daemon/cadence.js +70 -0
  78. package/dist/heart/daemon/cli-defaults.js +780 -0
  79. package/dist/heart/daemon/cli-desk.js +322 -0
  80. package/dist/heart/daemon/cli-exec.js +8100 -0
  81. package/dist/heart/daemon/cli-help.js +601 -0
  82. package/dist/heart/daemon/cli-parse.js +1995 -0
  83. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  84. package/dist/heart/daemon/cli-render.js +770 -0
  85. package/dist/heart/daemon/cli-types.js +8 -0
  86. package/dist/heart/daemon/connect-bay.js +323 -0
  87. package/dist/heart/daemon/daemon-cli.js +29 -1814
  88. package/dist/heart/daemon/daemon-entry.js +668 -6
  89. package/dist/heart/daemon/daemon-health.js +176 -0
  90. package/dist/heart/daemon/daemon-rollup.js +57 -0
  91. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  92. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  93. package/dist/heart/daemon/daemon.js +1222 -84
  94. package/dist/heart/daemon/dns-workflow.js +394 -0
  95. package/dist/heart/daemon/doctor-types.js +8 -0
  96. package/dist/heart/daemon/doctor.js +873 -0
  97. package/dist/heart/daemon/habit-private-wake.js +56 -0
  98. package/dist/heart/daemon/health-monitor.js +131 -3
  99. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  100. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  101. package/dist/heart/daemon/http-health-probe.js +80 -0
  102. package/dist/heart/daemon/human-command-screens.js +234 -0
  103. package/dist/heart/daemon/human-readiness.js +114 -0
  104. package/dist/heart/daemon/inner-status.js +78 -0
  105. package/dist/heart/daemon/interactive-repair.js +394 -0
  106. package/dist/heart/daemon/launchd.js +37 -8
  107. package/dist/heart/daemon/log-tailer.js +79 -10
  108. package/dist/heart/daemon/logs-prune.js +110 -0
  109. package/dist/heart/daemon/mcp-canary.js +297 -0
  110. package/dist/heart/daemon/message-router.js +45 -5
  111. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  112. package/dist/heart/daemon/os-cron-deps.js +135 -0
  113. package/dist/heart/daemon/os-cron.js +14 -12
  114. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  115. package/dist/heart/daemon/ouro-entry.js +3 -1
  116. package/dist/heart/daemon/plugin-cli.js +432 -0
  117. package/dist/heart/daemon/process-manager.js +519 -40
  118. package/dist/heart/daemon/provider-discovery.js +137 -0
  119. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  120. package/dist/heart/daemon/pulse.js +511 -0
  121. package/dist/heart/daemon/readiness-repair.js +365 -0
  122. package/dist/heart/daemon/run-hooks.js +2 -0
  123. package/dist/heart/daemon/runtime-logging.js +41 -14
  124. package/dist/heart/daemon/runtime-metadata.js +2 -30
  125. package/dist/heart/daemon/safe-mode.js +161 -0
  126. package/dist/heart/daemon/sense-manager.js +583 -43
  127. package/dist/heart/daemon/session-id-resolver.js +131 -0
  128. package/dist/heart/daemon/skill-management-installer.js +1 -1
  129. package/dist/heart/daemon/socket-client.js +171 -12
  130. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  131. package/dist/heart/daemon/startup-tui.js +338 -0
  132. package/dist/heart/daemon/task-scheduler.js +117 -39
  133. package/dist/heart/daemon/terminal-ui.js +499 -0
  134. package/dist/heart/daemon/thoughts.js +255 -43
  135. package/dist/heart/daemon/up-progress.js +366 -0
  136. package/dist/heart/daemon/vault-items.js +56 -0
  137. package/dist/heart/delegation.js +1 -4
  138. package/dist/heart/external-events/router.js +121 -0
  139. package/dist/heart/habits/habit-migration.js +189 -0
  140. package/dist/heart/habits/habit-parser.js +211 -0
  141. package/dist/heart/habits/habit-runtime-state.js +114 -0
  142. package/dist/heart/habits/habit-scheduler.js +411 -0
  143. package/dist/heart/habits/habit-session-summary.js +318 -0
  144. package/dist/heart/habits/habit-session.js +618 -0
  145. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -57
  146. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  147. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  148. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  149. package/dist/heart/identity.js +174 -58
  150. package/dist/heart/kept-notes.js +289 -0
  151. package/dist/heart/kicks.js +1 -1
  152. package/dist/heart/machine-identity.js +161 -0
  153. package/dist/heart/mail-import-discovery.js +353 -0
  154. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  155. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  156. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  157. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  158. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  159. package/dist/heart/mailbox/mailbox-http.js +99 -0
  160. package/dist/heart/mailbox/mailbox-read.js +37 -0
  161. package/dist/heart/mailbox/mailbox-types.js +27 -0
  162. package/dist/heart/mailbox/mailbox-view.js +197 -0
  163. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  164. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  165. package/dist/heart/mailbox/readers/mail.js +375 -0
  166. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  167. package/dist/heart/mailbox/readers/sessions.js +232 -0
  168. package/dist/heart/mailbox/readers/shared.js +111 -0
  169. package/dist/heart/mcp/mcp-server.js +696 -0
  170. package/dist/heart/migrate-config.js +100 -0
  171. package/dist/heart/model-capabilities.js +19 -0
  172. package/dist/heart/orientation-frame.js +217 -0
  173. package/dist/heart/platform.js +81 -0
  174. package/dist/heart/primitives.js +1 -1
  175. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  176. package/dist/heart/private-runtime/index.js +18 -0
  177. package/dist/heart/private-runtime/ledger.js +218 -0
  178. package/dist/heart/private-runtime/policy.js +214 -0
  179. package/dist/heart/private-runtime/types.js +2 -0
  180. package/dist/heart/progress-story.js +1 -1
  181. package/dist/heart/provider-attempt.js +134 -0
  182. package/dist/heart/provider-binding-resolver.js +273 -0
  183. package/dist/heart/provider-credentials.js +425 -0
  184. package/dist/heart/provider-failover.js +311 -0
  185. package/dist/heart/provider-models.js +81 -0
  186. package/dist/heart/provider-ping.js +262 -0
  187. package/dist/heart/provider-readiness-cache.js +119 -0
  188. package/dist/heart/provider-visibility.js +188 -0
  189. package/dist/heart/providers/anthropic-token.js +131 -0
  190. package/dist/heart/providers/anthropic.js +139 -52
  191. package/dist/heart/providers/azure.js +23 -11
  192. package/dist/heart/providers/error-classification.js +127 -0
  193. package/dist/heart/providers/github-copilot.js +145 -0
  194. package/dist/heart/providers/minimax-vlm.js +189 -0
  195. package/dist/heart/providers/minimax.js +26 -8
  196. package/dist/heart/providers/openai-codex-token.js +349 -0
  197. package/dist/heart/providers/openai-codex.js +55 -40
  198. package/dist/heart/runtime-capability-check.js +170 -0
  199. package/dist/heart/runtime-credentials.js +389 -0
  200. package/dist/heart/runtime-cwd.js +87 -0
  201. package/dist/heart/sense-truth.js +17 -4
  202. package/dist/heart/session-activity.js +90 -24
  203. package/dist/heart/session-events.js +1133 -0
  204. package/dist/heart/session-playback-cli-main.js +5 -0
  205. package/dist/heart/session-playback-cli.js +36 -0
  206. package/dist/heart/session-playback.js +231 -0
  207. package/dist/heart/session-stats-cli-main.js +5 -0
  208. package/dist/heart/session-stats.js +182 -0
  209. package/dist/heart/session-transcript.js +133 -0
  210. package/dist/heart/start-of-turn-packet.js +365 -0
  211. package/dist/heart/streaming.js +44 -27
  212. package/dist/heart/structured-output.js +196 -0
  213. package/dist/heart/sync-classification.js +176 -0
  214. package/dist/heart/sync.js +449 -0
  215. package/dist/heart/target-resolution.js +11 -7
  216. package/dist/heart/tempo.js +93 -0
  217. package/dist/heart/temporal-view.js +41 -0
  218. package/dist/heart/timeouts.js +101 -0
  219. package/dist/heart/tool-activity-callbacks.js +59 -0
  220. package/dist/heart/tool-description.js +155 -0
  221. package/dist/heart/tool-friction.js +55 -0
  222. package/dist/heart/tool-loop.js +200 -0
  223. package/dist/heart/turn-context.js +450 -0
  224. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  225. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  226. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  227. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  228. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  229. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  230. package/dist/heart/versioning/update-hooks.js +154 -0
  231. package/dist/heart/work-card.js +390 -0
  232. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  233. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  234. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  235. package/dist/mailbox-ui/index.html +16 -0
  236. package/dist/mailroom/attention.js +167 -0
  237. package/dist/mailroom/autonomy.js +209 -0
  238. package/dist/mailroom/blob-store.js +715 -0
  239. package/dist/mailroom/body-cache.js +61 -0
  240. package/dist/mailroom/core.js +788 -0
  241. package/dist/mailroom/entry.js +160 -0
  242. package/dist/mailroom/file-store.js +568 -0
  243. package/dist/mailroom/mbox-import.js +393 -0
  244. package/dist/mailroom/migration.js +164 -0
  245. package/dist/mailroom/outbound.js +380 -0
  246. package/dist/mailroom/policy.js +263 -0
  247. package/dist/mailroom/reader.js +233 -0
  248. package/dist/mailroom/search-cache.js +334 -0
  249. package/dist/mailroom/search-relevance.js +319 -0
  250. package/dist/mailroom/smtp-ingress.js +176 -0
  251. package/dist/mailroom/source-state.js +176 -0
  252. package/dist/mailroom/thread.js +109 -0
  253. package/dist/mailroom/travel-extract.js +89 -0
  254. package/dist/mind/bundle-manifest.js +24 -2
  255. package/dist/mind/context.js +250 -101
  256. package/dist/mind/desk-section.js +362 -0
  257. package/dist/mind/diary-integrity.js +60 -0
  258. package/dist/mind/{memory.js → diary.js} +68 -77
  259. package/dist/mind/embedding-provider.js +60 -0
  260. package/dist/mind/file-state.js +179 -0
  261. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  262. package/dist/mind/obligation-steering.js +221 -0
  263. package/dist/mind/pending.js +13 -8
  264. package/dist/mind/prompt-refresh.js +3 -2
  265. package/dist/mind/prompt.js +1009 -169
  266. package/dist/mind/provenance-trust.js +26 -0
  267. package/dist/mind/record-paths.js +312 -0
  268. package/dist/mind/scrutiny.js +173 -0
  269. package/dist/nerves/cli-logging.js +7 -1
  270. package/dist/nerves/coverage/audit-rules.js +15 -6
  271. package/dist/nerves/coverage/audit.js +28 -2
  272. package/dist/nerves/coverage/cli.js +1 -1
  273. package/dist/nerves/coverage/contract.js +5 -5
  274. package/dist/nerves/coverage/file-completeness.js +139 -5
  275. package/dist/nerves/event-buffer.js +111 -0
  276. package/dist/nerves/index.js +224 -4
  277. package/dist/nerves/observation.js +20 -0
  278. package/dist/nerves/redact.js +79 -0
  279. package/dist/nerves/review/cli-main.js +5 -0
  280. package/dist/nerves/review/cli.js +156 -0
  281. package/dist/nerves/review/core.js +152 -0
  282. package/dist/nerves/runtime.js +5 -1
  283. package/dist/repertoire/ado-client.js +15 -56
  284. package/dist/repertoire/ado-semantic.js +16 -10
  285. package/dist/repertoire/api-client.js +97 -0
  286. package/dist/repertoire/bitwarden-store.js +1042 -0
  287. package/dist/repertoire/bundle-templates.js +71 -0
  288. package/dist/repertoire/bw-installer.js +180 -0
  289. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  290. package/dist/repertoire/coding/context-pack.js +331 -0
  291. package/dist/repertoire/coding/feedback.js +218 -30
  292. package/dist/repertoire/coding/index.js +15 -3
  293. package/dist/repertoire/coding/manager.js +166 -10
  294. package/dist/repertoire/coding/spawner.js +58 -11
  295. package/dist/repertoire/coding/tools.js +242 -14
  296. package/dist/repertoire/coding/workbench-client.js +272 -0
  297. package/dist/repertoire/coding/workbench-manager.js +346 -0
  298. package/dist/repertoire/commerce-errors.js +109 -0
  299. package/dist/repertoire/commerce-self-test.js +156 -0
  300. package/dist/repertoire/credential-access.js +178 -0
  301. package/dist/repertoire/desk/classifier.js +362 -0
  302. package/dist/repertoire/duffel-client.js +185 -0
  303. package/dist/repertoire/github-client.js +14 -55
  304. package/dist/repertoire/graph-client.js +11 -52
  305. package/dist/repertoire/guardrails.js +159 -27
  306. package/dist/repertoire/mcp-client.js +44 -3
  307. package/dist/repertoire/mcp-manager.js +259 -20
  308. package/dist/repertoire/mcp-tools.js +83 -0
  309. package/dist/repertoire/plugin-mcp.js +175 -0
  310. package/dist/repertoire/plugins.js +253 -0
  311. package/dist/repertoire/shell-sessions.js +133 -0
  312. package/dist/repertoire/skills.js +48 -4
  313. package/dist/repertoire/stripe-client.js +131 -0
  314. package/dist/repertoire/tool-results.js +29 -0
  315. package/dist/repertoire/tools-a2a.js +699 -0
  316. package/dist/repertoire/tools-attachments.js +317 -0
  317. package/dist/repertoire/tools-awaiting.js +372 -0
  318. package/dist/repertoire/tools-base.js +63 -1095
  319. package/dist/repertoire/tools-bluebubbles.js +2 -0
  320. package/dist/repertoire/tools-bridge.js +144 -0
  321. package/dist/repertoire/tools-bundle.js +993 -0
  322. package/dist/repertoire/tools-commerce.js +253 -0
  323. package/dist/repertoire/tools-config.js +186 -0
  324. package/dist/repertoire/tools-continuity.js +252 -0
  325. package/dist/repertoire/tools-credential.js +383 -0
  326. package/dist/repertoire/tools-evolution.js +527 -0
  327. package/dist/repertoire/tools-files.js +344 -0
  328. package/dist/repertoire/tools-flight.js +290 -0
  329. package/dist/repertoire/tools-flow.js +119 -0
  330. package/dist/repertoire/tools-github.js +3 -8
  331. package/dist/repertoire/tools-mail.js +1975 -0
  332. package/dist/repertoire/tools-notes.js +459 -0
  333. package/dist/repertoire/tools-obligations.js +143 -0
  334. package/dist/repertoire/tools-orientation.js +31 -0
  335. package/dist/repertoire/tools-record.js +482 -0
  336. package/dist/repertoire/tools-runtime.js +150 -0
  337. package/dist/repertoire/tools-session.js +881 -0
  338. package/dist/repertoire/tools-shell.js +120 -0
  339. package/dist/repertoire/tools-stripe.js +224 -0
  340. package/dist/repertoire/tools-surface.js +355 -0
  341. package/dist/repertoire/tools-teams.js +12 -39
  342. package/dist/repertoire/tools-travel.js +125 -0
  343. package/dist/repertoire/tools-trip.js +982 -0
  344. package/dist/repertoire/tools-user-profile.js +146 -0
  345. package/dist/repertoire/tools-vault.js +40 -0
  346. package/dist/repertoire/tools-voice.js +145 -0
  347. package/dist/repertoire/tools.js +250 -80
  348. package/dist/repertoire/travel-api-client.js +360 -0
  349. package/dist/repertoire/user-profile.js +131 -0
  350. package/dist/repertoire/vault-setup.js +246 -0
  351. package/dist/repertoire/vault-unlock.js +594 -0
  352. package/dist/scripts/claude-code-hook.js +41 -0
  353. package/dist/scripts/claude-code-stop-hook.js +47 -0
  354. package/dist/senses/a2a-entry.js +115 -0
  355. package/dist/senses/attention-queue.js +186 -0
  356. package/dist/senses/await-turn-message.js +58 -0
  357. package/dist/senses/bluebubbles/active-turns.js +216 -0
  358. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  359. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  360. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  361. package/dist/senses/bluebubbles/entry.js +77 -0
  362. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  363. package/dist/senses/bluebubbles/index.js +2732 -0
  364. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  365. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  366. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  367. package/dist/senses/bluebubbles/processed-log.js +133 -0
  368. package/dist/senses/bluebubbles/replay.js +137 -0
  369. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  370. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  371. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  372. package/dist/senses/cli/bracketed-paste.js +82 -0
  373. package/dist/senses/cli/image-paste.js +287 -0
  374. package/dist/senses/cli/image-ref-navigation.js +75 -0
  375. package/dist/senses/cli/ink-app.js +156 -0
  376. package/dist/senses/cli/inline-diff.js +64 -0
  377. package/dist/senses/cli/input-keys.js +174 -0
  378. package/dist/senses/cli/kill-ring.js +86 -0
  379. package/dist/senses/cli/message-list.js +51 -0
  380. package/dist/senses/cli/ouro-tui.js +607 -0
  381. package/dist/senses/cli/spinner-imperative.js +135 -0
  382. package/dist/senses/cli/spinner.js +101 -0
  383. package/dist/senses/cli/status-line.js +60 -0
  384. package/dist/senses/cli/streaming-markdown.js +526 -0
  385. package/dist/senses/cli/tool-display.js +85 -0
  386. package/dist/senses/cli/tool-render.js +85 -0
  387. package/dist/senses/cli/tui-store.js +240 -0
  388. package/dist/senses/cli/virtual-list.js +35 -0
  389. package/dist/senses/cli-entry.js +60 -8
  390. package/dist/senses/cli-layout.js +100 -0
  391. package/dist/senses/cli.js +521 -214
  392. package/dist/senses/commands.js +66 -3
  393. package/dist/senses/habit-turn-message.js +160 -0
  394. package/dist/senses/mail-entry.js +66 -0
  395. package/dist/senses/mail.js +395 -0
  396. package/dist/senses/pipeline.js +873 -179
  397. package/dist/senses/private-runtime-worker.js +584 -0
  398. package/dist/senses/private-runtime.js +1145 -0
  399. package/dist/senses/proactive-content-guard.js +51 -0
  400. package/dist/senses/shared-turn.js +416 -0
  401. package/dist/senses/surface-tool.js +109 -0
  402. package/dist/senses/teams-entry.js +60 -8
  403. package/dist/senses/teams.js +397 -112
  404. package/dist/senses/trust-gate.js +104 -9
  405. package/dist/senses/voice/audio-playback.js +237 -0
  406. package/dist/senses/voice/audio-routing.js +119 -0
  407. package/dist/senses/voice/elevenlabs.js +202 -0
  408. package/dist/senses/voice/floor-control.js +431 -0
  409. package/dist/senses/voice/floor-controller.js +115 -0
  410. package/dist/senses/voice/golden-path.js +116 -0
  411. package/dist/senses/voice/index.js +29 -0
  412. package/dist/senses/voice/meeting.js +113 -0
  413. package/dist/senses/voice/outbound.js +190 -0
  414. package/dist/senses/voice/phone.js +33 -0
  415. package/dist/senses/voice/playback.js +139 -0
  416. package/dist/senses/voice/realtime-eval.js +496 -0
  417. package/dist/senses/voice/realtime-trace.js +531 -0
  418. package/dist/senses/voice/transcript.js +70 -0
  419. package/dist/senses/voice/turn.js +191 -0
  420. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  421. package/dist/senses/voice/twilio-phone.js +5077 -0
  422. package/dist/senses/voice/types.js +2 -0
  423. package/dist/senses/voice/whisper.js +161 -0
  424. package/dist/senses/voice-entry.js +81 -0
  425. package/dist/senses/voice-realtime-eval-command.js +99 -0
  426. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  427. package/dist/senses/voice-twilio-entry.js +87 -0
  428. package/dist/trips/core.js +138 -0
  429. package/dist/trips/store.js +265 -0
  430. package/dist/util/frontmatter.js +69 -0
  431. package/package.json +57 -12
  432. package/skills/agent-commerce.md +113 -0
  433. package/skills/browser-navigation.md +117 -0
  434. package/skills/commerce-setup-guide.md +116 -0
  435. package/skills/commerce-setup.md +84 -0
  436. package/skills/configure-dev-tools.md +99 -0
  437. package/skills/travel-planning.md +138 -0
  438. package/dist/heart/daemon/auth-flow.js +0 -351
  439. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  440. package/dist/heart/daemon/update-hooks.js +0 -138
  441. package/dist/heart/safe-workspace.js +0 -228
  442. package/dist/heart/session-recall.js +0 -116
  443. package/dist/mind/friends/channel.js +0 -84
  444. package/dist/mind/friends/group-context.js +0 -144
  445. package/dist/mind/friends/resolver.js +0 -84
  446. package/dist/mind/friends/store-file.js +0 -190
  447. package/dist/mind/friends/store.js +0 -4
  448. package/dist/mind/friends/tokens.js +0 -26
  449. package/dist/mind/friends/trust-explanation.js +0 -74
  450. package/dist/mind/friends/types.js +0 -29
  451. package/dist/repertoire/tasks/board.js +0 -134
  452. package/dist/repertoire/tasks/index.js +0 -224
  453. package/dist/repertoire/tasks/lifecycle.js +0 -80
  454. package/dist/repertoire/tasks/middleware.js +0 -65
  455. package/dist/repertoire/tasks/parser.js +0 -173
  456. package/dist/repertoire/tasks/scanner.js +0 -132
  457. package/dist/repertoire/tasks/transitions.js +0 -144
  458. package/dist/senses/bluebubbles-entry.js +0 -13
  459. package/dist/senses/bluebubbles.js +0 -1180
  460. package/dist/senses/debug-activity.js +0 -148
  461. package/dist/senses/inner-dialog-worker.js +0 -90
  462. package/dist/senses/inner-dialog.js +0 -480
  463. package/subagents/README.md +0 -7
  464. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  465. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  466. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  467. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  468. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  469. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  470. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  471. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  472. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  473. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  474. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  475. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  476. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  477. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  478. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  479. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  480. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,190 +0,0 @@
1
- "use strict";
2
- // FileFriendStore -- filesystem adapter for FriendStore.
3
- // Stores each friend as one unified JSON file in bundle `friends/`.
4
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
- if (k2 === undefined) k2 = k;
6
- var desc = Object.getOwnPropertyDescriptor(m, k);
7
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
- desc = { enumerable: true, get: function() { return m[k]; } };
9
- }
10
- Object.defineProperty(o, k2, desc);
11
- }) : (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- o[k2] = m[k];
14
- }));
15
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
- Object.defineProperty(o, "default", { enumerable: true, value: v });
17
- }) : function(o, v) {
18
- o["default"] = v;
19
- });
20
- var __importStar = (this && this.__importStar) || (function () {
21
- var ownKeys = function(o) {
22
- ownKeys = Object.getOwnPropertyNames || function (o) {
23
- var ar = [];
24
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
- return ar;
26
- };
27
- return ownKeys(o);
28
- };
29
- return function (mod) {
30
- if (mod && mod.__esModule) return mod;
31
- var result = {};
32
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
- __setModuleDefault(result, mod);
34
- return result;
35
- };
36
- })();
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.FileFriendStore = void 0;
39
- const fs = __importStar(require("fs"));
40
- const fsPromises = __importStar(require("fs/promises"));
41
- const path = __importStar(require("path"));
42
- const runtime_1 = require("../../nerves/runtime");
43
- const DEFAULT_ROLE = "friend";
44
- const DEFAULT_TRUST_LEVEL = "friend";
45
- class FileFriendStore {
46
- friendsPath;
47
- constructor(friendsPath) {
48
- this.friendsPath = friendsPath;
49
- fs.mkdirSync(friendsPath, { recursive: true });
50
- (0, runtime_1.emitNervesEvent)({
51
- component: "friends",
52
- event: "friends.store_init",
53
- message: "file friend store initialized",
54
- meta: {},
55
- });
56
- }
57
- async get(id) {
58
- const record = await this.readJson(path.join(this.friendsPath, `${id}.json`));
59
- if (!record)
60
- return null;
61
- return this.normalize(record);
62
- }
63
- async put(id, record) {
64
- await this.writeJson(path.join(this.friendsPath, `${id}.json`), this.normalize(record));
65
- }
66
- async delete(id) {
67
- await this.removeFile(path.join(this.friendsPath, `${id}.json`));
68
- }
69
- async findByExternalId(provider, externalId, tenantId) {
70
- let entries;
71
- try {
72
- entries = await fsPromises.readdir(this.friendsPath);
73
- }
74
- catch {
75
- return null;
76
- }
77
- for (const entry of entries) {
78
- if (!entry.endsWith(".json"))
79
- continue;
80
- const raw = await this.readJson(path.join(this.friendsPath, entry));
81
- if (!raw)
82
- continue;
83
- const record = this.normalize(raw);
84
- const match = record.externalIds.some((ext) => ext.provider === provider &&
85
- ext.externalId === externalId &&
86
- (tenantId === undefined || ext.tenantId === tenantId));
87
- if (match) {
88
- return record;
89
- }
90
- }
91
- return null;
92
- }
93
- async hasAnyFriends() {
94
- let entries;
95
- try {
96
- entries = await fsPromises.readdir(this.friendsPath);
97
- }
98
- catch {
99
- return false;
100
- }
101
- return entries.some((entry) => entry.endsWith(".json"));
102
- }
103
- async listAll() {
104
- let entries;
105
- try {
106
- entries = await fsPromises.readdir(this.friendsPath);
107
- }
108
- catch {
109
- return [];
110
- }
111
- const records = [];
112
- for (const entry of entries) {
113
- if (!entry.endsWith(".json"))
114
- continue;
115
- const raw = await this.readJson(path.join(this.friendsPath, entry));
116
- if (!raw)
117
- continue;
118
- records.push(this.normalize(raw));
119
- }
120
- return records;
121
- }
122
- normalize(raw) {
123
- const trustLevel = raw.trustLevel;
124
- const normalizedTrustLevel = trustLevel === "family" ||
125
- trustLevel === "friend" ||
126
- trustLevel === "acquaintance" ||
127
- trustLevel === "stranger"
128
- ? trustLevel
129
- : DEFAULT_TRUST_LEVEL;
130
- return {
131
- id: raw.id,
132
- name: raw.name,
133
- role: typeof raw.role === "string" && raw.role.trim() ? raw.role : DEFAULT_ROLE,
134
- trustLevel: normalizedTrustLevel,
135
- connections: Array.isArray(raw.connections)
136
- ? raw.connections
137
- .filter((connection) => (typeof connection === "object" &&
138
- connection !== null &&
139
- typeof connection.name === "string" &&
140
- typeof connection.relationship === "string"))
141
- .map((connection) => ({
142
- name: connection.name,
143
- relationship: connection.relationship,
144
- }))
145
- : [],
146
- externalIds: Array.isArray(raw.externalIds) ? raw.externalIds : [],
147
- tenantMemberships: Array.isArray(raw.tenantMemberships) ? raw.tenantMemberships : [],
148
- toolPreferences: raw.toolPreferences && typeof raw.toolPreferences === "object"
149
- ? raw.toolPreferences
150
- : {},
151
- notes: raw.notes && typeof raw.notes === "object" ? raw.notes : {},
152
- totalTokens: typeof raw.totalTokens === "number" ? raw.totalTokens : 0,
153
- createdAt: typeof raw.createdAt === "string" ? raw.createdAt : new Date().toISOString(),
154
- updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : new Date().toISOString(),
155
- schemaVersion: typeof raw.schemaVersion === "number" ? raw.schemaVersion : 1,
156
- };
157
- }
158
- async readJson(filePath) {
159
- try {
160
- const raw = await fsPromises.readFile(filePath, "utf-8");
161
- try {
162
- const parsed = JSON.parse(raw);
163
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
164
- return null;
165
- }
166
- return parsed;
167
- }
168
- catch {
169
- return null;
170
- }
171
- }
172
- catch {
173
- return null;
174
- }
175
- }
176
- async writeJson(filePath, data) {
177
- await fsPromises.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
178
- }
179
- async removeFile(filePath) {
180
- try {
181
- await fsPromises.unlink(filePath);
182
- }
183
- catch (err) {
184
- if (err?.code === "ENOENT")
185
- return;
186
- throw err;
187
- }
188
- }
189
- }
190
- exports.FileFriendStore = FileFriendStore;
@@ -1,4 +0,0 @@
1
- "use strict";
2
- // Friend store abstraction.
3
- // All friend persistence goes through FriendStore -- no friend module imports `fs` directly.
4
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,26 +0,0 @@
1
- "use strict";
2
- // Token accumulation helper.
3
- // Tracks cumulative token usage per friend across turns.
4
- // Called from both CLI and Teams adapters after each agent turn.
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.accumulateFriendTokens = accumulateFriendTokens;
7
- const runtime_1 = require("../../nerves/runtime");
8
- async function accumulateFriendTokens(store, friendId, usage) {
9
- if (!usage?.output_tokens)
10
- return;
11
- const record = await store.get(friendId);
12
- if (!record)
13
- return;
14
- // Only count output tokens (what the model generated for this friend).
15
- // Input tokens are mostly system prompt re-sent every turn -- counting them
16
- // would inflate the total and make the onboarding threshold meaningless.
17
- record.totalTokens = (record.totalTokens ?? 0) + usage.output_tokens;
18
- record.updatedAt = new Date().toISOString();
19
- await store.put(record.id, record);
20
- (0, runtime_1.emitNervesEvent)({
21
- component: "friends",
22
- event: "friends.tokens_accumulated",
23
- message: "tokens accumulated for friend",
24
- meta: { friendId, outputTokens: usage.output_tokens },
25
- });
26
- }
@@ -1,74 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.describeTrustContext = describeTrustContext;
4
- const runtime_1 = require("../../nerves/runtime");
5
- function findRelatedGroupId(friend) {
6
- return friend.externalIds.find((externalId) => externalId.externalId.startsWith("group:"))?.externalId;
7
- }
8
- function resolveLevel(friend) {
9
- return friend.trustLevel ?? "stranger";
10
- }
11
- function describeTrustContext(input) {
12
- const level = resolveLevel(input.friend);
13
- const relatedGroupId = findRelatedGroupId(input.friend);
14
- const explanation = level === "family" || level === "friend"
15
- ? {
16
- level,
17
- basis: "direct",
18
- summary: level === "family"
19
- ? "direct family trust"
20
- : "direct trusted relationship",
21
- why: "this relationship is directly trusted rather than inferred through a shared group or cold first contact.",
22
- permits: [
23
- "local operations when appropriate",
24
- "proactive follow-through",
25
- "full collaborative problem solving",
26
- ],
27
- constraints: [],
28
- }
29
- : level === "acquaintance"
30
- ? {
31
- level,
32
- basis: "shared_group",
33
- summary: relatedGroupId
34
- ? "known through the shared project group"
35
- : "known through a shared group context",
36
- why: relatedGroupId
37
- ? `this trust comes from the shared group context ${relatedGroupId}, not from direct endorsement.`
38
- : "this trust comes from shared group context rather than direct endorsement.",
39
- permits: [
40
- "group-safe coordination",
41
- "normal conversation inside the shared context",
42
- ],
43
- constraints: [
44
- "guarded local actions",
45
- "do not assume broad private authority",
46
- ],
47
- relatedGroupId,
48
- }
49
- : {
50
- level,
51
- basis: "unknown",
52
- summary: "truly unknown first-contact context",
53
- why: "this person is not known through direct trust or a shared group context.",
54
- permits: [
55
- "safe first-contact orientation only",
56
- ],
57
- constraints: [
58
- "first contact does not reach the full model on open channels",
59
- "no local or privileged actions",
60
- ],
61
- };
62
- (0, runtime_1.emitNervesEvent)({
63
- component: "friends",
64
- event: "friends.trust_explained",
65
- message: "built explicit trust explanation",
66
- meta: {
67
- channel: input.channel,
68
- level: explanation.level,
69
- basis: explanation.basis,
70
- hasRelatedGroup: Boolean(explanation.relatedGroupId),
71
- },
72
- });
73
- return explanation;
74
- }
@@ -1,29 +0,0 @@
1
- "use strict";
2
- // Context kernel type definitions.
3
- // FriendRecord (merged identity + memory), channel capabilities, and resolved context.
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.TRUSTED_LEVELS = void 0;
6
- exports.isIdentityProvider = isIdentityProvider;
7
- exports.isIntegration = isIntegration;
8
- exports.isTrustedLevel = isTrustedLevel;
9
- const runtime_1 = require("../../nerves/runtime");
10
- const IDENTITY_PROVIDERS = new Set(["aad", "local", "teams-conversation", "imessage-handle"]);
11
- function isIdentityProvider(value) {
12
- (0, runtime_1.emitNervesEvent)({
13
- component: "friends",
14
- event: "friends.identity_provider_check",
15
- message: "identity provider validation",
16
- meta: {},
17
- });
18
- return typeof value === "string" && IDENTITY_PROVIDERS.has(value);
19
- }
20
- const INTEGRATIONS = new Set(["ado", "github", "graph"]);
21
- function isIntegration(value) {
22
- return typeof value === "string" && INTEGRATIONS.has(value);
23
- }
24
- /** Trust levels that grant full tool access and proactive send capability. */
25
- exports.TRUSTED_LEVELS = new Set(["family", "friend"]);
26
- /** Whether a trust level grants full access (family or friend). Defaults to "friend" for legacy records. */
27
- function isTrustedLevel(trustLevel) {
28
- return exports.TRUSTED_LEVELS.has(trustLevel ?? "friend");
29
- }
@@ -1,134 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildTaskBoard = buildTaskBoard;
4
- exports.boardStatus = boardStatus;
5
- exports.boardAction = boardAction;
6
- exports.boardDeps = boardDeps;
7
- exports.boardSessions = boardSessions;
8
- const runtime_1 = require("../../nerves/runtime");
9
- const transitions_1 = require("./transitions");
10
- const BOARD_STATUS_ORDER = [
11
- "blocked",
12
- "processing",
13
- "collaborating",
14
- "drafting",
15
- "validating",
16
- "paused",
17
- "done",
18
- ];
19
- function compactName(task) {
20
- const suffix = task.stem.replace(/^\d{4}-\d{2}-\d{2}-\d{4}-/, "");
21
- return suffix.length > 0 ? suffix : task.stem;
22
- }
23
- function groupByStatus(tasks) {
24
- const grouped = {
25
- drafting: [],
26
- processing: [],
27
- validating: [],
28
- collaborating: [],
29
- paused: [],
30
- blocked: [],
31
- done: [],
32
- };
33
- for (const task of tasks) {
34
- grouped[task.status].push(compactName(task));
35
- }
36
- for (const status of transitions_1.TASK_VALID_STATUSES) {
37
- grouped[status].sort();
38
- }
39
- return grouped;
40
- }
41
- function unresolvedDependencies(index) {
42
- const stems = new Set(index.tasks.map((task) => task.stem));
43
- const unresolved = [];
44
- for (const task of index.tasks) {
45
- const deps = Array.isArray(task.frontmatter.depends_on) ? task.frontmatter.depends_on : [];
46
- for (const dep of deps) {
47
- if (typeof dep === "string" && dep.trim() && !stems.has(dep)) {
48
- unresolved.push(`${task.stem} -> missing ${dep}`);
49
- }
50
- }
51
- }
52
- return unresolved.sort();
53
- }
54
- function activeSessionLines(tasks) {
55
- const active = tasks.filter((task) => {
56
- const session = task.frontmatter.active_session;
57
- const codingSession = task.frontmatter.coding_session;
58
- return Boolean(session) || Boolean(codingSession);
59
- });
60
- return active.map((task) => task.stem).sort();
61
- }
62
- function activeBridgeLines(tasks) {
63
- return tasks
64
- .filter((task) => typeof task.frontmatter.active_bridge === "string" && String(task.frontmatter.active_bridge).trim())
65
- .map((task) => `${task.stem} -> ${String(task.frontmatter.active_bridge).trim()}`)
66
- .sort();
67
- }
68
- function actionRequired(index, byStatus) {
69
- const actions = [...index.parseErrors, ...index.invalidFilenames.map((filePath) => `bad filename: ${filePath}`)];
70
- if (byStatus.blocked.length > 0) {
71
- actions.push(`blocked tasks: ${byStatus.blocked.join(", ")}`);
72
- }
73
- const missingCategory = index.tasks
74
- .filter((task) => !task.category || !task.category.trim())
75
- .map((task) => `missing category: ${task.stem}`);
76
- return [...actions, ...missingCategory];
77
- }
78
- function buildTaskBoard(index) {
79
- (0, runtime_1.emitNervesEvent)({
80
- event: "mind.step_start",
81
- component: "mind",
82
- message: "building task board",
83
- meta: { taskCount: index.tasks.length },
84
- });
85
- const byStatus = groupByStatus(index.tasks);
86
- const counts = transitions_1.TASK_VALID_STATUSES.map((status) => `${status}:${byStatus[status].length}`).join(" ");
87
- const processing = byStatus.processing.length > 0 ? `\n processing: ${byStatus.processing.join(", ")}` : "";
88
- const blocked = byStatus.blocked.length > 0 ? `\n blocked: ${byStatus.blocked.join(", ")}` : "";
89
- const compact = `[Tasks] ${counts}${processing}${blocked}`;
90
- const fullLines = [];
91
- for (const status of BOARD_STATUS_ORDER) {
92
- const names = byStatus[status];
93
- if (status === "done" && names.length === 0)
94
- continue;
95
- fullLines.push(`## ${status}`);
96
- fullLines.push(names.length > 0 ? names.map((name) => `- ${name}`).join("\n") : "- (none)");
97
- }
98
- const unresolved = unresolvedDependencies(index);
99
- if (unresolved.length > 0) {
100
- fullLines.push("## dependencies");
101
- fullLines.push(unresolved.map((line) => `- ${line}`).join("\n"));
102
- }
103
- const active = activeSessionLines(index.tasks);
104
- if (active.length > 0) {
105
- fullLines.push("## active sessions");
106
- fullLines.push(active.map((line) => `- ${line}`).join("\n"));
107
- }
108
- const activeBridges = activeBridgeLines(index.tasks);
109
- if (activeBridges.length > 0) {
110
- fullLines.push("## active bridges");
111
- fullLines.push(activeBridges.map((line) => `- ${line}`).join("\n"));
112
- }
113
- return {
114
- compact,
115
- full: fullLines.join("\n\n"),
116
- byStatus,
117
- actionRequired: actionRequired(index, byStatus),
118
- unresolvedDependencies: unresolved,
119
- activeSessions: active,
120
- activeBridges,
121
- };
122
- }
123
- function boardStatus(board, status) {
124
- return board.byStatus[status] ?? [];
125
- }
126
- function boardAction(board) {
127
- return board.actionRequired;
128
- }
129
- function boardDeps(board) {
130
- return board.unresolvedDependencies;
131
- }
132
- function boardSessions(board) {
133
- return board.activeSessions;
134
- }
@@ -1,224 +0,0 @@
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.getTaskModule = getTaskModule;
37
- exports.resetTaskModule = resetTaskModule;
38
- const fs = __importStar(require("fs"));
39
- const path = __importStar(require("path"));
40
- const config_1 = require("../../heart/config");
41
- const runtime_1 = require("../../nerves/runtime");
42
- const board_1 = require("./board");
43
- const lifecycle_1 = require("./lifecycle");
44
- const parser_1 = require("./parser");
45
- const scanner_1 = require("./scanner");
46
- const middleware_1 = require("./middleware");
47
- const transitions_1 = require("./transitions");
48
- function formatDate(now = new Date()) {
49
- return now.toISOString().slice(0, 10);
50
- }
51
- function formatStemTimestamp(now = new Date()) {
52
- const year = now.getFullYear();
53
- const month = String(now.getMonth() + 1).padStart(2, "0");
54
- const day = String(now.getDate()).padStart(2, "0");
55
- const hours = String(now.getHours()).padStart(2, "0");
56
- const minutes = String(now.getMinutes()).padStart(2, "0");
57
- return `${year}-${month}-${day}-${hours}${minutes}`;
58
- }
59
- function findTask(index, nameOrStem) {
60
- return (index.tasks.find((task) => task.stem === nameOrStem || task.name === nameOrStem) ??
61
- index.tasks.find((task) => task.stem.endsWith(nameOrStem)) ??
62
- null);
63
- }
64
- function removeRuntimeFrontmatter(frontmatter) {
65
- const { _isCanonicalFilename, ...clean } = frontmatter;
66
- return clean;
67
- }
68
- class FileTaskModule {
69
- scan() {
70
- return (0, scanner_1.scanTasks)((0, scanner_1.getTaskRoot)());
71
- }
72
- getBoard() {
73
- return (0, board_1.buildTaskBoard)(this.scan());
74
- }
75
- getTask(name) {
76
- return findTask(this.scan(), name);
77
- }
78
- createTask(input) {
79
- (0, runtime_1.emitNervesEvent)({
80
- event: "mind.step_start",
81
- component: "mind",
82
- message: "creating task file",
83
- meta: { type: input.type },
84
- });
85
- const type = (0, transitions_1.normalizeTaskType)(input.type);
86
- if (!type) {
87
- throw new Error(`invalid task type: ${input.type}`);
88
- }
89
- const status = (0, transitions_1.normalizeTaskStatus)(input.status ?? "drafting");
90
- if (!status) {
91
- throw new Error(`invalid task status: ${String(input.status)}`);
92
- }
93
- const collection = (0, transitions_1.canonicalCollectionForTaskType)(type);
94
- const stem = `${formatStemTimestamp()}-${(0, config_1.slugify)(input.title).slice(0, 64) || "task"}`;
95
- const filename = `${stem}.md`;
96
- const root = (0, scanner_1.getTaskRoot)();
97
- const filePath = path.join(root, collection, filename);
98
- const today = formatDate();
99
- const frontmatter = {
100
- type,
101
- category: input.category || "infrastructure",
102
- title: input.title,
103
- status,
104
- validator: input.validator ?? null,
105
- requester: input.requester ?? "agent",
106
- cadence: input.cadence ?? null,
107
- scheduledAt: input.scheduledAt ?? null,
108
- lastRun: input.lastRun ?? null,
109
- created: today,
110
- updated: today,
111
- child_tasks: [],
112
- artifacts: [],
113
- };
114
- if (type === "one-shot") {
115
- frontmatter.parent_task = null;
116
- frontmatter.depends_on = [];
117
- }
118
- if (input.activeBridge && input.activeBridge.trim()) {
119
- frontmatter.active_bridge = input.activeBridge.trim();
120
- }
121
- if (Array.isArray(input.bridgeSessions) && input.bridgeSessions.length > 0) {
122
- frontmatter.bridge_sessions = input.bridgeSessions.filter((value) => typeof value === "string" && value.trim());
123
- }
124
- const content = (0, parser_1.renderTaskFile)(frontmatter, input.body);
125
- const validation = (0, middleware_1.validateWrite)(filePath, content);
126
- if (!validation.ok) {
127
- throw new Error(validation.reason ?? "task write validation failed");
128
- }
129
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
130
- fs.writeFileSync(filePath, content, "utf-8");
131
- (0, scanner_1.clearTaskScanCache)();
132
- return filePath;
133
- }
134
- bindBridge(name, input) {
135
- const task = this.getTask(name);
136
- if (!task) {
137
- return { ok: false, reason: `task not found: ${name}` };
138
- }
139
- const content = fs.readFileSync(task.path, "utf-8");
140
- const parsed = (0, parser_1.parseTaskFile)(content, task.path);
141
- const frontmatter = removeRuntimeFrontmatter(parsed.frontmatter);
142
- frontmatter.active_bridge = input.bridgeId.trim();
143
- frontmatter.bridge_sessions = input.sessionRefs.filter((value) => value.trim().length > 0);
144
- frontmatter.updated = formatDate();
145
- fs.writeFileSync(task.path, (0, parser_1.renderTaskFile)(frontmatter, parsed.body), "utf-8");
146
- (0, scanner_1.clearTaskScanCache)();
147
- return { ok: true, path: task.path };
148
- }
149
- updateStatus(name, toStatus) {
150
- const normalized = (0, transitions_1.normalizeTaskStatus)(toStatus);
151
- if (!normalized) {
152
- return { ok: false, from: "drafting", to: "drafting", reason: `invalid target status: ${toStatus}` };
153
- }
154
- const index = this.scan();
155
- const task = findTask(index, name);
156
- if (!task) {
157
- return { ok: false, from: "drafting", to: normalized, reason: `task not found: ${name}` };
158
- }
159
- const gate = (0, middleware_1.validateStatusTransition)(task, normalized);
160
- if (!gate.ok) {
161
- return { ok: false, from: task.status, to: normalized, reason: gate.reason };
162
- }
163
- const content = fs.readFileSync(task.path, "utf-8");
164
- const parsed = (0, parser_1.parseTaskFile)(content, task.path);
165
- const frontmatter = removeRuntimeFrontmatter(parsed.frontmatter);
166
- frontmatter.status = normalized;
167
- frontmatter.updated = formatDate();
168
- fs.writeFileSync(task.path, (0, parser_1.renderTaskFile)(frontmatter, parsed.body), "utf-8");
169
- (0, scanner_1.clearTaskScanCache)();
170
- const transition = { ok: true, from: task.status, to: normalized };
171
- const afterIndex = this.scan();
172
- const archive = (0, lifecycle_1.archiveCompletedTasks)(afterIndex);
173
- if (archive.archived.length > 0 || archive.failures.length > 0) {
174
- (0, scanner_1.clearTaskScanCache)();
175
- }
176
- return {
177
- ...transition,
178
- path: task.path,
179
- archived: archive.archived,
180
- };
181
- }
182
- validateWrite(filePath, content) {
183
- return (0, middleware_1.validateWrite)(filePath, content);
184
- }
185
- validateTransition(from, to) {
186
- return (0, transitions_1.validateTransition)(from, to);
187
- }
188
- validateSpawn(taskName, spawnType) {
189
- const task = this.getTask(taskName);
190
- if (!task) {
191
- return { ok: false, reason: `task not found: ${taskName}` };
192
- }
193
- return (0, middleware_1.validateSpawn)(task, spawnType);
194
- }
195
- detectStale(thresholdDays) {
196
- return (0, lifecycle_1.detectStaleTasks)(this.scan(), thresholdDays);
197
- }
198
- boardStatus(status) {
199
- const normalized = (0, transitions_1.normalizeTaskStatus)(status);
200
- if (!normalized)
201
- return [];
202
- return (0, board_1.boardStatus)(this.getBoard(), normalized);
203
- }
204
- boardAction() {
205
- return (0, board_1.boardAction)(this.getBoard());
206
- }
207
- boardDeps() {
208
- return (0, board_1.boardDeps)(this.getBoard());
209
- }
210
- boardSessions() {
211
- return (0, board_1.boardSessions)(this.getBoard());
212
- }
213
- }
214
- let taskModule = null;
215
- function getTaskModule() {
216
- if (!taskModule) {
217
- taskModule = new FileTaskModule();
218
- }
219
- return taskModule;
220
- }
221
- function resetTaskModule() {
222
- taskModule = null;
223
- (0, scanner_1.clearTaskScanCache)();
224
- }