@ouro.bot/cli 0.1.0-alpha.4 → 0.1.0-alpha.400
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 +208 -184
- 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 +2610 -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 +832 -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 +417 -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 +176 -130
- package/dist/heart/core.js +872 -255
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +397 -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 +213 -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 +599 -0
- package/dist/heart/daemon/cli-exec.js +3616 -0
- package/dist/heart/daemon/cli-help.js +396 -0
- package/dist/heart/daemon/cli-parse.js +1118 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +560 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/daemon-cli.js +29 -673
- package/dist/heart/daemon/daemon-entry.js +370 -8
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +235 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +813 -19
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +419 -0
- package/dist/heart/daemon/health-monitor.js +79 -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/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +209 -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 +105 -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 +202 -1
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +216 -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 +355 -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 +237 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/thoughts.js +510 -0
- package/dist/heart/daemon/up-progress.js +135 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/habits/habit-migration.js +181 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-scheduler.js +371 -0
- package/dist/heart/hatch/hatch-animation.js +35 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -135
- 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 +304 -0
- package/dist/heart/identity.js +246 -58
- 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/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 +64 -0
- package/dist/heart/outlook/outlook-http-response.js +7 -0
- package/dist/heart/outlook/outlook-http-routes.js +232 -0
- package/dist/heart/outlook/outlook-http-static.js +99 -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 +28 -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 +359 -0
- package/dist/heart/outlook/readers/continuity-readers.js +332 -0
- package/dist/heart/outlook/readers/runtime-readers.js +660 -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 +133 -0
- package/dist/heart/provider-binding-resolver.js +239 -0
- package/dist/heart/provider-credentials.js +383 -0
- package/dist/heart/provider-failover.js +266 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +237 -0
- package/dist/heart/provider-state.js +216 -0
- package/dist/heart/provider-visibility.js +186 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +202 -50
- package/dist/heart/providers/azure.js +103 -12
- 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 +39 -29
- package/dist/heart/runtime-credentials.js +181 -0
- package/dist/heart/sense-truth.js +61 -0
- package/dist/heart/session-activity.js +190 -0
- package/dist/heart/session-events.js +855 -0
- package/dist/heart/session-transcript.js +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +117 -33
- 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 +351 -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 +301 -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 +113 -0
- package/dist/heart/versioning/update-hooks.js +142 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/mind/bundle-manifest.js +77 -1
- package/dist/mind/context.js +141 -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 +64 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +38 -1
- 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 +1111 -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 +83 -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-BAcU08c-.css +1 -0
- package/dist/outlook-ui/assets/index-D7l3l4vY.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 +461 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +79 -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 +107 -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 +371 -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 +28 -10
- 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 +45 -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 +182 -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-notes.js +376 -0
- package/dist/repertoire/tools-session.js +739 -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-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 +118 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +382 -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 +70 -0
- package/dist/senses/bluebubbles/inbound-log.js +113 -0
- package/dist/senses/bluebubbles/index.js +1620 -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/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 +112 -19
- package/dist/senses/inner-dialog.js +636 -86
- package/dist/senses/pipeline.js +602 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +205 -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 +112 -2
- package/package.json +38 -6
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +110 -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 +134 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- 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
package/dist/heart/config.js
CHANGED
|
@@ -35,63 +35,71 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.loadConfig = loadConfig;
|
|
37
37
|
exports.resetConfigCache = resetConfigCache;
|
|
38
|
-
exports.
|
|
38
|
+
exports.cacheRuntimeConfigForTests = cacheRuntimeConfigForTests;
|
|
39
|
+
exports.patchRuntimeConfig = patchRuntimeConfig;
|
|
39
40
|
exports.getAzureConfig = getAzureConfig;
|
|
40
41
|
exports.getMinimaxConfig = getMinimaxConfig;
|
|
41
42
|
exports.getAnthropicConfig = getAnthropicConfig;
|
|
42
43
|
exports.getOpenAICodexConfig = getOpenAICodexConfig;
|
|
44
|
+
exports.getGithubCopilotConfig = getGithubCopilotConfig;
|
|
43
45
|
exports.getTeamsConfig = getTeamsConfig;
|
|
46
|
+
exports.getTeamsSecondaryConfig = getTeamsSecondaryConfig;
|
|
44
47
|
exports.getContextConfig = getContextConfig;
|
|
45
48
|
exports.getOAuthConfig = getOAuthConfig;
|
|
49
|
+
exports.resolveOAuthForTenant = resolveOAuthForTenant;
|
|
46
50
|
exports.getTeamsChannelConfig = getTeamsChannelConfig;
|
|
51
|
+
exports.getBlueBubblesConfig = getBlueBubblesConfig;
|
|
52
|
+
exports.getBlueBubblesChannelConfig = getBlueBubblesChannelConfig;
|
|
47
53
|
exports.getIntegrationsConfig = getIntegrationsConfig;
|
|
54
|
+
exports.getSyncConfig = getSyncConfig;
|
|
48
55
|
exports.getOpenAIEmbeddingsApiKey = getOpenAIEmbeddingsApiKey;
|
|
49
56
|
exports.getLogsDir = getLogsDir;
|
|
57
|
+
exports.sanitizeKey = sanitizeKey;
|
|
58
|
+
exports.slugify = slugify;
|
|
59
|
+
exports.resolveSessionPath = resolveSessionPath;
|
|
50
60
|
exports.sessionPath = sessionPath;
|
|
51
61
|
exports.logPath = logPath;
|
|
52
62
|
const fs = __importStar(require("fs"));
|
|
53
63
|
const path = __importStar(require("path"));
|
|
54
|
-
const os = __importStar(require("os"));
|
|
55
64
|
const identity_1 = require("./identity");
|
|
65
|
+
const provider_credentials_1 = require("./provider-credentials");
|
|
66
|
+
const runtime_credentials_1 = require("./runtime-credentials");
|
|
56
67
|
const runtime_1 = require("../nerves/runtime");
|
|
57
|
-
const
|
|
58
|
-
providers: {
|
|
59
|
-
// Keep provider field ordering consistent: model first, then auth credentials,
|
|
60
|
-
// then provider-specific transport fields.
|
|
61
|
-
azure: {
|
|
62
|
-
modelName: "",
|
|
63
|
-
apiKey: "",
|
|
64
|
-
endpoint: "",
|
|
65
|
-
deployment: "",
|
|
66
|
-
apiVersion: "2025-04-01-preview",
|
|
67
|
-
},
|
|
68
|
-
minimax: {
|
|
69
|
-
model: "",
|
|
70
|
-
apiKey: "",
|
|
71
|
-
},
|
|
72
|
-
anthropic: {
|
|
73
|
-
model: "claude-opus-4-6",
|
|
74
|
-
setupToken: "",
|
|
75
|
-
},
|
|
76
|
-
"openai-codex": {
|
|
77
|
-
model: "gpt-5.2",
|
|
78
|
-
oauthAccessToken: "",
|
|
79
|
-
},
|
|
80
|
-
},
|
|
68
|
+
const DEFAULT_LOCAL_RUNTIME_CONFIG = {
|
|
81
69
|
teams: {
|
|
82
70
|
clientId: "",
|
|
83
71
|
clientSecret: "",
|
|
84
72
|
tenantId: "",
|
|
73
|
+
managedIdentityClientId: "",
|
|
85
74
|
},
|
|
86
75
|
oauth: {
|
|
87
76
|
graphConnectionName: "graph",
|
|
88
77
|
adoConnectionName: "ado",
|
|
89
78
|
githubConnectionName: "",
|
|
90
79
|
},
|
|
80
|
+
teamsSecondary: {
|
|
81
|
+
clientId: "",
|
|
82
|
+
clientSecret: "",
|
|
83
|
+
tenantId: "",
|
|
84
|
+
managedIdentityClientId: "",
|
|
85
|
+
},
|
|
91
86
|
teamsChannel: {
|
|
92
87
|
skipConfirmation: true,
|
|
93
88
|
port: 3978,
|
|
94
89
|
},
|
|
90
|
+
bluebubbles: {
|
|
91
|
+
serverUrl: "",
|
|
92
|
+
password: "",
|
|
93
|
+
accountId: "default",
|
|
94
|
+
},
|
|
95
|
+
bluebubblesChannel: {
|
|
96
|
+
port: 18790,
|
|
97
|
+
webhookPath: "/bluebubbles-webhook",
|
|
98
|
+
requestTimeoutMs: 30000,
|
|
99
|
+
},
|
|
100
|
+
vault: {
|
|
101
|
+
masterPassword: "",
|
|
102
|
+
},
|
|
95
103
|
integrations: {
|
|
96
104
|
perplexityApiKey: "",
|
|
97
105
|
openaiEmbeddingsApiKey: "",
|
|
@@ -99,24 +107,20 @@ const DEFAULT_SECRETS_TEMPLATE = {
|
|
|
99
107
|
};
|
|
100
108
|
function defaultRuntimeConfig() {
|
|
101
109
|
return {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
anthropic: { ...DEFAULT_SECRETS_TEMPLATE.providers.anthropic },
|
|
106
|
-
"openai-codex": { ...DEFAULT_SECRETS_TEMPLATE.providers["openai-codex"] },
|
|
107
|
-
},
|
|
108
|
-
teams: { ...DEFAULT_SECRETS_TEMPLATE.teams },
|
|
109
|
-
oauth: { ...DEFAULT_SECRETS_TEMPLATE.oauth },
|
|
110
|
+
teams: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teams },
|
|
111
|
+
teamsSecondary: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsSecondary },
|
|
112
|
+
oauth: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.oauth },
|
|
110
113
|
context: { ...identity_1.DEFAULT_AGENT_CONTEXT },
|
|
111
|
-
teamsChannel: { ...
|
|
112
|
-
|
|
114
|
+
teamsChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsChannel },
|
|
115
|
+
bluebubbles: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubbles },
|
|
116
|
+
bluebubblesChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubblesChannel },
|
|
117
|
+
vault: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.vault },
|
|
118
|
+
integrations: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.integrations },
|
|
113
119
|
};
|
|
114
120
|
}
|
|
115
|
-
let
|
|
121
|
+
let _runtimeConfigOverride = null;
|
|
116
122
|
let _testContextOverride = null;
|
|
117
|
-
|
|
118
|
-
return (0, identity_1.getAgentSecretsPath)();
|
|
119
|
-
}
|
|
123
|
+
let _providerConfigOverride = null;
|
|
120
124
|
function deepMerge(defaults, partial) {
|
|
121
125
|
const result = { ...defaults };
|
|
122
126
|
for (const key of Object.keys(partial)) {
|
|
@@ -133,121 +137,107 @@ function deepMerge(defaults, partial) {
|
|
|
133
137
|
}
|
|
134
138
|
return result;
|
|
135
139
|
}
|
|
140
|
+
function localRuntimeFields(config) {
|
|
141
|
+
const { providers: _providers, context: _context, ...localFields } = config;
|
|
142
|
+
return localFields;
|
|
143
|
+
}
|
|
136
144
|
function loadConfig() {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
});
|
|
144
|
-
return _cachedConfig;
|
|
145
|
-
}
|
|
146
|
-
const configPath = resolveConfigPath();
|
|
147
|
-
// Auto-create config directory if it doesn't exist
|
|
148
|
-
const configDir = path.dirname(configPath);
|
|
149
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
150
|
-
let fileData = {};
|
|
151
|
-
try {
|
|
152
|
-
const raw = fs.readFileSync(configPath, "utf-8");
|
|
153
|
-
fileData = JSON.parse(raw);
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
156
|
-
const errorCode = error &&
|
|
157
|
-
typeof error === "object" &&
|
|
158
|
-
"code" in error &&
|
|
159
|
-
typeof error.code === "string"
|
|
160
|
-
? error.code
|
|
161
|
-
: undefined;
|
|
162
|
-
if (errorCode === "ENOENT") {
|
|
163
|
-
try {
|
|
164
|
-
fs.writeFileSync(configPath, JSON.stringify(DEFAULT_SECRETS_TEMPLATE, null, 2) + "\n", "utf-8");
|
|
165
|
-
}
|
|
166
|
-
catch (writeError) {
|
|
167
|
-
(0, runtime_1.emitNervesEvent)({
|
|
168
|
-
level: "warn",
|
|
169
|
-
event: "config_identity.error",
|
|
170
|
-
component: "config/identity",
|
|
171
|
-
message: "failed writing default secrets config",
|
|
172
|
-
meta: {
|
|
173
|
-
phase: "loadConfig",
|
|
174
|
-
path: configPath,
|
|
175
|
-
reason: writeError instanceof Error ? writeError.message : String(writeError),
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
(0, runtime_1.emitNervesEvent)({
|
|
181
|
-
level: "warn",
|
|
182
|
-
event: "config_identity.error",
|
|
183
|
-
component: "config/identity",
|
|
184
|
-
message: "config read failed; defaults applied",
|
|
185
|
-
meta: {
|
|
186
|
-
phase: "loadConfig",
|
|
187
|
-
reason: error instanceof Error ? error.message : String(error),
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
// ENOENT or parse error -- use defaults
|
|
191
|
-
}
|
|
192
|
-
const sanitizedFileData = { ...fileData };
|
|
193
|
-
if ("context" in sanitizedFileData) {
|
|
194
|
-
delete sanitizedFileData.context;
|
|
195
|
-
(0, runtime_1.emitNervesEvent)({
|
|
196
|
-
level: "warn",
|
|
197
|
-
event: "config_identity.error",
|
|
198
|
-
component: "config/identity",
|
|
199
|
-
message: "ignored legacy context block in secrets config",
|
|
200
|
-
meta: {
|
|
201
|
-
phase: "loadConfig",
|
|
202
|
-
path: configPath,
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
_cachedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
|
|
145
|
+
const runtimeResult = (0, runtime_credentials_1.readRuntimeCredentialConfig)((0, identity_1.getAgentName)());
|
|
146
|
+
const vaultData = runtimeResult.ok ? localRuntimeFields(runtimeResult.config) : {};
|
|
147
|
+
const mergedConfig = deepMerge(defaultRuntimeConfig(), vaultData);
|
|
148
|
+
const config = _runtimeConfigOverride
|
|
149
|
+
? deepMerge(mergedConfig, _runtimeConfigOverride)
|
|
150
|
+
: mergedConfig;
|
|
207
151
|
(0, runtime_1.emitNervesEvent)({
|
|
208
152
|
event: "config.load",
|
|
209
153
|
component: "config/identity",
|
|
210
|
-
message: "config loaded from
|
|
154
|
+
message: "config loaded from runtime credential cache",
|
|
211
155
|
meta: {
|
|
212
|
-
source: "
|
|
213
|
-
used_defaults_only:
|
|
156
|
+
source: runtimeResult.ok ? "vault-cache" : "defaults",
|
|
157
|
+
used_defaults_only: !runtimeResult.ok,
|
|
158
|
+
override_applied: _runtimeConfigOverride !== null,
|
|
159
|
+
runtime_credentials: runtimeResult.ok ? "available" : runtimeResult.reason,
|
|
214
160
|
},
|
|
215
161
|
});
|
|
216
|
-
return
|
|
162
|
+
return config;
|
|
217
163
|
}
|
|
218
164
|
function resetConfigCache() {
|
|
219
|
-
|
|
165
|
+
_runtimeConfigOverride = null;
|
|
220
166
|
_testContextOverride = null;
|
|
167
|
+
_providerConfigOverride = null;
|
|
168
|
+
(0, provider_credentials_1.resetProviderCredentialCache)();
|
|
169
|
+
(0, runtime_credentials_1.resetRuntimeCredentialConfigCache)();
|
|
221
170
|
}
|
|
222
|
-
function
|
|
223
|
-
|
|
171
|
+
function cacheRuntimeConfigForTests(agentName, config) {
|
|
172
|
+
(0, runtime_credentials_1.cacheRuntimeCredentialConfig)(agentName, config, new Date(0));
|
|
173
|
+
}
|
|
174
|
+
function seedProviderCredentialCache(providers) {
|
|
175
|
+
if (!providers)
|
|
176
|
+
return;
|
|
177
|
+
_providerConfigOverride = deepMerge((_providerConfigOverride ?? {}), providers);
|
|
178
|
+
const records = Object.entries(_providerConfigOverride).map(([provider, rawConfig]) => {
|
|
179
|
+
const split = (0, provider_credentials_1.splitProviderCredentialFields)(provider, rawConfig);
|
|
180
|
+
return (0, provider_credentials_1.createProviderCredentialRecord)({
|
|
181
|
+
provider: provider,
|
|
182
|
+
credentials: split.credentials,
|
|
183
|
+
config: split.config,
|
|
184
|
+
provenance: { source: "manual" },
|
|
185
|
+
now: new Date(0),
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
(0, provider_credentials_1.cacheProviderCredentialRecords)((0, identity_1.getAgentName)(), records, new Date(0));
|
|
189
|
+
}
|
|
190
|
+
function patchRuntimeConfig(partial) {
|
|
191
|
+
const { providers, ...runtimePartial } = partial;
|
|
192
|
+
seedProviderCredentialCache(providers);
|
|
224
193
|
const contextPatch = partial.context;
|
|
225
194
|
if (contextPatch) {
|
|
226
195
|
const base = _testContextOverride ?? identity_1.DEFAULT_AGENT_CONTEXT;
|
|
227
196
|
_testContextOverride = deepMerge(base, contextPatch);
|
|
228
197
|
}
|
|
229
|
-
|
|
198
|
+
_runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), runtimePartial);
|
|
199
|
+
}
|
|
200
|
+
function readProviderConfig(provider) {
|
|
201
|
+
const cached = (0, provider_credentials_1.readCachedProviderCredentialRecord)((0, identity_1.getAgentName)(), provider);
|
|
202
|
+
return cached.ok ? { ...cached.record.config, ...cached.record.credentials } : {};
|
|
230
203
|
}
|
|
231
204
|
function getAzureConfig() {
|
|
232
|
-
const
|
|
233
|
-
return {
|
|
205
|
+
const raw = readProviderConfig("azure");
|
|
206
|
+
return {
|
|
207
|
+
apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "",
|
|
208
|
+
endpoint: typeof raw.endpoint === "string" ? raw.endpoint : "",
|
|
209
|
+
deployment: typeof raw.deployment === "string" ? raw.deployment : "",
|
|
210
|
+
apiVersion: typeof raw.apiVersion === "string" ? raw.apiVersion : "2025-04-01-preview",
|
|
211
|
+
managedIdentityClientId: typeof raw.managedIdentityClientId === "string" ? raw.managedIdentityClientId : "",
|
|
212
|
+
};
|
|
234
213
|
}
|
|
235
214
|
function getMinimaxConfig() {
|
|
236
|
-
const
|
|
237
|
-
return {
|
|
215
|
+
const raw = readProviderConfig("minimax");
|
|
216
|
+
return { apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "" };
|
|
238
217
|
}
|
|
239
218
|
function getAnthropicConfig() {
|
|
240
|
-
const
|
|
241
|
-
return {
|
|
219
|
+
const raw = readProviderConfig("anthropic");
|
|
220
|
+
return { setupToken: typeof raw.setupToken === "string" ? raw.setupToken : "" };
|
|
242
221
|
}
|
|
243
222
|
function getOpenAICodexConfig() {
|
|
244
|
-
const
|
|
245
|
-
return {
|
|
223
|
+
const raw = readProviderConfig("openai-codex");
|
|
224
|
+
return { oauthAccessToken: typeof raw.oauthAccessToken === "string" ? raw.oauthAccessToken : "" };
|
|
225
|
+
}
|
|
226
|
+
function getGithubCopilotConfig() {
|
|
227
|
+
const raw = readProviderConfig("github-copilot");
|
|
228
|
+
return {
|
|
229
|
+
githubToken: typeof raw.githubToken === "string" ? raw.githubToken : "",
|
|
230
|
+
baseUrl: typeof raw.baseUrl === "string" ? raw.baseUrl : "",
|
|
231
|
+
};
|
|
246
232
|
}
|
|
247
233
|
function getTeamsConfig() {
|
|
248
234
|
const config = loadConfig();
|
|
249
235
|
return { ...config.teams };
|
|
250
236
|
}
|
|
237
|
+
function getTeamsSecondaryConfig() {
|
|
238
|
+
const config = loadConfig();
|
|
239
|
+
return { ...config.teamsSecondary };
|
|
240
|
+
}
|
|
251
241
|
function getContextConfig() {
|
|
252
242
|
if (_testContextOverride) {
|
|
253
243
|
return { ..._testContextOverride };
|
|
@@ -268,29 +258,85 @@ function getOAuthConfig() {
|
|
|
268
258
|
const config = loadConfig();
|
|
269
259
|
return { ...config.oauth };
|
|
270
260
|
}
|
|
261
|
+
/** Resolve OAuth connection names for a specific tenant, falling back to defaults. */
|
|
262
|
+
function resolveOAuthForTenant(tenantId) {
|
|
263
|
+
const base = getOAuthConfig();
|
|
264
|
+
const overrides = tenantId ? base.tenantOverrides?.[tenantId] : undefined;
|
|
265
|
+
return {
|
|
266
|
+
graphConnectionName: overrides?.graphConnectionName ?? base.graphConnectionName,
|
|
267
|
+
adoConnectionName: overrides?.adoConnectionName ?? base.adoConnectionName,
|
|
268
|
+
githubConnectionName: overrides?.githubConnectionName ?? base.githubConnectionName,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
271
|
function getTeamsChannelConfig() {
|
|
272
272
|
const config = loadConfig();
|
|
273
273
|
const { skipConfirmation, flushIntervalMs, port } = config.teamsChannel;
|
|
274
274
|
return { skipConfirmation, flushIntervalMs, port };
|
|
275
275
|
}
|
|
276
|
+
function getBlueBubblesConfig() {
|
|
277
|
+
const config = loadConfig();
|
|
278
|
+
const { serverUrl, password, accountId } = config.bluebubbles;
|
|
279
|
+
if (!serverUrl.trim()) {
|
|
280
|
+
throw new Error("bluebubbles.serverUrl is required in the agent vault runtime/config item to run the BlueBubbles sense.");
|
|
281
|
+
}
|
|
282
|
+
if (!password.trim()) {
|
|
283
|
+
throw new Error("bluebubbles.password is required in the agent vault runtime/config item to run the BlueBubbles sense.");
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
serverUrl: serverUrl.trim(),
|
|
287
|
+
password: password.trim(),
|
|
288
|
+
accountId: accountId.trim() || "default",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function getBlueBubblesChannelConfig() {
|
|
292
|
+
const config = loadConfig();
|
|
293
|
+
const { port, webhookPath, requestTimeoutMs } = config.bluebubblesChannel;
|
|
294
|
+
return { port, webhookPath, requestTimeoutMs };
|
|
295
|
+
}
|
|
276
296
|
function getIntegrationsConfig() {
|
|
277
297
|
const config = loadConfig();
|
|
278
298
|
return { ...config.integrations };
|
|
279
299
|
}
|
|
300
|
+
function getSyncConfig() {
|
|
301
|
+
try {
|
|
302
|
+
const agentConfig = (0, identity_1.loadAgentConfig)();
|
|
303
|
+
return {
|
|
304
|
+
enabled: agentConfig.sync?.enabled ?? false,
|
|
305
|
+
remote: agentConfig.sync?.remote ?? "origin",
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
/* v8 ignore next -- defensive: loadAgentConfig failure in test/bootstrap @preserve */
|
|
310
|
+
return { enabled: false, remote: "origin" };
|
|
311
|
+
}
|
|
312
|
+
}
|
|
280
313
|
function getOpenAIEmbeddingsApiKey() {
|
|
281
314
|
return getIntegrationsConfig().openaiEmbeddingsApiKey;
|
|
282
315
|
}
|
|
283
316
|
function getLogsDir() {
|
|
284
|
-
return path.join(
|
|
317
|
+
return path.join((0, identity_1.getAgentRoot)(), "state", "logs");
|
|
285
318
|
}
|
|
286
319
|
function sanitizeKey(key) {
|
|
287
320
|
return key.replace(/[/:]/g, "_");
|
|
288
321
|
}
|
|
289
|
-
function
|
|
290
|
-
|
|
291
|
-
|
|
322
|
+
function slugify(value) {
|
|
323
|
+
return value
|
|
324
|
+
.trim()
|
|
325
|
+
.toLowerCase()
|
|
326
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
327
|
+
.replace(/^-+/, "")
|
|
328
|
+
.replace(/-+$/, "");
|
|
329
|
+
}
|
|
330
|
+
function resolveSessionPath(friendId, channel, key, options) {
|
|
331
|
+
const dir = path.join((0, identity_1.getAgentRoot)(), "state", "sessions", friendId, channel);
|
|
332
|
+
if (options?.ensureDir) {
|
|
333
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
334
|
+
}
|
|
292
335
|
return path.join(dir, sanitizeKey(key) + ".json");
|
|
293
336
|
}
|
|
337
|
+
function sessionPath(friendId, channel, key) {
|
|
338
|
+
return resolveSessionPath(friendId, channel, key, { ensureDir: true });
|
|
339
|
+
}
|
|
294
340
|
function logPath(channel, key) {
|
|
295
341
|
return path.join(getLogsDir(), channel, sanitizeKey(key) + ".ndjson");
|
|
296
342
|
}
|