@ouro.bot/cli 0.1.0-alpha.65 → 0.1.0-alpha.651
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 +4157 -14
- 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 +118 -119
- package/dist/heart/core.js +1123 -247
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +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 +780 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +7480 -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 -1750
- package/dist/heart/daemon/daemon-entry.js +485 -2
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +932 -74
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +873 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +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/message-router.js +6 -2
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +14 -12
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +510 -40
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +35 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +493 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +229 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +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 +311 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +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 +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/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 +1051 -138
- 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 +1041 -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 +136 -25
- 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 +193 -77
- 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 +711 -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 +390 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5079 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +53 -0
- package/package.json +53 -10
- 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/daemon/update-hooks.js +0 -138
- 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
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.getSkillsDir = getSkillsDir;
|
|
37
|
+
exports.getHarnessSkillsDir = getHarnessSkillsDir;
|
|
37
38
|
exports.listSkills = listSkills;
|
|
38
39
|
exports.loadSkill = loadSkill;
|
|
39
40
|
exports.getLoadedSkills = getLoadedSkills;
|
|
@@ -42,6 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
42
43
|
const path = __importStar(require("path"));
|
|
43
44
|
const identity_1 = require("../heart/identity");
|
|
44
45
|
const runtime_1 = require("../nerves/runtime");
|
|
46
|
+
const plugins_1 = require("./plugins");
|
|
45
47
|
// Skills live in {agentRoot}/skills/ directory
|
|
46
48
|
function getSkillsDir() {
|
|
47
49
|
return path.join((0, identity_1.getAgentRoot)(), "skills");
|
|
@@ -50,6 +52,10 @@ function getSkillsDir() {
|
|
|
50
52
|
function getProtocolMirrorDir() {
|
|
51
53
|
return path.join(getSkillsDir(), "protocols");
|
|
52
54
|
}
|
|
55
|
+
// Harness-level skills live in {repoRoot}/skills/ directory.
|
|
56
|
+
function getHarnessSkillsDir() {
|
|
57
|
+
return path.join((0, identity_1.getRepoRoot)(), "skills");
|
|
58
|
+
}
|
|
53
59
|
function listMarkdownBasenames(dir) {
|
|
54
60
|
if (!fs.existsSync(dir))
|
|
55
61
|
return [];
|
|
@@ -59,7 +65,7 @@ function listMarkdownBasenames(dir) {
|
|
|
59
65
|
.map((f) => path.basename(f, ".md"))
|
|
60
66
|
.sort();
|
|
61
67
|
}
|
|
62
|
-
//
|
|
68
|
+
// process-local store for loaded skills
|
|
63
69
|
const loadedSkills = [];
|
|
64
70
|
function listSkills() {
|
|
65
71
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -70,7 +76,14 @@ function listSkills() {
|
|
|
70
76
|
});
|
|
71
77
|
const baseSkills = listMarkdownBasenames(getSkillsDir());
|
|
72
78
|
const protocolMirrors = listMarkdownBasenames(getProtocolMirrorDir());
|
|
73
|
-
const
|
|
79
|
+
const harnessSkills = listMarkdownBasenames(getHarnessSkillsDir());
|
|
80
|
+
const pluginSkills = (0, plugins_1.listPluginSkills)((0, plugins_1.listEnabledPlugins)());
|
|
81
|
+
// Agent skills (base + protocol) come first; harness skills are fallback;
|
|
82
|
+
// plugin skills surface after harness skills. Set deduplicates by name —
|
|
83
|
+
// agent overrides harness overrides plugins.
|
|
84
|
+
const skills = [
|
|
85
|
+
...new Set([...baseSkills, ...protocolMirrors, ...harnessSkills, ...pluginSkills]),
|
|
86
|
+
].sort();
|
|
74
87
|
(0, runtime_1.emitNervesEvent)({
|
|
75
88
|
event: "repertoire.load_end",
|
|
76
89
|
component: "repertoire",
|
|
@@ -88,6 +101,7 @@ function loadSkill(skillName) {
|
|
|
88
101
|
});
|
|
89
102
|
const directSkillPath = path.join(getSkillsDir(), `${skillName}.md`);
|
|
90
103
|
const protocolMirrorPath = path.join(getProtocolMirrorDir(), `${skillName}.md`);
|
|
104
|
+
const harnessSkillPath = path.join(getHarnessSkillsDir(), `${skillName}.md`);
|
|
91
105
|
let resolvedPath = null;
|
|
92
106
|
// 1) Direct agent skill.
|
|
93
107
|
if (fs.existsSync(directSkillPath)) {
|
|
@@ -97,6 +111,35 @@ function loadSkill(skillName) {
|
|
|
97
111
|
else if (fs.existsSync(protocolMirrorPath)) {
|
|
98
112
|
resolvedPath = protocolMirrorPath;
|
|
99
113
|
}
|
|
114
|
+
// 3) Harness-level skill (ships with npm package).
|
|
115
|
+
else if (fs.existsSync(harnessSkillPath)) {
|
|
116
|
+
resolvedPath = harnessSkillPath;
|
|
117
|
+
}
|
|
118
|
+
// 4) Plugin skill fallback. Iterate enabled plugins; first match wins.
|
|
119
|
+
if (!resolvedPath) {
|
|
120
|
+
for (const plugin of (0, plugins_1.listEnabledPlugins)()) {
|
|
121
|
+
try {
|
|
122
|
+
const content = (0, plugins_1.loadPluginSkill)(plugin.id, skillName);
|
|
123
|
+
if (!loadedSkills.includes(skillName)) {
|
|
124
|
+
loadedSkills.push(skillName);
|
|
125
|
+
}
|
|
126
|
+
(0, runtime_1.emitNervesEvent)({
|
|
127
|
+
event: "repertoire.load_end",
|
|
128
|
+
component: "repertoire",
|
|
129
|
+
message: "loaded skill",
|
|
130
|
+
meta: {
|
|
131
|
+
operation: "loadSkill",
|
|
132
|
+
skill: skillName,
|
|
133
|
+
path: `plugin:${plugin.id}`,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
return content;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// try next plugin
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
100
143
|
if (!resolvedPath) {
|
|
101
144
|
(0, runtime_1.emitNervesEvent)({
|
|
102
145
|
level: "error",
|
|
@@ -106,12 +149,13 @@ function loadSkill(skillName) {
|
|
|
106
149
|
meta: {
|
|
107
150
|
operation: "loadSkill",
|
|
108
151
|
skill: skillName,
|
|
109
|
-
checkedPaths: [directSkillPath, protocolMirrorPath],
|
|
152
|
+
checkedPaths: [directSkillPath, protocolMirrorPath, harnessSkillPath],
|
|
110
153
|
},
|
|
111
154
|
});
|
|
112
155
|
throw new Error(`skill '${skillName}' not found in:\n` +
|
|
113
156
|
`- ${directSkillPath}\n` +
|
|
114
|
-
`- ${protocolMirrorPath}`
|
|
157
|
+
`- ${protocolMirrorPath}\n` +
|
|
158
|
+
`- ${harnessSkillPath}`);
|
|
115
159
|
}
|
|
116
160
|
const content = fs.readFileSync(resolvedPath, "utf-8");
|
|
117
161
|
if (!loadedSkills.includes(skillName)) {
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Thin wrapper around the Stripe Issuing API.
|
|
4
|
+
*
|
|
5
|
+
* Initializes with a restricted API key from the agent's vault.
|
|
6
|
+
* Card numbers are NEVER included in nerves events or log output.
|
|
7
|
+
* The `getCardDetails` method exists only for internal payment flows
|
|
8
|
+
* (e.g., passing card details to Duffel) — the returned data must
|
|
9
|
+
* never escape the calling function's scope.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createStripeClient = createStripeClient;
|
|
16
|
+
const stripe_1 = __importDefault(require("stripe"));
|
|
17
|
+
const credential_access_1 = require("./credential-access");
|
|
18
|
+
const runtime_1 = require("../nerves/runtime");
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Implementation
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
function toCardInfo(card) {
|
|
23
|
+
return {
|
|
24
|
+
cardId: card.id,
|
|
25
|
+
last4: card.last4,
|
|
26
|
+
status: card.status,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a Stripe client initialized with a restricted key from the vault.
|
|
31
|
+
*/
|
|
32
|
+
async function createStripeClient() {
|
|
33
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
34
|
+
const apiKey = await store.getRawSecret("stripe.com", "restrictedKey");
|
|
35
|
+
// StripeConstructor is a callable (not a class), cast the result
|
|
36
|
+
const stripe = (0, stripe_1.default)(apiKey);
|
|
37
|
+
return {
|
|
38
|
+
async createVirtualCard(opts) {
|
|
39
|
+
(0, runtime_1.emitNervesEvent)({
|
|
40
|
+
component: "repertoire",
|
|
41
|
+
event: "repertoire.stripe_card_create_start",
|
|
42
|
+
message: "creating virtual card",
|
|
43
|
+
meta: { type: opts.type, currency: opts.currency },
|
|
44
|
+
});
|
|
45
|
+
const spendingControls = {
|
|
46
|
+
spending_limits: [
|
|
47
|
+
{
|
|
48
|
+
amount: opts.spendLimit * 100, // Stripe uses cents
|
|
49
|
+
interval: opts.type === "single_use" ? "all_time" : "monthly",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
...(opts.merchantCategories
|
|
53
|
+
? { allowed_categories: opts.merchantCategories }
|
|
54
|
+
: {}),
|
|
55
|
+
};
|
|
56
|
+
const card = await stripe.issuing.cards.create({
|
|
57
|
+
type: "virtual",
|
|
58
|
+
currency: opts.currency,
|
|
59
|
+
spending_controls: spendingControls,
|
|
60
|
+
status: "active",
|
|
61
|
+
});
|
|
62
|
+
(0, runtime_1.emitNervesEvent)({
|
|
63
|
+
component: "repertoire",
|
|
64
|
+
event: "repertoire.stripe_card_create_end",
|
|
65
|
+
message: "virtual card created",
|
|
66
|
+
meta: { cardId: card.id, last4: card.last4 },
|
|
67
|
+
});
|
|
68
|
+
return toCardInfo(card);
|
|
69
|
+
},
|
|
70
|
+
async getCard(cardId) {
|
|
71
|
+
(0, runtime_1.emitNervesEvent)({
|
|
72
|
+
component: "repertoire",
|
|
73
|
+
event: "repertoire.stripe_card_get",
|
|
74
|
+
message: "retrieving card info",
|
|
75
|
+
meta: { cardId },
|
|
76
|
+
});
|
|
77
|
+
const card = await stripe.issuing.cards.retrieve(cardId);
|
|
78
|
+
return toCardInfo(card);
|
|
79
|
+
},
|
|
80
|
+
async updateCard(cardId, updates) {
|
|
81
|
+
(0, runtime_1.emitNervesEvent)({
|
|
82
|
+
component: "repertoire",
|
|
83
|
+
event: "repertoire.stripe_card_update",
|
|
84
|
+
message: "updating card",
|
|
85
|
+
meta: { cardId },
|
|
86
|
+
});
|
|
87
|
+
const card = await stripe.issuing.cards.update(cardId, updates);
|
|
88
|
+
return toCardInfo(card);
|
|
89
|
+
},
|
|
90
|
+
async deactivateCard(cardId) {
|
|
91
|
+
(0, runtime_1.emitNervesEvent)({
|
|
92
|
+
component: "repertoire",
|
|
93
|
+
event: "repertoire.stripe_card_deactivate",
|
|
94
|
+
message: "deactivating card",
|
|
95
|
+
meta: { cardId },
|
|
96
|
+
});
|
|
97
|
+
const card = await stripe.issuing.cards.update(cardId, { status: "canceled" });
|
|
98
|
+
return toCardInfo(card);
|
|
99
|
+
},
|
|
100
|
+
async listCards() {
|
|
101
|
+
(0, runtime_1.emitNervesEvent)({
|
|
102
|
+
component: "repertoire",
|
|
103
|
+
event: "repertoire.stripe_cards_list",
|
|
104
|
+
message: "listing cards",
|
|
105
|
+
meta: {},
|
|
106
|
+
});
|
|
107
|
+
const result = await stripe.issuing.cards.list();
|
|
108
|
+
return result.data.map(toCardInfo);
|
|
109
|
+
},
|
|
110
|
+
async getCardDetails(cardId) {
|
|
111
|
+
// This method retrieves sensitive card details for payment flows.
|
|
112
|
+
// The data must NEVER be logged, emitted, or returned to the model.
|
|
113
|
+
(0, runtime_1.emitNervesEvent)({
|
|
114
|
+
component: "repertoire",
|
|
115
|
+
event: "repertoire.stripe_card_details_get",
|
|
116
|
+
message: "retrieving card details for payment flow",
|
|
117
|
+
meta: { cardId },
|
|
118
|
+
});
|
|
119
|
+
const card = await stripe.issuing.cards.retrieve(cardId, {
|
|
120
|
+
expand: ["number", "cvc"],
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
cardId: card.id,
|
|
124
|
+
number: card.number,
|
|
125
|
+
cvc: card.cvc,
|
|
126
|
+
expMonth: card.exp_month,
|
|
127
|
+
expYear: card.exp_year,
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.okToolResult = okToolResult;
|
|
4
|
+
exports.frictionToolResult = frictionToolResult;
|
|
5
|
+
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
function okToolResult(tool, data) {
|
|
7
|
+
(0, runtime_1.emitNervesEvent)({
|
|
8
|
+
component: "tools",
|
|
9
|
+
event: "tool.structured_ok",
|
|
10
|
+
message: "tool returned structured result",
|
|
11
|
+
meta: { tool },
|
|
12
|
+
});
|
|
13
|
+
return JSON.stringify({ ok: true, tool, data }, null, 2);
|
|
14
|
+
}
|
|
15
|
+
function frictionToolResult(tool, friction) {
|
|
16
|
+
(0, runtime_1.emitNervesEvent)({
|
|
17
|
+
level: "warn",
|
|
18
|
+
component: "tools",
|
|
19
|
+
event: "tool.structured_friction",
|
|
20
|
+
message: "tool returned structured result",
|
|
21
|
+
meta: {
|
|
22
|
+
tool,
|
|
23
|
+
kind: friction.kind,
|
|
24
|
+
recoverability: friction.recoverability,
|
|
25
|
+
signature: friction.signature,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return JSON.stringify({ ok: false, tool, friction }, null, 2);
|
|
29
|
+
}
|
|
@@ -0,0 +1,317 @@
|
|
|
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.attachmentToolDefinitions = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
38
|
+
const identity_1 = require("../heart/identity");
|
|
39
|
+
const provider_credentials_1 = require("../heart/provider-credentials");
|
|
40
|
+
const minimax_1 = require("../heart/providers/minimax");
|
|
41
|
+
const minimax_vlm_1 = require("../heart/providers/minimax-vlm");
|
|
42
|
+
const store_1 = require("../heart/attachments/store");
|
|
43
|
+
const materialize_1 = require("../heart/attachments/materialize");
|
|
44
|
+
const runtime_1 = require("../nerves/runtime");
|
|
45
|
+
const tool_results_1 = require("./tool-results");
|
|
46
|
+
const LIST_ATTACHMENTS_DESCRIPTION = "List the most recent attachments the harness preserved across senses. Use this when you need a stable attachment_id, " +
|
|
47
|
+
"when a repair flow says an attachment could not be found, or when you want to inspect what artifacts are currently on hand " +
|
|
48
|
+
"before asking the user to resend anything.";
|
|
49
|
+
const MATERIALIZE_ATTACHMENT_DESCRIPTION = "Materialize an attachment into a concrete file path the harness can inspect or hand to other tools. " +
|
|
50
|
+
"Use variant=original when you want the raw file. Use variant=vision_safe for images when you want the harness to normalize " +
|
|
51
|
+
"size and format into a VLM-safe image before retrying.";
|
|
52
|
+
const DESCRIBE_IMAGE_DESCRIPTION = "Use this to inspect an image attachment with a targeted question, or to re-interrogate an image after a wrong first answer. " +
|
|
53
|
+
"The harness materializes the original attachment, normalizes it into a VLM-safe image when needed, and sends it through the vision-language model. " +
|
|
54
|
+
"Prefer specific prompts like 'what is the confirmation number?' over 'describe this image'. " +
|
|
55
|
+
"Pass attachment_id when you have it; attachment_guid is accepted as a compatibility alias.";
|
|
56
|
+
function trimArg(value) {
|
|
57
|
+
return value?.trim() ?? "";
|
|
58
|
+
}
|
|
59
|
+
function resolveAttachmentId(args) {
|
|
60
|
+
return trimArg(args.attachment_id) || trimArg(args.attachment_guid);
|
|
61
|
+
}
|
|
62
|
+
function parseLimit(raw) {
|
|
63
|
+
if (!raw)
|
|
64
|
+
return undefined;
|
|
65
|
+
const parsed = Number.parseInt(raw, 10);
|
|
66
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
return parsed;
|
|
69
|
+
}
|
|
70
|
+
function normalizeThrownReason(error) {
|
|
71
|
+
const rendered = String(error);
|
|
72
|
+
return rendered.startsWith("Error: ") ? rendered.slice(7) : rendered;
|
|
73
|
+
}
|
|
74
|
+
function attachmentNotFound(tool, attachmentId) {
|
|
75
|
+
const friction = {
|
|
76
|
+
kind: "local_repair",
|
|
77
|
+
recoverability: "transformable",
|
|
78
|
+
summary: `Attachment ${attachmentId} is not in the recent attachment store anymore.`,
|
|
79
|
+
signature: `${tool}:attachment-not-found`,
|
|
80
|
+
suggested_next_actions: [
|
|
81
|
+
{
|
|
82
|
+
kind: "tool",
|
|
83
|
+
tool: "list_recent_attachments",
|
|
84
|
+
reason: "Find the current attachment_id for the artifact you want to inspect before retrying.",
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
return (0, tool_results_1.frictionToolResult)(tool, friction);
|
|
89
|
+
}
|
|
90
|
+
function missingAttachmentId(tool) {
|
|
91
|
+
return (0, tool_results_1.frictionToolResult)(tool, {
|
|
92
|
+
kind: "input_error",
|
|
93
|
+
recoverability: "transformable",
|
|
94
|
+
summary: "An attachment id is required for this tool call.",
|
|
95
|
+
signature: `${tool}:missing-attachment-id`,
|
|
96
|
+
suggested_next_actions: [
|
|
97
|
+
{
|
|
98
|
+
kind: "tool",
|
|
99
|
+
tool: "list_recent_attachments",
|
|
100
|
+
reason: "Inspect the current recent attachments and retry with attachment_id.",
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function missingPrompt() {
|
|
106
|
+
return (0, tool_results_1.frictionToolResult)("describe_image", {
|
|
107
|
+
kind: "input_error",
|
|
108
|
+
recoverability: "transformable",
|
|
109
|
+
summary: "describe_image needs a targeted prompt before retrying.",
|
|
110
|
+
signature: "describe_image:missing-prompt",
|
|
111
|
+
suggested_next_actions: [
|
|
112
|
+
{
|
|
113
|
+
kind: "message",
|
|
114
|
+
message: "Retry with a specific question like 'what is the confirmation number?' or 'what date is shown?'",
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function normalizeMaterializeError(tool, attachmentId, reason) {
|
|
120
|
+
if (reason.startsWith("Attachment not found:")) {
|
|
121
|
+
return attachmentNotFound(tool, attachmentId);
|
|
122
|
+
}
|
|
123
|
+
if (reason.includes("is not an image")) {
|
|
124
|
+
return (0, tool_results_1.frictionToolResult)(tool, {
|
|
125
|
+
kind: "input_error",
|
|
126
|
+
recoverability: "transformable",
|
|
127
|
+
summary: `Attachment ${attachmentId} is not an image, so it cannot produce a vision_safe variant.`,
|
|
128
|
+
signature: `${tool}:not-image`,
|
|
129
|
+
suggested_next_actions: [
|
|
130
|
+
{
|
|
131
|
+
kind: "tool",
|
|
132
|
+
tool: "materialize_attachment",
|
|
133
|
+
reason: "Retry with variant=original if you need the raw file instead.",
|
|
134
|
+
args: { attachment_id: attachmentId, variant: "original" },
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return (0, tool_results_1.frictionToolResult)(tool, {
|
|
140
|
+
kind: "local_repair",
|
|
141
|
+
recoverability: "retryable",
|
|
142
|
+
summary: reason,
|
|
143
|
+
signature: `${tool}:materialize-failed`,
|
|
144
|
+
suggested_next_actions: [
|
|
145
|
+
{
|
|
146
|
+
kind: "tool",
|
|
147
|
+
tool: "materialize_attachment",
|
|
148
|
+
reason: "Retry materialization once more in case the file path or normalization target changed.",
|
|
149
|
+
args: { attachment_id: attachmentId, variant: "vision_safe" },
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async function buildImageDataUrl(filePath, mimeType) {
|
|
155
|
+
const buffer = await fs.readFile(filePath);
|
|
156
|
+
const encoded = buffer.toString("base64");
|
|
157
|
+
const normalizedMime = mimeType?.trim().toLowerCase() || "image/jpeg";
|
|
158
|
+
return `data:${normalizedMime};base64,${encoded}`;
|
|
159
|
+
}
|
|
160
|
+
exports.attachmentToolDefinitions = [
|
|
161
|
+
{
|
|
162
|
+
tool: {
|
|
163
|
+
type: "function",
|
|
164
|
+
function: {
|
|
165
|
+
name: "list_recent_attachments",
|
|
166
|
+
description: LIST_ATTACHMENTS_DESCRIPTION,
|
|
167
|
+
parameters: {
|
|
168
|
+
type: "object",
|
|
169
|
+
properties: {
|
|
170
|
+
kind: {
|
|
171
|
+
type: "string",
|
|
172
|
+
enum: ["image", "audio", "document", "binary", "unknown"],
|
|
173
|
+
description: "Optional attachment kind filter.",
|
|
174
|
+
},
|
|
175
|
+
limit: {
|
|
176
|
+
type: "string",
|
|
177
|
+
description: "Optional numeric limit for how many attachments to return.",
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
handler: async (args) => {
|
|
184
|
+
const agentName = (0, identity_1.getAgentName)();
|
|
185
|
+
const kind = trimArg(args.kind);
|
|
186
|
+
const attachments = (0, store_1.listRecentAttachments)(agentName, {
|
|
187
|
+
kind: kind ? kind : undefined,
|
|
188
|
+
limit: parseLimit(args.limit),
|
|
189
|
+
});
|
|
190
|
+
return (0, tool_results_1.okToolResult)("list_recent_attachments", attachments);
|
|
191
|
+
},
|
|
192
|
+
summaryKeys: ["kind", "limit"],
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
tool: {
|
|
196
|
+
type: "function",
|
|
197
|
+
function: {
|
|
198
|
+
name: "materialize_attachment",
|
|
199
|
+
description: MATERIALIZE_ATTACHMENT_DESCRIPTION,
|
|
200
|
+
parameters: {
|
|
201
|
+
type: "object",
|
|
202
|
+
properties: {
|
|
203
|
+
attachment_id: {
|
|
204
|
+
type: "string",
|
|
205
|
+
description: "Stable attachment id such as attachment:cli-local-file:... or attachment:bluebubbles:...",
|
|
206
|
+
},
|
|
207
|
+
attachment_guid: {
|
|
208
|
+
type: "string",
|
|
209
|
+
description: "Compatibility alias for older callers. Prefer attachment_id.",
|
|
210
|
+
},
|
|
211
|
+
variant: {
|
|
212
|
+
type: "string",
|
|
213
|
+
enum: ["original", "vision_safe"],
|
|
214
|
+
description: "Which attachment variant to materialize.",
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
required: ["variant"],
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
handler: async (args) => {
|
|
222
|
+
const attachmentId = resolveAttachmentId(args);
|
|
223
|
+
if (!attachmentId) {
|
|
224
|
+
return missingAttachmentId("materialize_attachment");
|
|
225
|
+
}
|
|
226
|
+
const agentName = (0, identity_1.getAgentName)();
|
|
227
|
+
const variant = trimArg(args.variant) === "vision_safe" ? "vision_safe" : "original";
|
|
228
|
+
try {
|
|
229
|
+
const materialized = await (0, materialize_1.materializeAttachment)(agentName, attachmentId, { variant });
|
|
230
|
+
return (0, tool_results_1.okToolResult)("materialize_attachment", materialized);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const reason = normalizeThrownReason(error);
|
|
234
|
+
return normalizeMaterializeError("materialize_attachment", attachmentId, reason);
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
summaryKeys: ["attachment_id", "attachment_guid", "variant"],
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
tool: {
|
|
241
|
+
type: "function",
|
|
242
|
+
function: {
|
|
243
|
+
name: "describe_image",
|
|
244
|
+
description: DESCRIBE_IMAGE_DESCRIPTION,
|
|
245
|
+
parameters: {
|
|
246
|
+
type: "object",
|
|
247
|
+
properties: {
|
|
248
|
+
attachment_id: {
|
|
249
|
+
type: "string",
|
|
250
|
+
description: "Stable attachment id for the image you want to inspect.",
|
|
251
|
+
},
|
|
252
|
+
attachment_guid: {
|
|
253
|
+
type: "string",
|
|
254
|
+
description: "Compatibility alias for older callers. Prefer attachment_id.",
|
|
255
|
+
},
|
|
256
|
+
prompt: {
|
|
257
|
+
type: "string",
|
|
258
|
+
description: "A targeted question about the image.",
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
required: ["prompt"],
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
handler: async (args) => {
|
|
266
|
+
const attachmentId = resolveAttachmentId(args);
|
|
267
|
+
if (!attachmentId) {
|
|
268
|
+
return missingAttachmentId("describe_image");
|
|
269
|
+
}
|
|
270
|
+
const prompt = trimArg(args.prompt);
|
|
271
|
+
if (!prompt) {
|
|
272
|
+
return missingPrompt();
|
|
273
|
+
}
|
|
274
|
+
const agentName = (0, identity_1.getAgentName)();
|
|
275
|
+
try {
|
|
276
|
+
const materialized = await (0, materialize_1.materializeAttachment)(agentName, attachmentId, { variant: "vision_safe" });
|
|
277
|
+
const imageDataUrl = await buildImageDataUrl(materialized.path, materialized.mimeType);
|
|
278
|
+
const credential = await (0, provider_credentials_1.readProviderCredentialRecord)(agentName, "minimax");
|
|
279
|
+
const apiKey = credential.ok ? credential.record.credentials.apiKey : undefined;
|
|
280
|
+
if (!apiKey) {
|
|
281
|
+
return (0, tool_results_1.frictionToolResult)("describe_image", {
|
|
282
|
+
kind: "external_blocker",
|
|
283
|
+
recoverability: "blocked",
|
|
284
|
+
summary: "MiniMax credentials are missing, so image understanding is unavailable until credentials are fixed.",
|
|
285
|
+
signature: "describe_image:minimax-missing-key",
|
|
286
|
+
suggested_next_actions: [
|
|
287
|
+
{
|
|
288
|
+
kind: "message",
|
|
289
|
+
message: "Run `ouro auth --agent <agent> --provider minimax`, then retry describe_image.",
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
const description = await (0, minimax_vlm_1.minimaxVlmDescribe)({
|
|
295
|
+
apiKey: String(apiKey),
|
|
296
|
+
prompt,
|
|
297
|
+
imageDataUrl,
|
|
298
|
+
baseURL: minimax_1.MINIMAX_PROVIDER_BASE_URL,
|
|
299
|
+
attachmentGuid: attachmentId,
|
|
300
|
+
mimeType: materialized.mimeType,
|
|
301
|
+
});
|
|
302
|
+
(0, runtime_1.emitNervesEvent)({
|
|
303
|
+
component: "tools",
|
|
304
|
+
event: "tool.describe_image_success",
|
|
305
|
+
message: "describe_image returned a description",
|
|
306
|
+
meta: { attachmentId },
|
|
307
|
+
});
|
|
308
|
+
return description;
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
const reason = normalizeThrownReason(error);
|
|
312
|
+
return normalizeMaterializeError("describe_image", attachmentId, reason);
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
summaryKeys: ["attachment_id", "attachment_guid", "prompt"],
|
|
316
|
+
},
|
|
317
|
+
];
|