@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.560
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/changelog.json +3596 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +58 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/adapter.js +2 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +479 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +913 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +776 -0
- package/dist/heart/daemon/cli-exec.js +7457 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1592 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1698
- package/dist/heart/daemon/daemon-entry.js +387 -2
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +796 -71
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +826 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/message-router.js +2 -2
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +14 -12
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/process-manager.js +375 -33
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +3 -31
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +389 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +162 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -1
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
- package/dist/heart/identity.js +203 -57
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +31 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +195 -0
- package/dist/heart/mailbox/readers/agent-machine.js +382 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +362 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +683 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +97 -13
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +13 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1149 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +243 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +9 -5
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-description.js +139 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +389 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
- package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/mailbox-ui/index.html +15 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +674 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +720 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +430 -0
- package/dist/mailroom/mbox-import.js +383 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +256 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +7 -1
- package/dist/mind/context.js +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +62 -75
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +4 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1011 -123
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +129 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +152 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +963 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +396 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +362 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +15 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +47 -1075
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +142 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1857 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-session.js +750 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +108 -100
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +116 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2305 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +240 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +520 -209
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +175 -21
- package/dist/senses/inner-dialog.js +330 -27
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +549 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +248 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/elevenlabs.js +125 -0
- package/dist/senses/voice/index.js +22 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +85 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +133 -0
- package/dist/senses/voice-entry.js +80 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +38 -7
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +101 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -351
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/subagent-installer.js +0 -166
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shellToolDefinitions = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const shell_sessions_1 = require("./shell-sessions");
|
|
6
|
+
const identity_1 = require("../heart/identity");
|
|
7
|
+
const runtime_1 = require("../nerves/runtime");
|
|
8
|
+
exports.shellToolDefinitions = [
|
|
9
|
+
{
|
|
10
|
+
tool: {
|
|
11
|
+
type: "function",
|
|
12
|
+
function: {
|
|
13
|
+
name: "shell",
|
|
14
|
+
description: "Run a shell command and return stdout/stderr. Working directory persists between calls. Use dedicated tools instead of shell when available: read_file instead of cat, edit_file instead of sed, glob instead of find, grep instead of grep/rg. Reserve shell for operations that genuinely need the shell: installing packages, running builds/tests, git operations, process management. Be careful with destructive commands -- consider reversibility before running. If a command fails, read the error output before retrying with a different approach.",
|
|
15
|
+
parameters: {
|
|
16
|
+
type: "object",
|
|
17
|
+
properties: {
|
|
18
|
+
command: { type: "string" },
|
|
19
|
+
timeout_ms: {
|
|
20
|
+
type: "number",
|
|
21
|
+
description: "Timeout in milliseconds. Default: 30000. Max: 600000.",
|
|
22
|
+
},
|
|
23
|
+
background: {
|
|
24
|
+
type: "boolean",
|
|
25
|
+
description: "Run in background. Returns immediately with a process ID. Use shell_status/shell_tail to monitor.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ["command"],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
handler: (a) => {
|
|
33
|
+
// Destructive pattern detection (friction, not a block)
|
|
34
|
+
const destructivePatterns = (0, shell_sessions_1.detectDestructivePatterns)(a.command);
|
|
35
|
+
if (destructivePatterns.length > 0) {
|
|
36
|
+
(0, runtime_1.emitNervesEvent)({
|
|
37
|
+
level: "warn",
|
|
38
|
+
event: "tool.shell.destructive_detected",
|
|
39
|
+
component: "tools",
|
|
40
|
+
message: `destructive pattern detected: ${destructivePatterns.join(", ")}`,
|
|
41
|
+
meta: { command: a.command, patterns: destructivePatterns },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Background mode: spawn and return immediately
|
|
45
|
+
if (a.background === "true") {
|
|
46
|
+
const session = (0, shell_sessions_1.spawnBackgroundShell)(a.command);
|
|
47
|
+
return JSON.stringify({ id: session.id, command: session.command, status: session.status });
|
|
48
|
+
}
|
|
49
|
+
const MAX_TIMEOUT = 600000;
|
|
50
|
+
const requestedTimeout = Number(a.timeout_ms) || 0;
|
|
51
|
+
let configDefault = 30000;
|
|
52
|
+
try {
|
|
53
|
+
configDefault = (0, identity_1.loadAgentConfig)().shell?.defaultTimeout ?? 30000;
|
|
54
|
+
}
|
|
55
|
+
catch { /* test env: no --agent flag */ }
|
|
56
|
+
const baseTimeout = requestedTimeout > 0 ? requestedTimeout : configDefault;
|
|
57
|
+
const timeout = Math.min(baseTimeout, MAX_TIMEOUT);
|
|
58
|
+
const output = (0, child_process_1.execSync)(a.command, {
|
|
59
|
+
encoding: "utf-8",
|
|
60
|
+
timeout,
|
|
61
|
+
});
|
|
62
|
+
if (destructivePatterns.length > 0) {
|
|
63
|
+
return `${output}\n\n--- destructive pattern detected: ${destructivePatterns.join(", ")} ---`;
|
|
64
|
+
}
|
|
65
|
+
return output;
|
|
66
|
+
},
|
|
67
|
+
summaryKeys: ["command"],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
tool: {
|
|
71
|
+
type: "function",
|
|
72
|
+
function: {
|
|
73
|
+
name: "shell_status",
|
|
74
|
+
description: "Check status of background shell processes. Omit id to list all.",
|
|
75
|
+
parameters: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
id: { type: "string", description: "Background shell process ID" },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
handler: (a) => {
|
|
84
|
+
if (!a.id) {
|
|
85
|
+
return JSON.stringify((0, shell_sessions_1.listShellSessions)());
|
|
86
|
+
}
|
|
87
|
+
const session = (0, shell_sessions_1.getShellSession)(a.id);
|
|
88
|
+
if (!session)
|
|
89
|
+
return `process not found: ${a.id}`;
|
|
90
|
+
return JSON.stringify(session);
|
|
91
|
+
},
|
|
92
|
+
summaryKeys: ["id"],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
tool: {
|
|
96
|
+
type: "function",
|
|
97
|
+
function: {
|
|
98
|
+
name: "shell_tail",
|
|
99
|
+
description: "Show recent output from a background shell process.",
|
|
100
|
+
parameters: {
|
|
101
|
+
type: "object",
|
|
102
|
+
properties: {
|
|
103
|
+
id: { type: "string", description: "Background shell process ID" },
|
|
104
|
+
},
|
|
105
|
+
required: ["id"],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
handler: (a) => {
|
|
110
|
+
/* v8 ignore next -- schema requires id, defensive guard @preserve */
|
|
111
|
+
if (!a.id)
|
|
112
|
+
return "id is required";
|
|
113
|
+
const output = (0, shell_sessions_1.tailShellSession)(a.id);
|
|
114
|
+
if (output === undefined)
|
|
115
|
+
return `process not found: ${a.id}`;
|
|
116
|
+
return output || "(no output yet)";
|
|
117
|
+
},
|
|
118
|
+
summaryKeys: ["id"],
|
|
119
|
+
},
|
|
120
|
+
];
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stripeToolDefinitions = void 0;
|
|
4
|
+
exports.resetStripeClient = resetStripeClient;
|
|
5
|
+
const stripe_client_1 = require("./stripe-client");
|
|
6
|
+
const runtime_1 = require("../nerves/runtime");
|
|
7
|
+
// Lazy-initialized Stripe client singleton
|
|
8
|
+
let _stripeClient = null;
|
|
9
|
+
async function getStripeClient() {
|
|
10
|
+
if (!_stripeClient) {
|
|
11
|
+
_stripeClient = await (0, stripe_client_1.createStripeClient)();
|
|
12
|
+
}
|
|
13
|
+
return _stripeClient;
|
|
14
|
+
}
|
|
15
|
+
function requireFamilyContext(ctx) {
|
|
16
|
+
if (!ctx?.context?.friend?.id) {
|
|
17
|
+
return "no friend context — cannot access payment tools.";
|
|
18
|
+
}
|
|
19
|
+
if (ctx.context.friend.trustLevel !== "family") {
|
|
20
|
+
return "payment tools require family trust level.";
|
|
21
|
+
}
|
|
22
|
+
return { friendId: ctx.context.friend.id };
|
|
23
|
+
}
|
|
24
|
+
exports.stripeToolDefinitions = [
|
|
25
|
+
{
|
|
26
|
+
tool: {
|
|
27
|
+
type: "function",
|
|
28
|
+
function: {
|
|
29
|
+
name: "stripe_create_card",
|
|
30
|
+
description: "Create a virtual card for a transaction. Returns card ID and last 4 digits (never the full card number). Requires family trust level.",
|
|
31
|
+
parameters: {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: {
|
|
34
|
+
type: {
|
|
35
|
+
type: "string",
|
|
36
|
+
enum: ["single_use", "persistent"],
|
|
37
|
+
description: "Card type: single_use (one transaction) or persistent (recurring)",
|
|
38
|
+
},
|
|
39
|
+
spend_limit: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Maximum spend limit in dollars (e.g. '500')",
|
|
42
|
+
},
|
|
43
|
+
currency: {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "Currency code (e.g. 'usd')",
|
|
46
|
+
},
|
|
47
|
+
merchant_categories: {
|
|
48
|
+
type: "string",
|
|
49
|
+
description: "Comma-separated allowed merchant categories (optional)",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ["type", "spend_limit", "currency"],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
handler: async (args, ctx) => {
|
|
57
|
+
(0, runtime_1.emitNervesEvent)({
|
|
58
|
+
component: "repertoire",
|
|
59
|
+
event: "repertoire.tool_stripe_create_card",
|
|
60
|
+
message: "stripe_create_card invoked",
|
|
61
|
+
meta: { tool: "stripe_create_card" },
|
|
62
|
+
});
|
|
63
|
+
const guard = requireFamilyContext(ctx);
|
|
64
|
+
if (typeof guard === "string")
|
|
65
|
+
return guard;
|
|
66
|
+
try {
|
|
67
|
+
const client = await getStripeClient();
|
|
68
|
+
const categories = args.merchant_categories
|
|
69
|
+
? args.merchant_categories.split(",").map((c) => c.trim())
|
|
70
|
+
: undefined;
|
|
71
|
+
const card = await client.createVirtualCard({
|
|
72
|
+
type: args.type,
|
|
73
|
+
spendLimit: parseFloat(args.spend_limit),
|
|
74
|
+
currency: args.currency,
|
|
75
|
+
merchantCategories: categories,
|
|
76
|
+
});
|
|
77
|
+
return JSON.stringify({
|
|
78
|
+
cardId: card.cardId,
|
|
79
|
+
last4: card.last4,
|
|
80
|
+
status: card.status,
|
|
81
|
+
spendLimit: args.spend_limit,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
/* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
|
|
86
|
+
return `card creation error: ${err instanceof Error ? err.message : String(err)}`;
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
summaryKeys: ["type", "spend_limit", "currency"],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
tool: {
|
|
93
|
+
type: "function",
|
|
94
|
+
function: {
|
|
95
|
+
name: "stripe_deactivate_card",
|
|
96
|
+
description: "Deactivate (cancel) a virtual card. Use after a transaction is complete or to revoke access. Requires family trust level.",
|
|
97
|
+
parameters: {
|
|
98
|
+
type: "object",
|
|
99
|
+
properties: {
|
|
100
|
+
card_id: {
|
|
101
|
+
type: "string",
|
|
102
|
+
description: "The Stripe card ID to deactivate (e.g. 'ic_...')",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
required: ["card_id"],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
handler: async (args, ctx) => {
|
|
110
|
+
(0, runtime_1.emitNervesEvent)({
|
|
111
|
+
component: "repertoire",
|
|
112
|
+
event: "repertoire.tool_stripe_deactivate_card",
|
|
113
|
+
message: "stripe_deactivate_card invoked",
|
|
114
|
+
meta: { tool: "stripe_deactivate_card", cardId: args.card_id },
|
|
115
|
+
});
|
|
116
|
+
const guard = requireFamilyContext(ctx);
|
|
117
|
+
if (typeof guard === "string")
|
|
118
|
+
return guard;
|
|
119
|
+
try {
|
|
120
|
+
const client = await getStripeClient();
|
|
121
|
+
const card = await client.deactivateCard(args.card_id);
|
|
122
|
+
return JSON.stringify({
|
|
123
|
+
cardId: card.cardId,
|
|
124
|
+
last4: card.last4,
|
|
125
|
+
status: card.status,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
/* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
|
|
130
|
+
return `card deactivation error: ${err instanceof Error ? err.message : String(err)}`;
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
summaryKeys: ["card_id"],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
tool: {
|
|
137
|
+
type: "function",
|
|
138
|
+
function: {
|
|
139
|
+
name: "stripe_list_cards",
|
|
140
|
+
description: "List all active virtual cards. Shows card IDs and last 4 digits only. Requires family trust level.",
|
|
141
|
+
parameters: {
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: {},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
handler: async (_args, ctx) => {
|
|
148
|
+
(0, runtime_1.emitNervesEvent)({
|
|
149
|
+
component: "repertoire",
|
|
150
|
+
event: "repertoire.tool_stripe_list_cards",
|
|
151
|
+
message: "stripe_list_cards invoked",
|
|
152
|
+
meta: { tool: "stripe_list_cards" },
|
|
153
|
+
});
|
|
154
|
+
const guard = requireFamilyContext(ctx);
|
|
155
|
+
if (typeof guard === "string")
|
|
156
|
+
return guard;
|
|
157
|
+
try {
|
|
158
|
+
const client = await getStripeClient();
|
|
159
|
+
const cards = await client.listCards();
|
|
160
|
+
if (cards.length === 0) {
|
|
161
|
+
return "no active cards.";
|
|
162
|
+
}
|
|
163
|
+
return JSON.stringify(cards.map((c) => ({
|
|
164
|
+
cardId: c.cardId,
|
|
165
|
+
last4: c.last4,
|
|
166
|
+
status: c.status,
|
|
167
|
+
})));
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
/* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
|
|
171
|
+
return `card listing error: ${err instanceof Error ? err.message : String(err)}`;
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
summaryKeys: [],
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
/** Reset the Stripe client singleton (for testing). */
|
|
178
|
+
function resetStripeClient() {
|
|
179
|
+
_stripeClient = null;
|
|
180
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
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.surfaceToolDefinition = exports.surfaceToolDef = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const identity_1 = require("../heart/identity");
|
|
39
|
+
const surface_tool_1 = require("../senses/surface-tool");
|
|
40
|
+
const obligations_1 = require("../arc/obligations");
|
|
41
|
+
const session_activity_1 = require("../heart/session-activity");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
// Surface tool schema — canonical home. Handler lives in senses/surface-tool.ts.
|
|
44
|
+
exports.surfaceToolDef = {
|
|
45
|
+
type: "function",
|
|
46
|
+
function: {
|
|
47
|
+
name: "surface",
|
|
48
|
+
description: "send a message to someone — write it the way you'd text a friend. pass delegationId to address a held thought (see your attention queue above), or friendId for spontaneous outreach. does not end your turn.",
|
|
49
|
+
parameters: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
content: {
|
|
53
|
+
type: "string",
|
|
54
|
+
description: "the message to deliver",
|
|
55
|
+
},
|
|
56
|
+
delegationId: {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "ID from your attention queue — addresses a specific held thought",
|
|
59
|
+
},
|
|
60
|
+
friendId: {
|
|
61
|
+
type: "string",
|
|
62
|
+
description: "friend to reach out to spontaneously (when not addressing a held thought)",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
required: ["content"],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
// Surface tool handler: routes content to friend's freshest session
|
|
70
|
+
/* v8 ignore start -- surface handler wiring: core logic tested via surface-tool.test.ts; this wires identity/routing deps @preserve */
|
|
71
|
+
exports.surfaceToolDefinition = {
|
|
72
|
+
tool: exports.surfaceToolDef,
|
|
73
|
+
handler: async (args, ctx) => {
|
|
74
|
+
const queue = ctx?.delegatedOrigins ?? [];
|
|
75
|
+
const agentName = (() => { try {
|
|
76
|
+
return (0, identity_1.getAgentName)();
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return "unknown";
|
|
80
|
+
} })();
|
|
81
|
+
const routeToFriend = async (friendId, content, queueItem) => {
|
|
82
|
+
/* v8 ignore start -- routing: integration path tested via inner-dialog routing tests @preserve */
|
|
83
|
+
try {
|
|
84
|
+
const agentRoot = (0, identity_1.getAgentRoot)();
|
|
85
|
+
const sessionsDir = path.join(agentRoot, "state", "sessions");
|
|
86
|
+
const friendsDir = path.join(agentRoot, "friends");
|
|
87
|
+
// Resolve friend name → UUID if needed (agents may pass name instead of UUID)
|
|
88
|
+
let resolvedFriendId = friendId;
|
|
89
|
+
if (!fs.existsSync(path.join(sessionsDir, friendId))) {
|
|
90
|
+
try {
|
|
91
|
+
const friendFiles = fs.readdirSync(friendsDir).filter((f) => f.endsWith(".json"));
|
|
92
|
+
for (const file of friendFiles) {
|
|
93
|
+
const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
|
|
94
|
+
const record = JSON.parse(raw);
|
|
95
|
+
if (record.name?.toLowerCase() === friendId.toLowerCase() && record.id) {
|
|
96
|
+
resolvedFriendId = record.id;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch { /* friends dir unreadable — continue with original friendId */ }
|
|
102
|
+
}
|
|
103
|
+
friendId = resolvedFriendId;
|
|
104
|
+
// Priority 1: Bridge-preferred session (if queue item has a bridgeId)
|
|
105
|
+
if (queueItem?.bridgeId) {
|
|
106
|
+
const { createBridgeManager } = await Promise.resolve().then(() => __importStar(require("../heart/bridges/manager")));
|
|
107
|
+
const bridge = createBridgeManager().getBridge(queueItem.bridgeId);
|
|
108
|
+
if (bridge && bridge.lifecycle !== "completed" && bridge.lifecycle !== "cancelled") {
|
|
109
|
+
const allSessions = (0, session_activity_1.listSessionActivity)({ sessionsDir, friendsDir, agentName, activeThresholdMs: Number.MAX_SAFE_INTEGER });
|
|
110
|
+
const bridgeTarget = allSessions.find((activity) => activity.friendId === friendId
|
|
111
|
+
&& activity.channel !== "inner"
|
|
112
|
+
&& bridge.attachedSessions.some((s) => s.friendId === activity.friendId && s.channel === activity.channel && s.key === activity.key));
|
|
113
|
+
if (bridgeTarget) {
|
|
114
|
+
// Attempt proactive BB delivery for bridge target
|
|
115
|
+
if (bridgeTarget.channel === "bluebubbles") {
|
|
116
|
+
const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
|
|
117
|
+
const proactiveResult = await sendProactiveBlueBubblesMessageToSession({
|
|
118
|
+
friendId: bridgeTarget.friendId,
|
|
119
|
+
sessionKey: bridgeTarget.key,
|
|
120
|
+
text: content,
|
|
121
|
+
intent: "explicit_cross_chat",
|
|
122
|
+
});
|
|
123
|
+
if (proactiveResult.delivered) {
|
|
124
|
+
// Inject surfaced content into the target session so it knows what was delivered
|
|
125
|
+
const { appendSyntheticAssistantMessage } = await Promise.resolve().then(() => __importStar(require("../mind/context")));
|
|
126
|
+
const sessionFilePath = path.join(sessionsDir, bridgeTarget.friendId, bridgeTarget.channel, `${bridgeTarget.key}.json`);
|
|
127
|
+
appendSyntheticAssistantMessage(sessionFilePath, content);
|
|
128
|
+
return { status: "delivered", detail: "via iMessage" };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Fall back to pending queue for bridge target
|
|
132
|
+
const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
|
|
133
|
+
const pendingDir = getPendingDir(agentName, bridgeTarget.friendId, bridgeTarget.channel, bridgeTarget.key);
|
|
134
|
+
queuePendingMessage(pendingDir, {
|
|
135
|
+
from: agentName,
|
|
136
|
+
friendId: bridgeTarget.friendId,
|
|
137
|
+
channel: bridgeTarget.channel,
|
|
138
|
+
key: bridgeTarget.key,
|
|
139
|
+
content,
|
|
140
|
+
timestamp: Date.now(),
|
|
141
|
+
});
|
|
142
|
+
return { status: "queued", detail: `for next interaction via ${bridgeTarget.channel}` };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Priority 2: Try proactive delivery first, then queue to freshest session
|
|
147
|
+
const allFriendSessions = (0, session_activity_1.listSessionActivity)({ sessionsDir, friendsDir, agentName, activeThresholdMs: Number.MAX_SAFE_INTEGER })
|
|
148
|
+
.filter((s) => s.friendId === friendId && s.channel !== "inner");
|
|
149
|
+
// 2a: Attempt proactive BB delivery on a DM session (;-; = individual, never ;+; = group)
|
|
150
|
+
const bbSession = allFriendSessions.find((s) => s.channel === "bluebubbles" && s.key.includes(";-;"));
|
|
151
|
+
if (bbSession) {
|
|
152
|
+
const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
|
|
153
|
+
const proactiveResult = await sendProactiveBlueBubblesMessageToSession({
|
|
154
|
+
friendId: bbSession.friendId,
|
|
155
|
+
sessionKey: bbSession.key,
|
|
156
|
+
text: content,
|
|
157
|
+
});
|
|
158
|
+
if (proactiveResult.delivered) {
|
|
159
|
+
const { appendSyntheticAssistantMessage } = await Promise.resolve().then(() => __importStar(require("../mind/context")));
|
|
160
|
+
const sessionFilePath = path.join(sessionsDir, bbSession.friendId, bbSession.channel, `${bbSession.key}.json`);
|
|
161
|
+
appendSyntheticAssistantMessage(sessionFilePath, content);
|
|
162
|
+
return { status: "delivered", detail: "via iMessage" };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// 2b: No proactive delivery — queue to freshest non-inner session
|
|
166
|
+
const freshest = allFriendSessions[0];
|
|
167
|
+
if (freshest) {
|
|
168
|
+
const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
|
|
169
|
+
const pendingDir = getPendingDir(agentName, freshest.friendId, freshest.channel, freshest.key);
|
|
170
|
+
queuePendingMessage(pendingDir, {
|
|
171
|
+
from: agentName,
|
|
172
|
+
friendId: freshest.friendId,
|
|
173
|
+
channel: freshest.channel,
|
|
174
|
+
key: freshest.key,
|
|
175
|
+
content,
|
|
176
|
+
timestamp: Date.now(),
|
|
177
|
+
});
|
|
178
|
+
return { status: "queued", detail: `for next interaction via ${freshest.channel}` };
|
|
179
|
+
}
|
|
180
|
+
// Priority 3: Deferred — no active session found
|
|
181
|
+
const { getDeferredReturnDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
|
|
182
|
+
const { queuePendingMessage: queueDeferred } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
|
|
183
|
+
const deferredDir = getDeferredReturnDir(agentName, friendId);
|
|
184
|
+
queueDeferred(deferredDir, {
|
|
185
|
+
from: agentName,
|
|
186
|
+
friendId,
|
|
187
|
+
channel: "deferred",
|
|
188
|
+
key: "return",
|
|
189
|
+
content,
|
|
190
|
+
timestamp: Date.now(),
|
|
191
|
+
});
|
|
192
|
+
return { status: "deferred", detail: "they'll see it next time" };
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return { status: "failed" };
|
|
196
|
+
}
|
|
197
|
+
/* v8 ignore stop */
|
|
198
|
+
};
|
|
199
|
+
return (0, surface_tool_1.handleSurface)({
|
|
200
|
+
content: args.content ?? "",
|
|
201
|
+
delegationId: args.delegationId,
|
|
202
|
+
friendId: args.friendId,
|
|
203
|
+
queue,
|
|
204
|
+
routeToFriend,
|
|
205
|
+
advanceObligation: (obligationId, update) => {
|
|
206
|
+
/* v8 ignore start -- obligation advance: tested via attention-queue tests @preserve */
|
|
207
|
+
try {
|
|
208
|
+
const name = (() => { try {
|
|
209
|
+
return (0, identity_1.getAgentName)();
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return "unknown";
|
|
213
|
+
} })();
|
|
214
|
+
(0, obligations_1.advanceReturnObligation)(name, obligationId, {
|
|
215
|
+
status: update.status,
|
|
216
|
+
...(update.returnedAt !== undefined ? { returnedAt: update.returnedAt } : {}),
|
|
217
|
+
...(update.returnTarget !== undefined ? { returnTarget: update.returnTarget } : {}),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// swallowed — obligation advance must never break surface delivery
|
|
222
|
+
}
|
|
223
|
+
/* v8 ignore stop */
|
|
224
|
+
},
|
|
225
|
+
fulfillHeartObligation: (origin) => {
|
|
226
|
+
/* v8 ignore start -- heart obligation fulfillment: tested via surface-tool.test.ts @preserve */
|
|
227
|
+
try {
|
|
228
|
+
const agentRoot = (0, identity_1.getAgentRoot)();
|
|
229
|
+
const heartObligation = (0, obligations_1.findPendingObligationForOrigin)(agentRoot, origin);
|
|
230
|
+
if (heartObligation) {
|
|
231
|
+
(0, obligations_1.fulfillObligation)(agentRoot, heartObligation.id);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// swallowed — heart obligation fulfillment must never break surface delivery
|
|
236
|
+
}
|
|
237
|
+
/* v8 ignore stop */
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
summaryKeys: ["content", "delegationId"],
|
|
242
|
+
};
|
|
243
|
+
/* v8 ignore stop */
|
|
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.teamsToolDefinitions = void 0;
|
|
7
|
-
exports.summarizeTeamsArgs = summarizeTeamsArgs;
|
|
8
7
|
const graph_client_1 = require("./graph-client");
|
|
9
8
|
const ado_client_1 = require("./ado-client");
|
|
10
9
|
const graph_endpoints_json_1 = __importDefault(require("./data/graph-endpoints.json"));
|
|
@@ -36,6 +35,7 @@ exports.teamsToolDefinitions = [
|
|
|
36
35
|
return (0, graph_client_1.graphRequest)(ctx.graphToken, "GET", args.path);
|
|
37
36
|
},
|
|
38
37
|
integration: "graph",
|
|
38
|
+
summaryKeys: ["path"],
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
tool: {
|
|
@@ -64,7 +64,7 @@ exports.teamsToolDefinitions = [
|
|
|
64
64
|
return (0, graph_client_1.graphRequest)(ctx.graphToken, args.method, args.path, args.body);
|
|
65
65
|
},
|
|
66
66
|
integration: "graph",
|
|
67
|
-
|
|
67
|
+
summaryKeys: ["method", "path"],
|
|
68
68
|
},
|
|
69
69
|
// -- Generic ADO tools --
|
|
70
70
|
{
|
|
@@ -94,6 +94,7 @@ exports.teamsToolDefinitions = [
|
|
|
94
94
|
return (0, ado_client_1.adoRequest)(ctx.adoToken, method, args.organization, args.path, args.body, args.host);
|
|
95
95
|
},
|
|
96
96
|
integration: "ado",
|
|
97
|
+
summaryKeys: ["method", "organization", "path"],
|
|
97
98
|
},
|
|
98
99
|
{
|
|
99
100
|
tool: {
|
|
@@ -124,7 +125,7 @@ exports.teamsToolDefinitions = [
|
|
|
124
125
|
return (0, ado_client_1.adoRequest)(ctx.adoToken, args.method, args.organization, args.path, args.body, args.host);
|
|
125
126
|
},
|
|
126
127
|
integration: "ado",
|
|
127
|
-
|
|
128
|
+
summaryKeys: ["method", "organization", "path"],
|
|
128
129
|
},
|
|
129
130
|
// -- Convenience aliases (backward compat) --
|
|
130
131
|
{
|
|
@@ -143,6 +144,7 @@ exports.teamsToolDefinitions = [
|
|
|
143
144
|
return (0, graph_client_1.getProfile)(ctx.graphToken);
|
|
144
145
|
},
|
|
145
146
|
integration: "graph",
|
|
147
|
+
summaryKeys: [],
|
|
146
148
|
},
|
|
147
149
|
{
|
|
148
150
|
tool: {
|
|
@@ -186,6 +188,7 @@ exports.teamsToolDefinitions = [
|
|
|
186
188
|
return (0, ado_client_1.queryWorkItems)(ctx.adoToken, org, query);
|
|
187
189
|
},
|
|
188
190
|
integration: "ado",
|
|
191
|
+
summaryKeys: ["organization", "query"],
|
|
189
192
|
},
|
|
190
193
|
// -- Proactive messaging --
|
|
191
194
|
{
|
|
@@ -232,7 +235,7 @@ exports.teamsToolDefinitions = [
|
|
|
232
235
|
}
|
|
233
236
|
},
|
|
234
237
|
/* v8 ignore stop */
|
|
235
|
-
|
|
238
|
+
summaryKeys: ["user_name", "user_id"],
|
|
236
239
|
},
|
|
237
240
|
// -- Documentation tools --
|
|
238
241
|
{
|
|
@@ -254,6 +257,7 @@ exports.teamsToolDefinitions = [
|
|
|
254
257
|
return searchEndpoints(graph_endpoints_json_1.default, args.query || "");
|
|
255
258
|
},
|
|
256
259
|
integration: "graph",
|
|
260
|
+
summaryKeys: ["query"],
|
|
257
261
|
},
|
|
258
262
|
{
|
|
259
263
|
tool: {
|
|
@@ -274,6 +278,7 @@ exports.teamsToolDefinitions = [
|
|
|
274
278
|
return searchEndpoints(ado_endpoints_json_1.default, args.query || "");
|
|
275
279
|
},
|
|
276
280
|
integration: "ado",
|
|
281
|
+
summaryKeys: ["query"],
|
|
277
282
|
},
|
|
278
283
|
];
|
|
279
284
|
function searchEndpoints(entries, query) {
|
|
@@ -304,38 +309,3 @@ function searchEndpoints(entries, query) {
|
|
|
304
309
|
return lines.join("\n");
|
|
305
310
|
}).join("\n\n");
|
|
306
311
|
}
|
|
307
|
-
function summarizeTeamsArgs(name, args) {
|
|
308
|
-
function summarizeKeyValues(keys) {
|
|
309
|
-
const parts = [];
|
|
310
|
-
for (const key of keys) {
|
|
311
|
-
const raw = args[key];
|
|
312
|
-
if (raw === undefined || raw === null)
|
|
313
|
-
continue;
|
|
314
|
-
const compact = String(raw).replace(/\s+/g, " ").trim();
|
|
315
|
-
if (!compact)
|
|
316
|
-
continue;
|
|
317
|
-
const clipped = compact.length > 60 ? compact.slice(0, 60) + "..." : compact;
|
|
318
|
-
parts.push(`${key}=${clipped}`);
|
|
319
|
-
}
|
|
320
|
-
return parts.join(" ");
|
|
321
|
-
}
|
|
322
|
-
if (name === "graph_profile")
|
|
323
|
-
return "";
|
|
324
|
-
if (name === "ado_work_items")
|
|
325
|
-
return summarizeKeyValues(["organization", "query"]);
|
|
326
|
-
if (name === "graph_query")
|
|
327
|
-
return summarizeKeyValues(["path"]);
|
|
328
|
-
if (name === "graph_mutate")
|
|
329
|
-
return summarizeKeyValues(["method", "path"]);
|
|
330
|
-
if (name === "ado_query")
|
|
331
|
-
return summarizeKeyValues(["method", "organization", "path"]);
|
|
332
|
-
if (name === "ado_mutate")
|
|
333
|
-
return summarizeKeyValues(["method", "organization", "path"]);
|
|
334
|
-
if (name === "graph_docs")
|
|
335
|
-
return summarizeKeyValues(["query"]);
|
|
336
|
-
if (name === "ado_docs")
|
|
337
|
-
return summarizeKeyValues(["query"]);
|
|
338
|
-
if (name === "teams_send_message")
|
|
339
|
-
return summarizeKeyValues(["user_name", "user_id"]);
|
|
340
|
-
return undefined;
|
|
341
|
-
}
|