@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,131 @@
1
+ "use strict";
2
+ /**
3
+ * Thin wrapper around the Stripe Issuing API.
4
+ *
5
+ * Initializes with a restricted API key from the agent's vault.
6
+ * Card numbers are NEVER included in nerves events or log output.
7
+ * The `getCardDetails` method exists only for internal payment flows
8
+ * (e.g., passing card details to Duffel) — the returned data must
9
+ * never escape the calling function's scope.
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.createStripeClient = createStripeClient;
16
+ const stripe_1 = __importDefault(require("stripe"));
17
+ const credential_access_1 = require("./credential-access");
18
+ const runtime_1 = require("../nerves/runtime");
19
+ // ---------------------------------------------------------------------------
20
+ // Implementation
21
+ // ---------------------------------------------------------------------------
22
+ function toCardInfo(card) {
23
+ return {
24
+ cardId: card.id,
25
+ last4: card.last4,
26
+ status: card.status,
27
+ };
28
+ }
29
+ /**
30
+ * Create a Stripe client initialized with a restricted key from the vault.
31
+ */
32
+ async function createStripeClient() {
33
+ const store = (0, credential_access_1.getCredentialStore)();
34
+ const apiKey = await store.getRawSecret("stripe.com", "restrictedKey");
35
+ // StripeConstructor is a callable (not a class), cast the result
36
+ const stripe = (0, stripe_1.default)(apiKey);
37
+ return {
38
+ async createVirtualCard(opts) {
39
+ (0, runtime_1.emitNervesEvent)({
40
+ component: "repertoire",
41
+ event: "repertoire.stripe_card_create_start",
42
+ message: "creating virtual card",
43
+ meta: { type: opts.type, currency: opts.currency },
44
+ });
45
+ const spendingControls = {
46
+ spending_limits: [
47
+ {
48
+ amount: opts.spendLimit * 100, // Stripe uses cents
49
+ interval: opts.type === "single_use" ? "all_time" : "monthly",
50
+ },
51
+ ],
52
+ ...(opts.merchantCategories
53
+ ? { allowed_categories: opts.merchantCategories }
54
+ : {}),
55
+ };
56
+ const card = await stripe.issuing.cards.create({
57
+ type: "virtual",
58
+ currency: opts.currency,
59
+ spending_controls: spendingControls,
60
+ status: "active",
61
+ });
62
+ (0, runtime_1.emitNervesEvent)({
63
+ component: "repertoire",
64
+ event: "repertoire.stripe_card_create_end",
65
+ message: "virtual card created",
66
+ meta: { cardId: card.id, last4: card.last4 },
67
+ });
68
+ return toCardInfo(card);
69
+ },
70
+ async getCard(cardId) {
71
+ (0, runtime_1.emitNervesEvent)({
72
+ component: "repertoire",
73
+ event: "repertoire.stripe_card_get",
74
+ message: "retrieving card info",
75
+ meta: { cardId },
76
+ });
77
+ const card = await stripe.issuing.cards.retrieve(cardId);
78
+ return toCardInfo(card);
79
+ },
80
+ async updateCard(cardId, updates) {
81
+ (0, runtime_1.emitNervesEvent)({
82
+ component: "repertoire",
83
+ event: "repertoire.stripe_card_update",
84
+ message: "updating card",
85
+ meta: { cardId },
86
+ });
87
+ const card = await stripe.issuing.cards.update(cardId, updates);
88
+ return toCardInfo(card);
89
+ },
90
+ async deactivateCard(cardId) {
91
+ (0, runtime_1.emitNervesEvent)({
92
+ component: "repertoire",
93
+ event: "repertoire.stripe_card_deactivate",
94
+ message: "deactivating card",
95
+ meta: { cardId },
96
+ });
97
+ const card = await stripe.issuing.cards.update(cardId, { status: "canceled" });
98
+ return toCardInfo(card);
99
+ },
100
+ async listCards() {
101
+ (0, runtime_1.emitNervesEvent)({
102
+ component: "repertoire",
103
+ event: "repertoire.stripe_cards_list",
104
+ message: "listing cards",
105
+ meta: {},
106
+ });
107
+ const result = await stripe.issuing.cards.list();
108
+ return result.data.map(toCardInfo);
109
+ },
110
+ async getCardDetails(cardId) {
111
+ // This method retrieves sensitive card details for payment flows.
112
+ // The data must NEVER be logged, emitted, or returned to the model.
113
+ (0, runtime_1.emitNervesEvent)({
114
+ component: "repertoire",
115
+ event: "repertoire.stripe_card_details_get",
116
+ message: "retrieving card details for payment flow",
117
+ meta: { cardId },
118
+ });
119
+ const card = await stripe.issuing.cards.retrieve(cardId, {
120
+ expand: ["number", "cvc"],
121
+ });
122
+ return {
123
+ cardId: card.id,
124
+ number: card.number,
125
+ cvc: card.cvc,
126
+ expMonth: card.exp_month,
127
+ expYear: card.exp_year,
128
+ };
129
+ },
130
+ };
131
+ }
@@ -7,14 +7,21 @@ exports.boardDeps = boardDeps;
7
7
  exports.boardSessions = boardSessions;
8
8
  const runtime_1 = require("../../nerves/runtime");
9
9
  const transitions_1 = require("./transitions");
10
- const BOARD_STATUS_ORDER = [
10
+ const BOARD_ACTIVE_ORDER = [
11
11
  "blocked",
12
12
  "processing",
13
13
  "collaborating",
14
14
  "drafting",
15
15
  "validating",
16
16
  "paused",
17
+ ];
18
+ const BOARD_TERMINAL_ORDER = [
17
19
  "done",
20
+ "cancelled",
21
+ ];
22
+ const BOARD_STATUS_ORDER = [
23
+ ...BOARD_ACTIVE_ORDER,
24
+ ...BOARD_TERMINAL_ORDER,
18
25
  ];
19
26
  function compactName(task) {
20
27
  const suffix = task.stem.replace(/^\d{4}-\d{2}-\d{2}-\d{4}-/, "");
@@ -29,6 +36,7 @@ function groupByStatus(tasks) {
29
36
  paused: [],
30
37
  blocked: [],
31
38
  done: [],
39
+ cancelled: [],
32
40
  };
33
41
  for (const task of tasks) {
34
42
  grouped[task.status].push(compactName(task));
@@ -59,8 +67,26 @@ function activeSessionLines(tasks) {
59
67
  });
60
68
  return active.map((task) => task.stem).sort();
61
69
  }
70
+ function activeBridgeLines(tasks) {
71
+ return tasks
72
+ .filter((task) => typeof task.frontmatter.active_bridge === "string" && String(task.frontmatter.active_bridge).trim())
73
+ .map((task) => `${task.stem} -> ${String(task.frontmatter.active_bridge).trim()}`)
74
+ .sort();
75
+ }
76
+ function buildHealthLine(issues) {
77
+ if (issues.length === 0)
78
+ return "health: clean";
79
+ const liveCount = issues.filter((i) => i.category === "live").length;
80
+ const migrationCount = issues.filter((i) => i.category === "migration").length;
81
+ const parts = [];
82
+ if (liveCount > 0)
83
+ parts.push(`${liveCount} live`);
84
+ if (migrationCount > 0)
85
+ parts.push(`${migrationCount} migration`);
86
+ return `health: ${parts.join(", ")}`;
87
+ }
62
88
  function actionRequired(index, byStatus) {
63
- const actions = [...index.parseErrors, ...index.invalidFilenames.map((filePath) => `bad filename: ${filePath}`)];
89
+ const actions = index.issues.map((issue) => `${issue.code}: ${issue.description} [${issue.target}]`);
64
90
  if (byStatus.blocked.length > 0) {
65
91
  actions.push(`blocked tasks: ${byStatus.blocked.join(", ")}`);
66
92
  }
@@ -77,14 +103,19 @@ function buildTaskBoard(index) {
77
103
  meta: { taskCount: index.tasks.length },
78
104
  });
79
105
  const byStatus = groupByStatus(index.tasks);
80
- const counts = transitions_1.TASK_VALID_STATUSES.map((status) => `${status}:${byStatus[status].length}`).join(" ");
106
+ const activeCounts = BOARD_ACTIVE_ORDER.map((status) => `${status}:${byStatus[status].length}`).join(" ");
81
107
  const processing = byStatus.processing.length > 0 ? `\n processing: ${byStatus.processing.join(", ")}` : "";
82
108
  const blocked = byStatus.blocked.length > 0 ? `\n blocked: ${byStatus.blocked.join(", ")}` : "";
83
- const compact = `[Tasks] ${counts}${processing}${blocked}`;
109
+ const terminalParts = BOARD_TERMINAL_ORDER
110
+ .filter((status) => byStatus[status].length > 0)
111
+ .map((status) => `${status}:${byStatus[status].length}`);
112
+ const terminalLine = terminalParts.length > 0 ? `\n terminal: ${terminalParts.join(" ")}` : "";
113
+ const healthLine = `\n ${buildHealthLine(index.issues)}`;
114
+ const compact = `[Tasks] ${activeCounts}${processing}${blocked}${terminalLine}${healthLine}`;
84
115
  const fullLines = [];
85
116
  for (const status of BOARD_STATUS_ORDER) {
86
117
  const names = byStatus[status];
87
- if (status === "done" && names.length === 0)
118
+ if ((status === "done" || status === "cancelled") && names.length === 0)
88
119
  continue;
89
120
  fullLines.push(`## ${status}`);
90
121
  fullLines.push(names.length > 0 ? names.map((name) => `- ${name}`).join("\n") : "- (none)");
@@ -99,13 +130,20 @@ function buildTaskBoard(index) {
99
130
  fullLines.push("## active sessions");
100
131
  fullLines.push(active.map((line) => `- ${line}`).join("\n"));
101
132
  }
133
+ const activeBridges = activeBridgeLines(index.tasks);
134
+ if (activeBridges.length > 0) {
135
+ fullLines.push("## active bridges");
136
+ fullLines.push(activeBridges.map((line) => `- ${line}`).join("\n"));
137
+ }
102
138
  return {
103
139
  compact,
104
140
  full: fullLines.join("\n\n"),
105
141
  byStatus,
142
+ issues: index.issues,
106
143
  actionRequired: actionRequired(index, byStatus),
107
144
  unresolvedDependencies: unresolved,
108
145
  activeSessions: active,
146
+ activeBridges,
109
147
  };
110
148
  }
111
149
  function boardStatus(board, status) {
@@ -0,0 +1,182 @@
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.addKindToLegacyCard = addKindToLegacyCard;
37
+ exports.applyFixes = applyFixes;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const runtime_1 = require("../../nerves/runtime");
41
+ const scanner_1 = require("./scanner");
42
+ const parser_1 = require("./parser");
43
+ function issueId(issue) {
44
+ return `${issue.code}:${issue.target}`;
45
+ }
46
+ function addKindToLegacyCard(root, issue) {
47
+ (0, runtime_1.emitNervesEvent)({
48
+ event: "repertoire.fix_apply_start",
49
+ component: "repertoire",
50
+ message: "adding kind: task to legacy card",
51
+ meta: { target: issue.target },
52
+ });
53
+ const filePath = path.join(root, issue.target);
54
+ if (!fs.existsSync(filePath))
55
+ return false;
56
+ const content = fs.readFileSync(filePath, "utf-8");
57
+ const frontmatter = (0, scanner_1.tryExtractFrontmatter)(content);
58
+ if (!frontmatter)
59
+ return false;
60
+ // Add kind: task to frontmatter
61
+ frontmatter.kind = "task";
62
+ // Extract body (everything after the second ---)
63
+ const lines = content.split(/\r?\n/);
64
+ const firstDelim = lines.findIndex((line) => line.trim() === "---");
65
+ const secondDelim = lines.findIndex((line, idx) => idx > firstDelim && line.trim() === "---");
66
+ const body = lines.slice(secondDelim + 1).join("\n").replace(/^\n/, "");
67
+ const rendered = (0, parser_1.renderTaskFile)(frontmatter, body);
68
+ fs.writeFileSync(filePath, rendered, "utf-8");
69
+ return true;
70
+ }
71
+ function applySingleFix(root, issue) {
72
+ switch (issue.code) {
73
+ case "schema-missing-kind":
74
+ return addKindToLegacyCard(root, issue);
75
+ default:
76
+ return false;
77
+ }
78
+ }
79
+ function applyFixes(options, root) {
80
+ (0, runtime_1.emitNervesEvent)({
81
+ event: "repertoire.fix_start",
82
+ component: "repertoire",
83
+ message: `applying fixes in ${options.mode} mode`,
84
+ meta: { mode: options.mode, root },
85
+ });
86
+ (0, scanner_1.clearTaskScanCache)();
87
+ const index = (0, scanner_1.scanTasks)(root);
88
+ const issues = index.issues;
89
+ if (options.mode === "dry-run") {
90
+ (0, runtime_1.emitNervesEvent)({
91
+ event: "repertoire.fix_complete",
92
+ component: "repertoire",
93
+ message: "dry-run complete, no changes made",
94
+ meta: { issueCount: issues.length },
95
+ });
96
+ const health = issues.length === 0 ? "clean" : buildHealthSummary(issues);
97
+ return {
98
+ applied: [],
99
+ remaining: issues,
100
+ skipped: [],
101
+ health,
102
+ };
103
+ }
104
+ if (options.mode === "single") {
105
+ const targetId = options.issueId ?? "";
106
+ const match = issues.find((i) => issueId(i) === targetId);
107
+ if (!match) {
108
+ (0, runtime_1.emitNervesEvent)({
109
+ event: "repertoire.fix_complete",
110
+ component: "repertoire",
111
+ message: "single fix: issue not found",
112
+ meta: { issueId: targetId },
113
+ });
114
+ const health = issues.length === 0 ? "clean" : buildHealthSummary(issues);
115
+ return {
116
+ applied: [],
117
+ remaining: issues,
118
+ skipped: [],
119
+ health,
120
+ };
121
+ }
122
+ const success = applySingleFix(root, match);
123
+ (0, scanner_1.clearTaskScanCache)();
124
+ const afterIndex = (0, scanner_1.scanTasks)(root);
125
+ const afterIssues = afterIndex.issues;
126
+ const health = afterIssues.length === 0 ? "clean" : buildHealthSummary(afterIssues);
127
+ (0, runtime_1.emitNervesEvent)({
128
+ event: "repertoire.fix_complete",
129
+ component: "repertoire",
130
+ message: `single fix ${success ? "applied" : "failed"}`,
131
+ meta: { issueId: targetId, success },
132
+ });
133
+ return {
134
+ applied: success ? [match] : [],
135
+ remaining: afterIssues,
136
+ skipped: success ? [] : [match],
137
+ health,
138
+ };
139
+ }
140
+ // safe mode: apply all safe-confidence fixes
141
+ const applied = [];
142
+ const skipped = [];
143
+ for (const issue of issues) {
144
+ if (issue.confidence !== "safe") {
145
+ skipped.push(issue);
146
+ continue;
147
+ }
148
+ const success = applySingleFix(root, issue);
149
+ if (success) {
150
+ applied.push(issue);
151
+ }
152
+ else {
153
+ skipped.push(issue);
154
+ }
155
+ }
156
+ (0, scanner_1.clearTaskScanCache)();
157
+ const afterIndex = (0, scanner_1.scanTasks)(root);
158
+ const afterIssues = afterIndex.issues;
159
+ const health = afterIssues.length === 0 ? "clean" : buildHealthSummary(afterIssues);
160
+ (0, runtime_1.emitNervesEvent)({
161
+ event: "repertoire.fix_complete",
162
+ component: "repertoire",
163
+ message: `safe fixes complete: ${applied.length} applied, ${skipped.length} skipped`,
164
+ meta: { applied: applied.length, skipped: skipped.length },
165
+ });
166
+ return {
167
+ applied,
168
+ remaining: afterIssues,
169
+ skipped,
170
+ health,
171
+ };
172
+ }
173
+ function buildHealthSummary(issues) {
174
+ const liveCount = issues.filter((i) => i.category === "live").length;
175
+ const migrationCount = issues.filter((i) => i.category === "migration").length;
176
+ const parts = [];
177
+ if (liveCount > 0)
178
+ parts.push(`${liveCount} live`);
179
+ if (migrationCount > 0)
180
+ parts.push(`${migrationCount} migration`);
181
+ return parts.join(", ");
182
+ }
@@ -33,12 +33,15 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createTaskModule = createTaskModule;
36
37
  exports.getTaskModule = getTaskModule;
37
38
  exports.resetTaskModule = resetTaskModule;
38
39
  const fs = __importStar(require("fs"));
39
40
  const path = __importStar(require("path"));
41
+ const config_1 = require("../../heart/config");
40
42
  const runtime_1 = require("../../nerves/runtime");
41
43
  const board_1 = require("./board");
44
+ const fix_1 = require("./fix");
42
45
  const lifecycle_1 = require("./lifecycle");
43
46
  const parser_1 = require("./parser");
44
47
  const scanner_1 = require("./scanner");
@@ -55,14 +58,6 @@ function formatStemTimestamp(now = new Date()) {
55
58
  const minutes = String(now.getMinutes()).padStart(2, "0");
56
59
  return `${year}-${month}-${day}-${hours}${minutes}`;
57
60
  }
58
- function slugify(input) {
59
- return input
60
- .toLowerCase()
61
- .replace(/[^a-z0-9]+/g, "-")
62
- .replace(/^-+/, "")
63
- .replace(/-+$/, "")
64
- .slice(0, 64);
65
- }
66
61
  function findTask(index, nameOrStem) {
67
62
  return (index.tasks.find((task) => task.stem === nameOrStem || task.name === nameOrStem) ??
68
63
  index.tasks.find((task) => task.stem.endsWith(nameOrStem)) ??
@@ -73,8 +68,12 @@ function removeRuntimeFrontmatter(frontmatter) {
73
68
  return clean;
74
69
  }
75
70
  class FileTaskModule {
71
+ root;
72
+ constructor(root = (0, scanner_1.getTaskRoot)()) {
73
+ this.root = root;
74
+ }
76
75
  scan() {
77
- return (0, scanner_1.scanTasks)((0, scanner_1.getTaskRoot)());
76
+ return (0, scanner_1.scanTasks)(this.root);
78
77
  }
79
78
  getBoard() {
80
79
  return (0, board_1.buildTaskBoard)(this.scan());
@@ -98,12 +97,13 @@ class FileTaskModule {
98
97
  throw new Error(`invalid task status: ${String(input.status)}`);
99
98
  }
100
99
  const collection = (0, transitions_1.canonicalCollectionForTaskType)(type);
101
- const stem = `${formatStemTimestamp()}-${slugify(input.title) || "task"}`;
100
+ const stem = `${formatStemTimestamp()}-${(0, config_1.slugify)(input.title).slice(0, 64) || "task"}`;
102
101
  const filename = `${stem}.md`;
103
- const root = (0, scanner_1.getTaskRoot)();
102
+ const root = this.root;
104
103
  const filePath = path.join(root, collection, filename);
105
104
  const today = formatDate();
106
105
  const frontmatter = {
106
+ kind: "task",
107
107
  type,
108
108
  category: input.category || "infrastructure",
109
109
  title: input.title,
@@ -115,13 +115,18 @@ class FileTaskModule {
115
115
  lastRun: input.lastRun ?? null,
116
116
  created: today,
117
117
  updated: today,
118
- child_tasks: [],
119
118
  artifacts: [],
120
119
  };
121
120
  if (type === "one-shot") {
122
121
  frontmatter.parent_task = null;
123
122
  frontmatter.depends_on = [];
124
123
  }
124
+ if (input.activeBridge && input.activeBridge.trim()) {
125
+ frontmatter.active_bridge = input.activeBridge.trim();
126
+ }
127
+ if (Array.isArray(input.bridgeSessions) && input.bridgeSessions.length > 0) {
128
+ frontmatter.bridge_sessions = input.bridgeSessions.filter((value) => typeof value === "string" && value.trim());
129
+ }
125
130
  const content = (0, parser_1.renderTaskFile)(frontmatter, input.body);
126
131
  const validation = (0, middleware_1.validateWrite)(filePath, content);
127
132
  if (!validation.ok) {
@@ -132,6 +137,21 @@ class FileTaskModule {
132
137
  (0, scanner_1.clearTaskScanCache)();
133
138
  return filePath;
134
139
  }
140
+ bindBridge(name, input) {
141
+ const task = this.getTask(name);
142
+ if (!task) {
143
+ return { ok: false, reason: `task not found: ${name}` };
144
+ }
145
+ const content = fs.readFileSync(task.path, "utf-8");
146
+ const parsed = (0, parser_1.parseTaskFile)(content, task.path);
147
+ const frontmatter = removeRuntimeFrontmatter(parsed.frontmatter);
148
+ frontmatter.active_bridge = input.bridgeId.trim();
149
+ frontmatter.bridge_sessions = input.sessionRefs.filter((value) => value.trim().length > 0);
150
+ frontmatter.updated = formatDate();
151
+ fs.writeFileSync(task.path, (0, parser_1.renderTaskFile)(frontmatter, parsed.body), "utf-8");
152
+ (0, scanner_1.clearTaskScanCache)();
153
+ return { ok: true, path: task.path };
154
+ }
135
155
  updateStatus(name, toStatus) {
136
156
  const normalized = (0, transitions_1.normalizeTaskStatus)(toStatus);
137
157
  if (!normalized) {
@@ -178,6 +198,9 @@ class FileTaskModule {
178
198
  }
179
199
  return (0, middleware_1.validateSpawn)(task, spawnType);
180
200
  }
201
+ fix(options) {
202
+ return (0, fix_1.applyFixes)(options, this.root);
203
+ }
181
204
  detectStale(thresholdDays) {
182
205
  return (0, lifecycle_1.detectStaleTasks)(this.scan(), thresholdDays);
183
206
  }
@@ -198,9 +221,12 @@ class FileTaskModule {
198
221
  }
199
222
  }
200
223
  let taskModule = null;
224
+ function createTaskModule(root = (0, scanner_1.getTaskRoot)()) {
225
+ return new FileTaskModule(root);
226
+ }
201
227
  function getTaskModule() {
202
228
  if (!taskModule) {
203
- taskModule = new FileTaskModule();
229
+ taskModule = createTaskModule();
204
230
  }
205
231
  return taskModule;
206
232
  }
@@ -48,7 +48,7 @@ function archiveCompletedTasks(index) {
48
48
  const archived = [];
49
49
  const failures = [];
50
50
  for (const task of index.tasks) {
51
- if (task.status !== "done")
51
+ if (task.status !== "done" && task.status !== "cancelled")
52
52
  continue;
53
53
  const archiveDir = path.join(index.root, "archive", task.collection);
54
54
  const archiveFile = path.join(archiveDir, task.name);
@@ -73,7 +73,7 @@ function detectStaleTasks(index, thresholdDays, now = new Date()) {
73
73
  const updated = Date.parse(task.updated);
74
74
  if (Number.isNaN(updated))
75
75
  return false;
76
- if (task.status === "done")
76
+ if (task.status === "done" || task.status === "cancelled")
77
77
  return false;
78
78
  return updated < staleCutoffMs;
79
79
  });
@@ -96,8 +96,6 @@ function collectionFromPath(taskPath, type) {
96
96
  return "one-shots";
97
97
  if (parts.includes("ongoing"))
98
98
  return "ongoing";
99
- if (parts.includes("habits"))
100
- return "habits";
101
99
  return (0, transitions_1.canonicalCollectionForTaskType)(type);
102
100
  }
103
101
  function parseTaskFile(content, filePath) {
@@ -138,6 +136,9 @@ function parseTaskFile(content, filePath) {
138
136
  _isCanonicalFilename: (0, transitions_1.isCanonicalTaskFilename)(name),
139
137
  },
140
138
  body: parsed.body,
139
+ hasWorkDir: false,
140
+ workDirFiles: [],
141
+ derivedChildren: [],
141
142
  };
142
143
  }
143
144
  function formatFrontmatterValue(value) {