@ouro.bot/cli 0.1.0-alpha.5 → 0.1.0-alpha.500
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 +226 -183
- package/SerpentGuide.ouro/agent.json +82 -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 +3418 -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 +989 -0
- 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 +426 -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 +111 -0
- package/dist/heart/config-registry.js +304 -0
- package/dist/heart/config.js +193 -130
- package/dist/heart/core.js +1010 -261
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +490 -0
- package/dist/heart/daemon/agent-discovery.js +157 -0
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/agentic-repair.js +216 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +640 -0
- package/dist/heart/daemon/cli-exec.js +7239 -0
- package/dist/heart/daemon/cli-help.js +493 -0
- package/dist/heart/daemon/cli-parse.js +1533 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +561 -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 -697
- package/dist/heart/daemon/daemon-entry.js +359 -8
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +268 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +813 -19
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +615 -0
- package/dist/heart/daemon/health-monitor.js +92 -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 +171 -0
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- 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 +215 -1
- 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 +431 -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 +307 -0
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +264 -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 +54 -136
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- 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 +274 -61
- 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/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/outlook/outlook-http-hooks.js +66 -0
- package/dist/heart/outlook/outlook-http-response.js +7 -0
- package/dist/heart/outlook/outlook-http-routes.js +244 -0
- package/dist/heart/outlook/outlook-http-static.js +103 -0
- package/dist/heart/outlook/outlook-http-transport.js +116 -0
- package/dist/heart/outlook/outlook-http.js +99 -0
- package/dist/heart/outlook/outlook-read.js +31 -0
- package/dist/heart/outlook/outlook-types.js +27 -0
- package/dist/heart/outlook/outlook-view.js +195 -0
- package/dist/heart/outlook/readers/agent-machine.js +382 -0
- package/dist/heart/outlook/readers/continuity-readers.js +336 -0
- package/dist/heart/outlook/readers/mail.js +362 -0
- package/dist/heart/outlook/readers/runtime-readers.js +644 -0
- package/dist/heart/outlook/readers/sessions.js +232 -0
- package/dist/heart/outlook/readers/shared.js +111 -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 +255 -0
- package/dist/heart/provider-credentials.js +424 -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-state.js +216 -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 +63 -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 +260 -0
- package/dist/heart/sense-truth.js +68 -0
- package/dist/heart/session-activity.js +190 -0
- package/dist/heart/session-events.js +1089 -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-transcript.js +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +129 -34
- package/dist/heart/sync.js +332 -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/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +372 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +425 -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 +115 -0
- package/dist/heart/versioning/update-hooks.js +142 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +606 -0
- package/dist/mailroom/core.js +672 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +426 -0
- package/dist/mailroom/mbox-import.js +382 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +219 -0
- package/dist/mailroom/search-cache.js +182 -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 +173 -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 +73 -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 +1144 -117
- 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 +101 -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/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
- package/dist/outlook-ui/index.html +15 -0
- 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 +774 -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 +111 -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 +255 -0
- package/dist/repertoire/mcp-manager.js +305 -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-base.js +49 -707
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-bridge.js +141 -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 +105 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1377 -0
- package/dist/repertoire/tools-notes.js +376 -0
- package/dist/repertoire/tools-session.js +749 -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 +64 -61
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +356 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +149 -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 +561 -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/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 +73 -0
- package/dist/senses/bluebubbles/inbound-log.js +126 -0
- package/dist/senses/bluebubbles/index.js +1881 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/bluebubbles/model.js +282 -0
- package/dist/senses/bluebubbles/mutation-log.js +116 -0
- package/dist/senses/bluebubbles/processed-log.js +111 -0
- package/dist/senses/bluebubbles/replay.js +129 -0
- package/dist/senses/bluebubbles/runtime-state.js +109 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -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 +605 -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 +83 -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 +768 -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 +199 -16
- package/dist/senses/inner-dialog.js +640 -91
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +665 -0
- 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 +844 -197
- package/dist/senses/trust-gate.js +207 -2
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +47 -6
- 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/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/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
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agentic repair flow for degraded agents detected during `ouro up`.
|
|
4
|
+
*
|
|
5
|
+
* Runs known local repair prompts first, then offers AI-assisted diagnosis
|
|
6
|
+
* when no local repair was attempted and a working LLM provider is available.
|
|
7
|
+
* This is a lightweight integration: one diagnostic LLM call, not a chat loop.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createAgenticDiagnosisProviderRuntime = createAgenticDiagnosisProviderRuntime;
|
|
11
|
+
exports.runAgenticRepair = runAgenticRepair;
|
|
12
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
13
|
+
const interactive_repair_1 = require("./interactive-repair");
|
|
14
|
+
const provider_ping_1 = require("../provider-ping");
|
|
15
|
+
const readiness_repair_1 = require("./readiness-repair");
|
|
16
|
+
function buildSystemPrompt(degraded) {
|
|
17
|
+
const agentList = degraded
|
|
18
|
+
.map((d) => `- ${d.agent}: error="${d.errorReason}", hint="${d.fixHint}"`)
|
|
19
|
+
.join("\n");
|
|
20
|
+
return [
|
|
21
|
+
"You are a diagnostic assistant for the Ouroboros agent daemon.",
|
|
22
|
+
"The daemon detected degraded agents during startup.",
|
|
23
|
+
"Analyze the errors below and provide a concise diagnosis with suggested fixes.",
|
|
24
|
+
"",
|
|
25
|
+
"Degraded agents:",
|
|
26
|
+
agentList,
|
|
27
|
+
"",
|
|
28
|
+
"Keep your response brief and actionable. Focus on the most likely root cause",
|
|
29
|
+
"and the simplest fix the user can apply.",
|
|
30
|
+
].join("\n");
|
|
31
|
+
}
|
|
32
|
+
function buildUserMessage(degraded, logsTail) {
|
|
33
|
+
const agentDetails = degraded
|
|
34
|
+
.map((d) => `Agent: ${d.agent}\n Error: ${d.errorReason}\n Fix hint: ${d.fixHint}`)
|
|
35
|
+
.join("\n\n");
|
|
36
|
+
return [
|
|
37
|
+
"Here are the degraded agents and recent daemon logs:",
|
|
38
|
+
"",
|
|
39
|
+
agentDetails,
|
|
40
|
+
"",
|
|
41
|
+
"Recent daemon logs:",
|
|
42
|
+
logsTail,
|
|
43
|
+
"",
|
|
44
|
+
"What is the most likely cause and how should I fix it?",
|
|
45
|
+
].join("\n");
|
|
46
|
+
}
|
|
47
|
+
function makeInteractiveRepairDeps(deps) {
|
|
48
|
+
return {
|
|
49
|
+
promptInput: deps.promptInput,
|
|
50
|
+
writeStdout: deps.writeStdout,
|
|
51
|
+
/* v8 ignore next -- fallback no-op: tests always inject runAuthFlow; default is for production @preserve */
|
|
52
|
+
runAuthFlow: deps.runAuthFlow ?? (async () => undefined),
|
|
53
|
+
runVaultUnlock: deps.runVaultUnlock,
|
|
54
|
+
skipQueueSummary: deps.skipQueueSummary,
|
|
55
|
+
isTTY: deps.isTTY,
|
|
56
|
+
stdoutColumns: deps.stdoutColumns,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function runDeterministicRepair(degraded, deps) {
|
|
60
|
+
return deps.runInteractiveRepair(degraded, makeInteractiveRepairDeps(deps));
|
|
61
|
+
}
|
|
62
|
+
function discoveredProviderModel(provider) {
|
|
63
|
+
const model = provider.providerConfig.model?.trim();
|
|
64
|
+
return model ? model : undefined;
|
|
65
|
+
}
|
|
66
|
+
function createAgenticDiagnosisProviderRuntime(provider) {
|
|
67
|
+
const config = {
|
|
68
|
+
...provider.providerConfig,
|
|
69
|
+
...provider.credentials,
|
|
70
|
+
};
|
|
71
|
+
return (0, provider_ping_1.createProviderRuntimeForConfig)(provider.provider, config, {
|
|
72
|
+
model: discoveredProviderModel(provider),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function tryAgenticDiagnosis(degraded, provider, deps) {
|
|
76
|
+
const logsTail = deps.readDaemonLogsTail();
|
|
77
|
+
const runtime = deps.createProviderRuntime(provider);
|
|
78
|
+
const systemPrompt = buildSystemPrompt(degraded);
|
|
79
|
+
const userMessage = buildUserMessage(degraded, logsTail);
|
|
80
|
+
const messages = [
|
|
81
|
+
{ role: "system", content: systemPrompt },
|
|
82
|
+
{ role: "user", content: userMessage },
|
|
83
|
+
];
|
|
84
|
+
/* v8 ignore start -- no-op callbacks: satisfy interface contract, never invoked by diagnostic call @preserve */
|
|
85
|
+
const noopCallbacks = {
|
|
86
|
+
onModelStart: () => { },
|
|
87
|
+
onModelStreamStart: () => { },
|
|
88
|
+
onTextChunk: () => { },
|
|
89
|
+
onReasoningChunk: () => { },
|
|
90
|
+
onToolStart: () => { },
|
|
91
|
+
onToolEnd: () => { },
|
|
92
|
+
onError: () => { },
|
|
93
|
+
};
|
|
94
|
+
/* v8 ignore stop */
|
|
95
|
+
const result = await runtime.streamTurn({
|
|
96
|
+
messages,
|
|
97
|
+
activeTools: [],
|
|
98
|
+
callbacks: noopCallbacks,
|
|
99
|
+
});
|
|
100
|
+
if (result.content) {
|
|
101
|
+
deps.writeStdout("");
|
|
102
|
+
deps.writeStdout("--- AI Diagnosis ---");
|
|
103
|
+
deps.writeStdout(result.content);
|
|
104
|
+
deps.writeStdout("--- End Diagnosis ---");
|
|
105
|
+
deps.writeStdout("");
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
async function runAgenticRepair(degraded, deps) {
|
|
110
|
+
(0, runtime_1.emitNervesEvent)({
|
|
111
|
+
level: "info",
|
|
112
|
+
component: "daemon",
|
|
113
|
+
event: "daemon.agentic_repair_start",
|
|
114
|
+
message: "agentic repair flow started",
|
|
115
|
+
meta: { degradedCount: degraded.length },
|
|
116
|
+
});
|
|
117
|
+
if (degraded.length === 0) {
|
|
118
|
+
return { repairsAttempted: false, usedAgentic: false };
|
|
119
|
+
}
|
|
120
|
+
const hasLocalRepair = degraded.some(interactive_repair_1.hasRunnableInteractiveRepair);
|
|
121
|
+
const hasKnownTypedRepair = degraded.some((entry) => (0, readiness_repair_1.isKnownReadinessIssue)(entry.issue));
|
|
122
|
+
if (hasLocalRepair) {
|
|
123
|
+
const interactiveResult = await runDeterministicRepair(degraded, deps);
|
|
124
|
+
if (interactiveResult.repairsAttempted) {
|
|
125
|
+
return { repairsAttempted: true, usedAgentic: false };
|
|
126
|
+
}
|
|
127
|
+
if (hasKnownTypedRepair) {
|
|
128
|
+
return { repairsAttempted: false, usedAgentic: false };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (hasKnownTypedRepair) {
|
|
132
|
+
return { repairsAttempted: false, usedAgentic: false };
|
|
133
|
+
}
|
|
134
|
+
// Try to discover a working provider for agentic diagnosis
|
|
135
|
+
let discoveredProvider = null;
|
|
136
|
+
try {
|
|
137
|
+
discoveredProvider = await deps.discoverWorkingProvider(degraded[0].agent);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
141
|
+
(0, runtime_1.emitNervesEvent)({
|
|
142
|
+
level: "warn",
|
|
143
|
+
component: "daemon",
|
|
144
|
+
event: "daemon.agentic_repair_discovery_error",
|
|
145
|
+
message: `provider discovery failed during agentic repair: ${msg}`,
|
|
146
|
+
meta: { error: msg },
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (!discoveredProvider) {
|
|
150
|
+
// No working provider — fall back to deterministic repair
|
|
151
|
+
(0, runtime_1.emitNervesEvent)({
|
|
152
|
+
level: "info",
|
|
153
|
+
component: "daemon",
|
|
154
|
+
event: "daemon.agentic_repair_no_provider",
|
|
155
|
+
message: "no working provider found, falling back to deterministic repair",
|
|
156
|
+
meta: {},
|
|
157
|
+
});
|
|
158
|
+
if (hasLocalRepair) {
|
|
159
|
+
return { repairsAttempted: false, usedAgentic: false };
|
|
160
|
+
}
|
|
161
|
+
const interactiveResult = await runDeterministicRepair(degraded, deps);
|
|
162
|
+
return { repairsAttempted: interactiveResult.repairsAttempted, usedAgentic: false };
|
|
163
|
+
}
|
|
164
|
+
// Offer agentic diagnosis
|
|
165
|
+
const answer = await deps.promptInput("would you like AI-assisted diagnosis? [y/n] ");
|
|
166
|
+
if (!(0, interactive_repair_1.isAffirmativeAnswer)(answer)) {
|
|
167
|
+
// User declined — fall back to deterministic repair
|
|
168
|
+
(0, runtime_1.emitNervesEvent)({
|
|
169
|
+
level: "info",
|
|
170
|
+
component: "daemon",
|
|
171
|
+
event: "daemon.agentic_repair_declined",
|
|
172
|
+
message: "user declined agentic diagnosis",
|
|
173
|
+
meta: {},
|
|
174
|
+
});
|
|
175
|
+
if (hasLocalRepair) {
|
|
176
|
+
return { repairsAttempted: false, usedAgentic: false };
|
|
177
|
+
}
|
|
178
|
+
const interactiveResult = await runDeterministicRepair(degraded, deps);
|
|
179
|
+
return { repairsAttempted: interactiveResult.repairsAttempted, usedAgentic: false };
|
|
180
|
+
}
|
|
181
|
+
// User accepted — run agentic diagnosis then fall through to deterministic repair
|
|
182
|
+
let usedAgentic = false;
|
|
183
|
+
try {
|
|
184
|
+
usedAgentic = await tryAgenticDiagnosis(degraded, discoveredProvider, deps);
|
|
185
|
+
(0, runtime_1.emitNervesEvent)({
|
|
186
|
+
level: "info",
|
|
187
|
+
component: "daemon",
|
|
188
|
+
event: "daemon.agentic_repair_diagnosis_complete",
|
|
189
|
+
message: "agentic diagnosis completed, proceeding to deterministic repair",
|
|
190
|
+
meta: { provider: discoveredProvider.provider },
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
195
|
+
deps.writeStdout(`AI diagnosis failed: ${msg}`);
|
|
196
|
+
(0, runtime_1.emitNervesEvent)({
|
|
197
|
+
level: "warn",
|
|
198
|
+
component: "daemon",
|
|
199
|
+
event: "daemon.agentic_repair_diagnosis_error",
|
|
200
|
+
message: `agentic diagnosis failed: ${msg}`,
|
|
201
|
+
meta: { error: msg, provider: discoveredProvider.provider },
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
// Always fall through to deterministic repair for actionable fixes
|
|
205
|
+
const interactiveResult = hasLocalRepair
|
|
206
|
+
? { repairsAttempted: false }
|
|
207
|
+
: await runDeterministicRepair(degraded, deps);
|
|
208
|
+
(0, runtime_1.emitNervesEvent)({
|
|
209
|
+
level: "info",
|
|
210
|
+
component: "daemon",
|
|
211
|
+
event: "daemon.agentic_repair_end",
|
|
212
|
+
message: "agentic repair flow completed",
|
|
213
|
+
meta: { usedAgentic, repairsAttempted: interactiveResult.repairsAttempted },
|
|
214
|
+
});
|
|
215
|
+
return { repairsAttempted: interactiveResult.repairsAttempted, usedAgentic };
|
|
216
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stringifyBlueBubblesHealthError = stringifyBlueBubblesHealthError;
|
|
4
|
+
exports.redactBlueBubblesHealthDetailForNerves = redactBlueBubblesHealthDetailForNerves;
|
|
5
|
+
exports.formatBlueBubblesHealthcheckFailure = formatBlueBubblesHealthcheckFailure;
|
|
6
|
+
exports.probeBlueBubblesHealth = probeBlueBubblesHealth;
|
|
7
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
8
|
+
const error_classification_1 = require("../providers/error-classification");
|
|
9
|
+
function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
|
|
10
|
+
const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
11
|
+
const url = new URL(endpoint.replace(/^\//, ""), root);
|
|
12
|
+
url.searchParams.set("password", password);
|
|
13
|
+
return url.toString();
|
|
14
|
+
}
|
|
15
|
+
function stringifyBlueBubblesHealthError(error) {
|
|
16
|
+
if (error instanceof Error) {
|
|
17
|
+
const message = error.message.trim();
|
|
18
|
+
if (message)
|
|
19
|
+
return message;
|
|
20
|
+
return error.name || "unknown";
|
|
21
|
+
}
|
|
22
|
+
const value = String(error).trim();
|
|
23
|
+
return value || "unknown";
|
|
24
|
+
}
|
|
25
|
+
function redactBlueBubblesHealthDetailForNerves(detail) {
|
|
26
|
+
return detail
|
|
27
|
+
.replace(/\bbluebubbles\.password\b/gi, "bluebubbles credential")
|
|
28
|
+
.replace(/\bpassword\b/gi, "credential");
|
|
29
|
+
}
|
|
30
|
+
function blueBubblesHealthStatus(error) {
|
|
31
|
+
return error instanceof Error && typeof error.status === "number"
|
|
32
|
+
? error.status
|
|
33
|
+
: null;
|
|
34
|
+
}
|
|
35
|
+
function blueBubblesHealthClassification(error) {
|
|
36
|
+
return error instanceof Error ? (0, error_classification_1.classifyHttpError)(error) : "unknown";
|
|
37
|
+
}
|
|
38
|
+
function formatBlueBubblesHealthcheckFailure(serverUrlInput, error) {
|
|
39
|
+
const serverUrl = serverUrlInput.trim() || "configured BlueBubbles server";
|
|
40
|
+
const rawReason = stringifyBlueBubblesHealthError(error);
|
|
41
|
+
const status = blueBubblesHealthStatus(error);
|
|
42
|
+
if (!(error instanceof Error)) {
|
|
43
|
+
return `BlueBubbles health check failed at ${serverUrl}. Check \`bluebubbles.serverUrl\`, confirm the BlueBubbles app/API is running, and inspect daemon logs. Raw error: ${rawReason}`;
|
|
44
|
+
}
|
|
45
|
+
switch (blueBubblesHealthClassification(error)) {
|
|
46
|
+
case "network-error":
|
|
47
|
+
return `Cannot reach BlueBubbles at ${serverUrl}. Check \`bluebubbles.serverUrl\`, confirm the BlueBubbles app/API is running, and verify this machine can reach it. Raw error: ${rawReason}`;
|
|
48
|
+
case "auth-failure":
|
|
49
|
+
return `BlueBubbles auth failed at ${serverUrl} (HTTP ${status}). Check this machine's BlueBubbles attachment with \`ouro connect bluebubbles --agent <agent>\` and confirm the server accepts the password. Raw error: ${rawReason}`;
|
|
50
|
+
case "server-error":
|
|
51
|
+
return `BlueBubbles upstream returned HTTP ${status} at ${serverUrl}. Check the BlueBubbles app/server logs and confirm the upstream API is healthy. Raw error: ${rawReason}`;
|
|
52
|
+
default:
|
|
53
|
+
return `BlueBubbles health check failed at ${serverUrl}${status === null ? "" : ` (HTTP ${status})`}. Check \`bluebubbles.serverUrl\`, the BlueBubbles server configuration, and daemon logs. Raw error: ${rawReason}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function probeBlueBubblesHealth(input) {
|
|
57
|
+
try {
|
|
58
|
+
const url = buildBlueBubblesApiUrl(input.serverUrl, "/api/v1/message/count", input.password);
|
|
59
|
+
const response = await input.fetchImpl(url, {
|
|
60
|
+
method: "GET",
|
|
61
|
+
signal: AbortSignal.timeout(input.requestTimeoutMs),
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
const errorText = await response.text().catch(() => "");
|
|
65
|
+
const error = new Error(errorText || "unknown");
|
|
66
|
+
error.status = response.status;
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
(0, runtime_1.emitNervesEvent)({
|
|
70
|
+
component: "daemon",
|
|
71
|
+
event: "daemon.bluebubbles_health_probe_checked",
|
|
72
|
+
message: "checked bluebubbles upstream health",
|
|
73
|
+
meta: {
|
|
74
|
+
serverUrl: input.serverUrl,
|
|
75
|
+
ok: true,
|
|
76
|
+
status: response.status,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
ok: true,
|
|
81
|
+
detail: "upstream reachable",
|
|
82
|
+
reason: null,
|
|
83
|
+
status: response.status,
|
|
84
|
+
classification: null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const detail = formatBlueBubblesHealthcheckFailure(input.serverUrl, error);
|
|
89
|
+
const reason = stringifyBlueBubblesHealthError(error);
|
|
90
|
+
const status = blueBubblesHealthStatus(error);
|
|
91
|
+
const classification = blueBubblesHealthClassification(error);
|
|
92
|
+
(0, runtime_1.emitNervesEvent)({
|
|
93
|
+
level: "warn",
|
|
94
|
+
component: "daemon",
|
|
95
|
+
event: "daemon.bluebubbles_health_probe_checked",
|
|
96
|
+
message: "checked bluebubbles upstream health",
|
|
97
|
+
meta: {
|
|
98
|
+
serverUrl: input.serverUrl,
|
|
99
|
+
ok: false,
|
|
100
|
+
status,
|
|
101
|
+
reason,
|
|
102
|
+
classification,
|
|
103
|
+
detail: redactBlueBubblesHealthDetailForNerves(detail),
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
ok: false,
|
|
108
|
+
detail,
|
|
109
|
+
reason,
|
|
110
|
+
status,
|
|
111
|
+
classification,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/* v8 ignore start -- module load observability event */
|
|
116
|
+
(0, runtime_1.emitNervesEvent)({
|
|
117
|
+
component: "daemon",
|
|
118
|
+
event: "daemon.bluebubbles_health_diagnostics_loaded",
|
|
119
|
+
message: "bluebubbles health diagnostics loaded",
|
|
120
|
+
meta: {},
|
|
121
|
+
});
|
|
122
|
+
/* v8 ignore stop */
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_CADENCE_MS = void 0;
|
|
4
|
+
exports.parseCadenceToCron = parseCadenceToCron;
|
|
5
|
+
exports.parseCadenceToMs = parseCadenceToMs;
|
|
6
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
7
|
+
exports.DEFAULT_CADENCE_MS = 30 * 60 * 1000; // 30 minutes
|
|
8
|
+
/**
|
|
9
|
+
* Parse a cadence shorthand (e.g. "30m", "2h", "1d") into a cron string.
|
|
10
|
+
* Also accepts raw cron strings (5 space-separated fields) and passes them through.
|
|
11
|
+
* Returns null for invalid input.
|
|
12
|
+
*/
|
|
13
|
+
function parseCadenceToCron(raw) {
|
|
14
|
+
if (typeof raw !== "string")
|
|
15
|
+
return null;
|
|
16
|
+
const value = raw.trim();
|
|
17
|
+
if (!value)
|
|
18
|
+
return null;
|
|
19
|
+
// Cron format (minute hour day month weekday)
|
|
20
|
+
if (/^\S+\s+\S+\s+\S+\s+\S+\s+\S+$/.test(value)) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
const cadenceMatch = /^(\d+)(m|h|d)$/.exec(value);
|
|
24
|
+
if (!cadenceMatch)
|
|
25
|
+
return null;
|
|
26
|
+
const interval = Number.parseInt(cadenceMatch[1], 10);
|
|
27
|
+
if (!Number.isFinite(interval) || interval <= 0)
|
|
28
|
+
return null;
|
|
29
|
+
(0, runtime_1.emitNervesEvent)({
|
|
30
|
+
event: "daemon.cadence_parsed",
|
|
31
|
+
component: "daemon",
|
|
32
|
+
message: "parsed cadence shorthand to cron",
|
|
33
|
+
meta: { raw: value, interval, unit: cadenceMatch[2] },
|
|
34
|
+
});
|
|
35
|
+
const unit = cadenceMatch[2];
|
|
36
|
+
if (unit === "m")
|
|
37
|
+
return `*/${interval} * * * *`;
|
|
38
|
+
if (unit === "h")
|
|
39
|
+
return `0 */${interval} * * *`;
|
|
40
|
+
return `0 0 */${interval} * *`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse a cadence shorthand (e.g. "30m", "2h", "1d") into milliseconds.
|
|
44
|
+
* Returns null for invalid input.
|
|
45
|
+
*/
|
|
46
|
+
function parseCadenceToMs(raw) {
|
|
47
|
+
if (typeof raw !== "string")
|
|
48
|
+
return null;
|
|
49
|
+
const value = raw.trim();
|
|
50
|
+
if (!value)
|
|
51
|
+
return null;
|
|
52
|
+
const match = /^(\d+)(m|h|d)$/.exec(value);
|
|
53
|
+
if (!match)
|
|
54
|
+
return null;
|
|
55
|
+
const interval = Number.parseInt(match[1], 10);
|
|
56
|
+
if (!Number.isFinite(interval) || interval <= 0)
|
|
57
|
+
return null;
|
|
58
|
+
(0, runtime_1.emitNervesEvent)({
|
|
59
|
+
event: "daemon.cadence_parsed_ms",
|
|
60
|
+
component: "daemon",
|
|
61
|
+
message: "parsed cadence shorthand to milliseconds",
|
|
62
|
+
meta: { raw: value, interval, unit: match[2] },
|
|
63
|
+
});
|
|
64
|
+
const unit = match[2];
|
|
65
|
+
if (unit === "m")
|
|
66
|
+
return interval * 60 * 1000;
|
|
67
|
+
if (unit === "h")
|
|
68
|
+
return interval * 60 * 60 * 1000;
|
|
69
|
+
return interval * 24 * 60 * 60 * 1000;
|
|
70
|
+
}
|