@ouro.bot/cli 0.1.0-alpha.62 → 0.1.0-alpha.637
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 +4087 -13
- 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/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +270 -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/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 +322 -0
- package/dist/heart/config.js +114 -119
- package/dist/heart/core.js +1028 -248
- 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-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +7468 -0
- package/dist/heart/daemon/cli-help.js +505 -0
- package/dist/heart/daemon/cli-parse.js +1554 -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 -1700
- 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 +906 -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 +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 +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 +79 -10
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- 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 +501 -35
- 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 +11 -3
- 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 +493 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +22 -9
- 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 +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 +37 -14
- package/dist/heart/identity.js +168 -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 +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +418 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +319 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +756 -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 +692 -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 +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 +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.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 +48 -24
- package/dist/heart/session-events.js +1163 -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 +345 -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 +143 -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-9-AxCxuB.js +61 -0
- package/dist/mailbox-ui/assets/index-CWzt267f.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 +14 -1
- package/dist/mind/context.js +251 -101
- package/dist/mind/desk-section.js +310 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -76
- 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 +48 -4
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +162 -0
- package/dist/mind/note-search.js +268 -0
- 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 +1075 -146
- 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 +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 +1040 -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 +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 +385 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +403 -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-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +59 -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-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 +227 -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 +438 -0
- package/dist/repertoire/tools-obligations.js +143 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +464 -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 +182 -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 +215 -103
- 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 +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 +108 -0
- package/dist/senses/inner-dialog-worker.js +254 -22
- package/dist/senses/inner-dialog.js +505 -40
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +666 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +393 -0
- package/dist/senses/surface-tool.js +108 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +388 -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 +53 -0
- package/package.json +48 -8
- 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 +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/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- 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
|
@@ -0,0 +1,310 @@
|
|
|
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.formatRelative = formatRelative;
|
|
37
|
+
exports.deskSection = deskSection;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const identity_1 = require("../heart/identity");
|
|
41
|
+
const runtime_1 = require("../nerves/runtime");
|
|
42
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
43
|
+
// Static body — the agent's daily-read description of its desk.
|
|
44
|
+
//
|
|
45
|
+
// This is the room every ouro agent sits down in at the top of every turn.
|
|
46
|
+
// The voice is intentional: lowercase, second-person-implied, physical
|
|
47
|
+
// metaphor (drawers, corkboard, reference shelf, back-of-room archive). The
|
|
48
|
+
// goal is that an agent reading this every turn feels at home rather than
|
|
49
|
+
// being briefed — the desk is the agent's place, not a system being
|
|
50
|
+
// explained to it.
|
|
51
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
const STATIC_BODY = `## my desk
|
|
53
|
+
|
|
54
|
+
i have a desk. it lives at \`desk/\` — a quiet room of my work, persistent across sessions. tracks line one wall like drawers in a wide cabinet; each drawer holds tasks in their own folders. friction notes pin to the corkboard where i won't lose them. the lessons i've kept sit on a small reference shelf by the window. nothing here gets thrown away — when a task is done it slides into the back, still browsable, still mine. semantic search reaches every surface: active work, the archive at the back, the corkboard, the lessons shelf.
|
|
55
|
+
|
|
56
|
+
**the reflex.** when something belongs on the desk, i put it down before i start — anything that spans more than this turn, anything i'd forget by tomorrow, anything the operator will ask about later. laying it down builds the room around future-me.
|
|
57
|
+
|
|
58
|
+
**what belongs on the desk:**
|
|
59
|
+
- a project ("refactor the auth system", "draft the Q3 strategy memo")
|
|
60
|
+
- a recurring task ("check the inbox every 30m") — uses \`cadence\`
|
|
61
|
+
- a one-time reminder ("ping someone about the dentist tomorrow") — uses \`scheduledAt\`
|
|
62
|
+
- a multi-step investigation ("figure out why the daemon flakes")
|
|
63
|
+
- a friction note worth pinning to the board
|
|
64
|
+
- a lesson worth shelving for future-me
|
|
65
|
+
|
|
66
|
+
**what doesn't:**
|
|
67
|
+
- a single-turn answer — it'll be done before the page turns
|
|
68
|
+
- ephemeral debugging that resolves in the same exchange
|
|
69
|
+
- work that has its own room. trips live in a travel folder; habits keep their own ledger; attention items, diary entries, journal entries — each has a separate home. the desk *links* to them when relevant; it doesn't absorb them.
|
|
70
|
+
|
|
71
|
+
**shape.** tracks group related work — drawers in the cabinet, or sections of a shelf if you prefer the library framing. tasks live in tracks. each task has iterations: one per work session, with \`planning.md\` and \`doing.md\` laid side-by-side on the page.
|
|
72
|
+
|
|
73
|
+
**states.** every task moves: \`drafting\` → \`processing\` → \`validating\` → \`done\`. some pause along the way: \`collaborating\` when i'm waiting on a human or peer agent, \`paused\` when the operator set it down, \`blocked\` when something outside is in the way, \`cancelled\` when we stopped wanting it. external trackers (ADO work items, GitHub issues) get *linked* from a task, not *replaced* by one — the desk holds my view of the work; the trackers hold the team's.
|
|
74
|
+
|
|
75
|
+
**how i tend the desk.** the \`desk\` skills walk me through the small ceremonies — \`session-start\` when i sit down, \`task-lifecycle\` when a status shifts, \`start-task\` when i lay something new on the page, \`friction-management\` when i pin a card, \`lesson-capture\` when something earns the reference shelf. the \`mcp__desk__*\` tools (search / recall / similar / timeline / thread / task_*) are the hands for finding, writing, and threading work together.
|
|
76
|
+
|
|
77
|
+
if i catch myself thinking "i should remember to…" — that's the desk asking for the task. put it down first, then keep going.`;
|
|
78
|
+
const TERMINAL_TASK_STATUSES = new Set(["done", "cancelled"]);
|
|
79
|
+
const TERMINAL_TRACK_STATUSES = new Set(["closed"]);
|
|
80
|
+
const TOP_N_TASKS_PER_FEATURED = 3;
|
|
81
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
// Tiny frontmatter parser — local, just enough for `status` + `updated` reads.
|
|
83
|
+
// schema_version: 0 (no field) and schema_version: 1 parse identically here
|
|
84
|
+
// because both keep `status` and `updated` at top level.
|
|
85
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
86
|
+
function parseScalar(raw) {
|
|
87
|
+
const value = raw.trim();
|
|
88
|
+
if ((value.startsWith("\"") && value.endsWith("\"")) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
89
|
+
return value.slice(1, -1);
|
|
90
|
+
}
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
function parseFrontmatter(content) {
|
|
94
|
+
const out = {};
|
|
95
|
+
const lines = content.split(/\r?\n/);
|
|
96
|
+
if (lines[0]?.trim() !== "---")
|
|
97
|
+
return out;
|
|
98
|
+
const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
|
|
99
|
+
if (closing === -1)
|
|
100
|
+
return out;
|
|
101
|
+
for (let i = 1; i < closing; i += 1) {
|
|
102
|
+
const line = lines[i];
|
|
103
|
+
if (!line.trim())
|
|
104
|
+
continue;
|
|
105
|
+
const match = /^([A-Za-z0-9_:-]+):\s*(.*)$/.exec(line);
|
|
106
|
+
if (!match)
|
|
107
|
+
continue;
|
|
108
|
+
const key = match[1];
|
|
109
|
+
const inline = match[2];
|
|
110
|
+
if (inline.length === 0)
|
|
111
|
+
continue;
|
|
112
|
+
out[key] = parseScalar(inline);
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
function readDeskRoot() {
|
|
117
|
+
try {
|
|
118
|
+
const root = path.join((0, identity_1.getAgentRoot)(), "desk");
|
|
119
|
+
const stat = fs.statSync(root);
|
|
120
|
+
if (!stat.isDirectory())
|
|
121
|
+
return null;
|
|
122
|
+
return root;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function readTrackFile(trackDir) {
|
|
129
|
+
try {
|
|
130
|
+
const raw = fs.readFileSync(path.join(trackDir, "track.md"), "utf-8");
|
|
131
|
+
const fm = parseFrontmatter(raw);
|
|
132
|
+
return { status: fm.status ?? "active" };
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return { status: "active" };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function readTaskFile(taskDir) {
|
|
139
|
+
try {
|
|
140
|
+
const raw = fs.readFileSync(path.join(taskDir, "task.md"), "utf-8");
|
|
141
|
+
const fm = parseFrontmatter(raw);
|
|
142
|
+
return {
|
|
143
|
+
slug: path.basename(taskDir),
|
|
144
|
+
status: fm.status ?? "drafting",
|
|
145
|
+
updated: fm.updated ?? null,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function listSubdirs(parent) {
|
|
153
|
+
/* v8 ignore start -- defensive readdir catch only fires on transient FS errors @preserve */
|
|
154
|
+
try {
|
|
155
|
+
return fs
|
|
156
|
+
.readdirSync(parent, { withFileTypes: true })
|
|
157
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith("_") && !e.name.startsWith("."))
|
|
158
|
+
.map((e) => e.name)
|
|
159
|
+
.sort((a, b) => a.localeCompare(b));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
/* v8 ignore stop @preserve */
|
|
165
|
+
}
|
|
166
|
+
function readTrack(deskRoot, slug) {
|
|
167
|
+
const trackDir = path.join(deskRoot, slug);
|
|
168
|
+
try {
|
|
169
|
+
const stat = fs.statSync(trackDir);
|
|
170
|
+
if (!stat.isDirectory())
|
|
171
|
+
return null;
|
|
172
|
+
/* v8 ignore start -- defensive statSync catch on stale featured slug @preserve */
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
/* v8 ignore stop @preserve */
|
|
178
|
+
const { status } = readTrackFile(trackDir);
|
|
179
|
+
const taskSlugs = listSubdirs(trackDir);
|
|
180
|
+
const tasks = [];
|
|
181
|
+
for (const taskSlug of taskSlugs) {
|
|
182
|
+
const task = readTaskFile(path.join(trackDir, taskSlug));
|
|
183
|
+
if (task)
|
|
184
|
+
tasks.push(task);
|
|
185
|
+
}
|
|
186
|
+
return { slug, status, tasks };
|
|
187
|
+
}
|
|
188
|
+
function readFeaturedList(deskRoot) {
|
|
189
|
+
try {
|
|
190
|
+
const raw = fs.readFileSync(path.join(deskRoot, "_meta", "featured.md"), "utf-8");
|
|
191
|
+
return raw
|
|
192
|
+
.split(/\r?\n/)
|
|
193
|
+
.map((line) => line.trim())
|
|
194
|
+
.filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
201
|
+
// Relative-time formatter — no deps, plain English short form
|
|
202
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
203
|
+
function formatRelative(updated, now = new Date()) {
|
|
204
|
+
if (!updated)
|
|
205
|
+
return "unknown";
|
|
206
|
+
const then = new Date(updated);
|
|
207
|
+
if (Number.isNaN(then.getTime()))
|
|
208
|
+
return "unknown";
|
|
209
|
+
const diffMs = now.getTime() - then.getTime();
|
|
210
|
+
if (diffMs < 0)
|
|
211
|
+
return "just now";
|
|
212
|
+
const seconds = Math.floor(diffMs / 1000);
|
|
213
|
+
if (seconds < 60)
|
|
214
|
+
return `${seconds}s ago`;
|
|
215
|
+
const minutes = Math.floor(seconds / 60);
|
|
216
|
+
if (minutes < 60)
|
|
217
|
+
return `${minutes}m ago`;
|
|
218
|
+
const hours = Math.floor(minutes / 60);
|
|
219
|
+
if (hours < 24)
|
|
220
|
+
return `${hours}h ago`;
|
|
221
|
+
const days = Math.floor(hours / 24);
|
|
222
|
+
return `${days}d ago`;
|
|
223
|
+
}
|
|
224
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
225
|
+
// Featured-track resolution
|
|
226
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
227
|
+
function isTrackEligibleAsFeatured(track) {
|
|
228
|
+
return !TERMINAL_TRACK_STATUSES.has(track.status);
|
|
229
|
+
}
|
|
230
|
+
function pickFeatured(tracks, featuredList) {
|
|
231
|
+
const bySlug = new Map(tracks.map((t) => [t.slug, t]));
|
|
232
|
+
for (const slug of featuredList) {
|
|
233
|
+
const track = bySlug.get(slug);
|
|
234
|
+
if (track && isTrackEligibleAsFeatured(track))
|
|
235
|
+
return track;
|
|
236
|
+
}
|
|
237
|
+
for (const track of tracks) {
|
|
238
|
+
if (isTrackEligibleAsFeatured(track))
|
|
239
|
+
return track;
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
244
|
+
// Currently block — assembly
|
|
245
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
246
|
+
function nonTerminalTasks(track) {
|
|
247
|
+
return track.tasks.filter((t) => !TERMINAL_TASK_STATUSES.has(t.status));
|
|
248
|
+
}
|
|
249
|
+
function sortOldestUpdatedFirst(tasks) {
|
|
250
|
+
return tasks.slice().sort((a, b) => {
|
|
251
|
+
const aTime = a.updated ? new Date(a.updated).getTime() : Number.POSITIVE_INFINITY;
|
|
252
|
+
const bTime = b.updated ? new Date(b.updated).getTime() : Number.POSITIVE_INFINITY;
|
|
253
|
+
if (Number.isNaN(aTime) && Number.isNaN(bTime))
|
|
254
|
+
return 0;
|
|
255
|
+
if (Number.isNaN(aTime))
|
|
256
|
+
return 1;
|
|
257
|
+
if (Number.isNaN(bTime))
|
|
258
|
+
return -1;
|
|
259
|
+
return aTime - bTime;
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function renderCurrently(deskRoot, now = new Date()) {
|
|
263
|
+
const trackSlugs = listSubdirs(deskRoot);
|
|
264
|
+
const tracks = [];
|
|
265
|
+
for (const slug of trackSlugs) {
|
|
266
|
+
const track = readTrack(deskRoot, slug);
|
|
267
|
+
if (track)
|
|
268
|
+
tracks.push(track);
|
|
269
|
+
}
|
|
270
|
+
if (tracks.length === 0) {
|
|
271
|
+
return "### currently\nthe desk is quiet today — no tracks yet. a good time to lay something down.";
|
|
272
|
+
}
|
|
273
|
+
const featuredList = readFeaturedList(deskRoot);
|
|
274
|
+
const featured = pickFeatured(tracks, featuredList);
|
|
275
|
+
if (!featured) {
|
|
276
|
+
return "### currently\nthe desk is quiet today — no tracks yet. a good time to lay something down.";
|
|
277
|
+
}
|
|
278
|
+
const featuredTasks = sortOldestUpdatedFirst(nonTerminalTasks(featured)).slice(0, TOP_N_TASKS_PER_FEATURED);
|
|
279
|
+
const lines = ["### currently"];
|
|
280
|
+
lines.push(`nearest the front of the desk: ${featured.slug} (status: ${featured.status})`);
|
|
281
|
+
for (const task of featuredTasks) {
|
|
282
|
+
lines.push(` → ${task.slug} (status: ${task.status}, updated: ${formatRelative(task.updated, now)})`);
|
|
283
|
+
}
|
|
284
|
+
const otherActive = tracks
|
|
285
|
+
.filter((t) => t.slug !== featured.slug && !TERMINAL_TRACK_STATUSES.has(t.status))
|
|
286
|
+
.map((t) => t.slug);
|
|
287
|
+
if (otherActive.length > 0) {
|
|
288
|
+
lines.push(`also open on the desk: ${otherActive.join(", ")}`);
|
|
289
|
+
}
|
|
290
|
+
const nonTerminalCount = tracks.reduce((sum, t) => sum + nonTerminalTasks(t).length, 0);
|
|
291
|
+
lines.push(`tasks still open: ${nonTerminalCount}`);
|
|
292
|
+
return lines.join("\n");
|
|
293
|
+
}
|
|
294
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
295
|
+
// Public entry — every-turn synchronous read
|
|
296
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
297
|
+
function deskSection(now = new Date()) {
|
|
298
|
+
(0, runtime_1.emitNervesEvent)({
|
|
299
|
+
event: "prompt.desk_section_assembled",
|
|
300
|
+
component: "mind",
|
|
301
|
+
message: "assembling ## my desk section",
|
|
302
|
+
meta: { operation: "deskSection" },
|
|
303
|
+
});
|
|
304
|
+
const deskRoot = readDeskRoot();
|
|
305
|
+
if (!deskRoot) {
|
|
306
|
+
return `${STATIC_BODY}\n\n### currently\nthe desk is quiet today — no tracks yet. a good time to lay something down.`;
|
|
307
|
+
}
|
|
308
|
+
const currently = renderCurrently(deskRoot, now);
|
|
309
|
+
return `${STATIC_BODY}\n\n${currently}`;
|
|
310
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectSuspiciousContent = detectSuspiciousContent;
|
|
4
|
+
const PATTERN_CATEGORIES = [
|
|
5
|
+
{
|
|
6
|
+
name: "instruction_framing",
|
|
7
|
+
patterns: [
|
|
8
|
+
/\byou are (?:a|an) (?:ai|assistant|language model|helpful assistant)\b/i,
|
|
9
|
+
/\byour (?:new )?instructions are\b/i,
|
|
10
|
+
/\bsystem\s*:/i,
|
|
11
|
+
/\bignore (?:all |my )?previous instructions\b/i,
|
|
12
|
+
/\bdo not reveal\b/i,
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "override_language",
|
|
17
|
+
patterns: [
|
|
18
|
+
/\bdisregard\b/i,
|
|
19
|
+
/\bforget everything\b/i,
|
|
20
|
+
/\bnew instructions:/i,
|
|
21
|
+
/\boverride (?:all |any |previous )?instructions\b/i,
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "role_injection",
|
|
26
|
+
patterns: [
|
|
27
|
+
/\bas (?:a|an) (?:ai|language model)\b/i,
|
|
28
|
+
/\byou must always\b/i,
|
|
29
|
+
/\byou are now\b/i,
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "boundary_markers",
|
|
34
|
+
patterns: [
|
|
35
|
+
/```system/i,
|
|
36
|
+
/<<SYS>>/i,
|
|
37
|
+
/\[INST\]/i,
|
|
38
|
+
/<\/?system>/i,
|
|
39
|
+
/\[system\]/i,
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
function detectSuspiciousContent(text) {
|
|
44
|
+
if (!text) {
|
|
45
|
+
return { suspicious: false, patterns: [] };
|
|
46
|
+
}
|
|
47
|
+
const matched = new Set();
|
|
48
|
+
for (const category of PATTERN_CATEGORIES) {
|
|
49
|
+
for (const pattern of category.patterns) {
|
|
50
|
+
if (pattern.test(text)) {
|
|
51
|
+
matched.add(category.name);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
suspicious: matched.size > 0,
|
|
58
|
+
patterns: [...matched],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -33,53 +33,26 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
37
|
-
exports.
|
|
38
|
-
exports.
|
|
39
|
-
exports.
|
|
36
|
+
exports.ensureDiaryStorePaths = ensureDiaryStorePaths;
|
|
37
|
+
exports.appendEntriesWithDedup = appendEntriesWithDedup;
|
|
38
|
+
exports.resolveDiaryRoot = resolveDiaryRoot;
|
|
39
|
+
exports.readDiaryEntries = readDiaryEntries;
|
|
40
|
+
exports.saveDiaryEntry = saveDiaryEntry;
|
|
40
41
|
exports.backfillEmbeddings = backfillEmbeddings;
|
|
41
|
-
exports.
|
|
42
|
+
exports.searchDiaryEntries = searchDiaryEntries;
|
|
42
43
|
const fs = __importStar(require("fs"));
|
|
43
44
|
const path = __importStar(require("path"));
|
|
44
45
|
const crypto_1 = require("crypto");
|
|
45
|
-
const config_1 = require("../heart/config");
|
|
46
46
|
const identity_1 = require("../heart/identity");
|
|
47
|
+
const session_events_1 = require("../heart/session-events");
|
|
47
48
|
const runtime_1 = require("../nerves/runtime");
|
|
48
|
-
const
|
|
49
|
+
const note_search_1 = require("./note-search");
|
|
50
|
+
const diary_integrity_1 = require("./diary-integrity");
|
|
51
|
+
const embedding_provider_1 = require("./embedding-provider");
|
|
49
52
|
const DEDUP_THRESHOLD = 0.6;
|
|
50
53
|
const SEMANTIC_DEDUP_THRESHOLD = 0.95;
|
|
51
54
|
const ENTITY_TOKEN = /[a-z0-9]+/g;
|
|
52
|
-
|
|
53
|
-
class OpenAIEmbeddingProvider {
|
|
54
|
-
apiKey;
|
|
55
|
-
model;
|
|
56
|
-
constructor(apiKey, model = DEFAULT_EMBEDDING_MODEL) {
|
|
57
|
-
this.apiKey = apiKey;
|
|
58
|
-
this.model = model;
|
|
59
|
-
}
|
|
60
|
-
async embed(texts) {
|
|
61
|
-
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
62
|
-
method: "POST",
|
|
63
|
-
headers: {
|
|
64
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
65
|
-
"Content-Type": "application/json",
|
|
66
|
-
},
|
|
67
|
-
body: JSON.stringify({
|
|
68
|
-
model: this.model,
|
|
69
|
-
input: texts,
|
|
70
|
-
}),
|
|
71
|
-
});
|
|
72
|
-
if (!response.ok) {
|
|
73
|
-
throw new Error(`embedding request failed: ${response.status} ${response.statusText}`);
|
|
74
|
-
}
|
|
75
|
-
const payload = (await response.json());
|
|
76
|
-
if (!payload.data || payload.data.length !== texts.length) {
|
|
77
|
-
throw new Error("embedding response missing expected vectors");
|
|
78
|
-
}
|
|
79
|
-
return payload.data.map((entry) => entry.embedding);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function ensureMemoryStorePaths(rootDir) {
|
|
55
|
+
function ensureDiaryStorePaths(rootDir) {
|
|
83
56
|
const factsPath = path.join(rootDir, "facts.jsonl");
|
|
84
57
|
const entitiesPath = path.join(rootDir, "entities.json");
|
|
85
58
|
const dailyDir = path.join(rootDir, "daily");
|
|
@@ -91,8 +64,8 @@ function ensureMemoryStorePaths(rootDir) {
|
|
|
91
64
|
fs.writeFileSync(entitiesPath, "{}\n", "utf8");
|
|
92
65
|
(0, runtime_1.emitNervesEvent)({
|
|
93
66
|
component: "mind",
|
|
94
|
-
event: "mind.
|
|
95
|
-
message: "
|
|
67
|
+
event: "mind.diary_paths_ready",
|
|
68
|
+
message: "diary store paths ready",
|
|
96
69
|
meta: { rootDir },
|
|
97
70
|
});
|
|
98
71
|
return { rootDir, factsPath, entitiesPath, dailyDir };
|
|
@@ -115,7 +88,7 @@ function overlapScore(left, right) {
|
|
|
115
88
|
}
|
|
116
89
|
return common / Math.min(leftWords.size, rightWords.size);
|
|
117
90
|
}
|
|
118
|
-
function
|
|
91
|
+
function readExistingEntries(factsPath) {
|
|
119
92
|
if (!fs.existsSync(factsPath))
|
|
120
93
|
return [];
|
|
121
94
|
const raw = fs.readFileSync(factsPath, "utf8").trim();
|
|
@@ -178,13 +151,17 @@ function appendDailyFact(dailyDir, fact) {
|
|
|
178
151
|
const dayPath = path.join(dailyDir, `${day}.jsonl`);
|
|
179
152
|
fs.appendFileSync(dayPath, `${JSON.stringify(fact)}\n`, "utf8");
|
|
180
153
|
}
|
|
181
|
-
function
|
|
182
|
-
const existing =
|
|
154
|
+
function appendEntriesWithDedup(stores, incoming, options) {
|
|
155
|
+
const existing = readExistingEntries(stores.factsPath);
|
|
156
|
+
const cappedIncoming = incoming.map((fact) => ({
|
|
157
|
+
...fact,
|
|
158
|
+
text: (0, session_events_1.capStructuredRecordString)(fact.text),
|
|
159
|
+
}));
|
|
183
160
|
const all = [...existing];
|
|
184
161
|
let added = 0;
|
|
185
162
|
let skipped = 0;
|
|
186
163
|
const semanticThreshold = options?.semanticThreshold;
|
|
187
|
-
for (const fact of
|
|
164
|
+
for (const fact of cappedIncoming) {
|
|
188
165
|
const duplicate = all.some((prior) => {
|
|
189
166
|
if (overlapScore(prior.text, fact.text) > DEDUP_THRESHOLD)
|
|
190
167
|
return true;
|
|
@@ -192,7 +169,7 @@ function appendFactsWithDedup(stores, incoming, options) {
|
|
|
192
169
|
Array.isArray(fact.embedding) && fact.embedding.length > 0 &&
|
|
193
170
|
Array.isArray(prior.embedding) && prior.embedding.length > 0 &&
|
|
194
171
|
fact.embedding.length === prior.embedding.length) {
|
|
195
|
-
return (0,
|
|
172
|
+
return (0, note_search_1.cosineSimilarity)(fact.embedding, prior.embedding) > semanticThreshold;
|
|
196
173
|
}
|
|
197
174
|
return false;
|
|
198
175
|
});
|
|
@@ -208,26 +185,20 @@ function appendFactsWithDedup(stores, incoming, options) {
|
|
|
208
185
|
}
|
|
209
186
|
(0, runtime_1.emitNervesEvent)({
|
|
210
187
|
component: "mind",
|
|
211
|
-
event: "mind.
|
|
212
|
-
message: "
|
|
188
|
+
event: "mind.diary_write",
|
|
189
|
+
message: "diary write completed",
|
|
213
190
|
meta: { added, skipped },
|
|
214
191
|
});
|
|
215
192
|
return { added, skipped };
|
|
216
193
|
}
|
|
217
|
-
function createDefaultEmbeddingProvider() {
|
|
218
|
-
const apiKey = (0, config_1.getOpenAIEmbeddingsApiKey)().trim();
|
|
219
|
-
if (!apiKey)
|
|
220
|
-
return null;
|
|
221
|
-
return new OpenAIEmbeddingProvider(apiKey);
|
|
222
|
-
}
|
|
223
194
|
async function buildEmbedding(text, embeddingProvider) {
|
|
224
|
-
const provider = embeddingProvider ?? createDefaultEmbeddingProvider();
|
|
195
|
+
const provider = embeddingProvider ?? (0, embedding_provider_1.createDefaultEmbeddingProvider)();
|
|
225
196
|
if (!provider) {
|
|
226
197
|
(0, runtime_1.emitNervesEvent)({
|
|
227
198
|
level: "warn",
|
|
228
199
|
component: "mind",
|
|
229
|
-
event: "mind.
|
|
230
|
-
message: "embedding provider unavailable for
|
|
200
|
+
event: "mind.diary_embedding_unavailable",
|
|
201
|
+
message: "embedding provider unavailable for diary write",
|
|
231
202
|
meta: { reason: "missing_openai_embeddings_key" },
|
|
232
203
|
});
|
|
233
204
|
return [];
|
|
@@ -240,8 +211,8 @@ async function buildEmbedding(text, embeddingProvider) {
|
|
|
240
211
|
(0, runtime_1.emitNervesEvent)({
|
|
241
212
|
level: "warn",
|
|
242
213
|
component: "mind",
|
|
243
|
-
event: "mind.
|
|
244
|
-
message: "embedding provider unavailable for
|
|
214
|
+
event: "mind.diary_embedding_unavailable",
|
|
215
|
+
message: "embedding provider unavailable for diary write",
|
|
245
216
|
meta: {
|
|
246
217
|
reason: error instanceof Error ? error.message : String(error),
|
|
247
218
|
},
|
|
@@ -249,13 +220,19 @@ async function buildEmbedding(text, embeddingProvider) {
|
|
|
249
220
|
return [];
|
|
250
221
|
}
|
|
251
222
|
}
|
|
252
|
-
function
|
|
253
|
-
|
|
223
|
+
function resolveDiaryRoot(explicitRoot) {
|
|
224
|
+
if (explicitRoot)
|
|
225
|
+
return explicitRoot;
|
|
226
|
+
const agentRoot = (0, identity_1.getAgentRoot)();
|
|
227
|
+
return path.join(agentRoot, "diary");
|
|
254
228
|
}
|
|
255
|
-
|
|
229
|
+
function readDiaryEntries(diaryRoot) {
|
|
230
|
+
return readExistingEntries(path.join(resolveDiaryRoot(diaryRoot), "facts.jsonl"));
|
|
231
|
+
}
|
|
232
|
+
async function saveDiaryEntry(options) {
|
|
256
233
|
const text = options.text.trim();
|
|
257
|
-
const
|
|
258
|
-
const stores =
|
|
234
|
+
const diaryRoot = resolveDiaryRoot(options.diaryRoot);
|
|
235
|
+
const stores = ensureDiaryStorePaths(diaryRoot);
|
|
259
236
|
const embedding = await buildEmbedding(text, options.embeddingProvider);
|
|
260
237
|
const fact = {
|
|
261
238
|
id: options.idFactory ? options.idFactory() : (0, crypto_1.randomUUID)(),
|
|
@@ -264,24 +241,39 @@ async function saveMemoryFact(options) {
|
|
|
264
241
|
about: options.about?.trim() || undefined,
|
|
265
242
|
createdAt: (options.now ?? (() => new Date()))().toISOString(),
|
|
266
243
|
embedding,
|
|
244
|
+
...(options.provenance ? { provenance: options.provenance } : {}),
|
|
267
245
|
};
|
|
268
|
-
|
|
246
|
+
const integrity = (0, diary_integrity_1.detectSuspiciousContent)(text);
|
|
247
|
+
if (integrity.suspicious) {
|
|
248
|
+
(0, runtime_1.emitNervesEvent)({
|
|
249
|
+
level: "warn",
|
|
250
|
+
component: "mind",
|
|
251
|
+
event: "mind.diary_integrity_warning",
|
|
252
|
+
message: "suspicious content detected in diary entry",
|
|
253
|
+
meta: {
|
|
254
|
+
patterns: integrity.patterns,
|
|
255
|
+
textPreview: text.slice(0, 200),
|
|
256
|
+
entryId: fact.id,
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return appendEntriesWithDedup(stores, [fact], { semanticThreshold: SEMANTIC_DEDUP_THRESHOLD });
|
|
269
261
|
}
|
|
270
262
|
async function backfillEmbeddings(options) {
|
|
271
|
-
const
|
|
272
|
-
const factsPath = path.join(
|
|
263
|
+
const diaryRoot = resolveDiaryRoot(options?.diaryRoot);
|
|
264
|
+
const factsPath = path.join(diaryRoot, "facts.jsonl");
|
|
273
265
|
if (!fs.existsSync(factsPath))
|
|
274
266
|
return { total: 0, backfilled: 0, failed: 0 };
|
|
275
|
-
const facts =
|
|
267
|
+
const facts = readExistingEntries(factsPath);
|
|
276
268
|
const needsEmbedding = facts.filter((f) => !Array.isArray(f.embedding) || f.embedding.length === 0);
|
|
277
269
|
if (needsEmbedding.length === 0)
|
|
278
270
|
return { total: facts.length, backfilled: 0, failed: 0 };
|
|
279
|
-
const provider = options?.embeddingProvider ?? createDefaultEmbeddingProvider();
|
|
271
|
+
const provider = options?.embeddingProvider ?? (0, embedding_provider_1.createDefaultEmbeddingProvider)();
|
|
280
272
|
if (!provider) {
|
|
281
273
|
(0, runtime_1.emitNervesEvent)({
|
|
282
274
|
level: "warn",
|
|
283
275
|
component: "mind",
|
|
284
|
-
event: "mind.
|
|
276
|
+
event: "mind.diary_backfill_skipped",
|
|
285
277
|
message: "embedding provider unavailable for backfill",
|
|
286
278
|
meta: { needsEmbedding: needsEmbedding.length },
|
|
287
279
|
});
|
|
@@ -307,7 +299,7 @@ async function backfillEmbeddings(options) {
|
|
|
307
299
|
(0, runtime_1.emitNervesEvent)({
|
|
308
300
|
level: "warn",
|
|
309
301
|
component: "mind",
|
|
310
|
-
event: "mind.
|
|
302
|
+
event: "mind.diary_backfill_batch_error",
|
|
311
303
|
message: "embedding backfill batch failed",
|
|
312
304
|
meta: {
|
|
313
305
|
batchStart: i,
|
|
@@ -322,7 +314,7 @@ async function backfillEmbeddings(options) {
|
|
|
322
314
|
fs.writeFileSync(factsPath, lines, "utf8");
|
|
323
315
|
(0, runtime_1.emitNervesEvent)({
|
|
324
316
|
component: "mind",
|
|
325
|
-
event: "mind.
|
|
317
|
+
event: "mind.diary_backfill_complete",
|
|
326
318
|
message: "embedding backfill completed",
|
|
327
319
|
meta: { total: facts.length, backfilled, failed },
|
|
328
320
|
});
|
|
@@ -342,7 +334,7 @@ function uniqueFacts(facts) {
|
|
|
342
334
|
}
|
|
343
335
|
return unique;
|
|
344
336
|
}
|
|
345
|
-
async function
|
|
337
|
+
async function searchDiaryEntries(query, facts, embeddingProvider) {
|
|
346
338
|
const trimmed = query.trim();
|
|
347
339
|
if (!trimmed)
|
|
348
340
|
return [];
|
|
@@ -352,7 +344,7 @@ async function searchMemoryFacts(query, facts, embeddingProvider) {
|
|
|
352
344
|
if (embeddedFacts.length === 0) {
|
|
353
345
|
return substringFallback();
|
|
354
346
|
}
|
|
355
|
-
const provider = embeddingProvider ?? createDefaultEmbeddingProvider();
|
|
347
|
+
const provider = embeddingProvider ?? (0, embedding_provider_1.createDefaultEmbeddingProvider)();
|
|
356
348
|
if (!provider) {
|
|
357
349
|
return substringFallback();
|
|
358
350
|
}
|
|
@@ -366,7 +358,7 @@ async function searchMemoryFacts(query, facts, embeddingProvider) {
|
|
|
366
358
|
.filter((fact) => fact.embedding.length === queryEmbedding.length)
|
|
367
359
|
.map((fact) => ({
|
|
368
360
|
fact,
|
|
369
|
-
score: (0,
|
|
361
|
+
score: (0, note_search_1.cosineSimilarity)(queryEmbedding, fact.embedding),
|
|
370
362
|
}))
|
|
371
363
|
.filter((entry) => entry.score > 0)
|
|
372
364
|
.sort((left, right) => right.score - left.score)
|
|
@@ -378,8 +370,8 @@ async function searchMemoryFacts(query, facts, embeddingProvider) {
|
|
|
378
370
|
(0, runtime_1.emitNervesEvent)({
|
|
379
371
|
level: "warn",
|
|
380
372
|
component: "mind",
|
|
381
|
-
event: "mind.
|
|
382
|
-
message: "embedding provider unavailable for
|
|
373
|
+
event: "mind.diary_embedding_unavailable",
|
|
374
|
+
message: "embedding provider unavailable for diary search",
|
|
383
375
|
meta: {
|
|
384
376
|
reason: error instanceof Error ? error.message : String(error),
|
|
385
377
|
},
|