@intent-systems/nexus 2026.1.5-4 → 2026.1.5-8
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/dist/agents/agent-id.js +41 -0
- package/dist/agents/auth-profiles.js +114 -25
- package/dist/agents/identity-state.js +101 -0
- package/dist/agents/model-auth.js +1 -0
- package/dist/agents/model-fallback.js +15 -9
- package/dist/agents/model-selection.js +1 -1
- package/dist/agents/models-config.js +17 -11
- package/dist/agents/pi-embedded-runner.js +101 -9
- package/dist/agents/sandbox.js +12 -3
- package/dist/agents/skill-runner.js +41 -6
- package/dist/agents/skill-usage.js +117 -17
- package/dist/agents/skills-status.js +4 -3
- package/dist/agents/skills.js +38 -30
- package/dist/agents/subagent-registry.js +25 -11
- package/dist/agents/system-prompt.js +16 -0
- package/dist/agents/tool-policy.js +19 -3
- package/dist/agents/tools/browser-tool.js +5 -2
- package/dist/agents/tools/image-tool.js +93 -8
- package/dist/agents/tools/sessions-announce-target.js +5 -1
- package/dist/agents/workspace.js +81 -59
- package/dist/auto-reply/command-detection.js +2 -1
- package/dist/auto-reply/reply/directive-handling.js +153 -28
- package/dist/auto-reply/reply/directives.js +17 -2
- package/dist/auto-reply/reply/model-selection.js +8 -3
- package/dist/auto-reply/reply/queue.js +2 -2
- package/dist/auto-reply/reply.js +1 -1
- package/dist/auto-reply/thinking.js +15 -0
- package/dist/browser/chrome.js +1 -1
- package/dist/browser/client.js +2 -0
- package/dist/browser/config.js +6 -2
- package/dist/browser/pw-tools-core.js +3 -0
- package/dist/browser/routes/agent.js +14 -0
- package/dist/canvas-host/server.js +1 -1
- package/dist/capabilities/detector.js +46 -15
- package/dist/capabilities/registry.js +2 -1
- package/dist/cli/cloud-cli.js +70 -7
- package/dist/cli/credential-cli.js +214 -23
- package/dist/cli/gateway-cli.js +1 -1
- package/dist/cli/log-cli.js +25 -0
- package/dist/cli/pairing-cli.js +1 -1
- package/dist/cli/program.js +82 -8
- package/dist/cli/run-main.js +1 -1
- package/dist/cli/skills-cli.js +165 -30
- package/dist/cli/skills-hub-cli.js +68 -36
- package/dist/cli/tool-connector-cli.js +99 -24
- package/dist/cli/upstream-sync-cli.js +253 -96
- package/dist/cli/usage-cli.js +14 -0
- package/dist/commands/auth-choice-options.js +6 -1
- package/dist/commands/auth-choice.js +157 -5
- package/dist/commands/bootstrap-preset.js +26 -12
- package/dist/commands/capabilities.js +33 -6
- package/dist/commands/claude-md.js +3 -2
- package/dist/commands/config-view.js +1 -1
- package/dist/commands/config.js +85 -0
- package/dist/commands/configure.js +4 -4
- package/dist/commands/credential.js +497 -36
- package/dist/commands/cursor-hooks.js +240 -0
- package/dist/commands/cursor-rules.js +14 -188
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/identity.js +29 -32
- package/dist/commands/init.js +304 -20
- package/dist/commands/log.js +134 -0
- package/dist/commands/models/fallbacks.js +1 -1
- package/dist/commands/models/image-fallbacks.js +1 -1
- package/dist/commands/models/list.js +1 -1
- package/dist/commands/models/scan.js +1 -1
- package/dist/commands/onboard-auth.js +27 -2
- package/dist/commands/onboard-eve-identity.js +8 -9
- package/dist/commands/onboard-non-interactive.js +4 -2
- package/dist/commands/onboard-quickstart.js +18 -11
- package/dist/commands/quest-state.js +271 -0
- package/dist/commands/quest.js +53 -13
- package/dist/commands/reset.js +1 -1
- package/dist/commands/sessions-ingest.js +5 -4
- package/dist/commands/setup.js +4 -2
- package/dist/commands/skills-manifest.js +89 -29
- package/dist/commands/status.js +193 -73
- package/dist/commands/suggestions.js +1 -1
- package/dist/commands/usage-tracking.js +32 -0
- package/dist/commands/usage-upload.js +6 -1
- package/dist/config/defaults.js +1 -3
- package/dist/config/includes.js +5 -7
- package/dist/config/io.js +88 -16
- package/dist/config/legacy.js +4 -2
- package/dist/config/paths.js +16 -0
- package/dist/config/sessions.js +9 -5
- package/dist/config/zod-schema.js +4 -3
- package/dist/control-plane/broker/broker.js +131 -78
- package/dist/control-plane/compaction.js +3 -5
- package/dist/control-plane/factory.js +2 -2
- package/dist/control-plane/index.js +2 -2
- package/dist/control-plane/odu/agents.js +28 -23
- package/dist/control-plane/odu/interaction-tools.js +62 -50
- package/dist/control-plane/odu/prompt-loader.js +8 -8
- package/dist/control-plane/odu/runtime.js +87 -75
- package/dist/control-plane/odu-control-plane.js +14 -12
- package/dist/control-plane/single-agent.js +13 -13
- package/dist/credentials/store.js +133 -7
- package/dist/daemon/launchd.js +14 -0
- package/dist/entry.js +0 -0
- package/dist/gateway/server-browser.js +5 -4
- package/dist/gateway/server-methods/cron.js +11 -1
- package/dist/gateway/server.js +14 -7
- package/dist/infra/bonjour.js +1 -1
- package/dist/infra/event-log.js +8 -2
- package/dist/infra/path-env.js +1 -2
- package/dist/infra/provider-usage.auth.js +5 -3
- package/dist/infra/provider-usage.fetch.claude.js +16 -6
- package/dist/infra/provider-usage.fetch.minimax.js +8 -3
- package/dist/infra/provider-usage.js +9 -5
- package/dist/infra/restart.js +2 -2
- package/dist/infra/usage-settings.js +78 -0
- package/dist/infra/usage-suggestions.js +17 -5
- package/dist/infra/usage-upload.js +38 -1
- package/dist/infra/voicewake.js +2 -2
- package/dist/media/image-ops.js +3 -1
- package/dist/memory/index.js +2 -381
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
- package/dist/pairing/pairing-store.js +24 -0
- package/dist/providers/github-copilot-auth.js +1 -1
- package/dist/routing/resolve-route.js +6 -6
- package/dist/routing/session-key.js +3 -1
- package/dist/sessions/send-policy.js +5 -5
- package/dist/slack/monitor.js +22 -1
- package/dist/telegram/reaction-level.js +2 -1
- package/dist/utils.js +8 -3
- package/dist/wizard/onboarding.js +29 -7
- package/docs/AGENTS.default.md +1 -1
- package/docs/configuration.md +1 -1
- package/docs/feature-inventory/overview.md +2 -2
- package/docs/reference/templates/AGENTS.md +172 -109
- package/docs/templates/AGENTS.md +140 -199
- package/docs/templates/BOOTSTRAP.md +40 -20
- package/docs/templates/IDENTITY.md +6 -0
- package/docs/templates/USER.md +22 -2
- package/package.json +3 -1
- package/skills/{notion → connectors/notion}/SKILL.md +1 -1
- package/skills/{filesystem → guides/filesystem}/SKILL.md +1 -1
- package/skills/{onboarding → guides/onboarding}/SKILL.md +1 -1
- package/skills/{onboarding → guides/onboarding}/docs/CAPABILITY_TAXONOMY.md +5 -5
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR.md +8 -8
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_ONBOARDING.md +2 -2
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_SKILLS.md +26 -20
- package/skills/{onboarding → guides/onboarding}/docs/GOAL_STATE_ARCHITECTURE.md +38 -43
- package/skills/{onboarding → guides/onboarding}/docs/NEXUS_SYSTEM_OVERVIEW.md +4 -4
- package/skills/{onboarding → guides/onboarding}/docs/SKILLS_HUB_SPEC.md +1 -1
- package/skills/{onboarding → guides/onboarding}/docs/SKILLS_SPECIFICATION.md +8 -7
- package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_DESIGN.md +16 -16
- package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_PRD.md +10 -12
- package/skills/guides/onboarding/docs/canonical/00_CONFLICT_ANALYSIS.md +463 -0
- package/skills/guides/onboarding/docs/canonical/01_NEXUS_OVERVIEW.md +167 -0
- package/skills/guides/onboarding/docs/canonical/02_CLI_REFERENCE.md +404 -0
- package/skills/guides/onboarding/docs/canonical/03_STATE_ARCHITECTURE.md +357 -0
- package/skills/guides/onboarding/docs/canonical/04_SKILL_SPECIFICATION.md +393 -0
- package/skills/guides/onboarding/docs/canonical/05_CAPABILITY_TAXONOMY.md +298 -0
- package/skills/guides/onboarding/docs/canonical/06_CAPABILITIES_REFERENCE.md +207 -0
- package/skills/guides/onboarding/docs/canonical/07_AGENT_BINDINGS.md +85 -0
- package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/nexus-cloud.md +2 -2
- package/skills/{onboarding → guides/onboarding}/scripts/ralph/progress.txt +1 -1
- package/skills/{nexus-cloud → tools/nexus-cloud}/SKILL.md +2 -1
- package/skills/{nexus-cloud → tools/nexus-cloud}/docs/setup.md +1 -1
- package/docs/templates/PROFILE.md +0 -14
- /package/skills/{brave-search → connectors/brave-search}/SKILL.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/setup.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/troubleshooting.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/usage.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/scripts/content.mjs +0 -0
- /package/skills/{brave-search → connectors/brave-search}/scripts/search.mjs +0 -0
- /package/skills/{discord → connectors/discord}/SKILL.md +0 -0
- /package/skills/{gemini → connectors/gemini}/SKILL.md +0 -0
- /package/skills/{github → connectors/github}/SKILL.md +0 -0
- /package/skills/{github → connectors/github}/docs/setup.md +0 -0
- /package/skills/{github → connectors/github}/docs/troubleshooting.md +0 -0
- /package/skills/{google-oauth → connectors/google-oauth}/SKILL.md +0 -0
- /package/skills/{slack → connectors/slack}/SKILL.md +0 -0
- /package/skills/{telegram → connectors/telegram}/SKILL.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/pairing.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/setup.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/webhook.md +0 -0
- /package/skills/{wacli → connectors/wacli}/SKILL.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/auth.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/backup.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/troubleshooting.md +0 -0
- /package/skills/{browser-use-agent-sdk → guides/browser-use-agent-sdk}/SKILL.md +0 -0
- /package/skills/{json-render → guides/json-render}/SKILL.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/registry.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/App.css +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/App.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/data/nexus-core.json +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/index.css +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/registry.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/docs/nexus-state-demo.md +0 -0
- /package/skills/{json-render → guides/json-render}/docs/shadcn-preset.md +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/create-vite-demo.sh +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/package-lock.json +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/package.json +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/server.ts +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/CAPABILITIES.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_CREDENTIALS.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/DOCUMENTATION_OVERVIEW.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/ENTITY_MODEL.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/SKILL_INVENTORY.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/STATE_ARCHITECTURE.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/TROUBLESHOOTING.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/USER_JOURNEY.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/WOW_MOMENTS.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/agent-apple-id.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/1password.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/TEMPLATE.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/aix.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/bird.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/brave-search.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/comms.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/computer-use.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/cron-and-heartbeat.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/eve.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/github.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/gog.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/homebrew-prereqs.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/qmd.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/telegram.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/wacli.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/weather.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prd.json +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prompt.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.log +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.sh +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/setup-cursor-skills.sh +0 -0
- /package/skills/{1password → tools/1password}/SKILL.md +0 -0
- /package/skills/{1password → tools/1password}/docs/setup.md +0 -0
- /package/skills/{1password → tools/1password}/docs/troubleshooting.md +0 -0
- /package/skills/{1password → tools/1password}/references/cli-examples.md +0 -0
- /package/skills/{1password → tools/1password}/references/get-started.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/SKILL.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/browser-use-eval.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/first-tests.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/wordle-nyt-eval.js +0 -0
- /package/skills/{aix → tools/aix}/SKILL.md +0 -0
- /package/skills/{aix → tools/aix}/docs/embeddings.md +0 -0
- /package/skills/{aix → tools/aix}/docs/setup.md +0 -0
- /package/skills/{aix → tools/aix}/docs/troubleshooting.md +0 -0
- /package/skills/{aix → tools/aix}/references/sql.md +0 -0
- /package/skills/{apple-notes → tools/apple-notes}/SKILL.md +0 -0
- /package/skills/{apple-reminders → tools/apple-reminders}/SKILL.md +0 -0
- /package/skills/{bear-notes → tools/bear-notes}/SKILL.md +0 -0
- /package/skills/{bird → tools/bird}/SKILL.md +0 -0
- /package/skills/{bird → tools/bird}/docs/auth.md +0 -0
- /package/skills/{bird → tools/bird}/docs/troubleshooting.md +0 -0
- /package/skills/{blogwatcher → tools/blogwatcher}/SKILL.md +0 -0
- /package/skills/{blucli → tools/blucli}/SKILL.md +0 -0
- /package/skills/{camsnap → tools/camsnap}/SKILL.md +0 -0
- /package/skills/{clawdhub → tools/clawdhub}/SKILL.md +0 -0
- /package/skills/{coding-agent → tools/coding-agent}/SKILL.md +0 -0
- /package/skills/{comms → tools/comms}/SKILL.md +0 -0
- /package/skills/{comms → tools/comms}/docs/adapters.md +0 -0
- /package/skills/{comms → tools/comms}/docs/setup.md +0 -0
- /package/skills/{comms → tools/comms}/docs/troubleshooting.md +0 -0
- /package/skills/{comms → tools/comms}/references/schema.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/SKILL.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/open-interpreter.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/peekaboo.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/setup.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/troubleshooting.md +0 -0
- /package/skills/{eightctl → tools/eightctl}/SKILL.md +0 -0
- /package/skills/{eve → tools/eve}/SKILL.md +0 -0
- /package/skills/{eve → tools/eve}/docs/dual-account.md +0 -0
- /package/skills/{eve → tools/eve}/docs/intelligence.md +0 -0
- /package/skills/{eve → tools/eve}/docs/setup.md +0 -0
- /package/skills/{eve → tools/eve}/docs/troubleshooting.md +0 -0
- /package/skills/{eve → tools/eve}/scripts/setup-dual-account.sh +0 -0
- /package/skills/{food-order → tools/food-order}/SKILL.md +0 -0
- /package/skills/{gh → tools/gh}/SKILL.md +0 -0
- /package/skills/{gh → tools/gh}/docs/usage.md +0 -0
- /package/skills/{gifgrep → tools/gifgrep}/SKILL.md +0 -0
- /package/skills/{gog → tools/gog}/SKILL.md +0 -0
- /package/skills/{gog → tools/gog}/docs/portability.md +0 -0
- /package/skills/{gog → tools/gog}/docs/setup.md +0 -0
- /package/skills/{gog → tools/gog}/docs/troubleshooting.md +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/README.md +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/add_test_users.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts_manual.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/create_oauth_client.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/launch_cdp_chrome.sh +0 -0
- /package/skills/{goplaces → tools/goplaces}/SKILL.md +0 -0
- /package/skills/{imsg → tools/imsg}/SKILL.md +0 -0
- /package/skills/{local-places → tools/local-places}/SERVER_README.md +0 -0
- /package/skills/{local-places → tools/local-places}/SKILL.md +0 -0
- /package/skills/{local-places → tools/local-places}/pyproject.toml +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__init__.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/google_places.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/main.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/schemas.py +0 -0
- /package/skills/{mcporter → tools/mcporter}/SKILL.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/SKILL.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/references/codexbar-cli.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/scripts/model_usage.py +0 -0
- /package/skills/{nano-banana-pro → tools/nano-banana-pro}/SKILL.md +0 -0
- /package/skills/{nano-banana-pro → tools/nano-banana-pro}/scripts/generate_image.py +0 -0
- /package/skills/{nano-pdf → tools/nano-pdf}/SKILL.md +0 -0
- /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/security.md +0 -0
- /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/troubleshooting.md +0 -0
- /package/skills/{obsidian → tools/obsidian}/SKILL.md +0 -0
- /package/skills/{openai-image-gen → tools/openai-image-gen}/SKILL.md +0 -0
- /package/skills/{openai-image-gen → tools/openai-image-gen}/scripts/gen.py +0 -0
- /package/skills/{openai-whisper → tools/openai-whisper}/SKILL.md +0 -0
- /package/skills/{openai-whisper-api → tools/openai-whisper-api}/SKILL.md +0 -0
- /package/skills/{openai-whisper-api → tools/openai-whisper-api}/scripts/transcribe.sh +0 -0
- /package/skills/{openhue → tools/openhue}/SKILL.md +0 -0
- /package/skills/{oracle → tools/oracle}/SKILL.md +0 -0
- /package/skills/{ordercli → tools/ordercli}/SKILL.md +0 -0
- /package/skills/{peekaboo → tools/peekaboo}/SKILL.md +0 -0
- /package/skills/{qmd → tools/qmd}/SKILL.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/mcp.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/ollama.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/setup.md +0 -0
- /package/skills/{sag → tools/sag}/SKILL.md +0 -0
- /package/skills/{skill-cli-template → tools/skill-cli-template}/SKILL.md +0 -0
- /package/skills/{songsee → tools/songsee}/SKILL.md +0 -0
- /package/skills/{sonoscli → tools/sonoscli}/SKILL.md +0 -0
- /package/skills/{spotify-player → tools/spotify-player}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{things-mac → tools/things-mac}/SKILL.md +0 -0
- /package/skills/{tmux → tools/tmux}/SKILL.md +0 -0
- /package/skills/{tmux → tools/tmux}/scripts/find-sessions.sh +0 -0
- /package/skills/{tmux → tools/tmux}/scripts/wait-for-text.sh +0 -0
- /package/skills/{trello → tools/trello}/SKILL.md +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/SKILL.md +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/auto-port.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-all.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-nexus.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-pi-ai.sh +0 -0
- /package/skills/{video-frames → tools/video-frames}/SKILL.md +0 -0
- /package/skills/{video-frames → tools/video-frames}/scripts/frame.sh +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/docs/usage.md +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveStateDir } from "../config/paths.js";
|
|
4
|
+
function listAgentIds(stateDir) {
|
|
5
|
+
const agentsDir = path.join(stateDir, "agents");
|
|
6
|
+
try {
|
|
7
|
+
const entries = fs.readdirSync(agentsDir, { withFileTypes: true });
|
|
8
|
+
return entries
|
|
9
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
|
|
10
|
+
.map((entry) => entry.name)
|
|
11
|
+
.sort();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function resolveAgentId(env = process.env) {
|
|
18
|
+
const override = env.NEXUS_AGENT_ID?.trim();
|
|
19
|
+
const stateDir = resolveStateDir(env);
|
|
20
|
+
const available = listAgentIds(stateDir);
|
|
21
|
+
if (override) {
|
|
22
|
+
return {
|
|
23
|
+
ok: true,
|
|
24
|
+
agentId: override,
|
|
25
|
+
source: "env",
|
|
26
|
+
available,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (available.length === 1) {
|
|
30
|
+
return {
|
|
31
|
+
ok: true,
|
|
32
|
+
agentId: available[0],
|
|
33
|
+
source: "auto",
|
|
34
|
+
available,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (available.length > 1) {
|
|
38
|
+
return { ok: false, reason: "multiple", available };
|
|
39
|
+
}
|
|
40
|
+
return { ok: true, agentId: "default", source: "default", available };
|
|
41
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import lockfile from "proper-lockfile";
|
|
4
|
+
import { buildCredentialIndex, ensureCredentialIndexSync, listCredentialEntriesSync, readCredentialRecordSync, resolveDefaultEnvVar, resolveOAuthBundle, resolveCredentialIndexPath, resolveCredentialValue, writeCredentialIndexSync, writeCredentialRecordSync, } from "../credentials/store.js";
|
|
4
5
|
import { createSubsystemLogger } from "../logging.js";
|
|
5
|
-
import { buildCredentialIndex, ensureCredentialIndexSync, listCredentialEntriesSync, readCredentialRecordSync, resolveCredentialIndexPath, resolveCredentialValue, writeCredentialIndexSync, writeCredentialRecordSync, } from "../credentials/store.js";
|
|
6
6
|
import { refreshChutesTokens } from "./chutes-oauth.js";
|
|
7
7
|
import { normalizeProviderId } from "./model-selection.js";
|
|
8
8
|
export const CLAUDE_CLI_PROFILE_ID = "anthropic:claude-cli";
|
|
@@ -22,17 +22,24 @@ function parseProfileId(profileId) {
|
|
|
22
22
|
const parts = profileId.split(":");
|
|
23
23
|
if (parts.length === 1)
|
|
24
24
|
return { provider: profileId, account: "default" };
|
|
25
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
provider: parts[0] ?? profileId,
|
|
27
|
+
account: parts.slice(1).join(":") || "default",
|
|
28
|
+
};
|
|
26
29
|
}
|
|
27
30
|
function isEmailLike(value) {
|
|
28
31
|
const trimmed = value.trim();
|
|
29
|
-
return Boolean(trimmed
|
|
32
|
+
return Boolean(trimmed?.includes("@") && trimmed.includes("."));
|
|
30
33
|
}
|
|
31
34
|
function pickPreferredEntry(entries) {
|
|
32
35
|
if (entries.length === 0)
|
|
33
36
|
return null;
|
|
34
37
|
const byType = (type) => entries.find((entry) => entry.record.type === type);
|
|
35
|
-
return byType("api_key") ??
|
|
38
|
+
return (byType("api_key") ??
|
|
39
|
+
byType("token") ??
|
|
40
|
+
byType("oauth") ??
|
|
41
|
+
entries[0] ??
|
|
42
|
+
null);
|
|
36
43
|
}
|
|
37
44
|
function resolveCredentialEmail(entry) {
|
|
38
45
|
const metaEmail = entry.record.metadata?.email;
|
|
@@ -113,7 +120,8 @@ export function loadAuthProfileStore() {
|
|
|
113
120
|
rebuilt.order = existing.order;
|
|
114
121
|
rebuilt.lastGood = existing.lastGood;
|
|
115
122
|
rebuilt.usageStats = existing.usageStats;
|
|
116
|
-
const servicesChanged = JSON.stringify(rebuilt.services) !==
|
|
123
|
+
const servicesChanged = JSON.stringify(rebuilt.services) !==
|
|
124
|
+
JSON.stringify(existing.services ?? {});
|
|
117
125
|
if (servicesChanged) {
|
|
118
126
|
writeIndex(rebuilt);
|
|
119
127
|
}
|
|
@@ -166,6 +174,31 @@ export async function setAuthProfileOrder(params) {
|
|
|
166
174
|
function resolveAuthIdForProvider(entry) {
|
|
167
175
|
return entry.authId;
|
|
168
176
|
}
|
|
177
|
+
function buildAuthPayload(credential) {
|
|
178
|
+
if (credential.type === "api_key") {
|
|
179
|
+
return { value: credential.key ?? "" };
|
|
180
|
+
}
|
|
181
|
+
if (credential.type === "token") {
|
|
182
|
+
const value = credential.token ?? "";
|
|
183
|
+
if (!credential.expires)
|
|
184
|
+
return { value };
|
|
185
|
+
return {
|
|
186
|
+
value: JSON.stringify({
|
|
187
|
+
token: value,
|
|
188
|
+
expiresAt: credential.expires,
|
|
189
|
+
}),
|
|
190
|
+
format: "json",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
value: JSON.stringify({
|
|
195
|
+
accessToken: credential.access,
|
|
196
|
+
refreshToken: credential.refresh,
|
|
197
|
+
expiresAt: credential.expires,
|
|
198
|
+
}),
|
|
199
|
+
format: "json",
|
|
200
|
+
};
|
|
201
|
+
}
|
|
169
202
|
export function upsertAuthProfile(params) {
|
|
170
203
|
const { provider, account } = parseProfileId(params.profileId);
|
|
171
204
|
const authId = resolveAuthIdForProvider({
|
|
@@ -176,33 +209,43 @@ export function upsertAuthProfile(params) {
|
|
|
176
209
|
record: {
|
|
177
210
|
owner: "user",
|
|
178
211
|
type: params.credential.type,
|
|
179
|
-
storage: { provider: "
|
|
212
|
+
storage: { provider: "env", var: "NEXUS_DUMMY" },
|
|
180
213
|
},
|
|
181
214
|
});
|
|
182
215
|
const record = {
|
|
183
216
|
owner: "user",
|
|
184
217
|
type: params.credential.type,
|
|
185
218
|
configuredAt: new Date().toISOString(),
|
|
186
|
-
storage: { provider: "
|
|
219
|
+
storage: { provider: "env", var: "NEXUS_DUMMY" },
|
|
187
220
|
metadata: {
|
|
188
221
|
addedBy: "nexus upsertAuthProfile",
|
|
189
222
|
},
|
|
223
|
+
...(params.credential.type !== "api_key" && params.credential.expires
|
|
224
|
+
? { expiresAt: params.credential.expires }
|
|
225
|
+
: {}),
|
|
190
226
|
};
|
|
191
227
|
if (params.credential.type === "api_key") {
|
|
192
228
|
record.key = params.credential.key;
|
|
193
229
|
}
|
|
194
230
|
else if (params.credential.type === "token") {
|
|
195
231
|
record.token = params.credential.token;
|
|
196
|
-
record.expiresAt = params.credential.expires;
|
|
197
232
|
}
|
|
198
233
|
else {
|
|
199
234
|
record.accessToken = params.credential.access;
|
|
200
235
|
record.refreshToken = params.credential.refresh;
|
|
201
|
-
record.expiresAt = params.credential.expires;
|
|
202
236
|
}
|
|
203
|
-
const
|
|
237
|
+
const payload = buildAuthPayload(params.credential);
|
|
238
|
+
const envVar = resolveDefaultEnvVar({
|
|
239
|
+
service: provider,
|
|
240
|
+
type: params.credential.type,
|
|
241
|
+
});
|
|
242
|
+
record.storage = {
|
|
243
|
+
provider: "env",
|
|
244
|
+
var: envVar,
|
|
245
|
+
...(payload.format ? { format: payload.format } : {}),
|
|
246
|
+
};
|
|
204
247
|
const allowKeychain = process.env.NEXUS_KEYCHAIN_ENABLED === "1";
|
|
205
|
-
if (
|
|
248
|
+
if (payload.value && allowKeychain && process.platform === "darwin") {
|
|
206
249
|
const keychainService = `nexus.${provider}`;
|
|
207
250
|
const keychainAccount = account;
|
|
208
251
|
try {
|
|
@@ -214,18 +257,26 @@ export function upsertAuthProfile(params) {
|
|
|
214
257
|
"-a",
|
|
215
258
|
keychainAccount,
|
|
216
259
|
"-w",
|
|
217
|
-
|
|
260
|
+
payload.value,
|
|
218
261
|
]);
|
|
219
|
-
record.storage = {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
262
|
+
record.storage = {
|
|
263
|
+
provider: "keychain",
|
|
264
|
+
service: keychainService,
|
|
265
|
+
account: keychainAccount,
|
|
266
|
+
...(payload.format ? { format: payload.format } : {}),
|
|
267
|
+
};
|
|
224
268
|
}
|
|
225
269
|
catch (err) {
|
|
226
|
-
|
|
270
|
+
process.env[envVar] = payload.value;
|
|
271
|
+
log.warn("keychain write failed; using env credential fallback", {
|
|
272
|
+
err: String(err),
|
|
273
|
+
envVar,
|
|
274
|
+
});
|
|
227
275
|
}
|
|
228
276
|
}
|
|
277
|
+
else if (payload.value) {
|
|
278
|
+
process.env[envVar] = payload.value;
|
|
279
|
+
}
|
|
229
280
|
writeCredentialRecordSync(provider, account, authId, record);
|
|
230
281
|
const index = readIndex();
|
|
231
282
|
index.lastUpdated = new Date().toISOString();
|
|
@@ -302,7 +353,10 @@ export async function clearAuthProfileCooldown(params) {
|
|
|
302
353
|
export async function markAuthProfileGood(params) {
|
|
303
354
|
const providerKey = normalizeProviderId(params.provider);
|
|
304
355
|
const updated = await updateIndexWithLock((index) => {
|
|
305
|
-
index.lastGood = {
|
|
356
|
+
index.lastGood = {
|
|
357
|
+
...index.lastGood,
|
|
358
|
+
[providerKey]: params.profileId,
|
|
359
|
+
};
|
|
306
360
|
return true;
|
|
307
361
|
});
|
|
308
362
|
if (updated) {
|
|
@@ -337,17 +391,52 @@ export async function resolveApiKeyForProfile(params) {
|
|
|
337
391
|
const providerKey = normalizeProviderId(cred.provider);
|
|
338
392
|
if (providerKey === "chutes" && record.type === "oauth") {
|
|
339
393
|
try {
|
|
394
|
+
const bundle = await resolveOAuthBundle(record);
|
|
395
|
+
const accessToken = bundle.accessToken ?? record.accessToken;
|
|
396
|
+
const refreshToken = bundle.refreshToken ?? record.refreshToken;
|
|
397
|
+
const oauthExpires = bundle.expiresAt !== undefined ? bundle.expiresAt : record.expiresAt;
|
|
398
|
+
const oauthExpiresAt = typeof oauthExpires === "number"
|
|
399
|
+
? oauthExpires
|
|
400
|
+
: Number.parseInt(String(oauthExpires), 10);
|
|
401
|
+
if (!accessToken || !refreshToken) {
|
|
402
|
+
throw new Error("Missing OAuth refresh token for chutes.");
|
|
403
|
+
}
|
|
340
404
|
const refreshed = await refreshChutesTokens({
|
|
341
405
|
credential: {
|
|
342
|
-
access:
|
|
343
|
-
refresh:
|
|
344
|
-
expires:
|
|
406
|
+
access: accessToken,
|
|
407
|
+
refresh: refreshToken,
|
|
408
|
+
expires: oauthExpiresAt,
|
|
345
409
|
email: cred.email,
|
|
346
|
-
clientId: typeof record.metadata?.clientId === "string"
|
|
410
|
+
clientId: typeof record.metadata?.clientId === "string"
|
|
411
|
+
? record.metadata.clientId
|
|
412
|
+
: undefined,
|
|
347
413
|
},
|
|
348
414
|
});
|
|
349
|
-
|
|
350
|
-
|
|
415
|
+
const refreshedPayload = JSON.stringify({
|
|
416
|
+
accessToken: refreshed.access,
|
|
417
|
+
refreshToken: refreshed.refresh,
|
|
418
|
+
expiresAt: refreshed.expires,
|
|
419
|
+
});
|
|
420
|
+
if (record.storage.provider === "keychain") {
|
|
421
|
+
execFileSync("security", [
|
|
422
|
+
"add-generic-password",
|
|
423
|
+
"-U",
|
|
424
|
+
"-s",
|
|
425
|
+
record.storage.service,
|
|
426
|
+
"-a",
|
|
427
|
+
record.storage.account,
|
|
428
|
+
"-w",
|
|
429
|
+
refreshedPayload,
|
|
430
|
+
]);
|
|
431
|
+
record.storage = { ...record.storage, format: "json" };
|
|
432
|
+
}
|
|
433
|
+
else if (record.storage.provider === "env") {
|
|
434
|
+
process.env[record.storage.var] = refreshedPayload;
|
|
435
|
+
record.storage = { ...record.storage, format: "json" };
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
throw new Error("Cannot persist refreshed token without keychain/env.");
|
|
439
|
+
}
|
|
351
440
|
record.expiresAt = refreshed.expires;
|
|
352
441
|
record.lastVerified = new Date().toISOString();
|
|
353
442
|
if (typeof refreshed.clientId === "string") {
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveBootstrapPath, resolveStateDir } from "../config/paths.js";
|
|
4
|
+
import { resolveAgentId } from "./agent-id.js";
|
|
5
|
+
function parseFrontmatter(content) {
|
|
6
|
+
const frontmatter = {};
|
|
7
|
+
const normalized = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
8
|
+
if (!normalized.startsWith("---"))
|
|
9
|
+
return frontmatter;
|
|
10
|
+
const endIndex = normalized.indexOf("\n---", 3);
|
|
11
|
+
if (endIndex === -1)
|
|
12
|
+
return frontmatter;
|
|
13
|
+
const block = normalized.slice(4, endIndex);
|
|
14
|
+
for (const line of block.split("\n")) {
|
|
15
|
+
const match = line.match(/^([\w-]+)\s*:\s*(.*)$/);
|
|
16
|
+
if (!match)
|
|
17
|
+
continue;
|
|
18
|
+
const key = match[1].trim().toLowerCase();
|
|
19
|
+
const rawValue = match[2].trim();
|
|
20
|
+
if (!key || !rawValue)
|
|
21
|
+
continue;
|
|
22
|
+
const value = (rawValue.startsWith('"') && rawValue.endsWith('"')) ||
|
|
23
|
+
(rawValue.startsWith("'") && rawValue.endsWith("'"))
|
|
24
|
+
? rawValue.slice(1, -1)
|
|
25
|
+
: rawValue;
|
|
26
|
+
frontmatter[key] = value;
|
|
27
|
+
}
|
|
28
|
+
return frontmatter;
|
|
29
|
+
}
|
|
30
|
+
function escapeRegex(input) {
|
|
31
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
32
|
+
}
|
|
33
|
+
function readField(pathname, label) {
|
|
34
|
+
try {
|
|
35
|
+
const raw = fs.readFileSync(pathname, "utf-8");
|
|
36
|
+
const frontmatter = parseFrontmatter(raw);
|
|
37
|
+
const key = label.trim().toLowerCase();
|
|
38
|
+
const frontmatterValue = frontmatter[key];
|
|
39
|
+
if (frontmatterValue)
|
|
40
|
+
return frontmatterValue;
|
|
41
|
+
const escaped = escapeRegex(label.trim());
|
|
42
|
+
const regex = new RegExp(`^[-*]?\\s*(?:\\*\\*)?${escaped}(?:\\*\\*)?\\s*:\\s*(.+)$`, "im");
|
|
43
|
+
const match = raw.match(regex);
|
|
44
|
+
return match?.[1]?.trim();
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function hasNamedIdentity(pathname) {
|
|
51
|
+
return Boolean(readField(pathname, "Name"));
|
|
52
|
+
}
|
|
53
|
+
function resolveAgentFromState(resolution, stateDir) {
|
|
54
|
+
if (!resolution.ok) {
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
reason: "multiple_agents",
|
|
58
|
+
agentOptions: resolution.available,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const agentId = resolution.agentId;
|
|
62
|
+
const agentIdentityDir = path.join(stateDir, "agents", agentId);
|
|
63
|
+
const userIdentityDir = path.join(stateDir, "user");
|
|
64
|
+
const agentIdentityPath = path.join(agentIdentityDir, "IDENTITY.md");
|
|
65
|
+
const agentSoulPath = path.join(agentIdentityDir, "SOUL.md");
|
|
66
|
+
const agentMemoryPath = path.join(agentIdentityDir, "MEMORY.md");
|
|
67
|
+
const userIdentityPath = path.join(userIdentityDir, "IDENTITY.md");
|
|
68
|
+
const bootstrapPath = resolveBootstrapPath(undefined, stateDir);
|
|
69
|
+
const agentIdentityExists = fs.existsSync(agentIdentityPath);
|
|
70
|
+
const agentSoulExists = fs.existsSync(agentSoulPath);
|
|
71
|
+
const agentMemoryExists = fs.existsSync(agentMemoryPath);
|
|
72
|
+
const userIdentityExists = fs.existsSync(userIdentityPath);
|
|
73
|
+
const hasIdentity = hasNamedIdentity(agentIdentityPath) && hasNamedIdentity(userIdentityPath);
|
|
74
|
+
const agentName = readField(agentIdentityPath, "Name");
|
|
75
|
+
const userName = readField(userIdentityPath, "Name");
|
|
76
|
+
return {
|
|
77
|
+
ok: true,
|
|
78
|
+
snapshot: {
|
|
79
|
+
agentId,
|
|
80
|
+
agentIdSource: resolution.source,
|
|
81
|
+
agentOptions: resolution.available,
|
|
82
|
+
agentName,
|
|
83
|
+
userName,
|
|
84
|
+
agentIdentityPath,
|
|
85
|
+
agentSoulPath,
|
|
86
|
+
agentMemoryPath,
|
|
87
|
+
userIdentityPath,
|
|
88
|
+
bootstrapPath,
|
|
89
|
+
agentIdentityExists,
|
|
90
|
+
agentSoulExists,
|
|
91
|
+
agentMemoryExists,
|
|
92
|
+
userIdentityExists,
|
|
93
|
+
hasIdentity,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function resolveIdentitySnapshot(env = process.env) {
|
|
98
|
+
const stateDir = resolveStateDir(env);
|
|
99
|
+
const resolution = resolveAgentId(env);
|
|
100
|
+
return resolveAgentFromState(resolution, stateDir);
|
|
101
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "./defaults.js";
|
|
2
|
-
import { buildModelAliasIndex, modelKey, parseModelRef, resolveModelRefFromString, } from "./model-selection.js";
|
|
2
|
+
import { buildModelAliasIndex, modelKey, parseModelRef, resolveConfiguredModelRef, resolveModelRefFromString, } from "./model-selection.js";
|
|
3
3
|
function isAbortError(err) {
|
|
4
4
|
if (!err || typeof err !== "object")
|
|
5
5
|
return false;
|
|
@@ -78,8 +78,13 @@ function resolveImageFallbackCandidates(params) {
|
|
|
78
78
|
return candidates;
|
|
79
79
|
}
|
|
80
80
|
function resolveFallbackCandidates(params) {
|
|
81
|
-
const
|
|
82
|
-
|
|
81
|
+
const fallbackDefault = resolveConfiguredModelRef({
|
|
82
|
+
cfg: params.cfg ?? {},
|
|
83
|
+
defaultProvider: DEFAULT_PROVIDER,
|
|
84
|
+
defaultModel: DEFAULT_MODEL,
|
|
85
|
+
});
|
|
86
|
+
const provider = params.provider?.trim() || fallbackDefault.provider;
|
|
87
|
+
const model = params.model?.trim() || fallbackDefault.model;
|
|
83
88
|
const aliasIndex = buildModelAliasIndex({
|
|
84
89
|
cfg: params.cfg ?? {},
|
|
85
90
|
defaultProvider: DEFAULT_PROVIDER,
|
|
@@ -99,12 +104,13 @@ function resolveFallbackCandidates(params) {
|
|
|
99
104
|
candidates.push(candidate);
|
|
100
105
|
};
|
|
101
106
|
addCandidate({ provider, model }, false);
|
|
102
|
-
const modelFallbacks =
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
const modelFallbacks = params.fallbacksOverride ??
|
|
108
|
+
(() => {
|
|
109
|
+
const model = params.cfg?.agent?.model;
|
|
110
|
+
if (model && typeof model === "object")
|
|
111
|
+
return model.fallbacks ?? [];
|
|
112
|
+
return [];
|
|
113
|
+
})();
|
|
108
114
|
for (const raw of modelFallbacks) {
|
|
109
115
|
const resolved = resolveModelRefFromString({
|
|
110
116
|
raw: String(raw ?? ""),
|
|
@@ -132,7 +132,7 @@ export function buildAllowedModelSet(params) {
|
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
const allowedCatalog = params.catalog.filter((entry) => allowedKeys.has(modelKey(entry.provider, entry.id)));
|
|
135
|
-
if (allowedCatalog.length === 0) {
|
|
135
|
+
if (allowedCatalog.length === 0 && allowedKeys.size === 0) {
|
|
136
136
|
return {
|
|
137
137
|
allowAny: true,
|
|
138
138
|
allowedCatalog: params.catalog,
|
|
@@ -83,7 +83,7 @@ function resolveMinimaxApiKeyFromStore(store) {
|
|
|
83
83
|
}
|
|
84
84
|
return undefined;
|
|
85
85
|
}
|
|
86
|
-
function
|
|
86
|
+
function _resolveImplicitProviders(params) {
|
|
87
87
|
const providers = {};
|
|
88
88
|
const minimaxEnv = resolveEnvApiKey("minimax");
|
|
89
89
|
const authStore = ensureAuthProfileStore(params.agentDir);
|
|
@@ -93,7 +93,7 @@ function resolveImplicitProviders(params) {
|
|
|
93
93
|
}
|
|
94
94
|
return providers;
|
|
95
95
|
}
|
|
96
|
-
async function
|
|
96
|
+
async function _maybeBuildCopilotProvider(params) {
|
|
97
97
|
const env = params.env ?? process.env;
|
|
98
98
|
const authStore = ensureAuthProfileStore(params.agentDir);
|
|
99
99
|
const profileIds = listProfilesForProvider(authStore, "github-copilot");
|
|
@@ -106,7 +106,10 @@ async function maybeBuildCopilotProvider(params) {
|
|
|
106
106
|
if (!selectedGithubToken && hasProfile) {
|
|
107
107
|
const profileId = profileIds[0];
|
|
108
108
|
if (profileId) {
|
|
109
|
-
const resolved = await resolveApiKeyForProfile({
|
|
109
|
+
const resolved = await resolveApiKeyForProfile({
|
|
110
|
+
store: authStore,
|
|
111
|
+
profileId,
|
|
112
|
+
});
|
|
110
113
|
if (resolved?.apiKey)
|
|
111
114
|
selectedGithubToken = resolved.apiKey;
|
|
112
115
|
}
|
|
@@ -134,17 +137,20 @@ async function maybeBuildCopilotProvider(params) {
|
|
|
134
137
|
}
|
|
135
138
|
export async function ensureNexusModelsJson(config, agentDirOverride) {
|
|
136
139
|
const cfg = config ?? loadConfig();
|
|
137
|
-
const providers = cfg.models?.providers;
|
|
138
|
-
if (!providers || Object.keys(providers).length === 0) {
|
|
139
|
-
const agentDir = agentDirOverride?.trim()
|
|
140
|
-
? agentDirOverride.trim()
|
|
141
|
-
: resolveNexusAgentDir();
|
|
142
|
-
return { agentDir, wrote: false };
|
|
143
|
-
}
|
|
144
|
-
const mode = cfg.models?.mode ?? DEFAULT_MODE;
|
|
145
140
|
const agentDir = agentDirOverride?.trim()
|
|
146
141
|
? agentDirOverride.trim()
|
|
147
142
|
: resolveNexusAgentDir();
|
|
143
|
+
const explicitProviders = cfg.models?.providers ?? {};
|
|
144
|
+
const implicitProviders = _resolveImplicitProviders({ agentDir });
|
|
145
|
+
const copilotProvider = await _maybeBuildCopilotProvider({ agentDir });
|
|
146
|
+
if (copilotProvider && !explicitProviders["github-copilot"]) {
|
|
147
|
+
implicitProviders["github-copilot"] = copilotProvider;
|
|
148
|
+
}
|
|
149
|
+
const providers = { ...implicitProviders, ...explicitProviders };
|
|
150
|
+
if (Object.keys(providers).length === 0) {
|
|
151
|
+
return { agentDir, wrote: false };
|
|
152
|
+
}
|
|
153
|
+
const mode = cfg.models?.mode ?? DEFAULT_MODE;
|
|
148
154
|
const targetPath = path.join(agentDir, "models.json");
|
|
149
155
|
let mergedProviders = providers;
|
|
150
156
|
let existingRaw = "";
|