negotium 0.19.0 → 0.19.2

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 (42) hide show
  1. package/dist/agent-helpers.js +142 -77
  2. package/dist/agent-helpers.js.map +10 -10
  3. package/dist/background-bash.js.map +1 -1
  4. package/dist/browser-runtime.js.map +1 -1
  5. package/dist/{chunk-y8rtedjb.js → chunk-55dd0xw7.js} +2 -2
  6. package/dist/{chunk-y8rtedjb.js.map → chunk-55dd0xw7.js.map} +2 -2
  7. package/dist/{chunk-q2s5f70x.js → chunk-aqqmzmft.js} +1 -1
  8. package/dist/{chunk-3d1pjgfw.js → chunk-cv7vdsrn.js} +2 -2
  9. package/dist/{chunk-3d1pjgfw.js.map → chunk-cv7vdsrn.js.map} +2 -2
  10. package/dist/{chunk-4bzehg8t.js → chunk-exqz8bez.js} +3 -3
  11. package/dist/{chunk-4bzehg8t.js.map → chunk-exqz8bez.js.map} +2 -2
  12. package/dist/{chunk-22mtr8np.js → chunk-kkftbxh2.js} +1 -1
  13. package/dist/hosted-agent.js +4 -4
  14. package/dist/hosted-agent.js.map +2 -2
  15. package/dist/main.js +140 -82
  16. package/dist/main.js.map +11 -11
  17. package/dist/mcp-factories.js +214 -165
  18. package/dist/mcp-factories.js.map +9 -9
  19. package/dist/media.js.map +1 -1
  20. package/dist/prompts.js +23 -3
  21. package/dist/prompts.js.map +4 -4
  22. package/dist/query-runtime.js +56 -6
  23. package/dist/query-runtime.js.map +7 -5
  24. package/dist/registry.js +3 -3
  25. package/dist/rollout.js +2 -2
  26. package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +24 -4
  27. package/dist/runtime/src/agents/model-catalog.ts +27 -2
  28. package/dist/runtime/src/agents/self-config-core.ts +10 -1
  29. package/dist/runtime/src/platform/config.ts +1 -1
  30. package/dist/runtime/src/query/state.ts +19 -1
  31. package/dist/runtime/src/storage/token-stats.ts +4 -1
  32. package/dist/runtime/src/version.ts +1 -1
  33. package/dist/runtime-helpers.js.map +1 -1
  34. package/dist/storage.js +5 -2
  35. package/dist/storage.js.map +3 -3
  36. package/dist/types/packages/core/src/platform/config.d.ts +1 -1
  37. package/dist/types/packages/core/src/query/state.d.ts +8 -0
  38. package/dist/types/packages/core/src/version.d.ts +1 -1
  39. package/dist/vault.js.map +1 -1
  40. package/package.json +3 -3
  41. /package/dist/{chunk-q2s5f70x.js.map → chunk-aqqmzmft.js.map} +0 -0
  42. /package/dist/{chunk-22mtr8np.js.map → chunk-kkftbxh2.js.map} +0 -0
@@ -480,7 +480,7 @@ function resolveWhisperBackend() {
480
480
  function codexAuthFilePath() {
481
481
  return process.env.NEGOTIUM_CODEX_AUTH_FILE || join(process.env.CODEX_HOME || join(homedir(), ".codex"), "auth.json");
482
482
  }
483
- 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", BINARY_EXTENSION, BROWSER_RS_VERSION = "v0.6.0", 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.10", BASH_RS_BIN, PLAYWRIGHT_MCP_BIN, TSX_BIN, TSX_LOADER_PATH, 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, RUNTIME_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, ABSOLUTE_PATH_PREFIX, FILE_EXTENSIONS_REGEX, FILE_TAG_REGEX, MODEL_SONNET = "claude-sonnet-5", MODEL_OPUS = "claude-opus-5", MODEL_HAIKU = "claude-haiku-4-5-20251001", MODEL_FABLE = "claude-fable-5-1", MODEL_DEEPSEEK_V4_PRO = "deepseek-v4-pro", MODEL_DEEPSEEK_V4_FLASH = "deepseek-v4-flash", FALLBACK_AGENT, FALLBACK_MODEL, DEFAULT_TOPIC_EFFORT, 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;
483
+ 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", BINARY_EXTENSION, BROWSER_RS_VERSION = "v0.6.0", 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.10", BASH_RS_BIN, PLAYWRIGHT_MCP_BIN, TSX_BIN, TSX_LOADER_PATH, 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, RUNTIME_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, ABSOLUTE_PATH_PREFIX, FILE_EXTENSIONS_REGEX, FILE_TAG_REGEX, MODEL_SONNET = "claude-sonnet-5", MODEL_OPUS = "claude-opus-5-5", MODEL_HAIKU = "claude-haiku-4-5-20251001", MODEL_FABLE = "claude-fable-5-1", MODEL_DEEPSEEK_V4_PRO = "deepseek-v4-pro", MODEL_DEEPSEEK_V4_FLASH = "deepseek-v4-flash", FALLBACK_AGENT, FALLBACK_MODEL, DEFAULT_TOPIC_EFFORT, 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;
484
484
  var init_config = __esm(() => {
485
485
  init_config_helpers();
486
486
  init_logger();
@@ -3099,6 +3099,13 @@ function parseJsonlText(raw) {
3099
3099
  return raw.trim().split(`
3100
3100
  `).filter(Boolean).map((line) => JSON.parse(line));
3101
3101
  }
3102
+ function readJsonFile(filePath) {
3103
+ try {
3104
+ return JSON.parse(readFileSync2(filePath, "utf-8"));
3105
+ } catch {
3106
+ return null;
3107
+ }
3108
+ }
3102
3109
  function lockStaleMs() {
3103
3110
  const raw = Number.parseInt(process.env.NEGOTIUM_JSONL_LOCK_STALE_MS ?? "", 10);
3104
3111
  return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_LOCK_STALE_MS;
@@ -3962,7 +3969,7 @@ var init_codex = __esm(async () => {
3962
3969
  });
3963
3970
 
3964
3971
  // ../../packages/core/src/version.ts
3965
- var NEGOTIUM_VERSION = "0.19.0";
3972
+ var NEGOTIUM_VERSION = "0.19.2";
3966
3973
 
3967
3974
  // ../../packages/core/src/agents/codex-native-multi-agent.ts
3968
3975
  import { spawn as spawn2 } from "child_process";
@@ -7646,6 +7653,8 @@ var init_model_catalog = __esm(() => {
7646
7653
  haiku: "claude",
7647
7654
  fable: "claude",
7648
7655
  "gpt-6-astra": "codex",
7656
+ "gpt-6-sol": "codex",
7657
+ "gpt-6-luna": "codex",
7649
7658
  "gpt-5.6-luna": "codex",
7650
7659
  "gpt-5.6-terra": "codex",
7651
7660
  "gpt-5.6-sol": "codex",
@@ -7675,6 +7684,26 @@ var init_model_catalog = __esm(() => {
7675
7684
  marginalTokenCost: "Codex credits (OpenAI API rate): $10/M uncached input, $1/M cached input, $12.50/M cache write, $50/M output",
7676
7685
  estimatedUsage: `Released 2026-09-03; became Codex CLI's bundled default in v0.153.4 (2026-09-05). Local message-count/quota-weight ranges not yet published as of the last catalog check \u2014 expect a quota weight above gpt-5.6-sol given the higher per-token cost. ${CODEX_COMMUNITY_WEEKLY}`
7677
7686
  },
7687
+ {
7688
+ model: "gpt-6-sol",
7689
+ agent: "codex",
7690
+ description: "GPT-6 generation Sol route (2026-09-22) for demanding coding and agentic work.",
7691
+ intelligenceTier: "opus",
7692
+ routingSummary: "demanding coding work; about half as many mistakes as gpt-5.6-sol at half the price",
7693
+ accessCost: CODEX_PRO_20X_COST,
7694
+ marginalTokenCost: "Codex credits (OpenAI API rate): $2/M uncached input, $0.20/M cached input (assumed), $10/M output",
7695
+ estimatedUsage: `Released 2026-09-22; local message-count/quota-weight ranges not yet published. ${CODEX_COMMUNITY_WEEKLY}`
7696
+ },
7697
+ {
7698
+ model: "gpt-6-luna",
7699
+ agent: "codex",
7700
+ description: "GPT-6 generation Luna route (2026-09-22): fast, high-volume, lowest cost.",
7701
+ intelligenceTier: "sonnet",
7702
+ routingSummary: "fast high-volume work; cheapest Codex route",
7703
+ accessCost: CODEX_PRO_20X_COST,
7704
+ marginalTokenCost: "Codex credits (OpenAI API rate): $0.10/M uncached input, $0.01/M cached input (assumed), $0.50/M output",
7705
+ estimatedUsage: `Released 2026-09-22; local message-count/quota-weight ranges not yet published. ${CODEX_COMMUNITY_WEEKLY}`
7706
+ },
7678
7707
  {
7679
7708
  model: "gpt-5.6-sol",
7680
7709
  agent: "codex",
@@ -7720,9 +7749,9 @@ var init_model_catalog = __esm(() => {
7720
7749
  agent: "claude",
7721
7750
  description: "High-capability Claude route for complex reasoning and tool-heavy work.",
7722
7751
  intelligenceTier: "opus",
7723
- routingSummary: "complex reasoning and tool-heavy work; about 2.5x Sonnet marginal cost",
7752
+ routingSummary: "complex reasoning and tool-heavy work; about 2x Sonnet marginal cost",
7724
7753
  accessCost: CLAUDE_MAX_20X_COST,
7725
- marginalTokenCost: "Claude API/extra usage: $5/M input, $6.25/M cache write, $0.50/M cache read, $25/M output",
7754
+ marginalTokenCost: "Claude API/extra usage (Opus 5.5, 2026-09-22): $4/M input, $5/M cache write (assumed), $0.40/M cache read (assumed), $20/M output",
7726
7755
  estimatedUsage: `${CLAUDE_COMMUNITY_SESSION}; Opus uses the shared all-model weekly pool more quickly than Sonnet. No stable per-model token cap is published.`
7727
7756
  },
7728
7757
  {
@@ -13107,11 +13136,14 @@ var init_token_stats = __esm(async () => {
13107
13136
  ]);
13108
13137
  TOKEN_PRICES = {
13109
13138
  "codex:gpt-6-astra": { input: 10, cacheWrite: 12.5, cacheRead: 1, output: 50 },
13139
+ "codex:gpt-6-sol": { input: 2, cacheRead: 0.2, output: 10 },
13140
+ "codex:gpt-6-luna": { input: 0.1, cacheRead: 0.01, output: 0.5 },
13110
13141
  "codex:gpt-5.6-sol": { input: 5, cacheRead: 0.5, output: 30 },
13111
13142
  "codex:gpt-5.6-terra": { input: 2.5, cacheRead: 0.25, output: 15 },
13112
13143
  "codex:gpt-5.6-luna": { input: 1, cacheRead: 0.1, output: 6 },
13113
13144
  "claude:fable": { input: 10, cacheWrite: 12.5, cacheRead: 0.25, output: 50 },
13114
- "claude:opus": { input: 5, cacheWrite: 6.25, cacheRead: 0.5, output: 25 },
13145
+ "claude:opus": { input: 4, cacheWrite: 5, cacheRead: 0.4, output: 20 },
13146
+ "claude:claude-opus-5-5": { input: 4, cacheWrite: 5, cacheRead: 0.4, output: 20 },
13115
13147
  "claude:sonnet": { input: 2, cacheWrite: 2.5, cacheRead: 0.2, output: 10 },
13116
13148
  "maestro:kimi-k3": { input: 3, cacheRead: 0.3, output: 15 },
13117
13149
  "maestro:kimi-k2.7-code": { input: 0.95, cacheRead: 0.19, output: 4 },
@@ -14952,15 +14984,84 @@ var init_derive = __esm(async () => {
14952
14984
  };
14953
14985
  });
14954
14986
 
14987
+ // ../../packages/core/src/query/state.ts
14988
+ import { mkdirSync as mkdirSync15, renameSync as renameSync7, unlinkSync as unlinkSync14, writeFileSync as writeFileSync13 } from "fs";
14989
+ import { basename as basename4, join as join24 } from "path";
14990
+ function createQueryStateStore(options) {
14991
+ const sanitize = options.sanitizeTopicId ?? sanitizeId;
14992
+ const queryStateDirPath = (userId) => join24(options.usersLogDir, String(userId), "active-queries");
14993
+ const queryStateFile = (userId, topicId) => join24(queryStateDirPath(userId), `${sanitize(topicId)}.json`);
14994
+ const legacyQueryStateFile = (userId, topicName) => {
14995
+ if (!topicName || topicName === "." || topicName === ".." || basename4(topicName) !== topicName) {
14996
+ return null;
14997
+ }
14998
+ return join24(queryStateDirPath(userId), `${topicName}.json`);
14999
+ };
15000
+ return {
15001
+ write(userId, topicId, topicName, task) {
15002
+ const dir = queryStateDirPath(userId);
15003
+ mkdirSync15(dir, { recursive: true });
15004
+ const state = { topicId, topicName, since: new Date().toISOString() };
15005
+ if (task)
15006
+ state.task = [...task.replace(/\n+/g, " ").trim()].slice(0, 100).join("");
15007
+ const target = queryStateFile(userId, topicId);
15008
+ const tmp = `${target}.${process.pid}.${Date.now()}.tmp`;
15009
+ writeFileSync13(tmp, JSON.stringify(state));
15010
+ renameSync7(tmp, target);
15011
+ },
15012
+ clear(userId, topicId, legacyTopicName) {
15013
+ const paths = [
15014
+ queryStateFile(userId, topicId),
15015
+ legacyQueryStateFile(userId, legacyTopicName)
15016
+ ].filter((path) => Boolean(path));
15017
+ for (const path of new Set(paths)) {
15018
+ try {
15019
+ unlinkSync14(path);
15020
+ } catch (error) {
15021
+ if (error?.code !== "ENOENT") {
15022
+ options.logger?.warn({ err: error, userId, topicId, path }, "Failed to clear query state file");
15023
+ }
15024
+ }
15025
+ }
15026
+ },
15027
+ hasActive(userId, topicId) {
15028
+ const state = readJsonFile(queryStateFile(userId, topicId));
15029
+ if (!state)
15030
+ return false;
15031
+ const sinceMs = new Date(state.since).getTime();
15032
+ return Date.now() - sinceMs <= ACTIVE_QUERY_STALE_MS;
15033
+ }
15034
+ };
15035
+ }
15036
+ function writeQueryState(userId, topicId, topicName, task) {
15037
+ defaultQueryStateStore.write(userId, topicId, topicName, task);
15038
+ }
15039
+ function clearQueryState(userId, topicId, legacyTopicName) {
15040
+ defaultQueryStateStore.clear(userId, topicId, legacyTopicName);
15041
+ }
15042
+ function hasActiveQuery(userId, topicId) {
15043
+ return defaultQueryStateStore.hasActive(userId, topicId);
15044
+ }
15045
+ var defaultQueryStateStore;
15046
+ var init_state = __esm(() => {
15047
+ init_config();
15048
+ init_jsonl();
15049
+ init_logger();
15050
+ defaultQueryStateStore = createQueryStateStore({
15051
+ usersLogDir: USERS_LOG_DIR,
15052
+ logger
15053
+ });
15054
+ });
15055
+
14955
15056
  // ../../packages/core/src/query/session-inbox-path.ts
14956
- import { join as join24 } from "path";
15057
+ import { join as join25 } from "path";
14957
15058
  function sessionInboxPath(userId, topicId) {
14958
15059
  const key = Buffer.from(topicId, "utf8").toString("base64url");
14959
- return join24(SESSION_INBOX_DIR, userId, `${TOPIC_ID_FILE_PREFIX}${key}${JSONL_SUFFIX}`);
15060
+ return join25(SESSION_INBOX_DIR, userId, `${TOPIC_ID_FILE_PREFIX}${key}${JSONL_SUFFIX}`);
14960
15061
  }
14961
15062
  function scheduledSessionInboxPath(userId, topicId) {
14962
15063
  const key = Buffer.from(topicId, "utf8").toString("base64url");
14963
- return join24(SESSION_INBOX_DIR, userId, `${TOPIC_ID_FILE_PREFIX}${key}${SCHEDULE_SUFFIX}`);
15064
+ return join25(SESSION_INBOX_DIR, userId, `${TOPIC_ID_FILE_PREFIX}${key}${SCHEDULE_SUFFIX}`);
14964
15065
  }
14965
15066
  var TOPIC_ID_FILE_PREFIX = "topic-id-", JSONL_SUFFIX = ".jsonl", SCHEDULE_SUFFIX = ".schedule";
14966
15067
  var init_session_inbox_path = __esm(() => {
@@ -14968,12 +15069,12 @@ var init_session_inbox_path = __esm(() => {
14968
15069
  });
14969
15070
 
14970
15071
  // ../../packages/core/src/storage/session-inbox-signal.ts
14971
- import { join as join25 } from "path";
15072
+ import { join as join26 } from "path";
14972
15073
  var SESSION_INBOX_WAKE_FILE, listeners;
14973
15074
  var init_session_inbox_signal = __esm(() => {
14974
15075
  init_config();
14975
15076
  init_logger();
14976
- SESSION_INBOX_WAKE_FILE = join25(SESSION_INBOX_DIR, ".wake");
15077
+ SESSION_INBOX_WAKE_FILE = join26(SESSION_INBOX_DIR, ".wake");
14977
15078
  listeners = new Set;
14978
15079
  });
14979
15080
 
@@ -15010,14 +15111,14 @@ var init_session_inbox = __esm(async () => {
15010
15111
  });
15011
15112
 
15012
15113
  // ../../packages/core/src/query/session-inbox-cleanup.ts
15013
- import { unlinkSync as unlinkSync14 } from "fs";
15014
- import { basename as basename4, join as join26 } from "path";
15114
+ import { unlinkSync as unlinkSync15 } from "fs";
15115
+ import { basename as basename5, join as join27 } from "path";
15015
15116
  function cleanupSessionInboxFiles(userId, topicId, legacyTopicTitle) {
15016
15117
  const live = sessionInboxPath(userId, topicId);
15017
15118
  const scheduled = scheduledSessionInboxPath(userId, topicId);
15018
15119
  const candidates = new Set([live, `${live}.processing`, scheduled, `${scheduled}.processing`]);
15019
- if (legacyTopicTitle && legacyTopicTitle !== "." && legacyTopicTitle !== ".." && basename4(legacyTopicTitle) === legacyTopicTitle) {
15020
- const legacyBase = join26(SESSION_INBOX_DIR, userId, legacyTopicTitle);
15120
+ if (legacyTopicTitle && legacyTopicTitle !== "." && legacyTopicTitle !== ".." && basename5(legacyTopicTitle) === legacyTopicTitle) {
15121
+ const legacyBase = join27(SESSION_INBOX_DIR, userId, legacyTopicTitle);
15021
15122
  for (const suffix of [".jsonl", ".jsonl.processing", ".schedule", ".schedule.processing"]) {
15022
15123
  candidates.add(`${legacyBase}${suffix}`);
15023
15124
  }
@@ -15025,7 +15126,7 @@ function cleanupSessionInboxFiles(userId, topicId, legacyTopicTitle) {
15025
15126
  let deleted = deleteSessionInboxForTopic(topicId);
15026
15127
  for (const path of candidates) {
15027
15128
  try {
15028
- unlinkSync14(path);
15129
+ unlinkSync15(path);
15029
15130
  deleted++;
15030
15131
  } catch (err2) {
15031
15132
  if (err2?.code !== "ENOENT") {
@@ -15042,64 +15143,6 @@ var init_session_inbox_cleanup = __esm(async () => {
15042
15143
  await init_session_inbox();
15043
15144
  });
15044
15145
 
15045
- // ../../packages/core/src/query/state.ts
15046
- import { mkdirSync as mkdirSync15, renameSync as renameSync7, unlinkSync as unlinkSync15, writeFileSync as writeFileSync13 } from "fs";
15047
- import { basename as basename5, join as join27 } from "path";
15048
- function createQueryStateStore(options) {
15049
- const sanitize = options.sanitizeTopicId ?? sanitizeId;
15050
- const queryStateDirPath = (userId) => join27(options.usersLogDir, String(userId), "active-queries");
15051
- const queryStateFile = (userId, topicId) => join27(queryStateDirPath(userId), `${sanitize(topicId)}.json`);
15052
- const legacyQueryStateFile = (userId, topicName) => {
15053
- if (!topicName || topicName === "." || topicName === ".." || basename5(topicName) !== topicName) {
15054
- return null;
15055
- }
15056
- return join27(queryStateDirPath(userId), `${topicName}.json`);
15057
- };
15058
- return {
15059
- write(userId, topicId, topicName, task) {
15060
- const dir = queryStateDirPath(userId);
15061
- mkdirSync15(dir, { recursive: true });
15062
- const state = { topicId, topicName, since: new Date().toISOString() };
15063
- if (task)
15064
- state.task = [...task.replace(/\n+/g, " ").trim()].slice(0, 100).join("");
15065
- const target = queryStateFile(userId, topicId);
15066
- const tmp = `${target}.${process.pid}.${Date.now()}.tmp`;
15067
- writeFileSync13(tmp, JSON.stringify(state));
15068
- renameSync7(tmp, target);
15069
- },
15070
- clear(userId, topicId, legacyTopicName) {
15071
- const paths = [
15072
- queryStateFile(userId, topicId),
15073
- legacyQueryStateFile(userId, legacyTopicName)
15074
- ].filter((path) => Boolean(path));
15075
- for (const path of new Set(paths)) {
15076
- try {
15077
- unlinkSync15(path);
15078
- } catch (error) {
15079
- if (error?.code !== "ENOENT") {
15080
- options.logger?.warn({ err: error, userId, topicId, path }, "Failed to clear query state file");
15081
- }
15082
- }
15083
- }
15084
- }
15085
- };
15086
- }
15087
- function writeQueryState(userId, topicId, topicName, task) {
15088
- defaultQueryStateStore.write(userId, topicId, topicName, task);
15089
- }
15090
- function clearQueryState(userId, topicId, legacyTopicName) {
15091
- defaultQueryStateStore.clear(userId, topicId, legacyTopicName);
15092
- }
15093
- var defaultQueryStateStore;
15094
- var init_state = __esm(() => {
15095
- init_config();
15096
- init_logger();
15097
- defaultQueryStateStore = createQueryStateStore({
15098
- usersLogDir: USERS_LOG_DIR,
15099
- logger
15100
- });
15101
- });
15102
-
15103
15146
  // ../../packages/core/src/mcp/session-comm/peer-forward.ts
15104
15147
  var exports_peer_forward = {};
15105
15148
  __export(exports_peer_forward, {
@@ -19201,6 +19244,12 @@ var init_turn_runner = __esm(async () => {
19201
19244
 
19202
19245
  // ../../packages/core/src/agents/mcp-tools/spawn-subagent.ts
19203
19246
  import { z as z4 } from "zod";
19247
+ function activeQueryUserId(topic) {
19248
+ return topic?.participants.find((participant) => hasActiveQuery(participant.userId, topic.id))?.userId;
19249
+ }
19250
+ function persistedWatchUserId(topic) {
19251
+ return activeQueryUserId(topic) ?? topic?.participants.find((participant) => participant.role === "owner")?.userId ?? topic?.participants[0]?.userId;
19252
+ }
19204
19253
  function createSubagentLifecycle(host) {
19205
19254
  const runtimeOwnerId = host.runtime.ownerId;
19206
19255
  const limits = Object.freeze({
@@ -19315,7 +19364,7 @@ function createSubagentLifecycle(host) {
19315
19364
  }
19316
19365
  function watchFromPersistedCard(message, card, queryId) {
19317
19366
  const child = host.storage.getTopic(card.subagentTopicId);
19318
- const userId = child?.participants.find((participant) => participant.role === "owner")?.userId ?? child?.participants[0]?.userId;
19367
+ const userId = persistedWatchUserId(child);
19319
19368
  if (!userId)
19320
19369
  return null;
19321
19370
  return {
@@ -19674,6 +19723,10 @@ ${card.task}${reportInstruction}`;
19674
19723
  if (watch?.running)
19675
19724
  return "running";
19676
19725
  const card = host.storage.listSubagentMessages().filter((message) => message.topicId === parentTopicId && message.subagentCard?.subagentTopicId === childTopicId).at(-1)?.subagentCard;
19726
+ if (!card || card.status === "failed") {
19727
+ if (activeQueryUserId(host.storage.getTopic(childTopicId)))
19728
+ return "running";
19729
+ }
19677
19730
  return card?.status ?? "unknown";
19678
19731
  }
19679
19732
  function listMemoryTopicNames(ctx) {
@@ -19897,6 +19950,7 @@ var MAX_TASK_CHARS = 8000, MAX_NAME_CHARS = 80, MAX_LIVE_CHILDREN_PER_PARENT = 5
19897
19950
  var init_spawn_subagent = __esm(async () => {
19898
19951
  init_common();
19899
19952
  init_logger();
19953
+ init_state();
19900
19954
  init_wiki_summary_names();
19901
19955
  init_types();
19902
19956
  await __promiseAll([
@@ -19993,7 +20047,9 @@ var init_spawn_subagent = __esm(async () => {
19993
20047
  if (getRuntimeUserTurnRequest(childTopicId))
19994
20048
  return true;
19995
20049
  const lease = getRuntimeTurnLease(childTopicId);
19996
- return Boolean(lease && processOwnerIsAlive(lease.ownerId));
20050
+ if (lease && processOwnerIsAlive(lease.ownerId))
20051
+ return true;
20052
+ return Boolean(activeQueryUserId(getTopic(childTopicId)));
19997
20053
  }
19998
20054
  },
19999
20055
  config: {
@@ -20455,7 +20511,16 @@ function escapeRegExp2(value) {
20455
20511
  function agentAliases(agent) {
20456
20512
  switch (agent) {
20457
20513
  case "codex":
20458
- return ["codex", "\uCF54\uB371\uC2A4", "gpt-5.6-luna", "gpt-5.6-terra", "gpt-5.6-sol", "gpt-6-astra"];
20514
+ return [
20515
+ "codex",
20516
+ "\uCF54\uB371\uC2A4",
20517
+ "gpt-6-luna",
20518
+ "gpt-6-sol",
20519
+ "gpt-5.6-luna",
20520
+ "gpt-5.6-terra",
20521
+ "gpt-5.6-sol",
20522
+ "gpt-6-astra"
20523
+ ];
20459
20524
  case "claude":
20460
20525
  return ["claude", "\uD074\uB85C\uB4DC", "sonnet", "opus", "fable"];
20461
20526
  case "maestro":
@@ -21130,4 +21195,4 @@ export {
21130
21195
  DEFAULT_SELF_CONFIG_PRODUCT
21131
21196
  };
21132
21197
 
21133
- //# debugId=BACEE10AB360A31A64756E2164756E21
21198
+ //# debugId=BFEE1EFD11C7696664756E2164756E21