negotium 0.10.0 → 0.11.0

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 (60) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-helpers.js +92 -17
  3. package/dist/agent-helpers.js.map +12 -12
  4. package/dist/background-bash.js +3 -3
  5. package/dist/background-bash.js.map +2 -2
  6. package/dist/browser-runtime.js +3 -3
  7. package/dist/browser-runtime.js.map +2 -2
  8. package/dist/{chunk-06zc96py.js → chunk-ej0q23pd.js} +1 -1
  9. package/dist/{chunk-mqq04nr5.js → chunk-nz753vtn.js} +3 -3
  10. package/dist/{chunk-mqq04nr5.js.map → chunk-nz753vtn.js.map} +2 -2
  11. package/dist/{chunk-pp6dvrzq.js → chunk-x4rda52h.js} +3 -3
  12. package/dist/{chunk-pp6dvrzq.js.map → chunk-x4rda52h.js.map} +2 -2
  13. package/dist/hosted-agent.js +8 -6
  14. package/dist/hosted-agent.js.map +5 -5
  15. package/dist/main.js +94 -17
  16. package/dist/main.js.map +13 -13
  17. package/dist/mcp-factories.js +92 -17
  18. package/dist/mcp-factories.js.map +12 -12
  19. package/dist/media.js +3 -3
  20. package/dist/media.js.map +2 -2
  21. package/dist/prompts.js +55 -7
  22. package/dist/prompts.js.map +5 -5
  23. package/dist/query-runtime.js +3 -3
  24. package/dist/query-runtime.js.map +2 -2
  25. package/dist/registry.js +9 -5
  26. package/dist/registry.js.map +3 -3
  27. package/dist/rollout.js +2 -2
  28. package/dist/runtime/src/agents/auth-check.ts +14 -5
  29. package/dist/runtime/src/agents/maestro-provider.ts +7 -7
  30. package/dist/runtime/src/agents/maestro-registry.ts +4 -0
  31. package/dist/runtime/src/agents/model-catalog.ts +48 -0
  32. package/dist/runtime/src/platform/config.ts +2 -2
  33. package/dist/runtime/src/prompts/agents/wiki-archiver.md +112 -248
  34. package/dist/runtime/src/prompts/builders.ts +31 -7
  35. package/dist/runtime/src/prompts/sessions/_shared-tools.md +4 -1
  36. package/dist/runtime/src/prompts/sessions/channel-system.md +1 -1
  37. package/dist/runtime/src/prompts/sessions/manager-system.md +2 -2
  38. package/dist/runtime/src/prompts/sessions/surfaces/cli.md +6 -0
  39. package/dist/runtime/src/prompts/sessions/surfaces/otium.md +6 -0
  40. package/dist/runtime/src/prompts/sessions/surfaces/telegram.md +5 -0
  41. package/dist/runtime/src/prompts/sessions/surfaces/terminal.md +6 -0
  42. package/dist/runtime/src/prompts/sessions/visual-design.md +36 -84
  43. package/dist/runtime/src/runtime/errors.ts +2 -2
  44. package/dist/runtime/src/runtime/turn-runner.ts +1 -0
  45. package/dist/runtime/src/storage/token-stats.ts +5 -0
  46. package/dist/runtime/src/version.ts +1 -1
  47. package/dist/runtime-helpers.js +3 -3
  48. package/dist/runtime-helpers.js.map +2 -2
  49. package/dist/storage.js +4 -1
  50. package/dist/storage.js.map +3 -3
  51. package/dist/types/packages/core/src/agents/maestro-provider.d.ts +4 -7
  52. package/dist/types/packages/core/src/agents/model-catalog.d.ts +2 -0
  53. package/dist/types/packages/core/src/platform/config.d.ts +2 -2
  54. package/dist/types/packages/core/src/prompts/builders.d.ts +4 -2
  55. package/dist/types/packages/core/src/version.d.ts +1 -1
  56. package/dist/vault.js +3 -3
  57. package/dist/vault.js.map +2 -2
  58. package/install-browser-rs.mjs +3 -3
  59. package/package.json +2 -2
  60. /package/dist/{chunk-06zc96py.js.map → chunk-ej0q23pd.js.map} +0 -0
package/README.md CHANGED
@@ -21,7 +21,7 @@ negotium -v
21
21
  ```
22
22
 
23
23
  Authenticate Claude with `claude`, Codex with `codex login`, or Maestro with
24
- `DEEPSEEK_API_KEY` for DeepSeek or `MOONSHOT_API_KEY` for Kimi. See the
24
+ `DEEPSEEK_API_KEY` for DeepSeek, `MOONSHOT_API_KEY` for Kimi, or `GLM_API_KEY` for GLM. See the
25
25
  [main repository](https://github.com/maestrojeong/negotium) for configuration, security guidance,
26
26
  and architecture.
27
27
 
@@ -343,7 +343,7 @@ function resolveWhisperBackend() {
343
343
  function codexAuthFilePath() {
344
344
  return process.env.NEGOTIUM_CODEX_AUTH_FILE || join(process.env.CODEX_HOME || join(homedir(), ".codex"), "auth.json");
345
345
  }
346
- var HOME, PROJECT_ROOT, STATE_DIR, WORKSPACE_DIR, TOPIC_WORKSPACE_DIR, SHARED_WIKI_DIR, CRON_WORKSPACE_DIR, BROWSER_DIR, BROWSER_PROFILES_DIR, BINARIES_DIR, SECRETS_DIR, DM_WORKSPACE_DIR, SESSION_WORKSPACE_DIR, CLAUDE_EXECUTABLE_ENV, CLAUDE_EXECUTABLE, DEFAULT_OUTPUT_LANGUAGE = "English", BROWSER_RS_VERSION = "v0.1.23", BROWSER_RS_MIN_SECURE_VERSION = "0.1.15", BROWSER_RS_VERSION_PROBE_TIMEOUT_MS = 15000, SNIPPETS_API_URL, BROWSER_RS_BIN, BASH_RS_VERSION = "v0.1.7", BASH_RS_BIN, PLAYWRIGHT_MCP_BIN, TSX_BIN, TSX_LOADER, TSCONFIG_PATH, SESSION_COMM_SERVER, TASK_SERVER, DECISION_SERVER, CANONICAL_MCP_PROXY_SERVER, WIKI_SERVER, TOKEN_STATS_SERVER, COMPACTION_LOG_SERVER, SYSTEM_HEALTH_SERVER, AGENT_HEALTH_SERVER, VAULT_SERVER, BG_BASH_BASE_PORT, BG_BASH_MAX_PORT, RUNTIME_MCP_SECRET, NODE_CONTROL_TOKEN, NODE_ID, VAULT_MASTER_KEY, NEGOTIUM_PORT, hostname, DATA_DIR, LOG_DIR, UPLOADS_DIR, VAULT_DIR, SESSIONS_DB, DEBUG_FILE, USERS_LOG_DIR, RUN_DIR, PROGRESS_DIR, DM_CMD_DIR, DM_RESP_DIR, SESSION_INBOX_DIR, SESSION_ASKS_DIR, BASHRS_SPILL_ROOT, PLAYWRIGHT_BASE_PORT, PLAYWRIGHT_MAX_PORT, PLAYWRIGHT_PORTS_DIR, ACTIVE_QUERY_STALE_MS, AGENTS_PROMPTS_DIR, RESOURCES_DIR, FILE_TAG_REGEX, MODEL_SONNET = "claude-sonnet-5", MODEL_OPUS = "claude-opus-5", MODEL_FABLE = "claude-fable-5", FALLBACK_AGENT, SESSION_AGENT, GATEWAY_AGENT, FALLBACK_MODEL, SESSION_MODEL, GATEWAY_MODEL, FFMPEG_BIN, FFPROBE_BIN, PYTHON_BIN, FASTER_WHISPER_WRAPPER, WHISPER_MODEL, TESSERACT_BIN, PDFTOTEXT_BIN, WHISPER_BACKEND, MLX_WHISPER_BIN, WHISPER_MODEL_MLX, _envMaxTellDepth, MAX_TELL_DEPTH;
346
+ var HOME, PROJECT_ROOT, STATE_DIR, WORKSPACE_DIR, TOPIC_WORKSPACE_DIR, SHARED_WIKI_DIR, CRON_WORKSPACE_DIR, BROWSER_DIR, BROWSER_PROFILES_DIR, BINARIES_DIR, SECRETS_DIR, DM_WORKSPACE_DIR, SESSION_WORKSPACE_DIR, CLAUDE_EXECUTABLE_ENV, CLAUDE_EXECUTABLE, DEFAULT_OUTPUT_LANGUAGE = "English", BROWSER_RS_VERSION = "v0.2.1", BROWSER_RS_MIN_SECURE_VERSION = "0.2.1", BROWSER_RS_VERSION_PROBE_TIMEOUT_MS = 15000, SNIPPETS_API_URL, BROWSER_RS_BIN, BASH_RS_VERSION = "v0.1.7", BASH_RS_BIN, PLAYWRIGHT_MCP_BIN, TSX_BIN, TSX_LOADER, TSCONFIG_PATH, SESSION_COMM_SERVER, TASK_SERVER, DECISION_SERVER, CANONICAL_MCP_PROXY_SERVER, WIKI_SERVER, TOKEN_STATS_SERVER, COMPACTION_LOG_SERVER, SYSTEM_HEALTH_SERVER, AGENT_HEALTH_SERVER, VAULT_SERVER, BG_BASH_BASE_PORT, BG_BASH_MAX_PORT, RUNTIME_MCP_SECRET, NODE_CONTROL_TOKEN, NODE_ID, VAULT_MASTER_KEY, NEGOTIUM_PORT, hostname, DATA_DIR, LOG_DIR, UPLOADS_DIR, VAULT_DIR, SESSIONS_DB, DEBUG_FILE, USERS_LOG_DIR, RUN_DIR, PROGRESS_DIR, DM_CMD_DIR, DM_RESP_DIR, SESSION_INBOX_DIR, SESSION_ASKS_DIR, BASHRS_SPILL_ROOT, PLAYWRIGHT_BASE_PORT, PLAYWRIGHT_MAX_PORT, PLAYWRIGHT_PORTS_DIR, ACTIVE_QUERY_STALE_MS, AGENTS_PROMPTS_DIR, RESOURCES_DIR, FILE_TAG_REGEX, MODEL_SONNET = "claude-sonnet-5", MODEL_OPUS = "claude-opus-5", MODEL_FABLE = "claude-fable-5", FALLBACK_AGENT, SESSION_AGENT, GATEWAY_AGENT, FALLBACK_MODEL, SESSION_MODEL, GATEWAY_MODEL, FFMPEG_BIN, FFPROBE_BIN, PYTHON_BIN, FASTER_WHISPER_WRAPPER, WHISPER_MODEL, TESSERACT_BIN, PDFTOTEXT_BIN, WHISPER_BACKEND, MLX_WHISPER_BIN, WHISPER_MODEL_MLX, _envMaxTellDepth, MAX_TELL_DEPTH;
347
347
  var init_config = __esm(() => {
348
348
  init_config_helpers();
349
349
  init_logger();
@@ -3001,7 +3001,7 @@ var init_codex = __esm(async () => {
3001
3001
  });
3002
3002
 
3003
3003
  // ../../packages/core/src/version.ts
3004
- var NEGOTIUM_VERSION = "0.10.0";
3004
+ var NEGOTIUM_VERSION = "0.11.0";
3005
3005
 
3006
3006
  // ../../packages/core/src/agents/codex-native-multi-agent.ts
3007
3007
  import { spawn as spawn2 } from "child_process";
@@ -3491,7 +3491,11 @@ var init_maestro_registry = __esm(() => {
3491
3491
  "deepseek-flash": "deepseek-v4-flash",
3492
3492
  kimi: "kimi-k3",
3493
3493
  "kimi-pro": "kimi-k3",
3494
- "kimi-code": "kimi-k2.7-code"
3494
+ "kimi-code": "kimi-k2.7-code",
3495
+ glm: "glm-5.3",
3496
+ "glm-pro": "glm-5.3",
3497
+ "glm-flash": "glm-5.3-flash",
3498
+ "glm-5.2": "glm-5.2"
3495
3499
  };
3496
3500
  VALID_MODELS = new Set([...Object.keys(ALIAS_MAP2), ...Object.values(ALIAS_MAP2)]);
3497
3501
  VALID_EFFORTS3 = new Set(MAESTRO_EFFORT_VALUES);
@@ -6149,11 +6153,13 @@ function resolveMaestroApiKeyOverrides(userId) {
6149
6153
  return;
6150
6154
  const deepseek = vaultGetValue(userId, "DEEPSEEK_API_KEY")?.trim();
6151
6155
  const moonshot = vaultGetValue(userId, "MOONSHOT_API_KEY")?.trim();
6152
- if (!deepseek && !moonshot)
6156
+ const glm = vaultGetValue(userId, "GLM_API_KEY")?.trim();
6157
+ if (!deepseek && !moonshot && !glm)
6153
6158
  return;
6154
6159
  return {
6155
6160
  ...deepseek ? { deepseek } : {},
6156
- ...moonshot ? { moonshot } : {}
6161
+ ...moonshot ? { moonshot } : {},
6162
+ ...glm ? { glm } : {}
6157
6163
  };
6158
6164
  }
6159
6165
  function buildProviderOwnedToolBlockHook() {
@@ -6648,6 +6654,8 @@ function modelOwner(model) {
6648
6654
  return "maestro";
6649
6655
  if (model.startsWith("kimi-"))
6650
6656
  return "maestro";
6657
+ if (model.startsWith("glm-"))
6658
+ return "maestro";
6651
6659
  if (model.startsWith("gpt-"))
6652
6660
  return "codex";
6653
6661
  return MODEL_OWNER[model];
@@ -6687,7 +6695,13 @@ var init_model_catalog = __esm(() => {
6687
6695
  "kimi-pro": "maestro",
6688
6696
  "kimi-k3": "maestro",
6689
6697
  "kimi-code": "maestro",
6690
- "kimi-k2.7-code": "maestro"
6698
+ "kimi-k2.7-code": "maestro",
6699
+ glm: "maestro",
6700
+ "glm-pro": "maestro",
6701
+ "glm-flash": "maestro",
6702
+ "glm-5.3": "maestro",
6703
+ "glm-5.2": "maestro",
6704
+ "glm-5.3-flash": "maestro"
6691
6705
  };
6692
6706
  SELECTABLE_MODELS = [
6693
6707
  {
@@ -6770,6 +6784,36 @@ var init_model_catalog = __esm(() => {
6770
6784
  marginalTokenCost: "Kimi API: $0.95/M cache-miss input, $0.19/M cached input, $4/M output",
6771
6785
  estimatedUsage: "No subscription token cap; pay per token. Always uses thinking and supports a 256K context window."
6772
6786
  },
6787
+ {
6788
+ model: "glm-5.3",
6789
+ agent: "maestro",
6790
+ description: "Coding-focused GLM flagship with Opus-tier benchmark performance.",
6791
+ intelligenceTier: "opus",
6792
+ routingSummary: "coding-focused flagship route; 1M context; competitive with Opus-tier coding benchmarks at a fraction of the cost",
6793
+ accessCost: "Zhipu AI pay-as-you-go API; no monthly subscription required",
6794
+ marginalTokenCost: "Approximate GLM API rate: $1.40/M input, $4.40/M output",
6795
+ estimatedUsage: "No subscription token cap; pay per token. Always uses thinking and supports a 1M-token context window; text-only input."
6796
+ },
6797
+ {
6798
+ model: "glm-5.2",
6799
+ agent: "maestro",
6800
+ description: "Previous-generation GLM flagship for cost-efficient everyday work.",
6801
+ intelligenceTier: "sonnet",
6802
+ routingSummary: "previous-gen flagship; 1M context; cost-efficient everyday work, cheaper than glm-5.3",
6803
+ accessCost: "Zhipu AI pay-as-you-go API; no monthly subscription required",
6804
+ marginalTokenCost: "Approximate GLM API rate: $0.95/M input, $3/M output",
6805
+ estimatedUsage: "No subscription token cap; pay per token. Always uses thinking and supports a 1M-token context window; text-only input."
6806
+ },
6807
+ {
6808
+ model: "glm-5.3-flash",
6809
+ agent: "maestro",
6810
+ description: "Low-cost multimodal GLM route with native image input.",
6811
+ intelligenceTier: "sonnet",
6812
+ routingSummary: "cheapest GLM route; 1M context; the only GLM model with native vision/multimodal support",
6813
+ accessCost: "Zhipu AI pay-as-you-go API; no monthly subscription required",
6814
+ marginalTokenCost: "Approximate GLM API rate: $0.15/M input, $0.50/M output",
6815
+ estimatedUsage: "No subscription token cap; pay per token. Always uses thinking, supports a 1M-token context window, and accepts native image input."
6816
+ },
6773
6817
  {
6774
6818
  model: "deepseek-pro",
6775
6819
  agent: "maestro",
@@ -6794,7 +6838,10 @@ var init_model_catalog = __esm(() => {
6794
6838
  SELECTABLE_MODEL_ALIASES = {
6795
6839
  kimi: "kimi-k3",
6796
6840
  "kimi-pro": "kimi-k3",
6797
- "kimi-code": "kimi-k2.7-code"
6841
+ "kimi-code": "kimi-k2.7-code",
6842
+ glm: "glm-5.3",
6843
+ "glm-pro": "glm-5.3",
6844
+ "glm-flash": "glm-5.3-flash"
6798
6845
  };
6799
6846
  FALLBACK_ORDER = {
6800
6847
  claude: [
@@ -7071,12 +7118,13 @@ function createPromptBuilders(host = {}) {
7071
7118
  sections.sort((a, b) => (a.order ?? 0) - (b.order ?? 0) || a.id.localeCompare(b.id));
7072
7119
  const templateCache = new Map;
7073
7120
  const template = (request) => {
7074
- const cached = templateCache.get(request.kind);
7121
+ const cacheKey = `${request.kind}:${request.filename}`;
7122
+ const cached = templateCache.get(cacheKey);
7075
7123
  if (cached !== undefined)
7076
7124
  return cached;
7077
7125
  const loaded = loadTemplate?.(request);
7078
- const value = loaded ?? (request.kind === "topic-system" ? topicSystemPromptTemplate() : request.kind === "channel-system" ? channelSystemPromptTemplate() : request.kind === "manager-system" ? managerSystemPromptTemplate() : visualDesignGuide());
7079
- templateCache.set(request.kind, value);
7126
+ const value = loaded ?? (request.kind === "topic-system" ? topicSystemPromptTemplate() : request.kind === "channel-system" ? channelSystemPromptTemplate() : request.kind === "manager-system" ? managerSystemPromptTemplate() : request.kind === "surface-profile" ? loadSessionPrompt(request.filename, request.fallback) : visualDesignGuide());
7127
+ templateCache.set(cacheKey, value);
7080
7128
  return value;
7081
7129
  };
7082
7130
  const build = (sessionKind, opts, sessionTemplate) => {
@@ -7092,7 +7140,19 @@ function createPromptBuilders(host = {}) {
7092
7140
  UPLOADS_DIR: uploadsDir,
7093
7141
  RESPONSE_LANGUAGE: resolveOutputLanguage()
7094
7142
  };
7095
- let prompt = replaceVars(sessionTemplate, templateVars) + buildRuntimeToolSection({
7143
+ const environmentProfileFiles = [
7144
+ ...opts.surface === "terminal" ? ["surfaces/cli.md"] : [],
7145
+ ...opts.surface ? [SURFACE_PROFILE_FILES[opts.surface]] : []
7146
+ ];
7147
+ const environmentProfiles = environmentProfileFiles.map((filename) => template({
7148
+ kind: "surface-profile",
7149
+ filename,
7150
+ fallback: ""
7151
+ }));
7152
+ const basePrompt = [sessionTemplate, ...environmentProfiles].filter((part) => part.trim()).join(`
7153
+
7154
+ `);
7155
+ let prompt = replaceVars(basePrompt, templateVars) + buildRuntimeToolSection({
7096
7156
  agentKind: opts.agentKind,
7097
7157
  canSpawnSubagents: sessionKind === "channel" ? false : opts.canSpawnSubagents,
7098
7158
  canStageSubagents: sessionKind === "channel" ? false : opts.canStageSubagents,
@@ -7172,7 +7232,7 @@ function buildMemoryPromptSection(opts) {
7172
7232
  return parts.join(`
7173
7233
  `);
7174
7234
  }
7175
- var PROMPTS_DIR, SESSIONS_DIR, FALLBACK_TOPIC_SYSTEM_PROMPT_TEMPLATE = `You are a helpful AI assistant named "{{AI_LABEL}}".
7235
+ var PROMPTS_DIR, SESSIONS_DIR, SURFACE_PROFILE_FILES, FALLBACK_TOPIC_SYSTEM_PROMPT_TEMPLATE = `You are a helpful AI assistant named "{{AI_LABEL}}".
7176
7236
  Topic: {{TOPIC_TITLE}}.
7177
7237
  Respond in the user's language (default: {{RESPONSE_LANGUAGE}}).
7178
7238
 
@@ -7201,6 +7261,11 @@ var init_builders = __esm(() => {
7201
7261
  init_logger();
7202
7262
  PROMPTS_DIR = resolve11(PROJECT_ROOT, "src/prompts");
7203
7263
  SESSIONS_DIR = resolve11(PROMPTS_DIR, "sessions");
7264
+ SURFACE_PROFILE_FILES = {
7265
+ terminal: "surfaces/terminal.md",
7266
+ telegram: "surfaces/telegram.md",
7267
+ otium: "surfaces/otium.md"
7268
+ };
7204
7269
  defaultPromptBuilders = createPromptBuilders();
7205
7270
  buildTopicSystemPrompt = defaultPromptBuilders.buildTopicSystemPrompt;
7206
7271
  buildChannelSystemPrompt = defaultPromptBuilders.buildChannelSystemPrompt;
@@ -8818,12 +8883,12 @@ function checkAgentAuth(agent, host = defaultAgentAuthHost, userId) {
8818
8883
  };
8819
8884
  }
8820
8885
  case "maestro": {
8821
- if (hasMaestroCredential(host, "DEEPSEEK_API_KEY", userId) || hasMaestroCredential(host, "MOONSHOT_API_KEY", userId)) {
8886
+ if (hasMaestroCredential(host, "DEEPSEEK_API_KEY", userId) || hasMaestroCredential(host, "MOONSHOT_API_KEY", userId) || hasMaestroCredential(host, "GLM_API_KEY", userId)) {
8822
8887
  return { ok: true };
8823
8888
  }
8824
8889
  return {
8825
8890
  ok: false,
8826
- error: "maestro is not authenticated (set DEEPSEEK_API_KEY or MOONSHOT_API_KEY via /vault set, or as an env var)"
8891
+ error: "maestro is not authenticated (set DEEPSEEK_API_KEY, MOONSHOT_API_KEY, or GLM_API_KEY via /vault set, or as an env var)"
8827
8892
  };
8828
8893
  }
8829
8894
  }
@@ -8843,6 +8908,12 @@ function checkAgentModelAuth(agent, model, host = defaultAgentAuthHost, userId)
8843
8908
  error: `maestro is not authenticated for model '${model}' (set DEEPSEEK_API_KEY via /vault set, or as an env var)`
8844
8909
  };
8845
8910
  }
8911
+ if (model.startsWith("glm")) {
8912
+ return hasMaestroCredential(host, "GLM_API_KEY", userId) ? { ok: true } : {
8913
+ ok: false,
8914
+ error: `maestro is not authenticated for model '${model}' (set GLM_API_KEY via /vault set, or as an env var)`
8915
+ };
8916
+ }
8846
8917
  return checkAgentAuth(agent, host, userId);
8847
8918
  }
8848
8919
  var defaultAgentAuthHost;
@@ -12380,6 +12451,9 @@ var init_token_stats = __esm(async () => {
12380
12451
  "claude:sonnet": { input: 2, cacheWrite: 2.5, cacheRead: 0.2, output: 10 },
12381
12452
  "maestro:kimi-k3": { input: 3, cacheRead: 0.3, output: 15 },
12382
12453
  "maestro:kimi-k2.7-code": { input: 0.95, cacheRead: 0.19, output: 4 },
12454
+ "maestro:glm-5.3": { input: 1.4, cacheRead: 1.4, output: 4.4 },
12455
+ "maestro:glm-5.2": { input: 0.95, cacheRead: 0.95, output: 3 },
12456
+ "maestro:glm-5.3-flash": { input: 0.15, cacheRead: 0.15, output: 0.5 },
12383
12457
  "maestro:deepseek-pro": { input: 0.435, cacheRead: 0.003625, output: 0.87 },
12384
12458
  "maestro:deepseek-flash": { input: 0.14, cacheRead: 0.0028, output: 0.28 }
12385
12459
  };
@@ -15631,7 +15705,7 @@ function authRecoveryHint(agent) {
15631
15705
  case "codex":
15632
15706
  return "Please log in again with `codex login` (~/.codex/auth.json)";
15633
15707
  case "maestro":
15634
- return "Please check the DEEPSEEK_API_KEY or MOONSHOT_API_KEY environment variable";
15708
+ return "Please check the DEEPSEEK_API_KEY, MOONSHOT_API_KEY, or GLM_API_KEY environment variable";
15635
15709
  }
15636
15710
  }
15637
15711
  function classifyAgentError(err2, agent) {
@@ -15647,7 +15721,7 @@ function classifyAgentError(err2, agent) {
15647
15721
  return status === 529 ? `${name} server is overloaded. Please try again in a moment. (529)` : `${name} server error occurred. Please try again in a moment. (500)`;
15648
15722
  }
15649
15723
  const s = stringifyError(err2);
15650
- if (/401|authentication.error|invalid.*api.key|not logged|ANTHROPIC_API_KEY|DEEPSEEK_API_KEY|MOONSHOT_API_KEY/i.test(s)) {
15724
+ if (/401|authentication.error|invalid.*api.key|not logged|ANTHROPIC_API_KEY|DEEPSEEK_API_KEY|MOONSHOT_API_KEY|GLM_API_KEY/i.test(s)) {
15651
15725
  return `${name} authentication expired. ${hint}. (401)`;
15652
15726
  }
15653
15727
  if (/429|rate.limit/i.test(s))
@@ -17760,6 +17834,7 @@ function startAiTurn(params) {
17760
17834
  topicTitle: topic.title,
17761
17835
  workspaceCwd,
17762
17836
  agentKind,
17837
+ surface: topicRecord?.surface ?? topic.surface,
17763
17838
  currentModel: resolvedModel,
17764
17839
  currentEffort: resolvedEffort,
17765
17840
  description: topic.description,
@@ -20177,4 +20252,4 @@ export {
20177
20252
  DEFAULT_SELF_CONFIG_PRODUCT
20178
20253
  };
20179
20254
 
20180
- //# debugId=BFD41C0F2C3A7B4264756E2164756E21
20255
+ //# debugId=94089A8AD30B3CFE64756E2164756E21