@ouro.bot/cli 0.1.0-alpha.51 → 0.1.0-alpha.511
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 +133 -19
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -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 +3253 -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 +867 -35
- 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/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 +119 -129
- package/dist/heart/core.js +878 -244
- 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 +79 -3
- 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 +7241 -0
- package/dist/heart/daemon/cli-help.js +493 -0
- package/dist/heart/daemon/cli-parse.js +1536 -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 +29 -1631
- package/dist/heart/daemon/daemon-entry.js +345 -3
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +677 -58
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +750 -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 +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 +25 -5
- 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 +2 -2
- 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 +214 -0
- 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 +73 -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 +178 -37
- 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 +109 -4
- 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 +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 +52 -117
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- 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 +205 -66
- 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/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -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/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 +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 +260 -0
- package/dist/heart/sense-truth.js +11 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1150 -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 +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- 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/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +425 -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 +5 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- 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/body-cache.js +61 -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 +7 -1
- package/dist/mind/context.js +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +74 -93
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +30 -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 +39 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- 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 +940 -111
- 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 +114 -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/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 +15 -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 +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 +111 -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 +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 +46 -955
- package/dist/repertoire/tools-bluebubbles.js +1 -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 +1477 -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 +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +422 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +107 -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 +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 → bluebubbles/client.js} +219 -18
- package/dist/senses/bluebubbles/entry.js +73 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +1881 -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 +111 -0
- package/dist/senses/bluebubbles/replay.js +129 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -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 +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 +511 -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 +573 -164
- 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 +405 -170
- package/dist/senses/trust-gate.js +100 -5
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +37 -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/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 -1142
- 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,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyPerplexityCapability = verifyPerplexityCapability;
|
|
4
|
+
exports.verifyEmbeddingsCapability = verifyEmbeddingsCapability;
|
|
5
|
+
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
function sanitizeCapabilityError(message) {
|
|
7
|
+
const statusMatch = message.match(/^(\d{3})\s/);
|
|
8
|
+
if (!statusMatch)
|
|
9
|
+
return message;
|
|
10
|
+
const status = statusMatch[1];
|
|
11
|
+
const body = message.slice(status.length).trim();
|
|
12
|
+
if (body.startsWith("<") || body.includes("<!DOCTYPE") || body.includes("<html")) {
|
|
13
|
+
return `HTTP ${status}`;
|
|
14
|
+
}
|
|
15
|
+
if (body.startsWith("{")) {
|
|
16
|
+
try {
|
|
17
|
+
const json = JSON.parse(body);
|
|
18
|
+
const inner = json?.error?.message;
|
|
19
|
+
if (typeof inner === "string" && inner && inner !== "Error") {
|
|
20
|
+
return `${status} ${inner}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Keep the HTTP status fallback below.
|
|
25
|
+
}
|
|
26
|
+
return `HTTP ${status}`;
|
|
27
|
+
}
|
|
28
|
+
return message;
|
|
29
|
+
}
|
|
30
|
+
async function readHttpFailureSummary(response) {
|
|
31
|
+
let detail = `${response.status} ${response.statusText}`.trim();
|
|
32
|
+
try {
|
|
33
|
+
const json = await response.json();
|
|
34
|
+
if (typeof json.error === "string" && json.error.trim()) {
|
|
35
|
+
detail = `${response.status} ${json.error}`;
|
|
36
|
+
}
|
|
37
|
+
else if (typeof json.error === "object" && json.error !== null) {
|
|
38
|
+
const errObj = json.error;
|
|
39
|
+
if (typeof errObj.message === "string" && errObj.message.trim()) {
|
|
40
|
+
detail = `${response.status} ${errObj.message}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (typeof json.message === "string" && json.message.trim()) {
|
|
44
|
+
detail = `${response.status} ${json.message}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Keep the HTTP status summary if the body is not JSON.
|
|
49
|
+
}
|
|
50
|
+
return sanitizeCapabilityError(detail);
|
|
51
|
+
}
|
|
52
|
+
function reportRuntimeCapabilityCheckStart(capability, url) {
|
|
53
|
+
(0, runtime_1.emitNervesEvent)({
|
|
54
|
+
component: "daemon",
|
|
55
|
+
event: "daemon.runtime_capability_check_start",
|
|
56
|
+
message: "starting runtime capability check",
|
|
57
|
+
meta: { capability, url },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function reportRuntimeCapabilityCheckEnd(capability, url) {
|
|
61
|
+
(0, runtime_1.emitNervesEvent)({
|
|
62
|
+
component: "daemon",
|
|
63
|
+
event: "daemon.runtime_capability_check_end",
|
|
64
|
+
message: "runtime capability check passed",
|
|
65
|
+
meta: { capability, url },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function reportRuntimeCapabilityCheckError(capability, url, summary) {
|
|
69
|
+
(0, runtime_1.emitNervesEvent)({
|
|
70
|
+
level: "warn",
|
|
71
|
+
component: "daemon",
|
|
72
|
+
event: "daemon.runtime_capability_check_error",
|
|
73
|
+
message: "runtime capability check failed",
|
|
74
|
+
meta: { capability, url, summary },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function verifyPerplexityCapability(apiKey, fetchImpl = fetch) {
|
|
78
|
+
const url = "https://api.perplexity.ai/search";
|
|
79
|
+
reportRuntimeCapabilityCheckStart("perplexity-search", url);
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetchImpl(url, {
|
|
82
|
+
method: "POST",
|
|
83
|
+
headers: {
|
|
84
|
+
Authorization: `Bearer ${apiKey}`,
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
},
|
|
87
|
+
body: JSON.stringify({
|
|
88
|
+
query: "ping",
|
|
89
|
+
max_results: 1,
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
const summary = await readHttpFailureSummary(response);
|
|
94
|
+
reportRuntimeCapabilityCheckError("perplexity-search", url, summary);
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
summary,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const payload = await response.json();
|
|
101
|
+
if (!Array.isArray(payload.results) || payload.results.length === 0) {
|
|
102
|
+
const summary = "Perplexity returned no search results";
|
|
103
|
+
reportRuntimeCapabilityCheckError("perplexity-search", url, summary);
|
|
104
|
+
return {
|
|
105
|
+
ok: false,
|
|
106
|
+
summary,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
reportRuntimeCapabilityCheckEnd("perplexity-search", url);
|
|
110
|
+
return {
|
|
111
|
+
ok: true,
|
|
112
|
+
summary: "live check passed",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const summary = sanitizeCapabilityError(error instanceof Error ? error.message : String(error));
|
|
117
|
+
reportRuntimeCapabilityCheckError("perplexity-search", url, summary);
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
summary,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function verifyEmbeddingsCapability(apiKey, fetchImpl = fetch) {
|
|
125
|
+
const url = "https://api.openai.com/v1/embeddings";
|
|
126
|
+
reportRuntimeCapabilityCheckStart("memory-embeddings", url);
|
|
127
|
+
try {
|
|
128
|
+
const response = await fetchImpl(url, {
|
|
129
|
+
method: "POST",
|
|
130
|
+
headers: {
|
|
131
|
+
Authorization: `Bearer ${apiKey}`,
|
|
132
|
+
"Content-Type": "application/json",
|
|
133
|
+
},
|
|
134
|
+
body: JSON.stringify({
|
|
135
|
+
model: "text-embedding-3-small",
|
|
136
|
+
input: ["ping"],
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
if (!response.ok) {
|
|
140
|
+
const summary = await readHttpFailureSummary(response);
|
|
141
|
+
reportRuntimeCapabilityCheckError("memory-embeddings", url, summary);
|
|
142
|
+
return {
|
|
143
|
+
ok: false,
|
|
144
|
+
summary,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const payload = await response.json();
|
|
148
|
+
if (!Array.isArray(payload.data) || payload.data.length !== 1 || !Array.isArray(payload.data[0]?.embedding) || payload.data[0].embedding.length === 0) {
|
|
149
|
+
const summary = "embeddings response missing expected vectors";
|
|
150
|
+
reportRuntimeCapabilityCheckError("memory-embeddings", url, summary);
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
summary,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
reportRuntimeCapabilityCheckEnd("memory-embeddings", url);
|
|
157
|
+
return {
|
|
158
|
+
ok: true,
|
|
159
|
+
summary: "live check passed",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
const summary = sanitizeCapabilityError(error instanceof Error ? error.message : String(error));
|
|
164
|
+
reportRuntimeCapabilityCheckError("memory-embeddings", url, summary);
|
|
165
|
+
return {
|
|
166
|
+
ok: false,
|
|
167
|
+
summary,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
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.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX = exports.RUNTIME_CONFIG_ITEM_NAME = void 0;
|
|
37
|
+
exports.machineRuntimeConfigItemName = machineRuntimeConfigItemName;
|
|
38
|
+
exports.readRuntimeCredentialConfig = readRuntimeCredentialConfig;
|
|
39
|
+
exports.readMachineRuntimeCredentialConfig = readMachineRuntimeCredentialConfig;
|
|
40
|
+
exports.cacheRuntimeCredentialConfig = cacheRuntimeCredentialConfig;
|
|
41
|
+
exports.cacheMachineRuntimeCredentialConfig = cacheMachineRuntimeCredentialConfig;
|
|
42
|
+
exports.refreshRuntimeCredentialConfig = refreshRuntimeCredentialConfig;
|
|
43
|
+
exports.refreshMachineRuntimeCredentialConfig = refreshMachineRuntimeCredentialConfig;
|
|
44
|
+
exports.upsertRuntimeCredentialConfig = upsertRuntimeCredentialConfig;
|
|
45
|
+
exports.upsertMachineRuntimeCredentialConfig = upsertMachineRuntimeCredentialConfig;
|
|
46
|
+
exports.resetRuntimeCredentialConfigCache = resetRuntimeCredentialConfigCache;
|
|
47
|
+
const crypto = __importStar(require("node:crypto"));
|
|
48
|
+
const runtime_1 = require("../nerves/runtime");
|
|
49
|
+
const credential_access_1 = require("../repertoire/credential-access");
|
|
50
|
+
const identity_1 = require("./identity");
|
|
51
|
+
exports.RUNTIME_CONFIG_ITEM_NAME = "runtime/config";
|
|
52
|
+
exports.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX = "runtime/machines";
|
|
53
|
+
let cachedRuntimeConfigs = new Map();
|
|
54
|
+
let cachedMachineRuntimeConfigs = new Map();
|
|
55
|
+
function isRecord(value) {
|
|
56
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
57
|
+
}
|
|
58
|
+
function stableJson(value) {
|
|
59
|
+
if (Array.isArray(value))
|
|
60
|
+
return `[${value.map(stableJson).join(",")}]`;
|
|
61
|
+
if (isRecord(value)) {
|
|
62
|
+
return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`).join(",")}}`;
|
|
63
|
+
}
|
|
64
|
+
return JSON.stringify(value);
|
|
65
|
+
}
|
|
66
|
+
function runtimeConfigVaultPath(agentName, itemName = exports.RUNTIME_CONFIG_ITEM_NAME) {
|
|
67
|
+
return `vault:${agentName}:${itemName}`;
|
|
68
|
+
}
|
|
69
|
+
function machineRuntimeConfigItemName(machineId) {
|
|
70
|
+
const normalized = machineId.trim();
|
|
71
|
+
if (!normalized)
|
|
72
|
+
throw new Error("machineId must be non-empty");
|
|
73
|
+
return `${exports.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX}/${normalized}/config`;
|
|
74
|
+
}
|
|
75
|
+
function runtimeConfigRevision(payload) {
|
|
76
|
+
return `runtime_${crypto
|
|
77
|
+
.createHash("sha256")
|
|
78
|
+
.update(stableJson(payload))
|
|
79
|
+
.digest("hex")
|
|
80
|
+
.slice(0, 16)}`;
|
|
81
|
+
}
|
|
82
|
+
function validateRuntimeCredentialPayload(value) {
|
|
83
|
+
if (!isRecord(value))
|
|
84
|
+
throw new Error("runtime credential payload must be an object");
|
|
85
|
+
if (value.schemaVersion !== 1)
|
|
86
|
+
throw new Error("runtime credential payload schemaVersion must be 1");
|
|
87
|
+
if (value.kind !== "runtime-config")
|
|
88
|
+
throw new Error("runtime credential payload kind must be runtime-config");
|
|
89
|
+
if (typeof value.updatedAt !== "string" || value.updatedAt.trim().length === 0) {
|
|
90
|
+
throw new Error("runtime credential payload updatedAt must be non-empty");
|
|
91
|
+
}
|
|
92
|
+
if (!isRecord(value.config))
|
|
93
|
+
throw new Error("runtime credential payload config must be an object");
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
function resultFromPayload(agentName, payload) {
|
|
97
|
+
return {
|
|
98
|
+
ok: true,
|
|
99
|
+
itemPath: runtimeConfigVaultPath(agentName),
|
|
100
|
+
config: { ...payload.config },
|
|
101
|
+
revision: runtimeConfigRevision(payload),
|
|
102
|
+
updatedAt: payload.updatedAt,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function resultFromPayloadForItem(agentName, itemName, payload) {
|
|
106
|
+
return {
|
|
107
|
+
ok: true,
|
|
108
|
+
itemPath: runtimeConfigVaultPath(agentName, itemName),
|
|
109
|
+
config: { ...payload.config },
|
|
110
|
+
revision: runtimeConfigRevision(payload),
|
|
111
|
+
updatedAt: payload.updatedAt,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function missingRuntimeConfig(agentName, itemName = exports.RUNTIME_CONFIG_ITEM_NAME) {
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
reason: "missing",
|
|
118
|
+
itemPath: runtimeConfigVaultPath(agentName, itemName),
|
|
119
|
+
error: `no runtime credentials stored at ${runtimeConfigVaultPath(agentName, itemName)}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function cacheResult(agentName, result) {
|
|
123
|
+
cachedRuntimeConfigs.set(agentName, result);
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
function cacheMachineResult(agentName, result) {
|
|
127
|
+
cachedMachineRuntimeConfigs.set(agentName, result);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
function missingMachineRuntimeConfig(agentName) {
|
|
131
|
+
return {
|
|
132
|
+
ok: false,
|
|
133
|
+
reason: "missing",
|
|
134
|
+
itemPath: `vault:${agentName}:${exports.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX}/<this-machine>/config`,
|
|
135
|
+
error: `no machine runtime credentials loaded for ${agentName}`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function readRuntimeCredentialConfig(agentName = (0, identity_1.getAgentName)()) {
|
|
139
|
+
return cachedRuntimeConfigs.get(agentName) ?? missingRuntimeConfig(agentName);
|
|
140
|
+
}
|
|
141
|
+
function readMachineRuntimeCredentialConfig(agentName = (0, identity_1.getAgentName)()) {
|
|
142
|
+
return cachedMachineRuntimeConfigs.get(agentName) ?? missingMachineRuntimeConfig(agentName);
|
|
143
|
+
}
|
|
144
|
+
function cacheRuntimeCredentialConfig(agentName, config, now = new Date()) {
|
|
145
|
+
const payload = {
|
|
146
|
+
schemaVersion: 1,
|
|
147
|
+
kind: "runtime-config",
|
|
148
|
+
updatedAt: now.toISOString(),
|
|
149
|
+
config: { ...config },
|
|
150
|
+
};
|
|
151
|
+
return cacheResult(agentName, resultFromPayload(agentName, payload));
|
|
152
|
+
}
|
|
153
|
+
function cacheMachineRuntimeCredentialConfig(agentName, config, now = new Date(), machineId = "<this-machine>") {
|
|
154
|
+
const payload = {
|
|
155
|
+
schemaVersion: 1,
|
|
156
|
+
kind: "runtime-config",
|
|
157
|
+
updatedAt: now.toISOString(),
|
|
158
|
+
config: { ...config },
|
|
159
|
+
};
|
|
160
|
+
return cacheMachineResult(agentName, resultFromPayloadForItem(agentName, machineRuntimeConfigItemName(machineId), payload));
|
|
161
|
+
}
|
|
162
|
+
async function refreshRuntimeCredentialConfigItem(agentName, itemName, cache, options = {}) {
|
|
163
|
+
try {
|
|
164
|
+
const store = (0, credential_access_1.getCredentialStore)(agentName);
|
|
165
|
+
const raw = await store.getRawSecret(itemName, "password");
|
|
166
|
+
const payload = validateRuntimeCredentialPayload(JSON.parse(raw));
|
|
167
|
+
const result = resultFromPayloadForItem(agentName, itemName, payload);
|
|
168
|
+
(0, runtime_1.emitNervesEvent)({
|
|
169
|
+
component: "config/identity",
|
|
170
|
+
event: "config.runtime_credentials_loaded",
|
|
171
|
+
message: "loaded runtime credentials from vault",
|
|
172
|
+
meta: { agentName, itemPath: result.itemPath, revision: result.revision },
|
|
173
|
+
});
|
|
174
|
+
return cache(agentName, result);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
178
|
+
const existing = cache === cacheMachineResult
|
|
179
|
+
? cachedMachineRuntimeConfigs.get(agentName)
|
|
180
|
+
: cachedRuntimeConfigs.get(agentName);
|
|
181
|
+
const reason = message.includes(`no credential found for domain "${itemName}"`)
|
|
182
|
+
? "missing"
|
|
183
|
+
: message.includes("runtime credential payload")
|
|
184
|
+
? "invalid"
|
|
185
|
+
: "unavailable";
|
|
186
|
+
const result = {
|
|
187
|
+
ok: false,
|
|
188
|
+
reason,
|
|
189
|
+
itemPath: runtimeConfigVaultPath(agentName, itemName),
|
|
190
|
+
error: reason === "missing" ? `no runtime credentials stored at ${runtimeConfigVaultPath(agentName, itemName)}` : message,
|
|
191
|
+
};
|
|
192
|
+
(0, runtime_1.emitNervesEvent)({
|
|
193
|
+
level: reason === "missing" ? "warn" : "error",
|
|
194
|
+
component: "config/identity",
|
|
195
|
+
event: "config.runtime_credentials_unavailable",
|
|
196
|
+
message: "runtime credentials unavailable",
|
|
197
|
+
meta: { agentName, reason, itemPath: result.itemPath },
|
|
198
|
+
});
|
|
199
|
+
if (options.preserveCachedOnFailure && existing?.ok)
|
|
200
|
+
return existing;
|
|
201
|
+
return cache(agentName, result);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function refreshRuntimeCredentialConfig(agentName, options = {}) {
|
|
205
|
+
return refreshRuntimeCredentialConfigItem(agentName, exports.RUNTIME_CONFIG_ITEM_NAME, cacheResult, options);
|
|
206
|
+
}
|
|
207
|
+
async function refreshMachineRuntimeCredentialConfig(agentName, machineId, options = {}) {
|
|
208
|
+
return refreshRuntimeCredentialConfigItem(agentName, machineRuntimeConfigItemName(machineId), cacheMachineResult, options);
|
|
209
|
+
}
|
|
210
|
+
async function upsertRuntimeCredentialConfig(agentName, config, now = new Date()) {
|
|
211
|
+
const payload = {
|
|
212
|
+
schemaVersion: 1,
|
|
213
|
+
kind: "runtime-config",
|
|
214
|
+
updatedAt: now.toISOString(),
|
|
215
|
+
config: { ...config },
|
|
216
|
+
};
|
|
217
|
+
const store = (0, credential_access_1.getCredentialStore)(agentName);
|
|
218
|
+
await store.store(exports.RUNTIME_CONFIG_ITEM_NAME, {
|
|
219
|
+
username: "runtime/config",
|
|
220
|
+
password: JSON.stringify(payload),
|
|
221
|
+
notes: "Ouro runtime credentials for senses and integrations. Provider credentials live in providers/* items.",
|
|
222
|
+
});
|
|
223
|
+
const result = resultFromPayload(agentName, payload);
|
|
224
|
+
(0, runtime_1.emitNervesEvent)({
|
|
225
|
+
component: "config/identity",
|
|
226
|
+
event: "config.runtime_credentials_upserted",
|
|
227
|
+
message: "upserted runtime credential config in vault",
|
|
228
|
+
meta: { agentName, itemPath: result.itemPath, revision: result.revision },
|
|
229
|
+
});
|
|
230
|
+
cacheResult(agentName, result);
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
async function upsertMachineRuntimeCredentialConfig(agentName, machineId, config, now = new Date()) {
|
|
234
|
+
const payload = {
|
|
235
|
+
schemaVersion: 1,
|
|
236
|
+
kind: "runtime-config",
|
|
237
|
+
updatedAt: now.toISOString(),
|
|
238
|
+
config: { ...config },
|
|
239
|
+
};
|
|
240
|
+
const itemName = machineRuntimeConfigItemName(machineId);
|
|
241
|
+
const store = (0, credential_access_1.getCredentialStore)(agentName);
|
|
242
|
+
await store.store(itemName, {
|
|
243
|
+
username: itemName,
|
|
244
|
+
password: JSON.stringify(payload),
|
|
245
|
+
notes: "Ouro machine-local runtime credentials for senses attached to one machine. Portable runtime credentials live in runtime/config.",
|
|
246
|
+
});
|
|
247
|
+
const result = resultFromPayloadForItem(agentName, itemName, payload);
|
|
248
|
+
(0, runtime_1.emitNervesEvent)({
|
|
249
|
+
component: "config/identity",
|
|
250
|
+
event: "config.runtime_credentials_upserted",
|
|
251
|
+
message: "upserted machine runtime credential config in vault",
|
|
252
|
+
meta: { agentName, itemPath: result.itemPath, revision: result.revision },
|
|
253
|
+
});
|
|
254
|
+
cacheMachineResult(agentName, result);
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
function resetRuntimeCredentialConfigCache() {
|
|
258
|
+
cachedRuntimeConfigs = new Map();
|
|
259
|
+
cachedMachineRuntimeConfigs = new Map();
|
|
260
|
+
}
|
|
@@ -7,12 +7,16 @@ const SENSES = [
|
|
|
7
7
|
{ sense: "cli", label: "CLI", daemonManaged: false },
|
|
8
8
|
{ sense: "teams", label: "Teams", daemonManaged: true },
|
|
9
9
|
{ sense: "bluebubbles", label: "BlueBubbles", daemonManaged: true },
|
|
10
|
+
{ sense: "mail", label: "Mail", daemonManaged: true },
|
|
10
11
|
];
|
|
11
12
|
function configuredSenses(senses) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
const configured = senses ?? {};
|
|
14
|
+
return {
|
|
15
|
+
...configured,
|
|
16
|
+
cli: configured.cli ?? { ...identity_1.DEFAULT_AGENT_SENSES.cli },
|
|
17
|
+
teams: configured.teams ?? { ...identity_1.DEFAULT_AGENT_SENSES.teams },
|
|
18
|
+
bluebubbles: configured.bluebubbles ?? { ...identity_1.DEFAULT_AGENT_SENSES.bluebubbles },
|
|
19
|
+
mail: configured.mail ?? { ...identity_1.DEFAULT_AGENT_SENSES.mail },
|
|
16
20
|
};
|
|
17
21
|
}
|
|
18
22
|
function resolveStatus(enabled, daemonManaged, runtimeInfo) {
|
|
@@ -28,6 +32,9 @@ function resolveStatus(enabled, daemonManaged, runtimeInfo) {
|
|
|
28
32
|
if (runtimeInfo?.runtime === "running") {
|
|
29
33
|
return "running";
|
|
30
34
|
}
|
|
35
|
+
if (runtimeInfo?.configured === false && runtimeInfo.optional) {
|
|
36
|
+
return "not_attached";
|
|
37
|
+
}
|
|
31
38
|
if (runtimeInfo?.configured === false) {
|
|
32
39
|
return "needs_config";
|
|
33
40
|
}
|
|
@@ -38,6 +38,8 @@ exports.findFreshestFriendSession = findFreshestFriendSession;
|
|
|
38
38
|
const fs = __importStar(require("fs"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const runtime_1 = require("../nerves/runtime");
|
|
41
|
+
const config_1 = require("./config");
|
|
42
|
+
const session_events_1 = require("./session-events");
|
|
41
43
|
const DEFAULT_ACTIVE_THRESHOLD_MS = 24 * 60 * 60 * 1000;
|
|
42
44
|
function activityPriority(source) {
|
|
43
45
|
return source === "friend-facing" ? 0 : 1;
|
|
@@ -62,32 +64,46 @@ function parseFriendActivity(sessionPath) {
|
|
|
62
64
|
catch {
|
|
63
65
|
return null;
|
|
64
66
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
67
|
+
const envelope = (0, session_events_1.loadSessionEnvelopeFile)(sessionPath);
|
|
68
|
+
const chronology = envelope ? (0, session_events_1.deriveSessionChronology)(envelope.events) : null;
|
|
69
|
+
const explicit = envelope?.state.lastFriendActivityAt;
|
|
70
|
+
if (typeof explicit === "string") {
|
|
71
|
+
const parsedMs = Date.parse(explicit);
|
|
72
|
+
if (Number.isFinite(parsedMs)) {
|
|
73
|
+
return {
|
|
74
|
+
lastActivityMs: parsedMs,
|
|
75
|
+
lastActivityAt: new Date(parsedMs).toISOString(),
|
|
76
|
+
activitySource: "friend-facing",
|
|
77
|
+
lastInboundAt: chronology?.lastInboundAt ?? null,
|
|
78
|
+
lastOutboundAt: chronology?.lastOutboundAt ?? null,
|
|
79
|
+
unansweredInboundCount: chronology?.unansweredInboundCount ?? 0,
|
|
80
|
+
};
|
|
78
81
|
}
|
|
79
82
|
}
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
if (chronology?.lastInboundAt) {
|
|
84
|
+
const parsedMs = Date.parse(chronology.lastInboundAt);
|
|
85
|
+
if (Number.isFinite(parsedMs)) {
|
|
86
|
+
return {
|
|
87
|
+
lastActivityMs: parsedMs,
|
|
88
|
+
lastActivityAt: new Date(parsedMs).toISOString(),
|
|
89
|
+
activitySource: "friend-facing",
|
|
90
|
+
lastInboundAt: chronology.lastInboundAt,
|
|
91
|
+
lastOutboundAt: chronology.lastOutboundAt,
|
|
92
|
+
unansweredInboundCount: chronology.unansweredInboundCount,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
82
95
|
}
|
|
83
96
|
return {
|
|
84
97
|
lastActivityMs: mtimeMs,
|
|
85
98
|
lastActivityAt: new Date(mtimeMs).toISOString(),
|
|
86
99
|
activitySource: "mtime-fallback",
|
|
100
|
+
lastInboundAt: chronology?.lastInboundAt ?? null,
|
|
101
|
+
lastOutboundAt: chronology?.lastOutboundAt ?? null,
|
|
102
|
+
unansweredInboundCount: chronology?.unansweredInboundCount ?? 0,
|
|
87
103
|
};
|
|
88
104
|
}
|
|
89
105
|
function listSessionActivity(query) {
|
|
90
|
-
const { sessionsDir, friendsDir, agentName, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, currentSession = null, } = query;
|
|
106
|
+
const { sessionsDir, friendsDir, agentName, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, nowMs = Date.now(), currentSession = null, } = query;
|
|
91
107
|
(0, runtime_1.emitNervesEvent)({
|
|
92
108
|
component: "daemon",
|
|
93
109
|
event: "daemon.session_activity_scan",
|
|
@@ -99,7 +115,6 @@ function listSessionActivity(query) {
|
|
|
99
115
|
});
|
|
100
116
|
if (!fs.existsSync(sessionsDir))
|
|
101
117
|
return [];
|
|
102
|
-
const now = Date.now();
|
|
103
118
|
const results = [];
|
|
104
119
|
let friendDirs;
|
|
105
120
|
try {
|
|
@@ -130,14 +145,17 @@ function listSessionActivity(query) {
|
|
|
130
145
|
if (!keyFile.endsWith(".json"))
|
|
131
146
|
continue;
|
|
132
147
|
const key = keyFile.replace(/\.json$/, "");
|
|
133
|
-
|
|
148
|
+
// Compare with sanitizeKey on both sides — session keys from the filesystem
|
|
149
|
+
// are already sanitized (colons → underscores), but the canonical key from
|
|
150
|
+
// the pipeline may still have colons (e.g. "chat:any" vs "chat_any").
|
|
151
|
+
if (currentSession && friendId === currentSession.friendId && channel === currentSession.channel && (0, config_1.sanitizeKey)(key) === (0, config_1.sanitizeKey)(currentSession.key)) {
|
|
134
152
|
continue;
|
|
135
153
|
}
|
|
136
154
|
const sessionPath = path.join(channelPath, keyFile);
|
|
137
155
|
const activity = parseFriendActivity(sessionPath);
|
|
138
156
|
if (!activity)
|
|
139
157
|
continue;
|
|
140
|
-
if (
|
|
158
|
+
if (nowMs - activity.lastActivityMs > activeThresholdMs)
|
|
141
159
|
continue;
|
|
142
160
|
results.push({
|
|
143
161
|
friendId,
|
|
@@ -148,6 +166,9 @@ function listSessionActivity(query) {
|
|
|
148
166
|
lastActivityAt: activity.lastActivityAt,
|
|
149
167
|
lastActivityMs: activity.lastActivityMs,
|
|
150
168
|
activitySource: activity.activitySource,
|
|
169
|
+
lastInboundAt: activity.lastInboundAt,
|
|
170
|
+
lastOutboundAt: activity.lastOutboundAt,
|
|
171
|
+
unansweredInboundCount: activity.unansweredInboundCount,
|
|
151
172
|
});
|
|
152
173
|
}
|
|
153
174
|
}
|
|
@@ -160,10 +181,10 @@ function listSessionActivity(query) {
|
|
|
160
181
|
});
|
|
161
182
|
}
|
|
162
183
|
function findFreshestFriendSession(query) {
|
|
163
|
-
const { activeOnly = false, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, ...rest } = query;
|
|
184
|
+
const { activeOnly = false, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, nowMs, ...rest } = query;
|
|
164
185
|
const currentSession = rest.currentSession ?? null;
|
|
165
186
|
const all = activeOnly
|
|
166
|
-
? listSessionActivity({ ...rest, activeThresholdMs, currentSession })
|
|
167
|
-
: listSessionActivity({ ...rest, activeThresholdMs: Number.MAX_SAFE_INTEGER, currentSession });
|
|
187
|
+
? listSessionActivity({ ...rest, activeThresholdMs, nowMs, currentSession })
|
|
188
|
+
: listSessionActivity({ ...rest, activeThresholdMs: Number.MAX_SAFE_INTEGER, nowMs, currentSession });
|
|
168
189
|
return all.find((entry) => entry.friendId === query.friendId) ?? null;
|
|
169
190
|
}
|