openfox 1.6.77 → 1.6.78

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 (26) hide show
  1. package/dist/{auto-compaction-GOHNI2R2.js → auto-compaction-AN3U2AD5.js} +5 -5
  2. package/dist/{chat-handler-K2RDXBO6.js → chat-handler-AIBOSHAQ.js} +8 -8
  3. package/dist/{chunk-I7JVS7V5.js → chunk-2IZMUXMP.js} +3 -3
  4. package/dist/{chunk-XSUQDB6R.js → chunk-DKKDNJT7.js} +36 -22
  5. package/dist/{chunk-XKIEDGQF.js → chunk-DL6ZILAF.js} +1 -2
  6. package/dist/{chunk-EBQYRNNU.js → chunk-GLVNO4DS.js} +167 -92
  7. package/dist/{chunk-6SYNGMU4.js → chunk-NWXLRRDD.js} +4 -4
  8. package/dist/{chunk-UVN6AKIO.js → chunk-RJRG2VER.js} +33 -2
  9. package/dist/{chunk-BBC46FN4.js → chunk-TS5XFQ2D.js} +88 -48
  10. package/dist/{chunk-OJBFC6ER.js → chunk-VSYJIPRI.js} +3 -3
  11. package/dist/cli/dev.js +1 -1
  12. package/dist/cli/index.js +1 -1
  13. package/dist/{events-5RIXWI5Y.js → events-ND5GZBT2.js} +7 -5
  14. package/dist/{folding-JNOUTI5Z.js → folding-XIKR6AFM.js} +14 -4
  15. package/dist/{inspect-proxy-Y75AXMRX.js → inspect-proxy-42ZXL2R5.js} +2 -2
  16. package/dist/{orchestrator-TW5II347.js → orchestrator-5BY2MH72.js} +6 -6
  17. package/dist/package.json +1 -1
  18. package/dist/{processor-MZ3QIUED.js → processor-PV446N55.js} +5 -5
  19. package/dist/{serve-FTTLGRAO.js → serve-6ME66XOO.js} +7 -7
  20. package/dist/server/index.js +6 -6
  21. package/dist/{service-D6LC3CAM.js → service-TU4XSXYJ.js} +33 -2
  22. package/dist/{tools-QJ5K5IJP.js → tools-6DXPHBUV.js} +5 -5
  23. package/dist/web/assets/{index-FjLp1t6r.js → index-0igqGWob.js} +49 -49
  24. package/dist/web/index.html +1 -1
  25. package/dist/web/sw.js +1 -1
  26. package/package.json +1 -1
@@ -2,16 +2,16 @@ import {
2
2
  maybeAutoCompactContext,
3
3
  performManualContextCompaction,
4
4
  resolveCompactionStatsIdentity
5
- } from "./chunk-EBQYRNNU.js";
5
+ } from "./chunk-GLVNO4DS.js";
6
6
  import "./chunk-OXI26S7U.js";
7
7
  import "./chunk-CMQCO27Y.js";
8
- import "./chunk-XKIEDGQF.js";
8
+ import "./chunk-DL6ZILAF.js";
9
9
  import "./chunk-PBGOZMVY.js";
10
10
  import "./chunk-VRGRAQDG.js";
11
11
  import "./chunk-CUDAT6SS.js";
12
- import "./chunk-UVN6AKIO.js";
12
+ import "./chunk-RJRG2VER.js";
13
13
  import "./chunk-KIOUKC3Z.js";
14
- import "./chunk-BBC46FN4.js";
14
+ import "./chunk-TS5XFQ2D.js";
15
15
  import "./chunk-STYHKCG7.js";
16
16
  import "./chunk-BJYPTN5S.js";
17
17
  import "./chunk-NDJ6FKSP.js";
@@ -24,4 +24,4 @@ export {
24
24
  performManualContextCompaction,
25
25
  resolveCompactionStatsIdentity
26
26
  };
27
- //# sourceMappingURL=auto-compaction-GOHNI2R2.js.map
27
+ //# sourceMappingURL=auto-compaction-AN3U2AD5.js.map
@@ -5,22 +5,22 @@ import {
5
5
  generateSessionName,
6
6
  getSessionMessageCount,
7
7
  needsNameGenerationCheck
8
- } from "./chunk-I7JVS7V5.js";
8
+ } from "./chunk-2IZMUXMP.js";
9
9
  import {
10
10
  runChatTurn
11
- } from "./chunk-6SYNGMU4.js";
12
- import "./chunk-EBQYRNNU.js";
11
+ } from "./chunk-NWXLRRDD.js";
12
+ import "./chunk-GLVNO4DS.js";
13
13
  import "./chunk-OXI26S7U.js";
14
14
  import "./chunk-CMQCO27Y.js";
15
- import "./chunk-XKIEDGQF.js";
15
+ import "./chunk-DL6ZILAF.js";
16
16
  import "./chunk-PBGOZMVY.js";
17
17
  import "./chunk-VRGRAQDG.js";
18
18
  import "./chunk-CUDAT6SS.js";
19
19
  import {
20
20
  getEventStore
21
- } from "./chunk-UVN6AKIO.js";
21
+ } from "./chunk-RJRG2VER.js";
22
22
  import "./chunk-KIOUKC3Z.js";
23
- import "./chunk-BBC46FN4.js";
23
+ import "./chunk-TS5XFQ2D.js";
24
24
  import {
25
25
  createChatMessageMessage,
26
26
  createPhaseChangedMessage,
@@ -61,7 +61,7 @@ async function startChatSession(sessionId, content, deps, options) {
61
61
  sessionManager.setRunning(sessionId, true);
62
62
  broadcastForSession(sessionId, createSessionRunningMessage(true));
63
63
  try {
64
- const { maybeAutoCompactContext } = await import("./auto-compaction-GOHNI2R2.js");
64
+ const { maybeAutoCompactContext } = await import("./auto-compaction-AN3U2AD5.js");
65
65
  await maybeAutoCompactContext({
66
66
  sessionManager,
67
67
  sessionId,
@@ -172,4 +172,4 @@ export {
172
172
  startChatSession,
173
173
  stopSessionExecution
174
174
  };
175
- //# sourceMappingURL=chat-handler-K2RDXBO6.js.map
175
+ //# sourceMappingURL=chat-handler-AIBOSHAQ.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getEventStore,
3
3
  updateSessionMetadata
4
- } from "./chunk-UVN6AKIO.js";
4
+ } from "./chunk-RJRG2VER.js";
5
5
  import {
6
6
  buildMessagesFromStoredEvents,
7
7
  foldPendingConfirmations
8
- } from "./chunk-BBC46FN4.js";
8
+ } from "./chunk-TS5XFQ2D.js";
9
9
  import {
10
10
  createContextStateMessage,
11
11
  createSessionStateMessage
@@ -143,4 +143,4 @@ export {
143
143
  needsNameGenerationCheck,
144
144
  applyGeneratedSessionName
145
145
  };
146
- //# sourceMappingURL=chunk-I7JVS7V5.js.map
146
+ //# sourceMappingURL=chunk-2IZMUXMP.js.map
@@ -2,7 +2,7 @@ import {
2
2
  createVerifierNudgeConfig,
3
3
  runBuilderTurn,
4
4
  runChatTurn
5
- } from "./chunk-6SYNGMU4.js";
5
+ } from "./chunk-NWXLRRDD.js";
6
6
  import {
7
7
  TurnMetrics,
8
8
  agentExists,
@@ -37,7 +37,7 @@ import {
37
37
  setSkillEnabled,
38
38
  skillExists,
39
39
  spawnShellProcess
40
- } from "./chunk-EBQYRNNU.js";
40
+ } from "./chunk-GLVNO4DS.js";
41
41
  import {
42
42
  getProject
43
43
  } from "./chunk-CMQCO27Y.js";
@@ -87,14 +87,14 @@ import {
87
87
  updateSessionProvider,
88
88
  updateSessionRunning,
89
89
  updateSessionSummary
90
- } from "./chunk-UVN6AKIO.js";
90
+ } from "./chunk-RJRG2VER.js";
91
91
  import {
92
92
  initDatabase
93
93
  } from "./chunk-KIOUKC3Z.js";
94
94
  import {
95
95
  buildMessagesFromStoredEvents,
96
96
  foldPendingConfirmations
97
- } from "./chunk-BBC46FN4.js";
97
+ } from "./chunk-TS5XFQ2D.js";
98
98
  import {
99
99
  createChatErrorMessage,
100
100
  createChatMessageMessage,
@@ -5242,7 +5242,7 @@ function createTerminalRoutes() {
5242
5242
  }
5243
5243
 
5244
5244
  // src/constants.ts
5245
- var VERSION = "1.6.77";
5245
+ var VERSION = "1.6.78";
5246
5246
 
5247
5247
  // src/server/index.ts
5248
5248
  var __dirname2 = dirname5(fileURLToPath4(import.meta.url));
@@ -5404,7 +5404,7 @@ async function createServerHandle(config) {
5404
5404
  res.json({ success: true });
5405
5405
  });
5406
5406
  app.get("/api/sessions", async (req, res) => {
5407
- const { getRecentUserPromptsForSession } = await import("./events-5RIXWI5Y.js");
5407
+ const { getRecentUserPromptsForSession } = await import("./events-ND5GZBT2.js");
5408
5408
  const projectId = req.query["projectId"];
5409
5409
  const limit = Math.min(parseInt(req.query["limit"]) || 20, 100);
5410
5410
  const offset = parseInt(req.query["offset"]) || 0;
@@ -5437,8 +5437,8 @@ async function createServerHandle(config) {
5437
5437
  res.status(201).json({ session });
5438
5438
  });
5439
5439
  app.get("/api/sessions/:id", async (req, res) => {
5440
- const { getEventStore: getEventStore2 } = await import("./events-5RIXWI5Y.js");
5441
- const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2 } = await import("./folding-JNOUTI5Z.js");
5440
+ const { getEventStore: getEventStore2 } = await import("./events-ND5GZBT2.js");
5441
+ const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2 } = await import("./folding-XIKR6AFM.js");
5442
5442
  const session = sessionManager.getSession(req.params.id);
5443
5443
  if (!session) {
5444
5444
  return res.status(404).json({ error: "Session not found" });
@@ -5468,8 +5468,8 @@ async function createServerHandle(config) {
5468
5468
  res.json({ success: true });
5469
5469
  });
5470
5470
  app.post("/api/sessions/:id/provider", async (req, res) => {
5471
- const { getEventStore: getEventStore2 } = await import("./events-5RIXWI5Y.js");
5472
- const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2 } = await import("./folding-JNOUTI5Z.js");
5471
+ const { getEventStore: getEventStore2 } = await import("./events-ND5GZBT2.js");
5472
+ const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2 } = await import("./folding-XIKR6AFM.js");
5473
5473
  const sessionId = req.params.id;
5474
5474
  const session = sessionManager.getSession(sessionId);
5475
5475
  if (!session) {
@@ -5506,8 +5506,8 @@ async function createServerHandle(config) {
5506
5506
  res.json({ success: true });
5507
5507
  });
5508
5508
  app.put("/api/sessions/:id/mode", async (req, res) => {
5509
- const { getEventStore: getEventStore2 } = await import("./events-5RIXWI5Y.js");
5510
- const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2 } = await import("./folding-JNOUTI5Z.js");
5509
+ const { getEventStore: getEventStore2 } = await import("./events-ND5GZBT2.js");
5510
+ const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2 } = await import("./folding-XIKR6AFM.js");
5511
5511
  const sessionId = req.params.id;
5512
5512
  const session = sessionManager.getSession(sessionId);
5513
5513
  if (!session) {
@@ -5559,13 +5559,13 @@ async function createServerHandle(config) {
5559
5559
  if (!callId || approved === void 0) {
5560
5560
  return res.status(400).json({ error: "callId and approved are required" });
5561
5561
  }
5562
- const { providePathConfirmation } = await import("./tools-QJ5K5IJP.js");
5562
+ const { providePathConfirmation } = await import("./tools-6DXPHBUV.js");
5563
5563
  const result = providePathConfirmation(callId, approved, alwaysAllow);
5564
5564
  if (!result.found) {
5565
5565
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
5566
5566
  }
5567
- const { getEventStore: getEventStore2 } = await import("./events-5RIXWI5Y.js");
5568
- const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2, foldPendingConfirmations: foldPendingConfirmations2 } = await import("./folding-JNOUTI5Z.js");
5567
+ const { getEventStore: getEventStore2 } = await import("./events-ND5GZBT2.js");
5568
+ const { buildMessagesFromStoredEvents: buildMessagesFromStoredEvents2, foldPendingConfirmations: foldPendingConfirmations2 } = await import("./folding-XIKR6AFM.js");
5569
5569
  const { createSessionStateMessage: createSessionStateMessage2 } = await import("./protocol-4CTV7OZC.js");
5570
5570
  const eventStore = getEventStore2();
5571
5571
  const events = eventStore.getEvents(sessionId);
@@ -5583,7 +5583,7 @@ async function createServerHandle(config) {
5583
5583
  if (!callId || !answer) {
5584
5584
  return res.status(400).json({ error: "callId and answer are required" });
5585
5585
  }
5586
- const { provideAnswer: provideAnswer2 } = await import("./tools-QJ5K5IJP.js");
5586
+ const { provideAnswer: provideAnswer2 } = await import("./tools-6DXPHBUV.js");
5587
5587
  const found = provideAnswer2(callId, answer);
5588
5588
  if (!found) {
5589
5589
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -5619,17 +5619,31 @@ async function createServerHandle(config) {
5619
5619
  if (!session) {
5620
5620
  return res.status(404).json({ error: "Session not found" });
5621
5621
  }
5622
- const { stopSessionExecution } = await import("./chat-handler-K2RDXBO6.js");
5623
- const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-QJ5K5IJP.js");
5622
+ const { stopSessionExecution } = await import("./chat-handler-AIBOSHAQ.js");
5623
+ const { cancelQuestionsForSession, cancelPathConfirmationsForSession } = await import("./tools-6DXPHBUV.js");
5624
5624
  stopSessionExecution(sessionId, sessionManager);
5625
5625
  abortSession(sessionId);
5626
5626
  cancelQuestionsForSession(sessionId, "Session stopped by user");
5627
5627
  cancelPathConfirmationsForSession(sessionId, "Session stopped by user");
5628
5628
  sessionManager.clearMessageQueue(sessionId);
5629
- const eventStore = (await import("./events-5RIXWI5Y.js")).getEventStore();
5629
+ const eventStore = (await import("./events-ND5GZBT2.js")).getEventStore();
5630
5630
  eventStore.append(sessionId, { type: "running.changed", data: { isRunning: false } });
5631
5631
  res.json({ success: true });
5632
5632
  });
5633
+ app.post("/api/sessions/:id/truncate", async (req, res) => {
5634
+ const sessionId = req.params.id;
5635
+ const session = sessionManager.getSession(sessionId);
5636
+ if (!session) {
5637
+ return res.status(404).json({ error: "Session not found" });
5638
+ }
5639
+ const { messageIndex } = req.body;
5640
+ if (typeof messageIndex !== "number" || messageIndex < 0) {
5641
+ return res.status(400).json({ error: "messageIndex must be a non-negative number" });
5642
+ }
5643
+ const { truncateSessionMessages } = await import("./events-ND5GZBT2.js");
5644
+ truncateSessionMessages(sessionId, messageIndex);
5645
+ res.json({ success: true });
5646
+ });
5633
5647
  app.post("/api/sessions/:id/chat", async (req, res) => {
5634
5648
  const sessionId = req.params.id;
5635
5649
  const session = sessionManager.getSession(sessionId);
@@ -6094,7 +6108,7 @@ async function createServerHandle(config) {
6094
6108
  providerManager
6095
6109
  );
6096
6110
  const wss = wssExports.wss;
6097
- const { QueueProcessor } = await import("./processor-MZ3QIUED.js");
6111
+ const { QueueProcessor } = await import("./processor-PV446N55.js");
6098
6112
  const queueProcessor = new QueueProcessor({
6099
6113
  sessionManager,
6100
6114
  providerManager,
@@ -6132,7 +6146,7 @@ async function createServerHandle(config) {
6132
6146
  logger.info("Shutting down...");
6133
6147
  void (async () => {
6134
6148
  await devServerManager.stopAll();
6135
- const { stopAllInspectProxies } = await import("./inspect-proxy-Y75AXMRX.js");
6149
+ const { stopAllInspectProxies } = await import("./inspect-proxy-42ZXL2R5.js");
6136
6150
  stopAllInspectProxies();
6137
6151
  const { cleanupAllProcesses } = await import("./store-OQ45KONN.js");
6138
6152
  cleanupAllProcesses();
@@ -6169,4 +6183,4 @@ export {
6169
6183
  createServerHandle,
6170
6184
  createServer
6171
6185
  };
6172
- //# sourceMappingURL=chunk-XSUQDB6R.js.map
6186
+ //# sourceMappingURL=chunk-DKKDNJT7.js.map
@@ -155,7 +155,6 @@ ${annotation || "(none)"}`;
155
155
  client.on("error", () => targetSocket.destroy());
156
156
  targetSocket.write(clientHead);
157
157
  targetSocket.pipe(client);
158
- client.pipe(targetSocket);
159
158
  return;
160
159
  }
161
160
  targetSocket = net.connect(targetPort, targetHost);
@@ -294,4 +293,4 @@ export {
294
293
  startInspectProxy,
295
294
  stopAllInspectProxies
296
295
  };
297
- //# sourceMappingURL=chunk-XKIEDGQF.js.map
296
+ //# sourceMappingURL=chunk-DL6ZILAF.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-CMQCO27Y.js";
10
10
  import {
11
11
  startInspectProxy
12
- } from "./chunk-XKIEDGQF.js";
12
+ } from "./chunk-DL6ZILAF.js";
13
13
  import {
14
14
  createProcess,
15
15
  getPlatformShell,
@@ -30,10 +30,18 @@ import {
30
30
  streamWithSegments
31
31
  } from "./chunk-CUDAT6SS.js";
32
32
  import {
33
- getContextMessages,
34
33
  getCurrentContextWindowId,
35
34
  getEventStore
36
- } from "./chunk-UVN6AKIO.js";
35
+ } from "./chunk-RJRG2VER.js";
36
+ import {
37
+ buildContextMessagesFromEventHistory,
38
+ foldContextState,
39
+ handleMessageDelta,
40
+ handleMessageThinking,
41
+ handleToolCall,
42
+ handleToolResult,
43
+ stripOrphanedToolCalls
44
+ } from "./chunk-TS5XFQ2D.js";
37
45
  import {
38
46
  createChatDoneMessage,
39
47
  createChatMessageMessage,
@@ -553,25 +561,6 @@ function computeAggregatedStats(input) {
553
561
  }
554
562
 
555
563
  // src/server/chat/stream-pure.ts
556
- function toStreamMessages(messages) {
557
- return messages.map((m) => ({
558
- role: m.role,
559
- content: m.content,
560
- ...m.thinkingContent ? { thinkingContent: m.thinkingContent } : {},
561
- ...m.toolCalls?.length ? { toolCalls: m.toolCalls.map((tc) => ({ id: tc.id, name: tc.name, arguments: tc.arguments })) } : {},
562
- ...m.toolCallId ? { toolCallId: m.toolCallId } : {},
563
- ...m.attachments?.length ? { attachments: m.attachments } : {}
564
- }));
565
- }
566
- function createAssistantMessage(content, thinkingContent, toolCalls) {
567
- return {
568
- role: "assistant",
569
- content,
570
- source: "history",
571
- ...thinkingContent ? { thinkingContent } : {},
572
- ...toolCalls.length > 0 ? { toolCalls } : {}
573
- };
574
- }
575
564
  function createEmptyStreamResult(aborted, xmlFormatError, modelParams) {
576
565
  return {
577
566
  content: "",
@@ -2830,6 +2819,111 @@ async function deleteSkill(configDir, skillId) {
2830
2819
 
2831
2820
  // src/server/chat/agent-loop.ts
2832
2821
  import stripAnsi from "strip-ansi";
2822
+
2823
+ // src/server/chat/conversation-history.ts
2824
+ function buildContextMessages(events, scope) {
2825
+ if (scope.type === "toplevel") {
2826
+ return buildTopLevelContextMessages(events, scope);
2827
+ }
2828
+ return buildSubAgentContextMessages(events, scope);
2829
+ }
2830
+ function buildTopLevelContextMessages(events, scope) {
2831
+ const includeVerifier = scope.includeVerifier ?? true;
2832
+ const currentWindowId = foldContextState(events, "").currentContextWindowId;
2833
+ if (!currentWindowId) return [];
2834
+ return buildContextMessagesFromEventHistory(events, currentWindowId, { includeVerifier });
2835
+ }
2836
+ function buildSubAgentContextMessages(events, scope) {
2837
+ const { subAgentId } = scope;
2838
+ const messages = [];
2839
+ const messageMap = /* @__PURE__ */ new Map();
2840
+ const fulfilledToolCallIds = /* @__PURE__ */ new Set();
2841
+ let compactionSummaryIndex = -1;
2842
+ for (let i = events.length - 1; i >= 0; i--) {
2843
+ const event = events[i];
2844
+ if (event.type === "context.compacted") {
2845
+ const data = event.data;
2846
+ if (data.subAgentId === subAgentId) {
2847
+ compactionSummaryIndex = i;
2848
+ break;
2849
+ }
2850
+ }
2851
+ }
2852
+ const startIdx = compactionSummaryIndex >= 0 ? compactionSummaryIndex : 0;
2853
+ for (let i = startIdx; i < events.length; i++) {
2854
+ const event = events[i];
2855
+ switch (event.type) {
2856
+ case "message.start": {
2857
+ const data = event.data;
2858
+ if (data.subAgentId !== subAgentId) break;
2859
+ if (data.role === "system") break;
2860
+ if (data.messageKind === "context-reset") break;
2861
+ const message = {
2862
+ id: data.messageId,
2863
+ role: data.role,
2864
+ content: data.content ?? "",
2865
+ ...data.subAgentId ? { subAgentId: data.subAgentId } : {},
2866
+ ...data.subAgentType ? { subAgentType: data.subAgentType } : {},
2867
+ ...data.contextWindowId ? { contextWindowId: data.contextWindowId } : {},
2868
+ ...data.isCompactionSummary ? { isCompactionSummary: data.isCompactionSummary } : {},
2869
+ ...data.attachments !== void 0 ? { attachments: data.attachments } : {}
2870
+ };
2871
+ messageMap.set(data.messageId, message);
2872
+ messages.push(message);
2873
+ break;
2874
+ }
2875
+ case "message.thinking": {
2876
+ const evt = event.data;
2877
+ handleMessageThinking(messageMap, evt);
2878
+ break;
2879
+ }
2880
+ case "message.delta": {
2881
+ const evt = event.data;
2882
+ handleMessageDelta(messageMap, evt);
2883
+ break;
2884
+ }
2885
+ case "tool.call": {
2886
+ const evt = event.data;
2887
+ handleToolCall(messageMap, evt);
2888
+ break;
2889
+ }
2890
+ case "tool.result": {
2891
+ const evt = event.data;
2892
+ handleToolResult(messages, messageMap, fulfilledToolCallIds, evt);
2893
+ break;
2894
+ }
2895
+ case "context.compacted": {
2896
+ const data = event.data;
2897
+ if (data.subAgentId === subAgentId && i === compactionSummaryIndex) {
2898
+ }
2899
+ break;
2900
+ }
2901
+ }
2902
+ }
2903
+ stripOrphanedToolCalls(messages, fulfilledToolCallIds);
2904
+ return messages.map(
2905
+ ({ id: _id, subAgentId: _sa, subAgentType: _st, contextWindowId: _cw, isCompactionSummary: _ics, ...rest }) => {
2906
+ const ctx = {
2907
+ role: rest.role,
2908
+ content: rest.content,
2909
+ ...rest.thinkingContent ? { thinkingContent: rest.thinkingContent } : {},
2910
+ ...rest.toolCalls ? { toolCalls: rest.toolCalls } : {},
2911
+ ...rest.toolCallId ? { toolCallId: rest.toolCallId } : {},
2912
+ ...rest.attachments ? { attachments: rest.attachments } : {}
2913
+ };
2914
+ return ctx;
2915
+ }
2916
+ );
2917
+ }
2918
+ function getConversationMessages(scope) {
2919
+ const eventStore = getEventStore();
2920
+ const events = eventStore.getEvents(scope.sessionId);
2921
+ if (events.length === 0) return [];
2922
+ const contextMessages = buildContextMessages(events, scope);
2923
+ return minimalMessagesToRequestContextMessages(contextMessages, "history");
2924
+ }
2925
+
2926
+ // src/server/chat/agent-loop.ts
2833
2927
  function emitPartialDoneEvents(sessionId, assistantMsgId, statsIdentity, mode, turnMetrics, promptContext, eventStore) {
2834
2928
  const stats = turnMetrics.buildStats(statsIdentity, mode);
2835
2929
  eventStore.append(
@@ -2950,24 +3044,7 @@ Error: ${toolResult.error}` : `Error: ${toolResult.error}`
2950
3044
  return { toolMessages, criteriaChanged, returnValueContent, returnValueResult };
2951
3045
  }
2952
3046
  var MAX_FORMAT_RETRIES = 10;
2953
- var FORMAT_CORRECTION_PROMPT2 = `IMPORTANT: You MUST use the JSON function calling API. Do NOT output XML tags like <tool_call>, <function=>, or <parameter=>. Your previous attempt was stopped because you used the wrong format. Use the proper tool_calls format.`;
2954
- function toRequestContextMessages(messages) {
2955
- return messages.map((message) => ({
2956
- role: message.role,
2957
- content: message.content,
2958
- source: "history",
2959
- ...message.thinkingContent ? { thinkingContent: message.thinkingContent } : {},
2960
- ...message.toolCalls ? {
2961
- toolCalls: message.toolCalls.map((toolCall) => ({
2962
- id: toolCall.id,
2963
- name: toolCall.name,
2964
- arguments: toolCall.arguments
2965
- }))
2966
- } : {},
2967
- ...message.toolCallId ? { toolCallId: message.toolCallId } : {},
2968
- ...message.attachments ? { attachments: message.attachments } : {}
2969
- }));
2970
- }
3047
+ var FORMAT_CORRECTION_PROMPT2 = `IMPORTANT: You MUST use the JSON function calling API. Do NOT output XML tags like <function=>, <parameter=>, or <invoke=>. Your previous attempt was stopped because you used the wrong format. Use the proper tool_calls format.`;
2971
3048
  async function runTopLevelAgentLoop(config, turnMetrics) {
2972
3049
  const { mode, sessionManager, sessionId, llmClient, signal, onMessage, statsIdentity } = config;
2973
3050
  const eventStore = getEventStore();
@@ -2996,7 +3073,7 @@ async function runTopLevelAgentLoop(config, turnMetrics) {
2996
3073
  }));
2997
3074
  const toolRegistry = config.getToolRegistry();
2998
3075
  const currentWindowMessageOptions = getCurrentWindowMessageOptions(sessionId);
2999
- const requestMessages = toRequestContextMessages(getContextMessages(sessionId));
3076
+ const requestMessages = getConversationMessages({ type: "toplevel", sessionId });
3000
3077
  if (formatRetryCount > 0) {
3001
3078
  const correctionMsgId = crypto.randomUUID();
3002
3079
  eventStore.append(
@@ -3008,7 +3085,7 @@ async function runTopLevelAgentLoop(config, turnMetrics) {
3008
3085
  })
3009
3086
  );
3010
3087
  eventStore.append(sessionId, createFormatRetryEvent(formatRetryCount, MAX_FORMAT_RETRIES));
3011
- requestMessages.push({ role: "user", content: FORMAT_CORRECTION_PROMPT2, source: "runtime" });
3088
+ requestMessages.push({ role: "user", content: FORMAT_CORRECTION_PROMPT2, source: "history" });
3012
3089
  }
3013
3090
  const configDir = getGlobalConfigDir(getRuntimeConfig().mode ?? "production");
3014
3091
  const skills = await getEnabledSkillMetadata(configDir);
@@ -3284,7 +3361,6 @@ async function executeSubAgent(options) {
3284
3361
  const subAgentId = crypto.randomUUID();
3285
3362
  let session = sessionManager.requireSession(sessionId);
3286
3363
  const currentWindowMessageOptions = getCurrentWindowMessageOptions2(sessionId);
3287
- const contextMessages = [{ role: "user", content: prompt, source: "runtime" }];
3288
3364
  logger.debug("Sub-agent starting", { subAgentType, subAgentId, sessionId });
3289
3365
  const resetMsgId = crypto.randomUUID();
3290
3366
  eventStore.append(
@@ -3298,12 +3374,30 @@ async function executeSubAgent(options) {
3298
3374
  })
3299
3375
  );
3300
3376
  eventStore.append(sessionId, { type: "message.done", data: { messageId: resetMsgId } });
3301
- for (const msg of contextMessages) {
3302
- const msgId = crypto.randomUUID();
3303
- eventStore.append(
3304
- sessionId,
3305
- createMessageStartEvent(msgId, "user", msg.content, {
3306
- ...currentWindowMessageOptions ?? {},
3377
+ const promptMsgId = crypto.randomUUID();
3378
+ eventStore.append(
3379
+ sessionId,
3380
+ createMessageStartEvent(promptMsgId, "user", prompt, {
3381
+ ...currentWindowMessageOptions ?? {},
3382
+ isSystemGenerated: true,
3383
+ messageKind: "auto-prompt",
3384
+ subAgentId,
3385
+ subAgentType,
3386
+ metadata: {
3387
+ type: "subagent",
3388
+ name: agentDef.metadata.name,
3389
+ color: agentDef.metadata.color ?? "#6b7280"
3390
+ }
3391
+ })
3392
+ );
3393
+ eventStore.append(sessionId, { type: "message.done", data: { messageId: promptMsgId } });
3394
+ if (onMessage) {
3395
+ onMessage(
3396
+ createChatMessageMessage({
3397
+ id: promptMsgId,
3398
+ role: "user",
3399
+ content: prompt,
3400
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
3307
3401
  isSystemGenerated: true,
3308
3402
  messageKind: "auto-prompt",
3309
3403
  subAgentId,
@@ -3315,28 +3409,8 @@ async function executeSubAgent(options) {
3315
3409
  }
3316
3410
  })
3317
3411
  );
3318
- eventStore.append(sessionId, { type: "message.done", data: { messageId: msgId } });
3319
- if (onMessage) {
3320
- onMessage(
3321
- createChatMessageMessage({
3322
- id: msgId,
3323
- role: "user",
3324
- content: msg.content,
3325
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
3326
- isSystemGenerated: true,
3327
- messageKind: "auto-prompt",
3328
- subAgentId,
3329
- subAgentType,
3330
- metadata: {
3331
- type: "subagent",
3332
- name: agentDef.metadata.name,
3333
- color: agentDef.metadata.color ?? "#6b7280"
3334
- }
3335
- })
3336
- );
3337
- }
3338
3412
  }
3339
- const { files } = await getAllInstructions(session.workdir, session.projectId);
3413
+ const { content: instructionContent, files } = await getAllInstructions(session.workdir, session.projectId);
3340
3414
  const injectedFiles = toInjectedFiles(files);
3341
3415
  const configDir = getGlobalConfigDir(getRuntimeConfig().mode ?? "production");
3342
3416
  const skills = await getEnabledSkillMetadata(configDir);
@@ -3346,7 +3420,7 @@ async function executeSubAgent(options) {
3346
3420
  skills.length > 0 ? skills : void 0,
3347
3421
  llmClient.getModel()
3348
3422
  );
3349
- let customMessages = [...contextMessages];
3423
+ const subAgentScope = { type: "subagent", sessionId, subAgentId, subAgentType };
3350
3424
  let consecutiveEmptyStops = 0;
3351
3425
  let finalContent;
3352
3426
  let returnValueContent = null;
@@ -3356,13 +3430,7 @@ async function executeSubAgent(options) {
3356
3430
  if (signal?.aborted) {
3357
3431
  throw new Error("Aborted");
3358
3432
  }
3359
- await maybeAutoCompactContext({
3360
- sessionManager,
3361
- sessionId,
3362
- llmClient,
3363
- statsIdentity: resolveCompactionStatsIdentity(llmClient),
3364
- ...signal ? { signal } : {}
3365
- });
3433
+ const requestMessages = getConversationMessages(subAgentScope);
3366
3434
  const assistantMsgId = crypto.randomUUID();
3367
3435
  eventStore.append(
3368
3436
  sessionId,
@@ -3376,14 +3444,29 @@ async function executeSubAgent(options) {
3376
3444
  systemPrompt,
3377
3445
  injectedFiles,
3378
3446
  prompt,
3379
- customMessages,
3447
+ requestMessages,
3380
3448
  toolRegistry.definitions
3381
3449
  );
3450
+ const assembledRequest = assembleAgentRequest({
3451
+ agentDef,
3452
+ subAgentDefs: [],
3453
+ workdir: session.workdir,
3454
+ messages: requestMessages,
3455
+ injectedFiles,
3456
+ promptTools: toolRegistry.definitions,
3457
+ requestTools: toolRegistry.definitions,
3458
+ toolChoice: "auto",
3459
+ disableThinking: true,
3460
+ ...instructionContent ? { customInstructions: instructionContent } : {},
3461
+ ...skills.length > 0 ? { skills } : {},
3462
+ modelName: llmClient.getModel()
3463
+ });
3464
+ const effectiveSystemPrompt = assembledRequest.systemPrompt + RETURN_VALUE_INSTRUCTION;
3382
3465
  const streamGen = streamLLMPure({
3383
3466
  messageId: assistantMsgId,
3384
- systemPrompt: systemPrompt + RETURN_VALUE_INSTRUCTION,
3467
+ systemPrompt: effectiveSystemPrompt,
3385
3468
  llmClient,
3386
- messages: toStreamMessages(customMessages),
3469
+ messages: assembledRequest.messages,
3387
3470
  tools: toolRegistry.definitions,
3388
3471
  toolChoice: "auto",
3389
3472
  signal,
@@ -3406,9 +3489,7 @@ async function executeSubAgent(options) {
3406
3489
  throw new Error("Aborted");
3407
3490
  }
3408
3491
  turnMetrics.addLLMCall(result.timing, result.usage.promptTokens, result.usage.completionTokens, result.modelParams);
3409
- sessionManager.setCurrentContextSize(sessionId, result.usage.promptTokens, subAgentId);
3410
3492
  finalContent = result.content;
3411
- customMessages.push(createAssistantMessage(result.content, result.thinkingContent, result.toolCalls));
3412
3493
  session = sessionManager.requireSession(sessionId);
3413
3494
  if (result.toolCalls.length === 0) {
3414
3495
  if (nudgeConfig) {
@@ -3428,7 +3509,6 @@ async function executeSubAgent(options) {
3428
3509
  subAgentId,
3429
3510
  subAgentType
3430
3511
  });
3431
- customMessages = [...customMessages, { role: "user", content: nudgeContent, source: "runtime" }];
3432
3512
  continue;
3433
3513
  }
3434
3514
  const stalledMsgId = crypto.randomUUID();
@@ -3458,7 +3538,6 @@ async function executeSubAgent(options) {
3458
3538
  subAgentId,
3459
3539
  subAgentType
3460
3540
  });
3461
- customMessages = [...customMessages, { role: "user", content: RETURN_VALUE_NUDGE, source: "runtime" }];
3462
3541
  continue;
3463
3542
  }
3464
3543
  const stats = turnMetrics.buildStats(statsIdentity, "verifier");
@@ -3510,7 +3589,6 @@ async function executeSubAgent(options) {
3510
3589
  }
3511
3590
  break;
3512
3591
  }
3513
- customMessages = [...customMessages, ...batchResult.toolMessages];
3514
3592
  session = sessionManager.requireSession(sessionId);
3515
3593
  if (nudgeConfig) {
3516
3594
  consecutiveEmptyStops = 0;
@@ -3597,7 +3675,7 @@ var callSubAgentTool = {
3597
3675
  };
3598
3676
  }
3599
3677
  try {
3600
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-QJ5K5IJP.js");
3678
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-6DXPHBUV.js");
3601
3679
  const toolRegistry = getToolRegistryForAgent2(agentDef);
3602
3680
  const turnMetrics = new TurnMetrics();
3603
3681
  const result = await executeSubAgent({
@@ -4581,9 +4659,6 @@ function getCurrentWindowMessageOptions3(sessionId) {
4581
4659
  const contextWindowId = getCurrentContextWindowId(sessionId);
4582
4660
  return contextWindowId ? { contextWindowId } : void 0;
4583
4661
  }
4584
- function toRequestContextMessages2(messages) {
4585
- return minimalMessagesToRequestContextMessages(messages, "history");
4586
- }
4587
4662
  async function maybeAutoCompactContext(options) {
4588
4663
  const config = getRuntimeConfig();
4589
4664
  const contextState = options.sessionManager.getContextState(options.sessionId);
@@ -4630,7 +4705,7 @@ async function performContextCompaction(options) {
4630
4705
  const session = sessionManager.requireSession(sessionId);
4631
4706
  const { content: instructions, files } = await getAllInstructions(session.workdir, session.projectId);
4632
4707
  const injectedFiles = toInjectedFiles(files);
4633
- const requestMessages = toRequestContextMessages2(getContextMessages(sessionId));
4708
+ const requestMessages = getConversationMessages({ type: "toplevel", sessionId });
4634
4709
  const config = getRuntimeConfig();
4635
4710
  const allAgents = await loadAllAgentsDefault();
4636
4711
  const plannerDef = findAgentById("planner", allAgents);
@@ -4789,4 +4864,4 @@ export {
4789
4864
  getToolRegistryForAgent,
4790
4865
  createToolRegistry
4791
4866
  };
4792
- //# sourceMappingURL=chunk-EBQYRNNU.js.map
4867
+ //# sourceMappingURL=chunk-GLVNO4DS.js.map