openfox 2.0.132 → 2.0.134

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 (85) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/CHANGELOG.md +31 -0
  3. package/dist/agent-defaults/code-reviewer.agent.md +1 -0
  4. package/dist/agent-defaults/explorer.agent.md +1 -0
  5. package/dist/agent-defaults/verifier.agent.md +1 -0
  6. package/dist/{chat-handler-T47GATL5.js → chat-handler-YCZE2XEJ.js} +23 -22
  7. package/dist/chunk-24YKXKCG.js +35 -0
  8. package/dist/chunk-2OMGR7LN.js +45 -0
  9. package/dist/{chunk-ZSBNXJZ5.js → chunk-5IXCCMFU.js} +342 -188
  10. package/dist/{chunk-MQMPIXON.js → chunk-5UMXFLET.js} +3 -3
  11. package/dist/{chunk-5JWJEZJ3.js → chunk-5UQ4CKOA.js} +2 -2
  12. package/dist/{chunk-GVOOOV7M.js → chunk-7HGBJFIJ.js} +44 -25
  13. package/dist/{chunk-7JVBDBXE.js → chunk-7QMWYNVF.js} +2 -2
  14. package/dist/{chunk-P57IBMK4.js → chunk-AATMPL7S.js} +4 -4
  15. package/dist/{chunk-ZL4IAFF3.js → chunk-BZND27IB.js} +3 -3
  16. package/dist/{chunk-FGNJMKDV.js → chunk-CSYOWFPU.js} +5 -5
  17. package/dist/{chunk-LQKXJPKP.js → chunk-CTWZPN7G.js} +5 -1
  18. package/dist/{chunk-BKMWZTNO.js → chunk-DWA4IE65.js} +14 -2
  19. package/dist/{chunk-RRUSYVQD.js → chunk-FAQDLL2X.js} +8 -8
  20. package/dist/{chunk-HCYSGLY2.js → chunk-HF3NDXB4.js} +1 -1
  21. package/dist/{chunk-6EZDW4JS.js → chunk-J3NMNYGM.js} +2 -2
  22. package/dist/{chunk-HXHPKGJE.js → chunk-J5HOUEPE.js} +614 -157
  23. package/dist/{chunk-RUFXKUOL.js → chunk-M4J2L4VH.js} +132 -45
  24. package/dist/{chunk-M5T4RDPJ.js → chunk-MEEUXRFL.js} +2 -2
  25. package/dist/{chunk-EOHEDEIH.js → chunk-MRE4OYKI.js} +69 -27
  26. package/dist/{chunk-MGEYAYGU.js → chunk-O3RCSKUH.js} +2 -2
  27. package/dist/{chunk-ELYHHEYL.js → chunk-ORCQ3EXQ.js} +2 -2
  28. package/dist/{chunk-FEIRWXLX.js → chunk-OZWHRBDY.js} +64 -17
  29. package/dist/{chunk-TACWRDDC.js → chunk-QDARWVQ2.js} +2 -2
  30. package/dist/{chunk-VXG3AFFY.js → chunk-QICVOQNX.js} +8 -8
  31. package/dist/chunk-QTLYD2FF.js +7 -0
  32. package/dist/{chunk-Y6ZGHOKM.js → chunk-YLVOU7T7.js} +4 -4
  33. package/dist/{chunk-GFW2HWJ6.js → chunk-YOPXAI2W.js} +37 -16
  34. package/dist/{chunk-CLDCHOEA.js → chunk-ZMK4VX7V.js} +2 -2
  35. package/dist/{chunk-KWAHD2JA.js → chunk-ZTBKMVV6.js} +2 -2
  36. package/dist/cli/dev.js +4 -1
  37. package/dist/cli/index.js +4 -1
  38. package/dist/{client-2K6PPPJJ.js → client-VVYOWXRR.js} +4 -4
  39. package/dist/{compactor-OEJAA2YP.js → compactor-PD6DQ4NY.js} +9 -9
  40. package/dist/{dynamic-context-NJZKAZE3.js → dynamic-context-WKEXQCTK.js} +10 -10
  41. package/dist/{events-ZJPRGVL2.js → events-3WSNI7XC.js} +6 -6
  42. package/dist/{folding-QRZOHY2I.js → folding-H7JTX6KI.js} +4 -4
  43. package/dist/{http-client-P4XTKAZA.js → http-client-A445WYZU.js} +3 -3
  44. package/dist/{install-VA2F6X6Z.js → install-AVTFA344.js} +64 -15
  45. package/dist/{launch-6I5ADTVT.js → launch-FJ65HRV4.js} +23 -22
  46. package/dist/{manager-TMBFBCQL.js → manager-ZACEUL5P.js} +4 -4
  47. package/dist/{mcp-YU7AM3UV.js → mcp-SQ4DOGPT.js} +22 -9
  48. package/dist/{orchestrator-GX22Y5EM.js → orchestrator-OT66EDXO.js} +22 -21
  49. package/dist/package.json +3 -1
  50. package/dist/{path-security-CBACXAMS.js → path-security-5CFMMULR.js} +10 -10
  51. package/dist/{platform-5LQXOZO3.js → platform-XPMZKAUB.js} +3 -3
  52. package/dist/{processor-FMEULCNQ.js → processor-CHMHMMIE.js} +37 -21
  53. package/dist/{project-creator-6AGQTNXB.js → project-creator-T3A4H3YV.js} +42 -29
  54. package/dist/{protocol-BMUoqwYH.d.ts → protocol-Nr_H1_oC.d.ts} +3 -1
  55. package/dist/{protocol-Y7MRKRUO.js → protocol-XO4ZROAU.js} +3 -3
  56. package/dist/provider/index.d.ts +4 -4
  57. package/dist/provider-JWUNG2TD.js +507 -0
  58. package/dist/{provider-manager-BO5ZBG3T.js → provider-manager-2KKZ37XJ.js} +5 -5
  59. package/dist/pwa-V5PFB4OQ.js +502 -0
  60. package/dist/{registry-CMSSZHDC.js → registry-BEIR7Y5G.js} +3 -3
  61. package/dist/{serve-BFGHUM4Y.js → serve-HSDVY37K.js} +47 -36
  62. package/dist/server/index.d.ts +3 -3
  63. package/dist/server/index.js +27 -26
  64. package/dist/{server-WPWUYB6I.js → server-3UVLECD5.js} +26 -25
  65. package/dist/{service-WKABQHKL.js → service-M77VWL2M.js} +97 -32
  66. package/dist/{service-O3LCO3TQ.js → service-XIUNS5XV.js} +7 -6
  67. package/dist/{session-overrides-OECQYRDK.js → session-overrides-Y5B4XQPU.js} +5 -5
  68. package/dist/{sessions-NMPX5ICI.js → sessions-IGINPPBP.js} +4 -4
  69. package/dist/{settings-MDCRNQBY.js → settings-ZJPM6PQV.js} +2 -2
  70. package/dist/shared/index.d.ts +31 -4
  71. package/dist/shared/index.js +16 -2
  72. package/dist/{tasks-WOC3QUFA.js → tasks-3JJWJJ3X.js} +34 -18
  73. package/dist/{tools-CW6POKUL.js → tools-WWIWD3O7.js} +20 -19
  74. package/dist/{types-CoY8Ka1C.d.ts → types-BlQjLBui.d.ts} +1 -1
  75. package/dist/{types-BIkpxjaj.d.ts → types-G10ho8PT.d.ts} +1 -1
  76. package/dist/update-Q6SH7UP2.js +76 -0
  77. package/dist/web/assets/index-C48qmBAI.js +313 -0
  78. package/dist/web/index.html +1 -1
  79. package/dist/web/sw.js +1 -1
  80. package/package.json +3 -1
  81. package/dist/chunk-55RHB5JB.js +0 -7
  82. package/dist/provider-NWRGNGS3.js +0 -403
  83. package/dist/pwa-2GRFSXD7.js +0 -363
  84. package/dist/update-VPCDKFLD.js +0 -49
  85. package/dist/web/assets/index-Bx5r3aJx.js +0 -310
@@ -2,29 +2,32 @@ import {
2
2
  generateSessionNameForSession,
3
3
  getSessionMessageCount,
4
4
  needsNameGeneration
5
- } from "./chunk-RRUSYVQD.js";
5
+ } from "./chunk-FAQDLL2X.js";
6
6
  import {
7
7
  launchWorkflowRun
8
- } from "./chunk-GVOOOV7M.js";
8
+ } from "./chunk-7HGBJFIJ.js";
9
9
  import {
10
10
  runChatTurn
11
- } from "./chunk-GFW2HWJ6.js";
11
+ } from "./chunk-YOPXAI2W.js";
12
12
  import {
13
13
  devServerManager
14
- } from "./chunk-HXHPKGJE.js";
14
+ } from "./chunk-J5HOUEPE.js";
15
15
  import {
16
16
  gitSpawnEnv
17
17
  } from "./chunk-J7GAZGZT.js";
18
+ import {
19
+ serverT
20
+ } from "./chunk-OZWHRBDY.js";
18
21
  import {
19
22
  appendCompactionPrompt
20
- } from "./chunk-ZL4IAFF3.js";
23
+ } from "./chunk-BZND27IB.js";
21
24
  import {
22
25
  hasRecentLLMFailure,
23
26
  interruptLLMRetryWait
24
27
  } from "./chunk-7ET46SNE.js";
25
28
  import {
26
29
  onProcessEvent
27
- } from "./chunk-MQMPIXON.js";
30
+ } from "./chunk-5UMXFLET.js";
28
31
  import {
29
32
  killProcessTree
30
33
  } from "./chunk-I72ACQ6R.js";
@@ -32,7 +35,7 @@ import {
32
35
  applyDynamicContext,
33
36
  computeSessionHash,
34
37
  computeUnifiedDiff
35
- } from "./chunk-VXG3AFFY.js";
38
+ } from "./chunk-QICVOQNX.js";
36
39
  import {
37
40
  getPendingQuestionsForSession,
38
41
  provideAnswer
@@ -40,14 +43,14 @@ import {
40
43
  import {
41
44
  combineEventsWithSnapshot,
42
45
  getEventStore
43
- } from "./chunk-FGNJMKDV.js";
46
+ } from "./chunk-CSYOWFPU.js";
44
47
  import {
45
48
  buildMessagesFromStoredEvents,
46
49
  foldPendingConfirmations
47
- } from "./chunk-M5T4RDPJ.js";
50
+ } from "./chunk-MEEUXRFL.js";
48
51
  import {
49
52
  getRuntimeConfig
50
- } from "./chunk-ELYHHEYL.js";
53
+ } from "./chunk-ORCQ3EXQ.js";
51
54
  import {
52
55
  createChatErrorMessage,
53
56
  createChatMessageMessage,
@@ -62,19 +65,19 @@ import {
62
65
  parseClientMessage,
63
66
  serializeServerMessage,
64
67
  storedEventToServerMessage
65
- } from "./chunk-P57IBMK4.js";
68
+ } from "./chunk-AATMPL7S.js";
66
69
  import {
67
70
  getPlatformShell
68
- } from "./chunk-MGEYAYGU.js";
71
+ } from "./chunk-O3RCSKUH.js";
69
72
  import {
70
73
  getMaxVisibleItems
71
- } from "./chunk-LQKXJPKP.js";
74
+ } from "./chunk-CTWZPN7G.js";
72
75
  import {
73
76
  logger
74
77
  } from "./chunk-K44MW7JJ.js";
75
78
  import {
76
79
  createServerMessage
77
- } from "./chunk-HCYSGLY2.js";
80
+ } from "./chunk-HF3NDXB4.js";
78
81
 
79
82
  // src/server/ws/server.ts
80
83
  import { WebSocketServer, WebSocket as WebSocket2 } from "ws";
@@ -472,6 +475,14 @@ async function isValidToken(token) {
472
475
  }
473
476
 
474
477
  // src/server/ws/server.ts
478
+ var MSG_INVALID_MESSAGE_FORMAT = { en: "Invalid message format", fr: "Format de message invalide" };
479
+ var MSG_NO_ACTIVE_SESSION = { en: "No active session", fr: "Aucune session active" };
480
+ var MSG_SESSION_NOT_FOUND = { en: "Session not found", fr: "Session introuvable" };
481
+ var MSG_SESSION_IS_RUNNING = {
482
+ en: "Session is already running",
483
+ fr: "La session est d\xE9j\xE0 en cours d\u2019ex\xE9cution"
484
+ };
485
+ var MSG_UNKNOWN_ERROR = { en: "Unknown error", fr: "Erreur inconnue" };
475
486
  var resolveMcpReady = null;
476
487
  var mcpReadyPromise = new Promise((resolve) => {
477
488
  resolveMcpReady = resolve;
@@ -1023,7 +1034,7 @@ function createWebSocketServer(httpServer, _config, getLLMClient, getActiveProvi
1023
1034
  const seq = client2.lastSentSeq + 1;
1024
1035
  enqueueSend(
1025
1036
  client2,
1026
- serializeServerMessage(createErrorMessage("INVALID_MESSAGE", "Invalid message format")),
1037
+ serializeServerMessage(createErrorMessage("INVALID_MESSAGE", serverT(MSG_INVALID_MESSAGE_FORMAT))),
1027
1038
  seq
1028
1039
  );
1029
1040
  return;
@@ -1059,7 +1070,11 @@ function createWebSocketServer(httpServer, _config, getLLMClient, getActiveProvi
1059
1070
  enqueueSend(
1060
1071
  client2,
1061
1072
  serializeServerMessage(
1062
- createErrorMessage("INTERNAL_ERROR", error instanceof Error ? error.message : "Unknown error", message.id)
1073
+ createErrorMessage(
1074
+ "INTERNAL_ERROR",
1075
+ error instanceof Error ? error.message : serverT(MSG_UNKNOWN_ERROR),
1076
+ message.id
1077
+ )
1063
1078
  ),
1064
1079
  seq
1065
1080
  );
@@ -1150,12 +1165,18 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1150
1165
  // =========================================================================
1151
1166
  case "session.load": {
1152
1167
  if (!isSessionLoadPayload(message.payload)) {
1153
- send(createErrorMessage("INVALID_PAYLOAD", "Invalid session.load payload", message.id));
1168
+ send(
1169
+ createErrorMessage(
1170
+ "INVALID_PAYLOAD",
1171
+ serverT({ en: "Invalid session.load payload", fr: "Payload de session.load invalide" }),
1172
+ message.id
1173
+ )
1174
+ );
1154
1175
  return;
1155
1176
  }
1156
1177
  const session = sessionManager.getSession(message.payload.sessionId);
1157
1178
  if (!session) {
1158
- send(createErrorMessage("NOT_FOUND", "Session not found", message.id));
1179
+ send(createErrorMessage("NOT_FOUND", serverT(MSG_SESSION_NOT_FOUND), message.id));
1159
1180
  return;
1160
1181
  }
1161
1182
  client.activeSessionId = session.id;
@@ -1208,12 +1229,21 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1208
1229
  const payload = message.payload;
1209
1230
  const sessionId = payload?.sessionId ?? client.activeSessionId;
1210
1231
  if (!sessionId) {
1211
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1232
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1212
1233
  return;
1213
1234
  }
1214
1235
  const session = sessionManager.requireSession(sessionId);
1215
1236
  if (session.isRunning) {
1216
- send(createErrorMessage("SESSION_RUNNING", "Cannot compact while session is running", message.id));
1237
+ send(
1238
+ createErrorMessage(
1239
+ "SESSION_RUNNING",
1240
+ serverT({
1241
+ en: "Cannot compact while session is running",
1242
+ fr: "Impossible de compacter pendant que la session est en cours"
1243
+ }),
1244
+ message.id
1245
+ )
1246
+ );
1217
1247
  return;
1218
1248
  }
1219
1249
  send({ type: "ack", payload: {}, id: message.id });
@@ -1240,10 +1270,11 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1240
1270
  }).catch((error) => {
1241
1271
  if (error instanceof Error && error.message === "Aborted") return;
1242
1272
  logger.error("Compaction failed", { error, sessionId });
1273
+ const reason = error instanceof Error ? error.message : serverT(MSG_UNKNOWN_ERROR);
1243
1274
  sendForSession(
1244
1275
  sessionId,
1245
1276
  createChatErrorMessage(
1246
- `Compaction failed: ${error instanceof Error ? error.message : "Unknown error"}`,
1277
+ serverT({ en: "Compaction failed: {{reason}}", fr: "\xC9chec de la compaction : {{reason}}" }, { reason }),
1247
1278
  true
1248
1279
  )
1249
1280
  );
@@ -1267,7 +1298,7 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1267
1298
  }
1268
1299
  case "context.checkDynamic": {
1269
1300
  if (!client.activeSessionId) {
1270
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1301
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1271
1302
  return;
1272
1303
  }
1273
1304
  const sessionId = client.activeSessionId;
@@ -1308,13 +1339,13 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1308
1339
  const payload = message.payload;
1309
1340
  const sessionId = payload?.sessionId ?? client.activeSessionId;
1310
1341
  if (!sessionId) {
1311
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1342
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1312
1343
  return;
1313
1344
  }
1314
1345
  const session = sessionManager.requireSession(sessionId);
1315
1346
  try {
1316
- const { buildCachedPrompt, computePreviewToolDiff } = await import("./dynamic-context-NJZKAZE3.js");
1317
- const allAgents = await import("./registry-CMSSZHDC.js");
1347
+ const { buildCachedPrompt, computePreviewToolDiff } = await import("./dynamic-context-WKEXQCTK.js");
1348
+ const allAgents = await import("./registry-BEIR7Y5G.js");
1318
1349
  const agentDef = allAgents.findAgentById(session.mode, await allAgents.loadAllAgentsDefault()) ?? allAgents.findAgentById("planner", await allAgents.loadAllAgentsDefault());
1319
1350
  const modelName = session.providerModel ?? _providerManager?.getCurrentModel();
1320
1351
  const {
@@ -1325,7 +1356,7 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1325
1356
  const oldCached = sessionManager.getCachedPrompt(sessionId);
1326
1357
  const oldPrompt = oldCached?.systemPrompt;
1327
1358
  const diff = oldPrompt ? computeUnifiedDiff(oldPrompt, newPrompt) : [];
1328
- const { getToolRegistryForAgent } = await import("./tools-CW6POKUL.js");
1359
+ const { getToolRegistryForAgent } = await import("./tools-WWIWD3O7.js");
1329
1360
  const unfilteredTools = getToolRegistryForAgent(agentDef).definitions;
1330
1361
  const toolDiff = computePreviewToolDiff(oldCached?.tools, unfilteredTools, newTools);
1331
1362
  send({
@@ -1345,10 +1376,11 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1345
1376
  error: error instanceof Error ? error.message : "Unknown error",
1346
1377
  sessionId
1347
1378
  });
1379
+ const reason = error instanceof Error ? error.message : serverT(MSG_UNKNOWN_ERROR);
1348
1380
  send(
1349
1381
  createErrorMessage(
1350
1382
  "ERROR",
1351
- `Failed to preview: ${error instanceof Error ? error.message : "Unknown error"}`,
1383
+ serverT({ en: "Failed to preview: {{reason}}", fr: "\xC9chec de l\u2019aper\xE7u : {{reason}}" }, { reason }),
1352
1384
  message.id
1353
1385
  )
1354
1386
  );
@@ -1359,12 +1391,21 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1359
1391
  const payload = message.payload;
1360
1392
  const sessionId = payload?.sessionId ?? client.activeSessionId;
1361
1393
  if (!sessionId) {
1362
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1394
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1363
1395
  return;
1364
1396
  }
1365
1397
  const session = sessionManager.requireSession(sessionId);
1366
1398
  if (session.isRunning) {
1367
- send(createErrorMessage("SESSION_RUNNING", "Cannot apply dynamic context while session is running", message.id));
1399
+ send(
1400
+ createErrorMessage(
1401
+ "SESSION_RUNNING",
1402
+ serverT({
1403
+ en: "Cannot apply dynamic context while session is running",
1404
+ fr: "Impossible d\u2019appliquer le contexte dynamique pendant que la session est en cours"
1405
+ }),
1406
+ message.id
1407
+ )
1408
+ );
1368
1409
  return;
1369
1410
  }
1370
1411
  ;
@@ -1377,10 +1418,17 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1377
1418
  send({ type: "ack", payload: {}, id: message.id });
1378
1419
  } catch (error) {
1379
1420
  logger.error("Failed to apply dynamic context", { error, sessionId });
1421
+ const reason = error instanceof Error ? error.message : serverT(MSG_UNKNOWN_ERROR);
1380
1422
  sendForSession(
1381
1423
  sessionId,
1382
1424
  createChatErrorMessage(
1383
- `Failed to apply dynamic context: ${error instanceof Error ? error.message : "Unknown error"}`,
1425
+ serverT(
1426
+ {
1427
+ en: "Failed to apply dynamic context: {{reason}}",
1428
+ fr: "\xC9chec d\u2019application du contexte dynamique : {{reason}}"
1429
+ },
1430
+ { reason }
1431
+ ),
1384
1432
  true
1385
1433
  )
1386
1434
  );
@@ -1396,7 +1444,7 @@ async function handleClientMessage(ws, client, message, _getLLMClient, _getActiv
1396
1444
  const launchPayloadEarly = message.payload;
1397
1445
  const sessionId = launchPayloadEarly?.sessionId ?? client.activeSessionId;
1398
1446
  if (!sessionId) {
1399
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1447
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1400
1448
  return;
1401
1449
  }
1402
1450
  const session = sessionManager.requireSession(sessionId);
@@ -1424,7 +1472,13 @@ ${content}` : workflowInfo;
1424
1472
  if (!launchPayloadEarly?.resumeFrom) {
1425
1473
  const pendingCriteria = session.criteria.filter((c) => c.status.type !== "passed");
1426
1474
  if (!launchPayloadEarly?.workflowId && pendingCriteria.length === 0) {
1427
- send(createErrorMessage("NO_WORK", "No pending criteria to work on", message.id));
1475
+ send(
1476
+ createErrorMessage(
1477
+ "NO_WORK",
1478
+ serverT({ en: "No pending criteria to work on", fr: "Aucun crit\xE8re en attente sur lequel travailler" }),
1479
+ message.id
1480
+ )
1481
+ );
1428
1482
  return;
1429
1483
  }
1430
1484
  }
@@ -1511,17 +1565,29 @@ ${content}` : workflowInfo;
1511
1565
  // =========================================================================
1512
1566
  case "ask.answer": {
1513
1567
  if (!client.activeSessionId) {
1514
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1568
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1515
1569
  return;
1516
1570
  }
1517
1571
  if (!isAskAnswerPayload(message.payload)) {
1518
- send(createErrorMessage("INVALID_PAYLOAD", "Invalid ask.answer payload", message.id));
1572
+ send(
1573
+ createErrorMessage(
1574
+ "INVALID_PAYLOAD",
1575
+ serverT({ en: "Invalid ask.answer payload", fr: "Payload ask.answer invalide" }),
1576
+ message.id
1577
+ )
1578
+ );
1519
1579
  return;
1520
1580
  }
1521
1581
  const { callId, answer, skip } = message.payload;
1522
1582
  const found = provideAnswer(callId, answer, skip);
1523
1583
  if (!found) {
1524
- send(createErrorMessage("NOT_FOUND", "No pending question with that ID", message.id));
1584
+ send(
1585
+ createErrorMessage(
1586
+ "NOT_FOUND",
1587
+ serverT({ en: "No pending question with that ID", fr: "Aucune question en attente avec cet ID" }),
1588
+ message.id
1589
+ )
1590
+ );
1525
1591
  return;
1526
1592
  }
1527
1593
  logger.debug("Ask user answer received", {
@@ -1539,12 +1605,12 @@ ${content}` : workflowInfo;
1539
1605
  const payload = message.payload;
1540
1606
  const exitSessionId = payload?.sessionId ?? client.activeSessionId;
1541
1607
  if (!exitSessionId) {
1542
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1608
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1543
1609
  return;
1544
1610
  }
1545
1611
  const exitSession = sessionManager.getSession(exitSessionId);
1546
1612
  if (!exitSession) {
1547
- send(createErrorMessage("NOT_FOUND", "Session not found", message.id));
1613
+ send(createErrorMessage("NOT_FOUND", serverT(MSG_SESSION_NOT_FOUND), message.id));
1548
1614
  return;
1549
1615
  }
1550
1616
  const activeExec = sessionManager.getActiveWorkflowExecution(exitSessionId);
@@ -1577,7 +1643,7 @@ ${content}` : workflowInfo;
1577
1643
  const payload = message.payload;
1578
1644
  const retrySessionId = payload?.sessionId ?? client.activeSessionId;
1579
1645
  if (!retrySessionId) {
1580
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1646
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1581
1647
  return;
1582
1648
  }
1583
1649
  const interrupted = interruptLLMRetryWait(retrySessionId);
@@ -1588,25 +1654,37 @@ ${content}` : workflowInfo;
1588
1654
  const payload = message.payload;
1589
1655
  const retrySessionId = payload?.sessionId ?? client.activeSessionId;
1590
1656
  if (!retrySessionId) {
1591
- send(createErrorMessage("NO_SESSION", "No active session", message.id));
1657
+ send(createErrorMessage("NO_SESSION", serverT(MSG_NO_ACTIVE_SESSION), message.id));
1592
1658
  return;
1593
1659
  }
1594
1660
  const retrySession = sessionManager.getSession(retrySessionId);
1595
1661
  if (!retrySession) {
1596
- send(createErrorMessage("NOT_FOUND", "Session not found", message.id));
1662
+ send(createErrorMessage("NOT_FOUND", serverT(MSG_SESSION_NOT_FOUND), message.id));
1597
1663
  return;
1598
1664
  }
1599
1665
  if (retrySession.isRunning) {
1600
- send(createErrorMessage("SESSION_RUNNING", "Session is already running", message.id));
1666
+ send(createErrorMessage("SESSION_RUNNING", serverT(MSG_SESSION_IS_RUNNING), message.id));
1601
1667
  return;
1602
1668
  }
1603
1669
  if (!hasRecentLLMFailure(retrySessionId, 30 * 6e4)) {
1604
- send(createErrorMessage("NO_FAILED_TURN", "No failed turn to retry", message.id));
1670
+ send(
1671
+ createErrorMessage(
1672
+ "NO_FAILED_TURN",
1673
+ serverT({ en: "No failed turn to retry", fr: "Aucun tour \xE9chou\xE9 \xE0 relancer" }),
1674
+ message.id
1675
+ )
1676
+ );
1605
1677
  return;
1606
1678
  }
1607
1679
  const latestExec = sessionManager.getLatestWorkflowExecution(retrySessionId);
1608
1680
  if (latestExec && (latestExec.status === "blocked" || latestExec.status === "running" || latestExec.status === "waiting")) {
1609
- send(createErrorMessage("WORKFLOW_ACTIVE", "A workflow run is active", message.id));
1681
+ send(
1682
+ createErrorMessage(
1683
+ "WORKFLOW_ACTIVE",
1684
+ serverT({ en: "A workflow run is active", fr: "Un run de workflow est actif" }),
1685
+ message.id
1686
+ )
1687
+ );
1610
1688
  return;
1611
1689
  }
1612
1690
  if (retrySession.phase === "blocked") {
@@ -1624,7 +1702,16 @@ ${content}` : workflowInfo;
1624
1702
  break;
1625
1703
  }
1626
1704
  default: {
1627
- send(createErrorMessage("UNKNOWN_MESSAGE", `Unknown message type: ${message.type}`, message.id));
1705
+ send(
1706
+ createErrorMessage(
1707
+ "UNKNOWN_MESSAGE",
1708
+ serverT(
1709
+ { en: "Unknown message type: {{type}}", fr: "Type de message inconnu : {{type}}" },
1710
+ { type: message.type }
1711
+ ),
1712
+ message.id
1713
+ )
1714
+ );
1628
1715
  }
1629
1716
  }
1630
1717
  }
@@ -1642,4 +1729,4 @@ export {
1642
1729
  signalMcpReady,
1643
1730
  createWebSocketServer
1644
1731
  };
1645
- //# sourceMappingURL=chunk-RUFXKUOL.js.map
1732
+ //# sourceMappingURL=chunk-M4J2L4VH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveDefaultAgentId
3
- } from "./chunk-ELYHHEYL.js";
3
+ } from "./chunk-ORCQ3EXQ.js";
4
4
  import {
5
5
  normalizeAskOptions
6
6
  } from "./chunk-LCLH6ZUL.js";
@@ -965,4 +965,4 @@ export {
965
965
  buildSnapshot,
966
966
  buildSnapshotFromSessionState
967
967
  };
968
- //# sourceMappingURL=chunk-M5T4RDPJ.js.map
968
+ //# sourceMappingURL=chunk-MEEUXRFL.js.map
@@ -4,13 +4,19 @@ import {
4
4
  password,
5
5
  select
6
6
  } from "./chunk-AGXJ5O63.js";
7
+ import {
8
+ cliT,
9
+ setCliMode
10
+ } from "./chunk-2OMGR7LN.js";
7
11
 
8
12
  // src/cli/main.ts
9
13
  import { parseArgs } from "util";
10
14
  import { generateKeyPairSync } from "crypto";
11
15
  import { writeFile } from "fs/promises";
12
16
  function printHelp() {
13
- console.log(`
17
+ console.log(
18
+ cliT({
19
+ en: `
14
20
  OpenFox - Local LLM coding assistant
15
21
 
16
22
  Usage:
@@ -34,7 +40,34 @@ Options:
34
40
  --no-browser Don't open browser on start
35
41
  -h, --help Show this help message
36
42
  -v, --version Show version number
37
- `);
43
+ `,
44
+ fr: `
45
+ OpenFox - Assistant de codage LLM local
46
+
47
+ Utilisation :
48
+ openfox [commande] [options]
49
+
50
+ Commandes :
51
+ (aucune) D\xE9marrer le serveur pour le projet courant
52
+ config Afficher la configuration actuelle
53
+ provider add Ajouter un nouveau fournisseur LLM
54
+ provider list Lister les fournisseurs configur\xE9s
55
+ provider use Changer de fournisseur actif
56
+ provider remove Supprimer un fournisseur
57
+ service G\xE9rer le service systemd (install, start, stop, status, logs, uninstall)
58
+ pwa G\xE9rer l\u2019installation PWA (install, uninstall, launch, update, status)
59
+ mcp Afficher une configuration MCP pr\xEAte \xE0 coller pour ce serveur (demande le mot de passe s\u2019il est d\xE9fini)
60
+ install Installer un lanceur OpenFox persistant (utiliser --check pour inspecter)
61
+ update Mettre OpenFox \xE0 jour vers la derni\xE8re version
62
+
63
+ Options :
64
+ -p, --port <nombre> Sp\xE9cifier le port (d\xE9faut : 10369 pour prod, 10469 pour dev)
65
+ --no-browser Ne pas ouvrir le navigateur au d\xE9marrage
66
+ -h, --help Afficher ce message d\u2019aide
67
+ -v, --version Afficher le num\xE9ro de version
68
+ `
69
+ })
70
+ );
38
71
  }
39
72
  async function runNetworkSetup(mode) {
40
73
  const { loadAuthConfig, saveAuthConfig, encryptPassword } = await import("./auth-D3WLIBTG.js");
@@ -44,12 +77,15 @@ async function runNetworkSetup(mode) {
44
77
  if (existingAuth) {
45
78
  return;
46
79
  }
47
- console.log("\nOpenFox Setup\n");
80
+ console.log(cliT({ en: "\nOpenFox Setup\n", fr: "\nConfiguration d\u2019OpenFox\n" }));
48
81
  const networkChoice = await select({
49
- message: "How should OpenFox be accessible?",
82
+ message: cliT({ en: "How should OpenFox be accessible?", fr: "Comment OpenFox doit-il \xEAtre accessible ?" }),
50
83
  options: [
51
- { value: "localhost", label: "Secure (localhost only)" },
52
- { value: "network", label: "Accessible from local network" }
84
+ { value: "localhost", label: cliT({ en: "Secure (localhost only)", fr: "S\xE9curis\xE9 (localhost uniquement)" }) },
85
+ {
86
+ value: "network",
87
+ label: cliT({ en: "Accessible from local network", fr: "Accessible depuis le r\xE9seau local" })
88
+ }
53
89
  ]
54
90
  });
55
91
  if (isCancel(networkChoice)) {
@@ -61,7 +97,10 @@ async function runNetworkSetup(mode) {
61
97
  let passwordValue;
62
98
  if (isNetwork) {
63
99
  const pwd = await password({
64
- message: "Set a password? (optional, press Enter to skip)"
100
+ message: cliT({
101
+ en: "Set a password? (optional, press Enter to skip)",
102
+ fr: "D\xE9finir un mot de passe ? (facultatif, Entr\xE9e pour ignorer)"
103
+ })
65
104
  });
66
105
  if (isCancel(pwd)) {
67
106
  cancel();
@@ -102,7 +141,7 @@ async function runNetworkSetup(mode) {
102
141
  backend: "ollama"
103
142
  }
104
143
  });
105
- console.log("\u2713 Configuration saved!\n");
144
+ console.log(cliT({ en: "\u2713 Configuration saved!\n", fr: "\u2713 Configuration enregistr\xE9e !\n" }));
106
145
  }
107
146
  async function runConfig(mode) {
108
147
  const { loadGlobalConfig, getActiveProvider, getDefaultModel } = await import("./config-LOK3LXFH.js");
@@ -111,24 +150,27 @@ async function runConfig(mode) {
111
150
  const configPath = getGlobalConfigPath(mode);
112
151
  const activeProvider = getActiveProvider(config);
113
152
  const defaultModel = getDefaultModel(config);
114
- console.log(`Configuration (${mode}):`);
115
- console.log(` Location: ${configPath}`);
116
- console.log(` Providers: ${config.providers.length}`);
153
+ console.log(cliT({ en: `Configuration (${mode}):`, fr: `Configuration (${mode}) :` }));
154
+ console.log(cliT({ en: ` Location: ${configPath}`, fr: ` Emplacement : ${configPath}` }));
155
+ console.log(
156
+ cliT({ en: ` Providers: ${config.providers.length}`, fr: ` Fournisseurs : ${config.providers.length}` })
157
+ );
117
158
  if (activeProvider) {
118
- console.log(` Active: ${activeProvider.name}`);
119
- console.log(` URL: ${activeProvider.url}`);
120
- console.log(` Model: ${defaultModel ?? "auto"}`);
121
- console.log(` Backend: ${activeProvider.backend}`);
159
+ console.log(cliT({ en: ` Active: ${activeProvider.name}`, fr: ` Actif : ${activeProvider.name}` }));
160
+ console.log(cliT({ en: ` URL: ${activeProvider.url}`, fr: ` URL : ${activeProvider.url}` }));
161
+ console.log(cliT({ en: ` Model: ${defaultModel ?? "auto"}`, fr: ` Mod\xE8le : ${defaultModel ?? "auto"}` }));
162
+ console.log(cliT({ en: ` Backend: ${activeProvider.backend}`, fr: ` Backend : ${activeProvider.backend}` }));
122
163
  } else {
123
- console.log(` Active: (none configured)`);
164
+ console.log(cliT({ en: ` Active: (none configured)`, fr: ` Actif : (aucun configur\xE9)` }));
124
165
  }
125
166
  const host = config.server.host ?? "127.0.0.1";
126
- const hostDisplay = host === "0.0.0.0" ? `${host} (accessible from local network)` : `${host} (localhost only)`;
127
- console.log(` Server: ${hostDisplay}`);
128
- console.log(` Port: ${config.server.port}`);
167
+ const hostDisplay = host === "0.0.0.0" ? cliT({ en: `${host} (accessible from local network)`, fr: `${host} (accessible depuis le r\xE9seau local)` }) : cliT({ en: `${host} (localhost only)`, fr: `${host} (localhost uniquement)` });
168
+ console.log(cliT({ en: ` Server: ${hostDisplay}`, fr: ` Serveur : ${hostDisplay}` }));
169
+ console.log(cliT({ en: ` Port: ${config.server.port}`, fr: ` Port : ${config.server.port}` }));
129
170
  }
130
171
  async function runCli(options) {
131
172
  const { mode } = options;
173
+ setCliMode(mode);
132
174
  const { values, positionals } = parseArgs({
133
175
  options: {
134
176
  port: { type: "string", short: "p" },
@@ -165,13 +207,13 @@ async function runCli(options) {
165
207
  break;
166
208
  }
167
209
  case "provider": {
168
- const { runProviderCommand } = await import("./provider-NWRGNGS3.js");
210
+ const { runProviderCommand } = await import("./provider-JWUNG2TD.js");
169
211
  const [, subcommand] = positionals;
170
212
  await runProviderCommand(mode, subcommand);
171
213
  break;
172
214
  }
173
215
  case "service": {
174
- const { runServiceCommand } = await import("./service-WKABQHKL.js");
216
+ const { runServiceCommand } = await import("./service-M77VWL2M.js");
175
217
  const [, subcommand, ...serviceArgs] = positionals;
176
218
  if (values.follow) {
177
219
  serviceArgs.push("-f");
@@ -184,7 +226,7 @@ async function runCli(options) {
184
226
  break;
185
227
  }
186
228
  case "pwa": {
187
- const { runPwaCommand, printPwaHelp } = await import("./pwa-2GRFSXD7.js");
229
+ const { runPwaCommand, printPwaHelp } = await import("./pwa-V5PFB4OQ.js");
188
230
  const [, subcommand] = positionals;
189
231
  if (subcommand === "--help" || subcommand === "-h" || values.help) {
190
232
  printPwaHelp();
@@ -194,7 +236,7 @@ async function runCli(options) {
194
236
  break;
195
237
  }
196
238
  case "mcp": {
197
- const { runMcpCommand } = await import("./mcp-YU7AM3UV.js");
239
+ const { runMcpCommand } = await import("./mcp-SQ4DOGPT.js");
198
240
  const mcpOptions = {};
199
241
  if (values.password) mcpOptions.password = values.password;
200
242
  if (values.port) mcpOptions.port = parseInt(values.port);
@@ -202,7 +244,7 @@ async function runCli(options) {
202
244
  break;
203
245
  }
204
246
  case "install": {
205
- const { runInstall } = await import("./install-VA2F6X6Z.js");
247
+ const { runInstall } = await import("./install-AVTFA344.js");
206
248
  const code = await runInstall({ check: values.check === true });
207
249
  if (code !== 0) {
208
250
  process.exit(code);
@@ -210,7 +252,7 @@ async function runCli(options) {
210
252
  break;
211
253
  }
212
254
  case "update": {
213
- const { runUpdate } = await import("./update-VPCDKFLD.js");
255
+ const { runUpdate } = await import("./update-Q6SH7UP2.js");
214
256
  const code = await runUpdate();
215
257
  if (code !== 0) {
216
258
  process.exit(code);
@@ -223,7 +265,7 @@ async function runCli(options) {
223
265
  if (!configExists) {
224
266
  await runNetworkSetup(mode);
225
267
  }
226
- const { runServe } = await import("./serve-BFGHUM4Y.js");
268
+ const { runServe } = await import("./serve-HSDVY37K.js");
227
269
  const serveOptions = { mode };
228
270
  if (values.port) serveOptions.port = parseInt(values.port);
229
271
  if (values["no-browser"] === true) serveOptions.openBrowser = false;
@@ -235,4 +277,4 @@ async function runCli(options) {
235
277
  export {
236
278
  runCli
237
279
  };
238
- //# sourceMappingURL=chunk-EOHEDEIH.js.map
280
+ //# sourceMappingURL=chunk-MRE4OYKI.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SETTINGS_KEYS,
3
3
  getSetting
4
- } from "./chunk-LQKXJPKP.js";
4
+ } from "./chunk-CTWZPN7G.js";
5
5
 
6
6
  // src/server/utils/platform.ts
7
7
  import os from "os";
@@ -63,4 +63,4 @@ export {
63
63
  isWindowsPath,
64
64
  isAbsolutePath
65
65
  };
66
- //# sourceMappingURL=chunk-MGEYAYGU.js.map
66
+ //# sourceMappingURL=chunk-O3RCSKUH.js.map
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  SETTINGS_KEYS,
9
9
  getSetting
10
- } from "./chunk-LQKXJPKP.js";
10
+ } from "./chunk-CTWZPN7G.js";
11
11
  import {
12
12
  logger
13
13
  } from "./chunk-K44MW7JJ.js";
@@ -352,4 +352,4 @@ export {
352
352
  getOverrideAgentIds,
353
353
  resolveDefaultAgentId
354
354
  };
355
- //# sourceMappingURL=chunk-ELYHHEYL.js.map
355
+ //# sourceMappingURL=chunk-ORCQ3EXQ.js.map