@ouro.bot/cli 0.1.0-alpha.66 → 0.1.0-alpha.661
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 +127 -23
- 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/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/changelog.json +4216 -13
- package/dist/a2a/card.js +56 -0
- package/dist/a2a/client.js +143 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/onboarding.js +111 -0
- package/dist/a2a/server.js +498 -0
- package/dist/a2a/task-store.js +69 -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 +487 -0
- package/dist/arc/flight-recorder.js +369 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +292 -0
- package/dist/arc/packets.js +288 -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 +860 -43
- package/dist/heart/agent-entry.js +69 -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/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 +377 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- 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 +118 -119
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/core.js +1123 -247
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +523 -0
- package/dist/heart/daemon/agentic-repair.js +547 -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 +70 -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 +7767 -0
- package/dist/heart/daemon/cli-help.js +558 -0
- package/dist/heart/daemon/cli-parse.js +1688 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -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 +29 -1750
- package/dist/heart/daemon/daemon-entry.js +485 -2
- 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 +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +937 -74
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +873 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
- 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 +37 -8
- package/dist/heart/daemon/log-tailer.js +79 -10
- 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 +6 -2
- 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 +14 -12
- 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 +511 -40
- 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 +475 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +35 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +564 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -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 +229 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +203 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +40 -56
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +45 -18
- package/dist/heart/identity.js +174 -57
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- 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 +67 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +250 -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 +32 -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 +418 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +324 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +728 -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 +19 -0
- package/dist/heart/orientation-frame.js +217 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +272 -0
- package/dist/heart/provider-credentials.js +425 -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 +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +23 -11
- 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 +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +17 -4
- package/dist/heart/session-activity.js +48 -24
- 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 +351 -0
- package/dist/heart/streaming.js +44 -27
- 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 +9 -5
- 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 +430 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/work-card.js +386 -0
- package/dist/mailbox-ui/assets/index-B-V9vRQ0.js +61 -0
- package/dist/mailbox-ui/assets/index-BOZbGbkL.css +1 -0
- package/dist/mailbox-ui/index.html +15 -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 +21 -2
- package/dist/mind/context.js +250 -101
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +48 -0
- package/dist/mind/friends/resolver.js +107 -4
- package/dist/mind/friends/store-file.js +61 -4
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +6 -1
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1015 -140
- 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/nerves/cli-logging.js +7 -1
- 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/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -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 +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1041 -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 +197 -30
- package/dist/repertoire/coding/manager.js +166 -10
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +219 -7
- 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/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 +159 -25
- 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 +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +283 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +63 -1082
- package/dist/repertoire/tools-bluebubbles.js +2 -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 +418 -0
- package/dist/repertoire/tools-obligations.js +143 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +469 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +766 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +344 -0
- package/dist/repertoire/tools-teams.js +12 -39
- 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 +243 -79
- 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/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +78 -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 → bluebubbles/client.js} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2737 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles-meta-guard.js +40 -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 +100 -0
- package/dist/senses/cli.js +517 -204
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +122 -0
- package/dist/senses/inner-dialog-worker.js +303 -22
- package/dist/senses/inner-dialog.js +525 -41
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +857 -180
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +419 -0
- package/dist/senses/surface-tool.js +108 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +390 -98
- package/dist/senses/trust-gate.js +100 -5
- 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 +5079 -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 +55 -12
- 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/dist/heart/daemon/auth-flow.js +0 -351
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- 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 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -7
- /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/monty.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/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -1,13 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// FriendResolver -- resolves external identity into a FriendRecord + channel capabilities.
|
|
3
3
|
// Created per-request (per-incoming-message), per-friend.
|
|
4
|
-
// Replaces the old ContextResolver: no authority checker, no separate
|
|
4
|
+
// Replaces the old ContextResolver: no authority checker, no separate note resolution.
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.FriendResolver = void 0;
|
|
7
|
+
exports._setMachineOwnerUsernameForTest = _setMachineOwnerUsernameForTest;
|
|
8
|
+
exports.machineOwnerUsername = machineOwnerUsername;
|
|
9
|
+
exports.isLocalMachineOwnerIdentity = isLocalMachineOwnerIdentity;
|
|
7
10
|
const crypto_1 = require("crypto");
|
|
11
|
+
const os_1 = require("os");
|
|
8
12
|
const channel_1 = require("./channel");
|
|
9
13
|
const runtime_1 = require("../../nerves/runtime");
|
|
10
14
|
const CURRENT_SCHEMA_VERSION = 1;
|
|
15
|
+
// Test seam: when set (including to null), overrides OS detection of the
|
|
16
|
+
// machine-owner username so resolver tests are deterministic.
|
|
17
|
+
let machineOwnerOverride;
|
|
18
|
+
function _setMachineOwnerUsernameForTest(value) {
|
|
19
|
+
machineOwnerOverride = value;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The OS username that owns this daemon process, or null if undetectable. The
|
|
23
|
+
* person running the daemon owns this agent + its bundle, so the local friend
|
|
24
|
+
* that names them is the machine owner (family), not a stranger.
|
|
25
|
+
*/
|
|
26
|
+
function machineOwnerUsername() {
|
|
27
|
+
if (machineOwnerOverride !== undefined)
|
|
28
|
+
return machineOwnerOverride;
|
|
29
|
+
try {
|
|
30
|
+
return (0, os_1.userInfo)().username;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* v8 ignore next -- defensive: userInfo() only throws when the running user has no passwd entry @preserve */
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* True when (provider, externalId) names the local machine owner — the OS user
|
|
39
|
+
* running the daemon. Matches the bare username or a `user@host` external id.
|
|
40
|
+
*/
|
|
41
|
+
function isLocalMachineOwnerIdentity(provider, externalId, ownerUsername) {
|
|
42
|
+
if (provider !== "local" || !ownerUsername)
|
|
43
|
+
return false;
|
|
44
|
+
return externalId === ownerUsername || externalId.startsWith(`${ownerUsername}@`);
|
|
45
|
+
}
|
|
11
46
|
class FriendResolver {
|
|
12
47
|
store;
|
|
13
48
|
params;
|
|
@@ -31,6 +66,43 @@ class FriendResolver {
|
|
|
31
66
|
}
|
|
32
67
|
if (existing)
|
|
33
68
|
return existing;
|
|
69
|
+
// Migration: local provider previously used "${username}@${hostname}" format.
|
|
70
|
+
// If no exact match, try finding a friend with old-format external ID.
|
|
71
|
+
/* v8 ignore start -- migration path: only fires when legacy hostname-format friend exists @preserve */
|
|
72
|
+
if (this.params.provider === "local" && !this.params.externalId.includes("@")) {
|
|
73
|
+
try {
|
|
74
|
+
const all = typeof this.store.listAll === "function" ? await this.store.listAll() : [];
|
|
75
|
+
/* v8 ignore start -- migration path: only fires when legacy hostname-format friend exists @preserve */
|
|
76
|
+
const migrationMatch = all.find((f) => f.externalIds.some((eid) => eid.provider === "local" && eid.externalId.startsWith(this.params.externalId + "@")));
|
|
77
|
+
if (migrationMatch) {
|
|
78
|
+
const now = new Date().toISOString();
|
|
79
|
+
migrationMatch.externalIds.push({
|
|
80
|
+
provider: this.params.provider,
|
|
81
|
+
externalId: this.params.externalId,
|
|
82
|
+
linkedAt: now,
|
|
83
|
+
});
|
|
84
|
+
migrationMatch.updatedAt = now;
|
|
85
|
+
try {
|
|
86
|
+
await this.store.put(migrationMatch.id, migrationMatch);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// best-effort persist
|
|
90
|
+
}
|
|
91
|
+
(0, runtime_1.emitNervesEvent)({
|
|
92
|
+
component: "friends",
|
|
93
|
+
event: "friends.local_id_migrated",
|
|
94
|
+
message: `migrated local friend identity from hostname format to username-only`,
|
|
95
|
+
meta: { friendId: migrationMatch.id, newExternalId: this.params.externalId },
|
|
96
|
+
});
|
|
97
|
+
return migrationMatch;
|
|
98
|
+
}
|
|
99
|
+
/* v8 ignore stop */
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// fall through to create new
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/* v8 ignore stop */
|
|
34
106
|
// First encounter -- create new FriendRecord
|
|
35
107
|
const now = new Date().toISOString();
|
|
36
108
|
const externalId = {
|
|
@@ -50,20 +122,51 @@ class FriendResolver {
|
|
|
50
122
|
hasAnyFriends = false;
|
|
51
123
|
}
|
|
52
124
|
const isFirstImprint = !hasAnyFriends;
|
|
125
|
+
const isA2AAgent = this.params.provider === "a2a-agent";
|
|
126
|
+
// The local friend that names the OS user running the daemon is the machine
|
|
127
|
+
// owner (family) — they own the agent + its bundle. Usually this friend already
|
|
128
|
+
// exists as a family/primary hatch imprint; this covers the un-imprinted boss
|
|
129
|
+
// path (e.g. a Workbench boss check-in on a bundle that skipped imprint).
|
|
130
|
+
const isLocalMachineOwner = isLocalMachineOwnerIdentity(this.params.provider, this.params.externalId, machineOwnerUsername());
|
|
131
|
+
// BlueBubbles group chats route through here as `imessage-handle` with an
|
|
132
|
+
// externalId of the form `group:any;+;<chatHash>`. When the harness auto-
|
|
133
|
+
// creates the group friend at stranger trust, we mark the record so that
|
|
134
|
+
// the trust gate can surface the relationship for explicit acknowledgment
|
|
135
|
+
// later instead of letting messages accumulate silently.
|
|
136
|
+
const isImessageGroup = this.params.provider === "imessage-handle" &&
|
|
137
|
+
typeof this.params.externalId === "string" &&
|
|
138
|
+
this.params.externalId.startsWith("group:");
|
|
139
|
+
const notes = {};
|
|
140
|
+
if (this.params.displayName !== "Unknown") {
|
|
141
|
+
notes.name = { value: this.params.displayName, savedAt: now };
|
|
142
|
+
}
|
|
143
|
+
if (isImessageGroup && !isFirstImprint) {
|
|
144
|
+
notes.autoCreatedGroup = { value: "true", savedAt: now };
|
|
145
|
+
}
|
|
53
146
|
const friend = {
|
|
54
147
|
id: (0, crypto_1.randomUUID)(),
|
|
55
148
|
name: this.params.displayName,
|
|
56
|
-
role: isFirstImprint ? "primary" : "stranger",
|
|
57
|
-
trustLevel: isFirstImprint ? "family" : "stranger",
|
|
149
|
+
role: isA2AAgent ? "agent-peer" : isFirstImprint ? "primary" : isLocalMachineOwner ? "family" : "stranger",
|
|
150
|
+
trustLevel: isA2AAgent ? "stranger" : (isFirstImprint || isLocalMachineOwner) ? "family" : "stranger",
|
|
58
151
|
connections: [],
|
|
59
152
|
externalIds: [externalId],
|
|
60
153
|
tenantMemberships,
|
|
61
154
|
toolPreferences: {},
|
|
62
|
-
notes
|
|
155
|
+
notes,
|
|
63
156
|
totalTokens: 0,
|
|
64
157
|
createdAt: now,
|
|
65
158
|
updatedAt: now,
|
|
66
159
|
schemaVersion: CURRENT_SCHEMA_VERSION,
|
|
160
|
+
kind: isA2AAgent ? "agent" : "human",
|
|
161
|
+
...(isA2AAgent ? {
|
|
162
|
+
agentMeta: {
|
|
163
|
+
bundleName: this.params.displayName,
|
|
164
|
+
familiarity: 0,
|
|
165
|
+
sharedMissions: [],
|
|
166
|
+
outcomes: [],
|
|
167
|
+
a2a: { agentId: this.params.externalId },
|
|
168
|
+
},
|
|
169
|
+
} : {}),
|
|
67
170
|
};
|
|
68
171
|
// Persist -- log and continue on failure (D16)
|
|
69
172
|
try {
|
|
@@ -39,6 +39,7 @@ exports.FileFriendStore = void 0;
|
|
|
39
39
|
const fs = __importStar(require("fs"));
|
|
40
40
|
const fsPromises = __importStar(require("fs/promises"));
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
|
+
const session_events_1 = require("../../heart/session-events");
|
|
42
43
|
const runtime_1 = require("../../nerves/runtime");
|
|
43
44
|
const DEFAULT_ROLE = "friend";
|
|
44
45
|
const DEFAULT_TRUST_LEVEL = "friend";
|
|
@@ -55,10 +56,29 @@ class FileFriendStore {
|
|
|
55
56
|
});
|
|
56
57
|
}
|
|
57
58
|
async get(id) {
|
|
59
|
+
// Direct UUID lookup
|
|
58
60
|
const record = await this.readJson(path.join(this.friendsPath, `${id}.json`));
|
|
59
|
-
if (
|
|
60
|
-
return
|
|
61
|
-
|
|
61
|
+
if (record)
|
|
62
|
+
return this.normalize(record);
|
|
63
|
+
// Fallback: if id is a name (not UUID), scan for matching friend
|
|
64
|
+
/* v8 ignore start -- name fallback: exercised by live proactive sends @preserve */
|
|
65
|
+
try {
|
|
66
|
+
const entries = await fsPromises.readdir(this.friendsPath);
|
|
67
|
+
for (const entry of entries) {
|
|
68
|
+
if (!entry.endsWith(".json"))
|
|
69
|
+
continue;
|
|
70
|
+
const raw = await this.readJson(path.join(this.friendsPath, entry));
|
|
71
|
+
if (!raw)
|
|
72
|
+
continue;
|
|
73
|
+
const normalized = this.normalize(raw);
|
|
74
|
+
if (normalized.name?.toLowerCase() === id.toLowerCase()) {
|
|
75
|
+
return normalized;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch { /* directory unreadable — return null */ }
|
|
80
|
+
/* v8 ignore stop */
|
|
81
|
+
return null;
|
|
62
82
|
}
|
|
63
83
|
async put(id, record) {
|
|
64
84
|
await this.writeJson(path.join(this.friendsPath, `${id}.json`), this.normalize(record));
|
|
@@ -127,6 +147,8 @@ class FileFriendStore {
|
|
|
127
147
|
trustLevel === "stranger"
|
|
128
148
|
? trustLevel
|
|
129
149
|
: DEFAULT_TRUST_LEVEL;
|
|
150
|
+
const kind = raw.kind === "human" || raw.kind === "agent" ? raw.kind : "human";
|
|
151
|
+
const agentMeta = kind === "agent" ? this.normalizeAgentMeta(raw.agentMeta) : undefined;
|
|
130
152
|
return {
|
|
131
153
|
id: raw.id,
|
|
132
154
|
name: raw.name,
|
|
@@ -153,7 +175,35 @@ class FileFriendStore {
|
|
|
153
175
|
createdAt: typeof raw.createdAt === "string" ? raw.createdAt : new Date().toISOString(),
|
|
154
176
|
updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : new Date().toISOString(),
|
|
155
177
|
schemaVersion: typeof raw.schemaVersion === "number" ? raw.schemaVersion : 1,
|
|
178
|
+
kind,
|
|
179
|
+
agentMeta,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
normalizeAgentMeta(raw) {
|
|
183
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
184
|
+
return undefined;
|
|
185
|
+
const meta = raw;
|
|
186
|
+
if (typeof meta.bundleName !== "string")
|
|
187
|
+
return undefined;
|
|
188
|
+
return {
|
|
189
|
+
bundleName: meta.bundleName,
|
|
190
|
+
familiarity: typeof meta.familiarity === "number" ? meta.familiarity : 0,
|
|
191
|
+
sharedMissions: Array.isArray(meta.sharedMissions) ? meta.sharedMissions : [],
|
|
192
|
+
outcomes: Array.isArray(meta.outcomes) ? meta.outcomes : [],
|
|
193
|
+
...(this.normalizeA2AMeta(meta.a2a) ? { a2a: this.normalizeA2AMeta(meta.a2a) } : {}),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
normalizeA2AMeta(raw) {
|
|
197
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
198
|
+
return undefined;
|
|
199
|
+
const meta = raw;
|
|
200
|
+
const a2a = {
|
|
201
|
+
...(typeof meta.cardUrl === "string" ? { cardUrl: meta.cardUrl } : {}),
|
|
202
|
+
...(typeof meta.endpointUrl === "string" ? { endpointUrl: meta.endpointUrl } : {}),
|
|
203
|
+
...(typeof meta.agentId === "string" ? { agentId: meta.agentId } : {}),
|
|
204
|
+
...(typeof meta.protocolVersion === "string" ? { protocolVersion: meta.protocolVersion } : {}),
|
|
156
205
|
};
|
|
206
|
+
return Object.keys(a2a).length > 0 ? a2a : undefined;
|
|
157
207
|
}
|
|
158
208
|
async readJson(filePath) {
|
|
159
209
|
try {
|
|
@@ -174,7 +224,14 @@ class FileFriendStore {
|
|
|
174
224
|
}
|
|
175
225
|
}
|
|
176
226
|
async writeJson(filePath, data) {
|
|
177
|
-
|
|
227
|
+
const notes = Object.fromEntries(Object.entries(data.notes).map(([key, note]) => [
|
|
228
|
+
key,
|
|
229
|
+
{
|
|
230
|
+
...note,
|
|
231
|
+
value: (0, session_events_1.capStructuredRecordString)(note.value),
|
|
232
|
+
},
|
|
233
|
+
]));
|
|
234
|
+
await fsPromises.writeFile(filePath, JSON.stringify({ ...data, notes }, null, 2), "utf-8");
|
|
178
235
|
}
|
|
179
236
|
async removeFile(filePath) {
|
|
180
237
|
try {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Context kernel type definitions.
|
|
3
|
-
// FriendRecord (merged identity +
|
|
3
|
+
// FriendRecord (merged identity + notes), channel capabilities, and resolved context.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.TRUSTED_LEVELS = void 0;
|
|
6
6
|
exports.isIdentityProvider = isIdentityProvider;
|
|
7
7
|
exports.isIntegration = isIntegration;
|
|
8
8
|
exports.isTrustedLevel = isTrustedLevel;
|
|
9
9
|
const runtime_1 = require("../../nerves/runtime");
|
|
10
|
-
const IDENTITY_PROVIDERS = new Set(["aad", "local", "teams-conversation", "imessage-handle"]);
|
|
10
|
+
const IDENTITY_PROVIDERS = new Set(["aad", "local", "teams-conversation", "imessage-handle", "email-address", "a2a-agent"]);
|
|
11
11
|
function isIdentityProvider(value) {
|
|
12
12
|
(0, runtime_1.emitNervesEvent)({
|
|
13
13
|
component: "friends",
|
|
@@ -34,54 +34,25 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.cosineSimilarity = cosineSimilarity;
|
|
37
|
-
exports.
|
|
38
|
-
exports.
|
|
37
|
+
exports.searchDiaryFactsForQuery = searchDiaryFactsForQuery;
|
|
38
|
+
exports.injectNoteSearchContext = injectNoteSearchContext;
|
|
39
39
|
const fs = __importStar(require("fs"));
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
|
-
const config_1 = require("../heart/config");
|
|
42
|
-
const identity_1 = require("../heart/identity");
|
|
43
41
|
const runtime_1 = require("../nerves/runtime");
|
|
44
|
-
const
|
|
42
|
+
const diary_1 = require("./diary");
|
|
43
|
+
const provenance_trust_1 = require("./provenance-trust");
|
|
44
|
+
const embedding_provider_1 = require("./embedding-provider");
|
|
45
45
|
const DEFAULT_MIN_SCORE = 0.5;
|
|
46
46
|
const DEFAULT_TOP_K = 3;
|
|
47
|
-
class OpenAIEmbeddingProvider {
|
|
48
|
-
apiKey;
|
|
49
|
-
model;
|
|
50
|
-
constructor(apiKey, model = DEFAULT_EMBEDDING_MODEL) {
|
|
51
|
-
this.apiKey = apiKey;
|
|
52
|
-
this.model = model;
|
|
53
|
-
}
|
|
54
|
-
async embed(texts) {
|
|
55
|
-
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
},
|
|
61
|
-
body: JSON.stringify({
|
|
62
|
-
model: this.model,
|
|
63
|
-
input: texts,
|
|
64
|
-
}),
|
|
65
|
-
});
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(`embedding request failed: ${response.status} ${response.statusText}`);
|
|
68
|
-
}
|
|
69
|
-
const payload = (await response.json());
|
|
70
|
-
if (!payload.data || payload.data.length !== texts.length) {
|
|
71
|
-
throw new Error("embedding response missing expected vectors");
|
|
72
|
-
}
|
|
73
|
-
return payload.data.map((entry) => entry.embedding);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
47
|
function createDefaultProvider() {
|
|
77
|
-
const
|
|
78
|
-
if (!
|
|
48
|
+
const provider = (0, embedding_provider_1.createDefaultEmbeddingProvider)();
|
|
49
|
+
if (!provider) {
|
|
79
50
|
throw new Error("openaiEmbeddingsApiKey not configured");
|
|
80
51
|
}
|
|
81
|
-
return
|
|
52
|
+
return provider;
|
|
82
53
|
}
|
|
83
|
-
function readFacts(
|
|
84
|
-
const factsPath = path.join(
|
|
54
|
+
function readFacts(diaryRoot) {
|
|
55
|
+
const factsPath = path.join(diaryRoot, "facts.jsonl");
|
|
85
56
|
if (!fs.existsSync(factsPath))
|
|
86
57
|
return [];
|
|
87
58
|
const raw = fs.readFileSync(factsPath, "utf8").trim();
|
|
@@ -129,7 +100,7 @@ function cosineSimilarity(left, right) {
|
|
|
129
100
|
return 0;
|
|
130
101
|
return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
|
|
131
102
|
}
|
|
132
|
-
async function
|
|
103
|
+
async function searchDiaryFactsForQuery(query, facts, provider, options) {
|
|
133
104
|
const trimmed = query.trim();
|
|
134
105
|
if (!trimmed)
|
|
135
106
|
return [];
|
|
@@ -145,62 +116,80 @@ async function recallFactsForQuery(query, facts, provider, options) {
|
|
|
145
116
|
.sort((left, right) => right.score - left.score)
|
|
146
117
|
.slice(0, topK);
|
|
147
118
|
}
|
|
148
|
-
async function
|
|
119
|
+
async function injectNoteSearchContext(messages, options) {
|
|
149
120
|
try {
|
|
150
121
|
if (messages[0]?.role !== "system" || typeof messages[0].content !== "string")
|
|
151
122
|
return;
|
|
152
123
|
const query = getLatestUserText(messages);
|
|
153
124
|
if (!query)
|
|
154
125
|
return;
|
|
155
|
-
const
|
|
156
|
-
const facts = readFacts(
|
|
126
|
+
const diaryRoot = options?.diaryRoot ?? (0, diary_1.resolveDiaryRoot)();
|
|
127
|
+
const facts = readFacts(diaryRoot);
|
|
157
128
|
if (facts.length === 0)
|
|
158
129
|
return;
|
|
159
|
-
|
|
130
|
+
const resultLines = [];
|
|
131
|
+
let found;
|
|
160
132
|
try {
|
|
161
133
|
const provider = options?.provider ?? createDefaultProvider();
|
|
162
|
-
|
|
134
|
+
found = await searchDiaryFactsForQuery(query, facts, provider, options);
|
|
163
135
|
}
|
|
164
136
|
catch {
|
|
165
137
|
// Embeddings unavailable — fall back to substring matching
|
|
166
138
|
const lowerQuery = query.toLowerCase();
|
|
167
139
|
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
168
|
-
|
|
140
|
+
found = facts
|
|
169
141
|
.filter((fact) => fact.text.toLowerCase().includes(lowerQuery))
|
|
170
142
|
.slice(0, topK)
|
|
171
143
|
.map((fact) => ({ ...fact, score: 1 }));
|
|
172
|
-
if (
|
|
144
|
+
if (found.length > 0) {
|
|
173
145
|
(0, runtime_1.emitNervesEvent)({
|
|
174
146
|
level: "warn",
|
|
175
147
|
component: "mind",
|
|
176
|
-
event: "mind.
|
|
148
|
+
event: "mind.note_search_fallback",
|
|
177
149
|
message: "embeddings unavailable, used substring fallback",
|
|
178
|
-
meta: { matchCount:
|
|
150
|
+
meta: { matchCount: found.length },
|
|
179
151
|
});
|
|
180
152
|
}
|
|
181
153
|
}
|
|
182
|
-
|
|
154
|
+
for (const fact of found) {
|
|
155
|
+
let meta = `score=${fact.score.toFixed(3)} source=${fact.source}`;
|
|
156
|
+
if (fact.provenance) {
|
|
157
|
+
if (fact.provenance.channel)
|
|
158
|
+
meta += ` channel=${fact.provenance.channel}`;
|
|
159
|
+
if (fact.provenance.friendName)
|
|
160
|
+
meta += ` friend=${fact.provenance.friendName}`;
|
|
161
|
+
if (fact.provenance.trust)
|
|
162
|
+
meta += ` trust=${fact.provenance.trust}`;
|
|
163
|
+
}
|
|
164
|
+
const tag = (0, provenance_trust_1.classifyProvenanceTrust)(fact.provenance) === "external" ? "diary/external" : "diary";
|
|
165
|
+
resultLines.push({
|
|
166
|
+
text: `[${tag}] ${fact.text} [${meta}]`,
|
|
167
|
+
score: fact.score,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (resultLines.length === 0)
|
|
183
171
|
return;
|
|
184
|
-
|
|
185
|
-
|
|
172
|
+
resultLines.sort((left, right) => right.score - left.score);
|
|
173
|
+
const noteSection = resultLines
|
|
174
|
+
.map((entry, index) => `${index + 1}. ${entry.text}`)
|
|
186
175
|
.join("\n");
|
|
187
176
|
messages[0] = {
|
|
188
177
|
role: "system",
|
|
189
|
-
content: `${messages[0].content}\n\n##
|
|
178
|
+
content: `${messages[0].content}\n\n## retrieved from my Desk record diary\n${noteSection}`,
|
|
190
179
|
};
|
|
191
180
|
(0, runtime_1.emitNervesEvent)({
|
|
192
181
|
component: "mind",
|
|
193
|
-
event: "mind.
|
|
194
|
-
message: "
|
|
195
|
-
meta: { count:
|
|
182
|
+
event: "mind.note_search_context",
|
|
183
|
+
message: "note search injected",
|
|
184
|
+
meta: { count: resultLines.length },
|
|
196
185
|
});
|
|
197
186
|
}
|
|
198
187
|
catch (error) {
|
|
199
188
|
(0, runtime_1.emitNervesEvent)({
|
|
200
189
|
level: "warn",
|
|
201
190
|
component: "mind",
|
|
202
|
-
event: "mind.
|
|
203
|
-
message: "
|
|
191
|
+
event: "mind.note_search_context_error",
|
|
192
|
+
message: "note search failed",
|
|
204
193
|
meta: {
|
|
205
194
|
reason: error instanceof Error ? error.message : /* v8 ignore start -- defensive: non-Error catch branch @preserve */ String(error) /* v8 ignore stop */,
|
|
206
195
|
},
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findActivePersistentObligation = findActivePersistentObligation;
|
|
4
|
+
exports.findStatusObligation = findStatusObligation;
|
|
5
|
+
exports.renderActiveObligationSteering = renderActiveObligationSteering;
|
|
6
|
+
exports.renderConcreteStatusGuidance = renderConcreteStatusGuidance;
|
|
7
|
+
exports.renderLiveThreadStatusShape = renderLiveThreadStatusShape;
|
|
8
|
+
exports.buildExactStatusReply = buildExactStatusReply;
|
|
9
|
+
exports.renderExactStatusReplyContract = renderExactStatusReplyContract;
|
|
10
|
+
const config_1 = require("../heart/config");
|
|
11
|
+
const active_work_1 = require("../heart/active-work");
|
|
12
|
+
const runtime_1 = require("../nerves/runtime");
|
|
13
|
+
function findActivePersistentObligation(frame) {
|
|
14
|
+
if (!frame)
|
|
15
|
+
return null;
|
|
16
|
+
return (frame.pendingObligations ?? []).find((ob) => ob.status !== "pending" && ob.status !== "fulfilled") ?? null;
|
|
17
|
+
}
|
|
18
|
+
function obligationTimestampMs(obligation) {
|
|
19
|
+
return Date.parse(obligation.updatedAt ?? obligation.createdAt);
|
|
20
|
+
}
|
|
21
|
+
function newestObligationFirst(left, right) {
|
|
22
|
+
return obligationTimestampMs(right) - obligationTimestampMs(left);
|
|
23
|
+
}
|
|
24
|
+
function matchesCurrentSession(frame, obligation) {
|
|
25
|
+
return matchesSessionOrigin(frame, obligation.origin);
|
|
26
|
+
}
|
|
27
|
+
function matchesSessionOrigin(frame, origin) {
|
|
28
|
+
return Boolean(frame.currentSession
|
|
29
|
+
&& origin.friendId === frame.currentSession.friendId
|
|
30
|
+
&& origin.channel === frame.currentSession.channel
|
|
31
|
+
&& (0, config_1.sanitizeKey)(origin.key) === (0, config_1.sanitizeKey)(frame.currentSession.key));
|
|
32
|
+
}
|
|
33
|
+
function findStatusObligation(frame) {
|
|
34
|
+
if (!frame)
|
|
35
|
+
return null;
|
|
36
|
+
const openObligations = [...(frame.pendingObligations ?? [])]
|
|
37
|
+
.filter((obligation) => obligation.status !== "fulfilled")
|
|
38
|
+
.sort(newestObligationFirst);
|
|
39
|
+
const sameSession = openObligations.find((obligation) => matchesCurrentSession(frame, obligation));
|
|
40
|
+
if (sameSession)
|
|
41
|
+
return sameSession;
|
|
42
|
+
return openObligations[0] ?? null;
|
|
43
|
+
}
|
|
44
|
+
function findCurrentSessionStatusObligation(frame) {
|
|
45
|
+
const openObligations = [...(frame.pendingObligations ?? [])]
|
|
46
|
+
.filter((obligation) => obligation.status !== "fulfilled")
|
|
47
|
+
.sort(newestObligationFirst);
|
|
48
|
+
return openObligations.find((obligation) => matchesCurrentSession(frame, obligation)) ?? null;
|
|
49
|
+
}
|
|
50
|
+
function renderActiveObligationSteering(obligation) {
|
|
51
|
+
(0, runtime_1.emitNervesEvent)({
|
|
52
|
+
component: "mind",
|
|
53
|
+
event: "mind.obligation_steering_rendered",
|
|
54
|
+
message: "rendered active obligation steering",
|
|
55
|
+
meta: {
|
|
56
|
+
hasObligation: Boolean(obligation),
|
|
57
|
+
hasSurface: Boolean(obligation?.currentSurface?.label),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
if (!obligation)
|
|
61
|
+
return "";
|
|
62
|
+
const name = obligation.origin.friendId;
|
|
63
|
+
const surfaceLine = obligation.currentSurface?.label
|
|
64
|
+
? `\nright now that work is happening in ${obligation.currentSurface.label}.`
|
|
65
|
+
: "";
|
|
66
|
+
return `## where my attention is
|
|
67
|
+
i'm already working on something i owe ${name}.${surfaceLine}
|
|
68
|
+
|
|
69
|
+
i should close that loop before i act like this is a fresh blank turn.`;
|
|
70
|
+
}
|
|
71
|
+
function mergeArtifactFallback(obligation) {
|
|
72
|
+
const trimmed = obligation.content.trim();
|
|
73
|
+
if (!trimmed)
|
|
74
|
+
return "the fix";
|
|
75
|
+
const stripped = trimmed.replace(/^merge(?:\s+|$)/i, "").trim();
|
|
76
|
+
return stripped || "the fix";
|
|
77
|
+
}
|
|
78
|
+
function formatMergeArtifact(obligation) {
|
|
79
|
+
const currentArtifact = obligation.currentArtifact?.trim();
|
|
80
|
+
if (currentArtifact)
|
|
81
|
+
return currentArtifact;
|
|
82
|
+
if (obligation.currentSurface?.kind === "merge") {
|
|
83
|
+
const surfaceLabel = obligation.currentSurface.label.trim();
|
|
84
|
+
if (surfaceLabel)
|
|
85
|
+
return surfaceLabel;
|
|
86
|
+
}
|
|
87
|
+
return mergeArtifactFallback(obligation);
|
|
88
|
+
}
|
|
89
|
+
function formatActiveLane(frame, obligation) {
|
|
90
|
+
const liveCodingSession = frame.codingSessions?.[0];
|
|
91
|
+
if (liveCodingSession) {
|
|
92
|
+
const sameThread = frame.currentSession
|
|
93
|
+
&& liveCodingSession.originSession
|
|
94
|
+
&& liveCodingSession.originSession.friendId === frame.currentSession.friendId
|
|
95
|
+
&& liveCodingSession.originSession.channel === frame.currentSession.channel
|
|
96
|
+
&& liveCodingSession.originSession.key === frame.currentSession.key;
|
|
97
|
+
return sameThread
|
|
98
|
+
? `${liveCodingSession.runner} ${liveCodingSession.id} for this same thread`
|
|
99
|
+
: liveCodingSession.originSession
|
|
100
|
+
? `${liveCodingSession.runner} ${liveCodingSession.id} for ${liveCodingSession.originSession.channel}/${liveCodingSession.originSession.key}`
|
|
101
|
+
: `${liveCodingSession.runner} ${liveCodingSession.id}`;
|
|
102
|
+
}
|
|
103
|
+
return obligation.currentSurface?.label
|
|
104
|
+
|| (matchesCurrentSession(frame, obligation) ? "this same thread" : "this live loop");
|
|
105
|
+
}
|
|
106
|
+
function formatCurrentArtifact(frame, obligation) {
|
|
107
|
+
if (obligation?.currentArtifact)
|
|
108
|
+
return obligation.currentArtifact;
|
|
109
|
+
if (obligation?.currentSurface?.kind === "merge")
|
|
110
|
+
return obligation.currentSurface.label;
|
|
111
|
+
if ((frame.codingSessions ?? []).length > 0)
|
|
112
|
+
return "no PR or merge artifact yet";
|
|
113
|
+
return obligation ? "no artifact yet" : "";
|
|
114
|
+
}
|
|
115
|
+
function formatNextAction(frame, obligation) {
|
|
116
|
+
const obligationHasConcreteArtifact = Boolean(obligation?.currentArtifact?.trim())
|
|
117
|
+
|| obligation?.currentSurface?.kind === "merge";
|
|
118
|
+
if (obligation?.status === "waiting_for_merge") {
|
|
119
|
+
return obligation.nextAction?.trim() || `wait for checks, merge ${formatMergeArtifact(obligation)}, then update runtime`;
|
|
120
|
+
}
|
|
121
|
+
if (obligation?.status === "updating_runtime") {
|
|
122
|
+
return obligation.nextAction?.trim() || "update runtime, verify version/changelog, then re-observe";
|
|
123
|
+
}
|
|
124
|
+
if (obligationHasConcreteArtifact && obligation?.nextAction?.trim()) {
|
|
125
|
+
return obligation.nextAction.trim();
|
|
126
|
+
}
|
|
127
|
+
const liveCodingSession = frame.codingSessions?.[0];
|
|
128
|
+
if (liveCodingSession?.status === "waiting_input") {
|
|
129
|
+
return `answer ${liveCodingSession.runner} ${liveCodingSession.id} and continue`;
|
|
130
|
+
}
|
|
131
|
+
if (liveCodingSession?.status === "stalled") {
|
|
132
|
+
return `unstick ${liveCodingSession.runner} ${liveCodingSession.id} and continue`;
|
|
133
|
+
}
|
|
134
|
+
if (liveCodingSession) {
|
|
135
|
+
return "finish the coding pass and bring the result back here";
|
|
136
|
+
}
|
|
137
|
+
if (obligation?.nextAction?.trim())
|
|
138
|
+
return obligation.nextAction.trim();
|
|
139
|
+
if (obligation?.content?.trim()) {
|
|
140
|
+
return `work on "${obligation.content.trim()}" and bring back a concrete artifact`;
|
|
141
|
+
}
|
|
142
|
+
return obligation ? "continue the active loop and bring the result back here" : "";
|
|
143
|
+
}
|
|
144
|
+
function renderConcreteStatusGuidance(frame, obligation) {
|
|
145
|
+
const activeLane = obligation ? formatActiveLane(frame, obligation) : "";
|
|
146
|
+
const currentArtifact = formatCurrentArtifact(frame, obligation);
|
|
147
|
+
const nextAction = formatNextAction(frame, obligation);
|
|
148
|
+
const liveConversation = frame.currentSession
|
|
149
|
+
? `${frame.currentSession.channel}/${frame.currentSession.key}`
|
|
150
|
+
: "";
|
|
151
|
+
if (!activeLane && !currentArtifact && !nextAction)
|
|
152
|
+
return "";
|
|
153
|
+
return `if someone asks what i'm doing or for status mid-task, i answer from these live facts instead of copying a canned block.
|
|
154
|
+
the live conversation is ${liveConversation || "not in a live conversation"}.
|
|
155
|
+
the active lane is ${activeLane}.
|
|
156
|
+
the current artifact is ${currentArtifact}.
|
|
157
|
+
if i just finished or verified something concrete in this live lane, i name that as the latest checkpoint.
|
|
158
|
+
the next action is ${nextAction}.
|
|
159
|
+
|
|
160
|
+
i answer naturally from those facts instead of forcing a canned status block.`;
|
|
161
|
+
}
|
|
162
|
+
function renderLiveThreadStatusShape(frame) {
|
|
163
|
+
if (!frame.currentSession)
|
|
164
|
+
return "";
|
|
165
|
+
return `if someone asks what i'm doing or for status mid-task in this live thread, i answer in these exact lines, in order, with no intro paragraph:
|
|
166
|
+
live conversation: ${frame.currentSession.channel}/${frame.currentSession.key}
|
|
167
|
+
active lane: this same thread
|
|
168
|
+
current artifact: <actual artifact or "no artifact yet">
|
|
169
|
+
latest checkpoint: <freshest concrete thing i just finished or verified>
|
|
170
|
+
next action: <smallest concrete next step i'm taking now>
|
|
171
|
+
|
|
172
|
+
no recap paragraph before those lines.
|
|
173
|
+
no option list.
|
|
174
|
+
present tense only.
|
|
175
|
+
if a finished step matters, i label it "just finished" instead of presenting it as current work.`;
|
|
176
|
+
}
|
|
177
|
+
function buildExactStatusReply(frame, obligation, latestCheckpoint, statusCheckScope) {
|
|
178
|
+
const headerObligation = statusCheckScope === "all-sessions-family"
|
|
179
|
+
? findCurrentSessionStatusObligation(frame)
|
|
180
|
+
: obligation;
|
|
181
|
+
const liveConversation = frame.currentSession
|
|
182
|
+
? `${frame.currentSession.channel}/${frame.currentSession.key}`
|
|
183
|
+
: "not in a live conversation";
|
|
184
|
+
const activeLane = headerObligation
|
|
185
|
+
? formatActiveLane(frame, headerObligation)
|
|
186
|
+
: (frame.currentSession ? "this same thread" : "this live loop");
|
|
187
|
+
const currentArtifact = formatCurrentArtifact(frame, headerObligation) || "no artifact yet";
|
|
188
|
+
const nextAction = formatNextAction(frame, headerObligation) || "continue the active loop and bring the result back here";
|
|
189
|
+
const latest = latestCheckpoint.trim() || "<freshest concrete thing i just finished or verified>";
|
|
190
|
+
const lines = [
|
|
191
|
+
`live conversation: ${liveConversation}`,
|
|
192
|
+
`active lane: ${activeLane}`,
|
|
193
|
+
`current artifact: ${currentArtifact}`,
|
|
194
|
+
`latest checkpoint: ${latest}`,
|
|
195
|
+
`next action: ${nextAction}`,
|
|
196
|
+
];
|
|
197
|
+
if (statusCheckScope === "all-sessions-family") {
|
|
198
|
+
lines.push("other active sessions:");
|
|
199
|
+
const summaries = (0, active_work_1.formatOtherActiveSessionSummaries)(frame);
|
|
200
|
+
lines.push(...(summaries.length > 0 ? summaries : ["- none"]));
|
|
201
|
+
}
|
|
202
|
+
return lines.join("\n");
|
|
203
|
+
}
|
|
204
|
+
function renderExactStatusReplyContract(frame, obligation, statusCheckScope) {
|
|
205
|
+
const headerObligation = statusCheckScope === "all-sessions-family"
|
|
206
|
+
? findCurrentSessionStatusObligation(frame)
|
|
207
|
+
: obligation;
|
|
208
|
+
if (statusCheckScope === "all-sessions-family") {
|
|
209
|
+
return `reply using exactly this status shape and nothing else:
|
|
210
|
+
live conversation: ${frame.currentSession ? `${frame.currentSession.channel}/${frame.currentSession.key}` : "not in a live conversation"}
|
|
211
|
+
active lane: ${headerObligation ? formatActiveLane(frame, headerObligation) : (frame.currentSession ? "this same thread" : "this live loop")}
|
|
212
|
+
current artifact: ${formatCurrentArtifact(frame, headerObligation) || "no artifact yet"}
|
|
213
|
+
latest checkpoint: <freshest concrete thing i just finished or verified>
|
|
214
|
+
next action: ${formatNextAction(frame, headerObligation) || "continue the active loop and bring the result back here"}
|
|
215
|
+
other active sessions:
|
|
216
|
+
- <session label>: <what i'm doing there right now>`;
|
|
217
|
+
}
|
|
218
|
+
return `reply using exactly these five lines and nothing else:
|
|
219
|
+
${buildExactStatusReply(frame, obligation, "<freshest concrete thing i just finished or verified>")}
|
|
220
|
+
`;
|
|
221
|
+
}
|