@ouro.bot/cli 0.1.0-alpha.42 → 0.1.0-alpha.420

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 (334) hide show
  1. package/README.md +118 -15
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +2627 -9
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +832 -0
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +424 -0
  28. package/dist/heart/bridges/manager.js +358 -0
  29. package/dist/heart/bridges/state-machine.js +135 -0
  30. package/dist/heart/bridges/store.js +123 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +110 -128
  35. package/dist/heart/core.js +801 -217
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +419 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +214 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +605 -0
  44. package/dist/heart/daemon/cli-exec.js +4140 -0
  45. package/dist/heart/daemon/cli-help.js +413 -0
  46. package/dist/heart/daemon/cli-parse.js +1151 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +561 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/daemon-cli.js +28 -1582
  51. package/dist/heart/daemon/daemon-entry.js +356 -3
  52. package/dist/heart/daemon/daemon-health.js +141 -0
  53. package/dist/heart/daemon/daemon-runtime-sync.js +171 -12
  54. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  55. package/dist/heart/daemon/daemon.js +684 -58
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +427 -0
  58. package/dist/heart/daemon/health-monitor.js +79 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/inner-status.js +89 -0
  63. package/dist/heart/daemon/interactive-repair.js +307 -0
  64. package/dist/heart/daemon/launchd.js +46 -9
  65. package/dist/heart/daemon/log-tailer.js +82 -12
  66. package/dist/heart/daemon/logs-prune.js +105 -0
  67. package/dist/heart/daemon/message-router.js +2 -2
  68. package/dist/heart/daemon/os-cron-deps.js +134 -0
  69. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  70. package/dist/heart/daemon/ouro-entry.js +3 -1
  71. package/dist/heart/daemon/process-manager.js +214 -0
  72. package/dist/heart/daemon/provider-discovery.js +137 -0
  73. package/dist/heart/daemon/pulse.js +475 -0
  74. package/dist/heart/daemon/readiness-repair.js +250 -0
  75. package/dist/heart/daemon/run-hooks.js +2 -0
  76. package/dist/heart/daemon/runtime-logging.js +67 -16
  77. package/dist/heart/daemon/runtime-metadata.js +73 -0
  78. package/dist/heart/daemon/runtime-mode.js +67 -0
  79. package/dist/heart/daemon/safe-mode.js +161 -0
  80. package/dist/heart/daemon/sense-manager.js +145 -32
  81. package/dist/heart/daemon/session-id-resolver.js +131 -0
  82. package/dist/heart/daemon/skill-management-installer.js +94 -0
  83. package/dist/heart/daemon/socket-client.js +307 -0
  84. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  85. package/dist/heart/daemon/startup-tui.js +259 -0
  86. package/dist/heart/daemon/task-scheduler.js +3 -25
  87. package/dist/heart/daemon/thoughts.js +510 -0
  88. package/dist/heart/daemon/up-progress.js +218 -0
  89. package/dist/heart/delegation.js +62 -0
  90. package/dist/heart/habits/habit-migration.js +181 -0
  91. package/dist/heart/habits/habit-parser.js +140 -0
  92. package/dist/heart/habits/habit-scheduler.js +371 -0
  93. package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -117
  94. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  95. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  96. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  97. package/dist/heart/identity.js +161 -65
  98. package/dist/heart/kept-notes.js +357 -0
  99. package/dist/heart/kicks.js +1 -1
  100. package/dist/heart/machine-identity.js +161 -0
  101. package/dist/heart/mcp/mcp-server.js +653 -0
  102. package/dist/heart/migrate-config.js +100 -0
  103. package/dist/heart/model-capabilities.js +59 -0
  104. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  105. package/dist/heart/outlook/outlook-http-response.js +7 -0
  106. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  107. package/dist/heart/outlook/outlook-http-static.js +99 -0
  108. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  109. package/dist/heart/outlook/outlook-http.js +99 -0
  110. package/dist/heart/outlook/outlook-read.js +28 -0
  111. package/dist/heart/outlook/outlook-types.js +27 -0
  112. package/dist/heart/outlook/outlook-view.js +195 -0
  113. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  114. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  115. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  116. package/dist/heart/outlook/readers/sessions.js +232 -0
  117. package/dist/heart/outlook/readers/shared.js +111 -0
  118. package/dist/heart/platform.js +81 -0
  119. package/dist/heart/progress-story.js +42 -0
  120. package/dist/heart/provider-attempt.js +133 -0
  121. package/dist/heart/provider-binding-resolver.js +239 -0
  122. package/dist/heart/provider-credentials.js +389 -0
  123. package/dist/heart/provider-failover.js +266 -0
  124. package/dist/heart/provider-models.js +81 -0
  125. package/dist/heart/provider-ping.js +237 -0
  126. package/dist/heart/provider-state.js +216 -0
  127. package/dist/heart/provider-visibility.js +186 -0
  128. package/dist/heart/providers/anthropic-token.js +131 -0
  129. package/dist/heart/providers/anthropic.js +193 -55
  130. package/dist/heart/providers/azure.js +103 -12
  131. package/dist/heart/providers/error-classification.js +63 -0
  132. package/dist/heart/providers/github-copilot.js +145 -0
  133. package/dist/heart/providers/minimax-vlm.js +189 -0
  134. package/dist/heart/providers/minimax.js +29 -7
  135. package/dist/heart/providers/openai-codex.js +62 -38
  136. package/dist/heart/runtime-credentials.js +260 -0
  137. package/dist/heart/sense-truth.js +3 -0
  138. package/dist/heart/session-activity.js +190 -0
  139. package/dist/heart/session-events.js +855 -0
  140. package/dist/heart/session-transcript.js +167 -0
  141. package/dist/heart/start-of-turn-packet.js +345 -0
  142. package/dist/heart/streaming.js +36 -27
  143. package/dist/heart/sync.js +332 -0
  144. package/dist/heart/target-resolution.js +127 -0
  145. package/dist/heart/tempo.js +93 -0
  146. package/dist/heart/temporal-view.js +41 -0
  147. package/dist/heart/tool-activity-callbacks.js +36 -0
  148. package/dist/heart/tool-description.js +135 -0
  149. package/dist/heart/tool-friction.js +55 -0
  150. package/dist/heart/tool-loop.js +200 -0
  151. package/dist/heart/turn-context.js +351 -0
  152. package/dist/heart/turn-coordinator.js +28 -0
  153. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  154. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  155. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  156. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  157. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  158. package/dist/heart/{daemon → versioning}/update-checker.js +3 -1
  159. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  160. package/dist/mind/bundle-manifest.js +7 -1
  161. package/dist/mind/context.js +134 -87
  162. package/dist/mind/diary-integrity.js +60 -0
  163. package/dist/mind/{memory.js → diary.js} +74 -93
  164. package/dist/mind/embedding-provider.js +60 -0
  165. package/dist/mind/file-state.js +179 -0
  166. package/dist/mind/first-impressions.js +14 -1
  167. package/dist/mind/friends/channel.js +21 -0
  168. package/dist/mind/friends/group-context.js +144 -0
  169. package/dist/mind/friends/resolver.js +38 -1
  170. package/dist/mind/friends/store-file.js +39 -3
  171. package/dist/mind/friends/trust-explanation.js +74 -0
  172. package/dist/mind/friends/types.js +1 -1
  173. package/dist/mind/journal-index.js +161 -0
  174. package/dist/mind/note-search.js +268 -0
  175. package/dist/mind/obligation-steering.js +221 -0
  176. package/dist/mind/pending.js +66 -7
  177. package/dist/mind/prompt-refresh.js +3 -2
  178. package/dist/mind/prompt.js +948 -168
  179. package/dist/mind/provenance-trust.js +26 -0
  180. package/dist/mind/scrutiny.js +173 -0
  181. package/dist/nerves/cli-logging.js +7 -1
  182. package/dist/nerves/coverage/audit-rules.js +15 -6
  183. package/dist/nerves/coverage/audit.js +28 -2
  184. package/dist/nerves/coverage/cli.js +1 -1
  185. package/dist/nerves/coverage/contract.js +5 -5
  186. package/dist/nerves/coverage/file-completeness.js +83 -5
  187. package/dist/nerves/coverage/run-artifacts.js +1 -1
  188. package/dist/nerves/event-buffer.js +111 -0
  189. package/dist/nerves/index.js +224 -4
  190. package/dist/nerves/observation.js +20 -0
  191. package/dist/nerves/redact.js +79 -0
  192. package/dist/nerves/runtime.js +5 -1
  193. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  194. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  195. package/dist/outlook-ui/index.html +15 -0
  196. package/dist/repertoire/ado-client.js +15 -56
  197. package/dist/repertoire/ado-semantic.js +11 -10
  198. package/dist/repertoire/api-client.js +97 -0
  199. package/dist/repertoire/bitwarden-store.js +702 -0
  200. package/dist/repertoire/bundle-templates.js +72 -0
  201. package/dist/repertoire/bw-installer.js +79 -0
  202. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  203. package/dist/repertoire/coding/context-pack.js +330 -0
  204. package/dist/repertoire/coding/feedback.js +197 -30
  205. package/dist/repertoire/coding/manager.js +158 -9
  206. package/dist/repertoire/coding/spawner.js +55 -9
  207. package/dist/repertoire/coding/tools.js +170 -7
  208. package/dist/repertoire/commerce-errors.js +109 -0
  209. package/dist/repertoire/commerce-self-test.js +156 -0
  210. package/dist/repertoire/credential-access.js +111 -0
  211. package/dist/repertoire/duffel-client.js +185 -0
  212. package/dist/repertoire/github-client.js +14 -55
  213. package/dist/repertoire/graph-client.js +11 -52
  214. package/dist/repertoire/guardrails.js +371 -0
  215. package/dist/repertoire/mcp-client.js +255 -0
  216. package/dist/repertoire/mcp-manager.js +305 -0
  217. package/dist/repertoire/mcp-tools.js +63 -0
  218. package/dist/repertoire/shell-sessions.js +133 -0
  219. package/dist/repertoire/skills.js +15 -24
  220. package/dist/repertoire/stripe-client.js +131 -0
  221. package/dist/repertoire/tasks/board.js +43 -5
  222. package/dist/repertoire/tasks/fix.js +182 -0
  223. package/dist/repertoire/tasks/index.js +26 -1
  224. package/dist/repertoire/tasks/lifecycle.js +2 -2
  225. package/dist/repertoire/tasks/parser.js +3 -2
  226. package/dist/repertoire/tasks/scanner.js +194 -37
  227. package/dist/repertoire/tasks/transitions.js +16 -78
  228. package/dist/repertoire/tool-results.js +29 -0
  229. package/dist/repertoire/tools-attachments.js +317 -0
  230. package/dist/repertoire/tools-base.js +42 -687
  231. package/dist/repertoire/tools-bluebubbles.js +1 -0
  232. package/dist/repertoire/tools-bridge.js +141 -0
  233. package/dist/repertoire/tools-bundle.js +984 -0
  234. package/dist/repertoire/tools-config.js +185 -0
  235. package/dist/repertoire/tools-continuity.js +248 -0
  236. package/dist/repertoire/tools-credential.js +361 -0
  237. package/dist/repertoire/tools-files.js +342 -0
  238. package/dist/repertoire/tools-flight.js +224 -0
  239. package/dist/repertoire/tools-flow.js +105 -0
  240. package/dist/repertoire/tools-github.js +1 -7
  241. package/dist/repertoire/tools-notes.js +376 -0
  242. package/dist/repertoire/tools-session.js +739 -0
  243. package/dist/repertoire/tools-shell.js +120 -0
  244. package/dist/repertoire/tools-stripe.js +180 -0
  245. package/dist/repertoire/tools-surface.js +243 -0
  246. package/dist/repertoire/tools-teams.js +9 -39
  247. package/dist/repertoire/tools-travel.js +125 -0
  248. package/dist/repertoire/tools-user-profile.js +144 -0
  249. package/dist/repertoire/tools-vault.js +40 -0
  250. package/dist/repertoire/tools.js +144 -113
  251. package/dist/repertoire/travel-api-client.js +360 -0
  252. package/dist/repertoire/user-profile.js +131 -0
  253. package/dist/repertoire/vault-setup.js +246 -0
  254. package/dist/repertoire/vault-unlock.js +421 -0
  255. package/dist/scripts/claude-code-hook.js +41 -0
  256. package/dist/scripts/claude-code-stop-hook.js +47 -0
  257. package/dist/senses/attention-queue.js +116 -0
  258. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  259. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  260. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  261. package/dist/senses/bluebubbles/entry.js +73 -0
  262. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  263. package/dist/senses/bluebubbles/index.js +1620 -0
  264. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  265. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  266. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +45 -3
  267. package/dist/senses/bluebubbles/replay.js +129 -0
  268. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  269. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  270. package/dist/senses/cli/bracketed-paste.js +82 -0
  271. package/dist/senses/cli/image-paste.js +287 -0
  272. package/dist/senses/cli/image-ref-navigation.js +75 -0
  273. package/dist/senses/cli/ink-app.js +156 -0
  274. package/dist/senses/cli/inline-diff.js +64 -0
  275. package/dist/senses/cli/input-keys.js +174 -0
  276. package/dist/senses/cli/kill-ring.js +86 -0
  277. package/dist/senses/cli/message-list.js +51 -0
  278. package/dist/senses/cli/ouro-tui.js +605 -0
  279. package/dist/senses/cli/spinner-imperative.js +135 -0
  280. package/dist/senses/cli/spinner.js +101 -0
  281. package/dist/senses/cli/status-line.js +60 -0
  282. package/dist/senses/cli/streaming-markdown.js +526 -0
  283. package/dist/senses/cli/tool-display.js +83 -0
  284. package/dist/senses/cli/tool-render.js +85 -0
  285. package/dist/senses/cli/tui-store.js +240 -0
  286. package/dist/senses/cli/virtual-list.js +35 -0
  287. package/dist/senses/cli-entry.js +60 -8
  288. package/dist/senses/cli-layout.js +187 -0
  289. package/dist/senses/cli.js +526 -211
  290. package/dist/senses/commands.js +66 -3
  291. package/dist/senses/continuity.js +94 -0
  292. package/dist/senses/habit-turn-message.js +108 -0
  293. package/dist/senses/inner-dialog-worker.js +112 -19
  294. package/dist/senses/inner-dialog.js +596 -94
  295. package/dist/senses/pipeline.js +539 -61
  296. package/dist/senses/proactive-content-guard.js +51 -0
  297. package/dist/senses/shared-turn.js +205 -0
  298. package/dist/senses/surface-tool.js +68 -0
  299. package/dist/senses/teams-entry.js +60 -8
  300. package/dist/senses/teams.js +569 -237
  301. package/dist/senses/trust-gate.js +5 -5
  302. package/package.json +29 -7
  303. package/skills/agent-commerce.md +106 -0
  304. package/skills/browser-navigation.md +117 -0
  305. package/skills/commerce-setup-guide.md +116 -0
  306. package/skills/commerce-setup.md +84 -0
  307. package/skills/configure-dev-tools.md +101 -0
  308. package/skills/travel-planning.md +138 -0
  309. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  310. package/dist/heart/daemon/subagent-installer.js +0 -134
  311. package/dist/mind/associative-recall.js +0 -209
  312. package/dist/senses/bluebubbles-entry.js +0 -11
  313. package/dist/senses/bluebubbles.js +0 -832
  314. package/dist/senses/debug-activity.js +0 -127
  315. package/subagents/README.md +0 -60
  316. package/subagents/work-doer.md +0 -235
  317. package/subagents/work-merger.md +0 -618
  318. package/subagents/work-planner.md +0 -382
  319. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  320. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  321. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  329. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  330. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  331. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  332. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  333. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  334. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createCommandRegistry = createCommandRegistry;
4
4
  exports.getToolChoiceRequired = getToolChoiceRequired;
5
5
  exports.resetToolChoiceRequired = resetToolChoiceRequired;
6
+ exports.getDebugMode = getDebugMode;
7
+ exports.resetDebugMode = resetDebugMode;
6
8
  exports.registerDefaultCommands = registerDefaultCommands;
9
+ exports.getSharedCommandRegistry = getSharedCommandRegistry;
10
+ exports.resetSharedCommandRegistry = resetSharedCommandRegistry;
7
11
  exports.parseSlashCommand = parseSlashCommand;
8
12
  const identity_1 = require("../heart/identity");
9
13
  const runtime_1 = require("../nerves/runtime");
@@ -21,7 +25,7 @@ function createCommandRegistry() {
21
25
  },
22
26
  dispatch(name, ctx) {
23
27
  const cmd = commands.get(name);
24
- if (!cmd)
28
+ if (!cmd || !cmd.channels.includes(ctx.channel))
25
29
  return { handled: false };
26
30
  return { handled: true, result: cmd.handler(ctx) };
27
31
  },
@@ -35,6 +39,14 @@ function getToolChoiceRequired() {
35
39
  function resetToolChoiceRequired() {
36
40
  _toolChoiceRequired = false;
37
41
  }
42
+ // Module-level toggle for debug mode
43
+ let _debugMode = false;
44
+ function getDebugMode() {
45
+ return _debugMode;
46
+ }
47
+ function resetDebugMode() {
48
+ _debugMode = false;
49
+ }
38
50
  function registerDefaultCommands(registry) {
39
51
  (0, runtime_1.emitNervesEvent)({
40
52
  event: "repertoire.load_start",
@@ -51,7 +63,7 @@ function registerDefaultCommands(registry) {
51
63
  registry.register({
52
64
  name: "new",
53
65
  description: "start a new conversation",
54
- channels: ["cli", "teams"],
66
+ channels: ["teams"],
55
67
  handler: () => ({ action: "new" }),
56
68
  });
57
69
  registry.register({
@@ -60,10 +72,36 @@ function registerDefaultCommands(registry) {
60
72
  channels: ["cli", "teams"],
61
73
  handler: (ctx) => {
62
74
  const cmds = registry.list(ctx.channel);
63
- const lines = cmds.map((c) => `/${c.name} - ${c.description}`);
75
+ const lines = cmds.map((c) => `/${c.name} \u2014 ${c.description}`);
64
76
  return { action: "response", message: lines.join("\n") };
65
77
  },
66
78
  });
79
+ registry.register({
80
+ name: "help",
81
+ description: "show keyboard shortcuts and tips",
82
+ channels: ["cli"],
83
+ /* v8 ignore start -- integration: /help command tested via E2E @preserve */
84
+ handler: () => ({
85
+ action: "response",
86
+ message: [
87
+ "Keyboard shortcuts:",
88
+ " Ctrl-C abort current generation / clear input / exit (twice within 2s)",
89
+ " Escape clear input",
90
+ " ↑ / ↓ browse input history (includes previous sessions)",
91
+ " Option+← / → jump between words",
92
+ " Ctrl+A / E jump to start / end of line",
93
+ " Option+Delete delete word backward",
94
+ " Option+D delete word forward",
95
+ " Alt+Enter insert newline (multi-line input)",
96
+ "",
97
+ "Commands:",
98
+ " /help this help",
99
+ " /commands list all commands",
100
+ " /exit quit",
101
+ ].join("\n"),
102
+ }),
103
+ /* v8 ignore stop */
104
+ });
67
105
  registry.register({
68
106
  name: "tool-required",
69
107
  description: "toggle tool_choice required mode (forces tool calls)",
@@ -73,6 +111,20 @@ function registerDefaultCommands(registry) {
73
111
  return { action: "response", message: `tool-required mode: ${_toolChoiceRequired ? "ON" : "OFF"}` };
74
112
  },
75
113
  });
114
+ registry.register({
115
+ name: "debug",
116
+ description: "toggle debug mode — see more detail about what I'm doing",
117
+ channels: ["cli", "teams", "bluebubbles", "mcp"],
118
+ handler: () => {
119
+ _debugMode = !_debugMode;
120
+ return {
121
+ action: "response",
122
+ message: _debugMode
123
+ ? "debug mode on — you'll see more detail about what I'm doing"
124
+ : "debug mode off — back to clean output",
125
+ };
126
+ },
127
+ });
76
128
  (0, runtime_1.emitNervesEvent)({
77
129
  event: "repertoire.load_end",
78
130
  component: "repertoire",
@@ -80,6 +132,17 @@ function registerDefaultCommands(registry) {
80
132
  meta: {},
81
133
  });
82
134
  }
135
+ let _sharedRegistry = null;
136
+ function getSharedCommandRegistry() {
137
+ if (!_sharedRegistry) {
138
+ _sharedRegistry = createCommandRegistry();
139
+ registerDefaultCommands(_sharedRegistry);
140
+ }
141
+ return _sharedRegistry;
142
+ }
143
+ function resetSharedCommandRegistry() {
144
+ _sharedRegistry = null;
145
+ }
83
146
  function parseSlashCommand(input) {
84
147
  const trimmed = input.trim();
85
148
  if (!trimmed.startsWith("/"))
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeContinuityClauses = normalizeContinuityClauses;
4
+ exports.resolveMustResolveBeforeHandoff = resolveMustResolveBeforeHandoff;
5
+ exports.classifySteeringFollowUpEffect = classifySteeringFollowUpEffect;
6
+ const runtime_1 = require("../nerves/runtime");
7
+ const NO_HANDOFF_CLAUSES = new Set([
8
+ "dont return control until complete or blocked",
9
+ "do not return control until complete or blocked",
10
+ "dont hand back control until complete or blocked",
11
+ "do not hand back control until complete or blocked",
12
+ "keep going until youre done",
13
+ "keep going until you are done",
14
+ "keep working until youre done",
15
+ "keep working until you are done",
16
+ "dont stop until youre done",
17
+ "do not stop until youre done",
18
+ "only come back if blocked",
19
+ "only return if blocked",
20
+ "only respond if blocked",
21
+ "work autonomously on this",
22
+ "work on this autonomously",
23
+ "handle this autonomously",
24
+ ]);
25
+ const CANCEL_SUPERSEDE_CLAUSES = new Set([
26
+ "stop",
27
+ "cancel that",
28
+ "cancel this",
29
+ "never mind",
30
+ "nevermind",
31
+ "forget it",
32
+ "ignore that",
33
+ "ignore this",
34
+ "hold off",
35
+ "ill take it from here",
36
+ "i will take it from here",
37
+ "lets do something else",
38
+ "stop working on that",
39
+ "stop working on this",
40
+ "dont do that",
41
+ "do not do that",
42
+ ]);
43
+ function normalizeContinuityClauses(text) {
44
+ return text
45
+ .toLowerCase()
46
+ .split(/[\n.!?;]+/)
47
+ .map((clause) => clause.replace(/[^a-z\s]/g, "").replace(/\s+/g, " ").trim())
48
+ .filter(Boolean);
49
+ }
50
+ function resolveMustResolveBeforeHandoff(initialValue, ingressTexts) {
51
+ let current = initialValue;
52
+ for (const text of ingressTexts ?? []) {
53
+ for (const clause of normalizeContinuityClauses(text)) {
54
+ if (CANCEL_SUPERSEDE_CLAUSES.has(clause)) {
55
+ current = false;
56
+ continue;
57
+ }
58
+ if (NO_HANDOFF_CLAUSES.has(clause)) {
59
+ current = true;
60
+ }
61
+ }
62
+ }
63
+ (0, runtime_1.emitNervesEvent)({
64
+ component: "senses",
65
+ event: "senses.continuity_state_resolved",
66
+ message: "resolved continuity handoff state from ingress text",
67
+ meta: {
68
+ initialValue,
69
+ finalValue: current,
70
+ ingressCount: ingressTexts?.length ?? 0,
71
+ },
72
+ });
73
+ return current;
74
+ }
75
+ function classifySteeringFollowUpEffect(text) {
76
+ const clauses = normalizeContinuityClauses(text);
77
+ let effect = "none";
78
+ if (clauses.some((clause) => CANCEL_SUPERSEDE_CLAUSES.has(clause))) {
79
+ effect = "clear_and_supersede";
80
+ }
81
+ else if (clauses.some((clause) => NO_HANDOFF_CLAUSES.has(clause))) {
82
+ effect = "set_no_handoff";
83
+ }
84
+ (0, runtime_1.emitNervesEvent)({
85
+ component: "senses",
86
+ event: "senses.continuity_follow_up_classified",
87
+ message: "classified steering follow-up continuity effect",
88
+ meta: {
89
+ effect,
90
+ clauseCount: clauses.length,
91
+ },
92
+ });
93
+ return effect;
94
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildHabitTurnMessage = buildHabitTurnMessage;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ function formatElapsed(ms) {
6
+ const minutes = Math.floor(ms / 60000);
7
+ if (minutes < 60) {
8
+ return `${minutes} ${minutes === 1 ? "minute" : "minutes"}`;
9
+ }
10
+ const hours = Math.floor(minutes / 60);
11
+ return `${hours} ${hours === 1 ? "hour" : "hours"}`;
12
+ }
13
+ function buildHabitTurnMessage(options) {
14
+ const { habitName, habitTitle, habitBody, lastRun, checkpoint, alsoDue, staleObligations, parseErrors, degradedComponents, now, } = options;
15
+ const hasBody = habitBody !== undefined && habitBody !== "";
16
+ // First beat: lastRun is null
17
+ if (lastRun === null) {
18
+ // Cold start: no checkpoint, no body — bare awareness
19
+ if (!checkpoint && !hasBody) {
20
+ (0, runtime_1.emitNervesEvent)({
21
+ component: "senses",
22
+ event: "senses.habit_turn_message_built",
23
+ message: "habit turn message built (cold start)",
24
+ meta: { habitName, coldStart: true },
25
+ });
26
+ return "...time passing. anything stirring?";
27
+ }
28
+ if (!hasBody) {
29
+ // First beat with no body: nudge
30
+ const sections = [
31
+ `your ${habitTitle} fired but has no instructions \u2014 add a body to \`habits/${habitName}.md\``,
32
+ ];
33
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
34
+ (0, runtime_1.emitNervesEvent)({
35
+ component: "senses",
36
+ event: "senses.habit_turn_message_built",
37
+ message: "habit turn message built (first beat, no body)",
38
+ meta: { habitName, firstBeat: true, hasBody: false },
39
+ });
40
+ return sections.join("\n\n");
41
+ }
42
+ const sections = [
43
+ `your ${habitTitle} is alive. this is its first breath.`,
44
+ habitBody,
45
+ ];
46
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
47
+ (0, runtime_1.emitNervesEvent)({
48
+ component: "senses",
49
+ event: "senses.habit_turn_message_built",
50
+ message: "habit turn message built (first beat)",
51
+ meta: { habitName, firstBeat: true },
52
+ });
53
+ return sections.join("\n\n");
54
+ }
55
+ // Normal turn
56
+ const sections = [];
57
+ // 1. Checkpoint
58
+ if (checkpoint) {
59
+ sections.push(`you were thinking about ${checkpoint}.`);
60
+ }
61
+ // 2. Elapsed time
62
+ const nowMs = now().getTime();
63
+ const lastRunMs = new Date(lastRun).getTime();
64
+ const elapsed = nowMs - lastRunMs;
65
+ sections.push(`${formatElapsed(elapsed)} have passed.`);
66
+ // 3. Body or no-body nudge
67
+ if (hasBody) {
68
+ sections.push(habitBody);
69
+ }
70
+ else {
71
+ sections.push(`your ${habitTitle} fired but has no instructions \u2014 add a body to \`habits/${habitName}.md\``);
72
+ }
73
+ // 4-7. Trailing extras
74
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
75
+ (0, runtime_1.emitNervesEvent)({
76
+ component: "senses",
77
+ event: "senses.habit_turn_message_built",
78
+ message: "habit turn message built",
79
+ meta: {
80
+ habitName,
81
+ hasCheckpoint: !!checkpoint,
82
+ hasBody: hasBody,
83
+ staleObligationCount: staleObligations.length,
84
+ },
85
+ });
86
+ return sections.join("\n\n");
87
+ }
88
+ function appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents) {
89
+ // 4. Also-due
90
+ if (alsoDue) {
91
+ sections.push(alsoDue);
92
+ }
93
+ // 5. Stale obligations
94
+ if (staleObligations.length > 0) {
95
+ const lines = staleObligations.map((o) => `[internal] obligation: ${o.friendName} — waiting ${formatElapsed(o.stalenessMs)}`);
96
+ sections.push(lines.join("\n"));
97
+ }
98
+ // 6. Parse errors
99
+ if (parseErrors.length > 0) {
100
+ const lines = parseErrors.map((e) => `I noticed my habit file \`${e.file}\` has invalid frontmatter \u2014 I should fix it. (${e.error})`);
101
+ sections.push(lines.join("\n"));
102
+ }
103
+ // 7. Degraded state
104
+ if (degradedComponents.length > 0) {
105
+ const reasons = degradedComponents.map((d) => `${d.component}: ${d.reason}`).join("; ");
106
+ sections.push(`[note: my scheduling is degraded: ${reasons}]`);
107
+ }
108
+ }
@@ -1,29 +1,114 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.createInnerDialogWorker = createInnerDialogWorker;
4
37
  exports.startInnerDialogWorker = startInnerDialogWorker;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
5
40
  const inner_dialog_1 = require("./inner-dialog");
6
41
  const runtime_1 = require("../nerves/runtime");
7
- function createInnerDialogWorker(runTurn = (options) => (0, inner_dialog_1.runInnerDialogTurn)(options)) {
42
+ const identity_1 = require("../heart/identity");
43
+ const pending_1 = require("../mind/pending");
44
+ const habit_parser_1 = require("../heart/habits/habit-parser");
45
+ function createInnerDialogWorker(runTurn = (options) => (0, inner_dialog_1.runInnerDialogTurn)(options), hasPendingWork = () => (0, pending_1.hasPendingMessages)((0, pending_1.getInnerDialogPendingDir)((0, identity_1.getAgentName)()))) {
8
46
  let running = false;
9
- async function run(reason) {
10
- if (running)
47
+ const queue = [];
48
+ async function run(reason, taskId, habitName) {
49
+ if (running) {
50
+ queue.push({ reason, taskId, habitName });
11
51
  return;
52
+ }
12
53
  running = true;
13
54
  try {
14
- await runTurn({ reason });
15
- }
16
- catch (error) {
17
- (0, runtime_1.emitNervesEvent)({
18
- level: "error",
19
- component: "senses",
20
- event: "senses.inner_dialog_worker_error",
21
- message: "inner dialog worker turn failed",
22
- meta: {
23
- reason,
24
- error: error instanceof Error ? error.message : String(error),
25
- },
26
- });
55
+ let nextReason = reason;
56
+ let nextTaskId = taskId;
57
+ let nextHabitName = habitName;
58
+ do {
59
+ try {
60
+ await runTurn({ reason: nextReason, taskId: nextTaskId, habitName: nextHabitName });
61
+ }
62
+ catch (error) {
63
+ (0, runtime_1.emitNervesEvent)({
64
+ level: "error",
65
+ component: "senses",
66
+ event: "senses.inner_dialog_worker_error",
67
+ message: "inner dialog worker turn failed",
68
+ meta: {
69
+ reason: nextReason,
70
+ error: error instanceof Error ? error.message : String(error),
71
+ },
72
+ });
73
+ }
74
+ // Update lastRun in habit frontmatter after a habit turn
75
+ if (nextReason === "habit" && nextHabitName) {
76
+ try {
77
+ const agentRoot = (0, identity_1.getAgentRoot)();
78
+ const habitFilePath = path.join(agentRoot, "habits", `${nextHabitName}.md`);
79
+ const content = fs.readFileSync(habitFilePath, "utf-8");
80
+ const parsed = (0, habit_parser_1.parseHabitFile)(content, habitFilePath);
81
+ const frontmatter = {
82
+ title: parsed.title,
83
+ cadence: parsed.cadence,
84
+ status: parsed.status,
85
+ lastRun: new Date().toISOString(),
86
+ created: parsed.created,
87
+ };
88
+ const rendered = (0, habit_parser_1.renderHabitFile)(frontmatter, parsed.body);
89
+ fs.writeFileSync(habitFilePath, rendered, "utf-8");
90
+ }
91
+ catch {
92
+ // Habit file may have been deleted during the turn — skip gracefully
93
+ }
94
+ }
95
+ // Drain queue first
96
+ if (queue.length > 0) {
97
+ const next = queue.shift();
98
+ nextReason = next.reason;
99
+ nextTaskId = next.taskId;
100
+ nextHabitName = next.habitName;
101
+ continue;
102
+ }
103
+ // Then check hasPendingWork fallback
104
+ if (hasPendingWork()) {
105
+ nextReason = "instinct";
106
+ nextTaskId = undefined;
107
+ nextHabitName = undefined;
108
+ continue;
109
+ }
110
+ break;
111
+ } while (true);
27
112
  }
28
113
  finally {
29
114
  running = false;
@@ -33,12 +118,20 @@ function createInnerDialogWorker(runTurn = (options) => (0, inner_dialog_1.runIn
33
118
  if (!message || typeof message !== "object")
34
119
  return;
35
120
  const maybeMessage = message;
121
+ if (maybeMessage.type === "habit") {
122
+ await run("habit", undefined, maybeMessage.habitName);
123
+ return;
124
+ }
36
125
  if (maybeMessage.type === "heartbeat") {
37
- await run("heartbeat");
126
+ // Backward compatibility: heartbeat -> habit/heartbeat
127
+ await run("habit", undefined, "heartbeat");
128
+ return;
129
+ }
130
+ if (maybeMessage.type === "poke") {
131
+ await run("instinct", maybeMessage.taskId);
38
132
  return;
39
133
  }
40
- if (maybeMessage.type === "poke" ||
41
- maybeMessage.type === "chat" ||
134
+ if (maybeMessage.type === "chat" ||
42
135
  maybeMessage.type === "message") {
43
136
  await run("instinct");
44
137
  return;