@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.
Files changed (347) hide show
  1. package/dist/agents/agent-id.js +41 -0
  2. package/dist/agents/auth-profiles.js +114 -25
  3. package/dist/agents/identity-state.js +101 -0
  4. package/dist/agents/model-auth.js +1 -0
  5. package/dist/agents/model-fallback.js +15 -9
  6. package/dist/agents/model-selection.js +1 -1
  7. package/dist/agents/models-config.js +17 -11
  8. package/dist/agents/pi-embedded-runner.js +101 -9
  9. package/dist/agents/sandbox.js +12 -3
  10. package/dist/agents/skill-runner.js +41 -6
  11. package/dist/agents/skill-usage.js +117 -17
  12. package/dist/agents/skills-status.js +4 -3
  13. package/dist/agents/skills.js +38 -30
  14. package/dist/agents/subagent-registry.js +25 -11
  15. package/dist/agents/system-prompt.js +16 -0
  16. package/dist/agents/tool-policy.js +19 -3
  17. package/dist/agents/tools/browser-tool.js +5 -2
  18. package/dist/agents/tools/image-tool.js +93 -8
  19. package/dist/agents/tools/sessions-announce-target.js +5 -1
  20. package/dist/agents/workspace.js +81 -59
  21. package/dist/auto-reply/command-detection.js +2 -1
  22. package/dist/auto-reply/reply/directive-handling.js +153 -28
  23. package/dist/auto-reply/reply/directives.js +17 -2
  24. package/dist/auto-reply/reply/model-selection.js +8 -3
  25. package/dist/auto-reply/reply/queue.js +2 -2
  26. package/dist/auto-reply/reply.js +1 -1
  27. package/dist/auto-reply/thinking.js +15 -0
  28. package/dist/browser/chrome.js +1 -1
  29. package/dist/browser/client.js +2 -0
  30. package/dist/browser/config.js +6 -2
  31. package/dist/browser/pw-tools-core.js +3 -0
  32. package/dist/browser/routes/agent.js +14 -0
  33. package/dist/canvas-host/server.js +1 -1
  34. package/dist/capabilities/detector.js +46 -15
  35. package/dist/capabilities/registry.js +2 -1
  36. package/dist/cli/cloud-cli.js +70 -7
  37. package/dist/cli/credential-cli.js +214 -23
  38. package/dist/cli/gateway-cli.js +1 -1
  39. package/dist/cli/log-cli.js +25 -0
  40. package/dist/cli/pairing-cli.js +1 -1
  41. package/dist/cli/program.js +82 -8
  42. package/dist/cli/run-main.js +1 -1
  43. package/dist/cli/skills-cli.js +165 -30
  44. package/dist/cli/skills-hub-cli.js +68 -36
  45. package/dist/cli/tool-connector-cli.js +99 -24
  46. package/dist/cli/upstream-sync-cli.js +253 -96
  47. package/dist/cli/usage-cli.js +14 -0
  48. package/dist/commands/auth-choice-options.js +6 -1
  49. package/dist/commands/auth-choice.js +157 -5
  50. package/dist/commands/bootstrap-preset.js +26 -12
  51. package/dist/commands/capabilities.js +33 -6
  52. package/dist/commands/claude-md.js +3 -2
  53. package/dist/commands/config-view.js +1 -1
  54. package/dist/commands/config.js +85 -0
  55. package/dist/commands/configure.js +4 -4
  56. package/dist/commands/credential.js +497 -36
  57. package/dist/commands/cursor-hooks.js +240 -0
  58. package/dist/commands/cursor-rules.js +14 -188
  59. package/dist/commands/doctor.js +5 -4
  60. package/dist/commands/identity.js +29 -32
  61. package/dist/commands/init.js +304 -20
  62. package/dist/commands/log.js +134 -0
  63. package/dist/commands/models/fallbacks.js +1 -1
  64. package/dist/commands/models/image-fallbacks.js +1 -1
  65. package/dist/commands/models/list.js +1 -1
  66. package/dist/commands/models/scan.js +1 -1
  67. package/dist/commands/onboard-auth.js +27 -2
  68. package/dist/commands/onboard-eve-identity.js +8 -9
  69. package/dist/commands/onboard-non-interactive.js +4 -2
  70. package/dist/commands/onboard-quickstart.js +18 -11
  71. package/dist/commands/quest-state.js +271 -0
  72. package/dist/commands/quest.js +53 -13
  73. package/dist/commands/reset.js +1 -1
  74. package/dist/commands/sessions-ingest.js +5 -4
  75. package/dist/commands/setup.js +4 -2
  76. package/dist/commands/skills-manifest.js +89 -29
  77. package/dist/commands/status.js +193 -73
  78. package/dist/commands/suggestions.js +1 -1
  79. package/dist/commands/usage-tracking.js +32 -0
  80. package/dist/commands/usage-upload.js +6 -1
  81. package/dist/config/defaults.js +1 -3
  82. package/dist/config/includes.js +5 -7
  83. package/dist/config/io.js +88 -16
  84. package/dist/config/legacy.js +4 -2
  85. package/dist/config/paths.js +16 -0
  86. package/dist/config/sessions.js +9 -5
  87. package/dist/config/zod-schema.js +4 -3
  88. package/dist/control-plane/broker/broker.js +131 -78
  89. package/dist/control-plane/compaction.js +3 -5
  90. package/dist/control-plane/factory.js +2 -2
  91. package/dist/control-plane/index.js +2 -2
  92. package/dist/control-plane/odu/agents.js +28 -23
  93. package/dist/control-plane/odu/interaction-tools.js +62 -50
  94. package/dist/control-plane/odu/prompt-loader.js +8 -8
  95. package/dist/control-plane/odu/runtime.js +87 -75
  96. package/dist/control-plane/odu-control-plane.js +14 -12
  97. package/dist/control-plane/single-agent.js +13 -13
  98. package/dist/credentials/store.js +133 -7
  99. package/dist/daemon/launchd.js +14 -0
  100. package/dist/entry.js +0 -0
  101. package/dist/gateway/server-browser.js +5 -4
  102. package/dist/gateway/server-methods/cron.js +11 -1
  103. package/dist/gateway/server.js +14 -7
  104. package/dist/infra/bonjour.js +1 -1
  105. package/dist/infra/event-log.js +8 -2
  106. package/dist/infra/path-env.js +1 -2
  107. package/dist/infra/provider-usage.auth.js +5 -3
  108. package/dist/infra/provider-usage.fetch.claude.js +16 -6
  109. package/dist/infra/provider-usage.fetch.minimax.js +8 -3
  110. package/dist/infra/provider-usage.js +9 -5
  111. package/dist/infra/restart.js +2 -2
  112. package/dist/infra/usage-settings.js +78 -0
  113. package/dist/infra/usage-suggestions.js +17 -5
  114. package/dist/infra/usage-upload.js +38 -1
  115. package/dist/infra/voicewake.js +2 -2
  116. package/dist/media/image-ops.js +3 -1
  117. package/dist/memory/index.js +2 -381
  118. package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
  119. package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
  120. package/dist/pairing/pairing-store.js +24 -0
  121. package/dist/providers/github-copilot-auth.js +1 -1
  122. package/dist/routing/resolve-route.js +6 -6
  123. package/dist/routing/session-key.js +3 -1
  124. package/dist/sessions/send-policy.js +5 -5
  125. package/dist/slack/monitor.js +22 -1
  126. package/dist/telegram/reaction-level.js +2 -1
  127. package/dist/utils.js +8 -3
  128. package/dist/wizard/onboarding.js +29 -7
  129. package/docs/AGENTS.default.md +1 -1
  130. package/docs/configuration.md +1 -1
  131. package/docs/feature-inventory/overview.md +2 -2
  132. package/docs/reference/templates/AGENTS.md +172 -109
  133. package/docs/templates/AGENTS.md +140 -199
  134. package/docs/templates/BOOTSTRAP.md +40 -20
  135. package/docs/templates/IDENTITY.md +6 -0
  136. package/docs/templates/USER.md +22 -2
  137. package/package.json +3 -1
  138. package/skills/{notion → connectors/notion}/SKILL.md +1 -1
  139. package/skills/{filesystem → guides/filesystem}/SKILL.md +1 -1
  140. package/skills/{onboarding → guides/onboarding}/SKILL.md +1 -1
  141. package/skills/{onboarding → guides/onboarding}/docs/CAPABILITY_TAXONOMY.md +5 -5
  142. package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR.md +8 -8
  143. package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_ONBOARDING.md +2 -2
  144. package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_SKILLS.md +26 -20
  145. package/skills/{onboarding → guides/onboarding}/docs/GOAL_STATE_ARCHITECTURE.md +38 -43
  146. package/skills/{onboarding → guides/onboarding}/docs/NEXUS_SYSTEM_OVERVIEW.md +4 -4
  147. package/skills/{onboarding → guides/onboarding}/docs/SKILLS_HUB_SPEC.md +1 -1
  148. package/skills/{onboarding → guides/onboarding}/docs/SKILLS_SPECIFICATION.md +8 -7
  149. package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_DESIGN.md +16 -16
  150. package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_PRD.md +10 -12
  151. package/skills/guides/onboarding/docs/canonical/00_CONFLICT_ANALYSIS.md +463 -0
  152. package/skills/guides/onboarding/docs/canonical/01_NEXUS_OVERVIEW.md +167 -0
  153. package/skills/guides/onboarding/docs/canonical/02_CLI_REFERENCE.md +404 -0
  154. package/skills/guides/onboarding/docs/canonical/03_STATE_ARCHITECTURE.md +357 -0
  155. package/skills/guides/onboarding/docs/canonical/04_SKILL_SPECIFICATION.md +393 -0
  156. package/skills/guides/onboarding/docs/canonical/05_CAPABILITY_TAXONOMY.md +298 -0
  157. package/skills/guides/onboarding/docs/canonical/06_CAPABILITIES_REFERENCE.md +207 -0
  158. package/skills/guides/onboarding/docs/canonical/07_AGENT_BINDINGS.md +85 -0
  159. package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/nexus-cloud.md +2 -2
  160. package/skills/{onboarding → guides/onboarding}/scripts/ralph/progress.txt +1 -1
  161. package/skills/{nexus-cloud → tools/nexus-cloud}/SKILL.md +2 -1
  162. package/skills/{nexus-cloud → tools/nexus-cloud}/docs/setup.md +1 -1
  163. package/docs/templates/PROFILE.md +0 -14
  164. /package/skills/{brave-search → connectors/brave-search}/SKILL.md +0 -0
  165. /package/skills/{brave-search → connectors/brave-search}/docs/setup.md +0 -0
  166. /package/skills/{brave-search → connectors/brave-search}/docs/troubleshooting.md +0 -0
  167. /package/skills/{brave-search → connectors/brave-search}/docs/usage.md +0 -0
  168. /package/skills/{brave-search → connectors/brave-search}/scripts/content.mjs +0 -0
  169. /package/skills/{brave-search → connectors/brave-search}/scripts/search.mjs +0 -0
  170. /package/skills/{discord → connectors/discord}/SKILL.md +0 -0
  171. /package/skills/{gemini → connectors/gemini}/SKILL.md +0 -0
  172. /package/skills/{github → connectors/github}/SKILL.md +0 -0
  173. /package/skills/{github → connectors/github}/docs/setup.md +0 -0
  174. /package/skills/{github → connectors/github}/docs/troubleshooting.md +0 -0
  175. /package/skills/{google-oauth → connectors/google-oauth}/SKILL.md +0 -0
  176. /package/skills/{slack → connectors/slack}/SKILL.md +0 -0
  177. /package/skills/{telegram → connectors/telegram}/SKILL.md +0 -0
  178. /package/skills/{telegram → connectors/telegram}/docs/pairing.md +0 -0
  179. /package/skills/{telegram → connectors/telegram}/docs/setup.md +0 -0
  180. /package/skills/{telegram → connectors/telegram}/docs/webhook.md +0 -0
  181. /package/skills/{wacli → connectors/wacli}/SKILL.md +0 -0
  182. /package/skills/{wacli → connectors/wacli}/docs/auth.md +0 -0
  183. /package/skills/{wacli → connectors/wacli}/docs/backup.md +0 -0
  184. /package/skills/{wacli → connectors/wacli}/docs/troubleshooting.md +0 -0
  185. /package/skills/{browser-use-agent-sdk → guides/browser-use-agent-sdk}/SKILL.md +0 -0
  186. /package/skills/{json-render → guides/json-render}/SKILL.md +0 -0
  187. /package/skills/{json-render → guides/json-render}/assets/components/README.md +0 -0
  188. /package/skills/{json-render → guides/json-render}/assets/components/catalog.ts +0 -0
  189. /package/skills/{json-render → guides/json-render}/assets/components/registry.tsx +0 -0
  190. /package/skills/{json-render → guides/json-render}/assets/demo/App.css +0 -0
  191. /package/skills/{json-render → guides/json-render}/assets/demo/App.tsx +0 -0
  192. /package/skills/{json-render → guides/json-render}/assets/demo/README.md +0 -0
  193. /package/skills/{json-render → guides/json-render}/assets/demo/catalog.ts +0 -0
  194. /package/skills/{json-render → guides/json-render}/assets/demo/data/nexus-core.json +0 -0
  195. /package/skills/{json-render → guides/json-render}/assets/demo/index.css +0 -0
  196. /package/skills/{json-render → guides/json-render}/assets/demo/registry.tsx +0 -0
  197. /package/skills/{json-render → guides/json-render}/docs/nexus-state-demo.md +0 -0
  198. /package/skills/{json-render → guides/json-render}/docs/shadcn-preset.md +0 -0
  199. /package/skills/{json-render → guides/json-render}/scripts/create-vite-demo.sh +0 -0
  200. /package/skills/{json-render → guides/json-render}/scripts/llm-server/README.md +0 -0
  201. /package/skills/{json-render → guides/json-render}/scripts/llm-server/catalog.ts +0 -0
  202. /package/skills/{json-render → guides/json-render}/scripts/llm-server/package-lock.json +0 -0
  203. /package/skills/{json-render → guides/json-render}/scripts/llm-server/package.json +0 -0
  204. /package/skills/{json-render → guides/json-render}/scripts/llm-server/server.ts +0 -0
  205. /package/skills/{onboarding → guides/onboarding}/docs/CAPABILITIES.md +0 -0
  206. /package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_CREDENTIALS.md +0 -0
  207. /package/skills/{onboarding → guides/onboarding}/docs/DOCUMENTATION_OVERVIEW.md +0 -0
  208. /package/skills/{onboarding → guides/onboarding}/docs/ENTITY_MODEL.md +0 -0
  209. /package/skills/{onboarding → guides/onboarding}/docs/SKILL_INVENTORY.md +0 -0
  210. /package/skills/{onboarding → guides/onboarding}/docs/STATE_ARCHITECTURE.md +0 -0
  211. /package/skills/{onboarding → guides/onboarding}/docs/TROUBLESHOOTING.md +0 -0
  212. /package/skills/{onboarding → guides/onboarding}/docs/USER_JOURNEY.md +0 -0
  213. /package/skills/{onboarding → guides/onboarding}/docs/WOW_MOMENTS.md +0 -0
  214. /package/skills/{onboarding → guides/onboarding}/docs/agent-apple-id.md +0 -0
  215. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/1password.md +0 -0
  216. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/TEMPLATE.md +0 -0
  217. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/aix.md +0 -0
  218. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/bird.md +0 -0
  219. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/brave-search.md +0 -0
  220. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/comms.md +0 -0
  221. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/computer-use.md +0 -0
  222. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/cron-and-heartbeat.md +0 -0
  223. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/eve.md +0 -0
  224. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/github.md +0 -0
  225. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/gog.md +0 -0
  226. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/homebrew-prereqs.md +0 -0
  227. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/qmd.md +0 -0
  228. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/telegram.md +0 -0
  229. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/wacli.md +0 -0
  230. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/weather.md +0 -0
  231. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prd.json +0 -0
  232. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prompt.md +0 -0
  233. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.log +0 -0
  234. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.sh +0 -0
  235. /package/skills/{onboarding → guides/onboarding}/scripts/setup-cursor-skills.sh +0 -0
  236. /package/skills/{1password → tools/1password}/SKILL.md +0 -0
  237. /package/skills/{1password → tools/1password}/docs/setup.md +0 -0
  238. /package/skills/{1password → tools/1password}/docs/troubleshooting.md +0 -0
  239. /package/skills/{1password → tools/1password}/references/cli-examples.md +0 -0
  240. /package/skills/{1password → tools/1password}/references/get-started.md +0 -0
  241. /package/skills/{agent-browser → tools/agent-browser}/SKILL.md +0 -0
  242. /package/skills/{agent-browser → tools/agent-browser}/docs/browser-use-eval.md +0 -0
  243. /package/skills/{agent-browser → tools/agent-browser}/docs/first-tests.md +0 -0
  244. /package/skills/{agent-browser → tools/agent-browser}/docs/wordle-nyt-eval.js +0 -0
  245. /package/skills/{aix → tools/aix}/SKILL.md +0 -0
  246. /package/skills/{aix → tools/aix}/docs/embeddings.md +0 -0
  247. /package/skills/{aix → tools/aix}/docs/setup.md +0 -0
  248. /package/skills/{aix → tools/aix}/docs/troubleshooting.md +0 -0
  249. /package/skills/{aix → tools/aix}/references/sql.md +0 -0
  250. /package/skills/{apple-notes → tools/apple-notes}/SKILL.md +0 -0
  251. /package/skills/{apple-reminders → tools/apple-reminders}/SKILL.md +0 -0
  252. /package/skills/{bear-notes → tools/bear-notes}/SKILL.md +0 -0
  253. /package/skills/{bird → tools/bird}/SKILL.md +0 -0
  254. /package/skills/{bird → tools/bird}/docs/auth.md +0 -0
  255. /package/skills/{bird → tools/bird}/docs/troubleshooting.md +0 -0
  256. /package/skills/{blogwatcher → tools/blogwatcher}/SKILL.md +0 -0
  257. /package/skills/{blucli → tools/blucli}/SKILL.md +0 -0
  258. /package/skills/{camsnap → tools/camsnap}/SKILL.md +0 -0
  259. /package/skills/{clawdhub → tools/clawdhub}/SKILL.md +0 -0
  260. /package/skills/{coding-agent → tools/coding-agent}/SKILL.md +0 -0
  261. /package/skills/{comms → tools/comms}/SKILL.md +0 -0
  262. /package/skills/{comms → tools/comms}/docs/adapters.md +0 -0
  263. /package/skills/{comms → tools/comms}/docs/setup.md +0 -0
  264. /package/skills/{comms → tools/comms}/docs/troubleshooting.md +0 -0
  265. /package/skills/{comms → tools/comms}/references/schema.md +0 -0
  266. /package/skills/{computer-use → tools/computer-use}/SKILL.md +0 -0
  267. /package/skills/{computer-use → tools/computer-use}/docs/open-interpreter.md +0 -0
  268. /package/skills/{computer-use → tools/computer-use}/docs/peekaboo.md +0 -0
  269. /package/skills/{computer-use → tools/computer-use}/docs/setup.md +0 -0
  270. /package/skills/{computer-use → tools/computer-use}/docs/troubleshooting.md +0 -0
  271. /package/skills/{eightctl → tools/eightctl}/SKILL.md +0 -0
  272. /package/skills/{eve → tools/eve}/SKILL.md +0 -0
  273. /package/skills/{eve → tools/eve}/docs/dual-account.md +0 -0
  274. /package/skills/{eve → tools/eve}/docs/intelligence.md +0 -0
  275. /package/skills/{eve → tools/eve}/docs/setup.md +0 -0
  276. /package/skills/{eve → tools/eve}/docs/troubleshooting.md +0 -0
  277. /package/skills/{eve → tools/eve}/scripts/setup-dual-account.sh +0 -0
  278. /package/skills/{food-order → tools/food-order}/SKILL.md +0 -0
  279. /package/skills/{gh → tools/gh}/SKILL.md +0 -0
  280. /package/skills/{gh → tools/gh}/docs/usage.md +0 -0
  281. /package/skills/{gifgrep → tools/gifgrep}/SKILL.md +0 -0
  282. /package/skills/{gog → tools/gog}/SKILL.md +0 -0
  283. /package/skills/{gog → tools/gog}/docs/portability.md +0 -0
  284. /package/skills/{gog → tools/gog}/docs/setup.md +0 -0
  285. /package/skills/{gog → tools/gog}/docs/troubleshooting.md +0 -0
  286. /package/skills/{gog → tools/gog}/scripts/cdp/README.md +0 -0
  287. /package/skills/{gog → tools/gog}/scripts/cdp/add_test_users.py +0 -0
  288. /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts.py +0 -0
  289. /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts_manual.py +0 -0
  290. /package/skills/{gog → tools/gog}/scripts/cdp/create_oauth_client.py +0 -0
  291. /package/skills/{gog → tools/gog}/scripts/cdp/launch_cdp_chrome.sh +0 -0
  292. /package/skills/{goplaces → tools/goplaces}/SKILL.md +0 -0
  293. /package/skills/{imsg → tools/imsg}/SKILL.md +0 -0
  294. /package/skills/{local-places → tools/local-places}/SERVER_README.md +0 -0
  295. /package/skills/{local-places → tools/local-places}/SKILL.md +0 -0
  296. /package/skills/{local-places → tools/local-places}/pyproject.toml +0 -0
  297. /package/skills/{local-places → tools/local-places}/src/local_places/__init__.py +0 -0
  298. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  299. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  300. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  301. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  302. /package/skills/{local-places → tools/local-places}/src/local_places/google_places.py +0 -0
  303. /package/skills/{local-places → tools/local-places}/src/local_places/main.py +0 -0
  304. /package/skills/{local-places → tools/local-places}/src/local_places/schemas.py +0 -0
  305. /package/skills/{mcporter → tools/mcporter}/SKILL.md +0 -0
  306. /package/skills/{model-usage → tools/model-usage}/SKILL.md +0 -0
  307. /package/skills/{model-usage → tools/model-usage}/references/codexbar-cli.md +0 -0
  308. /package/skills/{model-usage → tools/model-usage}/scripts/model_usage.py +0 -0
  309. /package/skills/{nano-banana-pro → tools/nano-banana-pro}/SKILL.md +0 -0
  310. /package/skills/{nano-banana-pro → tools/nano-banana-pro}/scripts/generate_image.py +0 -0
  311. /package/skills/{nano-pdf → tools/nano-pdf}/SKILL.md +0 -0
  312. /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/security.md +0 -0
  313. /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/troubleshooting.md +0 -0
  314. /package/skills/{obsidian → tools/obsidian}/SKILL.md +0 -0
  315. /package/skills/{openai-image-gen → tools/openai-image-gen}/SKILL.md +0 -0
  316. /package/skills/{openai-image-gen → tools/openai-image-gen}/scripts/gen.py +0 -0
  317. /package/skills/{openai-whisper → tools/openai-whisper}/SKILL.md +0 -0
  318. /package/skills/{openai-whisper-api → tools/openai-whisper-api}/SKILL.md +0 -0
  319. /package/skills/{openai-whisper-api → tools/openai-whisper-api}/scripts/transcribe.sh +0 -0
  320. /package/skills/{openhue → tools/openhue}/SKILL.md +0 -0
  321. /package/skills/{oracle → tools/oracle}/SKILL.md +0 -0
  322. /package/skills/{ordercli → tools/ordercli}/SKILL.md +0 -0
  323. /package/skills/{peekaboo → tools/peekaboo}/SKILL.md +0 -0
  324. /package/skills/{qmd → tools/qmd}/SKILL.md +0 -0
  325. /package/skills/{qmd → tools/qmd}/docs/mcp.md +0 -0
  326. /package/skills/{qmd → tools/qmd}/docs/ollama.md +0 -0
  327. /package/skills/{qmd → tools/qmd}/docs/setup.md +0 -0
  328. /package/skills/{sag → tools/sag}/SKILL.md +0 -0
  329. /package/skills/{skill-cli-template → tools/skill-cli-template}/SKILL.md +0 -0
  330. /package/skills/{songsee → tools/songsee}/SKILL.md +0 -0
  331. /package/skills/{sonoscli → tools/sonoscli}/SKILL.md +0 -0
  332. /package/skills/{spotify-player → tools/spotify-player}/SKILL.md +0 -0
  333. /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
  334. /package/skills/{things-mac → tools/things-mac}/SKILL.md +0 -0
  335. /package/skills/{tmux → tools/tmux}/SKILL.md +0 -0
  336. /package/skills/{tmux → tools/tmux}/scripts/find-sessions.sh +0 -0
  337. /package/skills/{tmux → tools/tmux}/scripts/wait-for-text.sh +0 -0
  338. /package/skills/{trello → tools/trello}/SKILL.md +0 -0
  339. /package/skills/{upstream-sync → tools/upstream-sync}/SKILL.md +0 -0
  340. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/auto-port.sh +0 -0
  341. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-all.sh +0 -0
  342. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-nexus.sh +0 -0
  343. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-pi-ai.sh +0 -0
  344. /package/skills/{video-frames → tools/video-frames}/SKILL.md +0 -0
  345. /package/skills/{video-frames → tools/video-frames}/scripts/frame.sh +0 -0
  346. /package/skills/{weather → tools/weather}/SKILL.md +0 -0
  347. /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 { provider: parts[0] ?? profileId, account: parts.slice(1).join(":") || "default" };
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 && trimmed.includes("@") && trimmed.includes("."));
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") ?? byType("token") ?? byType("oauth") ?? entries[0] ?? null;
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) !== JSON.stringify(existing.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: "plaintext" },
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: "plaintext" },
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 secretValue = record.key ?? record.token ?? record.accessToken;
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 (secretValue && allowKeychain && process.platform === "darwin") {
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
- secretValue,
260
+ payload.value,
218
261
  ]);
219
- record.storage = { provider: "keychain", service: keychainService, account: keychainAccount };
220
- record.key = undefined;
221
- record.token = undefined;
222
- record.accessToken = undefined;
223
- record.refreshToken = undefined;
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
- log.warn("keychain write failed; storing plaintext credential", { err: String(err) });
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 = { ...(index.lastGood ?? {}), [providerKey]: params.profileId };
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: record.accessToken,
343
- refresh: record.refreshToken,
344
- expires: expiresAt,
406
+ access: accessToken,
407
+ refresh: refreshToken,
408
+ expires: oauthExpiresAt,
345
409
  email: cred.email,
346
- clientId: typeof record.metadata?.clientId === "string" ? record.metadata.clientId : undefined,
410
+ clientId: typeof record.metadata?.clientId === "string"
411
+ ? record.metadata.clientId
412
+ : undefined,
347
413
  },
348
414
  });
349
- record.accessToken = refreshed.access;
350
- record.refreshToken = refreshed.refresh;
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
+ }
@@ -97,6 +97,7 @@ export function resolveEnvApiKey(provider) {
97
97
  openrouter: "OPENROUTER_API_KEY",
98
98
  zai: "ZAI_API_KEY",
99
99
  mistral: "MISTRAL_API_KEY",
100
+ minimax: "MINIMAX_API_KEY",
100
101
  };
101
102
  const envVar = envMap[provider];
102
103
  if (!envVar)
@@ -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 provider = params.provider.trim() || DEFAULT_PROVIDER;
82
- const model = params.model.trim() || DEFAULT_MODEL;
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
- const model = params.cfg?.agent?.model;
104
- if (model && typeof model === "object")
105
- return model.fallbacks ?? [];
106
- return [];
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 resolveImplicitProviders(params) {
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 maybeBuildCopilotProvider(params) {
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({ store: authStore, profileId });
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 = "";