openfox 2.0.0-beta.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +11 -0
  2. package/dist/{chat-handler-XIAY7O5X.js → chat-handler-LJMW4OK3.js} +9 -9
  3. package/dist/{chunk-QN5ST54E.js → chunk-32GQUDLN.js} +118 -97
  4. package/dist/{chunk-IGSZUXQP.js → chunk-7ZMMDZU7.js} +435 -33
  5. package/dist/{chunk-CDDMHSZF.js → chunk-CK6LGE7G.js} +10 -6
  6. package/dist/{chunk-7FDY3EOH.js → chunk-FFEAEPJB.js} +80 -226
  7. package/dist/{chunk-2ZS2B5HW.js → chunk-HPCGVAS4.js} +21 -45
  8. package/dist/{chunk-XJEOP6XU.js → chunk-ITWVFGFV.js} +1 -30
  9. package/dist/{chunk-DFITQ75T.js → chunk-LEDG5WAN.js} +29 -35
  10. package/dist/{chunk-GJ47CMZM.js → chunk-MFUPS6UE.js} +6 -6
  11. package/dist/{chunk-NPHYEUYE.js → chunk-XEK3KII6.js} +55 -4
  12. package/dist/{chunk-GJ34YIOL.js → chunk-ZDY4WMZJ.js} +185 -71
  13. package/dist/cli/dev.js +1 -1
  14. package/dist/cli/index.js +1 -1
  15. package/dist/{config-QUT7YZQ7.js → config-BU66P4KX.js} +2 -7
  16. package/dist/{events-PQ3KTI5H.js → events-ZKWAKWI7.js} +3 -3
  17. package/dist/{folding-CXORTBAU.js → folding-YOCGTZYH.js} +2 -2
  18. package/dist/{orchestrator-GAOENX5Q.js → orchestrator-LX6FKB6L.js} +8 -8
  19. package/dist/package.json +2 -1
  20. package/dist/{processor-6VIYGURD.js → processor-NMYSEBC7.js} +11 -6
  21. package/dist/{protocol-CDOV1pyc.d.ts → protocol-D59sCy9L.d.ts} +15 -6
  22. package/dist/{provider-4T6BVPMD.js → provider-DTNQYCMV.js} +9 -20
  23. package/dist/provider-manager-LMHAHLIF.js +15 -0
  24. package/dist/{serve-2V7T6GDG.js → serve-SGNL43UL.js} +14 -15
  25. package/dist/server/index.d.ts +22 -16
  26. package/dist/server/index.js +9 -10
  27. package/dist/shared/index.d.ts +2 -2
  28. package/dist/{tools-SDXWIYSA.js → tools-BOE5T3KC.js} +7 -7
  29. package/dist/web/assets/index-Bego8SwT.js +299 -0
  30. package/dist/web/assets/{index-CSOB8dwI.css → index-Sdax8ayU.css} +1 -1
  31. package/dist/web/index.html +2 -2
  32. package/dist/web/sw.js +1 -1
  33. package/package.json +2 -1
  34. package/dist/chunk-EMJGF3A7.js +0 -466
  35. package/dist/web/assets/index-BJuF4wi7.js +0 -299
@@ -4,6 +4,7 @@ import {
4
4
  WORKFLOW_KICKOFF_PROMPT,
5
5
  assembleAgentRequest,
6
6
  buildAgentReminder,
7
+ buildAgentSmallReminder,
7
8
  createAssemblyResult,
8
9
  createChatDoneEvent,
9
10
  createMessageStartEvent,
@@ -16,22 +17,22 @@ import {
16
17
  loadAllAgentsDefault,
17
18
  processEventsForConversation,
18
19
  runTopLevelAgentLoop
19
- } from "./chunk-QN5ST54E.js";
20
+ } from "./chunk-32GQUDLN.js";
20
21
  import {
21
22
  getCurrentContextWindowId,
22
23
  getCurrentWindowMessageOptions,
23
24
  getEventStore,
24
25
  getRuntimeConfig
25
- } from "./chunk-NPHYEUYE.js";
26
+ } from "./chunk-XEK3KII6.js";
26
27
  import {
27
28
  buildSnapshotFromSessionState
28
- } from "./chunk-XJEOP6XU.js";
29
- import {
30
- logger
31
- } from "./chunk-K44MW7JJ.js";
29
+ } from "./chunk-ITWVFGFV.js";
32
30
  import {
33
31
  getGlobalConfigDir
34
32
  } from "./chunk-CQGTEGKL.js";
33
+ import {
34
+ logger
35
+ } from "./chunk-K44MW7JJ.js";
35
36
 
36
37
  // src/server/chat/dynamic-context.ts
37
38
  import { createHash } from "crypto";
@@ -166,28 +167,24 @@ async function runChatTurn(options) {
166
167
  eventStore.append(sessionId, { type: "running.changed", data: { isRunning: false } });
167
168
  }
168
169
  }
169
- function windowHasReminder(sessionId, windowId) {
170
- const eventStore = getEventStore();
171
- const events = eventStore.getEvents(sessionId);
172
- return events.some((event) => {
173
- if (event.type !== "message.start") return false;
174
- const data = event.data;
175
- return data.contextWindowId === windowId && data.messageKind === "auto-prompt" && typeof data.content === "string" && data.content.includes("<system-reminder>");
176
- });
177
- }
178
- function injectModeReminderIfNeeded(sessionManager, sessionId, agentId, allAgents, _onMessage) {
170
+ function injectAgentReminder(sessionId, agentDef) {
179
171
  const eventStore = getEventStore();
180
- const session = sessionManager.requireSession(sessionId);
181
172
  const currentWindowId = getCurrentContextWindowId(sessionId);
182
- const lastModeReminder = session.executionState?.lastModeWithReminder;
183
- if (lastModeReminder === agentId) {
184
- if (!currentWindowId || windowHasReminder(sessionId, currentWindowId)) {
185
- return;
173
+ let latestAgentName;
174
+ const events = eventStore.getAllEvents(sessionId);
175
+ for (let i = events.length - 1; i >= 0; i--) {
176
+ const event = events[i];
177
+ if (event.type === "message.start") {
178
+ const data = event.data;
179
+ if (data.isSystemGenerated && data.metadata?.type === "agent" && (data.contextWindowId === currentWindowId || !currentWindowId && !data.contextWindowId)) {
180
+ latestAgentName = data.metadata.name;
181
+ break;
182
+ }
186
183
  }
187
184
  }
188
- const agentDef = findAgentById(agentId, allAgents);
189
- if (!agentDef) return;
190
- const reminderContent = buildAgentReminder(agentDef);
185
+ const currentAgentName = agentDef.metadata.name ?? agentDef.metadata.id;
186
+ const isSmallReminder = latestAgentName === currentAgentName;
187
+ const content = isSmallReminder ? buildAgentSmallReminder(currentAgentName) : buildAgentReminder(agentDef);
191
188
  const reminderMsgId = crypto.randomUUID();
192
189
  const currentWindowMessageOptions = currentWindowId ? { contextWindowId: currentWindowId } : void 0;
193
190
  eventStore.append(sessionId, {
@@ -195,14 +192,15 @@ function injectModeReminderIfNeeded(sessionManager, sessionId, agentId, allAgent
195
192
  data: {
196
193
  messageId: reminderMsgId,
197
194
  role: "user",
198
- content: reminderContent,
195
+ content,
199
196
  ...currentWindowMessageOptions ?? {},
200
197
  isSystemGenerated: true,
201
198
  messageKind: "auto-prompt",
202
199
  metadata: {
203
200
  type: "agent",
204
- name: agentDef.metadata.name ?? agentDef.metadata.id,
205
- color: agentDef.metadata.color ?? "#6b7280"
201
+ name: currentAgentName,
202
+ color: agentDef.metadata.color ?? "#6b7280",
203
+ kind: isSmallReminder ? "reminder" : "definition"
206
204
  }
207
205
  }
208
206
  });
@@ -210,15 +208,12 @@ function injectModeReminderIfNeeded(sessionManager, sessionId, agentId, allAgent
210
208
  type: "message.done",
211
209
  data: { messageId: reminderMsgId }
212
210
  });
213
- sessionManager.updateExecutionState(sessionId, {
214
- lastModeWithReminder: agentId
215
- });
216
211
  }
217
212
  async function runAgentTurn(options, turnMetrics, agentId, append, callbacks) {
218
213
  const statsIdentity = resolveStatsIdentity(options);
219
214
  const allAgents = await loadAllAgentsDefault();
220
- injectModeReminderIfNeeded(options.sessionManager, options.sessionId, agentId, allAgents, options.onMessage);
221
215
  const agentDef = findAgentById(agentId, allAgents) ?? findAgentById("planner", allAgents);
216
+ injectAgentReminder(options.sessionId, agentDef);
222
217
  const subAgentDefs = getSubAgents(allAgents);
223
218
  const { content: instructionContent } = await getAllInstructions(
224
219
  options.sessionManager.requireSession(options.sessionId).workdir,
@@ -250,8 +245,7 @@ async function runAgentTurn(options, turnMetrics, agentId, append, callbacks) {
250
245
  messages: input.messages,
251
246
  injectedFiles: input.injectedFiles,
252
247
  requestTools: input.promptTools,
253
- toolChoice: input.toolChoice,
254
- disableThinking: false
248
+ toolChoice: input.toolChoice
255
249
  });
256
250
  }
257
251
  const result = assembleAgentRequest({
@@ -266,7 +260,7 @@ async function runAgentTurn(options, turnMetrics, agentId, append, callbacks) {
266
260
  },
267
261
  getToolRegistry: () => getToolRegistryForAgent(agentDef),
268
262
  getConversationMessages: buildGetConversationMessages(options.sessionId, options.llmClient, append),
269
- injectModeReminder: () => injectModeReminderIfNeeded(options.sessionManager, options.sessionId, agentId, allAgents, options.onMessage),
263
+ injectAgentReminder: () => injectAgentReminder(options.sessionId, agentDef),
270
264
  ...callbacks?.injectKickoff ? { injectKickoff: callbacks.injectKickoff } : {},
271
265
  ...callbacks?.onToolExecuted ? { onToolExecuted: callbacks.onToolExecuted } : {}
272
266
  },
@@ -317,4 +311,4 @@ export {
317
311
  runAgentTurn,
318
312
  injectWorkflowKickoffIfNeeded
319
313
  };
320
- //# sourceMappingURL=chunk-DFITQ75T.js.map
314
+ //# sourceMappingURL=chunk-LEDG5WAN.js.map
@@ -33,7 +33,7 @@ Options:
33
33
  }
34
34
  async function runNetworkSetup(mode) {
35
35
  const { loadAuthConfig, saveAuthConfig, encryptPassword } = await import("./auth-56SIRACI.js");
36
- const { saveGlobalConfig } = await import("./config-QUT7YZQ7.js");
36
+ const { saveGlobalConfig } = await import("./config-BU66P4KX.js");
37
37
  const { getAuthKeyPath } = await import("./paths-X46PPOI2.js");
38
38
  const existingAuth = await loadAuthConfig(mode);
39
39
  if (existingAuth) {
@@ -94,7 +94,7 @@ async function runNetworkSetup(mode) {
94
94
  console.log("\u2713 Configuration saved!\n");
95
95
  }
96
96
  async function runConfig(mode) {
97
- const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-QUT7YZQ7.js");
97
+ const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-BU66P4KX.js");
98
98
  const { getGlobalConfigPath } = await import("./paths-X46PPOI2.js");
99
99
  const config = await loadGlobalConfig(mode);
100
100
  const configPath = getGlobalConfigPath(mode);
@@ -151,7 +151,7 @@ async function runCli(options) {
151
151
  break;
152
152
  }
153
153
  case "provider": {
154
- const { runProviderCommand } = await import("./provider-4T6BVPMD.js");
154
+ const { runProviderCommand } = await import("./provider-DTNQYCMV.js");
155
155
  const [, subcommand] = positionals;
156
156
  await runProviderCommand(mode, subcommand);
157
157
  break;
@@ -188,12 +188,12 @@ async function runCli(options) {
188
188
  break;
189
189
  }
190
190
  default: {
191
- const { configFileExists } = await import("./config-QUT7YZQ7.js");
191
+ const { configFileExists } = await import("./config-BU66P4KX.js");
192
192
  const configExists = await configFileExists(mode);
193
193
  if (!configExists) {
194
194
  await runNetworkSetup(mode);
195
195
  }
196
- const { runServe } = await import("./serve-2V7T6GDG.js");
196
+ const { runServe } = await import("./serve-SGNL43UL.js");
197
197
  const serveOptions = { mode };
198
198
  if (values.port) serveOptions.port = parseInt(values.port);
199
199
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -205,4 +205,4 @@ async function runCli(options) {
205
205
  export {
206
206
  runCli
207
207
  };
208
- //# sourceMappingURL=chunk-GJ47CMZM.js.map
208
+ //# sourceMappingURL=chunk-MFUPS6UE.js.map
@@ -5,7 +5,7 @@ import {
5
5
  foldContextState,
6
6
  foldSessionState,
7
7
  spreadOptionalMessageFields
8
- } from "./chunk-XJEOP6XU.js";
8
+ } from "./chunk-ITWVFGFV.js";
9
9
  import {
10
10
  getDatabase
11
11
  } from "./chunk-FBGWG4N6.js";
@@ -263,6 +263,55 @@ var EventStore = class {
263
263
  events
264
264
  };
265
265
  }
266
+ /**
267
+ * Get ALL events for a session, including synthetic events reconstructed
268
+ * from the latest snapshot's messages. This provides a unified view of the
269
+ * full event history even after cleanupOldEvents has deleted raw events.
270
+ *
271
+ * Synthetic events have seq=0 and are reconstructed as message.start +
272
+ * message.done pairs from snapshot messages. Real events since the snapshot
273
+ * keep their original seq numbers.
274
+ */
275
+ getAllEvents(sessionId) {
276
+ const { snapshot, events } = this.getEventsSinceSnapshot(sessionId);
277
+ if (!snapshot) {
278
+ return events;
279
+ }
280
+ const syntheticEvents = [];
281
+ for (const msg of snapshot.messages) {
282
+ syntheticEvents.push({
283
+ seq: 0,
284
+ timestamp: msg.timestamp,
285
+ sessionId,
286
+ type: "message.start",
287
+ data: {
288
+ messageId: msg.id,
289
+ role: msg.role,
290
+ content: msg.content,
291
+ ...msg.contextWindowId !== void 0 && { contextWindowId: msg.contextWindowId },
292
+ ...msg.isSystemGenerated !== void 0 && { isSystemGenerated: msg.isSystemGenerated },
293
+ ...msg.messageKind !== void 0 && { messageKind: msg.messageKind },
294
+ ...msg.metadata !== void 0 && { metadata: msg.metadata },
295
+ ...msg.subAgentId !== void 0 && { subAgentId: msg.subAgentId },
296
+ ...msg.subAgentType !== void 0 && { subAgentType: msg.subAgentType },
297
+ ...msg.isCompactionSummary !== void 0 && { isCompactionSummary: msg.isCompactionSummary },
298
+ ...msg.attachments !== void 0 && { attachments: msg.attachments }
299
+ }
300
+ });
301
+ syntheticEvents.push({
302
+ seq: 0,
303
+ timestamp: msg.timestamp,
304
+ sessionId,
305
+ type: "message.done",
306
+ data: { messageId: msg.id }
307
+ });
308
+ }
309
+ return [...syntheticEvents, ...events].sort((a, b) => {
310
+ const tsDiff = a.timestamp - b.timestamp;
311
+ if (tsDiff !== 0) return tsDiff;
312
+ return a.seq - b.seq;
313
+ });
314
+ }
266
315
  rowToStoredEvent(row) {
267
316
  return {
268
317
  seq: row.seq,
@@ -833,7 +882,7 @@ function mapSessionSummaryRow(row) {
833
882
 
834
883
  // src/server/config.ts
835
884
  import { z } from "zod";
836
- var backendSchema = z.enum(["auto", "vllm", "sglang", "ollama", "llamacpp"]).default("auto");
885
+ var backendSchema = z.enum(["vllm", "sglang", "ollama", "llamacpp", "unknown"]).default("unknown");
837
886
  var envSchema = z.object({
838
887
  // New env var name, with fallback to old name for backward compatibility
839
888
  OPENFOX_LLM_URL: z.string().url().optional(),
@@ -846,6 +895,8 @@ var envSchema = z.object({
846
895
  OPENFOX_WORKDIR: z.string().optional(),
847
896
  OPENFOX_DB_PATH: z.string().default("./openfox.db"),
848
897
  OPENFOX_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
898
+ OPENFOX_REASONING_EFFORT: z.string().optional(),
899
+ // Deprecated: use OPENFOX_REASONING_EFFORT=none instead
849
900
  OPENFOX_DISABLE_THINKING: z.coerce.boolean().default(false),
850
901
  OPENFOX_DEV: z.coerce.boolean().default(false)
851
902
  });
@@ -862,7 +913,7 @@ function loadConfig() {
862
913
  idleTimeout: 3e5,
863
914
  // 5 minutes of inactivity
864
915
  backend: env.OPENFOX_BACKEND,
865
- disableThinking: env.OPENFOX_DISABLE_THINKING
916
+ ...env.OPENFOX_REASONING_EFFORT ? { reasoningEffort: env.OPENFOX_REASONING_EFFORT } : env.OPENFOX_DISABLE_THINKING ? { reasoningEffort: "none" } : {}
866
917
  },
867
918
  context: {
868
919
  maxTokens: env.OPENFOX_MAX_CONTEXT,
@@ -1373,4 +1424,4 @@ export {
1373
1424
  compactContext,
1374
1425
  getRecentUserPromptsForSession
1375
1426
  };
1376
- //# sourceMappingURL=chunk-NPHYEUYE.js.map
1427
+ //# sourceMappingURL=chunk-XEK3KII6.js.map