@intent-systems/nexus 2026.1.5-4 → 2026.1.5-5

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 (123) 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 +79 -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 +29 -4
  11. package/dist/agents/skill-usage.js +114 -11
  12. package/dist/agents/skills-status.js +4 -4
  13. package/dist/agents/skills.js +18 -7
  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 +55 -46
  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 +12 -7
  37. package/dist/cli/credential-cli.js +139 -17
  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 +58 -6
  42. package/dist/cli/run-main.js +1 -1
  43. package/dist/cli/skills-cli.js +144 -21
  44. package/dist/cli/skills-hub-cli.js +59 -29
  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 +10 -6
  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/configure.js +4 -4
  55. package/dist/commands/credential.js +497 -36
  56. package/dist/commands/cursor-rules.js +39 -19
  57. package/dist/commands/doctor.js +5 -4
  58. package/dist/commands/identity.js +28 -31
  59. package/dist/commands/init.js +15 -18
  60. package/dist/commands/log.js +134 -0
  61. package/dist/commands/models/fallbacks.js +1 -1
  62. package/dist/commands/models/image-fallbacks.js +1 -1
  63. package/dist/commands/models/list.js +1 -1
  64. package/dist/commands/models/scan.js +1 -1
  65. package/dist/commands/onboard-auth.js +27 -2
  66. package/dist/commands/onboard-eve-identity.js +7 -8
  67. package/dist/commands/onboard-non-interactive.js +4 -2
  68. package/dist/commands/onboard-quickstart.js +18 -11
  69. package/dist/commands/quest-state.js +271 -0
  70. package/dist/commands/quest.js +53 -13
  71. package/dist/commands/reset.js +1 -1
  72. package/dist/commands/sessions-ingest.js +5 -4
  73. package/dist/commands/setup.js +4 -2
  74. package/dist/commands/skills-manifest.js +2 -2
  75. package/dist/commands/status.js +179 -61
  76. package/dist/commands/suggestions.js +1 -1
  77. package/dist/commands/usage-tracking.js +32 -0
  78. package/dist/commands/usage-upload.js +6 -1
  79. package/dist/config/defaults.js +1 -3
  80. package/dist/config/includes.js +5 -7
  81. package/dist/config/io.js +88 -16
  82. package/dist/config/legacy.js +4 -2
  83. package/dist/config/paths.js +16 -0
  84. package/dist/config/sessions.js +9 -5
  85. package/dist/config/zod-schema.js +4 -3
  86. package/dist/control-plane/broker/broker.js +131 -78
  87. package/dist/control-plane/compaction.js +3 -5
  88. package/dist/control-plane/factory.js +2 -2
  89. package/dist/control-plane/index.js +2 -2
  90. package/dist/control-plane/odu/agents.js +28 -23
  91. package/dist/control-plane/odu/interaction-tools.js +62 -50
  92. package/dist/control-plane/odu/prompt-loader.js +8 -8
  93. package/dist/control-plane/odu/runtime.js +87 -75
  94. package/dist/control-plane/odu-control-plane.js +14 -12
  95. package/dist/control-plane/single-agent.js +13 -13
  96. package/dist/credentials/store.js +133 -7
  97. package/dist/gateway/server-browser.js +5 -4
  98. package/dist/gateway/server-methods/cron.js +11 -1
  99. package/dist/gateway/server.js +14 -7
  100. package/dist/infra/bonjour.js +1 -1
  101. package/dist/infra/event-log.js +8 -2
  102. package/dist/infra/path-env.js +1 -2
  103. package/dist/infra/provider-usage.auth.js +5 -3
  104. package/dist/infra/provider-usage.fetch.claude.js +16 -6
  105. package/dist/infra/provider-usage.fetch.minimax.js +8 -3
  106. package/dist/infra/provider-usage.js +9 -5
  107. package/dist/infra/restart.js +2 -2
  108. package/dist/infra/usage-settings.js +78 -0
  109. package/dist/infra/usage-suggestions.js +17 -5
  110. package/dist/infra/usage-upload.js +38 -1
  111. package/dist/infra/voicewake.js +2 -2
  112. package/dist/media/image-ops.js +3 -1
  113. package/dist/memory/index.js +2 -381
  114. package/dist/pairing/pairing-store.js +24 -0
  115. package/dist/providers/github-copilot-auth.js +1 -1
  116. package/dist/routing/resolve-route.js +6 -6
  117. package/dist/routing/session-key.js +3 -1
  118. package/dist/sessions/send-policy.js +5 -5
  119. package/dist/slack/monitor.js +22 -1
  120. package/dist/telegram/reaction-level.js +2 -1
  121. package/dist/utils.js +4 -3
  122. package/dist/wizard/onboarding.js +29 -7
  123. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { usageTrackingCommand } from "../commands/usage-tracking.js";
1
2
  import { usageUploadCommand } from "../commands/usage-upload.js";
2
3
  import { defaultRuntime } from "../runtime.js";
3
4
  export function registerUsageCli(program) {
@@ -21,4 +22,17 @@ export function registerUsageCli(program) {
21
22
  onlyFlush: Boolean(opts.onlyFlush),
22
23
  }, defaultRuntime);
23
24
  });
25
+ usageCmd
26
+ .command("tracking")
27
+ .description("View or update usage tracking preference")
28
+ .option("--enable", "Enable usage tracking")
29
+ .option("--disable", "Disable usage tracking (paid only)")
30
+ .option("--json", "Output as JSON")
31
+ .action(async (opts) => {
32
+ await usageTrackingCommand({
33
+ json: Boolean(opts.json),
34
+ enable: Boolean(opts.enable),
35
+ disable: Boolean(opts.disable),
36
+ }, defaultRuntime);
37
+ });
24
38
  }
@@ -1,5 +1,5 @@
1
- import { CLAUDE_CLI_PROFILE_ID, CODEX_CLI_PROFILE_ID, } from "../agents/auth-profiles.js";
2
1
  import chalk from "chalk";
2
+ import { CLAUDE_CLI_PROFILE_ID, CODEX_CLI_PROFILE_ID, } from "../agents/auth-profiles.js";
3
3
  function formatOAuthHint(expires, opts) {
4
4
  if (!expires) {
5
5
  return chalk.dim("token unavailable");
@@ -65,11 +65,16 @@ export function buildAuthChoiceOptions(params) {
65
65
  label: "OpenAI Codex (ChatGPT OAuth)",
66
66
  });
67
67
  options.push({ value: "openai-api-key", label: "OpenAI API key" });
68
+ options.push({
69
+ value: "github-copilot",
70
+ label: "GitHub Copilot (device login)",
71
+ });
68
72
  options.push({
69
73
  value: "antigravity",
70
74
  label: "Google Antigravity (Claude Opus 4.5, Gemini 3, etc.)",
71
75
  });
72
76
  options.push({ value: "gemini-api-key", label: "Google Gemini API key" });
77
+ options.push({ value: "chutes", label: "Chutes OAuth (remote)" });
73
78
  options.push({ value: "apiKey", label: "Anthropic API key" });
74
79
  options.push({ value: "minimax-cloud", label: "MiniMax M2.1 (minimax.io)" });
75
80
  options.push({ value: "minimax", label: "Minimax M2.1 (LM Studio)" });
@@ -1,9 +1,11 @@
1
1
  import { CLAUDE_CLI_PROFILE_ID, ensureAuthProfileStore, upsertAuthProfile, } from "../agents/auth-profiles.js";
2
- import { applyAuthProfileConfig } from "./onboard-auth.js";
3
2
  import { buildTokenProfileId, validateAnthropicSetupToken, } from "./auth-token.js";
3
+ import { CHUTES_TOKEN_ENDPOINT } from "../agents/chutes-oauth.js";
4
+ import { importCliCredential } from "./credential.js";
5
+ import { applyAuthProfileConfig, writeOAuthCredentials } from "./onboard-auth.js";
4
6
  export async function applyAuthChoice(params) {
5
7
  let nextConfig = params.config;
6
- let agentModelOverride;
8
+ const agentModelOverride = undefined;
7
9
  if (params.authChoice === "claude-cli") {
8
10
  const store = ensureAuthProfileStore();
9
11
  const hasClaudeCli = Boolean(store.profiles[CLAUDE_CLI_PROFILE_ID]);
@@ -21,8 +23,21 @@ export async function applyAuthChoice(params) {
21
23
  return { config: nextConfig, agentModelOverride };
22
24
  }
23
25
  }
24
- const storeWithKeychain = ensureAuthProfileStore();
25
- if (!storeWithKeychain.profiles[CLAUDE_CLI_PROFILE_ID]) {
26
+ let hasProfile = hasClaudeCli;
27
+ if (!hasProfile) {
28
+ try {
29
+ await importCliCredential({
30
+ source: "claude-cli",
31
+ allowKeychainPrompt: true,
32
+ });
33
+ }
34
+ catch {
35
+ // ignore; we will prompt for setup-token below
36
+ }
37
+ const refreshed = ensureAuthProfileStore();
38
+ hasProfile = Boolean(refreshed.profiles[CLAUDE_CLI_PROFILE_ID]);
39
+ }
40
+ if (!hasProfile) {
26
41
  if (process.stdin.isTTY) {
27
42
  const runNow = await params.prompter.confirm({
28
43
  message: "Run `claude setup-token` now?",
@@ -41,6 +56,16 @@ export async function applyAuthChoice(params) {
41
56
  else {
42
57
  await params.prompter.note("`claude setup-token` requires an interactive TTY.", "Claude setup-token");
43
58
  }
59
+ try {
60
+ await importCliCredential({
61
+ source: "claude-cli",
62
+ allowKeychainPrompt: true,
63
+ force: true,
64
+ });
65
+ }
66
+ catch {
67
+ // ignore; handled below
68
+ }
44
69
  const refreshed = ensureAuthProfileStore();
45
70
  if (!refreshed.profiles[CLAUDE_CLI_PROFILE_ID]) {
46
71
  await params.prompter.note(process.platform === "darwin"
@@ -83,6 +108,16 @@ export async function applyAuthChoice(params) {
83
108
  await params.prompter.note(`claude setup-token failed (exit ${res.status})`, "Anthropic setup-token");
84
109
  return { config: nextConfig, agentModelOverride };
85
110
  }
111
+ try {
112
+ await importCliCredential({
113
+ source: "claude-cli",
114
+ allowKeychainPrompt: true,
115
+ force: true,
116
+ });
117
+ }
118
+ catch {
119
+ // ignore; handled below
120
+ }
86
121
  const store = ensureAuthProfileStore();
87
122
  if (!store.profiles[CLAUDE_CLI_PROFILE_ID]) {
88
123
  await params.prompter.note(`No Claude CLI credentials found after setup-token. Expected ${CLAUDE_CLI_PROFILE_ID}.`, "Anthropic setup-token");
@@ -107,7 +142,9 @@ export async function applyAuthChoice(params) {
107
142
  message: "Paste Anthropic setup-token",
108
143
  validate: (value) => validateAnthropicSetupToken(String(value ?? "")),
109
144
  });
110
- const token = String(tokenRaw).trim();
145
+ const tokenInput = String(tokenRaw).trim();
146
+ const tokenMatch = tokenInput.match(/sk-ant-oat01-[A-Za-z0-9_-]+/);
147
+ const token = tokenMatch?.[0] ?? tokenInput;
111
148
  const profileNameRaw = await params.prompter.text({
112
149
  message: "Token name (blank = default)",
113
150
  placeholder: "default",
@@ -130,5 +167,120 @@ export async function applyAuthChoice(params) {
130
167
  mode: "token",
131
168
  });
132
169
  }
170
+ else if (params.authChoice === "chutes") {
171
+ const clientId = process.env.CHUTES_CLIENT_ID?.trim();
172
+ if (!clientId) {
173
+ params.runtime.error("CHUTES_CLIENT_ID is required for Chutes OAuth.");
174
+ params.runtime.exit(1);
175
+ return { config: nextConfig, agentModelOverride };
176
+ }
177
+ const rawInput = await params.prompter.text({
178
+ message: "Paste the redirect URL (or authorization code)",
179
+ });
180
+ const raw = String(rawInput ?? "").trim();
181
+ if (!raw) {
182
+ params.runtime.error("Missing Chutes authorization code.");
183
+ params.runtime.exit(1);
184
+ return { config: nextConfig, agentModelOverride };
185
+ }
186
+ let code = raw;
187
+ try {
188
+ const url = new URL(raw);
189
+ code = url.searchParams.get("code") ?? url.searchParams.get("authorization_code") ?? raw;
190
+ }
191
+ catch {
192
+ // leave raw as code
193
+ }
194
+ const tokenRes = await fetch(CHUTES_TOKEN_ENDPOINT, {
195
+ method: "POST",
196
+ headers: { "content-type": "application/x-www-form-urlencoded" },
197
+ body: new URLSearchParams({
198
+ grant_type: "authorization_code",
199
+ code,
200
+ client_id: clientId,
201
+ }),
202
+ });
203
+ if (!tokenRes.ok) {
204
+ const text = await tokenRes.text().catch(() => "");
205
+ params.runtime.error(`Chutes token exchange failed (${tokenRes.status}): ${text || "no response"}`);
206
+ params.runtime.exit(1);
207
+ return { config: nextConfig, agentModelOverride };
208
+ }
209
+ const tokenJson = (await tokenRes.json());
210
+ const accessToken = tokenJson.access_token?.trim();
211
+ const refreshToken = tokenJson.refresh_token?.trim();
212
+ if (!accessToken || !refreshToken) {
213
+ params.runtime.error("Chutes token response missing access or refresh token.");
214
+ params.runtime.exit(1);
215
+ return { config: nextConfig, agentModelOverride };
216
+ }
217
+ const expiresIn = typeof tokenJson.expires_in === "number"
218
+ ? tokenJson.expires_in
219
+ : Number.parseInt(String(tokenJson.expires_in ?? ""), 10);
220
+ const expiresAt = Number.isFinite(expiresIn) && expiresIn > 0
221
+ ? Date.now() + expiresIn * 1000
222
+ : undefined;
223
+ const userRes = await fetch("https://api.chutes.ai/idp/userinfo", {
224
+ headers: { authorization: `Bearer ${accessToken}` },
225
+ });
226
+ if (!userRes.ok) {
227
+ const text = await userRes.text().catch(() => "");
228
+ params.runtime.error(`Chutes userinfo failed (${userRes.status}): ${text || "no response"}`);
229
+ params.runtime.exit(1);
230
+ return { config: nextConfig, agentModelOverride };
231
+ }
232
+ const userJson = (await userRes.json());
233
+ const account = userJson.username?.trim() || userJson.email?.trim() || "default";
234
+ const expires = typeof expiresAt === "number" && Number.isFinite(expiresAt)
235
+ ? expiresAt
236
+ : Date.now() + 3600_000;
237
+ const oauthCreds = {
238
+ access: accessToken,
239
+ refresh: refreshToken,
240
+ expires,
241
+ email: account,
242
+ };
243
+ await writeOAuthCredentials("chutes", oauthCreds);
244
+ const profileId = `chutes:${account}`;
245
+ nextConfig = applyAuthProfileConfig(nextConfig, {
246
+ profileId,
247
+ provider: "chutes",
248
+ mode: "oauth",
249
+ email: account,
250
+ });
251
+ }
252
+ else if (params.authChoice === "github-copilot") {
253
+ try {
254
+ const { githubCopilotLoginCommand } = await import("../providers/github-copilot-auth.js");
255
+ await githubCopilotLoginCommand({ yes: true }, params.runtime);
256
+ }
257
+ catch (err) {
258
+ params.runtime.error(`GitHub Copilot login failed: ${String(err)}`);
259
+ params.runtime.exit(1);
260
+ return { config: nextConfig, agentModelOverride };
261
+ }
262
+ const profileId = "github-copilot:github";
263
+ nextConfig = applyAuthProfileConfig(nextConfig, {
264
+ profileId,
265
+ provider: "github-copilot",
266
+ mode: "token",
267
+ });
268
+ if (params.setDefaultModel) {
269
+ const existing = nextConfig.agent?.model;
270
+ const fallbacks = existing && typeof existing === "object" && "fallbacks" in existing
271
+ ? { fallbacks: existing.fallbacks }
272
+ : undefined;
273
+ nextConfig = {
274
+ ...nextConfig,
275
+ agent: {
276
+ ...nextConfig.agent,
277
+ model: {
278
+ ...fallbacks,
279
+ primary: "github-copilot/gpt-4o",
280
+ },
281
+ },
282
+ };
283
+ }
284
+ }
133
285
  return { config: nextConfig, agentModelOverride };
134
286
  }
@@ -1,9 +1,9 @@
1
+ import { execFile } from "node:child_process";
1
2
  import fs from "node:fs/promises";
2
3
  import path from "node:path";
3
- import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import { installSkill } from "../agents/skills-install.js";
6
- import { resolveStateDir } from "../config/paths.js";
6
+ import { resolveBootstrapPath, resolveStateDir } from "../config/paths.js";
7
7
  import { NEXUS_ROOT } from "../utils.js";
8
8
  const execFileAsync = promisify(execFile);
9
9
  function firstName(full) {
@@ -15,7 +15,10 @@ function firstName(full) {
15
15
  function coerceStringArray(input) {
16
16
  if (!Array.isArray(input))
17
17
  return [];
18
- return input.map((v) => String(v)).map((s) => s.trim()).filter(Boolean);
18
+ return input
19
+ .map((v) => String(v))
20
+ .map((s) => s.trim())
21
+ .filter(Boolean);
19
22
  }
20
23
  function parseEveWhoamiJson(stdout) {
21
24
  const raw = stdout.trim();
@@ -106,8 +109,7 @@ export async function applyBootstrapPreset(params) {
106
109
  const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
107
110
  const agentIdentityDir = path.join(stateDir, "agents", agentId, "identity");
108
111
  const userIdentityDir = path.join(stateDir, "user", "identity");
109
- const onboardingDir = path.join(stateDir, "nexus", "onboarding");
110
- const bootstrapPath = path.join(onboardingDir, "BOOTSTRAP.md");
112
+ const bootstrapPath = resolveBootstrapPath(undefined, stateDir);
111
113
  if (!(await fileExists(bootstrapPath)))
112
114
  return;
113
115
  await fs.mkdir(agentIdentityDir, { recursive: true });
@@ -151,7 +153,9 @@ export async function applyBootstrapPreset(params) {
151
153
  runtime.log(`Eve init failed; continuing without Eve identity: ${err instanceof Error ? err.message : String(err)}`);
152
154
  }
153
155
  try {
154
- const res = await execFileAsync(eveCmd, ["whoami"], { timeout: 30_000 });
156
+ const res = await execFileAsync(eveCmd, ["whoami"], {
157
+ timeout: 30_000,
158
+ });
155
159
  const whoami = parseEveWhoamiJson(res.stdout);
156
160
  if (whoami?.name)
157
161
  userName = whoami.name;
@@ -1,5 +1,5 @@
1
- import { defaultRuntime } from "../runtime.js";
2
1
  import { detectCapabilities } from "../capabilities/detector.js";
2
+ import { defaultRuntime } from "../runtime.js";
3
3
  const STATUS_ICON = {
4
4
  active: "✅",
5
5
  ready: "⭐",
@@ -8,28 +8,55 @@ const STATUS_ICON = {
8
8
  unavailable: "⛔",
9
9
  broken: "❌",
10
10
  };
11
+ function normalizeCategory(input) {
12
+ return input.toLowerCase().replace(/[^a-z0-9]+/g, "");
13
+ }
14
+ function normalizeStatus(input) {
15
+ if (!input)
16
+ return undefined;
17
+ return input.toLowerCase().replace(/-/g, "_");
18
+ }
11
19
  export async function capabilitiesCommand(opts, runtime = defaultRuntime) {
12
20
  const { registry, capabilities, summary } = detectCapabilities();
21
+ const statusFilter = normalizeStatus(opts?.status);
22
+ const categoryFilter = opts?.category
23
+ ? normalizeCategory(opts.category)
24
+ : undefined;
25
+ const filtered = capabilities.filter((cap) => {
26
+ if (statusFilter && cap.status !== statusFilter)
27
+ return false;
28
+ if (categoryFilter) {
29
+ const normalized = normalizeCategory(cap.category);
30
+ if (normalized !== categoryFilter)
31
+ return false;
32
+ }
33
+ return true;
34
+ });
13
35
  if (opts?.json) {
14
36
  runtime.log(JSON.stringify({
15
37
  platform: `${process.platform}/${process.arch}`,
16
38
  summary,
17
- capabilities,
39
+ capabilities: filtered,
18
40
  }, null, 2));
19
41
  return;
20
42
  }
21
43
  runtime.log(`\nNexus Capabilities (${process.platform}/${process.arch})`);
22
44
  runtime.log("Legend: ✅ active ⭐ ready 🔧 needs-setup 📥 needs-install ⛔ unavailable ❌ broken\n");
23
- for (const [category, entries] of Object.entries(registry.categories)) {
24
- const categoryCaps = capabilities.filter((cap) => cap.category === category);
45
+ for (const [category, _entries] of Object.entries(registry.categories)) {
46
+ const categoryCaps = filtered.filter((cap) => cap.category === category);
25
47
  if (categoryCaps.length === 0)
26
48
  continue;
27
49
  const activeCount = categoryCaps.filter((cap) => cap.status === "active").length;
28
50
  runtime.log(`${category} (${activeCount}/${categoryCaps.length})`);
29
51
  for (const cap of categoryCaps) {
30
52
  const icon = STATUS_ICON[cap.status] ?? "•";
31
- const providers = cap.providers.map((p) => p.id).join(", ");
32
- runtime.log(` ${icon} ${cap.id} — ${providers || cap.providersRaw}`);
53
+ if (opts?.compact) {
54
+ runtime.log(` ${icon} ${cap.id}`);
55
+ }
56
+ else {
57
+ const providers = cap.providers.map((p) => p.id).join(", ");
58
+ runtime.log(` ${icon} ${cap.id} — ${providers || cap.providersRaw}`);
59
+ }
33
60
  }
34
61
  runtime.log("");
35
62
  }
@@ -1,6 +1,6 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { buildWorkspaceSkillSnapshot, loadWorkspaceSkillEntries, getSkillMetadata } from "../agents/skills.js";
3
+ import { buildWorkspaceSkillSnapshot, getSkillMetadata, loadWorkspaceSkillEntries, } from "../agents/skills.js";
4
4
  import { loadConfig } from "../config/config.js";
5
5
  import { defaultRuntime } from "../runtime.js";
6
6
  /**
@@ -17,7 +17,8 @@ import { defaultRuntime } from "../runtime.js";
17
17
  * nexus claude-md [--workspace <path>]
18
18
  */
19
19
  export async function claudeMdCommand(opts, runtime = defaultRuntime) {
20
- const workspaceDir = opts?.workspace?.trim() || path.join(process.env.HOME || "~", "nexus", "home");
20
+ const workspaceDir = opts?.workspace?.trim() ||
21
+ path.join(process.env.HOME || "~", "nexus", "home");
21
22
  runtime.log(`Generating CLAUDE.md for workspace: ${workspaceDir}`);
22
23
  // Load config
23
24
  const config = loadConfig();
@@ -1,5 +1,5 @@
1
- import { defaultRuntime } from "../runtime.js";
2
1
  import { readConfigFileSnapshot } from "../config/config.js";
2
+ import { defaultRuntime } from "../runtime.js";
3
3
  export async function configViewCommand(opts, runtime = defaultRuntime) {
4
4
  const snapshot = await readConfigFileSnapshot();
5
5
  if (opts?.json) {
@@ -430,11 +430,11 @@ export async function runConfigureWizard(opts, runtime = defaultRuntime) {
430
430
  }
431
431
  }
432
432
  const localUrl = "ws://127.0.0.1:18789";
433
- const localToken = baseConfig.gateway?.auth?.token ?? process.env.NEXUS_GATEWAY_TOKEN;
433
+ const _localToken = baseConfig.gateway?.auth?.token ?? process.env.NEXUS_GATEWAY_TOKEN;
434
434
  const configPassword = baseConfig.gateway?.auth?.password;
435
435
  const envPassword = process.env.NEXUS_GATEWAY_PASSWORD;
436
- const primaryPassword = configPassword ?? envPassword;
437
- let localProbe = await probeGatewayReachable({
436
+ const _primaryPassword = configPassword ?? envPassword;
437
+ const localProbe = await probeGatewayReachable({
438
438
  url: localUrl,
439
439
  token: baseConfig.gateway?.auth?.token ?? process.env.CLAWDBOT_GATEWAY_TOKEN,
440
440
  password: baseConfig.gateway?.auth?.password ??
@@ -599,7 +599,7 @@ export async function runConfigureWizard(opts, runtime = defaultRuntime) {
599
599
  password: oldPassword,
600
600
  });
601
601
  }
602
- const gatewayStatusLine = gatewayProbe.ok
602
+ const _gatewayStatusLine = gatewayProbe.ok
603
603
  ? "Gateway: reachable"
604
604
  : `Gateway: not detected${gatewayProbe.detail ? ` (${gatewayProbe.detail})` : ""}`;
605
605
  note((() => {