@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
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.resetSafeWorkspaceSelection = resetSafeWorkspaceSelection;
|
|
37
|
-
exports.getActiveSafeWorkspaceSelection = getActiveSafeWorkspaceSelection;
|
|
38
|
-
exports.ensureSafeRepoWorkspace = ensureSafeRepoWorkspace;
|
|
39
|
-
exports.resolveSafeRepoPath = resolveSafeRepoPath;
|
|
40
|
-
const fs = __importStar(require("fs"));
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
const child_process_1 = require("child_process");
|
|
43
|
-
const identity_1 = require("./identity");
|
|
44
|
-
const runtime_1 = require("../nerves/runtime");
|
|
45
|
-
let activeSelection = null;
|
|
46
|
-
let cleanupHookRegistered = false;
|
|
47
|
-
function defaultNow() {
|
|
48
|
-
return Date.now();
|
|
49
|
-
}
|
|
50
|
-
function resolveAgentName(explicit) {
|
|
51
|
-
if (explicit && explicit.trim().length > 0)
|
|
52
|
-
return explicit.trim();
|
|
53
|
-
try {
|
|
54
|
-
return (0, identity_1.getAgentName)();
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return "slugger";
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function runGit(cwd, args, spawnSync) {
|
|
61
|
-
return spawnSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
|
|
62
|
-
}
|
|
63
|
-
function readStdout(result) {
|
|
64
|
-
return (result.stdout ?? Buffer.from("")).toString("utf-8").trim();
|
|
65
|
-
}
|
|
66
|
-
function readStderr(result) {
|
|
67
|
-
return (result.stderr ?? Buffer.from("")).toString("utf-8").trim();
|
|
68
|
-
}
|
|
69
|
-
function assertGitOk(result, action) {
|
|
70
|
-
if (result.error) {
|
|
71
|
-
throw result.error;
|
|
72
|
-
}
|
|
73
|
-
if (result.status !== 0) {
|
|
74
|
-
const detail = readStderr(result) || readStdout(result) || `exit ${result.status ?? "unknown"}`;
|
|
75
|
-
throw new Error(`${action} failed: ${detail}`);
|
|
76
|
-
}
|
|
77
|
-
return readStdout(result);
|
|
78
|
-
}
|
|
79
|
-
function isGitClone(repoRoot, spawnSync) {
|
|
80
|
-
const result = runGit(repoRoot, ["rev-parse", "--is-inside-work-tree"], spawnSync);
|
|
81
|
-
return result.status === 0 && readStdout(result) === "true";
|
|
82
|
-
}
|
|
83
|
-
function readCurrentBranch(repoRoot, spawnSync) {
|
|
84
|
-
return assertGitOk(runGit(repoRoot, ["rev-parse", "--abbrev-ref", "HEAD"], spawnSync), "git branch read");
|
|
85
|
-
}
|
|
86
|
-
function ensureFetchedOrigin(repoRoot, spawnSync) {
|
|
87
|
-
assertGitOk(runGit(repoRoot, ["fetch", "origin"], spawnSync), "git fetch origin");
|
|
88
|
-
}
|
|
89
|
-
function ensureMainFastForward(repoRoot, spawnSync) {
|
|
90
|
-
assertGitOk(runGit(repoRoot, ["pull", "--ff-only", "origin", "main"], spawnSync), "git pull --ff-only origin main");
|
|
91
|
-
}
|
|
92
|
-
function createDedicatedWorktree(repoRoot, workspaceRoot, branchSuffix, existsSync, mkdirSync, rmSync, spawnSync) {
|
|
93
|
-
mkdirSync(path.dirname(workspaceRoot), { recursive: true });
|
|
94
|
-
const branchName = `slugger/${branchSuffix}`;
|
|
95
|
-
if (existsSync(workspaceRoot)) {
|
|
96
|
-
rmSync(workspaceRoot, { recursive: true, force: true });
|
|
97
|
-
}
|
|
98
|
-
assertGitOk(runGit(repoRoot, ["worktree", "add", "-B", branchName, workspaceRoot, "origin/main"], spawnSync), "git worktree add");
|
|
99
|
-
return { workspaceRoot, created: true };
|
|
100
|
-
}
|
|
101
|
-
function createScratchClone(workspaceRoot, cloneUrl, existsSync, mkdirSync, rmSync, spawnSync) {
|
|
102
|
-
mkdirSync(path.dirname(workspaceRoot), { recursive: true });
|
|
103
|
-
if (existsSync(workspaceRoot)) {
|
|
104
|
-
rmSync(workspaceRoot, { recursive: true, force: true });
|
|
105
|
-
}
|
|
106
|
-
const result = spawnSync("git", ["clone", "--depth", "1", "--branch", "main", cloneUrl, workspaceRoot], {
|
|
107
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
108
|
-
});
|
|
109
|
-
assertGitOk(result, "git clone");
|
|
110
|
-
return { workspaceRoot, created: true };
|
|
111
|
-
}
|
|
112
|
-
function registerCleanupHook(options) {
|
|
113
|
-
if (cleanupHookRegistered)
|
|
114
|
-
return;
|
|
115
|
-
cleanupHookRegistered = true;
|
|
116
|
-
process.on("exit", () => {
|
|
117
|
-
if (!activeSelection?.cleanupAfterMerge)
|
|
118
|
-
return;
|
|
119
|
-
try {
|
|
120
|
-
options.rmSync(activeSelection.workspaceRoot, { recursive: true, force: true });
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
// best effort
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
function resetSafeWorkspaceSelection(options = {}) {
|
|
128
|
-
activeSelection = null;
|
|
129
|
-
if (!options.keepCleanupHookRegistered) {
|
|
130
|
-
cleanupHookRegistered = false;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
function getActiveSafeWorkspaceSelection() {
|
|
134
|
-
return activeSelection;
|
|
135
|
-
}
|
|
136
|
-
function ensureSafeRepoWorkspace(options = {}) {
|
|
137
|
-
if (activeSelection) {
|
|
138
|
-
return activeSelection;
|
|
139
|
-
}
|
|
140
|
-
const repoRoot = options.repoRoot ?? (0, identity_1.getRepoRoot)();
|
|
141
|
-
const agentName = resolveAgentName(options.agentName);
|
|
142
|
-
const canonicalRepoUrl = options.canonicalRepoUrl ?? identity_1.HARNESS_CANONICAL_REPO_URL;
|
|
143
|
-
const workspaceBase = options.workspaceRoot ?? (0, identity_1.getAgentRepoWorkspacesRoot)(agentName);
|
|
144
|
-
const spawnSync = options.spawnSync ?? child_process_1.spawnSync;
|
|
145
|
-
const existsSync = options.existsSync ?? fs.existsSync;
|
|
146
|
-
const mkdirSync = options.mkdirSync ?? fs.mkdirSync;
|
|
147
|
-
const rmSync = options.rmSync ?? fs.rmSync;
|
|
148
|
-
const now = options.now ?? defaultNow;
|
|
149
|
-
const stamp = String(now());
|
|
150
|
-
registerCleanupHook({ rmSync });
|
|
151
|
-
let selection;
|
|
152
|
-
if (isGitClone(repoRoot, spawnSync)) {
|
|
153
|
-
const branch = readCurrentBranch(repoRoot, spawnSync);
|
|
154
|
-
ensureFetchedOrigin(repoRoot, spawnSync);
|
|
155
|
-
if (branch === "main") {
|
|
156
|
-
ensureMainFastForward(repoRoot, spawnSync);
|
|
157
|
-
const worktreeRoot = path.join(workspaceBase, `ouroboros-main-${stamp}`);
|
|
158
|
-
const created = createDedicatedWorktree(repoRoot, worktreeRoot, `safe-workspace-${stamp}`, existsSync, mkdirSync, rmSync, spawnSync);
|
|
159
|
-
selection = {
|
|
160
|
-
runtimeKind: "clone-main",
|
|
161
|
-
repoRoot,
|
|
162
|
-
workspaceRoot: created.workspaceRoot,
|
|
163
|
-
sourceBranch: branch,
|
|
164
|
-
sourceCloneUrl: canonicalRepoUrl,
|
|
165
|
-
cleanupAfterMerge: false,
|
|
166
|
-
created: created.created,
|
|
167
|
-
note: `running from clone on main; fast-forwarded and created dedicated worktree ${created.workspaceRoot}`,
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
const worktreeRoot = path.join(workspaceBase, `ouroboros-origin-main-${stamp}`);
|
|
172
|
-
const created = createDedicatedWorktree(repoRoot, worktreeRoot, `safe-workspace-${stamp}`, existsSync, mkdirSync, rmSync, spawnSync);
|
|
173
|
-
selection = {
|
|
174
|
-
runtimeKind: "clone-non-main",
|
|
175
|
-
repoRoot,
|
|
176
|
-
workspaceRoot: created.workspaceRoot,
|
|
177
|
-
sourceBranch: branch,
|
|
178
|
-
sourceCloneUrl: canonicalRepoUrl,
|
|
179
|
-
cleanupAfterMerge: false,
|
|
180
|
-
created: created.created,
|
|
181
|
-
note: `running from branch ${branch}; defaulted new work from origin/main in dedicated worktree ${created.workspaceRoot}`,
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
const scratchRoot = path.join(workspaceBase, `ouroboros-scratch-${stamp}`);
|
|
187
|
-
const created = createScratchClone(scratchRoot, canonicalRepoUrl, existsSync, mkdirSync, rmSync, spawnSync);
|
|
188
|
-
selection = {
|
|
189
|
-
runtimeKind: "installed-runtime",
|
|
190
|
-
repoRoot,
|
|
191
|
-
workspaceRoot: created.workspaceRoot,
|
|
192
|
-
sourceBranch: null,
|
|
193
|
-
sourceCloneUrl: canonicalRepoUrl,
|
|
194
|
-
cleanupAfterMerge: true,
|
|
195
|
-
created: created.created,
|
|
196
|
-
note: `running from installed runtime/wrapper; created scratch clone ${created.workspaceRoot} from ${canonicalRepoUrl}`,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
activeSelection = selection;
|
|
200
|
-
(0, runtime_1.emitNervesEvent)({
|
|
201
|
-
component: "workspace",
|
|
202
|
-
event: "workspace.safe_repo_acquired",
|
|
203
|
-
message: "acquired safe repo workspace before local edits",
|
|
204
|
-
meta: {
|
|
205
|
-
runtimeKind: selection.runtimeKind,
|
|
206
|
-
repoRoot: selection.repoRoot,
|
|
207
|
-
workspaceRoot: selection.workspaceRoot,
|
|
208
|
-
sourceBranch: selection.sourceBranch,
|
|
209
|
-
sourceCloneUrl: selection.sourceCloneUrl,
|
|
210
|
-
cleanupAfterMerge: selection.cleanupAfterMerge,
|
|
211
|
-
},
|
|
212
|
-
});
|
|
213
|
-
return selection;
|
|
214
|
-
}
|
|
215
|
-
function resolveSafeRepoPath(options) {
|
|
216
|
-
const requestedPath = path.resolve(options.requestedPath);
|
|
217
|
-
const repoRoot = path.resolve(options.repoRoot ?? (0, identity_1.getRepoRoot)());
|
|
218
|
-
if (activeSelection && requestedPath.startsWith(activeSelection.workspaceRoot + path.sep)) {
|
|
219
|
-
return { selection: activeSelection, resolvedPath: requestedPath };
|
|
220
|
-
}
|
|
221
|
-
if (requestedPath !== repoRoot && !requestedPath.startsWith(repoRoot + path.sep)) {
|
|
222
|
-
return { selection: activeSelection, resolvedPath: requestedPath };
|
|
223
|
-
}
|
|
224
|
-
const selection = ensureSafeRepoWorkspace(options);
|
|
225
|
-
const relativePath = requestedPath === repoRoot ? "" : path.relative(repoRoot, requestedPath);
|
|
226
|
-
const resolvedPath = relativePath ? path.join(selection.workspaceRoot, relativePath) : selection.workspaceRoot;
|
|
227
|
-
return { selection, resolvedPath };
|
|
228
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.recallSession = recallSession;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const runtime_1 = require("../nerves/runtime");
|
|
39
|
-
function normalizeContent(content) {
|
|
40
|
-
if (typeof content === "string")
|
|
41
|
-
return content;
|
|
42
|
-
if (!Array.isArray(content))
|
|
43
|
-
return "";
|
|
44
|
-
return content
|
|
45
|
-
.map((part) => (part && typeof part === "object" && "type" in part && part.type === "text" && "text" in part
|
|
46
|
-
? String(part.text ?? "")
|
|
47
|
-
: ""))
|
|
48
|
-
.filter((text) => text.length > 0)
|
|
49
|
-
.join("");
|
|
50
|
-
}
|
|
51
|
-
function buildSummaryInstruction(friendId, channel, trustLevel) {
|
|
52
|
-
if (friendId === "self" && channel === "inner") {
|
|
53
|
-
return "summarize this session transcript fully and transparently. this is my own inner dialog — include all details, decisions, and reasoning.";
|
|
54
|
-
}
|
|
55
|
-
return `summarize this session transcript. the person asking has trust level: ${trustLevel}. family=full transparency, friend=share work and general topics but protect other people's identities, acquaintance=very guarded minimal disclosure.`;
|
|
56
|
-
}
|
|
57
|
-
function clip(text, limit = 160) {
|
|
58
|
-
const compact = text.replace(/\s+/g, " ").trim();
|
|
59
|
-
return compact.length > limit ? compact.slice(0, limit - 1) + "…" : compact;
|
|
60
|
-
}
|
|
61
|
-
function buildSnapshot(summary, tailMessages) {
|
|
62
|
-
const lines = [`recent focus: ${clip(summary, 240)}`];
|
|
63
|
-
const latestUser = [...tailMessages].reverse().find((message) => message.role === "user")?.content;
|
|
64
|
-
const latestAssistant = [...tailMessages].reverse().find((message) => message.role === "assistant")?.content;
|
|
65
|
-
if (latestUser) {
|
|
66
|
-
lines.push(`latest user: ${clip(latestUser)}`);
|
|
67
|
-
}
|
|
68
|
-
if (latestAssistant) {
|
|
69
|
-
lines.push(`latest assistant: ${clip(latestAssistant)}`);
|
|
70
|
-
}
|
|
71
|
-
return lines.join("\n");
|
|
72
|
-
}
|
|
73
|
-
async function recallSession(options) {
|
|
74
|
-
(0, runtime_1.emitNervesEvent)({
|
|
75
|
-
component: "daemon",
|
|
76
|
-
event: "daemon.session_recall",
|
|
77
|
-
message: "recalling session transcript tail",
|
|
78
|
-
meta: {
|
|
79
|
-
friendId: options.friendId,
|
|
80
|
-
channel: options.channel,
|
|
81
|
-
key: options.key,
|
|
82
|
-
messageCount: options.messageCount,
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
let raw;
|
|
86
|
-
try {
|
|
87
|
-
raw = fs.readFileSync(options.sessionPath, "utf-8");
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
return { kind: "missing" };
|
|
91
|
-
}
|
|
92
|
-
const parsed = JSON.parse(raw);
|
|
93
|
-
const tailMessages = (parsed.messages ?? [])
|
|
94
|
-
.map((message) => ({
|
|
95
|
-
role: typeof message.role === "string" ? message.role : "",
|
|
96
|
-
content: normalizeContent(message.content),
|
|
97
|
-
}))
|
|
98
|
-
.filter((message) => message.role !== "system" && message.content.length > 0)
|
|
99
|
-
.slice(-options.messageCount);
|
|
100
|
-
if (tailMessages.length === 0) {
|
|
101
|
-
return { kind: "empty" };
|
|
102
|
-
}
|
|
103
|
-
const transcript = tailMessages
|
|
104
|
-
.map((message) => `[${message.role}] ${message.content}`)
|
|
105
|
-
.join("\n");
|
|
106
|
-
const summary = options.summarize
|
|
107
|
-
? await options.summarize(transcript, buildSummaryInstruction(options.friendId, options.channel, options.trustLevel ?? "family"))
|
|
108
|
-
: transcript;
|
|
109
|
-
return {
|
|
110
|
-
kind: "ok",
|
|
111
|
-
transcript,
|
|
112
|
-
summary,
|
|
113
|
-
snapshot: buildSnapshot(summary, tailMessages),
|
|
114
|
-
tailMessages,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.cosineSimilarity = cosineSimilarity;
|
|
37
|
-
exports.recallFactsForQuery = recallFactsForQuery;
|
|
38
|
-
exports.injectAssociativeRecall = injectAssociativeRecall;
|
|
39
|
-
const fs = __importStar(require("fs"));
|
|
40
|
-
const path = __importStar(require("path"));
|
|
41
|
-
const config_1 = require("../heart/config");
|
|
42
|
-
const identity_1 = require("../heart/identity");
|
|
43
|
-
const runtime_1 = require("../nerves/runtime");
|
|
44
|
-
const DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small";
|
|
45
|
-
const DEFAULT_MIN_SCORE = 0.5;
|
|
46
|
-
const DEFAULT_TOP_K = 3;
|
|
47
|
-
class OpenAIEmbeddingProvider {
|
|
48
|
-
apiKey;
|
|
49
|
-
model;
|
|
50
|
-
constructor(apiKey, model = DEFAULT_EMBEDDING_MODEL) {
|
|
51
|
-
this.apiKey = apiKey;
|
|
52
|
-
this.model = model;
|
|
53
|
-
}
|
|
54
|
-
async embed(texts) {
|
|
55
|
-
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
},
|
|
61
|
-
body: JSON.stringify({
|
|
62
|
-
model: this.model,
|
|
63
|
-
input: texts,
|
|
64
|
-
}),
|
|
65
|
-
});
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(`embedding request failed: ${response.status} ${response.statusText}`);
|
|
68
|
-
}
|
|
69
|
-
const payload = (await response.json());
|
|
70
|
-
if (!payload.data || payload.data.length !== texts.length) {
|
|
71
|
-
throw new Error("embedding response missing expected vectors");
|
|
72
|
-
}
|
|
73
|
-
return payload.data.map((entry) => entry.embedding);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function createDefaultProvider() {
|
|
77
|
-
const apiKey = (0, config_1.getOpenAIEmbeddingsApiKey)();
|
|
78
|
-
if (!apiKey) {
|
|
79
|
-
throw new Error("openaiEmbeddingsApiKey not configured");
|
|
80
|
-
}
|
|
81
|
-
return new OpenAIEmbeddingProvider(apiKey);
|
|
82
|
-
}
|
|
83
|
-
function readFacts(memoryRoot) {
|
|
84
|
-
const factsPath = path.join(memoryRoot, "facts.jsonl");
|
|
85
|
-
if (!fs.existsSync(factsPath))
|
|
86
|
-
return [];
|
|
87
|
-
const raw = fs.readFileSync(factsPath, "utf8").trim();
|
|
88
|
-
if (!raw)
|
|
89
|
-
return [];
|
|
90
|
-
const facts = [];
|
|
91
|
-
for (const line of raw.split("\n")) {
|
|
92
|
-
const trimmed = line.trim();
|
|
93
|
-
if (!trimmed)
|
|
94
|
-
continue;
|
|
95
|
-
try {
|
|
96
|
-
facts.push(JSON.parse(trimmed));
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
// Skip corrupt lines (e.g. partial write from a crash).
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return facts;
|
|
103
|
-
}
|
|
104
|
-
function getLatestUserText(messages) {
|
|
105
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
106
|
-
const message = messages[i];
|
|
107
|
-
if (message.role !== "user")
|
|
108
|
-
continue;
|
|
109
|
-
if (typeof message.content !== "string")
|
|
110
|
-
continue;
|
|
111
|
-
const text = message.content.trim();
|
|
112
|
-
if (text.length > 0)
|
|
113
|
-
return text;
|
|
114
|
-
}
|
|
115
|
-
return "";
|
|
116
|
-
}
|
|
117
|
-
function cosineSimilarity(left, right) {
|
|
118
|
-
if (left.length === 0 || right.length === 0 || left.length !== right.length)
|
|
119
|
-
return 0;
|
|
120
|
-
let dot = 0;
|
|
121
|
-
let leftNorm = 0;
|
|
122
|
-
let rightNorm = 0;
|
|
123
|
-
for (let i = 0; i < left.length; i++) {
|
|
124
|
-
dot += left[i] * right[i];
|
|
125
|
-
leftNorm += left[i] * left[i];
|
|
126
|
-
rightNorm += right[i] * right[i];
|
|
127
|
-
}
|
|
128
|
-
if (leftNorm === 0 || rightNorm === 0)
|
|
129
|
-
return 0;
|
|
130
|
-
return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
|
|
131
|
-
}
|
|
132
|
-
async function recallFactsForQuery(query, facts, provider, options) {
|
|
133
|
-
const trimmed = query.trim();
|
|
134
|
-
if (!trimmed)
|
|
135
|
-
return [];
|
|
136
|
-
const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
|
|
137
|
-
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
138
|
-
const [queryEmbedding] = await provider.embed([trimmed]);
|
|
139
|
-
return facts
|
|
140
|
-
.map((fact) => ({
|
|
141
|
-
...fact,
|
|
142
|
-
score: cosineSimilarity(queryEmbedding, fact.embedding),
|
|
143
|
-
}))
|
|
144
|
-
.filter((fact) => fact.score >= minScore)
|
|
145
|
-
.sort((left, right) => right.score - left.score)
|
|
146
|
-
.slice(0, topK);
|
|
147
|
-
}
|
|
148
|
-
async function injectAssociativeRecall(messages, options) {
|
|
149
|
-
try {
|
|
150
|
-
if (messages[0]?.role !== "system" || typeof messages[0].content !== "string")
|
|
151
|
-
return;
|
|
152
|
-
const query = getLatestUserText(messages);
|
|
153
|
-
if (!query)
|
|
154
|
-
return;
|
|
155
|
-
const memoryRoot = options?.memoryRoot ?? path.join((0, identity_1.getAgentRoot)(), "psyche", "memory");
|
|
156
|
-
const facts = readFacts(memoryRoot);
|
|
157
|
-
if (facts.length === 0)
|
|
158
|
-
return;
|
|
159
|
-
let recalled;
|
|
160
|
-
try {
|
|
161
|
-
const provider = options?.provider ?? createDefaultProvider();
|
|
162
|
-
recalled = await recallFactsForQuery(query, facts, provider, options);
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
// Embeddings unavailable — fall back to substring matching
|
|
166
|
-
const lowerQuery = query.toLowerCase();
|
|
167
|
-
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
168
|
-
recalled = facts
|
|
169
|
-
.filter((fact) => fact.text.toLowerCase().includes(lowerQuery))
|
|
170
|
-
.slice(0, topK)
|
|
171
|
-
.map((fact) => ({ ...fact, score: 1 }));
|
|
172
|
-
if (recalled.length > 0) {
|
|
173
|
-
(0, runtime_1.emitNervesEvent)({
|
|
174
|
-
level: "warn",
|
|
175
|
-
component: "mind",
|
|
176
|
-
event: "mind.associative_recall_fallback",
|
|
177
|
-
message: "embeddings unavailable, used substring fallback",
|
|
178
|
-
meta: { matchCount: recalled.length },
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (recalled.length === 0)
|
|
183
|
-
return;
|
|
184
|
-
const recallSection = recalled
|
|
185
|
-
.map((fact, index) => `${index + 1}. ${fact.text} [score=${fact.score.toFixed(3)} source=${fact.source}]`)
|
|
186
|
-
.join("\n");
|
|
187
|
-
messages[0] = {
|
|
188
|
-
role: "system",
|
|
189
|
-
content: `${messages[0].content}\n\n## recalled context\n${recallSection}`,
|
|
190
|
-
};
|
|
191
|
-
(0, runtime_1.emitNervesEvent)({
|
|
192
|
-
component: "mind",
|
|
193
|
-
event: "mind.associative_recall",
|
|
194
|
-
message: "associative recall injected",
|
|
195
|
-
meta: { count: recalled.length },
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
(0, runtime_1.emitNervesEvent)({
|
|
200
|
-
level: "warn",
|
|
201
|
-
component: "mind",
|
|
202
|
-
event: "mind.associative_recall_error",
|
|
203
|
-
message: "associative recall failed",
|
|
204
|
-
meta: {
|
|
205
|
-
reason: error instanceof Error ? error.message : /* v8 ignore start -- defensive: non-Error catch branch @preserve */ String(error) /* v8 ignore stop */,
|
|
206
|
-
},
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildTaskBoard = buildTaskBoard;
|
|
4
|
-
exports.boardStatus = boardStatus;
|
|
5
|
-
exports.boardAction = boardAction;
|
|
6
|
-
exports.boardDeps = boardDeps;
|
|
7
|
-
exports.boardSessions = boardSessions;
|
|
8
|
-
const runtime_1 = require("../../nerves/runtime");
|
|
9
|
-
const transitions_1 = require("./transitions");
|
|
10
|
-
const BOARD_STATUS_ORDER = [
|
|
11
|
-
"blocked",
|
|
12
|
-
"processing",
|
|
13
|
-
"collaborating",
|
|
14
|
-
"drafting",
|
|
15
|
-
"validating",
|
|
16
|
-
"paused",
|
|
17
|
-
"done",
|
|
18
|
-
];
|
|
19
|
-
function compactName(task) {
|
|
20
|
-
const suffix = task.stem.replace(/^\d{4}-\d{2}-\d{2}-\d{4}-/, "");
|
|
21
|
-
return suffix.length > 0 ? suffix : task.stem;
|
|
22
|
-
}
|
|
23
|
-
function groupByStatus(tasks) {
|
|
24
|
-
const grouped = {
|
|
25
|
-
drafting: [],
|
|
26
|
-
processing: [],
|
|
27
|
-
validating: [],
|
|
28
|
-
collaborating: [],
|
|
29
|
-
paused: [],
|
|
30
|
-
blocked: [],
|
|
31
|
-
done: [],
|
|
32
|
-
};
|
|
33
|
-
for (const task of tasks) {
|
|
34
|
-
grouped[task.status].push(compactName(task));
|
|
35
|
-
}
|
|
36
|
-
for (const status of transitions_1.TASK_VALID_STATUSES) {
|
|
37
|
-
grouped[status].sort();
|
|
38
|
-
}
|
|
39
|
-
return grouped;
|
|
40
|
-
}
|
|
41
|
-
function unresolvedDependencies(index) {
|
|
42
|
-
const stems = new Set(index.tasks.map((task) => task.stem));
|
|
43
|
-
const unresolved = [];
|
|
44
|
-
for (const task of index.tasks) {
|
|
45
|
-
const deps = Array.isArray(task.frontmatter.depends_on) ? task.frontmatter.depends_on : [];
|
|
46
|
-
for (const dep of deps) {
|
|
47
|
-
if (typeof dep === "string" && dep.trim() && !stems.has(dep)) {
|
|
48
|
-
unresolved.push(`${task.stem} -> missing ${dep}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return unresolved.sort();
|
|
53
|
-
}
|
|
54
|
-
function activeSessionLines(tasks) {
|
|
55
|
-
const active = tasks.filter((task) => {
|
|
56
|
-
const session = task.frontmatter.active_session;
|
|
57
|
-
const codingSession = task.frontmatter.coding_session;
|
|
58
|
-
return Boolean(session) || Boolean(codingSession);
|
|
59
|
-
});
|
|
60
|
-
return active.map((task) => task.stem).sort();
|
|
61
|
-
}
|
|
62
|
-
function activeBridgeLines(tasks) {
|
|
63
|
-
return tasks
|
|
64
|
-
.filter((task) => typeof task.frontmatter.active_bridge === "string" && String(task.frontmatter.active_bridge).trim())
|
|
65
|
-
.map((task) => `${task.stem} -> ${String(task.frontmatter.active_bridge).trim()}`)
|
|
66
|
-
.sort();
|
|
67
|
-
}
|
|
68
|
-
function actionRequired(index, byStatus) {
|
|
69
|
-
const actions = [...index.parseErrors, ...index.invalidFilenames.map((filePath) => `bad filename: ${filePath}`)];
|
|
70
|
-
if (byStatus.blocked.length > 0) {
|
|
71
|
-
actions.push(`blocked tasks: ${byStatus.blocked.join(", ")}`);
|
|
72
|
-
}
|
|
73
|
-
const missingCategory = index.tasks
|
|
74
|
-
.filter((task) => !task.category || !task.category.trim())
|
|
75
|
-
.map((task) => `missing category: ${task.stem}`);
|
|
76
|
-
return [...actions, ...missingCategory];
|
|
77
|
-
}
|
|
78
|
-
function buildTaskBoard(index) {
|
|
79
|
-
(0, runtime_1.emitNervesEvent)({
|
|
80
|
-
event: "mind.step_start",
|
|
81
|
-
component: "mind",
|
|
82
|
-
message: "building task board",
|
|
83
|
-
meta: { taskCount: index.tasks.length },
|
|
84
|
-
});
|
|
85
|
-
const byStatus = groupByStatus(index.tasks);
|
|
86
|
-
const counts = transitions_1.TASK_VALID_STATUSES.map((status) => `${status}:${byStatus[status].length}`).join(" ");
|
|
87
|
-
const processing = byStatus.processing.length > 0 ? `\n processing: ${byStatus.processing.join(", ")}` : "";
|
|
88
|
-
const blocked = byStatus.blocked.length > 0 ? `\n blocked: ${byStatus.blocked.join(", ")}` : "";
|
|
89
|
-
const compact = `[Tasks] ${counts}${processing}${blocked}`;
|
|
90
|
-
const fullLines = [];
|
|
91
|
-
for (const status of BOARD_STATUS_ORDER) {
|
|
92
|
-
const names = byStatus[status];
|
|
93
|
-
if (status === "done" && names.length === 0)
|
|
94
|
-
continue;
|
|
95
|
-
fullLines.push(`## ${status}`);
|
|
96
|
-
fullLines.push(names.length > 0 ? names.map((name) => `- ${name}`).join("\n") : "- (none)");
|
|
97
|
-
}
|
|
98
|
-
const unresolved = unresolvedDependencies(index);
|
|
99
|
-
if (unresolved.length > 0) {
|
|
100
|
-
fullLines.push("## dependencies");
|
|
101
|
-
fullLines.push(unresolved.map((line) => `- ${line}`).join("\n"));
|
|
102
|
-
}
|
|
103
|
-
const active = activeSessionLines(index.tasks);
|
|
104
|
-
if (active.length > 0) {
|
|
105
|
-
fullLines.push("## active sessions");
|
|
106
|
-
fullLines.push(active.map((line) => `- ${line}`).join("\n"));
|
|
107
|
-
}
|
|
108
|
-
const activeBridges = activeBridgeLines(index.tasks);
|
|
109
|
-
if (activeBridges.length > 0) {
|
|
110
|
-
fullLines.push("## active bridges");
|
|
111
|
-
fullLines.push(activeBridges.map((line) => `- ${line}`).join("\n"));
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
compact,
|
|
115
|
-
full: fullLines.join("\n\n"),
|
|
116
|
-
byStatus,
|
|
117
|
-
actionRequired: actionRequired(index, byStatus),
|
|
118
|
-
unresolvedDependencies: unresolved,
|
|
119
|
-
activeSessions: active,
|
|
120
|
-
activeBridges,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
function boardStatus(board, status) {
|
|
124
|
-
return board.byStatus[status] ?? [];
|
|
125
|
-
}
|
|
126
|
-
function boardAction(board) {
|
|
127
|
-
return board.actionRequired;
|
|
128
|
-
}
|
|
129
|
-
function boardDeps(board) {
|
|
130
|
-
return board.unresolvedDependencies;
|
|
131
|
-
}
|
|
132
|
-
function boardSessions(board) {
|
|
133
|
-
return board.activeSessions;
|
|
134
|
-
}
|