@ouro.bot/cli 0.1.0-alpha.7 → 0.1.0-alpha.700
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.
- package/README.md +235 -183
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/SerpentGuide.ouro/agent.json +83 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/ouroboros.png +0 -0
- package/changelog.json +4827 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +928 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +348 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +1002 -0
- package/dist/heart/agent-entry.js +190 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +479 -0
- package/dist/heart/autonomy-budget.js +434 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +378 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +478 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +135 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +172 -135
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1480 -262
- package/dist/heart/cross-chat-delivery.js +132 -0
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +263 -0
- package/dist/heart/daemon/agent-service.js +523 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +780 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8142 -0
- package/dist/heart/daemon/cli-help.js +675 -0
- package/dist/heart/daemon/cli-parse.js +2461 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +770 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +30 -784
- package/dist/heart/daemon/daemon-entry.js +874 -13
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +1412 -26
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1126 -0
- package/dist/heart/daemon/habit-private-wake.js +56 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +188 -0
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/message-router.js +60 -11
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +525 -33
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +39 -0
- package/dist/heart/daemon/runtime-logging.js +86 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +26 -39
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +929 -0
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +361 -0
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +338 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +591 -0
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +59 -0
- package/dist/heart/external-events/router.js +121 -0
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +214 -0
- package/dist/heart/habits/habit-runtime-state.js +114 -0
- package/dist/heart/habits/habit-scheduler.js +431 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +617 -0
- package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
- package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -137
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +318 -0
- package/dist/heart/identity.js +287 -67
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +37 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/orientation-frame.js +217 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +156 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +218 -0
- package/dist/heart/private-runtime/policy.js +214 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +441 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +202 -50
- package/dist/heart/providers/azure.js +104 -13
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +29 -7
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +63 -39
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +398 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +77 -0
- package/dist/heart/session-activity.js +235 -0
- package/dist/heart/session-events.js +1133 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +365 -0
- package/dist/heart/streaming.js +129 -34
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +472 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +116 -0
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +715 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +334 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +93 -1
- package/dist/mind/context.js +259 -94
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +90 -98
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/{associative-recall.js → note-search.js} +61 -60
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +77 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-budget.js +380 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1279 -139
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +234 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +152 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +17 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1042 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +322 -0
- package/dist/repertoire/coding/index.js +18 -3
- package/dist/repertoire/coding/manager.js +228 -14
- package/dist/repertoire/coding/spawner.js +61 -14
- package/dist/repertoire/coding/tools.js +279 -12
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/data/ado-endpoints.json +188 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +408 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +434 -0
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +45 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +68 -707
- package/dist/repertoire/tools-bluebubbles.js +95 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-mail.js +1975 -0
- package/dist/repertoire/tools-notes.js +459 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +881 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +355 -0
- package/dist/repertoire/tools-teams.js +67 -61
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +313 -102
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +704 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +431 -0
- package/dist/rsvp/diagnostics.js +222 -0
- package/dist/rsvp/diff-renderer.js +161 -0
- package/dist/rsvp/habit-policy.js +85 -0
- package/dist/rsvp/habit-stage.js +93 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/outbound-state.js +254 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/bluebubbles/client.js +691 -0
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/bluebubbles/inbound-log.js +126 -0
- package/dist/senses/bluebubbles/index.js +2937 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/outbound-state.js +304 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/bluebubbles/runtime-state.js +137 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +240 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +780 -269
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +245 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +395 -0
- package/dist/senses/pipeline.js +1052 -0
- package/dist/senses/private-runtime-worker.js +723 -0
- package/dist/senses/private-runtime.js +1157 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +416 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +928 -199
- package/dist/senses/trust-gate.js +207 -2
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5081 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/package.json +67 -11
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/specialist-orchestrator.js +0 -160
- package/dist/heart/daemon/specialist-prompt.js +0 -40
- package/dist/heart/daemon/specialist-session.js +0 -142
- package/dist/heart/daemon/specialist-tools.js +0 -128
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/friends/channel.js +0 -49
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -171
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/types.js +0 -21
- package/dist/repertoire/tasks/board.js +0 -122
- package/dist/repertoire/tasks/index.js +0 -210
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -145
- package/dist/senses/bluebubbles-client.js +0 -279
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -332
- package/dist/senses/inner-dialog-worker.js +0 -61
- package/dist/senses/inner-dialog.js +0 -231
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
package/dist/mind/context.js
CHANGED
|
@@ -33,34 +33,44 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.validateSessionMessages = exports.repairSessionMessages = exports.migrateToolNames = exports.detectDuplicateToolCallIds = void 0;
|
|
36
37
|
exports.trimMessages = trimMessages;
|
|
37
|
-
exports.validateSessionMessages = validateSessionMessages;
|
|
38
|
-
exports.repairSessionMessages = repairSessionMessages;
|
|
39
38
|
exports.saveSession = saveSession;
|
|
39
|
+
exports.appendSyntheticAssistantMessage = appendSyntheticAssistantMessage;
|
|
40
40
|
exports.loadSession = loadSession;
|
|
41
41
|
exports.postTurn = postTurn;
|
|
42
|
+
exports.postTurnTrim = postTurnTrim;
|
|
43
|
+
exports.postTurnPersist = postTurnPersist;
|
|
44
|
+
exports.deferPostTurnPersist = deferPostTurnPersist;
|
|
42
45
|
exports.deleteSession = deleteSession;
|
|
43
46
|
const config_1 = require("../heart/config");
|
|
47
|
+
const session_events_1 = require("../heart/session-events");
|
|
44
48
|
const runtime_1 = require("../nerves/runtime");
|
|
45
49
|
const fs = __importStar(require("fs"));
|
|
46
50
|
const path = __importStar(require("path"));
|
|
47
51
|
const token_estimate_1 = require("./token-estimate");
|
|
52
|
+
var session_events_2 = require("../heart/session-events");
|
|
53
|
+
Object.defineProperty(exports, "detectDuplicateToolCallIds", { enumerable: true, get: function () { return session_events_2.detectDuplicateToolCallIds; } });
|
|
54
|
+
Object.defineProperty(exports, "migrateToolNames", { enumerable: true, get: function () { return session_events_2.migrateToolNames; } });
|
|
55
|
+
Object.defineProperty(exports, "repairSessionMessages", { enumerable: true, get: function () { return session_events_2.repairSessionMessages; } });
|
|
56
|
+
Object.defineProperty(exports, "validateSessionMessages", { enumerable: true, get: function () { return session_events_2.validateSessionMessages; } });
|
|
57
|
+
const IDLE_REST_ONLY_KEEP_TURNS = 20;
|
|
48
58
|
function buildTrimmableBlocks(messages) {
|
|
49
59
|
const blocks = [];
|
|
50
60
|
let i = 0;
|
|
51
61
|
while (i < messages.length) {
|
|
52
62
|
const msg = messages[i];
|
|
53
|
-
if (msg
|
|
63
|
+
if (msg.role === "system") {
|
|
54
64
|
i++;
|
|
55
65
|
continue;
|
|
56
66
|
}
|
|
57
67
|
// Tool coherence block: assistant message with tool_calls + immediately following tool results
|
|
58
|
-
if (msg
|
|
68
|
+
if (msg.role === "assistant" && Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0) {
|
|
59
69
|
const indices = [i];
|
|
60
70
|
i++;
|
|
61
71
|
while (i < messages.length) {
|
|
62
72
|
const next = messages[i];
|
|
63
|
-
if (next
|
|
73
|
+
if (next.role !== "tool")
|
|
64
74
|
break;
|
|
65
75
|
indices.push(i);
|
|
66
76
|
i++;
|
|
@@ -78,13 +88,96 @@ function buildTrimmableBlocks(messages) {
|
|
|
78
88
|
function getSystemMessageIndices(messages) {
|
|
79
89
|
const indices = [];
|
|
80
90
|
for (let i = 0; i < messages.length; i++) {
|
|
81
|
-
if (messages[i]
|
|
91
|
+
if (messages[i].role === "system")
|
|
82
92
|
indices.push(i);
|
|
83
93
|
}
|
|
84
94
|
return indices;
|
|
85
95
|
}
|
|
86
96
|
function buildTrimmedMessages(messages, kept) {
|
|
87
|
-
return messages.filter((m, idx) => m
|
|
97
|
+
return messages.filter((m, idx) => m.role === "system" || kept.has(idx));
|
|
98
|
+
}
|
|
99
|
+
function messageContentToText(content) {
|
|
100
|
+
if (typeof content === "string")
|
|
101
|
+
return content;
|
|
102
|
+
if (!Array.isArray(content))
|
|
103
|
+
return "";
|
|
104
|
+
return content
|
|
105
|
+
.map((part) => {
|
|
106
|
+
if (part && typeof part === "object" && "text" in part && typeof part.text === "string") {
|
|
107
|
+
return part.text;
|
|
108
|
+
}
|
|
109
|
+
return "";
|
|
110
|
+
})
|
|
111
|
+
.join("\n");
|
|
112
|
+
}
|
|
113
|
+
function toolCallName(toolCall) {
|
|
114
|
+
return toolCall.function.name;
|
|
115
|
+
}
|
|
116
|
+
function toolCallId(toolCall) {
|
|
117
|
+
return toolCall.id;
|
|
118
|
+
}
|
|
119
|
+
function isIdleHeartbeatRestUserMessage(message) {
|
|
120
|
+
if (message.role !== "user")
|
|
121
|
+
return false;
|
|
122
|
+
const text = messageContentToText(message.content);
|
|
123
|
+
return text.includes("...time passing. anything stirring?")
|
|
124
|
+
&& !text.includes("[pending from ")
|
|
125
|
+
&& !text.includes("## task:");
|
|
126
|
+
}
|
|
127
|
+
function isEmptyRestOnlyAssistantMessage(message) {
|
|
128
|
+
if (message.role !== "assistant")
|
|
129
|
+
return null;
|
|
130
|
+
if (messageContentToText(message.content).trim())
|
|
131
|
+
return null;
|
|
132
|
+
if (!Array.isArray(message.tool_calls) || message.tool_calls.length !== 1)
|
|
133
|
+
return null;
|
|
134
|
+
const onlyToolCall = message.tool_calls[0];
|
|
135
|
+
if (toolCallName(onlyToolCall) !== "rest")
|
|
136
|
+
return null;
|
|
137
|
+
return toolCallId(onlyToolCall);
|
|
138
|
+
}
|
|
139
|
+
function isMatchingToolResult(message, toolId) {
|
|
140
|
+
return message.tool_call_id === toolId;
|
|
141
|
+
}
|
|
142
|
+
function compactIdleRestOnlyTurns(messages, keepTurns = IDLE_REST_ONLY_KEEP_TURNS) {
|
|
143
|
+
const blocks = [];
|
|
144
|
+
let i = 0;
|
|
145
|
+
while (i < messages.length - 2) {
|
|
146
|
+
const userMessage = messages[i];
|
|
147
|
+
const assistantMessage = messages[i + 1];
|
|
148
|
+
const toolMessage = messages[i + 2];
|
|
149
|
+
const restToolId = isIdleHeartbeatRestUserMessage(userMessage)
|
|
150
|
+
? isEmptyRestOnlyAssistantMessage(assistantMessage)
|
|
151
|
+
: null;
|
|
152
|
+
if (restToolId && isMatchingToolResult(toolMessage, restToolId)) {
|
|
153
|
+
blocks.push({ start: i, end: i + 2 });
|
|
154
|
+
i += 3;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
i++;
|
|
158
|
+
}
|
|
159
|
+
if (blocks.length <= keepTurns)
|
|
160
|
+
return messages;
|
|
161
|
+
const drop = new Set();
|
|
162
|
+
for (const block of blocks.slice(0, blocks.length - keepTurns)) {
|
|
163
|
+
for (let index = block.start; index <= block.end; index++) {
|
|
164
|
+
drop.add(index);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const compacted = messages.filter((_message, index) => !drop.has(index));
|
|
168
|
+
(0, runtime_1.emitNervesEvent)({
|
|
169
|
+
component: "mind",
|
|
170
|
+
event: "mind.session_idle_rest_compaction",
|
|
171
|
+
message: "compacted old idle rest-only private-runtime turns",
|
|
172
|
+
meta: {
|
|
173
|
+
removedTurns: blocks.length - keepTurns,
|
|
174
|
+
keptTurns: keepTurns,
|
|
175
|
+
removedMessages: drop.size,
|
|
176
|
+
originalCount: messages.length,
|
|
177
|
+
finalCount: compacted.length,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
return compacted;
|
|
88
181
|
}
|
|
89
182
|
function trimMessages(messages, maxTokens, contextMargin, actualTokenCount) {
|
|
90
183
|
const targetTokens = Math.floor(maxTokens * (1 - contextMargin / 100));
|
|
@@ -132,7 +225,7 @@ function trimMessages(messages, maxTokens, contextMargin, actualTokenCount) {
|
|
|
132
225
|
let remaining = actualTokenCount;
|
|
133
226
|
const kept = new Set();
|
|
134
227
|
for (let i = 0; i < messages.length; i++) {
|
|
135
|
-
if (messages[i]
|
|
228
|
+
if (messages[i].role !== "system")
|
|
136
229
|
kept.add(i);
|
|
137
230
|
}
|
|
138
231
|
// Drop oldest blocks until we fall under target.
|
|
@@ -146,7 +239,7 @@ function trimMessages(messages, maxTokens, contextMargin, actualTokenCount) {
|
|
|
146
239
|
let trimmed = buildTrimmedMessages(messages, kept);
|
|
147
240
|
// If we're still above budget after dropping everything trimmable, preserve system only.
|
|
148
241
|
if (remaining > targetTokens) {
|
|
149
|
-
trimmed = messages.filter((m) => m
|
|
242
|
+
trimmed = messages.filter((m) => m.role === "system");
|
|
150
243
|
}
|
|
151
244
|
const estimatedAfter = (0, token_estimate_1.estimateTokensForMessages)(trimmed);
|
|
152
245
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -173,106 +266,95 @@ function trimMessages(messages, maxTokens, contextMargin, actualTokenCount) {
|
|
|
173
266
|
* user → assistant (with optional tool calls/results) → user → assistant...
|
|
174
267
|
* Never assistant → assistant without a user in between.
|
|
175
268
|
*/
|
|
176
|
-
function
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (msg.role === "system")
|
|
184
|
-
continue;
|
|
185
|
-
if (msg.role === "tool") {
|
|
186
|
-
sawToolResultSincePrevAssistant = true;
|
|
187
|
-
continue;
|
|
188
|
-
}
|
|
189
|
-
if (msg.role === "assistant" && prevNonToolRole === "assistant") {
|
|
190
|
-
// assistant → tool(s) → assistant is valid (tool call flow)
|
|
191
|
-
if (!(prevAssistantHadToolCalls && sawToolResultSincePrevAssistant)) {
|
|
192
|
-
violations.push(`back-to-back assistant at index ${i}`);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
prevAssistantHadToolCalls = msg.role === "assistant" && Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
|
|
196
|
-
sawToolResultSincePrevAssistant = false;
|
|
197
|
-
prevNonToolRole = msg.role;
|
|
198
|
-
}
|
|
199
|
-
return violations;
|
|
269
|
+
function denormalizeContinuityState(state) {
|
|
270
|
+
if (!state.mustResolveBeforeHandoff && typeof state.lastFriendActivityAt !== "string")
|
|
271
|
+
return undefined;
|
|
272
|
+
return {
|
|
273
|
+
...(state.mustResolveBeforeHandoff ? { mustResolveBeforeHandoff: true } : {}),
|
|
274
|
+
...(typeof state.lastFriendActivityAt === "string" ? { lastFriendActivityAt: state.lastFriendActivityAt } : {}),
|
|
275
|
+
};
|
|
200
276
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
component: "mind",
|
|
225
|
-
message: "repaired session invariant violations",
|
|
226
|
-
meta: { violations },
|
|
277
|
+
function writeSessionEnvelope(filePath, envelope) {
|
|
278
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
279
|
+
fs.writeFileSync(filePath, JSON.stringify(envelope, null, 2));
|
|
280
|
+
}
|
|
281
|
+
function saveSession(filePath, messages, lastUsage, state) {
|
|
282
|
+
const existing = (0, session_events_1.loadSessionEnvelopeFile)(filePath);
|
|
283
|
+
const previousMessages = existing ? (0, session_events_1.projectProviderMessages)(existing) : [];
|
|
284
|
+
const currentIngressTimes = messages.map(session_events_1.getIngressTime);
|
|
285
|
+
const sanitized = (0, session_events_1.sanitizeProviderMessages)(messages);
|
|
286
|
+
const { envelope } = (0, session_events_1.buildCanonicalSessionEnvelope)({
|
|
287
|
+
existing,
|
|
288
|
+
previousMessages,
|
|
289
|
+
currentMessages: sanitized,
|
|
290
|
+
trimmedMessages: sanitized,
|
|
291
|
+
currentIngressTimes,
|
|
292
|
+
recordedAt: new Date().toISOString(),
|
|
293
|
+
lastUsage: lastUsage ?? null,
|
|
294
|
+
state,
|
|
295
|
+
projectionBasis: {
|
|
296
|
+
maxTokens: null,
|
|
297
|
+
contextMargin: null,
|
|
298
|
+
inputTokens: lastUsage?.input_tokens ?? null,
|
|
299
|
+
},
|
|
227
300
|
});
|
|
228
|
-
|
|
301
|
+
writeSessionEnvelope(filePath, envelope);
|
|
229
302
|
}
|
|
230
|
-
function
|
|
231
|
-
|
|
232
|
-
|
|
303
|
+
function appendSyntheticAssistantMessage(filePath, content) {
|
|
304
|
+
try {
|
|
305
|
+
if (!fs.existsSync(filePath))
|
|
306
|
+
return false;
|
|
307
|
+
const envelope = (0, session_events_1.loadSessionEnvelopeFile)(filePath);
|
|
308
|
+
if (!envelope)
|
|
309
|
+
return false;
|
|
310
|
+
const updated = (0, session_events_1.appendSyntheticAssistantEvent)(envelope, content, new Date().toISOString());
|
|
311
|
+
writeSessionEnvelope(filePath, updated);
|
|
233
312
|
(0, runtime_1.emitNervesEvent)({
|
|
234
|
-
level: "warn",
|
|
235
|
-
event: "mind.session_invariant_violation",
|
|
236
313
|
component: "mind",
|
|
237
|
-
|
|
238
|
-
|
|
314
|
+
event: "mind.session_synthetic_message_appended",
|
|
315
|
+
message: "appended synthetic assistant message to session",
|
|
316
|
+
meta: { path: filePath, contentLength: content.length },
|
|
239
317
|
});
|
|
240
|
-
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return false;
|
|
241
322
|
}
|
|
242
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
243
|
-
const envelope = { version: 1, messages };
|
|
244
|
-
if (lastUsage)
|
|
245
|
-
envelope.lastUsage = lastUsage;
|
|
246
|
-
fs.writeFileSync(filePath, JSON.stringify(envelope, null, 2));
|
|
247
323
|
}
|
|
248
324
|
function loadSession(filePath) {
|
|
249
325
|
try {
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
if (data.version !== 1)
|
|
326
|
+
const envelope = (0, session_events_1.loadSessionEnvelopeFile)(filePath);
|
|
327
|
+
if (!envelope)
|
|
253
328
|
return null;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
message: "session invariant violated on load",
|
|
262
|
-
meta: { path: filePath, violations },
|
|
263
|
-
});
|
|
264
|
-
messages = repairSessionMessages(messages);
|
|
265
|
-
}
|
|
266
|
-
return { messages, lastUsage: data.lastUsage };
|
|
329
|
+
return {
|
|
330
|
+
messages: (0, session_events_1.sanitizeProviderMessages)((0, session_events_1.projectProviderMessages)(envelope)),
|
|
331
|
+
events: envelope.events,
|
|
332
|
+
structuredOutputs: envelope.structuredOutputs ?? [],
|
|
333
|
+
lastUsage: envelope.lastUsage ?? undefined,
|
|
334
|
+
state: denormalizeContinuityState(envelope.state),
|
|
335
|
+
};
|
|
267
336
|
}
|
|
268
337
|
catch {
|
|
269
338
|
return null;
|
|
270
339
|
}
|
|
271
340
|
}
|
|
272
|
-
|
|
341
|
+
/**
|
|
342
|
+
* Synchronous post-turn: sanitize, trim (mutates messages in place), and persist to disk.
|
|
343
|
+
* For non-blocking persist, use postTurnTrim() + deferPostTurnPersist() instead.
|
|
344
|
+
*/
|
|
345
|
+
function postTurn(messages, sessPath, usage, hooks, state) {
|
|
346
|
+
const prepared = postTurnTrim(messages, usage, hooks);
|
|
347
|
+
postTurnPersist(sessPath, prepared, usage, state);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Synchronous phase: run hooks, sanitize, trim, and mutate the messages array in place.
|
|
351
|
+
* Returns the data needed by postTurnPersist / deferPostTurnPersist.
|
|
352
|
+
*/
|
|
353
|
+
function postTurnTrim(messages, usage, hooks) {
|
|
354
|
+
const preTrimMessages = [...messages];
|
|
273
355
|
if (hooks?.beforeTrim) {
|
|
274
356
|
try {
|
|
275
|
-
hooks.beforeTrim(
|
|
357
|
+
hooks.beforeTrim(preTrimMessages);
|
|
276
358
|
}
|
|
277
359
|
catch (error) {
|
|
278
360
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -287,9 +369,92 @@ function postTurn(messages, sessPath, usage, hooks) {
|
|
|
287
369
|
}
|
|
288
370
|
}
|
|
289
371
|
const { maxTokens, contextMargin } = (0, config_1.getContextConfig)();
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
372
|
+
const currentMessages = (0, session_events_1.sanitizeProviderMessages)(messages);
|
|
373
|
+
const currentIngressTimes = currentMessages.map(session_events_1.getIngressTime);
|
|
374
|
+
const tokenTrimmedMessages = trimMessages(currentMessages, maxTokens, contextMargin, usage?.input_tokens);
|
|
375
|
+
const trimmedMessages = compactIdleRestOnlyTurns(tokenTrimmedMessages);
|
|
376
|
+
messages.splice(0, messages.length, ...trimmedMessages);
|
|
377
|
+
return { currentMessages, trimmedMessages, currentIngressTimes, maxTokens, contextMargin };
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Synchronous persist: load existing envelope, build canonical envelope, write to disk.
|
|
381
|
+
*/
|
|
382
|
+
function postTurnPersist(sessPath, prepared, usage, state) {
|
|
383
|
+
const existing = (0, session_events_1.loadSessionEnvelopeFile)(sessPath);
|
|
384
|
+
const previousMessages = existing ? (0, session_events_1.projectProviderMessages)(existing) : [];
|
|
385
|
+
const { envelope } = (0, session_events_1.buildCanonicalSessionEnvelope)({
|
|
386
|
+
existing,
|
|
387
|
+
previousMessages,
|
|
388
|
+
currentMessages: prepared.currentMessages,
|
|
389
|
+
trimmedMessages: prepared.trimmedMessages,
|
|
390
|
+
currentIngressTimes: prepared.currentIngressTimes,
|
|
391
|
+
recordedAt: new Date().toISOString(),
|
|
392
|
+
lastUsage: usage ?? null,
|
|
393
|
+
state,
|
|
394
|
+
projectionBasis: {
|
|
395
|
+
maxTokens: prepared.maxTokens,
|
|
396
|
+
contextMargin: prepared.contextMargin,
|
|
397
|
+
inputTokens: usage?.input_tokens ?? null,
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
writeSessionEnvelope(sessPath, envelope);
|
|
401
|
+
return envelope.events;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Per-sessPath serialization queue. Without this, two concurrent
|
|
405
|
+
* `deferPostTurnPersist` calls (e.g. two BlueBubbles webhooks for the same
|
|
406
|
+
* chat firing back-to-back, or a CLI postTurn racing the private-runtime turn
|
|
407
|
+
* for the same MCP session) would each load the envelope, both compute the
|
|
408
|
+
* same "next sequence", and write events with colliding ids. The session
|
|
409
|
+
* file would silently accumulate duplicates and replay would diverge from
|
|
410
|
+
* what was actually sent on the wire.
|
|
411
|
+
*
|
|
412
|
+
* The queue is in-process only — it does not protect against multiple Node
|
|
413
|
+
* processes writing to the same file. The dedup-on-load behaviour in
|
|
414
|
+
* parseSessionEnvelope keeps cross-process races from leaving permanent
|
|
415
|
+
* corruption; this serializer just keeps the common (single-process) case
|
|
416
|
+
* race-free in the first place.
|
|
417
|
+
*/
|
|
418
|
+
const sessionPersistQueues = new Map();
|
|
419
|
+
function enqueueSessionPersist(sessPath, fn) {
|
|
420
|
+
const previous = sessionPersistQueues.get(sessPath) ?? Promise.resolve();
|
|
421
|
+
// Chain on the previous tail. fn runs whether previous resolved or rejected,
|
|
422
|
+
// so one failed turn cannot block subsequent turns on the same session.
|
|
423
|
+
const next = previous.then(fn, fn);
|
|
424
|
+
// Save a swallowed-rejection sentinel as the new tail so the next caller's
|
|
425
|
+
// `previous.then(fn, fn)` sees a clean resolution; the original `next` still
|
|
426
|
+
// propagates rejection to its own caller as expected.
|
|
427
|
+
/* v8 ignore start -- the swallow only matters when fn rejects, which is the failure path covered separately */
|
|
428
|
+
const sentinel = next.then(() => undefined, () => undefined);
|
|
429
|
+
/* v8 ignore stop */
|
|
430
|
+
sessionPersistQueues.set(sessPath, sentinel);
|
|
431
|
+
return next;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Deferred persist: same as postTurnPersist but runs on the next event loop
|
|
435
|
+
* tick AND serializes against any other deferred persist for the same
|
|
436
|
+
* sessPath, so concurrent turns cannot race and produce duplicate event ids
|
|
437
|
+
* in the saved session.
|
|
438
|
+
*/
|
|
439
|
+
function deferPostTurnPersist(sessPath, prepared, usage, state) {
|
|
440
|
+
return enqueueSessionPersist(sessPath, () => new Promise((resolve) => {
|
|
441
|
+
setImmediate(() => {
|
|
442
|
+
try {
|
|
443
|
+
const events = postTurnPersist(sessPath, prepared, usage, state);
|
|
444
|
+
resolve(events);
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
(0, runtime_1.emitNervesEvent)({
|
|
448
|
+
level: "warn",
|
|
449
|
+
component: "mind",
|
|
450
|
+
event: "mind.deferred_persist_error",
|
|
451
|
+
message: "deferred session persist failed",
|
|
452
|
+
meta: { error: err instanceof Error ? err.message : String(err) },
|
|
453
|
+
});
|
|
454
|
+
resolve([]);
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
}));
|
|
293
458
|
}
|
|
294
459
|
function deleteSession(filePath) {
|
|
295
460
|
try {
|