openfox 2.0.118 → 2.0.120

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 (57) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/CHANGELOG.md +34 -0
  3. package/dist/agent-defaults/code-reviewer.agent.md +8 -3
  4. package/dist/{auto-config-AAUO4PKW.js → auto-config-YXNCBYEY.js} +125 -11
  5. package/dist/{chat-handler-KNBP6WVI.js → chat-handler-TIR5CMWE.js} +12 -11
  6. package/dist/{chunk-RXIDGWNV.js → chunk-54FTLSWS.js} +102 -55
  7. package/dist/{chunk-CIYA6BNB.js → chunk-A5JAVQKG.js} +2 -2
  8. package/dist/{chunk-HZSKKJHQ.js → chunk-AS7KAH66.js} +28 -9
  9. package/dist/{chunk-5ZR5O5GC.js → chunk-CYXAMXN5.js} +4 -4
  10. package/dist/{chunk-W7VIYHPQ.js → chunk-GJL3QSMP.js} +3 -2
  11. package/dist/{chunk-CX7UJZA5.js → chunk-HWHWXLM5.js} +4 -4
  12. package/dist/{chunk-NP2SV2CX.js → chunk-IQFPRQWM.js} +10 -4
  13. package/dist/{chunk-5E5G3DLI.js → chunk-IW46BUOP.js} +3 -3
  14. package/dist/{chunk-45OS4H3L.js → chunk-JDBIR2J7.js} +7 -7
  15. package/dist/{chunk-IDUXGSQV.js → chunk-JDWJ2PJJ.js} +16 -12
  16. package/dist/chunk-K2QKX4ZJ.js +31 -0
  17. package/dist/{chunk-MKWS7TQH.js → chunk-KFQKBXLO.js} +22 -16
  18. package/dist/{chunk-TOKQ2UVG.js → chunk-MIPQOHWS.js} +20 -6
  19. package/dist/{chunk-Y6WWEQPC.js → chunk-PI4X3Y6H.js} +11 -11
  20. package/dist/chunk-PXEWE5YP.js +7 -0
  21. package/dist/{chunk-MTFLMNLN.js → chunk-USNG72WA.js} +2 -2
  22. package/dist/{chunk-GZTMCTUS.js → chunk-WN76RDRU.js} +18 -22
  23. package/dist/cli/dev.js +1 -1
  24. package/dist/cli/index.js +1 -1
  25. package/dist/{client-KCNTDTIR.js → client-GXRHODRQ.js} +4 -4
  26. package/dist/{client-pure-B5DHEKQJ.js → client-pure-QSY7TJGK.js} +2 -2
  27. package/dist/{compactor-5ATICQ2A.js → compactor-TI352G7B.js} +5 -5
  28. package/dist/{dynamic-context-4SKLIPJ4.js → dynamic-context-C6HGUQTR.js} +2 -2
  29. package/dist/{launch-Q6GUJ22H.js → launch-SRSMTDEM.js} +12 -11
  30. package/dist/{orchestrator-DVCGWWNA.js → orchestrator-SCH2T4JB.js} +11 -10
  31. package/dist/package.json +1 -1
  32. package/dist/{processor-G6UJGA2K.js → processor-GM4D26E6.js} +11 -10
  33. package/dist/{profiles-GYHXBWPV.js → profiles-3YLLEJ2B.js} +2 -2
  34. package/dist/{protocol-DzJrspsl.d.ts → protocol-D5kJLGWy.d.ts} +1 -1
  35. package/dist/provider/index.d.ts +4 -4
  36. package/dist/{provider-Q7J4UFTS.js → provider-5V6RDVU2.js} +6 -5
  37. package/dist/{provider-manager-TMBO4DFG.js → provider-manager-7QD5HAOL.js} +6 -5
  38. package/dist/{serve-23YIIMXH.js → serve-M7I3HWVQ.js} +17 -16
  39. package/dist/server/index.d.ts +22 -5
  40. package/dist/server/index.js +16 -15
  41. package/dist/{server-IDXIAC5L.js → server-F72WN4KP.js} +15 -14
  42. package/dist/{service-M7XJHAK4.js → service-A3YLLXW3.js} +7 -6
  43. package/dist/session-status-6Q5B5PEN.js +35 -0
  44. package/dist/shared/index.d.ts +3 -3
  45. package/dist/{tasks-X5H5HM4J.js → tasks-X5U7DWZR.js} +9 -7
  46. package/dist/{tools-GOGLGTNV.js → tools-GCBDO7TU.js} +9 -8
  47. package/dist/{types-CIVhQMvD.d.ts → types-B5CI_Ql3.d.ts} +3 -1
  48. package/dist/{types-Df7NM9b5.d.ts → types-CZlj7ufS.d.ts} +2 -0
  49. package/dist/{update-T3YMIWQO.js → update-TUGN3JJE.js} +2 -2
  50. package/dist/web/assets/index-BlYcAqzD.js +324 -0
  51. package/dist/web/assets/{index-XTp1QlHA.css → index-D9sfxcRH.css} +1 -1
  52. package/dist/web/index.html +2 -2
  53. package/dist/web/sw.js +1 -1
  54. package/dist/workflow-defaults/default.workflow.json +1 -1
  55. package/package.json +1 -1
  56. package/dist/chunk-BSULZIPW.js +0 -7
  57. package/dist/web/assets/index-BgENxR9h.js +0 -324
@@ -16,10 +16,10 @@ import {
16
16
  terminalManager,
17
17
  tokenFromPassword,
18
18
  verifyPassword
19
- } from "./chunk-Y6WWEQPC.js";
19
+ } from "./chunk-PI4X3Y6H.js";
20
20
  import {
21
21
  TEMPLATE_VARIABLES
22
- } from "./chunk-45OS4H3L.js";
22
+ } from "./chunk-JDBIR2J7.js";
23
23
  import {
24
24
  createToolRegistry,
25
25
  devServerManager,
@@ -29,7 +29,7 @@ import {
29
29
  setMcpManagerForTools,
30
30
  setMcpTools,
31
31
  setNotifyMcpServersChanged
32
- } from "./chunk-IDUXGSQV.js";
32
+ } from "./chunk-JDWJ2PJJ.js";
33
33
  import {
34
34
  deleteOwnedSkill,
35
35
  deleteProjectSkill,
@@ -102,7 +102,7 @@ import {
102
102
  saveWorkflow,
103
103
  saveWorkflowToProject,
104
104
  workflowExists
105
- } from "./chunk-HZSKKJHQ.js";
105
+ } from "./chunk-AS7KAH66.js";
106
106
  import {
107
107
  getSessionDisabledServers,
108
108
  setSessionDisabledServers
@@ -167,7 +167,7 @@ import {
167
167
  } from "./chunk-JLAR2CMV.js";
168
168
  import {
169
169
  VERSION
170
- } from "./chunk-BSULZIPW.js";
170
+ } from "./chunk-PXEWE5YP.js";
171
171
  import {
172
172
  agentExists,
173
173
  deleteAgent,
@@ -199,10 +199,10 @@ import {
199
199
  detectModel,
200
200
  getLlmStatus,
201
201
  parseDefaultModelSelection
202
- } from "./chunk-GZTMCTUS.js";
202
+ } from "./chunk-WN76RDRU.js";
203
203
  import {
204
204
  getModelProfile
205
- } from "./chunk-W7VIYHPQ.js";
205
+ } from "./chunk-GJL3QSMP.js";
206
206
  import {
207
207
  getBackendDisplayName
208
208
  } from "./chunk-AZHWLLPP.js";
@@ -2799,9 +2799,45 @@ var SessionManager = class {
2799
2799
  if (!model || !providerId) return void 0;
2800
2800
  return this.providerManager.getModelSettings(providerId, model);
2801
2801
  }
2802
- getCurrentModelContext() {
2802
+ getCurrentModelContext(sessionId) {
2803
+ if (sessionId) {
2804
+ const sessionContext = this.getSessionModelContext(sessionId);
2805
+ if (sessionContext !== void 0) return sessionContext;
2806
+ }
2803
2807
  return this.providerManager.getCurrentModelContext();
2804
2808
  }
2809
+ /**
2810
+ * Resolve the context window for a session's own provider/model, if set.
2811
+ * Exact match first, then fuzzy match (spaces/dashes/underscores variations).
2812
+ * Returns undefined when the session has no model or no matching config —
2813
+ * callers fall back to the global default context.
2814
+ */
2815
+ getSessionModelContext(sessionId) {
2816
+ const session = this.getSession(sessionId);
2817
+ if (!session?.providerId || !session.providerModel) return void 0;
2818
+ return this.resolveModelContext(session.providerId, session.providerModel);
2819
+ }
2820
+ /**
2821
+ * Resolve a provider/model pair's context window (exact, then fuzzy match).
2822
+ * Takes provider/model directly so callers with a raw DB session (e.g.
2823
+ * buildSessionFromDb) can use it without going through getSession, which
2824
+ * would recurse back into this class's session building.
2825
+ */
2826
+ resolveModelContext(providerId, providerModel) {
2827
+ if (!providerId || !providerModel) return void 0;
2828
+ const provider = this.providerManager.getProviders().find((p) => p.id === providerId);
2829
+ if (!provider) return void 0;
2830
+ let modelConfig = provider.models.find((m) => m.id === providerModel);
2831
+ if (!modelConfig) {
2832
+ const normalize = (s) => s.toLowerCase().replace(/[-_\s]+/g, "");
2833
+ const sessionModelNormalized = normalize(providerModel);
2834
+ modelConfig = provider.models.find((m) => {
2835
+ const modelIdNormalized = normalize(m.id);
2836
+ return modelIdNormalized === sessionModelNormalized || modelIdNormalized.includes(sessionModelNormalized) || sessionModelNormalized.includes(modelIdNormalized);
2837
+ });
2838
+ }
2839
+ return modelConfig?.contextWindow;
2840
+ }
2805
2841
  getModelCompactionThreshold(sessionId) {
2806
2842
  const session = this.getSession(sessionId);
2807
2843
  const providerId = session?.providerId ?? this.providerManager.getActiveProviderId();
@@ -3447,11 +3483,12 @@ var SessionManager = class {
3447
3483
  * Stores promptTokens + completionTokens so the tracked size reflects the
3448
3484
  * true context occupancy — the last call's output is re-fed into the next
3449
3485
  * request as an assistant message, so it must count toward the budget.
3450
- * maxTokens comes from providerManager.getCurrentModelContext() - the currently selected model's limit.
3486
+ * maxTokens comes from the session model's context window (falling back to
3487
+ * the currently selected model's limit).
3451
3488
  */
3452
3489
  setCurrentContextSize(sessionId, promptTokens, completionTokens = 0, subAgentId) {
3453
- const state = getSessionState(sessionId, this.providerManager.getCurrentModelContext());
3454
- const maxTokens = this.providerManager.getCurrentModelContext();
3490
+ const state = getSessionState(sessionId, this.getCurrentModelContext(sessionId));
3491
+ const maxTokens = this.getCurrentModelContext(sessionId);
3455
3492
  const currentTokens = promptTokens + completionTokens;
3456
3493
  const compactionCount = state?.contextState.compactionCount ?? 0;
3457
3494
  const dynamicContextChanged = this.getDynamicContextChanged(sessionId);
@@ -3727,27 +3764,7 @@ var SessionManager = class {
3727
3764
  getContextState(sessionId) {
3728
3765
  const session = this.getSession(sessionId);
3729
3766
  const providerManager = this.providerManager;
3730
- let maxTokens;
3731
- if (session?.providerId && session.providerModel) {
3732
- const providers = providerManager.getProviders();
3733
- const provider = providers.find((p) => p.id === session.providerId);
3734
- if (provider) {
3735
- let modelConfig = provider.models.find((m) => m.id === session.providerModel);
3736
- if (!modelConfig && session.providerModel) {
3737
- const normalize = (s) => s.toLowerCase().replace(/[-_\s]+/g, "");
3738
- const sessionModelNormalized = normalize(session.providerModel);
3739
- modelConfig = provider.models.find((m) => {
3740
- const modelIdNormalized = normalize(m.id);
3741
- return modelIdNormalized === sessionModelNormalized || modelIdNormalized.includes(sessionModelNormalized) || sessionModelNormalized.includes(modelIdNormalized);
3742
- });
3743
- }
3744
- maxTokens = modelConfig?.contextWindow ?? providerManager.getCurrentModelContext();
3745
- } else {
3746
- maxTokens = providerManager.getCurrentModelContext();
3747
- }
3748
- } else {
3749
- maxTokens = providerManager.getCurrentModelContext();
3750
- }
3767
+ const maxTokens = session?.providerId && session.providerModel ? this.getSessionModelContext(sessionId) ?? providerManager.getCurrentModelContext() : providerManager.getCurrentModelContext();
3751
3768
  const state = getSessionState(sessionId, maxTokens);
3752
3769
  const dynamicContextChanged = this.getDynamicContextChanged(sessionId);
3753
3770
  const debugDump = this.debugDumpStore.get(sessionId);
@@ -4016,7 +4033,7 @@ All file and git operations should use this directory.
4016
4033
  * Build a full Session object from DB session + EventStore state
4017
4034
  */
4018
4035
  buildSessionFromDb(dbSession) {
4019
- const maxTokens = this.providerManager.getCurrentModelContext();
4036
+ const maxTokens = this.resolveModelContext(dbSession.providerId, dbSession.providerModel) ?? this.providerManager.getCurrentModelContext();
4020
4037
  const eventState = getSessionState(dbSession.id, maxTokens, dbSession.mode);
4021
4038
  if (!eventState) {
4022
4039
  return {
@@ -5947,7 +5964,7 @@ async function createServerHandle(config3) {
5947
5964
  toolRegistry = createToolRegistry();
5948
5965
  logger.info("MCP tools registered", { count: mcpTools.length });
5949
5966
  }
5950
- const { signalMcpReady } = await import("./server-IDXIAC5L.js");
5967
+ const { signalMcpReady } = await import("./server-F72WN4KP.js");
5951
5968
  signalMcpReady();
5952
5969
  });
5953
5970
  const app = express();
@@ -6143,9 +6160,9 @@ async function createServerHandle(config3) {
6143
6160
  const sessionFavoriteRouter = express.Router();
6144
6161
  registerSessionFavoriteRoute(sessionFavoriteRouter, sessionManager);
6145
6162
  app.use("/api", sessionFavoriteRouter);
6146
- const { createTasksService } = await import("./service-M7XJHAK4.js");
6147
- const { registerTaskRoutes } = await import("./tasks-X5H5HM4J.js");
6148
- const { setTasksService } = await import("./tools-GOGLGTNV.js");
6163
+ const { createTasksService } = await import("./service-A3YLLXW3.js");
6164
+ const { registerTaskRoutes } = await import("./tasks-X5U7DWZR.js");
6165
+ const { setTasksService } = await import("./tools-GCBDO7TU.js");
6149
6166
  const tasksService = createTasksService({
6150
6167
  sessionManager,
6151
6168
  config: config3,
@@ -6474,7 +6491,7 @@ All file and git operations should use this branch.
6474
6491
  app.get("/api/sessions/:id", async (req, res) => {
6475
6492
  const { getEventStore: getEventStore2, combineEventsWithSnapshot } = await import("./events-KDFMBVP5.js");
6476
6493
  const { buildMessagesFromStoredEvents, foldPendingConfirmations } = await import("./folding-RTGU63BW.js");
6477
- const { getPendingQuestionsForSession } = await import("./tools-GOGLGTNV.js");
6494
+ const { getPendingQuestionsForSession } = await import("./tools-GCBDO7TU.js");
6478
6495
  const { getMaxVisibleItems } = await import("./settings-FGXQHKUH.js");
6479
6496
  const { getAgentModelOverride: getAgentModelOverride2 } = await import("./model-overrides-7F2EOA4U.js");
6480
6497
  const { updateSessionProvider: updateSessionProvider2 } = await import("./sessions-I7ELDIIP.js");
@@ -6510,14 +6527,42 @@ All file and git operations should use this branch.
6510
6527
  activeWorkflowExecution
6511
6528
  });
6512
6529
  });
6530
+ app.get("/api/sessions/:id/status", async (req, res) => {
6531
+ const { projectSessionStatus } = await import("./session-status-6Q5B5PEN.js");
6532
+ const { getPendingQuestionsForSession } = await import("./tools-GCBDO7TU.js");
6533
+ const { getEventStore: getEventStore2, combineEventsWithSnapshot } = await import("./events-KDFMBVP5.js");
6534
+ const { foldPendingConfirmations } = await import("./folding-RTGU63BW.js");
6535
+ const sessionId = req.params["id"];
6536
+ if (!sessionId) {
6537
+ return res.status(400).json({ error: "Session id is required" });
6538
+ }
6539
+ const session = sessionManager.getSession(sessionId);
6540
+ if (!session) {
6541
+ return res.status(404).json({ error: "Session not found" });
6542
+ }
6543
+ const activeWorkflowExecution = sessionManager.getActiveWorkflowExecution(sessionId);
6544
+ const activeWorkflowStepName = activeWorkflowExecution?.currentStepName ?? null;
6545
+ const pendingQuestions = getPendingQuestionsForSession(sessionId);
6546
+ const eventStore = getEventStore2();
6547
+ const { snapshot, events: eventsSinceSnapshot } = eventStore.getEventsSinceSnapshot(sessionId);
6548
+ const events = combineEventsWithSnapshot(sessionId, snapshot, eventsSinceSnapshot);
6549
+ const pendingConfirmations = foldPendingConfirmations(events);
6550
+ const status = projectSessionStatus({
6551
+ session,
6552
+ pendingQuestionsCount: pendingQuestions.length,
6553
+ pendingConfirmationsCount: pendingConfirmations.length,
6554
+ activeWorkflowStepName
6555
+ });
6556
+ res.json(status);
6557
+ });
6513
6558
  app.delete("/api/sessions/:id", async (req, res) => {
6514
6559
  const sessionId = req.params["id"];
6515
6560
  const session = sessionManager.getSession(sessionId);
6516
6561
  if (!session) {
6517
6562
  return res.status(404).json({ error: "Session not found" });
6518
6563
  }
6519
- const { stopSessionExecution } = await import("./chat-handler-KNBP6WVI.js");
6520
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-GOGLGTNV.js");
6564
+ const { stopSessionExecution } = await import("./chat-handler-TIR5CMWE.js");
6565
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-GCBDO7TU.js");
6521
6566
  sessionManager.clearMessageQueue(sessionId);
6522
6567
  stopSessionExecution(sessionId, sessionManager);
6523
6568
  abortSession(sessionId);
@@ -6767,7 +6812,7 @@ All file and git operations should use this branch.
6767
6812
  if (alwaysAllow !== void 0 && typeof alwaysAllow !== "boolean") {
6768
6813
  return res.status(400).json({ error: "alwaysAllow must be a boolean if provided" });
6769
6814
  }
6770
- const { providePathConfirmation, getConfirmationSessionId } = await import("./tools-GOGLGTNV.js");
6815
+ const { providePathConfirmation, getConfirmationSessionId } = await import("./tools-GCBDO7TU.js");
6771
6816
  const pendingSessionId = getConfirmationSessionId(callId);
6772
6817
  if (!pendingSessionId) {
6773
6818
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
@@ -6782,7 +6827,7 @@ All file and git operations should use this branch.
6782
6827
  const { getEventStore: getEventStore2, combineEventsWithSnapshot: combineEvents } = await import("./events-KDFMBVP5.js");
6783
6828
  const { buildMessagesFromStoredEvents, foldPendingConfirmations } = await import("./folding-RTGU63BW.js");
6784
6829
  const { createSessionStateMessage } = await import("./protocol-TLODRZSB.js");
6785
- const { getPendingQuestionsForSession } = await import("./tools-GOGLGTNV.js");
6830
+ const { getPendingQuestionsForSession } = await import("./tools-GCBDO7TU.js");
6786
6831
  const { getMaxVisibleItems } = await import("./settings-FGXQHKUH.js");
6787
6832
  const eventStore = getEventStore2();
6788
6833
  const { snapshot, events: eventsSinceSnapshot } = eventStore.getEventsSinceSnapshot(sessionId);
@@ -6820,7 +6865,7 @@ All file and git operations should use this branch.
6820
6865
  if (!skip && typeof answer !== "string") {
6821
6866
  return res.status(400).json({ error: "answer is required when not skipping" });
6822
6867
  }
6823
- const { provideAnswer } = await import("./tools-GOGLGTNV.js");
6868
+ const { provideAnswer } = await import("./tools-GCBDO7TU.js");
6824
6869
  const found = provideAnswer(callId, answer ?? "", skip ?? false);
6825
6870
  if (!found) {
6826
6871
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -6885,7 +6930,7 @@ All file and git operations should use this branch.
6885
6930
  backend: activeProvider?.backend ?? llmClient.getBackend(),
6886
6931
  model: llmClient.getModel()
6887
6932
  };
6888
- const { runAgentTurn, TurnMetrics } = await import("./orchestrator-DVCGWWNA.js");
6933
+ const { runAgentTurn, TurnMetrics } = await import("./orchestrator-SCH2T4JB.js");
6889
6934
  runAgentTurn(
6890
6935
  {
6891
6936
  sessionManager,
@@ -6923,8 +6968,8 @@ All file and git operations should use this branch.
6923
6968
  if (!session) {
6924
6969
  return res.status(404).json({ error: "Session not found" });
6925
6970
  }
6926
- const { stopSessionExecution } = await import("./chat-handler-KNBP6WVI.js");
6927
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-GOGLGTNV.js");
6971
+ const { stopSessionExecution } = await import("./chat-handler-TIR5CMWE.js");
6972
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-GCBDO7TU.js");
6928
6973
  const queuedMessages = sessionManager.getQueueState(sessionId);
6929
6974
  sessionManager.clearMessageQueue(sessionId);
6930
6975
  stopSessionExecution(sessionId, sessionManager);
@@ -7173,6 +7218,7 @@ All file and git operations should use this branch.
7173
7218
  ...m.nonThinkingExtraKwargs !== void 0 && { nonThinkingExtraKwargs: m.nonThinkingExtraKwargs },
7174
7219
  ...m.thinkingQueryParams !== void 0 && { thinkingQueryParams: m.thinkingQueryParams },
7175
7220
  ...m.nonThinkingQueryParams !== void 0 && { nonThinkingQueryParams: m.nonThinkingQueryParams },
7221
+ ...m.omitParams !== void 0 && { omitParams: m.omitParams },
7176
7222
  ...m.temperature !== void 0 && { temperature: m.temperature },
7177
7223
  ...m.topP !== void 0 && { topP: m.topP },
7178
7224
  ...m.topK !== void 0 && { topK: m.topK },
@@ -7301,8 +7347,8 @@ All file and git operations should use this branch.
7301
7347
  const backend = req.query["backend"];
7302
7348
  if (!url) return res.status(400).json({ error: "url is required" });
7303
7349
  try {
7304
- const { fetchModelsWithContext } = await import("./provider-manager-TMBO4DFG.js");
7305
- const { getModelProfile: getModelProfile2 } = await import("./profiles-GYHXBWPV.js");
7350
+ const { fetchModelsWithContext } = await import("./provider-manager-7QD5HAOL.js");
7351
+ const { getModelProfile: getModelProfile2 } = await import("./profiles-3YLLEJ2B.js");
7306
7352
  const models = await fetchModelsWithContext(
7307
7353
  url,
7308
7354
  apiKey,
@@ -7337,7 +7383,7 @@ All file and git operations should use this branch.
7337
7383
  if (!url) return res.status(400).json({ error: "url is required" });
7338
7384
  if (!models?.length) return res.status(400).json({ error: "models is required" });
7339
7385
  try {
7340
- const { autoConfig } = await import("./auto-config-AAUO4PKW.js");
7386
+ const { autoConfig } = await import("./auto-config-YXNCBYEY.js");
7341
7387
  const result = await autoConfig({
7342
7388
  url,
7343
7389
  ...apiKey ? { apiKey } : {},
@@ -7369,9 +7415,9 @@ All file and git operations should use this branch.
7369
7415
  });
7370
7416
  return res.json({ success: true, message: { content: response2.content }, raw: response2 });
7371
7417
  }
7372
- const { getModelProfile: getModelProfile2 } = await import("./profiles-GYHXBWPV.js");
7418
+ const { getModelProfile: getModelProfile2 } = await import("./profiles-3YLLEJ2B.js");
7373
7419
  const { getBackendCapabilities } = await import("./backend-67OLCS5O.js");
7374
- const { buildNonStreamingCreateParams } = await import("./client-pure-B5DHEKQJ.js");
7420
+ const { buildNonStreamingCreateParams } = await import("./client-pure-QSY7TJGK.js");
7375
7421
  const { OpenAIHttpClient } = await import("./http-client-IPUW2MSW.js");
7376
7422
  const { ensureVersionPrefix } = await import("./url-utils-C5BM7NF7.js");
7377
7423
  const profile = getModelProfile2(model);
@@ -7382,6 +7428,7 @@ All file and git operations should use this branch.
7382
7428
  if (modelConfig?.topK !== void 0) modelSettings["topK"] = modelConfig.topK;
7383
7429
  if (modelConfig?.maxTokens !== void 0) modelSettings["maxTokens"] = modelConfig.maxTokens;
7384
7430
  if (modelConfig?.supportsVision !== void 0) modelSettings["supportsVision"] = modelConfig.supportsVision;
7431
+ if (modelConfig?.omitParams !== void 0) modelSettings["omitParams"] = modelConfig.omitParams;
7385
7432
  const rawQP = mode === "thinking" ? modelConfig?.thinkingQueryParams : modelConfig?.nonThinkingQueryParams;
7386
7433
  if (rawQP) {
7387
7434
  modelSettings["queryParams"] = JSON.parse(rawQP);
@@ -7724,7 +7771,7 @@ All file and git operations should use this branch.
7724
7771
  });
7725
7772
  async function rebuildMcpTools() {
7726
7773
  const { createMcpTools: createMcpTools2 } = await import("./tool-adapter-FJAFLDZA.js");
7727
- const { setMcpTools: setMcpTools2 } = await import("./tools-GOGLGTNV.js");
7774
+ const { setMcpTools: setMcpTools2 } = await import("./tools-GCBDO7TU.js");
7728
7775
  const mcpTools = createMcpTools2(mcpManager);
7729
7776
  setMcpTools2(mcpTools);
7730
7777
  toolRegistry = createToolRegistry();
@@ -8278,7 +8325,7 @@ All file and git operations should use this branch.
8278
8325
  );
8279
8326
  const wss = wssExports.wss;
8280
8327
  deferTasksBroadcast = (projectId, payload) => wssExports.broadcastForProject(projectId, "", { type: "tasks.update", payload });
8281
- const { launchWorkflowRun, abortRunnerRun } = await import("./launch-Q6GUJ22H.js");
8328
+ const { launchWorkflowRun, abortRunnerRun } = await import("./launch-SRSMTDEM.js");
8282
8329
  deferTasksLaunchWorkflow = (sessionId, launch) => {
8283
8330
  const session = sessionManager.getSession(sessionId);
8284
8331
  let llmClient = getLLMClient();
@@ -8316,7 +8363,7 @@ All file and git operations should use this branch.
8316
8363
  const state = sessionManager.getContextState(sessionId);
8317
8364
  wssExports.broadcastForSession(sessionId, createContextStateMessage(state));
8318
8365
  });
8319
- const { QueueProcessor } = await import("./processor-G6UJGA2K.js");
8366
+ const { QueueProcessor } = await import("./processor-GM4D26E6.js");
8320
8367
  const queueProcessor = new QueueProcessor({
8321
8368
  sessionManager,
8322
8369
  providerManager,
@@ -8402,4 +8449,4 @@ export {
8402
8449
  createServerHandle,
8403
8450
  createServer
8404
8451
  };
8405
- //# sourceMappingURL=chunk-RXIDGWNV.js.map
8452
+ //# sourceMappingURL=chunk-54FTLSWS.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createMessageStartEvent
3
- } from "./chunk-NP2SV2CX.js";
3
+ } from "./chunk-IQFPRQWM.js";
4
4
  import {
5
5
  COMPACTION_PROMPT
6
6
  } from "./chunk-27NABDXB.js";
@@ -36,4 +36,4 @@ export {
36
36
  COMPACTION_MAX_RATIO,
37
37
  shouldCompact
38
38
  };
39
- //# sourceMappingURL=chunk-CIYA6BNB.js.map
39
+ //# sourceMappingURL=chunk-A5JAVQKG.js.map
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-3PG65AXG.js";
12
12
  import {
13
13
  parseDefaultModelSelection
14
- } from "./chunk-GZTMCTUS.js";
14
+ } from "./chunk-WN76RDRU.js";
15
15
  import {
16
16
  getDatabase
17
17
  } from "./chunk-5PT4UMRR.js";
@@ -677,6 +677,12 @@ function createTasksService(deps) {
677
677
  ...autoLaunched ? { autoLaunched } : {}
678
678
  });
679
679
  }
680
+ function reusableTarget(projectId, sessionId) {
681
+ if (!sessionId) return void 0;
682
+ const session = sessionManager.getSession(sessionId);
683
+ if (!session || session.projectId !== projectId || session.messages.length > 0) return void 0;
684
+ return sessionId;
685
+ }
680
686
  function list(projectId) {
681
687
  return listTasks(projectId);
682
688
  }
@@ -787,12 +793,14 @@ function createTasksService(deps) {
787
793
  const launched = runningCount < settings.slotLimit && !settings.queuePaused;
788
794
  setTaskRunState(taskId, launched ? "running" : "queued");
789
795
  if (launched) {
790
- const seeded = await seedSession(projectId, task, from);
796
+ const seeded = await seedSession(projectId, task, from, reusableTarget(projectId, opts.sessionId));
791
797
  addTaskLink(taskId, seeded.session.id, true);
792
798
  addAuditEntry(taskId, "human", "move", `Moved to In Progress (running)`, opts.actorName);
793
799
  sessionId = seeded.session.id;
794
800
  } else {
795
801
  appendToBottom(taskId, "in_progress");
802
+ const earmarked = reusableTarget(projectId, opts.sessionId);
803
+ if (earmarked) addTaskLink(taskId, earmarked, false);
796
804
  addAuditEntry(taskId, "human", "move", `Moved to In Progress (queued)`, opts.actorName);
797
805
  }
798
806
  }
@@ -905,11 +913,20 @@ function createTasksService(deps) {
905
913
  function activeCount(projectId) {
906
914
  return listTasks(projectId).filter((t) => t.status === "in_progress" && t.runState === "running").length;
907
915
  }
908
- async function seedSession(projectId, task, from) {
909
- const defaults = parseDefaultModelSelection(config.defaultModelSelection);
910
- const providerId = task.providerId ?? defaults.providerId ?? null;
911
- const model = task.model ?? defaults.model ?? null;
912
- const session = sessionManager.createSession(projectId, void 0, providerId, model);
916
+ async function seedSession(projectId, task, from, targetSessionId) {
917
+ let session;
918
+ if (targetSessionId) {
919
+ const existing = sessionManager.getSession(targetSessionId);
920
+ if (!existing) {
921
+ return seedSession(projectId, task, from);
922
+ }
923
+ session = existing;
924
+ } else {
925
+ const defaults = parseDefaultModelSelection(config.defaultModelSelection);
926
+ const providerId = task.providerId ?? defaults.providerId ?? null;
927
+ const model = task.model ?? defaults.model ?? null;
928
+ session = sessionManager.createSession(projectId, void 0, providerId, model);
929
+ }
913
930
  if (task.agentId) {
914
931
  try {
915
932
  sessionManager.setMode(session.id, task.agentId);
@@ -957,7 +974,9 @@ function createTasksService(deps) {
957
974
  const next = queued[0];
958
975
  if (!next) return void 0;
959
976
  setTaskRunState(next.id, "running");
960
- const seeded = await seedSession(projectId, next, "queued");
977
+ const earmarks = listTaskLinks(next.id);
978
+ const target = reusableTarget(projectId, earmarks[0]?.session_id);
979
+ const seeded = await seedSession(projectId, next, "queued", target);
961
980
  addTaskLink(next.id, seeded.session.id, true);
962
981
  addAuditEntry(next.id, "system", "auto_launch", `Auto-launched into session ${seeded.session.id}`, "system");
963
982
  return {
@@ -1079,4 +1098,4 @@ export {
1079
1098
  isTaskGateError,
1080
1099
  createTasksService
1081
1100
  };
1082
- //# sourceMappingURL=chunk-HZSKKJHQ.js.map
1101
+ //# sourceMappingURL=chunk-AS7KAH66.js.map
@@ -163,7 +163,7 @@ async function runCli(options) {
163
163
  break;
164
164
  }
165
165
  case "provider": {
166
- const { runProviderCommand } = await import("./provider-Q7J4UFTS.js");
166
+ const { runProviderCommand } = await import("./provider-5V6RDVU2.js");
167
167
  const [, subcommand] = positionals;
168
168
  await runProviderCommand(mode, subcommand);
169
169
  break;
@@ -200,7 +200,7 @@ async function runCli(options) {
200
200
  break;
201
201
  }
202
202
  case "update": {
203
- const { runUpdate } = await import("./update-T3YMIWQO.js");
203
+ const { runUpdate } = await import("./update-TUGN3JJE.js");
204
204
  const code = await runUpdate();
205
205
  if (code !== 0) {
206
206
  process.exit(code);
@@ -213,7 +213,7 @@ async function runCli(options) {
213
213
  if (!configExists) {
214
214
  await runNetworkSetup(mode);
215
215
  }
216
- const { runServe } = await import("./serve-23YIIMXH.js");
216
+ const { runServe } = await import("./serve-M7I3HWVQ.js");
217
217
  const serveOptions = { mode };
218
218
  if (values.port) serveOptions.port = parseInt(values.port);
219
219
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -225,4 +225,4 @@ async function runCli(options) {
225
225
  export {
226
226
  runCli
227
227
  };
228
- //# sourceMappingURL=chunk-5ZR5O5GC.js.map
228
+ //# sourceMappingURL=chunk-CYXAMXN5.js.map
@@ -61,7 +61,8 @@ var MODEL_PROFILES = [
61
61
  pattern: "deepseek",
62
62
  profile: {
63
63
  name: "DeepSeek",
64
- temperature: 0.6,
64
+ // Per DeepSeek API docs: default temperature is 1.0
65
+ temperature: 1,
65
66
  topP: 0.95,
66
67
  defaultMaxTokens: 16384,
67
68
  supportsVision: false
@@ -172,4 +173,4 @@ export {
172
173
  getModelProfile,
173
174
  modelSupportsVision
174
175
  };
175
- //# sourceMappingURL=chunk-W7VIYHPQ.js.map
176
+ //# sourceMappingURL=chunk-GJL3QSMP.js.map
@@ -4,12 +4,12 @@ import {
4
4
  getToolRegistryForAgent,
5
5
  processEventsForConversation,
6
6
  runTopLevelAgentLoop
7
- } from "./chunk-IDUXGSQV.js";
7
+ } from "./chunk-JDWJ2PJJ.js";
8
8
  import {
9
9
  buildCachedPrompt,
10
10
  computeDynamicContextHash,
11
11
  getToolFingerprint
12
- } from "./chunk-5E5G3DLI.js";
12
+ } from "./chunk-IW46BUOP.js";
13
13
  import {
14
14
  getAllInstructions,
15
15
  getEnabledSkillMetadata
@@ -18,7 +18,7 @@ import {
18
18
  TurnMetrics,
19
19
  createChatDoneEvent,
20
20
  createMessageStartEvent
21
- } from "./chunk-NP2SV2CX.js";
21
+ } from "./chunk-IQFPRQWM.js";
22
22
  import {
23
23
  buildAgentReminder,
24
24
  buildAgentSmallReminder
@@ -325,4 +325,4 @@ export {
325
325
  runChatTurn,
326
326
  runAgentTurn
327
327
  };
328
- //# sourceMappingURL=chunk-CX7UJZA5.js.map
328
+ //# sourceMappingURL=chunk-HWHWXLM5.js.map
@@ -3,13 +3,13 @@ import {
3
3
  } from "./chunk-J2GP3J3X.js";
4
4
  import {
5
5
  getModelProfile
6
- } from "./chunk-W7VIYHPQ.js";
6
+ } from "./chunk-GJL3QSMP.js";
7
7
  import {
8
8
  getBackendCapabilities
9
9
  } from "./chunk-AZHWLLPP.js";
10
10
  import {
11
11
  buildModelParams
12
- } from "./chunk-TOKQ2UVG.js";
12
+ } from "./chunk-MIPQOHWS.js";
13
13
  import {
14
14
  logger
15
15
  } from "./chunk-K44MW7JJ.js";
@@ -111,7 +111,13 @@ async function* streamLLMPure(options) {
111
111
  const maxTokens = userMaxTokens ?? profile.defaultMaxTokens;
112
112
  const topP = userTopP ?? profile.topP;
113
113
  const topK = userTopK ?? (backend.supportsTopK ? profile.topK : void 0);
114
- const modelParams = buildModelParams({ temperature, topP, topK, maxTokens });
114
+ const modelParams = buildModelParams({
115
+ temperature,
116
+ topP,
117
+ topK,
118
+ maxTokens,
119
+ ...options.modelSettings?.omitParams !== void 0 && { omitParams: options.modelSettings.omitParams }
120
+ });
115
121
  logger.debug("LLM request settings", {
116
122
  model: llmClient.getModel(),
117
123
  profile: profile.name,
@@ -510,4 +516,4 @@ export {
510
516
  createChatDoneEvent,
511
517
  consumeStreamGenerator
512
518
  };
513
- //# sourceMappingURL=chunk-NP2SV2CX.js.map
519
+ //# sourceMappingURL=chunk-IQFPRQWM.js.map
@@ -105,7 +105,7 @@ function resolveAgentDef(sessionManager, sessionId) {
105
105
  }
106
106
  async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName) {
107
107
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
108
- const { getToolRegistryForAgent } = await import("./tools-GOGLGTNV.js");
108
+ const { getToolRegistryForAgent } = await import("./tools-GCBDO7TU.js");
109
109
  const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
110
110
  const toolFingerprint = getToolFingerprint(tools);
111
111
  const allAgents = await loadAllAgentsDefault(sessionManager.getProjectWorkdir(sessionId));
@@ -124,7 +124,7 @@ async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName)
124
124
  async function computeSessionHash(sessionManager, sessionId, modelName) {
125
125
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
126
126
  const agentDef = await resolveAgentDef(sessionManager, sessionId);
127
- const { getToolRegistryForAgent } = await import("./tools-GOGLGTNV.js");
127
+ const { getToolRegistryForAgent } = await import("./tools-GCBDO7TU.js");
128
128
  const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
129
129
  const toolFingerprint = getToolFingerprint(tools);
130
130
  return computeDynamicContextHash(instructionContent, skills, toolFingerprint, modelName);
@@ -148,4 +148,4 @@ export {
148
148
  computeSessionHash,
149
149
  applyDynamicContext
150
150
  };
151
- //# sourceMappingURL=chunk-5E5G3DLI.js.map
151
+ //# sourceMappingURL=chunk-IW46BUOP.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  runAgentTurn
3
- } from "./chunk-CX7UJZA5.js";
3
+ } from "./chunk-HWHWXLM5.js";
4
4
  import {
5
5
  executeSubAgent,
6
6
  getToolRegistryForAgent
7
- } from "./chunk-IDUXGSQV.js";
7
+ } from "./chunk-JDWJ2PJJ.js";
8
8
  import {
9
9
  TurnMetrics,
10
10
  createMessageStartEvent
11
- } from "./chunk-NP2SV2CX.js";
11
+ } from "./chunk-IQFPRQWM.js";
12
12
  import {
13
13
  checkAborted,
14
14
  decodeUtf8,
@@ -27,7 +27,7 @@ import {
27
27
  loadProjectWorkflows,
28
28
  loadUserWorkflows,
29
29
  normalizeWorkflowScope
30
- } from "./chunk-HZSKKJHQ.js";
30
+ } from "./chunk-AS7KAH66.js";
31
31
  import {
32
32
  getCurrentContextWindowId,
33
33
  getEventStore
@@ -67,13 +67,13 @@ import { spawn } from "child_process";
67
67
  function getGitDiffFiles(cwd) {
68
68
  return new Promise((resolve) => {
69
69
  const env = gitSpawnEnv();
70
- const diffProc = spawn("git", ["diff", "--name-status", "HEAD"], {
70
+ const diffProc = spawn("git", ["diff", "--ignore-submodules=none", "--name-status", "HEAD"], {
71
71
  cwd,
72
72
  env,
73
73
  stdio: ["ignore", "pipe", "pipe"],
74
74
  windowsHide: true
75
75
  });
76
- const statusProc = spawn("git", ["status", "--porcelain"], {
76
+ const statusProc = spawn("git", ["status", "--porcelain", "--ignore-submodules=none"], {
77
77
  cwd,
78
78
  env,
79
79
  stdio: ["ignore", "pipe", "pipe"],
@@ -1002,4 +1002,4 @@ export {
1002
1002
  abortRunnerRun,
1003
1003
  launchWorkflowRun
1004
1004
  };
1005
- //# sourceMappingURL=chunk-45OS4H3L.js.map
1005
+ //# sourceMappingURL=chunk-JDBIR2J7.js.map