@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.560
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 +3596 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +58 -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/adapter.js +2 -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/background-operations.js +281 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +913 -246
- 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 +522 -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 +776 -0
- package/dist/heart/daemon/cli-exec.js +7457 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1592 -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 -1698
- package/dist/heart/daemon/daemon-entry.js +387 -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 +796 -71
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +826 -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 +115 -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 +89 -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 +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 +2 -2
- 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/process-manager.js +375 -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 +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 +67 -16
- package/dist/heart/daemon/runtime-metadata.js +3 -31
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +389 -38
- 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 +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 +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +162 -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 -1
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -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 +32 -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 +35 -12
- package/dist/heart/identity.js +203 -57
- package/dist/heart/kept-notes.js +357 -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 +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -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 +31 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +195 -0
- package/dist/heart/mailbox/readers/agent-machine.js +382 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +362 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +651 -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 +683 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -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 +97 -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 +26 -8
- 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 +13 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1149 -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 +243 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- 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 +139 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +389 -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 +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
- package/dist/mailbox-ui/assets/index-BPr5vNuM.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 +674 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +720 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +430 -0
- package/dist/mailroom/mbox-import.js +383 -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 +256 -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 +7 -1
- package/dist/mind/context.js +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +62 -75
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +4 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1011 -123
- package/dist/mind/provenance-trust.js +26 -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 +129 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- 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 +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +963 -0
- package/dist/repertoire/bundle-templates.js +72 -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 +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -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/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 +396 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +362 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +15 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +47 -1075
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +142 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1857 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-session.js +750 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +108 -100
- 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/attention-queue.js +116 -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 +2305 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- 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/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 +520 -209
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +175 -21
- package/dist/senses/inner-dialog.js +330 -27
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +549 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +248 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/elevenlabs.js +125 -0
- package/dist/senses/voice/index.js +22 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +85 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +133 -0
- package/dist/senses/voice-entry.js +80 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +38 -7
- package/skills/agent-commerce.md +106 -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 +101 -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/subagent-installer.js +0 -166
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- 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 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /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/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
|
@@ -55,10 +55,29 @@ class FileFriendStore {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
async get(id) {
|
|
58
|
+
// Direct UUID lookup
|
|
58
59
|
const record = await this.readJson(path.join(this.friendsPath, `${id}.json`));
|
|
59
|
-
if (
|
|
60
|
-
return
|
|
61
|
-
|
|
60
|
+
if (record)
|
|
61
|
+
return this.normalize(record);
|
|
62
|
+
// Fallback: if id is a name (not UUID), scan for matching friend
|
|
63
|
+
/* v8 ignore start -- name fallback: exercised by live proactive sends @preserve */
|
|
64
|
+
try {
|
|
65
|
+
const entries = await fsPromises.readdir(this.friendsPath);
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (!entry.endsWith(".json"))
|
|
68
|
+
continue;
|
|
69
|
+
const raw = await this.readJson(path.join(this.friendsPath, entry));
|
|
70
|
+
if (!raw)
|
|
71
|
+
continue;
|
|
72
|
+
const normalized = this.normalize(raw);
|
|
73
|
+
if (normalized.name?.toLowerCase() === id.toLowerCase()) {
|
|
74
|
+
return normalized;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch { /* directory unreadable — return null */ }
|
|
79
|
+
/* v8 ignore stop */
|
|
80
|
+
return null;
|
|
62
81
|
}
|
|
63
82
|
async put(id, record) {
|
|
64
83
|
await this.writeJson(path.join(this.friendsPath, `${id}.json`), this.normalize(record));
|
|
@@ -127,6 +146,8 @@ class FileFriendStore {
|
|
|
127
146
|
trustLevel === "stranger"
|
|
128
147
|
? trustLevel
|
|
129
148
|
: DEFAULT_TRUST_LEVEL;
|
|
149
|
+
const kind = raw.kind === "human" || raw.kind === "agent" ? raw.kind : "human";
|
|
150
|
+
const agentMeta = kind === "agent" ? this.normalizeAgentMeta(raw.agentMeta) : undefined;
|
|
130
151
|
return {
|
|
131
152
|
id: raw.id,
|
|
132
153
|
name: raw.name,
|
|
@@ -153,6 +174,21 @@ class FileFriendStore {
|
|
|
153
174
|
createdAt: typeof raw.createdAt === "string" ? raw.createdAt : new Date().toISOString(),
|
|
154
175
|
updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : new Date().toISOString(),
|
|
155
176
|
schemaVersion: typeof raw.schemaVersion === "number" ? raw.schemaVersion : 1,
|
|
177
|
+
kind,
|
|
178
|
+
agentMeta,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
normalizeAgentMeta(raw) {
|
|
182
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
183
|
+
return undefined;
|
|
184
|
+
const meta = raw;
|
|
185
|
+
if (typeof meta.bundleName !== "string")
|
|
186
|
+
return undefined;
|
|
187
|
+
return {
|
|
188
|
+
bundleName: meta.bundleName,
|
|
189
|
+
familiarity: typeof meta.familiarity === "number" ? meta.familiarity : 0,
|
|
190
|
+
sharedMissions: Array.isArray(meta.sharedMissions) ? meta.sharedMissions : [],
|
|
191
|
+
outcomes: Array.isArray(meta.outcomes) ? meta.outcomes : [],
|
|
156
192
|
};
|
|
157
193
|
}
|
|
158
194
|
async readJson(filePath) {
|
|
@@ -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"]);
|
|
11
11
|
function isIdentityProvider(value) {
|
|
12
12
|
(0, runtime_1.emitNervesEvent)({
|
|
13
13
|
component: "friends",
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.indexJournalFiles = indexJournalFiles;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const runtime_1 = require("../nerves/runtime");
|
|
40
|
+
const TEXT_EXTENSIONS = new Set([".md", ".txt"]);
|
|
41
|
+
const PREVIEW_CHAR_LIMIT = 500;
|
|
42
|
+
function readExistingIndex(indexPath) {
|
|
43
|
+
try {
|
|
44
|
+
const raw = fs.readFileSync(indexPath, "utf8");
|
|
45
|
+
const parsed = JSON.parse(raw);
|
|
46
|
+
if (!Array.isArray(parsed))
|
|
47
|
+
return [];
|
|
48
|
+
return parsed;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function extractPreview(content) {
|
|
55
|
+
const trimmed = content.trim();
|
|
56
|
+
if (!trimmed)
|
|
57
|
+
return "";
|
|
58
|
+
return trimmed.split("\n")[0].replace(/^#+\s*/, "").trim();
|
|
59
|
+
}
|
|
60
|
+
async function indexJournalFiles(journalDir, indexPath, embedProvider) {
|
|
61
|
+
// Read existing index
|
|
62
|
+
const existingIndex = readExistingIndex(indexPath);
|
|
63
|
+
const indexMap = new Map();
|
|
64
|
+
for (const entry of existingIndex) {
|
|
65
|
+
indexMap.set(entry.filename, entry);
|
|
66
|
+
}
|
|
67
|
+
// Scan journal dir for text files
|
|
68
|
+
let dirEntries;
|
|
69
|
+
try {
|
|
70
|
+
dirEntries = fs.readdirSync(journalDir, { withFileTypes: true });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
(0, runtime_1.emitNervesEvent)({
|
|
74
|
+
component: "mind",
|
|
75
|
+
event: "mind.journal_index_scan",
|
|
76
|
+
message: "journal dir not found or unreadable",
|
|
77
|
+
meta: { journalDir },
|
|
78
|
+
});
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
const textFiles = dirEntries.filter((entry) => {
|
|
82
|
+
if (!entry.isFile())
|
|
83
|
+
return false;
|
|
84
|
+
if (entry.name.startsWith("."))
|
|
85
|
+
return false;
|
|
86
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
87
|
+
return TEXT_EXTENSIONS.has(ext);
|
|
88
|
+
});
|
|
89
|
+
if (textFiles.length === 0) {
|
|
90
|
+
(0, runtime_1.emitNervesEvent)({
|
|
91
|
+
component: "mind",
|
|
92
|
+
event: "mind.journal_index_scan",
|
|
93
|
+
message: "no text files found in journal",
|
|
94
|
+
meta: { journalDir },
|
|
95
|
+
});
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
let newlyIndexed = 0;
|
|
99
|
+
for (const file of textFiles) {
|
|
100
|
+
const filePath = path.join(journalDir, file.name);
|
|
101
|
+
let stat;
|
|
102
|
+
try {
|
|
103
|
+
stat = fs.statSync(filePath);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* v8 ignore next -- filesystem race: file deleted between readdir and stat @preserve */
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Check if already indexed with same mtime
|
|
110
|
+
const existing = indexMap.get(file.name);
|
|
111
|
+
if (existing && existing.mtime === stat.mtimeMs) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// Read content for embedding
|
|
115
|
+
let content;
|
|
116
|
+
try {
|
|
117
|
+
content = fs.readFileSync(filePath, "utf8");
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* v8 ignore next -- filesystem race: file deleted between stat and read @preserve */
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const preview = extractPreview(content);
|
|
124
|
+
const embedText = content.slice(0, PREVIEW_CHAR_LIMIT);
|
|
125
|
+
// Generate embedding
|
|
126
|
+
let embedding;
|
|
127
|
+
try {
|
|
128
|
+
const vectors = await embedProvider.embed([embedText]);
|
|
129
|
+
embedding = vectors[0] ?? [];
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
(0, runtime_1.emitNervesEvent)({
|
|
133
|
+
level: "warn",
|
|
134
|
+
component: "mind",
|
|
135
|
+
event: "mind.journal_embedding_error",
|
|
136
|
+
message: "embedding failed for journal file",
|
|
137
|
+
meta: { filename: file.name },
|
|
138
|
+
});
|
|
139
|
+
embedding = [];
|
|
140
|
+
}
|
|
141
|
+
indexMap.set(file.name, {
|
|
142
|
+
filename: file.name,
|
|
143
|
+
embedding,
|
|
144
|
+
mtime: stat.mtimeMs,
|
|
145
|
+
preview,
|
|
146
|
+
});
|
|
147
|
+
newlyIndexed++;
|
|
148
|
+
}
|
|
149
|
+
// Write updated index back
|
|
150
|
+
if (newlyIndexed > 0) {
|
|
151
|
+
const updatedIndex = Array.from(indexMap.values());
|
|
152
|
+
fs.writeFileSync(indexPath, JSON.stringify(updatedIndex, null, 2), "utf8");
|
|
153
|
+
}
|
|
154
|
+
(0, runtime_1.emitNervesEvent)({
|
|
155
|
+
component: "mind",
|
|
156
|
+
event: "mind.journal_index_complete",
|
|
157
|
+
message: "journal indexing complete",
|
|
158
|
+
meta: { journalDir, newlyIndexed, total: indexMap.size },
|
|
159
|
+
});
|
|
160
|
+
return newlyIndexed;
|
|
161
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
37
|
+
exports.searchDiaryFactsForQuery = searchDiaryFactsForQuery;
|
|
38
|
+
exports.searchJournalIndex = searchJournalIndex;
|
|
39
|
+
exports.injectNoteSearchContext = injectNoteSearchContext;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const runtime_1 = require("../nerves/runtime");
|
|
43
|
+
const diary_1 = require("./diary");
|
|
44
|
+
const provenance_trust_1 = require("./provenance-trust");
|
|
45
|
+
const embedding_provider_1 = require("./embedding-provider");
|
|
46
|
+
const DEFAULT_MIN_SCORE = 0.5;
|
|
47
|
+
const DEFAULT_TOP_K = 3;
|
|
48
|
+
function createDefaultProvider() {
|
|
49
|
+
const provider = (0, embedding_provider_1.createDefaultEmbeddingProvider)();
|
|
50
|
+
if (!provider) {
|
|
51
|
+
throw new Error("openaiEmbeddingsApiKey not configured");
|
|
52
|
+
}
|
|
53
|
+
return provider;
|
|
54
|
+
}
|
|
55
|
+
function readFacts(diaryRoot) {
|
|
56
|
+
const factsPath = path.join(diaryRoot, "facts.jsonl");
|
|
57
|
+
if (!fs.existsSync(factsPath))
|
|
58
|
+
return [];
|
|
59
|
+
const raw = fs.readFileSync(factsPath, "utf8").trim();
|
|
60
|
+
if (!raw)
|
|
61
|
+
return [];
|
|
62
|
+
const facts = [];
|
|
63
|
+
for (const line of raw.split("\n")) {
|
|
64
|
+
const trimmed = line.trim();
|
|
65
|
+
if (!trimmed)
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
facts.push(JSON.parse(trimmed));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Skip corrupt lines (e.g. partial write from a crash).
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return facts;
|
|
75
|
+
}
|
|
76
|
+
function getLatestUserText(messages) {
|
|
77
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
78
|
+
const message = messages[i];
|
|
79
|
+
if (message.role !== "user")
|
|
80
|
+
continue;
|
|
81
|
+
if (typeof message.content !== "string")
|
|
82
|
+
continue;
|
|
83
|
+
const text = message.content.trim();
|
|
84
|
+
if (text.length > 0)
|
|
85
|
+
return text;
|
|
86
|
+
}
|
|
87
|
+
return "";
|
|
88
|
+
}
|
|
89
|
+
function cosineSimilarity(left, right) {
|
|
90
|
+
if (left.length === 0 || right.length === 0 || left.length !== right.length)
|
|
91
|
+
return 0;
|
|
92
|
+
let dot = 0;
|
|
93
|
+
let leftNorm = 0;
|
|
94
|
+
let rightNorm = 0;
|
|
95
|
+
for (let i = 0; i < left.length; i++) {
|
|
96
|
+
dot += left[i] * right[i];
|
|
97
|
+
leftNorm += left[i] * left[i];
|
|
98
|
+
rightNorm += right[i] * right[i];
|
|
99
|
+
}
|
|
100
|
+
if (leftNorm === 0 || rightNorm === 0)
|
|
101
|
+
return 0;
|
|
102
|
+
return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
|
|
103
|
+
}
|
|
104
|
+
async function searchDiaryFactsForQuery(query, facts, provider, options) {
|
|
105
|
+
const trimmed = query.trim();
|
|
106
|
+
if (!trimmed)
|
|
107
|
+
return [];
|
|
108
|
+
const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
|
|
109
|
+
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
110
|
+
const [queryEmbedding] = await provider.embed([trimmed]);
|
|
111
|
+
return facts
|
|
112
|
+
.map((fact) => ({
|
|
113
|
+
...fact,
|
|
114
|
+
score: cosineSimilarity(queryEmbedding, fact.embedding),
|
|
115
|
+
}))
|
|
116
|
+
.filter((fact) => fact.score >= minScore)
|
|
117
|
+
.sort((left, right) => right.score - left.score)
|
|
118
|
+
.slice(0, topK);
|
|
119
|
+
}
|
|
120
|
+
function readJournalIndex(journalDir) {
|
|
121
|
+
const indexPath = path.join(journalDir, ".index.json");
|
|
122
|
+
try {
|
|
123
|
+
const raw = fs.readFileSync(indexPath, "utf8");
|
|
124
|
+
const parsed = JSON.parse(raw);
|
|
125
|
+
if (!Array.isArray(parsed))
|
|
126
|
+
return [];
|
|
127
|
+
return parsed;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function searchJournalIndex(queryEmbedding, entries, options) {
|
|
134
|
+
const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
|
|
135
|
+
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
136
|
+
return entries
|
|
137
|
+
.filter((entry) => Array.isArray(entry.embedding) && entry.embedding.length > 0)
|
|
138
|
+
.map((entry) => ({
|
|
139
|
+
filename: entry.filename,
|
|
140
|
+
preview: entry.preview,
|
|
141
|
+
score: cosineSimilarity(queryEmbedding, entry.embedding),
|
|
142
|
+
}))
|
|
143
|
+
.filter((entry) => entry.score >= minScore)
|
|
144
|
+
.sort((left, right) => right.score - left.score)
|
|
145
|
+
.slice(0, topK);
|
|
146
|
+
}
|
|
147
|
+
function resolveJournalDir(diaryRoot, explicitJournalDir) {
|
|
148
|
+
if (explicitJournalDir)
|
|
149
|
+
return explicitJournalDir;
|
|
150
|
+
// journal/ is a sibling of diary/ at the agent root level
|
|
151
|
+
const agentRoot = path.dirname(diaryRoot);
|
|
152
|
+
return path.join(agentRoot, "journal");
|
|
153
|
+
}
|
|
154
|
+
async function injectNoteSearchContext(messages, options) {
|
|
155
|
+
try {
|
|
156
|
+
if (messages[0]?.role !== "system" || typeof messages[0].content !== "string")
|
|
157
|
+
return;
|
|
158
|
+
const query = getLatestUserText(messages);
|
|
159
|
+
if (!query)
|
|
160
|
+
return;
|
|
161
|
+
const diaryRoot = options?.diaryRoot ?? (0, diary_1.resolveDiaryRoot)();
|
|
162
|
+
const facts = readFacts(diaryRoot);
|
|
163
|
+
const journalDir = resolveJournalDir(diaryRoot, options?.journalDir);
|
|
164
|
+
const journalEntries = readJournalIndex(journalDir);
|
|
165
|
+
if (facts.length === 0 && journalEntries.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
// Build combined result lines tagged by source
|
|
168
|
+
const resultLines = [];
|
|
169
|
+
let queryEmbedding;
|
|
170
|
+
// Search diary entries
|
|
171
|
+
if (facts.length > 0) {
|
|
172
|
+
let found;
|
|
173
|
+
try {
|
|
174
|
+
const provider = options?.provider ?? createDefaultProvider();
|
|
175
|
+
found = await searchDiaryFactsForQuery(query, facts, provider, options);
|
|
176
|
+
// Compute query embedding for journal search while provider is available
|
|
177
|
+
if (journalEntries.length > 0) {
|
|
178
|
+
const [qe] = await provider.embed([query.trim()]);
|
|
179
|
+
queryEmbedding = qe;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Embeddings unavailable — fall back to substring matching
|
|
184
|
+
const lowerQuery = query.toLowerCase();
|
|
185
|
+
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
186
|
+
found = facts
|
|
187
|
+
.filter((fact) => fact.text.toLowerCase().includes(lowerQuery))
|
|
188
|
+
.slice(0, topK)
|
|
189
|
+
.map((fact) => ({ ...fact, score: 1 }));
|
|
190
|
+
if (found.length > 0) {
|
|
191
|
+
(0, runtime_1.emitNervesEvent)({
|
|
192
|
+
level: "warn",
|
|
193
|
+
component: "mind",
|
|
194
|
+
event: "mind.note_search_fallback",
|
|
195
|
+
message: "embeddings unavailable, used substring fallback",
|
|
196
|
+
meta: { matchCount: found.length },
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const fact of found) {
|
|
201
|
+
let meta = `score=${fact.score.toFixed(3)} source=${fact.source}`;
|
|
202
|
+
if (fact.provenance) {
|
|
203
|
+
if (fact.provenance.channel)
|
|
204
|
+
meta += ` channel=${fact.provenance.channel}`;
|
|
205
|
+
if (fact.provenance.friendName)
|
|
206
|
+
meta += ` friend=${fact.provenance.friendName}`;
|
|
207
|
+
if (fact.provenance.trust)
|
|
208
|
+
meta += ` trust=${fact.provenance.trust}`;
|
|
209
|
+
}
|
|
210
|
+
const tag = (0, provenance_trust_1.classifyProvenanceTrust)(fact.provenance) === "external" ? "diary/external" : "diary";
|
|
211
|
+
resultLines.push({
|
|
212
|
+
text: `[${tag}] ${fact.text} [${meta}]`,
|
|
213
|
+
score: fact.score,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Search journal entries (works whether diary had results or not)
|
|
218
|
+
if (journalEntries.length > 0) {
|
|
219
|
+
try {
|
|
220
|
+
if (!queryEmbedding) {
|
|
221
|
+
const provider = options?.provider ?? createDefaultProvider();
|
|
222
|
+
const [qe] = await provider.embed([query.trim()]);
|
|
223
|
+
queryEmbedding = qe;
|
|
224
|
+
}
|
|
225
|
+
if (queryEmbedding) {
|
|
226
|
+
const journalResults = searchJournalIndex(queryEmbedding, journalEntries, options);
|
|
227
|
+
for (const entry of journalResults) {
|
|
228
|
+
resultLines.push({
|
|
229
|
+
text: `[journal] ${entry.filename}: ${entry.preview} [score=${entry.score.toFixed(3)}]`,
|
|
230
|
+
score: entry.score,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Embeddings unavailable — no journal fallback
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (resultLines.length === 0)
|
|
240
|
+
return;
|
|
241
|
+
// Sort all results by score descending
|
|
242
|
+
resultLines.sort((left, right) => right.score - left.score);
|
|
243
|
+
const noteSection = resultLines
|
|
244
|
+
.map((entry, index) => `${index + 1}. ${entry.text}`)
|
|
245
|
+
.join("\n");
|
|
246
|
+
messages[0] = {
|
|
247
|
+
role: "system",
|
|
248
|
+
content: `${messages[0].content}\n\n## from my diary and journal\n${noteSection}`,
|
|
249
|
+
};
|
|
250
|
+
(0, runtime_1.emitNervesEvent)({
|
|
251
|
+
component: "mind",
|
|
252
|
+
event: "mind.note_search_context",
|
|
253
|
+
message: "note search injected",
|
|
254
|
+
meta: { count: resultLines.length },
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
(0, runtime_1.emitNervesEvent)({
|
|
259
|
+
level: "warn",
|
|
260
|
+
component: "mind",
|
|
261
|
+
event: "mind.note_search_context_error",
|
|
262
|
+
message: "note search failed",
|
|
263
|
+
meta: {
|
|
264
|
+
reason: error instanceof Error ? error.message : /* v8 ignore start -- defensive: non-Error catch branch @preserve */ String(error) /* v8 ignore stop */,
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|