@truefoundry/trueforge 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/_frontend/assets/{ConnectorSettings-4CYGRWPH-EWp5lwOt.js → ConnectorSettings-XEO5ZQO5-BXis0tQK.js} +1 -1
  2. package/dist/_frontend/assets/ConnectorSettings-XEO5ZQO5-BXis0tQK.js.br +0 -0
  3. package/dist/_frontend/assets/ConnectorSettings-XEO5ZQO5-BXis0tQK.js.gz +0 -0
  4. package/dist/_frontend/assets/{DockLayout-FEDQX2UT-DbN-pvPO.js → DockLayout-F2KYSY4U-D8P84kCr.js} +1 -1
  5. package/dist/_frontend/assets/{DrawerLayout-NMA7P64K-0IGRaUAW.js → DrawerLayout-FJ7XC2FU-ChH-Qykr.js} +2 -2
  6. package/dist/_frontend/assets/DrawerLayout-FJ7XC2FU-ChH-Qykr.js.br +0 -0
  7. package/dist/_frontend/assets/DrawerLayout-FJ7XC2FU-ChH-Qykr.js.gz +0 -0
  8. package/dist/_frontend/assets/{ModelSettings-H5FKRZLK-CEQWPDWn.js → ModelSettings-2QB7LE22-CDZku4g3.js} +1 -1
  9. package/dist/_frontend/assets/ModelSettings-2QB7LE22-CDZku4g3.js.br +0 -0
  10. package/dist/_frontend/assets/ModelSettings-2QB7LE22-CDZku4g3.js.gz +0 -0
  11. package/dist/_frontend/assets/{SandboxSettings-CBSC3C3G-PWbj0tIQ.js → SandboxSettings-QDDIPRBP-CImJLa0r.js} +1 -1
  12. package/dist/_frontend/assets/SandboxSettings-QDDIPRBP-CImJLa0r.js.br +0 -0
  13. package/dist/_frontend/assets/SandboxSettings-QDDIPRBP-CImJLa0r.js.gz +0 -0
  14. package/dist/_frontend/assets/{SettingsBuilder-EGSH7BUA-Cvx-hLzU.js → SettingsBuilder-4NF3Y7UZ-eXXDLQ6k.js} +2 -2
  15. package/dist/_frontend/assets/SettingsBuilder-4NF3Y7UZ-eXXDLQ6k.js.br +0 -0
  16. package/dist/_frontend/assets/SettingsBuilder-4NF3Y7UZ-eXXDLQ6k.js.gz +0 -0
  17. package/dist/_frontend/assets/{ShellRouteSync-53FTXNZZ-BIksLzSL.js → ShellRouteSync-T4WLY57Q-CetHx5EA.js} +1 -1
  18. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-CetHx5EA.js.br +0 -0
  19. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-CetHx5EA.js.gz +0 -0
  20. package/dist/_frontend/assets/{SidebarLayout-5WM2BHZG-Ceb_9WvC.js → SidebarLayout-KX6RSJTP-B8G4CTTb.js} +2 -2
  21. package/dist/_frontend/assets/SidebarLayout-KX6RSJTP-B8G4CTTb.js.br +0 -0
  22. package/dist/_frontend/assets/SidebarLayout-KX6RSJTP-B8G4CTTb.js.gz +0 -0
  23. package/dist/_frontend/assets/{SkillSettings-A2OQSQUT-C-AShr7L.js → SkillSettings-5EETEEDI-DbJE0Ms2.js} +1 -1
  24. package/dist/_frontend/assets/SkillSettings-5EETEEDI-DbJE0Ms2.js.br +0 -0
  25. package/dist/_frontend/assets/SkillSettings-5EETEEDI-DbJE0Ms2.js.gz +0 -0
  26. package/dist/_frontend/assets/{TrueForgeUIWithRouter-2AQ3HW6L-DexVXzlD.js → TrueForgeUIWithRouter-IAQQTD5V-9G1rELmh.js} +1 -1
  27. package/dist/_frontend/assets/{WidgetLayout-IKGVAZFV-Q2dDfnNQ.js → WidgetLayout-S6EK62TZ-BPf7T3wa.js} +1 -1
  28. package/dist/_frontend/assets/WidgetLayout-S6EK62TZ-BPf7T3wa.js.br +0 -0
  29. package/dist/_frontend/assets/WidgetLayout-S6EK62TZ-BPf7T3wa.js.gz +0 -0
  30. package/dist/_frontend/assets/{chunk-62JRHF6Z-BpHQergm.js → chunk-62JRHF6Z-BUuLA42_.js} +1 -1
  31. package/dist/_frontend/assets/chunk-62JRHF6Z-BUuLA42_.js.br +0 -0
  32. package/dist/_frontend/assets/chunk-62JRHF6Z-BUuLA42_.js.gz +0 -0
  33. package/dist/_frontend/assets/{chunk-4STVL6W6-DO6mK5-E.js → chunk-PTYEOSHT-C4gdhLwo.js} +2 -2
  34. package/dist/_frontend/assets/chunk-PTYEOSHT-C4gdhLwo.js.br +0 -0
  35. package/dist/_frontend/assets/chunk-PTYEOSHT-C4gdhLwo.js.gz +0 -0
  36. package/dist/_frontend/assets/{chunk-BMLCISMH-BtIzChti.js → chunk-X6U2Q7X5-DDlfUle1.js} +1 -1
  37. package/dist/_frontend/assets/chunk-X6U2Q7X5-DDlfUle1.js.br +0 -0
  38. package/dist/_frontend/assets/chunk-X6U2Q7X5-DDlfUle1.js.gz +0 -0
  39. package/dist/_frontend/assets/{cssMode-tBxiXBbi.js → cssMode-C1whwlDW.js} +1 -1
  40. package/dist/_frontend/assets/cssMode-C1whwlDW.js.br +0 -0
  41. package/dist/_frontend/assets/cssMode-C1whwlDW.js.gz +0 -0
  42. package/dist/_frontend/assets/{freemarker2-C8-_g6KH.js → freemarker2-CaMIS9bY.js} +1 -1
  43. package/dist/_frontend/assets/freemarker2-CaMIS9bY.js.br +0 -0
  44. package/dist/_frontend/assets/freemarker2-CaMIS9bY.js.gz +0 -0
  45. package/dist/_frontend/assets/{handlebars-CVTAyJx2.js → handlebars-Donx2d9H.js} +1 -1
  46. package/dist/_frontend/assets/handlebars-Donx2d9H.js.br +0 -0
  47. package/dist/_frontend/assets/handlebars-Donx2d9H.js.gz +0 -0
  48. package/dist/_frontend/assets/{html-CFO-PVK6.js → html-CtI8kZ6e.js} +1 -1
  49. package/dist/_frontend/assets/html-CtI8kZ6e.js.br +0 -0
  50. package/dist/_frontend/assets/html-CtI8kZ6e.js.gz +0 -0
  51. package/dist/_frontend/assets/{htmlMode-CFCanlO-.js → htmlMode-B6ky8VkF.js} +1 -1
  52. package/dist/_frontend/assets/htmlMode-B6ky8VkF.js.br +0 -0
  53. package/dist/_frontend/assets/htmlMode-B6ky8VkF.js.gz +0 -0
  54. package/dist/_frontend/assets/{index-BIWWiCC7.js → index-DFmgzNuj.js} +3 -3
  55. package/dist/_frontend/assets/index-DFmgzNuj.js.br +0 -0
  56. package/dist/_frontend/assets/index-DFmgzNuj.js.gz +0 -0
  57. package/dist/_frontend/assets/{index-CSSyjy0I.js → index-DWr7ad72.js} +202 -197
  58. package/dist/_frontend/assets/index-DWr7ad72.js.br +0 -0
  59. package/dist/_frontend/assets/index-DWr7ad72.js.gz +0 -0
  60. package/dist/_frontend/assets/{javascript-MIQGaM22.js → javascript-BDngdIws.js} +1 -1
  61. package/dist/_frontend/assets/{jsonMode-D5gVPPeB.js → jsonMode-B7OogXWW.js} +1 -1
  62. package/dist/_frontend/assets/jsonMode-B7OogXWW.js.br +0 -0
  63. package/dist/_frontend/assets/jsonMode-B7OogXWW.js.gz +0 -0
  64. package/dist/_frontend/assets/{liquid-DHNaEubO.js → liquid-D_8RkuUW.js} +1 -1
  65. package/dist/_frontend/assets/liquid-D_8RkuUW.js.br +0 -0
  66. package/dist/_frontend/assets/liquid-D_8RkuUW.js.gz +0 -0
  67. package/dist/_frontend/assets/{lspLanguageFeatures-QCSfugnT.js → lspLanguageFeatures-DJf8_W2N.js} +1 -1
  68. package/dist/_frontend/assets/lspLanguageFeatures-DJf8_W2N.js.br +0 -0
  69. package/dist/_frontend/assets/lspLanguageFeatures-DJf8_W2N.js.gz +0 -0
  70. package/dist/_frontend/assets/{mdx-BXTfxgKC.js → mdx-HcpZSZ2w.js} +1 -1
  71. package/dist/_frontend/assets/mdx-HcpZSZ2w.js.br +0 -0
  72. package/dist/_frontend/assets/mdx-HcpZSZ2w.js.gz +0 -0
  73. package/dist/_frontend/assets/{python-2xJ5-a_I.js → python-CPiT1vB4.js} +1 -1
  74. package/dist/_frontend/assets/python-CPiT1vB4.js.br +0 -0
  75. package/dist/_frontend/assets/python-CPiT1vB4.js.gz +0 -0
  76. package/dist/_frontend/assets/{razor-pc2nnHiH.js → razor-oizHS-vq.js} +1 -1
  77. package/dist/_frontend/assets/razor-oizHS-vq.js.br +0 -0
  78. package/dist/_frontend/assets/razor-oizHS-vq.js.gz +0 -0
  79. package/dist/_frontend/assets/{tsMode-DDOTqjiA.js → tsMode-n5kkpKJX.js} +1 -1
  80. package/dist/_frontend/assets/tsMode-n5kkpKJX.js.br +0 -0
  81. package/dist/_frontend/assets/tsMode-n5kkpKJX.js.gz +0 -0
  82. package/dist/_frontend/assets/{typescript-B8kVUDuw.js → typescript-BfXupYGq.js} +1 -1
  83. package/dist/_frontend/assets/typescript-BfXupYGq.js.br +0 -0
  84. package/dist/_frontend/assets/typescript-BfXupYGq.js.gz +0 -0
  85. package/dist/_frontend/assets/{workers-BKOSx8Az.js → workers-DCX6qMOc.js} +1 -1
  86. package/dist/_frontend/assets/workers-DCX6qMOc.js.br +0 -0
  87. package/dist/_frontend/assets/workers-DCX6qMOc.js.gz +0 -0
  88. package/dist/_frontend/assets/{xml--HuG4XfW.js → xml-MX-qfsGl.js} +1 -1
  89. package/dist/_frontend/assets/xml-MX-qfsGl.js.br +0 -0
  90. package/dist/_frontend/assets/xml-MX-qfsGl.js.gz +0 -0
  91. package/dist/_frontend/assets/{yaml-BM2qwYh9.js → yaml-DnKyyO9e.js} +1 -1
  92. package/dist/_frontend/assets/yaml-DnKyyO9e.js.br +0 -0
  93. package/dist/_frontend/assets/yaml-DnKyyO9e.js.gz +0 -0
  94. package/dist/_frontend/index.html +1 -1
  95. package/dist/_frontend/index.html.br +0 -0
  96. package/dist/_frontend/index.html.gz +0 -0
  97. package/dist/main.js +141 -105
  98. package/dist/main.js.map +1 -1
  99. package/package.json +2 -2
  100. package/dist/_frontend/assets/ConnectorSettings-4CYGRWPH-EWp5lwOt.js.br +0 -0
  101. package/dist/_frontend/assets/ConnectorSettings-4CYGRWPH-EWp5lwOt.js.gz +0 -0
  102. package/dist/_frontend/assets/DrawerLayout-NMA7P64K-0IGRaUAW.js.br +0 -0
  103. package/dist/_frontend/assets/DrawerLayout-NMA7P64K-0IGRaUAW.js.gz +0 -0
  104. package/dist/_frontend/assets/ModelSettings-H5FKRZLK-CEQWPDWn.js.br +0 -0
  105. package/dist/_frontend/assets/ModelSettings-H5FKRZLK-CEQWPDWn.js.gz +0 -0
  106. package/dist/_frontend/assets/SandboxSettings-CBSC3C3G-PWbj0tIQ.js.br +0 -0
  107. package/dist/_frontend/assets/SandboxSettings-CBSC3C3G-PWbj0tIQ.js.gz +0 -0
  108. package/dist/_frontend/assets/SettingsBuilder-EGSH7BUA-Cvx-hLzU.js.br +0 -0
  109. package/dist/_frontend/assets/SettingsBuilder-EGSH7BUA-Cvx-hLzU.js.gz +0 -0
  110. package/dist/_frontend/assets/ShellRouteSync-53FTXNZZ-BIksLzSL.js.br +0 -0
  111. package/dist/_frontend/assets/ShellRouteSync-53FTXNZZ-BIksLzSL.js.gz +0 -0
  112. package/dist/_frontend/assets/SidebarLayout-5WM2BHZG-Ceb_9WvC.js.br +0 -0
  113. package/dist/_frontend/assets/SidebarLayout-5WM2BHZG-Ceb_9WvC.js.gz +0 -0
  114. package/dist/_frontend/assets/SkillSettings-A2OQSQUT-C-AShr7L.js.br +0 -0
  115. package/dist/_frontend/assets/SkillSettings-A2OQSQUT-C-AShr7L.js.gz +0 -0
  116. package/dist/_frontend/assets/WidgetLayout-IKGVAZFV-Q2dDfnNQ.js.br +0 -0
  117. package/dist/_frontend/assets/WidgetLayout-IKGVAZFV-Q2dDfnNQ.js.gz +0 -0
  118. package/dist/_frontend/assets/chunk-4STVL6W6-DO6mK5-E.js.br +0 -0
  119. package/dist/_frontend/assets/chunk-4STVL6W6-DO6mK5-E.js.gz +0 -0
  120. package/dist/_frontend/assets/chunk-62JRHF6Z-BpHQergm.js.br +0 -0
  121. package/dist/_frontend/assets/chunk-62JRHF6Z-BpHQergm.js.gz +0 -0
  122. package/dist/_frontend/assets/chunk-BMLCISMH-BtIzChti.js.br +0 -0
  123. package/dist/_frontend/assets/chunk-BMLCISMH-BtIzChti.js.gz +0 -0
  124. package/dist/_frontend/assets/cssMode-tBxiXBbi.js.br +0 -0
  125. package/dist/_frontend/assets/cssMode-tBxiXBbi.js.gz +0 -0
  126. package/dist/_frontend/assets/freemarker2-C8-_g6KH.js.br +0 -0
  127. package/dist/_frontend/assets/freemarker2-C8-_g6KH.js.gz +0 -0
  128. package/dist/_frontend/assets/handlebars-CVTAyJx2.js.br +0 -0
  129. package/dist/_frontend/assets/handlebars-CVTAyJx2.js.gz +0 -0
  130. package/dist/_frontend/assets/html-CFO-PVK6.js.br +0 -0
  131. package/dist/_frontend/assets/html-CFO-PVK6.js.gz +0 -0
  132. package/dist/_frontend/assets/htmlMode-CFCanlO-.js.br +0 -0
  133. package/dist/_frontend/assets/htmlMode-CFCanlO-.js.gz +0 -0
  134. package/dist/_frontend/assets/index-BIWWiCC7.js.br +0 -0
  135. package/dist/_frontend/assets/index-BIWWiCC7.js.gz +0 -0
  136. package/dist/_frontend/assets/index-CSSyjy0I.js.br +0 -0
  137. package/dist/_frontend/assets/index-CSSyjy0I.js.gz +0 -0
  138. package/dist/_frontend/assets/jsonMode-D5gVPPeB.js.br +0 -0
  139. package/dist/_frontend/assets/jsonMode-D5gVPPeB.js.gz +0 -0
  140. package/dist/_frontend/assets/liquid-DHNaEubO.js.br +0 -0
  141. package/dist/_frontend/assets/liquid-DHNaEubO.js.gz +0 -0
  142. package/dist/_frontend/assets/lspLanguageFeatures-QCSfugnT.js.br +0 -0
  143. package/dist/_frontend/assets/lspLanguageFeatures-QCSfugnT.js.gz +0 -0
  144. package/dist/_frontend/assets/mdx-BXTfxgKC.js.br +0 -0
  145. package/dist/_frontend/assets/mdx-BXTfxgKC.js.gz +0 -0
  146. package/dist/_frontend/assets/python-2xJ5-a_I.js.br +0 -0
  147. package/dist/_frontend/assets/python-2xJ5-a_I.js.gz +0 -0
  148. package/dist/_frontend/assets/razor-pc2nnHiH.js.br +0 -0
  149. package/dist/_frontend/assets/razor-pc2nnHiH.js.gz +0 -0
  150. package/dist/_frontend/assets/tsMode-DDOTqjiA.js.br +0 -0
  151. package/dist/_frontend/assets/tsMode-DDOTqjiA.js.gz +0 -0
  152. package/dist/_frontend/assets/typescript-B8kVUDuw.js.br +0 -0
  153. package/dist/_frontend/assets/typescript-B8kVUDuw.js.gz +0 -0
  154. package/dist/_frontend/assets/workers-BKOSx8Az.js.br +0 -0
  155. package/dist/_frontend/assets/workers-BKOSx8Az.js.gz +0 -0
  156. package/dist/_frontend/assets/xml--HuG4XfW.js.br +0 -0
  157. package/dist/_frontend/assets/xml--HuG4XfW.js.gz +0 -0
  158. package/dist/_frontend/assets/yaml-BM2qwYh9.js.br +0 -0
  159. package/dist/_frontend/assets/yaml-BM2qwYh9.js.gz +0 -0
package/dist/main.js CHANGED
@@ -655,9 +655,7 @@ var init_sqlExpressions2 = __esm({
655
655
  });
656
656
 
657
657
  // src/db/sqlite/session-store/queries/turns.ts
658
- import {
659
- CancellationReason as CancellationReason4
660
- } from "@truefoundry/trueforge-core/agent-session/schemas/turn";
658
+ import "@truefoundry/trueforge-core/agent-session/schemas/turn";
661
659
  import { assertCreateTurnThreadDelta } from "@truefoundry/trueforge-core/agent-session/store/assertCreateTurnThreadDelta";
662
660
  import {
663
661
  PreviousTurnRunningError,
@@ -666,7 +664,7 @@ import {
666
664
  SessionStoreInvariantError as SessionStoreInvariantError2,
667
665
  SessionStoreNotFoundError as SessionStoreNotFoundError3,
668
666
  TurnAlreadyExistsError,
669
- TurnNotFoundError,
667
+ TurnNotFoundError as TurnNotFoundError2,
670
668
  TurnNotRunningError
671
669
  } from "@truefoundry/trueforge-core/agent-session/store/SessionStoreErrors";
672
670
  import { getEmptyCurrentContextUsage } from "@truefoundry/trueforge-core/core/runtime/contextUsage";
@@ -700,14 +698,14 @@ async function loadTurnState(db, keys) {
700
698
  async function classifyTurnFenceWriteFailure(db, keys) {
701
699
  const state = await loadTurnState(db, keys);
702
700
  if (!state) {
703
- throw new TurnNotFoundError(keys.turn_id);
701
+ throw new TurnNotFoundError2(keys.turn_id);
704
702
  }
705
703
  throw new TurnNotRunningError(keys.turn_id, terminalTurnState(state, keys.turn_id));
706
704
  }
707
705
  async function classifyTurnThreadWriteFailure(db, keys, thread_id) {
708
706
  const state = await loadTurnState(db, keys);
709
707
  if (!state) {
710
- throw new TurnNotFoundError(keys.turn_id);
708
+ throw new TurnNotFoundError2(keys.turn_id);
711
709
  }
712
710
  if (state.status !== "running") {
713
711
  throw new TurnNotRunningError(keys.turn_id, terminalTurnState(state, keys.turn_id));
@@ -717,7 +715,7 @@ async function classifyTurnThreadWriteFailure(db, keys, thread_id) {
717
715
  async function assertTurnRunning(db, keys) {
718
716
  const state = await loadTurnState(db, keys);
719
717
  if (!state) {
720
- throw new TurnNotFoundError(keys.turn_id);
718
+ throw new TurnNotFoundError2(keys.turn_id);
721
719
  }
722
720
  if (state.status !== "running") {
723
721
  throw new TurnNotRunningError(keys.turn_id, terminalTurnState(state, keys.turn_id));
@@ -1048,7 +1046,7 @@ async function freezeAndGetTurn(db, input) {
1048
1046
  return await db.transaction().execute(async (trx) => {
1049
1047
  const cancelledState = {
1050
1048
  status: "cancelled",
1051
- reason: CancellationReason4.CancelledForNextTurn,
1049
+ reason: input.reason,
1052
1050
  completed_at: nowIso()
1053
1051
  };
1054
1052
  const updateResult = await trx.updateTable("turn").set({
@@ -1066,7 +1064,7 @@ async function freezeAndGetTurn(db, input) {
1066
1064
  }
1067
1065
  const record = await assembleTurnRecord(trx, input);
1068
1066
  if (!record) {
1069
- throw new TurnNotFoundError(input.turn_id);
1067
+ throw new TurnNotFoundError2(input.turn_id);
1070
1068
  }
1071
1069
  return record;
1072
1070
  });
@@ -1116,7 +1114,7 @@ async function updateTurnState(db, input) {
1116
1114
  if (numUpdated === 0) {
1117
1115
  const existing = await trx.selectFrom("turn").select([jsonText(sql2.ref("state")).as("state")]).where("session_id", "=", input.session_id).where("turn_id", "=", input.turn_id).executeTakeFirst();
1118
1116
  if (!existing) {
1119
- throw new TurnNotFoundError(input.turn_id);
1117
+ throw new TurnNotFoundError2(input.turn_id);
1120
1118
  }
1121
1119
  throw new TurnNotRunningError(input.turn_id, terminalTurnState(existing.state, input.turn_id));
1122
1120
  }
@@ -1182,7 +1180,7 @@ import {
1182
1180
  } from "@truefoundry/trueforge-core/agent-session/store/SessionEventPageToken";
1183
1181
  import {
1184
1182
  SessionNotFoundError as SessionNotFoundError2,
1185
- TurnNotFoundError as TurnNotFoundError2
1183
+ TurnNotFoundError as TurnNotFoundError3
1186
1184
  } from "@truefoundry/trueforge-core/agent-session/store/SessionStoreErrors";
1187
1185
  import { sql as sql4 } from "kysely";
1188
1186
  async function appendToEvents(db, input) {
@@ -1217,7 +1215,7 @@ async function listTurnEvents(db, input) {
1217
1215
  (join) => join.onRef("e.session_id", "=", "t.session_id").onRef("e.turn_id", "=", "t.turn_id")
1218
1216
  ).select(["t.turn_id", "e.event"]).where("t.session_id", "=", input.session_id).where("t.turn_id", "=", input.turn_id).orderBy("e.event_id", eventOrder).execute();
1219
1217
  if (rows.length === 0) {
1220
- throw new TurnNotFoundError2(input.turn_id);
1218
+ throw new TurnNotFoundError3(input.turn_id);
1221
1219
  }
1222
1220
  const events = [];
1223
1221
  for (const row of rows) {
@@ -1265,7 +1263,7 @@ async function listSessionEvents(db, input) {
1265
1263
  };
1266
1264
  const anchor = await db.selectFrom("turn").select(["turn_id", jsonText(sql4.ref("ancestor_ids")).as("ancestor_ids")]).where("session_id", "=", input.session_id).where("turn_id", "=", cursor.last_turn_id).executeTakeFirst();
1267
1265
  if (!anchor) {
1268
- throw new TurnNotFoundError2(cursor.last_turn_id);
1266
+ throw new TurnNotFoundError3(cursor.last_turn_id);
1269
1267
  }
1270
1268
  const chainIds = await resolveAncestorChain(db, input.session_id, {
1271
1269
  turn_id: anchor.turn_id,
@@ -2104,6 +2102,9 @@ async function consumePendingAuthorization(db, params) {
2104
2102
  ...fromStoredOAuthPendingAuthorizationData(row.auth_data)
2105
2103
  };
2106
2104
  }
2105
+ async function deletePendingAuthorizationsForServer(db, params) {
2106
+ await db.deleteFrom("oauth_pending_authorization").where("oauth_server_id", "=", params.id).execute();
2107
+ }
2107
2108
  var init_pendingAuthorization = __esm({
2108
2109
  "src/db/sqlite/token-store/queries/pendingAuthorization.ts"() {
2109
2110
  "use strict";
@@ -2141,6 +2142,9 @@ async function getTokens(db, params) {
2141
2142
  async function deleteToken(db, params) {
2142
2143
  await db.deleteFrom("oauth_token").where("oauth_server_id", "=", params.id).where("user_id", "=", params.userRef).execute();
2143
2144
  }
2145
+ async function deleteTokensForServer(db, params) {
2146
+ await db.deleteFrom("oauth_token").where("oauth_server_id", "=", params.id).execute();
2147
+ }
2144
2148
  var init_token = __esm({
2145
2149
  "src/db/sqlite/token-store/queries/token.ts"() {
2146
2150
  "use strict";
@@ -2189,6 +2193,12 @@ var init_SqliteOAuthTokenStore = __esm({
2189
2193
  deleteToken(params, transaction) {
2190
2194
  return deleteToken(transaction ?? this.db, params);
2191
2195
  }
2196
+ deleteTokensForServer(params, transaction) {
2197
+ return deleteTokensForServer(transaction ?? this.db, params);
2198
+ }
2199
+ deletePendingAuthorizationsForServer(params, transaction) {
2200
+ return deletePendingAuthorizationsForServer(transaction ?? this.db, params);
2201
+ }
2192
2202
  };
2193
2203
  }
2194
2204
  });
@@ -2522,12 +2532,12 @@ var redis_exports = {};
2522
2532
  __export(redis_exports, {
2523
2533
  connectRedis: () => connectRedis
2524
2534
  });
2525
- import { extractErrorLogFields as extractErrorLogFields7 } from "@truefoundry/trueforge-core/core";
2535
+ import { extractErrorLogFields as extractErrorLogFields8 } from "@truefoundry/trueforge-core/core";
2526
2536
  import { createClient } from "redis";
2527
2537
  async function connectRedis(input) {
2528
2538
  const client = createClient({ url: input.url });
2529
2539
  client.on("error", (error) => {
2530
- input.logger.error("[Redis] Client error", extractErrorLogFields7(error));
2540
+ input.logger.error("[Redis] Client error", extractErrorLogFields8(error));
2531
2541
  });
2532
2542
  await client.connect();
2533
2543
  return client;
@@ -2589,9 +2599,7 @@ var init_sqlExpressions4 = __esm({
2589
2599
  });
2590
2600
 
2591
2601
  // src/db/postgres/session-store/queries/turns.ts
2592
- import {
2593
- CancellationReason as CancellationReason5
2594
- } from "@truefoundry/trueforge-core/agent-session/schemas/turn";
2602
+ import "@truefoundry/trueforge-core/agent-session/schemas/turn";
2595
2603
  import { assertCreateTurnThreadDelta as assertCreateTurnThreadDelta2 } from "@truefoundry/trueforge-core/agent-session/store/assertCreateTurnThreadDelta";
2596
2604
  import {
2597
2605
  PreviousTurnRunningError as PreviousTurnRunningError2,
@@ -2600,7 +2608,7 @@ import {
2600
2608
  SessionStoreInvariantError as SessionStoreInvariantError4,
2601
2609
  SessionStoreNotFoundError as SessionStoreNotFoundError4,
2602
2610
  TurnAlreadyExistsError as TurnAlreadyExistsError2,
2603
- TurnNotFoundError as TurnNotFoundError3,
2611
+ TurnNotFoundError as TurnNotFoundError4,
2604
2612
  TurnNotRunningError as TurnNotRunningError2
2605
2613
  } from "@truefoundry/trueforge-core/agent-session/store/SessionStoreErrors";
2606
2614
  import { getEmptyCurrentContextUsage as getEmptyCurrentContextUsage2 } from "@truefoundry/trueforge-core/core/runtime/contextUsage";
@@ -2633,14 +2641,14 @@ function turnRunningFence(db, keys) {
2633
2641
  async function classifyTurnFenceWriteFailure2(db, keys) {
2634
2642
  const row = await db.selectFrom("turn").select("state").where("session_id", "=", keys.session_id).where("turn_id", "=", keys.turn_id).executeTakeFirst();
2635
2643
  if (!row) {
2636
- throw new TurnNotFoundError3(keys.turn_id);
2644
+ throw new TurnNotFoundError4(keys.turn_id);
2637
2645
  }
2638
2646
  throw new TurnNotRunningError2(keys.turn_id, terminalTurnState2(row.state, keys.turn_id));
2639
2647
  }
2640
2648
  async function classifyTurnThreadWriteFailure2(db, keys, thread_id) {
2641
2649
  const row = await db.selectFrom("turn").select("state").where("session_id", "=", keys.session_id).where("turn_id", "=", keys.turn_id).executeTakeFirst();
2642
2650
  if (!row) {
2643
- throw new TurnNotFoundError3(keys.turn_id);
2651
+ throw new TurnNotFoundError4(keys.turn_id);
2644
2652
  }
2645
2653
  if (row.state.status !== "running") {
2646
2654
  throw new TurnNotRunningError2(keys.turn_id, terminalTurnState2(row.state, keys.turn_id));
@@ -2650,7 +2658,7 @@ async function classifyTurnThreadWriteFailure2(db, keys, thread_id) {
2650
2658
  async function assertTurnRunning2(db, keys) {
2651
2659
  const row = await db.selectFrom("turn").select("state").where("session_id", "=", keys.session_id).where("turn_id", "=", keys.turn_id).forShare().executeTakeFirst();
2652
2660
  if (!row) {
2653
- throw new TurnNotFoundError3(keys.turn_id);
2661
+ throw new TurnNotFoundError4(keys.turn_id);
2654
2662
  }
2655
2663
  if (row.state.status !== "running") {
2656
2664
  throw new TurnNotRunningError2(keys.turn_id, terminalTurnState2(row.state, keys.turn_id));
@@ -2905,7 +2913,7 @@ async function freezeAndGetTurn2(db, input) {
2905
2913
  return await db.transaction().execute(async (trx) => {
2906
2914
  const cancelledState = {
2907
2915
  status: "cancelled",
2908
- reason: CancellationReason5.CancelledForNextTurn,
2916
+ reason: input.reason,
2909
2917
  completed_at: (/* @__PURE__ */ new Date()).toISOString()
2910
2918
  };
2911
2919
  const updateResult = await trx.updateTable("turn").set({
@@ -2923,7 +2931,7 @@ async function freezeAndGetTurn2(db, input) {
2923
2931
  }
2924
2932
  const record = await assembleTurnRecord2(trx, input);
2925
2933
  if (!record) {
2926
- throw new TurnNotFoundError3(input.turn_id);
2934
+ throw new TurnNotFoundError4(input.turn_id);
2927
2935
  }
2928
2936
  return record;
2929
2937
  });
@@ -2964,7 +2972,7 @@ async function updateTurnState2(db, input) {
2964
2972
  if (numUpdated === 0) {
2965
2973
  const existing = await trx.selectFrom("turn").select("state").where("session_id", "=", input.session_id).where("turn_id", "=", input.turn_id).executeTakeFirst();
2966
2974
  if (!existing) {
2967
- throw new TurnNotFoundError3(input.turn_id);
2975
+ throw new TurnNotFoundError4(input.turn_id);
2968
2976
  }
2969
2977
  throw new TurnNotRunningError2(input.turn_id, terminalTurnState2(existing.state, input.turn_id));
2970
2978
  }
@@ -3032,7 +3040,7 @@ import {
3032
3040
  } from "@truefoundry/trueforge-core/agent-session/store/SessionEventPageToken";
3033
3041
  import {
3034
3042
  SessionNotFoundError as SessionNotFoundError5,
3035
- TurnNotFoundError as TurnNotFoundError4
3043
+ TurnNotFoundError as TurnNotFoundError5
3036
3044
  } from "@truefoundry/trueforge-core/agent-session/store/SessionStoreErrors";
3037
3045
  import { sql as sql13 } from "kysely";
3038
3046
  async function appendToEvents2(db, input) {
@@ -3071,7 +3079,7 @@ async function listTurnEvents2(db, input) {
3071
3079
  (join) => join.onRef("e.session_id", "=", "t.session_id").onRef("e.turn_id", "=", "t.turn_id")
3072
3080
  ).select(["t.turn_id", "e.event"]).where("t.session_id", "=", input.session_id).where("t.turn_id", "=", input.turn_id).orderBy("e.event_id", eventOrder).execute();
3073
3081
  if (rows.length === 0) {
3074
- throw new TurnNotFoundError4(input.turn_id);
3082
+ throw new TurnNotFoundError5(input.turn_id);
3075
3083
  }
3076
3084
  const events = [];
3077
3085
  for (const row of rows) {
@@ -3098,7 +3106,7 @@ async function listSessionEvents2(db, input) {
3098
3106
  };
3099
3107
  const anchor = await db.selectFrom("turn").select(["turn_id", "ancestor_ids"]).where("session_id", "=", input.session_id).where("turn_id", "=", cursor.last_turn_id).executeTakeFirst();
3100
3108
  if (!anchor) {
3101
- throw new TurnNotFoundError4(cursor.last_turn_id);
3109
+ throw new TurnNotFoundError5(cursor.last_turn_id);
3102
3110
  }
3103
3111
  const chainIds = await resolveAncestorChain2(db, input.session_id, anchor);
3104
3112
  const rows = await db.selectFrom(unnestWithOrdinality(chainIds, "c")).innerJoin(
@@ -3877,6 +3885,9 @@ async function consumePendingAuthorization2(db, params) {
3877
3885
  ...fromStoredOAuthPendingAuthorizationData(row.auth_data)
3878
3886
  };
3879
3887
  }
3888
+ async function deletePendingAuthorizationsForServer2(db, params) {
3889
+ await db.deleteFrom("oauth_pending_authorization").where("oauth_server_id", "=", params.id).execute();
3890
+ }
3880
3891
  var init_pendingAuthorization2 = __esm({
3881
3892
  "src/db/postgres/token-store/queries/pendingAuthorization.ts"() {
3882
3893
  "use strict";
@@ -3914,6 +3925,9 @@ async function getTokens2(db, params) {
3914
3925
  async function deleteToken2(db, params) {
3915
3926
  await db.deleteFrom("oauth_token").where("oauth_server_id", "=", params.id).where("user_id", "=", params.userRef).execute();
3916
3927
  }
3928
+ async function deleteTokensForServer2(db, params) {
3929
+ await db.deleteFrom("oauth_token").where("oauth_server_id", "=", params.id).execute();
3930
+ }
3917
3931
  var init_token2 = __esm({
3918
3932
  "src/db/postgres/token-store/queries/token.ts"() {
3919
3933
  "use strict";
@@ -3962,6 +3976,12 @@ var init_PostgresOAuthTokenStore = __esm({
3962
3976
  deleteToken(params, transaction) {
3963
3977
  return deleteToken2(transaction ?? this.db, params);
3964
3978
  }
3979
+ deleteTokensForServer(params, transaction) {
3980
+ return deleteTokensForServer2(transaction ?? this.db, params);
3981
+ }
3982
+ deletePendingAuthorizationsForServer(params, transaction) {
3983
+ return deletePendingAuthorizationsForServer2(transaction ?? this.db, params);
3984
+ }
3965
3985
  };
3966
3986
  }
3967
3987
  });
@@ -4197,12 +4217,12 @@ var init_PostgresAgentStore = __esm({
4197
4217
  });
4198
4218
 
4199
4219
  // src/main.ts
4200
- import { extractErrorLogFields as extractErrorLogFields8 } from "@truefoundry/trueforge-core/core";
4220
+ import { extractErrorLogFields as extractErrorLogFields9 } from "@truefoundry/trueforge-core/core";
4201
4221
  import { mkdir } from "fs/promises";
4202
4222
  import path6 from "path";
4203
4223
  import { serve } from "@hono/node-server";
4204
4224
  import {
4205
- CancellationReason as CancellationReason6,
4225
+ CancellationReason as CancellationReason4,
4206
4226
  Sessions
4207
4227
  } from "@truefoundry/trueforge-core/agent-session";
4208
4228
  import { RequestReplyExecutor, RequestReplyRouter } from "@truefoundry/trueforge-core/request-reply";
@@ -4210,9 +4230,9 @@ import { RequestReplyExecutor, RequestReplyRouter } from "@truefoundry/trueforge
4210
4230
  // src/app.ts
4211
4231
  import { swaggerUI } from "@hono/swagger-ui";
4212
4232
  import { OpenAPIHono as OpenAPIHono14, z as z24 } from "@hono/zod-openapi";
4213
- import { extractErrorLogFields as extractErrorLogFields6 } from "@truefoundry/trueforge-core/core";
4233
+ import { extractErrorLogFields as extractErrorLogFields7 } from "@truefoundry/trueforge-core/core";
4214
4234
  import { bodyLimit } from "hono/body-limit";
4215
- import { HTTPException as HTTPException6 } from "hono/http-exception";
4235
+ import { HTTPException as HTTPException5 } from "hono/http-exception";
4216
4236
 
4217
4237
  // src/apis/agents.ts
4218
4238
  init_agentStore();
@@ -5170,10 +5190,14 @@ import {
5170
5190
  CancellationReason,
5171
5191
  SessionStoreConflictError,
5172
5192
  SessionStoreInvariantError,
5173
- SessionStoreNotFoundError
5193
+ SessionStoreNotFoundError,
5194
+ TurnNotFoundError
5174
5195
  } from "@truefoundry/trueforge-core/agent-session";
5175
- import { NoResponderError, redisRequest, RequestTimeoutError } from "@truefoundry/trueforge-core/request-reply";
5176
- import { HTTPException as HTTPException3 } from "hono/http-exception";
5196
+ import { extractErrorLogFields } from "@truefoundry/trueforge-core/core";
5197
+ import {
5198
+ redisRequest,
5199
+ RequestTimeoutError
5200
+ } from "@truefoundry/trueforge-core/request-reply";
5177
5201
  import { ulid as ulid2 } from "ulid";
5178
5202
  import { z as z11 } from "zod";
5179
5203
 
@@ -5594,7 +5618,8 @@ function cancelSessionTurnPeerHandler(activeTurns) {
5594
5618
  };
5595
5619
  }
5596
5620
  async function cancelSessionTurn(deps, input) {
5597
- const { sessionId, turnId, reason = CancellationReason.ClientCancelled } = input;
5621
+ const { turnId, reason = CancellationReason.ClientCancelled } = input;
5622
+ const sessionId = deps.session.session_id;
5598
5623
  const turn = await deps.sessionStore.getTurn({
5599
5624
  session_id: sessionId,
5600
5625
  turn_id: turnId
@@ -5617,33 +5642,39 @@ async function cancelSessionTurn(deps, input) {
5617
5642
  pollIntervalMs: config_default.REDIS_REQUEST_REPLY_POLL_INTERVAL_MS
5618
5643
  }
5619
5644
  });
5620
- if (reply.status !== 200 && reply.status !== 412) {
5621
- throw new HTTPException3(500, { message: "Failed to cancel turn on the owning executor", cause: reply });
5645
+ if (reply.status === 200) {
5646
+ return;
5622
5647
  }
5623
5648
  } catch (error) {
5624
- if (error instanceof NoResponderError) {
5625
- throw new HTTPException3(412, {
5626
- message: `Executor owning the running turn is unreachable: ${owner}`,
5627
- cause: error
5628
- });
5629
- }
5649
+ const fields = {
5650
+ sessionId,
5651
+ turnId,
5652
+ owner,
5653
+ ...extractErrorLogFields(error)
5654
+ };
5630
5655
  if (error instanceof RequestTimeoutError) {
5631
- throw new HTTPException3(424, {
5632
- message: "Timed out waiting for the owning executor to cancel the turn",
5633
- cause: error
5634
- });
5635
- }
5636
- if (error instanceof HTTPException3) {
5637
- throw error;
5656
+ deps.logger.warn("Timed out waiting for owning executor to cancel; freezing the running turn", fields);
5657
+ } else {
5658
+ deps.logger.warn("Failed to reach owning executor over Redis; freezing the running turn", fields);
5638
5659
  }
5639
- throw new HTTPException3(500, {
5640
- message: `Unexpected error while cancelling the turn on the owning executor: ${owner}`,
5641
- cause: error
5642
- });
5643
5660
  }
5661
+ await freezeTurnIgnoringMissing(deps.session, { turnId, reason });
5644
5662
  return;
5645
5663
  }
5646
- cancelTurnOnThisExecutor(deps.activeTurns, { sessionId, turnId, reason });
5664
+ const aborted = cancelTurnOnThisExecutor(deps.activeTurns, { sessionId, turnId, reason });
5665
+ if (!aborted) {
5666
+ await freezeTurnIgnoringMissing(deps.session, { turnId, reason });
5667
+ }
5668
+ }
5669
+ async function freezeTurnIgnoringMissing(session, input) {
5670
+ try {
5671
+ await session.freezeTurn({ turn_id: input.turnId, reason: input.reason });
5672
+ } catch (error) {
5673
+ if (error instanceof TurnNotFoundError) {
5674
+ return;
5675
+ }
5676
+ throw error;
5677
+ }
5647
5678
  }
5648
5679
  var FORBIDDEN_SESSION_ACCESS = "Only the session creator can access this session";
5649
5680
  function checkSessionAccess({ userRef, createdBy }) {
@@ -5773,18 +5804,18 @@ function createSessionsRouter(deps) {
5773
5804
  };
5774
5805
  const cancelSessionHandler = async (c) => {
5775
5806
  const { session_id: sessionId } = c.req.valid("param");
5776
- const record = await deps.sessionStore.getSession({ tenant_id: TENANT_ID, session_id: sessionId });
5777
- if (!record) {
5807
+ const session = await deps.sessions.get({ tenant_id: TENANT_ID, session_id: sessionId });
5808
+ if (!session) {
5778
5809
  return c.json({ error: { message: `Session not found: ${sessionId}` } }, 404);
5779
5810
  }
5780
- if (!checkSessionAccess({ userRef: deps.resolveUserContext(c).userRef, createdBy: record.created_by })) {
5811
+ if (!checkSessionAccess({ userRef: deps.resolveUserContext(c).userRef, createdBy: session.record.created_by })) {
5781
5812
  return c.json({ error: { message: FORBIDDEN_SESSION_ACCESS } }, 403);
5782
5813
  }
5783
- const turnId = record.last_turn_id;
5814
+ const turnId = session.record.last_turn_id;
5784
5815
  if (!turnId) {
5785
5816
  return c.json({}, 200);
5786
5817
  }
5787
- await cancelSessionTurn(deps, { sessionId, turnId });
5818
+ await cancelSessionTurn({ ...deps, session }, { turnId });
5788
5819
  return c.json({}, 200);
5789
5820
  };
5790
5821
  const listSessionEventsHandler = async (c) => {
@@ -5908,7 +5939,7 @@ function createAgentsRouter(deps) {
5908
5939
 
5909
5940
  // src/apis/auth.ts
5910
5941
  import { OpenAPIHono as OpenAPIHono3 } from "@hono/zod-openapi";
5911
- import { extractErrorLogFields } from "@truefoundry/trueforge-core/core";
5942
+ import { extractErrorLogFields as extractErrorLogFields2 } from "@truefoundry/trueforge-core/core";
5912
5943
 
5913
5944
  // src/auth/cookies.ts
5914
5945
  init_config();
@@ -6126,7 +6157,7 @@ function resolveUserContext(c) {
6126
6157
  }
6127
6158
 
6128
6159
  // src/auth/middleware.ts
6129
- import { HTTPException as HTTPException4 } from "hono/http-exception";
6160
+ import { HTTPException as HTTPException3 } from "hono/http-exception";
6130
6161
  import { jwtVerify } from "jose";
6131
6162
  var AUTH_HEADER_TYPE = "Bearer";
6132
6163
  function readBearerIdToken(c) {
@@ -6173,14 +6204,14 @@ var authMiddleware = async (c, next) => {
6173
6204
  try {
6174
6205
  const user = await resolveAuthUser(c);
6175
6206
  if (!user) {
6176
- throw new HTTPException4(401, { message: "Authentication required" });
6207
+ throw new HTTPException3(401, { message: "Authentication required" });
6177
6208
  }
6178
6209
  c.set("user_context", user);
6179
6210
  } catch (error) {
6180
- if (error instanceof HTTPException4) {
6211
+ if (error instanceof HTTPException3) {
6181
6212
  throw error;
6182
6213
  }
6183
- throw new HTTPException4(401, { message: "Authentication required", cause: error });
6214
+ throw new HTTPException3(401, { message: "Authentication required", cause: error });
6184
6215
  }
6185
6216
  return next();
6186
6217
  };
@@ -6192,17 +6223,17 @@ var adminAuthMiddleware = async (c, next) => {
6192
6223
  try {
6193
6224
  const user = await resolveAuthUser(c);
6194
6225
  if (!user) {
6195
- throw new HTTPException4(401, { message: "Authentication required" });
6226
+ throw new HTTPException3(401, { message: "Authentication required" });
6196
6227
  }
6197
6228
  if (!isAdmin(user)) {
6198
- throw new HTTPException4(403, { message: "Admin access required" });
6229
+ throw new HTTPException3(403, { message: "Admin access required" });
6199
6230
  }
6200
6231
  c.set("user_context", user);
6201
6232
  } catch (error) {
6202
- if (error instanceof HTTPException4) {
6233
+ if (error instanceof HTTPException3) {
6203
6234
  throw error;
6204
6235
  }
6205
- throw new HTTPException4(401, { message: "Authentication required", cause: error });
6236
+ throw new HTTPException3(401, { message: "Authentication required", cause: error });
6206
6237
  }
6207
6238
  return next();
6208
6239
  };
@@ -6308,7 +6339,7 @@ function createAuthRouter(params) {
6308
6339
  });
6309
6340
  return c.redirect(authorizationUrl, 302);
6310
6341
  } catch (error) {
6311
- params.logger.error("Failed to build login authorization", extractErrorLogFields(error));
6342
+ params.logger.error("Failed to build login authorization", extractErrorLogFields2(error));
6312
6343
  return c.redirect(oauthErrorRedirect("login_failed"), 302);
6313
6344
  }
6314
6345
  });
@@ -6334,7 +6365,7 @@ function createAuthRouter(params) {
6334
6365
  });
6335
6366
  return c.redirect(safeReturnTo(pending.return_to), 302);
6336
6367
  } catch (error) {
6337
- params.logger.error("Failed to exchange authorization code", extractErrorLogFields(error));
6368
+ params.logger.error("Failed to exchange authorization code", extractErrorLogFields2(error));
6338
6369
  const reason = error instanceof Error ? error.message : "login_failed";
6339
6370
  return c.redirect(oauthErrorRedirect(reason), 302);
6340
6371
  }
@@ -6356,7 +6387,7 @@ function createAuthRouter(params) {
6356
6387
 
6357
6388
  // src/apis/capabilities.ts
6358
6389
  import { OpenAPIHono as OpenAPIHono4 } from "@hono/zod-openapi";
6359
- import { extractErrorLogFields as extractErrorLogFields2 } from "@truefoundry/trueforge-core/core";
6390
+ import { extractErrorLogFields as extractErrorLogFields3 } from "@truefoundry/trueforge-core/core";
6360
6391
 
6361
6392
  // src/routes/capabilityRoutes.ts
6362
6393
  import { createRoute as createRoute4, z as z14 } from "@hono/zod-openapi";
@@ -6413,7 +6444,7 @@ function createCapabilitiesRouter(deps) {
6413
6444
  });
6414
6445
  status = refreshed?.status;
6415
6446
  } catch (error) {
6416
- deps.logger.warn("Sandbox image status check failed; reporting sandbox disabled", extractErrorLogFields2(error));
6447
+ deps.logger.warn("Sandbox image status check failed; reporting sandbox disabled", extractErrorLogFields3(error));
6417
6448
  }
6418
6449
  const sandboxEnabled = status === "ready";
6419
6450
  const settingsEnabled = isAdmin(resolveUserContext(c));
@@ -6797,7 +6828,7 @@ function createCatalogRouter(deps) {
6797
6828
 
6798
6829
  // src/apis/mcpOAuth.ts
6799
6830
  import { OpenAPIHono as OpenAPIHono6 } from "@hono/zod-openapi";
6800
- import { extractErrorLogFields as extractErrorLogFields3, McpConnectionError as McpConnectionError3 } from "@truefoundry/trueforge-core/core";
6831
+ import { extractErrorLogFields as extractErrorLogFields4, McpConnectionError as McpConnectionError3 } from "@truefoundry/trueforge-core/core";
6801
6832
 
6802
6833
  // src/routes/mcpOAuthRoutes.ts
6803
6834
  import { createRoute as createRoute6 } from "@hono/zod-openapi";
@@ -6879,10 +6910,10 @@ function createMcpOAuthRouter(deps) {
6879
6910
  });
6880
6911
  } catch (err) {
6881
6912
  if (err instanceof McpConnectionError3) {
6882
- deps.logger.warn("MCP OAuth callback token exchange failed", extractErrorLogFields3(err));
6913
+ deps.logger.warn("MCP OAuth callback token exchange failed", extractErrorLogFields4(err));
6883
6914
  return callbackFailure({ c, pending, message: err.message });
6884
6915
  }
6885
- deps.logger.error("MCP OAuth callback unexpected failure", extractErrorLogFields3(err));
6916
+ deps.logger.error("MCP OAuth callback unexpected failure", extractErrorLogFields4(err));
6886
6917
  return callbackFailure({ c, pending, message: "Internal server error", jsonStatus: 500 });
6887
6918
  }
6888
6919
  return callbackSuccess({ c, pending });
@@ -6896,7 +6927,7 @@ function createMcpOAuthRouter(deps) {
6896
6927
  init_config();
6897
6928
  init_mcpServerStore();
6898
6929
  import { OpenAPIHono as OpenAPIHono7 } from "@hono/zod-openapi";
6899
- import { extractErrorLogFields as extractErrorLogFields4, isAuthRequired, McpConnectionError as McpConnectionError4, RemoteMCP } from "@truefoundry/trueforge-core/core";
6930
+ import { extractErrorLogFields as extractErrorLogFields5, isAuthRequired, McpConnectionError as McpConnectionError4, RemoteMCP } from "@truefoundry/trueforge-core/core";
6900
6931
 
6901
6932
  // src/routes/mcpServerRoutes.ts
6902
6933
  import { createRoute as createRoute7, z as z21 } from "@hono/zod-openapi";
@@ -7274,7 +7305,7 @@ function createSettingsMcpServersRouter(deps) {
7274
7305
  } catch (error) {
7275
7306
  deps.logger.error(
7276
7307
  `DCR client registration failed for "${incomingManifest.name}"; rejecting create`,
7277
- extractErrorLogFields4(error)
7308
+ extractErrorLogFields5(error)
7278
7309
  );
7279
7310
  const message = error instanceof Error ? error.message : "Failed to register OAuth client for this MCP server";
7280
7311
  return c.json({ error: { message } }, 422);
@@ -7330,9 +7361,9 @@ function createSettingsMcpServersRouter(deps) {
7330
7361
  existing: existing?.manifest
7331
7362
  });
7332
7363
  let dcrClientToSave;
7364
+ const urlChanged = existing !== void 0 && existing.manifest.url !== manifest.url && manifest.auth?.type === "dcr";
7333
7365
  if (manifest.auth?.type === "dcr") {
7334
7366
  const existingClient = existing ? await deps.mcpServerStore.getClient({ id: existing.id }, transaction) : void 0;
7335
- const urlChanged = existing && existing.manifest.url !== manifest.url;
7336
7367
  const needsDcr = existingClient === void 0 || urlChanged;
7337
7368
  if (needsDcr) {
7338
7369
  dcrClientToSave = await createMcpOAuthClient({
@@ -7354,6 +7385,10 @@ function createSettingsMcpServersRouter(deps) {
7354
7385
  if (dcrClientToSave !== void 0) {
7355
7386
  await deps.mcpServerStore.saveClient({ id: saved.id, record: dcrClientToSave }, transaction);
7356
7387
  }
7388
+ if (urlChanged) {
7389
+ await deps.tokenStore.deleteTokensForServer({ id: saved.id }, transaction);
7390
+ await deps.tokenStore.deletePendingAuthorizationsForServer({ id: saved.id }, transaction);
7391
+ }
7357
7392
  return saved;
7358
7393
  });
7359
7394
  const token = record.manifest.auth?.type === "dcr" ? await deps.tokenStore.getToken({ id: record.id, userRef }) : void 0;
@@ -7365,7 +7400,7 @@ function createSettingsMcpServersRouter(deps) {
7365
7400
  if (error instanceof McpConnectionError4) {
7366
7401
  deps.logger.error(
7367
7402
  `DCR client registration failed for "${incomingManifest.name}"; rejecting upsert`,
7368
- extractErrorLogFields4(error)
7403
+ extractErrorLogFields5(error)
7369
7404
  );
7370
7405
  return c.json({ error: { message: error.message } }, 422);
7371
7406
  }
@@ -7405,7 +7440,7 @@ function createSettingsMcpServersRouter(deps) {
7405
7440
  return c.json({ data }, 200);
7406
7441
  } catch (error) {
7407
7442
  if (error instanceof McpConnectionError4) {
7408
- deps.logger.warn(`MCP tools/list failed for "${name}"`, extractErrorLogFields4(error));
7443
+ deps.logger.warn(`MCP tools/list failed for "${name}"`, extractErrorLogFields5(error));
7409
7444
  if (error.statusCode === 401) {
7410
7445
  return c.json({ error: { message: error.message } }, 422);
7411
7446
  }
@@ -7452,7 +7487,7 @@ function createMcpServersRouter(deps) {
7452
7487
  return c.json(authStatus, 200);
7453
7488
  } catch (error) {
7454
7489
  if (error instanceof McpConnectionError4) {
7455
- deps.logger.warn(`MCP authorize failed for "${name}"`, extractErrorLogFields4(error));
7490
+ deps.logger.warn(`MCP authorize failed for "${name}"`, extractErrorLogFields5(error));
7456
7491
  if (error.statusCode === 400) {
7457
7492
  return c.json({ error: { message: error.message } }, 400);
7458
7493
  }
@@ -7464,7 +7499,7 @@ function createMcpServersRouter(deps) {
7464
7499
  }
7465
7500
  return c.json({ error: { message: error.message } }, 500);
7466
7501
  }
7467
- deps.logger.error(`MCP authorize unexpected failure for "${name}"`, extractErrorLogFields4(error));
7502
+ deps.logger.error(`MCP authorize unexpected failure for "${name}"`, extractErrorLogFields5(error));
7468
7503
  return c.json({ error: { message: "Internal server error" } }, 500);
7469
7504
  }
7470
7505
  };
@@ -8067,7 +8102,7 @@ import {
8067
8102
  } from "@truefoundry/trueforge-core/agent-session";
8068
8103
  import {
8069
8104
  AgentHarnessError,
8070
- extractErrorLogFields as extractErrorLogFields5,
8105
+ extractErrorLogFields as extractErrorLogFields6,
8071
8106
  isAgentInputUserMessage,
8072
8107
  isFileContentPart,
8073
8108
  McpConnectionError as McpConnectionError5,
@@ -8075,7 +8110,7 @@ import {
8075
8110
  validateSandboxOwnedByTenant,
8076
8111
  VercelAILLM
8077
8112
  } from "@truefoundry/trueforge-core/core";
8078
- import { HTTPException as HTTPException5 } from "hono/http-exception";
8113
+ import { HTTPException as HTTPException4 } from "hono/http-exception";
8079
8114
  import { streamSSE } from "hono/streaming";
8080
8115
 
8081
8116
  // src/routes/turnRoutes.ts
@@ -8660,7 +8695,7 @@ function createTurnResolver(deps) {
8660
8695
  userRef
8661
8696
  });
8662
8697
  if (connection === void 0) {
8663
- throw new HTTPException5(422, {
8698
+ throw new HTTPException4(422, {
8664
8699
  message: `Unknown MCP server "${name}" \u2014 not configured`
8665
8700
  });
8666
8701
  }
@@ -8675,14 +8710,14 @@ function createTurnResolver(deps) {
8675
8710
  logger
8676
8711
  });
8677
8712
  if (provider === void 0) {
8678
- throw new HTTPException5(422, {
8713
+ throw new HTTPException4(422, {
8679
8714
  message: "no sandbox provider configured \u2014 PUT /settings/sandbox-providers"
8680
8715
  });
8681
8716
  }
8682
8717
  if (existingSandboxId === void 0) {
8683
8718
  const status = await checkSnapshotStatus({ store: sandboxProviderStore, tenant_id: TENANT_ID, logger });
8684
8719
  if (status?.status !== "ready") {
8685
- throw new HTTPException5(422, {
8720
+ throw new HTTPException4(422, {
8686
8721
  message: status?.status === "failed" ? `sandbox image build failed (${status.status_reason ?? "unknown error"})` : "sandbox image is activating \u2014 retry shortly"
8687
8722
  });
8688
8723
  }
@@ -8705,7 +8740,7 @@ function createTurnResolver(deps) {
8705
8740
  agent: async (agentId) => {
8706
8741
  const record = await agentStore.getAgent({ tenant_id: TENANT_ID, id: agentId });
8707
8742
  if (record === void 0) {
8708
- throw new HTTPException5(422, { message: `Agent not found: ${agentId}` });
8743
+ throw new HTTPException4(422, { message: `Agent not found: ${agentId}` });
8709
8744
  }
8710
8745
  return record.manifest;
8711
8746
  },
@@ -8757,13 +8792,13 @@ async function drainTurnEvents(input) {
8757
8792
  logger.warn("Turn stream ended after session/turn was removed", {
8758
8793
  sessionId,
8759
8794
  turnId,
8760
- ...extractErrorLogFields5(error)
8795
+ ...extractErrorLogFields6(error)
8761
8796
  });
8762
8797
  } else {
8763
8798
  logger.error("Unexpected error in turn event drain", {
8764
8799
  sessionId,
8765
8800
  turnId,
8766
- ...extractErrorLogFields5(error)
8801
+ ...extractErrorLogFields6(error)
8767
8802
  });
8768
8803
  }
8769
8804
  } finally {
@@ -8775,7 +8810,7 @@ function resolveAfterSequenceNumber(c, bodyAfterSequenceNumber) {
8775
8810
  if (lastEventId) {
8776
8811
  const sequenceNumber = Number(lastEventId);
8777
8812
  if (!Number.isInteger(sequenceNumber) || sequenceNumber < 0) {
8778
- throw new HTTPException5(400, { message: "Invalid Last-Event-Id header" });
8813
+ throw new HTTPException4(400, { message: "Invalid Last-Event-Id header" });
8779
8814
  }
8780
8815
  return sequenceNumber;
8781
8816
  }
@@ -8867,7 +8902,7 @@ function createTurnsRouter(deps) {
8867
8902
  return c.json({ error: { message: error.message } }, error.statusCode);
8868
8903
  }
8869
8904
  deps.logger.error("Sandbox file download failed", {
8870
- ...extractErrorLogFields5(error),
8905
+ ...extractErrorLogFields6(error),
8871
8906
  sessionId,
8872
8907
  turnId,
8873
8908
  sandboxId,
@@ -9003,7 +9038,7 @@ function createTurnsRouter(deps) {
9003
9038
  try {
9004
9039
  await stream.writeSSE(turnEventSsePayload(event, sequenceNumber));
9005
9040
  } catch (error) {
9006
- deps.logger.error("SSE stream write error", extractErrorLogFields5(error));
9041
+ deps.logger.error("SSE stream write error", extractErrorLogFields6(error));
9007
9042
  shouldWriteToSSEStream = false;
9008
9043
  }
9009
9044
  }
@@ -9032,7 +9067,7 @@ function createTurnsRouter(deps) {
9032
9067
  await turnEventStream.assertSubscribable();
9033
9068
  } catch (error) {
9034
9069
  if (error instanceof StreamGoneError) {
9035
- throw new HTTPException5(412, { message: error.message, cause: error });
9070
+ throw new HTTPException4(412, { message: error.message, cause: error });
9036
9071
  }
9037
9072
  throw error;
9038
9073
  }
@@ -9061,7 +9096,7 @@ function createTurnsRouter(deps) {
9061
9096
  }
9062
9097
  } catch (error) {
9063
9098
  if (!subscribeAbort.signal.aborted) {
9064
- deps.logger.error("Unexpected error in turn subscribe SSE loop", extractErrorLogFields5(error));
9099
+ deps.logger.error("Unexpected error in turn subscribe SSE loop", extractErrorLogFields6(error));
9065
9100
  }
9066
9101
  } finally {
9067
9102
  clearTimeout(timeoutHandler);
@@ -9128,16 +9163,16 @@ function createAppErrorHandler(params) {
9128
9163
  if (error instanceof z24.ZodError) {
9129
9164
  return zodErrorResponse(c, error);
9130
9165
  }
9131
- if (error instanceof HTTPException6) {
9166
+ if (error instanceof HTTPException5) {
9132
9167
  if (error.status >= 500) {
9133
9168
  params.logger.error("Server API error", {
9134
9169
  status: error.status,
9135
- ...extractErrorLogFields6(error)
9170
+ ...extractErrorLogFields7(error)
9136
9171
  });
9137
9172
  }
9138
9173
  return c.json({ error: { message: error.message } }, error.status);
9139
9174
  }
9140
- params.logger.error("Unhandled error", extractErrorLogFields6(error));
9175
+ params.logger.error("Unhandled error", extractErrorLogFields7(error));
9141
9176
  return c.json({ error: { message: "Internal server error" } }, 500);
9142
9177
  };
9143
9178
  }
@@ -9289,7 +9324,8 @@ function createServerApp(deps) {
9289
9324
  sandboxProviderStore: deps.sandboxProviderStore,
9290
9325
  redis: deps.redis,
9291
9326
  requestReplyRouter: deps.requestReplyRouter,
9292
- resolveUserContext
9327
+ resolveUserContext,
9328
+ logger: deps.logger
9293
9329
  })
9294
9330
  )
9295
9331
  );
@@ -10080,7 +10116,7 @@ try {
10080
10116
  if (redis) {
10081
10117
  requestReplySubscriber = redis.duplicate();
10082
10118
  requestReplySubscriber.on("error", (error) => {
10083
- logger.error("[RedisSubscriber] Client error", extractErrorLogFields8(error));
10119
+ logger.error("[RedisSubscriber] Client error", extractErrorLogFields9(error));
10084
10120
  });
10085
10121
  await requestReplySubscriber.connect();
10086
10122
  requestReplyExecutor = new RequestReplyExecutor({
@@ -10120,14 +10156,14 @@ try {
10120
10156
  resolve();
10121
10157
  });
10122
10158
  });
10123
- await activeTurns.shutdownAndWait(CancellationReason6.Abandoned);
10159
+ await activeTurns.shutdownAndWait(CancellationReason4.Abandoned);
10124
10160
  await closed;
10125
10161
  await requestReplyExecutor?.drain();
10126
10162
  await requestReplySubscriber?.close().catch((error) => {
10127
- logger.warn("[Redis] Error closing subscriber client during shutdown", extractErrorLogFields8(error));
10163
+ logger.warn("[Redis] Error closing subscriber client during shutdown", extractErrorLogFields9(error));
10128
10164
  });
10129
10165
  await redis?.close().catch((error) => {
10130
- logger.warn("[Redis] Error closing client during shutdown", extractErrorLogFields8(error));
10166
+ logger.warn("[Redis] Error closing client during shutdown", extractErrorLogFields9(error));
10131
10167
  });
10132
10168
  await destroyDb();
10133
10169
  process.exit(0);