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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4398 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +810 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +326 -0
  36. package/dist/arc/packets.js +288 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +160 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/awaiting/await-alert.js +146 -0
  54. package/dist/heart/awaiting/await-expiry.js +108 -0
  55. package/dist/heart/awaiting/await-loader.js +91 -0
  56. package/dist/heart/awaiting/await-parser.js +141 -0
  57. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  58. package/dist/heart/awaiting/await-scheduler.js +378 -0
  59. package/dist/heart/background-operations.js +281 -0
  60. package/dist/heart/bridges/manager.js +137 -17
  61. package/dist/heart/bridges/store.js +14 -2
  62. package/dist/heart/bundle-state.js +168 -0
  63. package/dist/heart/commitments.js +135 -0
  64. package/dist/heart/config-registry.js +331 -0
  65. package/dist/heart/config.js +122 -119
  66. package/dist/heart/context-loss-gauntlet.js +354 -0
  67. package/dist/heart/context-loss-sentinel.js +993 -0
  68. package/dist/heart/core.js +1297 -269
  69. package/dist/heart/cross-chat-delivery.js +8 -22
  70. package/dist/heart/daemon/agent-config-check.js +451 -0
  71. package/dist/heart/daemon/agent-discovery.js +185 -3
  72. package/dist/heart/daemon/agent-service.js +523 -0
  73. package/dist/heart/daemon/agentic-repair.js +547 -0
  74. package/dist/heart/daemon/await-private-wake.js +59 -0
  75. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  76. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  77. package/dist/heart/daemon/cadence.js +70 -0
  78. package/dist/heart/daemon/cli-defaults.js +780 -0
  79. package/dist/heart/daemon/cli-desk.js +322 -0
  80. package/dist/heart/daemon/cli-exec.js +8100 -0
  81. package/dist/heart/daemon/cli-help.js +601 -0
  82. package/dist/heart/daemon/cli-parse.js +1995 -0
  83. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  84. package/dist/heart/daemon/cli-render.js +770 -0
  85. package/dist/heart/daemon/cli-types.js +8 -0
  86. package/dist/heart/daemon/connect-bay.js +323 -0
  87. package/dist/heart/daemon/daemon-cli.js +29 -1814
  88. package/dist/heart/daemon/daemon-entry.js +668 -6
  89. package/dist/heart/daemon/daemon-health.js +176 -0
  90. package/dist/heart/daemon/daemon-rollup.js +57 -0
  91. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  92. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  93. package/dist/heart/daemon/daemon.js +1222 -84
  94. package/dist/heart/daemon/dns-workflow.js +394 -0
  95. package/dist/heart/daemon/doctor-types.js +8 -0
  96. package/dist/heart/daemon/doctor.js +873 -0
  97. package/dist/heart/daemon/habit-private-wake.js +56 -0
  98. package/dist/heart/daemon/health-monitor.js +131 -3
  99. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  100. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  101. package/dist/heart/daemon/http-health-probe.js +80 -0
  102. package/dist/heart/daemon/human-command-screens.js +234 -0
  103. package/dist/heart/daemon/human-readiness.js +114 -0
  104. package/dist/heart/daemon/inner-status.js +78 -0
  105. package/dist/heart/daemon/interactive-repair.js +394 -0
  106. package/dist/heart/daemon/launchd.js +37 -8
  107. package/dist/heart/daemon/log-tailer.js +79 -10
  108. package/dist/heart/daemon/logs-prune.js +110 -0
  109. package/dist/heart/daemon/mcp-canary.js +297 -0
  110. package/dist/heart/daemon/message-router.js +45 -5
  111. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  112. package/dist/heart/daemon/os-cron-deps.js +135 -0
  113. package/dist/heart/daemon/os-cron.js +14 -12
  114. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  115. package/dist/heart/daemon/ouro-entry.js +3 -1
  116. package/dist/heart/daemon/plugin-cli.js +432 -0
  117. package/dist/heart/daemon/process-manager.js +519 -40
  118. package/dist/heart/daemon/provider-discovery.js +137 -0
  119. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  120. package/dist/heart/daemon/pulse.js +511 -0
  121. package/dist/heart/daemon/readiness-repair.js +365 -0
  122. package/dist/heart/daemon/run-hooks.js +2 -0
  123. package/dist/heart/daemon/runtime-logging.js +41 -14
  124. package/dist/heart/daemon/runtime-metadata.js +2 -30
  125. package/dist/heart/daemon/safe-mode.js +161 -0
  126. package/dist/heart/daemon/sense-manager.js +583 -43
  127. package/dist/heart/daemon/session-id-resolver.js +131 -0
  128. package/dist/heart/daemon/skill-management-installer.js +1 -1
  129. package/dist/heart/daemon/socket-client.js +171 -12
  130. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  131. package/dist/heart/daemon/startup-tui.js +338 -0
  132. package/dist/heart/daemon/task-scheduler.js +117 -39
  133. package/dist/heart/daemon/terminal-ui.js +499 -0
  134. package/dist/heart/daemon/thoughts.js +255 -43
  135. package/dist/heart/daemon/up-progress.js +366 -0
  136. package/dist/heart/daemon/vault-items.js +56 -0
  137. package/dist/heart/delegation.js +1 -4
  138. package/dist/heart/external-events/router.js +121 -0
  139. package/dist/heart/habits/habit-migration.js +189 -0
  140. package/dist/heart/habits/habit-parser.js +211 -0
  141. package/dist/heart/habits/habit-runtime-state.js +114 -0
  142. package/dist/heart/habits/habit-scheduler.js +411 -0
  143. package/dist/heart/habits/habit-session-summary.js +318 -0
  144. package/dist/heart/habits/habit-session.js +618 -0
  145. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -57
  146. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  147. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  148. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  149. package/dist/heart/identity.js +174 -58
  150. package/dist/heart/kept-notes.js +289 -0
  151. package/dist/heart/kicks.js +1 -1
  152. package/dist/heart/machine-identity.js +161 -0
  153. package/dist/heart/mail-import-discovery.js +353 -0
  154. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  155. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  156. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  157. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  158. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  159. package/dist/heart/mailbox/mailbox-http.js +99 -0
  160. package/dist/heart/mailbox/mailbox-read.js +37 -0
  161. package/dist/heart/mailbox/mailbox-types.js +27 -0
  162. package/dist/heart/mailbox/mailbox-view.js +197 -0
  163. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  164. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  165. package/dist/heart/mailbox/readers/mail.js +375 -0
  166. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  167. package/dist/heart/mailbox/readers/sessions.js +232 -0
  168. package/dist/heart/mailbox/readers/shared.js +111 -0
  169. package/dist/heart/mcp/mcp-server.js +696 -0
  170. package/dist/heart/migrate-config.js +100 -0
  171. package/dist/heart/model-capabilities.js +19 -0
  172. package/dist/heart/orientation-frame.js +217 -0
  173. package/dist/heart/platform.js +81 -0
  174. package/dist/heart/primitives.js +1 -1
  175. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  176. package/dist/heart/private-runtime/index.js +18 -0
  177. package/dist/heart/private-runtime/ledger.js +218 -0
  178. package/dist/heart/private-runtime/policy.js +214 -0
  179. package/dist/heart/private-runtime/types.js +2 -0
  180. package/dist/heart/progress-story.js +1 -1
  181. package/dist/heart/provider-attempt.js +134 -0
  182. package/dist/heart/provider-binding-resolver.js +273 -0
  183. package/dist/heart/provider-credentials.js +425 -0
  184. package/dist/heart/provider-failover.js +311 -0
  185. package/dist/heart/provider-models.js +81 -0
  186. package/dist/heart/provider-ping.js +262 -0
  187. package/dist/heart/provider-readiness-cache.js +119 -0
  188. package/dist/heart/provider-visibility.js +188 -0
  189. package/dist/heart/providers/anthropic-token.js +131 -0
  190. package/dist/heart/providers/anthropic.js +139 -52
  191. package/dist/heart/providers/azure.js +23 -11
  192. package/dist/heart/providers/error-classification.js +127 -0
  193. package/dist/heart/providers/github-copilot.js +145 -0
  194. package/dist/heart/providers/minimax-vlm.js +189 -0
  195. package/dist/heart/providers/minimax.js +26 -8
  196. package/dist/heart/providers/openai-codex-token.js +349 -0
  197. package/dist/heart/providers/openai-codex.js +55 -40
  198. package/dist/heart/runtime-capability-check.js +170 -0
  199. package/dist/heart/runtime-credentials.js +389 -0
  200. package/dist/heart/runtime-cwd.js +87 -0
  201. package/dist/heart/sense-truth.js +17 -4
  202. package/dist/heart/session-activity.js +90 -24
  203. package/dist/heart/session-events.js +1133 -0
  204. package/dist/heart/session-playback-cli-main.js +5 -0
  205. package/dist/heart/session-playback-cli.js +36 -0
  206. package/dist/heart/session-playback.js +231 -0
  207. package/dist/heart/session-stats-cli-main.js +5 -0
  208. package/dist/heart/session-stats.js +182 -0
  209. package/dist/heart/session-transcript.js +133 -0
  210. package/dist/heart/start-of-turn-packet.js +365 -0
  211. package/dist/heart/streaming.js +44 -27
  212. package/dist/heart/structured-output.js +196 -0
  213. package/dist/heart/sync-classification.js +176 -0
  214. package/dist/heart/sync.js +449 -0
  215. package/dist/heart/target-resolution.js +11 -7
  216. package/dist/heart/tempo.js +93 -0
  217. package/dist/heart/temporal-view.js +41 -0
  218. package/dist/heart/timeouts.js +101 -0
  219. package/dist/heart/tool-activity-callbacks.js +59 -0
  220. package/dist/heart/tool-description.js +155 -0
  221. package/dist/heart/tool-friction.js +55 -0
  222. package/dist/heart/tool-loop.js +200 -0
  223. package/dist/heart/turn-context.js +450 -0
  224. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  225. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  226. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  227. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  228. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  229. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  230. package/dist/heart/versioning/update-hooks.js +154 -0
  231. package/dist/heart/work-card.js +390 -0
  232. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  233. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  234. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  235. package/dist/mailbox-ui/index.html +16 -0
  236. package/dist/mailroom/attention.js +167 -0
  237. package/dist/mailroom/autonomy.js +209 -0
  238. package/dist/mailroom/blob-store.js +715 -0
  239. package/dist/mailroom/body-cache.js +61 -0
  240. package/dist/mailroom/core.js +788 -0
  241. package/dist/mailroom/entry.js +160 -0
  242. package/dist/mailroom/file-store.js +568 -0
  243. package/dist/mailroom/mbox-import.js +393 -0
  244. package/dist/mailroom/migration.js +164 -0
  245. package/dist/mailroom/outbound.js +380 -0
  246. package/dist/mailroom/policy.js +263 -0
  247. package/dist/mailroom/reader.js +233 -0
  248. package/dist/mailroom/search-cache.js +334 -0
  249. package/dist/mailroom/search-relevance.js +319 -0
  250. package/dist/mailroom/smtp-ingress.js +176 -0
  251. package/dist/mailroom/source-state.js +176 -0
  252. package/dist/mailroom/thread.js +109 -0
  253. package/dist/mailroom/travel-extract.js +89 -0
  254. package/dist/mind/bundle-manifest.js +24 -2
  255. package/dist/mind/context.js +250 -101
  256. package/dist/mind/desk-section.js +362 -0
  257. package/dist/mind/diary-integrity.js +60 -0
  258. package/dist/mind/{memory.js → diary.js} +68 -77
  259. package/dist/mind/embedding-provider.js +60 -0
  260. package/dist/mind/file-state.js +179 -0
  261. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  262. package/dist/mind/obligation-steering.js +221 -0
  263. package/dist/mind/pending.js +13 -8
  264. package/dist/mind/prompt-refresh.js +3 -2
  265. package/dist/mind/prompt.js +1009 -169
  266. package/dist/mind/provenance-trust.js +26 -0
  267. package/dist/mind/record-paths.js +312 -0
  268. package/dist/mind/scrutiny.js +173 -0
  269. package/dist/nerves/cli-logging.js +7 -1
  270. package/dist/nerves/coverage/audit-rules.js +15 -6
  271. package/dist/nerves/coverage/audit.js +28 -2
  272. package/dist/nerves/coverage/cli.js +1 -1
  273. package/dist/nerves/coverage/contract.js +5 -5
  274. package/dist/nerves/coverage/file-completeness.js +139 -5
  275. package/dist/nerves/event-buffer.js +111 -0
  276. package/dist/nerves/index.js +224 -4
  277. package/dist/nerves/observation.js +20 -0
  278. package/dist/nerves/redact.js +79 -0
  279. package/dist/nerves/review/cli-main.js +5 -0
  280. package/dist/nerves/review/cli.js +156 -0
  281. package/dist/nerves/review/core.js +152 -0
  282. package/dist/nerves/runtime.js +5 -1
  283. package/dist/repertoire/ado-client.js +15 -56
  284. package/dist/repertoire/ado-semantic.js +16 -10
  285. package/dist/repertoire/api-client.js +97 -0
  286. package/dist/repertoire/bitwarden-store.js +1042 -0
  287. package/dist/repertoire/bundle-templates.js +71 -0
  288. package/dist/repertoire/bw-installer.js +180 -0
  289. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  290. package/dist/repertoire/coding/context-pack.js +331 -0
  291. package/dist/repertoire/coding/feedback.js +218 -30
  292. package/dist/repertoire/coding/index.js +15 -3
  293. package/dist/repertoire/coding/manager.js +166 -10
  294. package/dist/repertoire/coding/spawner.js +58 -11
  295. package/dist/repertoire/coding/tools.js +242 -14
  296. package/dist/repertoire/coding/workbench-client.js +272 -0
  297. package/dist/repertoire/coding/workbench-manager.js +346 -0
  298. package/dist/repertoire/commerce-errors.js +109 -0
  299. package/dist/repertoire/commerce-self-test.js +156 -0
  300. package/dist/repertoire/credential-access.js +178 -0
  301. package/dist/repertoire/desk/classifier.js +362 -0
  302. package/dist/repertoire/duffel-client.js +185 -0
  303. package/dist/repertoire/github-client.js +14 -55
  304. package/dist/repertoire/graph-client.js +11 -52
  305. package/dist/repertoire/guardrails.js +159 -27
  306. package/dist/repertoire/mcp-client.js +44 -3
  307. package/dist/repertoire/mcp-manager.js +259 -20
  308. package/dist/repertoire/mcp-tools.js +83 -0
  309. package/dist/repertoire/plugin-mcp.js +175 -0
  310. package/dist/repertoire/plugins.js +253 -0
  311. package/dist/repertoire/shell-sessions.js +133 -0
  312. package/dist/repertoire/skills.js +48 -4
  313. package/dist/repertoire/stripe-client.js +131 -0
  314. package/dist/repertoire/tool-results.js +29 -0
  315. package/dist/repertoire/tools-a2a.js +699 -0
  316. package/dist/repertoire/tools-attachments.js +317 -0
  317. package/dist/repertoire/tools-awaiting.js +372 -0
  318. package/dist/repertoire/tools-base.js +63 -1095
  319. package/dist/repertoire/tools-bluebubbles.js +2 -0
  320. package/dist/repertoire/tools-bridge.js +144 -0
  321. package/dist/repertoire/tools-bundle.js +993 -0
  322. package/dist/repertoire/tools-commerce.js +253 -0
  323. package/dist/repertoire/tools-config.js +186 -0
  324. package/dist/repertoire/tools-continuity.js +252 -0
  325. package/dist/repertoire/tools-credential.js +383 -0
  326. package/dist/repertoire/tools-evolution.js +527 -0
  327. package/dist/repertoire/tools-files.js +344 -0
  328. package/dist/repertoire/tools-flight.js +290 -0
  329. package/dist/repertoire/tools-flow.js +119 -0
  330. package/dist/repertoire/tools-github.js +3 -8
  331. package/dist/repertoire/tools-mail.js +1975 -0
  332. package/dist/repertoire/tools-notes.js +459 -0
  333. package/dist/repertoire/tools-obligations.js +143 -0
  334. package/dist/repertoire/tools-orientation.js +31 -0
  335. package/dist/repertoire/tools-record.js +482 -0
  336. package/dist/repertoire/tools-runtime.js +150 -0
  337. package/dist/repertoire/tools-session.js +881 -0
  338. package/dist/repertoire/tools-shell.js +120 -0
  339. package/dist/repertoire/tools-stripe.js +224 -0
  340. package/dist/repertoire/tools-surface.js +355 -0
  341. package/dist/repertoire/tools-teams.js +12 -39
  342. package/dist/repertoire/tools-travel.js +125 -0
  343. package/dist/repertoire/tools-trip.js +982 -0
  344. package/dist/repertoire/tools-user-profile.js +146 -0
  345. package/dist/repertoire/tools-vault.js +40 -0
  346. package/dist/repertoire/tools-voice.js +145 -0
  347. package/dist/repertoire/tools.js +250 -80
  348. package/dist/repertoire/travel-api-client.js +360 -0
  349. package/dist/repertoire/user-profile.js +131 -0
  350. package/dist/repertoire/vault-setup.js +246 -0
  351. package/dist/repertoire/vault-unlock.js +594 -0
  352. package/dist/scripts/claude-code-hook.js +41 -0
  353. package/dist/scripts/claude-code-stop-hook.js +47 -0
  354. package/dist/senses/a2a-entry.js +115 -0
  355. package/dist/senses/attention-queue.js +186 -0
  356. package/dist/senses/await-turn-message.js +58 -0
  357. package/dist/senses/bluebubbles/active-turns.js +216 -0
  358. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  359. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  360. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  361. package/dist/senses/bluebubbles/entry.js +77 -0
  362. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  363. package/dist/senses/bluebubbles/index.js +2732 -0
  364. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  365. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  366. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  367. package/dist/senses/bluebubbles/processed-log.js +133 -0
  368. package/dist/senses/bluebubbles/replay.js +137 -0
  369. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  370. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  371. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  372. package/dist/senses/cli/bracketed-paste.js +82 -0
  373. package/dist/senses/cli/image-paste.js +287 -0
  374. package/dist/senses/cli/image-ref-navigation.js +75 -0
  375. package/dist/senses/cli/ink-app.js +156 -0
  376. package/dist/senses/cli/inline-diff.js +64 -0
  377. package/dist/senses/cli/input-keys.js +174 -0
  378. package/dist/senses/cli/kill-ring.js +86 -0
  379. package/dist/senses/cli/message-list.js +51 -0
  380. package/dist/senses/cli/ouro-tui.js +607 -0
  381. package/dist/senses/cli/spinner-imperative.js +135 -0
  382. package/dist/senses/cli/spinner.js +101 -0
  383. package/dist/senses/cli/status-line.js +60 -0
  384. package/dist/senses/cli/streaming-markdown.js +526 -0
  385. package/dist/senses/cli/tool-display.js +85 -0
  386. package/dist/senses/cli/tool-render.js +85 -0
  387. package/dist/senses/cli/tui-store.js +240 -0
  388. package/dist/senses/cli/virtual-list.js +35 -0
  389. package/dist/senses/cli-entry.js +60 -8
  390. package/dist/senses/cli-layout.js +100 -0
  391. package/dist/senses/cli.js +521 -214
  392. package/dist/senses/commands.js +66 -3
  393. package/dist/senses/habit-turn-message.js +160 -0
  394. package/dist/senses/mail-entry.js +66 -0
  395. package/dist/senses/mail.js +395 -0
  396. package/dist/senses/pipeline.js +873 -179
  397. package/dist/senses/private-runtime-worker.js +584 -0
  398. package/dist/senses/private-runtime.js +1145 -0
  399. package/dist/senses/proactive-content-guard.js +51 -0
  400. package/dist/senses/shared-turn.js +416 -0
  401. package/dist/senses/surface-tool.js +109 -0
  402. package/dist/senses/teams-entry.js +60 -8
  403. package/dist/senses/teams.js +397 -112
  404. package/dist/senses/trust-gate.js +104 -9
  405. package/dist/senses/voice/audio-playback.js +237 -0
  406. package/dist/senses/voice/audio-routing.js +119 -0
  407. package/dist/senses/voice/elevenlabs.js +202 -0
  408. package/dist/senses/voice/floor-control.js +431 -0
  409. package/dist/senses/voice/floor-controller.js +115 -0
  410. package/dist/senses/voice/golden-path.js +116 -0
  411. package/dist/senses/voice/index.js +29 -0
  412. package/dist/senses/voice/meeting.js +113 -0
  413. package/dist/senses/voice/outbound.js +190 -0
  414. package/dist/senses/voice/phone.js +33 -0
  415. package/dist/senses/voice/playback.js +139 -0
  416. package/dist/senses/voice/realtime-eval.js +496 -0
  417. package/dist/senses/voice/realtime-trace.js +531 -0
  418. package/dist/senses/voice/transcript.js +70 -0
  419. package/dist/senses/voice/turn.js +191 -0
  420. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  421. package/dist/senses/voice/twilio-phone.js +5077 -0
  422. package/dist/senses/voice/types.js +2 -0
  423. package/dist/senses/voice/whisper.js +161 -0
  424. package/dist/senses/voice-entry.js +81 -0
  425. package/dist/senses/voice-realtime-eval-command.js +99 -0
  426. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  427. package/dist/senses/voice-twilio-entry.js +87 -0
  428. package/dist/trips/core.js +138 -0
  429. package/dist/trips/store.js +265 -0
  430. package/dist/util/frontmatter.js +69 -0
  431. package/package.json +57 -12
  432. package/skills/agent-commerce.md +113 -0
  433. package/skills/browser-navigation.md +117 -0
  434. package/skills/commerce-setup-guide.md +116 -0
  435. package/skills/commerce-setup.md +84 -0
  436. package/skills/configure-dev-tools.md +99 -0
  437. package/skills/travel-planning.md +138 -0
  438. package/dist/heart/daemon/auth-flow.js +0 -351
  439. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  440. package/dist/heart/daemon/update-hooks.js +0 -138
  441. package/dist/heart/safe-workspace.js +0 -228
  442. package/dist/heart/session-recall.js +0 -116
  443. package/dist/mind/friends/channel.js +0 -84
  444. package/dist/mind/friends/group-context.js +0 -144
  445. package/dist/mind/friends/resolver.js +0 -84
  446. package/dist/mind/friends/store-file.js +0 -190
  447. package/dist/mind/friends/store.js +0 -4
  448. package/dist/mind/friends/tokens.js +0 -26
  449. package/dist/mind/friends/trust-explanation.js +0 -74
  450. package/dist/mind/friends/types.js +0 -29
  451. package/dist/repertoire/tasks/board.js +0 -134
  452. package/dist/repertoire/tasks/index.js +0 -224
  453. package/dist/repertoire/tasks/lifecycle.js +0 -80
  454. package/dist/repertoire/tasks/middleware.js +0 -65
  455. package/dist/repertoire/tasks/parser.js +0 -173
  456. package/dist/repertoire/tasks/scanner.js +0 -132
  457. package/dist/repertoire/tasks/transitions.js +0 -144
  458. package/dist/senses/bluebubbles-entry.js +0 -13
  459. package/dist/senses/bluebubbles.js +0 -1180
  460. package/dist/senses/debug-activity.js +0 -148
  461. package/dist/senses/inner-dialog-worker.js +0 -90
  462. package/dist/senses/inner-dialog.js +0 -480
  463. package/subagents/README.md +0 -7
  464. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  465. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  466. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  467. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  468. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  469. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  470. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  471. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  472. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  473. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  474. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  475. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  476. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  477. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  478. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  479. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  480. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,228 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.resetSafeWorkspaceSelection = resetSafeWorkspaceSelection;
37
- exports.getActiveSafeWorkspaceSelection = getActiveSafeWorkspaceSelection;
38
- exports.ensureSafeRepoWorkspace = ensureSafeRepoWorkspace;
39
- exports.resolveSafeRepoPath = resolveSafeRepoPath;
40
- const fs = __importStar(require("fs"));
41
- const path = __importStar(require("path"));
42
- const child_process_1 = require("child_process");
43
- const identity_1 = require("./identity");
44
- const runtime_1 = require("../nerves/runtime");
45
- let activeSelection = null;
46
- let cleanupHookRegistered = false;
47
- function defaultNow() {
48
- return Date.now();
49
- }
50
- function resolveAgentName(explicit) {
51
- if (explicit && explicit.trim().length > 0)
52
- return explicit.trim();
53
- try {
54
- return (0, identity_1.getAgentName)();
55
- }
56
- catch {
57
- return "slugger";
58
- }
59
- }
60
- function runGit(cwd, args, spawnSync) {
61
- return spawnSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
62
- }
63
- function readStdout(result) {
64
- return (result.stdout ?? Buffer.from("")).toString("utf-8").trim();
65
- }
66
- function readStderr(result) {
67
- return (result.stderr ?? Buffer.from("")).toString("utf-8").trim();
68
- }
69
- function assertGitOk(result, action) {
70
- if (result.error) {
71
- throw result.error;
72
- }
73
- if (result.status !== 0) {
74
- const detail = readStderr(result) || readStdout(result) || `exit ${result.status ?? "unknown"}`;
75
- throw new Error(`${action} failed: ${detail}`);
76
- }
77
- return readStdout(result);
78
- }
79
- function isGitClone(repoRoot, spawnSync) {
80
- const result = runGit(repoRoot, ["rev-parse", "--is-inside-work-tree"], spawnSync);
81
- return result.status === 0 && readStdout(result) === "true";
82
- }
83
- function readCurrentBranch(repoRoot, spawnSync) {
84
- return assertGitOk(runGit(repoRoot, ["rev-parse", "--abbrev-ref", "HEAD"], spawnSync), "git branch read");
85
- }
86
- function ensureFetchedOrigin(repoRoot, spawnSync) {
87
- assertGitOk(runGit(repoRoot, ["fetch", "origin"], spawnSync), "git fetch origin");
88
- }
89
- function ensureMainFastForward(repoRoot, spawnSync) {
90
- assertGitOk(runGit(repoRoot, ["pull", "--ff-only", "origin", "main"], spawnSync), "git pull --ff-only origin main");
91
- }
92
- function createDedicatedWorktree(repoRoot, workspaceRoot, branchSuffix, existsSync, mkdirSync, rmSync, spawnSync) {
93
- mkdirSync(path.dirname(workspaceRoot), { recursive: true });
94
- const branchName = `slugger/${branchSuffix}`;
95
- if (existsSync(workspaceRoot)) {
96
- rmSync(workspaceRoot, { recursive: true, force: true });
97
- }
98
- assertGitOk(runGit(repoRoot, ["worktree", "add", "-B", branchName, workspaceRoot, "origin/main"], spawnSync), "git worktree add");
99
- return { workspaceRoot, created: true };
100
- }
101
- function createScratchClone(workspaceRoot, cloneUrl, existsSync, mkdirSync, rmSync, spawnSync) {
102
- mkdirSync(path.dirname(workspaceRoot), { recursive: true });
103
- if (existsSync(workspaceRoot)) {
104
- rmSync(workspaceRoot, { recursive: true, force: true });
105
- }
106
- const result = spawnSync("git", ["clone", "--depth", "1", "--branch", "main", cloneUrl, workspaceRoot], {
107
- stdio: ["ignore", "pipe", "pipe"],
108
- });
109
- assertGitOk(result, "git clone");
110
- return { workspaceRoot, created: true };
111
- }
112
- function registerCleanupHook(options) {
113
- if (cleanupHookRegistered)
114
- return;
115
- cleanupHookRegistered = true;
116
- process.on("exit", () => {
117
- if (!activeSelection?.cleanupAfterMerge)
118
- return;
119
- try {
120
- options.rmSync(activeSelection.workspaceRoot, { recursive: true, force: true });
121
- }
122
- catch {
123
- // best effort
124
- }
125
- });
126
- }
127
- function resetSafeWorkspaceSelection(options = {}) {
128
- activeSelection = null;
129
- if (!options.keepCleanupHookRegistered) {
130
- cleanupHookRegistered = false;
131
- }
132
- }
133
- function getActiveSafeWorkspaceSelection() {
134
- return activeSelection;
135
- }
136
- function ensureSafeRepoWorkspace(options = {}) {
137
- if (activeSelection) {
138
- return activeSelection;
139
- }
140
- const repoRoot = options.repoRoot ?? (0, identity_1.getRepoRoot)();
141
- const agentName = resolveAgentName(options.agentName);
142
- const canonicalRepoUrl = options.canonicalRepoUrl ?? identity_1.HARNESS_CANONICAL_REPO_URL;
143
- const workspaceBase = options.workspaceRoot ?? (0, identity_1.getAgentRepoWorkspacesRoot)(agentName);
144
- const spawnSync = options.spawnSync ?? child_process_1.spawnSync;
145
- const existsSync = options.existsSync ?? fs.existsSync;
146
- const mkdirSync = options.mkdirSync ?? fs.mkdirSync;
147
- const rmSync = options.rmSync ?? fs.rmSync;
148
- const now = options.now ?? defaultNow;
149
- const stamp = String(now());
150
- registerCleanupHook({ rmSync });
151
- let selection;
152
- if (isGitClone(repoRoot, spawnSync)) {
153
- const branch = readCurrentBranch(repoRoot, spawnSync);
154
- ensureFetchedOrigin(repoRoot, spawnSync);
155
- if (branch === "main") {
156
- ensureMainFastForward(repoRoot, spawnSync);
157
- const worktreeRoot = path.join(workspaceBase, `ouroboros-main-${stamp}`);
158
- const created = createDedicatedWorktree(repoRoot, worktreeRoot, `safe-workspace-${stamp}`, existsSync, mkdirSync, rmSync, spawnSync);
159
- selection = {
160
- runtimeKind: "clone-main",
161
- repoRoot,
162
- workspaceRoot: created.workspaceRoot,
163
- sourceBranch: branch,
164
- sourceCloneUrl: canonicalRepoUrl,
165
- cleanupAfterMerge: false,
166
- created: created.created,
167
- note: `running from clone on main; fast-forwarded and created dedicated worktree ${created.workspaceRoot}`,
168
- };
169
- }
170
- else {
171
- const worktreeRoot = path.join(workspaceBase, `ouroboros-origin-main-${stamp}`);
172
- const created = createDedicatedWorktree(repoRoot, worktreeRoot, `safe-workspace-${stamp}`, existsSync, mkdirSync, rmSync, spawnSync);
173
- selection = {
174
- runtimeKind: "clone-non-main",
175
- repoRoot,
176
- workspaceRoot: created.workspaceRoot,
177
- sourceBranch: branch,
178
- sourceCloneUrl: canonicalRepoUrl,
179
- cleanupAfterMerge: false,
180
- created: created.created,
181
- note: `running from branch ${branch}; defaulted new work from origin/main in dedicated worktree ${created.workspaceRoot}`,
182
- };
183
- }
184
- }
185
- else {
186
- const scratchRoot = path.join(workspaceBase, `ouroboros-scratch-${stamp}`);
187
- const created = createScratchClone(scratchRoot, canonicalRepoUrl, existsSync, mkdirSync, rmSync, spawnSync);
188
- selection = {
189
- runtimeKind: "installed-runtime",
190
- repoRoot,
191
- workspaceRoot: created.workspaceRoot,
192
- sourceBranch: null,
193
- sourceCloneUrl: canonicalRepoUrl,
194
- cleanupAfterMerge: true,
195
- created: created.created,
196
- note: `running from installed runtime/wrapper; created scratch clone ${created.workspaceRoot} from ${canonicalRepoUrl}`,
197
- };
198
- }
199
- activeSelection = selection;
200
- (0, runtime_1.emitNervesEvent)({
201
- component: "workspace",
202
- event: "workspace.safe_repo_acquired",
203
- message: "acquired safe repo workspace before local edits",
204
- meta: {
205
- runtimeKind: selection.runtimeKind,
206
- repoRoot: selection.repoRoot,
207
- workspaceRoot: selection.workspaceRoot,
208
- sourceBranch: selection.sourceBranch,
209
- sourceCloneUrl: selection.sourceCloneUrl,
210
- cleanupAfterMerge: selection.cleanupAfterMerge,
211
- },
212
- });
213
- return selection;
214
- }
215
- function resolveSafeRepoPath(options) {
216
- const requestedPath = path.resolve(options.requestedPath);
217
- const repoRoot = path.resolve(options.repoRoot ?? (0, identity_1.getRepoRoot)());
218
- if (activeSelection && requestedPath.startsWith(activeSelection.workspaceRoot + path.sep)) {
219
- return { selection: activeSelection, resolvedPath: requestedPath };
220
- }
221
- if (requestedPath !== repoRoot && !requestedPath.startsWith(repoRoot + path.sep)) {
222
- return { selection: activeSelection, resolvedPath: requestedPath };
223
- }
224
- const selection = ensureSafeRepoWorkspace(options);
225
- const relativePath = requestedPath === repoRoot ? "" : path.relative(repoRoot, requestedPath);
226
- const resolvedPath = relativePath ? path.join(selection.workspaceRoot, relativePath) : selection.workspaceRoot;
227
- return { selection, resolvedPath };
228
- }
@@ -1,116 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.recallSession = recallSession;
37
- const fs = __importStar(require("fs"));
38
- const runtime_1 = require("../nerves/runtime");
39
- function normalizeContent(content) {
40
- if (typeof content === "string")
41
- return content;
42
- if (!Array.isArray(content))
43
- return "";
44
- return content
45
- .map((part) => (part && typeof part === "object" && "type" in part && part.type === "text" && "text" in part
46
- ? String(part.text ?? "")
47
- : ""))
48
- .filter((text) => text.length > 0)
49
- .join("");
50
- }
51
- function buildSummaryInstruction(friendId, channel, trustLevel) {
52
- if (friendId === "self" && channel === "inner") {
53
- return "summarize this session transcript fully and transparently. this is my own inner dialog — include all details, decisions, and reasoning.";
54
- }
55
- return `summarize this session transcript. the person asking has trust level: ${trustLevel}. family=full transparency, friend=share work and general topics but protect other people's identities, acquaintance=very guarded minimal disclosure.`;
56
- }
57
- function clip(text, limit = 160) {
58
- const compact = text.replace(/\s+/g, " ").trim();
59
- return compact.length > limit ? compact.slice(0, limit - 1) + "…" : compact;
60
- }
61
- function buildSnapshot(summary, tailMessages) {
62
- const lines = [`recent focus: ${clip(summary, 240)}`];
63
- const latestUser = [...tailMessages].reverse().find((message) => message.role === "user")?.content;
64
- const latestAssistant = [...tailMessages].reverse().find((message) => message.role === "assistant")?.content;
65
- if (latestUser) {
66
- lines.push(`latest user: ${clip(latestUser)}`);
67
- }
68
- if (latestAssistant) {
69
- lines.push(`latest assistant: ${clip(latestAssistant)}`);
70
- }
71
- return lines.join("\n");
72
- }
73
- async function recallSession(options) {
74
- (0, runtime_1.emitNervesEvent)({
75
- component: "daemon",
76
- event: "daemon.session_recall",
77
- message: "recalling session transcript tail",
78
- meta: {
79
- friendId: options.friendId,
80
- channel: options.channel,
81
- key: options.key,
82
- messageCount: options.messageCount,
83
- },
84
- });
85
- let raw;
86
- try {
87
- raw = fs.readFileSync(options.sessionPath, "utf-8");
88
- }
89
- catch {
90
- return { kind: "missing" };
91
- }
92
- const parsed = JSON.parse(raw);
93
- const tailMessages = (parsed.messages ?? [])
94
- .map((message) => ({
95
- role: typeof message.role === "string" ? message.role : "",
96
- content: normalizeContent(message.content),
97
- }))
98
- .filter((message) => message.role !== "system" && message.content.length > 0)
99
- .slice(-options.messageCount);
100
- if (tailMessages.length === 0) {
101
- return { kind: "empty" };
102
- }
103
- const transcript = tailMessages
104
- .map((message) => `[${message.role}] ${message.content}`)
105
- .join("\n");
106
- const summary = options.summarize
107
- ? await options.summarize(transcript, buildSummaryInstruction(options.friendId, options.channel, options.trustLevel ?? "family"))
108
- : transcript;
109
- return {
110
- kind: "ok",
111
- transcript,
112
- summary,
113
- snapshot: buildSnapshot(summary, tailMessages),
114
- tailMessages,
115
- };
116
- }
@@ -1,84 +0,0 @@
1
- "use strict";
2
- // Channel capabilities -- hardcoded const map keyed by channel identifier.
3
- // Pure lookup, no I/O, cannot fail. Unknown channel gets minimal defaults.
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.getChannelCapabilities = getChannelCapabilities;
6
- exports.isRemoteChannel = isRemoteChannel;
7
- exports.getAlwaysOnSenseNames = getAlwaysOnSenseNames;
8
- const runtime_1 = require("../../nerves/runtime");
9
- const CHANNEL_CAPABILITIES = {
10
- cli: {
11
- channel: "cli",
12
- senseType: "local",
13
- availableIntegrations: [],
14
- supportsMarkdown: false,
15
- supportsStreaming: true,
16
- supportsRichCards: false,
17
- maxMessageLength: Infinity,
18
- },
19
- teams: {
20
- channel: "teams",
21
- senseType: "closed",
22
- availableIntegrations: ["ado", "graph", "github"],
23
- supportsMarkdown: true,
24
- supportsStreaming: true,
25
- supportsRichCards: true,
26
- maxMessageLength: Infinity,
27
- },
28
- bluebubbles: {
29
- channel: "bluebubbles",
30
- senseType: "open",
31
- availableIntegrations: [],
32
- supportsMarkdown: false,
33
- supportsStreaming: false,
34
- supportsRichCards: false,
35
- maxMessageLength: Infinity,
36
- },
37
- inner: {
38
- channel: "inner",
39
- senseType: "internal",
40
- availableIntegrations: [],
41
- supportsMarkdown: false,
42
- supportsStreaming: true,
43
- supportsRichCards: false,
44
- maxMessageLength: Infinity,
45
- },
46
- };
47
- const DEFAULT_CAPABILITIES = {
48
- channel: "cli",
49
- senseType: "local",
50
- availableIntegrations: [],
51
- supportsMarkdown: false,
52
- supportsStreaming: false,
53
- supportsRichCards: false,
54
- maxMessageLength: Infinity,
55
- };
56
- function getChannelCapabilities(channel) {
57
- (0, runtime_1.emitNervesEvent)({
58
- component: "channels",
59
- event: "channel.capabilities_lookup",
60
- message: "channel capabilities lookup",
61
- meta: { channel },
62
- });
63
- return CHANNEL_CAPABILITIES[channel] ?? DEFAULT_CAPABILITIES;
64
- }
65
- /** Whether the channel is remote (open or closed) vs local/internal. */
66
- function isRemoteChannel(capabilities) {
67
- const senseType = capabilities?.senseType;
68
- return senseType !== undefined && senseType !== "local" && senseType !== "internal";
69
- }
70
- /**
71
- * Returns channel names whose senseType is "open" or "closed" -- i.e. channels
72
- * that are always-on (daemon-managed) rather than interactive or internal.
73
- */
74
- function getAlwaysOnSenseNames() {
75
- (0, runtime_1.emitNervesEvent)({
76
- component: "channels",
77
- event: "channel.always_on_lookup",
78
- message: "always-on sense names lookup",
79
- meta: {},
80
- });
81
- return Object.entries(CHANNEL_CAPABILITIES)
82
- .filter(([, cap]) => cap.senseType === "open" || cap.senseType === "closed")
83
- .map(([channel]) => channel);
84
- }
@@ -1,144 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.upsertGroupContextParticipants = upsertGroupContextParticipants;
4
- const node_crypto_1 = require("node:crypto");
5
- const runtime_1 = require("../../nerves/runtime");
6
- const CURRENT_SCHEMA_VERSION = 1;
7
- function normalizeDisplayName(externalId, displayName) {
8
- const trimmed = displayName?.trim();
9
- return trimmed && trimmed.length > 0 ? trimmed : externalId;
10
- }
11
- function buildNameNotes(name, now) {
12
- return name !== "Unknown"
13
- ? { name: { value: name, savedAt: now } }
14
- : {};
15
- }
16
- function dedupeParticipants(participants) {
17
- const deduped = new Map();
18
- for (const participant of participants) {
19
- const externalId = participant.externalId.trim();
20
- if (!externalId)
21
- continue;
22
- const key = `${participant.provider}:${externalId}`;
23
- if (!deduped.has(key)) {
24
- deduped.set(key, {
25
- ...participant,
26
- externalId,
27
- displayName: participant.displayName?.trim() || undefined,
28
- });
29
- }
30
- }
31
- return Array.from(deduped.values());
32
- }
33
- function createGroupExternalId(provider, groupExternalId, linkedAt) {
34
- return {
35
- provider,
36
- externalId: groupExternalId,
37
- linkedAt,
38
- };
39
- }
40
- function shouldPromoteToAcquaintance(friend) {
41
- return (friend.trustLevel ?? "stranger") === "stranger";
42
- }
43
- function createAcquaintanceRecord(participant, groupExternalId, linkedAt) {
44
- const name = normalizeDisplayName(participant.externalId, participant.displayName);
45
- return {
46
- id: (0, node_crypto_1.randomUUID)(),
47
- name,
48
- role: "acquaintance",
49
- trustLevel: "acquaintance",
50
- connections: [],
51
- externalIds: [
52
- {
53
- provider: participant.provider,
54
- externalId: participant.externalId,
55
- linkedAt,
56
- },
57
- createGroupExternalId(participant.provider, groupExternalId, linkedAt),
58
- ],
59
- tenantMemberships: [],
60
- toolPreferences: {},
61
- notes: buildNameNotes(name, linkedAt),
62
- totalTokens: 0,
63
- createdAt: linkedAt,
64
- updatedAt: linkedAt,
65
- schemaVersion: CURRENT_SCHEMA_VERSION,
66
- };
67
- }
68
- async function upsertGroupContextParticipants(input) {
69
- (0, runtime_1.emitNervesEvent)({
70
- component: "friends",
71
- event: "friends.group_context_upsert_start",
72
- message: "upserting shared-group participant context",
73
- meta: {
74
- participantCount: input.participants.length,
75
- hasGroupExternalId: input.groupExternalId.trim().length > 0,
76
- },
77
- });
78
- const groupExternalId = input.groupExternalId.trim();
79
- if (!groupExternalId) {
80
- return [];
81
- }
82
- const now = input.now ?? (() => new Date().toISOString());
83
- const participants = dedupeParticipants(input.participants);
84
- const results = [];
85
- for (const participant of participants) {
86
- const linkedAt = now();
87
- const existing = await input.store.findByExternalId(participant.provider, participant.externalId);
88
- if (!existing) {
89
- const created = createAcquaintanceRecord(participant, groupExternalId, linkedAt);
90
- await input.store.put(created.id, created);
91
- results.push({
92
- friendId: created.id,
93
- name: created.name,
94
- trustLevel: "acquaintance",
95
- created: true,
96
- updated: false,
97
- addedGroupExternalId: true,
98
- });
99
- continue;
100
- }
101
- const hasGroupExternalId = existing.externalIds.some((externalId) => externalId.externalId === groupExternalId);
102
- const promoteToAcquaintance = shouldPromoteToAcquaintance(existing);
103
- const trustLevel = promoteToAcquaintance
104
- ? "acquaintance"
105
- : existing.trustLevel;
106
- const role = promoteToAcquaintance
107
- ? "acquaintance"
108
- : existing.role;
109
- const updatedExternalIds = hasGroupExternalId
110
- ? existing.externalIds
111
- : [...existing.externalIds, createGroupExternalId(participant.provider, groupExternalId, linkedAt)];
112
- const updated = promoteToAcquaintance || !hasGroupExternalId;
113
- const record = updated
114
- ? {
115
- ...existing,
116
- role,
117
- trustLevel,
118
- externalIds: updatedExternalIds,
119
- updatedAt: linkedAt,
120
- }
121
- : existing;
122
- if (updated) {
123
- await input.store.put(record.id, record);
124
- }
125
- results.push({
126
- friendId: record.id,
127
- name: record.name,
128
- trustLevel,
129
- created: false,
130
- updated,
131
- addedGroupExternalId: !hasGroupExternalId,
132
- });
133
- }
134
- (0, runtime_1.emitNervesEvent)({
135
- component: "friends",
136
- event: "friends.group_context_upsert_end",
137
- message: "upserted shared-group participant context",
138
- meta: {
139
- participantCount: participants.length,
140
- updatedCount: results.filter((result) => result.created || result.updated).length,
141
- },
142
- });
143
- return results;
144
- }
@@ -1,84 +0,0 @@
1
- "use strict";
2
- // FriendResolver -- resolves external identity into a FriendRecord + channel capabilities.
3
- // Created per-request (per-incoming-message), per-friend.
4
- // Replaces the old ContextResolver: no authority checker, no separate memory resolution.
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.FriendResolver = void 0;
7
- const crypto_1 = require("crypto");
8
- const channel_1 = require("./channel");
9
- const runtime_1 = require("../../nerves/runtime");
10
- const CURRENT_SCHEMA_VERSION = 1;
11
- class FriendResolver {
12
- store;
13
- params;
14
- constructor(store, params) {
15
- this.store = store;
16
- this.params = params;
17
- }
18
- async resolve() {
19
- const friend = await this.resolveOrCreate();
20
- const channel = (0, channel_1.getChannelCapabilities)(this.params.channel);
21
- return { friend, channel };
22
- }
23
- async resolveOrCreate() {
24
- // Try to find existing friend by external ID
25
- let existing = null;
26
- try {
27
- existing = await this.store.findByExternalId(this.params.provider, this.params.externalId, this.params.tenantId);
28
- }
29
- catch {
30
- // Store search failure -- fall through to create new (D16)
31
- }
32
- if (existing)
33
- return existing;
34
- // First encounter -- create new FriendRecord
35
- const now = new Date().toISOString();
36
- const externalId = {
37
- provider: this.params.provider,
38
- externalId: this.params.externalId,
39
- linkedAt: now,
40
- ...(this.params.tenantId !== undefined ? { tenantId: this.params.tenantId } : {}),
41
- };
42
- const tenantMemberships = this.params.tenantId ? [this.params.tenantId] : [];
43
- let hasAnyFriends = false;
44
- try {
45
- if (typeof this.store.hasAnyFriends === "function") {
46
- hasAnyFriends = await this.store.hasAnyFriends();
47
- }
48
- }
49
- catch {
50
- hasAnyFriends = false;
51
- }
52
- const isFirstImprint = !hasAnyFriends;
53
- const friend = {
54
- id: (0, crypto_1.randomUUID)(),
55
- name: this.params.displayName,
56
- role: isFirstImprint ? "primary" : "stranger",
57
- trustLevel: isFirstImprint ? "family" : "stranger",
58
- connections: [],
59
- externalIds: [externalId],
60
- tenantMemberships,
61
- toolPreferences: {},
62
- notes: this.params.displayName !== "Unknown" ? { name: { value: this.params.displayName, savedAt: now } } : {},
63
- totalTokens: 0,
64
- createdAt: now,
65
- updatedAt: now,
66
- schemaVersion: CURRENT_SCHEMA_VERSION,
67
- };
68
- // Persist -- log and continue on failure (D16)
69
- try {
70
- await this.store.put(friend.id, friend);
71
- }
72
- catch (err) {
73
- (0, runtime_1.emitNervesEvent)({
74
- level: "error",
75
- event: "friends.persist_error",
76
- component: "friends",
77
- message: "failed to persist friend record",
78
- meta: { reason: err instanceof Error ? err.message : String(err) },
79
- });
80
- }
81
- return friend;
82
- }
83
- }
84
- exports.FriendResolver = FriendResolver;