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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/README.md +109 -14
  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 +2455 -6
  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 +417 -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 +101 -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 +397 -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 +213 -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 +599 -0
  44. package/dist/heart/daemon/cli-exec.js +3616 -0
  45. package/dist/heart/daemon/cli-help.js +396 -0
  46. package/dist/heart/daemon/cli-parse.js +1118 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +560 -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 +157 -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 +419 -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 +209 -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 +17 -8
  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 +201 -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 +216 -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 +119 -30
  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 +237 -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 +135 -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 +33 -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 +383 -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 +39 -29
  136. package/dist/heart/runtime-credentials.js +181 -0
  137. package/dist/heart/session-activity.js +190 -0
  138. package/dist/heart/session-events.js +855 -0
  139. package/dist/heart/session-transcript.js +167 -0
  140. package/dist/heart/start-of-turn-packet.js +345 -0
  141. package/dist/heart/streaming.js +36 -27
  142. package/dist/heart/sync.js +332 -0
  143. package/dist/heart/target-resolution.js +127 -0
  144. package/dist/heart/tempo.js +93 -0
  145. package/dist/heart/temporal-view.js +41 -0
  146. package/dist/heart/tool-activity-callbacks.js +36 -0
  147. package/dist/heart/tool-description.js +135 -0
  148. package/dist/heart/tool-friction.js +55 -0
  149. package/dist/heart/tool-loop.js +200 -0
  150. package/dist/heart/turn-context.js +351 -0
  151. package/dist/heart/turn-coordinator.js +28 -0
  152. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  153. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  154. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  155. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  156. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  157. package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
  158. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  159. package/dist/mind/bundle-manifest.js +7 -1
  160. package/dist/mind/context.js +134 -87
  161. package/dist/mind/diary-integrity.js +60 -0
  162. package/dist/mind/{memory.js → diary.js} +84 -96
  163. package/dist/mind/embedding-provider.js +60 -0
  164. package/dist/mind/file-state.js +179 -0
  165. package/dist/mind/first-impressions.js +14 -1
  166. package/dist/mind/friends/channel.js +21 -0
  167. package/dist/mind/friends/group-context.js +144 -0
  168. package/dist/mind/friends/resolver.js +38 -1
  169. package/dist/mind/friends/store-file.js +39 -3
  170. package/dist/mind/friends/trust-explanation.js +74 -0
  171. package/dist/mind/friends/types.js +1 -1
  172. package/dist/mind/journal-index.js +161 -0
  173. package/dist/mind/note-search.js +268 -0
  174. package/dist/mind/obligation-steering.js +221 -0
  175. package/dist/mind/pending.js +66 -7
  176. package/dist/mind/prompt-refresh.js +3 -2
  177. package/dist/mind/prompt.js +946 -167
  178. package/dist/mind/provenance-trust.js +26 -0
  179. package/dist/mind/scrutiny.js +173 -0
  180. package/dist/nerves/cli-logging.js +7 -1
  181. package/dist/nerves/coverage/audit-rules.js +15 -6
  182. package/dist/nerves/coverage/audit.js +28 -2
  183. package/dist/nerves/coverage/cli.js +1 -1
  184. package/dist/nerves/coverage/contract.js +5 -5
  185. package/dist/nerves/coverage/file-completeness.js +83 -5
  186. package/dist/nerves/coverage/run-artifacts.js +1 -1
  187. package/dist/nerves/event-buffer.js +111 -0
  188. package/dist/nerves/index.js +224 -4
  189. package/dist/nerves/observation.js +20 -0
  190. package/dist/nerves/redact.js +79 -0
  191. package/dist/nerves/runtime.js +5 -1
  192. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  193. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  194. package/dist/outlook-ui/index.html +15 -0
  195. package/dist/repertoire/ado-client.js +15 -56
  196. package/dist/repertoire/ado-semantic.js +11 -10
  197. package/dist/repertoire/api-client.js +97 -0
  198. package/dist/repertoire/bitwarden-store.js +461 -0
  199. package/dist/repertoire/bundle-templates.js +72 -0
  200. package/dist/repertoire/bw-installer.js +79 -0
  201. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  202. package/dist/repertoire/coding/context-pack.js +330 -0
  203. package/dist/repertoire/coding/feedback.js +197 -30
  204. package/dist/repertoire/coding/manager.js +158 -9
  205. package/dist/repertoire/coding/spawner.js +55 -9
  206. package/dist/repertoire/coding/tools.js +170 -7
  207. package/dist/repertoire/commerce-errors.js +109 -0
  208. package/dist/repertoire/commerce-self-test.js +156 -0
  209. package/dist/repertoire/credential-access.js +107 -0
  210. package/dist/repertoire/duffel-client.js +185 -0
  211. package/dist/repertoire/github-client.js +14 -55
  212. package/dist/repertoire/graph-client.js +11 -52
  213. package/dist/repertoire/guardrails.js +371 -0
  214. package/dist/repertoire/mcp-client.js +255 -0
  215. package/dist/repertoire/mcp-manager.js +305 -0
  216. package/dist/repertoire/mcp-tools.js +63 -0
  217. package/dist/repertoire/shell-sessions.js +133 -0
  218. package/dist/repertoire/skills.js +15 -24
  219. package/dist/repertoire/stripe-client.js +131 -0
  220. package/dist/repertoire/tasks/board.js +43 -5
  221. package/dist/repertoire/tasks/fix.js +182 -0
  222. package/dist/repertoire/tasks/index.js +26 -1
  223. package/dist/repertoire/tasks/lifecycle.js +2 -2
  224. package/dist/repertoire/tasks/parser.js +3 -2
  225. package/dist/repertoire/tasks/scanner.js +194 -37
  226. package/dist/repertoire/tasks/transitions.js +16 -78
  227. package/dist/repertoire/tool-results.js +29 -0
  228. package/dist/repertoire/tools-attachments.js +317 -0
  229. package/dist/repertoire/tools-base.js +42 -687
  230. package/dist/repertoire/tools-bluebubbles.js +1 -0
  231. package/dist/repertoire/tools-bridge.js +141 -0
  232. package/dist/repertoire/tools-bundle.js +984 -0
  233. package/dist/repertoire/tools-config.js +185 -0
  234. package/dist/repertoire/tools-continuity.js +248 -0
  235. package/dist/repertoire/tools-credential.js +182 -0
  236. package/dist/repertoire/tools-files.js +342 -0
  237. package/dist/repertoire/tools-flight.js +224 -0
  238. package/dist/repertoire/tools-flow.js +105 -0
  239. package/dist/repertoire/tools-github.js +1 -7
  240. package/dist/repertoire/tools-notes.js +376 -0
  241. package/dist/repertoire/tools-session.js +739 -0
  242. package/dist/repertoire/tools-shell.js +120 -0
  243. package/dist/repertoire/tools-stripe.js +180 -0
  244. package/dist/repertoire/tools-surface.js +243 -0
  245. package/dist/repertoire/tools-teams.js +9 -39
  246. package/dist/repertoire/tools-travel.js +125 -0
  247. package/dist/repertoire/tools-user-profile.js +144 -0
  248. package/dist/repertoire/tools-vault.js +40 -0
  249. package/dist/repertoire/tools.js +144 -113
  250. package/dist/repertoire/travel-api-client.js +360 -0
  251. package/dist/repertoire/user-profile.js +118 -0
  252. package/dist/repertoire/vault-setup.js +246 -0
  253. package/dist/repertoire/vault-unlock.js +382 -0
  254. package/dist/scripts/claude-code-hook.js +41 -0
  255. package/dist/scripts/claude-code-stop-hook.js +47 -0
  256. package/dist/senses/attention-queue.js +116 -0
  257. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  258. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  259. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  260. package/dist/senses/bluebubbles/entry.js +70 -0
  261. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  262. package/dist/senses/bluebubbles/index.js +1620 -0
  263. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  264. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  265. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +45 -3
  266. package/dist/senses/bluebubbles/replay.js +129 -0
  267. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  268. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  269. package/dist/senses/cli/bracketed-paste.js +82 -0
  270. package/dist/senses/cli/image-paste.js +287 -0
  271. package/dist/senses/cli/image-ref-navigation.js +75 -0
  272. package/dist/senses/cli/ink-app.js +156 -0
  273. package/dist/senses/cli/inline-diff.js +64 -0
  274. package/dist/senses/cli/input-keys.js +174 -0
  275. package/dist/senses/cli/kill-ring.js +86 -0
  276. package/dist/senses/cli/message-list.js +51 -0
  277. package/dist/senses/cli/ouro-tui.js +605 -0
  278. package/dist/senses/cli/spinner-imperative.js +135 -0
  279. package/dist/senses/cli/spinner.js +101 -0
  280. package/dist/senses/cli/status-line.js +60 -0
  281. package/dist/senses/cli/streaming-markdown.js +526 -0
  282. package/dist/senses/cli/tool-display.js +83 -0
  283. package/dist/senses/cli/tool-render.js +85 -0
  284. package/dist/senses/cli/tui-store.js +240 -0
  285. package/dist/senses/cli/virtual-list.js +35 -0
  286. package/dist/senses/cli-entry.js +60 -8
  287. package/dist/senses/cli-layout.js +187 -0
  288. package/dist/senses/cli.js +526 -211
  289. package/dist/senses/commands.js +66 -3
  290. package/dist/senses/continuity.js +94 -0
  291. package/dist/senses/habit-turn-message.js +108 -0
  292. package/dist/senses/inner-dialog-worker.js +112 -19
  293. package/dist/senses/inner-dialog.js +600 -95
  294. package/dist/senses/pipeline.js +539 -61
  295. package/dist/senses/proactive-content-guard.js +51 -0
  296. package/dist/senses/shared-turn.js +205 -0
  297. package/dist/senses/surface-tool.js +68 -0
  298. package/dist/senses/teams-entry.js +60 -8
  299. package/dist/senses/teams.js +569 -237
  300. package/dist/senses/trust-gate.js +5 -5
  301. package/package.json +28 -7
  302. package/skills/agent-commerce.md +106 -0
  303. package/skills/browser-navigation.md +110 -0
  304. package/skills/commerce-setup-guide.md +116 -0
  305. package/skills/commerce-setup.md +84 -0
  306. package/skills/configure-dev-tools.md +101 -0
  307. package/skills/travel-planning.md +134 -0
  308. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  309. package/dist/heart/daemon/subagent-installer.js +0 -134
  310. package/dist/mind/associative-recall.js +0 -197
  311. package/dist/senses/bluebubbles-entry.js +0 -11
  312. package/dist/senses/bluebubbles.js +0 -832
  313. package/dist/senses/debug-activity.js +0 -127
  314. package/subagents/README.md +0 -60
  315. package/subagents/work-doer.md +0 -235
  316. package/subagents/work-merger.md +0 -618
  317. package/subagents/work-planner.md +0 -382
  318. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  319. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  320. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  321. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  329. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  330. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  331. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  332. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  333. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,330 @@
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.prepareCodingContextPack = prepareCodingContextPack;
37
+ exports.emitCodingEpisode = emitCodingEpisode;
38
+ const crypto = __importStar(require("crypto"));
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const child_process_1 = require("child_process");
42
+ const active_work_1 = require("../../heart/active-work");
43
+ const identity_1 = require("../../heart/identity");
44
+ const runtime_1 = require("../../nerves/runtime");
45
+ const episodes_1 = require("../../arc/episodes");
46
+ const skills_1 = require("../skills");
47
+ const CONTEXT_FILENAMES = ["AGENTS.md", "CLAUDE.md"];
48
+ function defaultRunCommand(command, args, cwd) {
49
+ const result = (0, child_process_1.spawnSync)(command, args, {
50
+ cwd,
51
+ encoding: "utf-8",
52
+ });
53
+ return {
54
+ status: result.status ?? 1,
55
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
56
+ stderr: typeof result.stderr === "string" ? result.stderr : "",
57
+ };
58
+ }
59
+ function stableContextKey(request) {
60
+ const payload = JSON.stringify({
61
+ runner: request.runner,
62
+ workdir: request.workdir,
63
+ taskRef: request.taskRef ?? "",
64
+ parentAgent: request.parentAgent ?? "",
65
+ obligationId: request.obligationId ?? "",
66
+ originSession: request.originSession ?? null,
67
+ });
68
+ return crypto.createHash("sha1").update(payload).digest("hex").slice(0, 12);
69
+ }
70
+ function collectProjectContextFiles(workdir, deps) {
71
+ const files = [];
72
+ const seen = new Set();
73
+ let current = path.resolve(workdir);
74
+ const root = path.parse(current).root;
75
+ while (true) {
76
+ for (const filename of CONTEXT_FILENAMES) {
77
+ const candidate = path.join(current, filename);
78
+ if (!deps.existsSync(candidate) || seen.has(candidate))
79
+ continue;
80
+ try {
81
+ const content = deps.readFileSync(candidate, "utf-8").trim();
82
+ if (content.length > 0) {
83
+ files.unshift({ path: candidate, content });
84
+ seen.add(candidate);
85
+ }
86
+ }
87
+ catch {
88
+ // Best-effort loading only.
89
+ }
90
+ }
91
+ if (current === root)
92
+ break;
93
+ current = path.dirname(current);
94
+ }
95
+ return files;
96
+ }
97
+ function captureRepoSnapshot(workdir, runCommand) {
98
+ const repoRoot = runCommand("git", ["rev-parse", "--show-toplevel"], workdir);
99
+ if (repoRoot.status !== 0) {
100
+ return {
101
+ available: false,
102
+ repoRoot: null,
103
+ branch: null,
104
+ head: null,
105
+ statusLines: [],
106
+ };
107
+ }
108
+ const branch = runCommand("git", ["rev-parse", "--abbrev-ref", "HEAD"], workdir);
109
+ const head = runCommand("git", ["rev-parse", "--short", "HEAD"], workdir);
110
+ const status = runCommand("git", ["status", "--short"], workdir);
111
+ return {
112
+ available: true,
113
+ repoRoot: repoRoot.stdout.trim() || null,
114
+ branch: branch.status === 0 ? branch.stdout.trim() || null : null,
115
+ head: head.status === 0 ? head.stdout.trim() || null : null,
116
+ statusLines: status.status === 0
117
+ ? status.stdout.split(/\r?\n/).map((line) => line.trimEnd()).filter(Boolean)
118
+ : [],
119
+ };
120
+ }
121
+ function buildIdentityPacket(snapshot, request) {
122
+ if (!snapshot.available) {
123
+ return {
124
+ repoPath: null,
125
+ worktreePath: null,
126
+ branch: null,
127
+ commit: null,
128
+ dirty: false,
129
+ dirtyFiles: [],
130
+ taskRef: request.taskRef ?? null,
131
+ verificationCommands: request.verificationCommands ?? [],
132
+ verificationStatus: "not-verified",
133
+ };
134
+ }
135
+ const dirtyFiles = snapshot.statusLines.filter((line) => line.length > 0);
136
+ return {
137
+ repoPath: snapshot.repoRoot,
138
+ worktreePath: snapshot.repoRoot,
139
+ branch: snapshot.branch,
140
+ commit: snapshot.head,
141
+ dirty: dirtyFiles.length > 0,
142
+ dirtyFiles,
143
+ taskRef: request.taskRef ?? null,
144
+ verificationCommands: request.verificationCommands ?? [],
145
+ verificationStatus: "not-verified",
146
+ };
147
+ }
148
+ function formatIdentitySection(packet) {
149
+ const lines = [
150
+ "## Coding Identity",
151
+ `repoPath: ${packet.repoPath ?? "unknown"}`,
152
+ `worktreePath: ${packet.worktreePath ?? "unknown"}`,
153
+ `branch: ${packet.branch ?? "unknown"}`,
154
+ `commit: ${packet.commit ?? "unknown"}`,
155
+ `dirty: ${packet.dirty}`,
156
+ ];
157
+ if (packet.dirtyFiles.length > 0) {
158
+ lines.push("dirtyFiles:");
159
+ for (const file of packet.dirtyFiles) {
160
+ lines.push(file);
161
+ }
162
+ }
163
+ lines.push(`taskRef: ${packet.taskRef ?? "none"}`);
164
+ if (packet.verificationCommands.length > 0) {
165
+ lines.push(`verificationCommands: ${packet.verificationCommands.join(", ")}`);
166
+ }
167
+ lines.push(`verificationStatus: ${packet.verificationStatus}`);
168
+ return lines.join("\n");
169
+ }
170
+ function formatContextFiles(files) {
171
+ if (files.length === 0)
172
+ return "(none found)";
173
+ return files.map((file) => `### ${file.path}\n${file.content}`).join("\n\n");
174
+ }
175
+ function formatSkills(skills) {
176
+ return skills.length > 0 ? skills.join(", ") : "(none found)";
177
+ }
178
+ function formatExistingSessions(sessions) {
179
+ if (sessions.length === 0)
180
+ return "activeSessions: none";
181
+ return sessions
182
+ .map((session) => {
183
+ return [
184
+ `- ${session.id}`,
185
+ `status=${session.status}`,
186
+ `lastActivityAt=${session.lastActivityAt}`,
187
+ session.taskRef ? `taskRef=${session.taskRef}` : null,
188
+ session.checkpoint ? `checkpoint=${session.checkpoint}` : null,
189
+ session.artifactPath ? `artifact=${session.artifactPath}` : null,
190
+ ].filter(Boolean).join(" ");
191
+ })
192
+ .join("\n");
193
+ }
194
+ function formatOrigin(request) {
195
+ if (!request.originSession)
196
+ return "originSession: none";
197
+ return `originSession: ${request.originSession.channel}/${request.originSession.key} (${request.originSession.friendId})`;
198
+ }
199
+ function buildScopeContent(request, contextFiles, skills, agentName) {
200
+ return [
201
+ "# Coding Session Scope",
202
+ "",
203
+ "## Request",
204
+ `runner: ${request.runner}`,
205
+ `taskRef: ${request.taskRef ?? "unassigned"}`,
206
+ `parentAgent: ${request.parentAgent ?? agentName}`,
207
+ `workdir: ${request.workdir}`,
208
+ formatOrigin(request),
209
+ `obligationId: ${request.obligationId ?? "none"}`,
210
+ "",
211
+ "## Prompt",
212
+ request.prompt,
213
+ "",
214
+ "## Session Contract",
215
+ "- This is a focused coding lane opened by the parent Ouro agent.",
216
+ "- Execute the concrete prompt in the supplied workdir directly.",
217
+ "- Do not switch into planning/doing workflows or approval gates unless the prompt explicitly asks for them.",
218
+ "- Treat the current prompt, scope file, and live world-state checkpoint in the state file as the authoritative briefing for this lane.",
219
+ "",
220
+ "## Project Context Files",
221
+ formatContextFiles(contextFiles),
222
+ "",
223
+ "## Available Bundle Skills",
224
+ formatSkills(skills),
225
+ ].join("\n");
226
+ }
227
+ function buildStateContent(request, contextKey, generatedAt, snapshot, existingSessions, agentName, identityPacket, activeWorkFrame, startOfTurnPacket) {
228
+ const gitSection = snapshot.available
229
+ ? [
230
+ `repoRoot: ${snapshot.repoRoot ?? "unknown"}`,
231
+ `branch: ${snapshot.branch ?? "unknown"}`,
232
+ `head: ${snapshot.head ?? "unknown"}`,
233
+ "status:",
234
+ snapshot.statusLines.length > 0 ? snapshot.statusLines.join("\n") : "(clean)",
235
+ ].join("\n")
236
+ : "git: unavailable";
237
+ return [
238
+ "# Coding Session State",
239
+ `generatedAt: ${generatedAt}`,
240
+ `contextKey: ${contextKey}`,
241
+ `agent: ${request.parentAgent ?? agentName}`,
242
+ formatOrigin(request),
243
+ `obligationId: ${request.obligationId ?? "none"}`,
244
+ ...(startOfTurnPacket ? ["", "## Continuity", startOfTurnPacket] : []),
245
+ "",
246
+ formatIdentitySection(identityPacket),
247
+ "",
248
+ "## Workspace Snapshot",
249
+ gitSection,
250
+ ...(activeWorkFrame ? ["", (0, active_work_1.formatLiveWorldStateCheckpoint)(activeWorkFrame)] : []),
251
+ "",
252
+ "## Related Coding Sessions",
253
+ formatExistingSessions(existingSessions),
254
+ ].join("\n");
255
+ }
256
+ function relatedSessions(request, existingSessions) {
257
+ return existingSessions.filter((session) => {
258
+ return session.runner === request.runner
259
+ && session.workdir === request.workdir
260
+ && session.taskRef === request.taskRef;
261
+ });
262
+ }
263
+ function prepareCodingContextPack(input, deps = {}) {
264
+ const agentRoot = deps.agentRoot ?? (0, identity_1.getAgentRoot)();
265
+ const agentName = deps.agentName ?? (0, identity_1.getAgentName)();
266
+ const nowIso = deps.nowIso ?? (() => new Date().toISOString());
267
+ const existsSync = deps.existsSync ?? fs.existsSync;
268
+ const readFileSync = deps.readFileSync ?? fs.readFileSync;
269
+ const writeFileSync = deps.writeFileSync ?? fs.writeFileSync;
270
+ const mkdirSync = deps.mkdirSync ?? fs.mkdirSync;
271
+ const listAvailableSkills = deps.listSkills ?? skills_1.listSkills;
272
+ const runCommand = deps.runCommand ?? defaultRunCommand;
273
+ const contextKey = stableContextKey(input.request);
274
+ const contextDir = path.join(agentRoot, "state", "coding", "context");
275
+ const scopeFile = path.join(contextDir, `${contextKey}-scope.md`);
276
+ const stateFile = path.join(contextDir, `${contextKey}-state.md`);
277
+ const contextFiles = collectProjectContextFiles(input.request.workdir, { existsSync, readFileSync });
278
+ const skills = listAvailableSkills();
279
+ const existingSessions = relatedSessions(input.request, input.existingSessions ?? []);
280
+ const snapshot = captureRepoSnapshot(input.request.workdir, runCommand);
281
+ const generatedAt = nowIso();
282
+ const identityPacket = buildIdentityPacket(snapshot, input.request);
283
+ const scopeContent = buildScopeContent(input.request, contextFiles, skills, agentName);
284
+ const stateContent = buildStateContent(input.request, contextKey, generatedAt, snapshot, existingSessions, agentName, identityPacket, input.activeWorkFrame, input.startOfTurnPacket || undefined);
285
+ mkdirSync(contextDir, { recursive: true });
286
+ writeFileSync(scopeFile, `${scopeContent}\n`, "utf-8");
287
+ writeFileSync(stateFile, `${stateContent}\n`, "utf-8");
288
+ (0, runtime_1.emitNervesEvent)({
289
+ component: "repertoire",
290
+ event: "repertoire.coding_context_pack_written",
291
+ message: "prepared coding session context pack",
292
+ meta: {
293
+ contextKey,
294
+ workdir: input.request.workdir,
295
+ taskRef: input.request.taskRef ?? null,
296
+ contextFiles: contextFiles.length,
297
+ skills: skills.length,
298
+ relatedSessions: existingSessions.length,
299
+ gitAvailable: snapshot.available,
300
+ },
301
+ });
302
+ return {
303
+ contextKey,
304
+ scopeFile,
305
+ stateFile,
306
+ scopeContent,
307
+ stateContent,
308
+ identityPacket,
309
+ };
310
+ }
311
+ /**
312
+ * Emit a coding milestone episode when a session completes or blocks.
313
+ * This is the outbound leg of the coding round-trip: compact start-of-turn packet goes IN,
314
+ * episodes come BACK OUT.
315
+ */
316
+ function emitCodingEpisode(agentRoot, session, outcome) {
317
+ (0, episodes_1.emitEpisode)(agentRoot, {
318
+ kind: "coding_milestone",
319
+ summary: `coding session ${session.id} (${session.runner}): ${outcome}`,
320
+ whyItMattered: `coding lane ${session.status}`,
321
+ relatedEntities: [`coding:${session.id}`],
322
+ salience: session.status === "failed" ? "high" : "medium",
323
+ });
324
+ (0, runtime_1.emitNervesEvent)({
325
+ component: "repertoire",
326
+ event: "repertoire.coding_episode_emitted",
327
+ message: `coding episode emitted for ${session.id}`,
328
+ meta: { sessionId: session.id, outcome, status: session.status },
329
+ });
330
+ }
@@ -2,8 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatCodingTail = formatCodingTail;
4
4
  exports.attachCodingSessionFeedback = attachCodingSessionFeedback;
5
+ const identity_1 = require("../../heart/identity");
6
+ const socket_client_1 = require("../../heart/daemon/socket-client");
7
+ const obligations_1 = require("../../arc/obligations");
5
8
  const runtime_1 = require("../../nerves/runtime");
6
9
  const TERMINAL_UPDATE_KINDS = new Set(["completed", "failed", "killed"]);
10
+ const OBLIGATION_WAKE_UPDATE_KINDS = new Set([
11
+ "waiting_input",
12
+ "stalled",
13
+ "completed",
14
+ "failed",
15
+ "killed",
16
+ ]);
17
+ const PULL_REQUEST_NUMBER_PATTERN = /\bPR\s*#(\d+)\b/i;
18
+ const PULL_REQUEST_URL_PATTERN = /\/pull\/(\d+)(?:\b|\/)?/i;
7
19
  function clip(text, maxLength = 280) {
8
20
  const trimmed = text.trim();
9
21
  if (trimmed.length <= maxLength)
@@ -42,25 +54,114 @@ function lastMeaningfulLine(text) {
42
54
  return clip(lines.at(-1));
43
55
  }
44
56
  function formatSessionLabel(session) {
45
- return `${session.runner} ${session.id}`;
57
+ const origin = session.originSession
58
+ ? ` for ${session.originSession.channel}/${session.originSession.key}`
59
+ : "";
60
+ return `${session.runner} ${session.id}${origin}`;
61
+ }
62
+ function extractPullRequestLabel(snippet) {
63
+ if (!snippet)
64
+ return null;
65
+ const numberMatch = snippet.match(PULL_REQUEST_NUMBER_PATTERN);
66
+ if (numberMatch)
67
+ return `PR #${numberMatch[1]}`;
68
+ const urlMatch = snippet.match(PULL_REQUEST_URL_PATTERN);
69
+ if (urlMatch)
70
+ return `PR #${urlMatch[1]}`;
71
+ return null;
72
+ }
73
+ function isMergedPullRequestSnippet(snippet) {
74
+ return /\bmerged\b/i.test(snippet) || /\blanded\b/i.test(snippet);
75
+ }
76
+ function deriveObligationMilestone(update) {
77
+ const snippet = pickUpdateSnippet(update);
78
+ const pullRequest = extractPullRequestLabel(snippet);
79
+ if (update.kind === "completed" && snippet && pullRequest && isMergedPullRequestSnippet(snippet)) {
80
+ return {
81
+ status: "updating_runtime",
82
+ currentSurface: { kind: "runtime", label: "ouro up" },
83
+ currentArtifact: pullRequest,
84
+ nextAction: "update runtime, verify version/changelog, then re-observe",
85
+ };
86
+ }
87
+ if (update.kind === "completed" && pullRequest) {
88
+ return {
89
+ status: "waiting_for_merge",
90
+ currentSurface: { kind: "merge", label: pullRequest },
91
+ currentArtifact: pullRequest,
92
+ nextAction: `wait for checks, merge ${pullRequest}, then update runtime`,
93
+ };
94
+ }
95
+ if (update.kind === "waiting_input") {
96
+ return {
97
+ status: "investigating",
98
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
99
+ nextAction: `answer ${update.session.runner} ${update.session.id} and continue`,
100
+ };
101
+ }
102
+ if (update.kind === "stalled") {
103
+ return {
104
+ status: "investigating",
105
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
106
+ nextAction: `unstick ${update.session.runner} ${update.session.id} and continue`,
107
+ };
108
+ }
109
+ if (update.kind === "progress" || update.kind === "spawned" || update.kind === "failed" || update.kind === "killed" || update.kind === "completed") {
110
+ return {
111
+ status: "investigating",
112
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
113
+ };
114
+ }
115
+ return null;
46
116
  }
47
117
  function isSafeProgressSnippet(snippet) {
118
+ const normalized = snippet.trim();
48
119
  const wordCount = snippet.split(/\s+/).filter(Boolean).length;
49
- return (snippet.length <= 80
120
+ return (normalized.length <= 80
121
+ && wordCount >= 2
50
122
  && wordCount <= 8
51
- && !snippet.includes(":")
52
- && !snippet.startsWith("**")
53
- && !/^Respond with\b/i.test(snippet)
54
- && !/^Coding session metadata\b/i.test(snippet)
55
- && !/^sessionId\b/i.test(snippet)
56
- && !/^taskRef\b/i.test(snippet)
57
- && !/^parentAgent\b/i.test(snippet));
123
+ && /[A-Za-z]{3,}/.test(normalized)
124
+ && !normalized.includes(":")
125
+ && !/[{}\[\]();]/.test(normalized)
126
+ && !normalized.startsWith("**")
127
+ && !/^Respond with\b/i.test(normalized)
128
+ && !/^Coding session metadata\b/i.test(normalized)
129
+ && !/^sessionId\b/i.test(normalized)
130
+ && !/^taskRef\b/i.test(normalized)
131
+ && !/^parentAgent\b/i.test(normalized));
58
132
  }
59
133
  function pickUpdateSnippet(update) {
60
- return (lastMeaningfulLine(update.text)
134
+ const checkpoint = update.session.checkpoint?.trim() || null;
135
+ return (checkpoint
136
+ ?? lastMeaningfulLine(update.text)
61
137
  ?? lastMeaningfulLine(update.session.stderrTail)
62
138
  ?? lastMeaningfulLine(update.session.stdoutTail));
63
139
  }
140
+ function renderValue(text) {
141
+ const trimmed = text?.trim();
142
+ return trimmed && trimmed.length > 0 ? trimmed : "(empty)";
143
+ }
144
+ function renderPath(text) {
145
+ return text && text.trim().length > 0 ? text : "(none)";
146
+ }
147
+ function formatCodingTail(session) {
148
+ const stdout = renderValue(session.stdoutTail);
149
+ const stderr = renderValue(session.stderrTail);
150
+ return [
151
+ `sessionId: ${session.id}`,
152
+ `runner: ${session.runner}`,
153
+ `status: ${session.status}`,
154
+ `checkpoint: ${renderValue(session.checkpoint ?? undefined)}`,
155
+ `artifactPath: ${renderPath(session.artifactPath)}`,
156
+ `workdir: ${session.workdir}`,
157
+ "",
158
+ "[stdout]",
159
+ stdout,
160
+ "",
161
+ "[stderr]",
162
+ stderr,
163
+ ].join("\n");
164
+ }
64
165
  function formatUpdateMessage(update) {
65
166
  const label = formatSessionLabel(update.session);
66
167
  const snippet = pickUpdateSnippet(update);
@@ -81,26 +182,88 @@ function formatUpdateMessage(update) {
81
182
  return `${label} started`;
82
183
  }
83
184
  }
84
- function formatCodingTail(session) {
85
- const stdout = session.stdoutTail.trim() || "(empty)";
86
- const stderr = session.stderrTail.trim() || "(empty)";
87
- return [
88
- `sessionId: ${session.id}`,
89
- `runner: ${session.runner}`,
90
- `status: ${session.status}`,
91
- `workdir: ${session.workdir}`,
92
- "",
93
- "[stdout]",
94
- stdout,
95
- "",
96
- "[stderr]",
97
- stderr,
98
- ].join("\n");
185
+ function formatReportBackMessage(update, baseMessage) {
186
+ if (!baseMessage)
187
+ return null;
188
+ if (!update.session.obligationId || !update.session.originSession) {
189
+ return baseMessage;
190
+ }
191
+ const milestone = deriveObligationMilestone(update);
192
+ const extraLines = [];
193
+ if (milestone?.currentArtifact) {
194
+ extraLines.push(`current artifact: ${milestone.currentArtifact}`);
195
+ }
196
+ if (milestone?.nextAction) {
197
+ extraLines.push(`next: ${milestone.nextAction}`);
198
+ }
199
+ return extraLines.length > 0 ? `${baseMessage}\n${extraLines.join("\n")}` : baseMessage;
200
+ }
201
+ function obligationNoteFromUpdate(update) {
202
+ const snippet = pickUpdateSnippet(update);
203
+ switch (update.kind) {
204
+ case "spawned":
205
+ return update.session.originSession
206
+ ? `coding session started for ${update.session.originSession.channel}/${update.session.originSession.key}`
207
+ : "coding session started";
208
+ case "progress":
209
+ return snippet ? `coding session progress: ${snippet}` : null;
210
+ case "waiting_input":
211
+ return snippet ? `coding session waiting: ${snippet}` : "coding session waiting for input";
212
+ case "stalled":
213
+ return snippet ? `coding session stalled: ${snippet}` : "coding session stalled";
214
+ case "completed":
215
+ return snippet
216
+ ? `coding session completed: ${snippet}; merge/update still pending`
217
+ : "coding session completed; merge/update still pending";
218
+ case "failed":
219
+ return snippet ? `coding session failed: ${snippet}` : "coding session failed";
220
+ case "killed":
221
+ return "coding session killed";
222
+ }
223
+ }
224
+ function syncObligationFromUpdate(update) {
225
+ const obligationId = update.session.obligationId;
226
+ if (!obligationId)
227
+ return;
228
+ const milestone = deriveObligationMilestone(update);
229
+ try {
230
+ (0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), obligationId, {
231
+ status: milestone?.status ?? "investigating",
232
+ currentSurface: milestone?.currentSurface ?? { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
233
+ currentArtifact: milestone?.currentArtifact,
234
+ nextAction: milestone?.nextAction,
235
+ latestNote: obligationNoteFromUpdate(update) ?? undefined,
236
+ });
237
+ }
238
+ catch {
239
+ // Detached feedback should still reach the human even if obligation sync is unavailable.
240
+ }
241
+ }
242
+ async function wakeInnerDialogForObligation(update) {
243
+ if (!update.session.obligationId || !OBLIGATION_WAKE_UPDATE_KINDS.has(update.kind)) {
244
+ return;
245
+ }
246
+ try {
247
+ await (0, socket_client_1.requestInnerWake)((0, identity_1.getAgentName)());
248
+ }
249
+ catch (error) {
250
+ (0, runtime_1.emitNervesEvent)({
251
+ level: "warn",
252
+ component: "repertoire",
253
+ event: "repertoire.coding_feedback_wake_error",
254
+ message: "coding feedback wake request failed",
255
+ meta: {
256
+ sessionId: update.session.id,
257
+ kind: update.kind,
258
+ reason: error instanceof Error ? error.message : String(error),
259
+ },
260
+ });
261
+ }
99
262
  }
100
263
  function attachCodingSessionFeedback(manager, session, target) {
101
264
  let lastMessage = "";
102
265
  let closed = false;
103
- let unsubscribe = () => { };
266
+ let unsubscribe = null;
104
267
  const sendMessage = (message) => {
105
268
  if (closed || !message || message === lastMessage) {
106
269
  return;
@@ -119,16 +282,20 @@ function attachCodingSessionFeedback(manager, session, target) {
119
282
  });
120
283
  });
121
284
  };
122
- sendMessage(formatUpdateMessage({ kind: "spawned", session }));
285
+ const spawnedUpdate = { kind: "spawned", session };
286
+ syncObligationFromUpdate(spawnedUpdate);
287
+ sendMessage(formatReportBackMessage(spawnedUpdate, formatUpdateMessage(spawnedUpdate)));
123
288
  unsubscribe = manager.subscribe(session.id, async (update) => {
124
- sendMessage(formatUpdateMessage(update));
289
+ syncObligationFromUpdate(update);
290
+ sendMessage(formatReportBackMessage(update, formatUpdateMessage(update)));
291
+ await wakeInnerDialogForObligation(update);
125
292
  if (TERMINAL_UPDATE_KINDS.has(update.kind)) {
126
293
  closed = true;
127
- unsubscribe();
294
+ unsubscribe?.();
128
295
  }
129
296
  });
130
297
  return () => {
131
298
  closed = true;
132
- unsubscribe();
299
+ unsubscribe?.();
133
300
  };
134
301
  }