@ouro.bot/cli 0.1.0-alpha.6 → 0.1.0-alpha.600
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 +229 -183
- 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/SerpentGuide.ouro/agent.json +83 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/ouroboros.png +0 -0
- package/changelog.json +4182 -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 +254 -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 +989 -0
- 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/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/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 +97 -0
- package/dist/heart/awaiting/await-scheduler.js +377 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +142 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +164 -135
- package/dist/heart/core.js +1069 -260
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +180 -0
- 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 +7571 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1599 -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 +30 -758
- package/dist/heart/daemon/daemon-entry.js +540 -8
- 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 +287 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +972 -20
- 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 +206 -0
- 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 +188 -0
- 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 +17 -8
- 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 +381 -26
- 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 +39 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +731 -0
- 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 +349 -0
- 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 +524 -0
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +62 -0
- 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-animation.js +10 -3
- package/dist/heart/{daemon → hatch}/hatch-flow.js +34 -136
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +306 -0
- package/dist/heart/identity.js +281 -67
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +2 -20
- 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 +367 -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 +656 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/progress-story.js +42 -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 +202 -50
- package/dist/heart/providers/azure.js +104 -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 +29 -7
- package/dist/heart/providers/openai-codex.js +63 -39
- 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 +70 -0
- package/dist/heart/session-activity.js +190 -0
- 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 +129 -34
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +127 -0
- 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 +421 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +116 -0
- package/dist/heart/versioning/update-hooks.js +142 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- 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 +700 -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 +457 -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 +268 -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 +77 -1
- package/dist/mind/context.js +174 -94
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +84 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +74 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +58 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +10 -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 +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1267 -130
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- 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 +17 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +997 -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 +301 -0
- package/dist/repertoire/coding/index.js +4 -1
- package/dist/repertoire/coding/manager.js +220 -13
- package/dist/repertoire/coding/spawner.js +58 -12
- package/dist/repertoire/coding/tools.js +209 -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/data/ado-endpoints.json +188 -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 +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +39 -13
- 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 -79
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +360 -0
- package/dist/repertoire/tools-base.js +56 -707
- package/dist/repertoire/tools-bluebubbles.js +94 -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 +1916 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-obligations.js +142 -0
- package/dist/repertoire/tools-runtime.js +61 -0
- package/dist/repertoire/tools-session.js +809 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +345 -0
- package/dist/repertoire/tools-teams.js +64 -61
- 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-voice.js +144 -0
- package/dist/repertoire/tools.js +154 -98
- 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/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 +685 -0
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/bluebubbles/inbound-log.js +126 -0
- package/dist/senses/bluebubbles/index.js +2548 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/bluebubbles/runtime-state.js +137 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -0
- 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 +187 -0
- package/dist/senses/cli.js +777 -264
- package/dist/senses/commands.js +66 -3
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +209 -16
- package/dist/senses/inner-dialog.js +682 -91
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +751 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +392 -0
- package/dist/senses/surface-tool.js +70 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +925 -195
- package/dist/senses/trust-gate.js +207 -2
- 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 +5077 -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/package.json +52 -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 +99 -0
- package/skills/travel-planning.md +138 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/specialist-orchestrator.js +0 -160
- package/dist/heart/daemon/specialist-prompt.js +0 -40
- package/dist/heart/daemon/specialist-session.js +0 -142
- package/dist/heart/daemon/specialist-tools.js +0 -128
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/associative-recall.js +0 -197
- package/dist/senses/bluebubbles-client.js +0 -279
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -332
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /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/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/streaming.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP = exports.SettleStreamer = exports.SettleParser = void 0;
|
|
4
|
+
exports.truncateResponsesFunctionCallOutput = truncateResponsesFunctionCallOutput;
|
|
4
5
|
exports.toResponsesInput = toResponsesInput;
|
|
5
6
|
exports.toResponsesTools = toResponsesTools;
|
|
6
7
|
exports.streamChatCompletion = streamChatCompletion;
|
|
7
8
|
exports.streamResponsesApi = streamResponsesApi;
|
|
8
9
|
const runtime_1 = require("../nerves/runtime");
|
|
9
10
|
// Character-level state machine that extracts the answer value from
|
|
10
|
-
// `
|
|
11
|
+
// `settle` tool call JSON arguments as they stream in.
|
|
11
12
|
// Scans for prefix `"answer":"` or `"answer": "` in the character stream,
|
|
12
13
|
// then emits text handling JSON escapes, stopping at unescaped closing `"`.
|
|
13
|
-
class
|
|
14
|
+
class SettleParser {
|
|
14
15
|
// Possible prefixes to match (with and without space after colon)
|
|
15
16
|
static PREFIXES = ['"answer":"', '"answer": "'];
|
|
16
17
|
// Buffer of characters seen so far (pre-activation only)
|
|
@@ -29,7 +30,7 @@ class FinalAnswerParser {
|
|
|
29
30
|
if (!this._active) {
|
|
30
31
|
this.buf += ch;
|
|
31
32
|
// Check if any prefix has been fully matched in the buffer
|
|
32
|
-
for (const prefix of
|
|
33
|
+
for (const prefix of SettleParser.PREFIXES) {
|
|
33
34
|
if (this.buf.endsWith(prefix)) {
|
|
34
35
|
this._active = true;
|
|
35
36
|
break;
|
|
@@ -76,7 +77,106 @@ class FinalAnswerParser {
|
|
|
76
77
|
return out;
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
|
-
exports.
|
|
80
|
+
exports.SettleParser = SettleParser;
|
|
81
|
+
// Shared helper: wraps SettleParser with onClearText + onTextChunk wiring.
|
|
82
|
+
// Used by all streaming providers (Chat Completions, Responses API, Anthropic)
|
|
83
|
+
// so the eager-match settle streaming pattern lives in one place.
|
|
84
|
+
class SettleStreamer {
|
|
85
|
+
parser = new SettleParser();
|
|
86
|
+
_detected = false;
|
|
87
|
+
callbacks;
|
|
88
|
+
enabled;
|
|
89
|
+
constructor(callbacks, enabled = true) {
|
|
90
|
+
this.callbacks = callbacks;
|
|
91
|
+
this.enabled = enabled;
|
|
92
|
+
}
|
|
93
|
+
get detected() { return this._detected; }
|
|
94
|
+
get streamed() { return this.parser.active; }
|
|
95
|
+
/** Mark settle as detected. Calls onClearText on the callbacks. */
|
|
96
|
+
activate() {
|
|
97
|
+
if (!this.enabled)
|
|
98
|
+
return;
|
|
99
|
+
if (this._detected)
|
|
100
|
+
return;
|
|
101
|
+
this._detected = true;
|
|
102
|
+
this.callbacks.onClearText?.();
|
|
103
|
+
}
|
|
104
|
+
/** Feed an argument delta through the parser. Emits text via onTextChunk. */
|
|
105
|
+
processDelta(delta) {
|
|
106
|
+
if (!this.enabled)
|
|
107
|
+
return;
|
|
108
|
+
if (!this._detected)
|
|
109
|
+
return;
|
|
110
|
+
const text = this.parser.process(delta);
|
|
111
|
+
if (text)
|
|
112
|
+
this.callbacks.onTextChunk(text);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.SettleStreamer = SettleStreamer;
|
|
116
|
+
exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP = 200_000;
|
|
117
|
+
function truncateResponsesFunctionCallOutput(output, maxChars = exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP) {
|
|
118
|
+
if (output.length <= maxChars)
|
|
119
|
+
return output;
|
|
120
|
+
const marker = `\n\n[truncated — function_call_output exceeded ${maxChars} chars; original length ${output.length} chars]\n\n`;
|
|
121
|
+
const remainingBudget = Math.max(0, maxChars - marker.length);
|
|
122
|
+
const headLength = Math.ceil(remainingBudget * 0.75);
|
|
123
|
+
const tailLength = Math.max(0, remainingBudget - headLength);
|
|
124
|
+
return `${output.slice(0, headLength)}${marker}${output.slice(-tailLength)}`;
|
|
125
|
+
}
|
|
126
|
+
function toResponsesUserContent(content) {
|
|
127
|
+
if (typeof content === "string") {
|
|
128
|
+
return content;
|
|
129
|
+
}
|
|
130
|
+
if (!Array.isArray(content)) {
|
|
131
|
+
return "";
|
|
132
|
+
}
|
|
133
|
+
const parts = [];
|
|
134
|
+
for (const part of content) {
|
|
135
|
+
if (!part || typeof part !== "object") {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
139
|
+
parts.push({ type: "input_text", text: part.text });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (part.type === "image_url") {
|
|
143
|
+
const imageUrl = typeof part.image_url?.url === "string" ? part.image_url.url : "";
|
|
144
|
+
if (!imageUrl)
|
|
145
|
+
continue;
|
|
146
|
+
parts.push({
|
|
147
|
+
type: "input_image",
|
|
148
|
+
image_url: imageUrl,
|
|
149
|
+
detail: part.image_url?.detail ?? "auto",
|
|
150
|
+
});
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (part.type === "input_audio" &&
|
|
154
|
+
typeof part.input_audio?.data === "string" &&
|
|
155
|
+
(part.input_audio.format === "mp3" || part.input_audio.format === "wav")) {
|
|
156
|
+
parts.push({
|
|
157
|
+
type: "input_audio",
|
|
158
|
+
input_audio: {
|
|
159
|
+
data: part.input_audio.data,
|
|
160
|
+
format: part.input_audio.format,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (part.type === "file") {
|
|
166
|
+
const fileRecord = { type: "input_file" };
|
|
167
|
+
if (typeof part.file?.file_data === "string")
|
|
168
|
+
fileRecord.file_data = part.file.file_data;
|
|
169
|
+
if (typeof part.file?.file_id === "string")
|
|
170
|
+
fileRecord.file_id = part.file.file_id;
|
|
171
|
+
if (typeof part.file?.filename === "string")
|
|
172
|
+
fileRecord.filename = part.file.filename;
|
|
173
|
+
if (typeof part.file?.file_data === "string" || typeof part.file?.file_id === "string") {
|
|
174
|
+
parts.push(fileRecord);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return parts.length > 0 ? parts : "";
|
|
179
|
+
}
|
|
80
180
|
function toResponsesInput(messages) {
|
|
81
181
|
let instructions = "";
|
|
82
182
|
const input = [];
|
|
@@ -90,7 +190,7 @@ function toResponsesInput(messages) {
|
|
|
90
190
|
}
|
|
91
191
|
if (msg.role === "user") {
|
|
92
192
|
const u = msg;
|
|
93
|
-
input.push({ role: "user", content:
|
|
193
|
+
input.push({ role: "user", content: toResponsesUserContent(u.content) });
|
|
94
194
|
continue;
|
|
95
195
|
}
|
|
96
196
|
if (msg.role === "assistant") {
|
|
@@ -102,7 +202,10 @@ function toResponsesInput(messages) {
|
|
|
102
202
|
}
|
|
103
203
|
}
|
|
104
204
|
if (a.content) {
|
|
105
|
-
|
|
205
|
+
const assistantItem = { role: "assistant", content: typeof a.content === "string" ? a.content : "" };
|
|
206
|
+
if (a.phase)
|
|
207
|
+
assistantItem.phase = a.phase;
|
|
208
|
+
input.push(assistantItem);
|
|
106
209
|
}
|
|
107
210
|
if (a.tool_calls) {
|
|
108
211
|
for (const tc of a.tool_calls) {
|
|
@@ -125,7 +228,7 @@ function toResponsesInput(messages) {
|
|
|
125
228
|
input.push({
|
|
126
229
|
type: "function_call_output",
|
|
127
230
|
call_id: t.tool_call_id,
|
|
128
|
-
output: typeof t.content === "string" ? t.content : "",
|
|
231
|
+
output: truncateResponsesFunctionCallOutput(typeof t.content === "string" ? t.content : ""),
|
|
129
232
|
});
|
|
130
233
|
continue;
|
|
131
234
|
}
|
|
@@ -141,7 +244,7 @@ function toResponsesTools(ccTools) {
|
|
|
141
244
|
strict: false,
|
|
142
245
|
}));
|
|
143
246
|
}
|
|
144
|
-
async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
247
|
+
async function streamChatCompletion(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
|
|
145
248
|
(0, runtime_1.emitNervesEvent)({
|
|
146
249
|
component: "engine",
|
|
147
250
|
event: "engine.stream_start",
|
|
@@ -155,8 +258,7 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
|
155
258
|
let toolCalls = {};
|
|
156
259
|
let streamStarted = false;
|
|
157
260
|
let usage;
|
|
158
|
-
const
|
|
159
|
-
let finalAnswerDetected = false;
|
|
261
|
+
const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
|
|
160
262
|
// State machine for parsing inline <think> tags (MiniMax pattern)
|
|
161
263
|
let contentBuf = "";
|
|
162
264
|
let inThinkTag = false;
|
|
@@ -271,24 +373,21 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
|
271
373
|
toolCalls[tc.index].id = tc.id;
|
|
272
374
|
if (tc.function?.name) {
|
|
273
375
|
toolCalls[tc.index].name = tc.function.name;
|
|
274
|
-
// Detect
|
|
376
|
+
// Detect settle tool call on first name delta.
|
|
275
377
|
// Only activate streaming if this is the sole tool call (index 0
|
|
276
378
|
// and no other indices seen). Mixed calls are rejected by core.ts.
|
|
277
|
-
if (tc.function.name === "
|
|
379
|
+
if (tc.function.name === "settle" && !answerStreamer.detected
|
|
278
380
|
&& tc.index === 0 && Object.keys(toolCalls).length === 1) {
|
|
279
|
-
|
|
280
|
-
callbacks.onClearText?.();
|
|
381
|
+
answerStreamer.activate();
|
|
281
382
|
}
|
|
282
383
|
}
|
|
283
384
|
if (tc.function?.arguments) {
|
|
284
385
|
toolCalls[tc.index].arguments += tc.function.arguments;
|
|
285
|
-
// Feed
|
|
386
|
+
// Feed settle argument deltas to the parser for progressive
|
|
286
387
|
// streaming, but only when it appears to be the sole tool call.
|
|
287
|
-
if (
|
|
388
|
+
if (answerStreamer.detected && toolCalls[tc.index].name === "settle"
|
|
288
389
|
&& Object.keys(toolCalls).length === 1) {
|
|
289
|
-
|
|
290
|
-
if (text)
|
|
291
|
-
callbacks.onTextChunk(text);
|
|
390
|
+
answerStreamer.processDelta(tc.function.arguments);
|
|
292
391
|
}
|
|
293
392
|
}
|
|
294
393
|
}
|
|
@@ -302,10 +401,10 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
|
302
401
|
toolCalls: Object.values(toolCalls),
|
|
303
402
|
outputItems: [],
|
|
304
403
|
usage,
|
|
305
|
-
|
|
404
|
+
settleStreamed: answerStreamer.streamed,
|
|
306
405
|
};
|
|
307
406
|
}
|
|
308
|
-
async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
407
|
+
async function streamResponsesApi(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
|
|
309
408
|
(0, runtime_1.emitNervesEvent)({
|
|
310
409
|
component: "engine",
|
|
311
410
|
event: "engine.stream_start",
|
|
@@ -320,9 +419,8 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
320
419
|
const outputItems = [];
|
|
321
420
|
let currentToolCall = null;
|
|
322
421
|
let usage;
|
|
323
|
-
const
|
|
422
|
+
const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
|
|
324
423
|
let functionCallCount = 0;
|
|
325
|
-
let finalAnswerDetected = false;
|
|
326
424
|
for await (const event of response) {
|
|
327
425
|
if (signal?.aborted)
|
|
328
426
|
break;
|
|
@@ -351,12 +449,11 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
351
449
|
name: String(event.item.name),
|
|
352
450
|
arguments: "",
|
|
353
451
|
};
|
|
354
|
-
// Detect
|
|
452
|
+
// Detect settle function call -- clear any streamed noise.
|
|
355
453
|
// Only activate when this is the first (and so far only) function call.
|
|
356
454
|
// Mixed calls are rejected by core.ts; no need to stream their args.
|
|
357
|
-
if (String(event.item.name) === "
|
|
358
|
-
|
|
359
|
-
callbacks.onClearText?.();
|
|
455
|
+
if (String(event.item.name) === "settle" && functionCallCount === 1) {
|
|
456
|
+
answerStreamer.activate();
|
|
360
457
|
}
|
|
361
458
|
}
|
|
362
459
|
break;
|
|
@@ -364,13 +461,11 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
364
461
|
case "response.function_call_arguments.delta": {
|
|
365
462
|
if (currentToolCall) {
|
|
366
463
|
currentToolCall.arguments += event.delta;
|
|
367
|
-
// Feed
|
|
464
|
+
// Feed settle argument deltas to the parser for progressive
|
|
368
465
|
// streaming, but only when it appears to be the sole function call.
|
|
369
|
-
if (
|
|
466
|
+
if (answerStreamer.detected && currentToolCall.name === "settle"
|
|
370
467
|
&& functionCallCount === 1) {
|
|
371
|
-
|
|
372
|
-
if (text)
|
|
373
|
-
callbacks.onTextChunk(text);
|
|
468
|
+
answerStreamer.processDelta(String(event.delta));
|
|
374
469
|
}
|
|
375
470
|
}
|
|
376
471
|
break;
|
|
@@ -410,6 +505,6 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
410
505
|
toolCalls,
|
|
411
506
|
outputItems,
|
|
412
507
|
usage,
|
|
413
|
-
|
|
508
|
+
settleStreamed: answerStreamer.streamed,
|
|
414
509
|
};
|
|
415
510
|
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sync failure taxonomy classifier — Layer 2 of the harness-hardening sequence.
|
|
4
|
+
*
|
|
5
|
+
* Pure pattern-matcher over (error, context) that turns common git failure
|
|
6
|
+
* shapes into the locked taxonomy variants. Used by `runBootSyncProbe` (the
|
|
7
|
+
* `ouro up` pre-flight pull orchestrator) and by `postTurnPush`'s legacy
|
|
8
|
+
* push-rejected/conflict path so both producers share one vocabulary.
|
|
9
|
+
*
|
|
10
|
+
* Pattern priority — most actionable / specific wins:
|
|
11
|
+
* 1. Abort signal (timeout-soft / timeout-hard) — caller explicitly aborted.
|
|
12
|
+
* 2. not-found-404 — 404 / "Repository not found": remote endpoint gone.
|
|
13
|
+
* 3. auth-failed — 401 / 403 / "Authentication failed".
|
|
14
|
+
* 4. network-down — ENOTFOUND / ECONNREFUSED / "Could not resolve host".
|
|
15
|
+
* 5. dirty-working-tree — "would be overwritten" / "stash them".
|
|
16
|
+
* 6. merge-conflict — CONFLICT marker in stderr (also collects file list).
|
|
17
|
+
* 7. non-fast-forward — "non-fast-forward" / "fetch first".
|
|
18
|
+
* 8. unknown — fallthrough.
|
|
19
|
+
*
|
|
20
|
+
* The classifier never throws and never writes to disk. It calls
|
|
21
|
+
* `git status --porcelain=v1` only when it has already classified the error
|
|
22
|
+
* as a merge conflict, to enumerate unmerged paths for the consumer.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.classifySyncFailure = classifySyncFailure;
|
|
26
|
+
const child_process_1 = require("child_process");
|
|
27
|
+
/**
|
|
28
|
+
* Enumerate unmerged paths via `git status --porcelain=v1`. Pulled out as a
|
|
29
|
+
* pure helper so the classifier can be tested without a live git repo (the
|
|
30
|
+
* caller mocks `child_process.execFileSync`).
|
|
31
|
+
*
|
|
32
|
+
* Mirrors `sync.ts:collectRebaseConflictFiles` — kept as a separate copy here
|
|
33
|
+
* so this module has zero internal dep on `sync.ts`. The caller of
|
|
34
|
+
* `classifySyncFailure` doesn't see the duplication; the runtime cost is one
|
|
35
|
+
* git invocation per merge-conflict classification, same as before.
|
|
36
|
+
*/
|
|
37
|
+
function collectConflictFiles(agentRoot) {
|
|
38
|
+
try {
|
|
39
|
+
const output = (0, child_process_1.execFileSync)("git", ["status", "--porcelain=v1"], {
|
|
40
|
+
cwd: agentRoot,
|
|
41
|
+
stdio: "pipe",
|
|
42
|
+
timeout: 5000,
|
|
43
|
+
}).toString();
|
|
44
|
+
const files = [];
|
|
45
|
+
for (const line of output.split("\n")) {
|
|
46
|
+
// Unmerged paths in porcelain v1 are prefixed with UU/AA/DD/AU/UA/DU/UD.
|
|
47
|
+
if (/^(UU|AA|DD|AU|UA|DU|UD) /.test(line)) {
|
|
48
|
+
files.push(line.slice(3).trim());
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* v8 ignore next -- defensive: git status failure inside a git repo would require a corrupt repo @preserve */
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function isAbortError(error) {
|
|
59
|
+
if (typeof error !== "object" || error === null)
|
|
60
|
+
return false;
|
|
61
|
+
const candidate = error;
|
|
62
|
+
if (candidate.name === "AbortError")
|
|
63
|
+
return true;
|
|
64
|
+
if (candidate.code === "ABORT_ERR")
|
|
65
|
+
return true;
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
function readMessage(error) {
|
|
69
|
+
if (error instanceof Error)
|
|
70
|
+
return error.message;
|
|
71
|
+
if (typeof error === "string")
|
|
72
|
+
return error;
|
|
73
|
+
if (error === null || error === undefined)
|
|
74
|
+
return String(error);
|
|
75
|
+
try {
|
|
76
|
+
return JSON.stringify(error);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* v8 ignore next -- defensive: JSON.stringify only fails on circular/BigInt; real-world git errors don't trigger it @preserve */
|
|
80
|
+
return String(error);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function readErrorCode(error) {
|
|
84
|
+
if (typeof error !== "object" || error === null)
|
|
85
|
+
return undefined;
|
|
86
|
+
const code = error.code;
|
|
87
|
+
return typeof code === "string" ? code : undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Classify a sync failure into one of the locked taxonomy variants.
|
|
91
|
+
*
|
|
92
|
+
* Pure: never throws, never writes. Calls `git status` only when the error
|
|
93
|
+
* was already classified as a merge conflict, to enumerate unmerged files.
|
|
94
|
+
*/
|
|
95
|
+
function classifySyncFailure(error, context) {
|
|
96
|
+
const message = readMessage(error);
|
|
97
|
+
const errorCode = readErrorCode(error);
|
|
98
|
+
// 1. Abort signal — highest priority. Caller's signal trumps content match.
|
|
99
|
+
if (isAbortError(error)) {
|
|
100
|
+
const reason = context.abortReason ?? "hard";
|
|
101
|
+
return {
|
|
102
|
+
classification: reason === "soft" ? "timeout-soft" : "timeout-hard",
|
|
103
|
+
error: message,
|
|
104
|
+
conflictFiles: [],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Lowercased copy for case-insensitive substring matching.
|
|
108
|
+
const lower = message.toLowerCase();
|
|
109
|
+
// 2. Not-found-404 — most actionable diagnosis when both 404 and other
|
|
110
|
+
// signals are present. "404" and "Repository not found" are the canonical
|
|
111
|
+
// shapes.
|
|
112
|
+
if (lower.includes("404") || lower.includes("repository not found")) {
|
|
113
|
+
return {
|
|
114
|
+
classification: "not-found-404",
|
|
115
|
+
error: message,
|
|
116
|
+
conflictFiles: [],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// 3. Auth failed — 401 / 403 / "Authentication failed" / "Permission denied".
|
|
120
|
+
if (lower.includes("401")
|
|
121
|
+
|| lower.includes("403")
|
|
122
|
+
|| lower.includes("authentication failed")
|
|
123
|
+
|| lower.includes("permission denied")) {
|
|
124
|
+
return {
|
|
125
|
+
classification: "auth-failed",
|
|
126
|
+
error: message,
|
|
127
|
+
conflictFiles: [],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// 4. Network down — DNS / connection errors.
|
|
131
|
+
if (errorCode === "ENOTFOUND"
|
|
132
|
+
|| errorCode === "ECONNREFUSED"
|
|
133
|
+
|| lower.includes("enotfound")
|
|
134
|
+
|| lower.includes("econnrefused")
|
|
135
|
+
|| lower.includes("could not resolve host")
|
|
136
|
+
|| lower.includes("connection refused")) {
|
|
137
|
+
return {
|
|
138
|
+
classification: "network-down",
|
|
139
|
+
error: message,
|
|
140
|
+
conflictFiles: [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// 5. Dirty working tree — pull / merge would clobber uncommitted changes.
|
|
144
|
+
if (lower.includes("would be overwritten")
|
|
145
|
+
|| lower.includes("commit your changes or stash them")) {
|
|
146
|
+
return {
|
|
147
|
+
classification: "dirty-working-tree",
|
|
148
|
+
error: message,
|
|
149
|
+
conflictFiles: [],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// 6. Merge conflict — CONFLICT marker in stderr. Collect unmerged files.
|
|
153
|
+
if (lower.includes("conflict")) {
|
|
154
|
+
return {
|
|
155
|
+
classification: "merge-conflict",
|
|
156
|
+
error: message,
|
|
157
|
+
conflictFiles: collectConflictFiles(context.agentRoot),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// 7. Non-fast-forward — push rejected because remote moved.
|
|
161
|
+
if (lower.includes("non-fast-forward")
|
|
162
|
+
|| lower.includes("fetch first")
|
|
163
|
+
|| lower.includes("rejected")) {
|
|
164
|
+
return {
|
|
165
|
+
classification: "non-fast-forward",
|
|
166
|
+
error: message,
|
|
167
|
+
conflictFiles: [],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// 8. Fallthrough.
|
|
171
|
+
return {
|
|
172
|
+
classification: "unknown",
|
|
173
|
+
error: message,
|
|
174
|
+
conflictFiles: [],
|
|
175
|
+
};
|
|
176
|
+
}
|