@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.
- package/dist/_frontend/assets/{ConnectorSettings-4CYGRWPH-EWp5lwOt.js → ConnectorSettings-XEO5ZQO5-BXis0tQK.js} +1 -1
- package/dist/_frontend/assets/ConnectorSettings-XEO5ZQO5-BXis0tQK.js.br +0 -0
- package/dist/_frontend/assets/ConnectorSettings-XEO5ZQO5-BXis0tQK.js.gz +0 -0
- package/dist/_frontend/assets/{DockLayout-FEDQX2UT-DbN-pvPO.js → DockLayout-F2KYSY4U-D8P84kCr.js} +1 -1
- package/dist/_frontend/assets/{DrawerLayout-NMA7P64K-0IGRaUAW.js → DrawerLayout-FJ7XC2FU-ChH-Qykr.js} +2 -2
- package/dist/_frontend/assets/DrawerLayout-FJ7XC2FU-ChH-Qykr.js.br +0 -0
- package/dist/_frontend/assets/DrawerLayout-FJ7XC2FU-ChH-Qykr.js.gz +0 -0
- package/dist/_frontend/assets/{ModelSettings-H5FKRZLK-CEQWPDWn.js → ModelSettings-2QB7LE22-CDZku4g3.js} +1 -1
- package/dist/_frontend/assets/ModelSettings-2QB7LE22-CDZku4g3.js.br +0 -0
- package/dist/_frontend/assets/ModelSettings-2QB7LE22-CDZku4g3.js.gz +0 -0
- package/dist/_frontend/assets/{SandboxSettings-CBSC3C3G-PWbj0tIQ.js → SandboxSettings-QDDIPRBP-CImJLa0r.js} +1 -1
- package/dist/_frontend/assets/SandboxSettings-QDDIPRBP-CImJLa0r.js.br +0 -0
- package/dist/_frontend/assets/SandboxSettings-QDDIPRBP-CImJLa0r.js.gz +0 -0
- package/dist/_frontend/assets/{SettingsBuilder-EGSH7BUA-Cvx-hLzU.js → SettingsBuilder-4NF3Y7UZ-eXXDLQ6k.js} +2 -2
- package/dist/_frontend/assets/SettingsBuilder-4NF3Y7UZ-eXXDLQ6k.js.br +0 -0
- package/dist/_frontend/assets/SettingsBuilder-4NF3Y7UZ-eXXDLQ6k.js.gz +0 -0
- package/dist/_frontend/assets/{ShellRouteSync-53FTXNZZ-BIksLzSL.js → ShellRouteSync-T4WLY57Q-CetHx5EA.js} +1 -1
- package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-CetHx5EA.js.br +0 -0
- package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-CetHx5EA.js.gz +0 -0
- package/dist/_frontend/assets/{SidebarLayout-5WM2BHZG-Ceb_9WvC.js → SidebarLayout-KX6RSJTP-B8G4CTTb.js} +2 -2
- package/dist/_frontend/assets/SidebarLayout-KX6RSJTP-B8G4CTTb.js.br +0 -0
- package/dist/_frontend/assets/SidebarLayout-KX6RSJTP-B8G4CTTb.js.gz +0 -0
- package/dist/_frontend/assets/{SkillSettings-A2OQSQUT-C-AShr7L.js → SkillSettings-5EETEEDI-DbJE0Ms2.js} +1 -1
- package/dist/_frontend/assets/SkillSettings-5EETEEDI-DbJE0Ms2.js.br +0 -0
- package/dist/_frontend/assets/SkillSettings-5EETEEDI-DbJE0Ms2.js.gz +0 -0
- package/dist/_frontend/assets/{TrueForgeUIWithRouter-2AQ3HW6L-DexVXzlD.js → TrueForgeUIWithRouter-IAQQTD5V-9G1rELmh.js} +1 -1
- package/dist/_frontend/assets/{WidgetLayout-IKGVAZFV-Q2dDfnNQ.js → WidgetLayout-S6EK62TZ-BPf7T3wa.js} +1 -1
- package/dist/_frontend/assets/WidgetLayout-S6EK62TZ-BPf7T3wa.js.br +0 -0
- package/dist/_frontend/assets/WidgetLayout-S6EK62TZ-BPf7T3wa.js.gz +0 -0
- package/dist/_frontend/assets/{chunk-62JRHF6Z-BpHQergm.js → chunk-62JRHF6Z-BUuLA42_.js} +1 -1
- package/dist/_frontend/assets/chunk-62JRHF6Z-BUuLA42_.js.br +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-BUuLA42_.js.gz +0 -0
- package/dist/_frontend/assets/{chunk-4STVL6W6-DO6mK5-E.js → chunk-PTYEOSHT-C4gdhLwo.js} +2 -2
- package/dist/_frontend/assets/chunk-PTYEOSHT-C4gdhLwo.js.br +0 -0
- package/dist/_frontend/assets/chunk-PTYEOSHT-C4gdhLwo.js.gz +0 -0
- package/dist/_frontend/assets/{chunk-BMLCISMH-BtIzChti.js → chunk-X6U2Q7X5-DDlfUle1.js} +1 -1
- package/dist/_frontend/assets/chunk-X6U2Q7X5-DDlfUle1.js.br +0 -0
- package/dist/_frontend/assets/chunk-X6U2Q7X5-DDlfUle1.js.gz +0 -0
- package/dist/_frontend/assets/{cssMode-tBxiXBbi.js → cssMode-C1whwlDW.js} +1 -1
- package/dist/_frontend/assets/cssMode-C1whwlDW.js.br +0 -0
- package/dist/_frontend/assets/cssMode-C1whwlDW.js.gz +0 -0
- package/dist/_frontend/assets/{freemarker2-C8-_g6KH.js → freemarker2-CaMIS9bY.js} +1 -1
- package/dist/_frontend/assets/freemarker2-CaMIS9bY.js.br +0 -0
- package/dist/_frontend/assets/freemarker2-CaMIS9bY.js.gz +0 -0
- package/dist/_frontend/assets/{handlebars-CVTAyJx2.js → handlebars-Donx2d9H.js} +1 -1
- package/dist/_frontend/assets/handlebars-Donx2d9H.js.br +0 -0
- package/dist/_frontend/assets/handlebars-Donx2d9H.js.gz +0 -0
- package/dist/_frontend/assets/{html-CFO-PVK6.js → html-CtI8kZ6e.js} +1 -1
- package/dist/_frontend/assets/html-CtI8kZ6e.js.br +0 -0
- package/dist/_frontend/assets/html-CtI8kZ6e.js.gz +0 -0
- package/dist/_frontend/assets/{htmlMode-CFCanlO-.js → htmlMode-B6ky8VkF.js} +1 -1
- package/dist/_frontend/assets/htmlMode-B6ky8VkF.js.br +0 -0
- package/dist/_frontend/assets/htmlMode-B6ky8VkF.js.gz +0 -0
- package/dist/_frontend/assets/{index-BIWWiCC7.js → index-DFmgzNuj.js} +3 -3
- package/dist/_frontend/assets/index-DFmgzNuj.js.br +0 -0
- package/dist/_frontend/assets/index-DFmgzNuj.js.gz +0 -0
- package/dist/_frontend/assets/{index-CSSyjy0I.js → index-DWr7ad72.js} +202 -197
- package/dist/_frontend/assets/index-DWr7ad72.js.br +0 -0
- package/dist/_frontend/assets/index-DWr7ad72.js.gz +0 -0
- package/dist/_frontend/assets/{javascript-MIQGaM22.js → javascript-BDngdIws.js} +1 -1
- package/dist/_frontend/assets/{jsonMode-D5gVPPeB.js → jsonMode-B7OogXWW.js} +1 -1
- package/dist/_frontend/assets/jsonMode-B7OogXWW.js.br +0 -0
- package/dist/_frontend/assets/jsonMode-B7OogXWW.js.gz +0 -0
- package/dist/_frontend/assets/{liquid-DHNaEubO.js → liquid-D_8RkuUW.js} +1 -1
- package/dist/_frontend/assets/liquid-D_8RkuUW.js.br +0 -0
- package/dist/_frontend/assets/liquid-D_8RkuUW.js.gz +0 -0
- package/dist/_frontend/assets/{lspLanguageFeatures-QCSfugnT.js → lspLanguageFeatures-DJf8_W2N.js} +1 -1
- package/dist/_frontend/assets/lspLanguageFeatures-DJf8_W2N.js.br +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-DJf8_W2N.js.gz +0 -0
- package/dist/_frontend/assets/{mdx-BXTfxgKC.js → mdx-HcpZSZ2w.js} +1 -1
- package/dist/_frontend/assets/mdx-HcpZSZ2w.js.br +0 -0
- package/dist/_frontend/assets/mdx-HcpZSZ2w.js.gz +0 -0
- package/dist/_frontend/assets/{python-2xJ5-a_I.js → python-CPiT1vB4.js} +1 -1
- package/dist/_frontend/assets/python-CPiT1vB4.js.br +0 -0
- package/dist/_frontend/assets/python-CPiT1vB4.js.gz +0 -0
- package/dist/_frontend/assets/{razor-pc2nnHiH.js → razor-oizHS-vq.js} +1 -1
- package/dist/_frontend/assets/razor-oizHS-vq.js.br +0 -0
- package/dist/_frontend/assets/razor-oizHS-vq.js.gz +0 -0
- package/dist/_frontend/assets/{tsMode-DDOTqjiA.js → tsMode-n5kkpKJX.js} +1 -1
- package/dist/_frontend/assets/tsMode-n5kkpKJX.js.br +0 -0
- package/dist/_frontend/assets/tsMode-n5kkpKJX.js.gz +0 -0
- package/dist/_frontend/assets/{typescript-B8kVUDuw.js → typescript-BfXupYGq.js} +1 -1
- package/dist/_frontend/assets/typescript-BfXupYGq.js.br +0 -0
- package/dist/_frontend/assets/typescript-BfXupYGq.js.gz +0 -0
- package/dist/_frontend/assets/{workers-BKOSx8Az.js → workers-DCX6qMOc.js} +1 -1
- package/dist/_frontend/assets/workers-DCX6qMOc.js.br +0 -0
- package/dist/_frontend/assets/workers-DCX6qMOc.js.gz +0 -0
- package/dist/_frontend/assets/{xml--HuG4XfW.js → xml-MX-qfsGl.js} +1 -1
- package/dist/_frontend/assets/xml-MX-qfsGl.js.br +0 -0
- package/dist/_frontend/assets/xml-MX-qfsGl.js.gz +0 -0
- package/dist/_frontend/assets/{yaml-BM2qwYh9.js → yaml-DnKyyO9e.js} +1 -1
- package/dist/_frontend/assets/yaml-DnKyyO9e.js.br +0 -0
- package/dist/_frontend/assets/yaml-DnKyyO9e.js.gz +0 -0
- package/dist/_frontend/index.html +1 -1
- package/dist/_frontend/index.html.br +0 -0
- package/dist/_frontend/index.html.gz +0 -0
- package/dist/main.js +141 -105
- package/dist/main.js.map +1 -1
- package/package.json +2 -2
- package/dist/_frontend/assets/ConnectorSettings-4CYGRWPH-EWp5lwOt.js.br +0 -0
- package/dist/_frontend/assets/ConnectorSettings-4CYGRWPH-EWp5lwOt.js.gz +0 -0
- package/dist/_frontend/assets/DrawerLayout-NMA7P64K-0IGRaUAW.js.br +0 -0
- package/dist/_frontend/assets/DrawerLayout-NMA7P64K-0IGRaUAW.js.gz +0 -0
- package/dist/_frontend/assets/ModelSettings-H5FKRZLK-CEQWPDWn.js.br +0 -0
- package/dist/_frontend/assets/ModelSettings-H5FKRZLK-CEQWPDWn.js.gz +0 -0
- package/dist/_frontend/assets/SandboxSettings-CBSC3C3G-PWbj0tIQ.js.br +0 -0
- package/dist/_frontend/assets/SandboxSettings-CBSC3C3G-PWbj0tIQ.js.gz +0 -0
- package/dist/_frontend/assets/SettingsBuilder-EGSH7BUA-Cvx-hLzU.js.br +0 -0
- package/dist/_frontend/assets/SettingsBuilder-EGSH7BUA-Cvx-hLzU.js.gz +0 -0
- package/dist/_frontend/assets/ShellRouteSync-53FTXNZZ-BIksLzSL.js.br +0 -0
- package/dist/_frontend/assets/ShellRouteSync-53FTXNZZ-BIksLzSL.js.gz +0 -0
- package/dist/_frontend/assets/SidebarLayout-5WM2BHZG-Ceb_9WvC.js.br +0 -0
- package/dist/_frontend/assets/SidebarLayout-5WM2BHZG-Ceb_9WvC.js.gz +0 -0
- package/dist/_frontend/assets/SkillSettings-A2OQSQUT-C-AShr7L.js.br +0 -0
- package/dist/_frontend/assets/SkillSettings-A2OQSQUT-C-AShr7L.js.gz +0 -0
- package/dist/_frontend/assets/WidgetLayout-IKGVAZFV-Q2dDfnNQ.js.br +0 -0
- package/dist/_frontend/assets/WidgetLayout-IKGVAZFV-Q2dDfnNQ.js.gz +0 -0
- package/dist/_frontend/assets/chunk-4STVL6W6-DO6mK5-E.js.br +0 -0
- package/dist/_frontend/assets/chunk-4STVL6W6-DO6mK5-E.js.gz +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-BpHQergm.js.br +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-BpHQergm.js.gz +0 -0
- package/dist/_frontend/assets/chunk-BMLCISMH-BtIzChti.js.br +0 -0
- package/dist/_frontend/assets/chunk-BMLCISMH-BtIzChti.js.gz +0 -0
- package/dist/_frontend/assets/cssMode-tBxiXBbi.js.br +0 -0
- package/dist/_frontend/assets/cssMode-tBxiXBbi.js.gz +0 -0
- package/dist/_frontend/assets/freemarker2-C8-_g6KH.js.br +0 -0
- package/dist/_frontend/assets/freemarker2-C8-_g6KH.js.gz +0 -0
- package/dist/_frontend/assets/handlebars-CVTAyJx2.js.br +0 -0
- package/dist/_frontend/assets/handlebars-CVTAyJx2.js.gz +0 -0
- package/dist/_frontend/assets/html-CFO-PVK6.js.br +0 -0
- package/dist/_frontend/assets/html-CFO-PVK6.js.gz +0 -0
- package/dist/_frontend/assets/htmlMode-CFCanlO-.js.br +0 -0
- package/dist/_frontend/assets/htmlMode-CFCanlO-.js.gz +0 -0
- package/dist/_frontend/assets/index-BIWWiCC7.js.br +0 -0
- package/dist/_frontend/assets/index-BIWWiCC7.js.gz +0 -0
- package/dist/_frontend/assets/index-CSSyjy0I.js.br +0 -0
- package/dist/_frontend/assets/index-CSSyjy0I.js.gz +0 -0
- package/dist/_frontend/assets/jsonMode-D5gVPPeB.js.br +0 -0
- package/dist/_frontend/assets/jsonMode-D5gVPPeB.js.gz +0 -0
- package/dist/_frontend/assets/liquid-DHNaEubO.js.br +0 -0
- package/dist/_frontend/assets/liquid-DHNaEubO.js.gz +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-QCSfugnT.js.br +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-QCSfugnT.js.gz +0 -0
- package/dist/_frontend/assets/mdx-BXTfxgKC.js.br +0 -0
- package/dist/_frontend/assets/mdx-BXTfxgKC.js.gz +0 -0
- package/dist/_frontend/assets/python-2xJ5-a_I.js.br +0 -0
- package/dist/_frontend/assets/python-2xJ5-a_I.js.gz +0 -0
- package/dist/_frontend/assets/razor-pc2nnHiH.js.br +0 -0
- package/dist/_frontend/assets/razor-pc2nnHiH.js.gz +0 -0
- package/dist/_frontend/assets/tsMode-DDOTqjiA.js.br +0 -0
- package/dist/_frontend/assets/tsMode-DDOTqjiA.js.gz +0 -0
- package/dist/_frontend/assets/typescript-B8kVUDuw.js.br +0 -0
- package/dist/_frontend/assets/typescript-B8kVUDuw.js.gz +0 -0
- package/dist/_frontend/assets/workers-BKOSx8Az.js.br +0 -0
- package/dist/_frontend/assets/workers-BKOSx8Az.js.gz +0 -0
- package/dist/_frontend/assets/xml--HuG4XfW.js.br +0 -0
- package/dist/_frontend/assets/xml--HuG4XfW.js.gz +0 -0
- package/dist/_frontend/assets/yaml-BM2qwYh9.js.br +0 -0
- 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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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",
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4233
|
+
import { extractErrorLogFields as extractErrorLogFields7 } from "@truefoundry/trueforge-core/core";
|
|
4214
4234
|
import { bodyLimit } from "hono/body-limit";
|
|
4215
|
-
import { HTTPException as
|
|
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 {
|
|
5176
|
-
import {
|
|
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 {
|
|
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
|
|
5621
|
-
|
|
5645
|
+
if (reply.status === 200) {
|
|
5646
|
+
return;
|
|
5622
5647
|
}
|
|
5623
5648
|
} catch (error) {
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
5629
|
-
}
|
|
5649
|
+
const fields = {
|
|
5650
|
+
sessionId,
|
|
5651
|
+
turnId,
|
|
5652
|
+
owner,
|
|
5653
|
+
...extractErrorLogFields(error)
|
|
5654
|
+
};
|
|
5630
5655
|
if (error instanceof RequestTimeoutError) {
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
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
|
|
5777
|
-
if (!
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
6211
|
+
if (error instanceof HTTPException3) {
|
|
6181
6212
|
throw error;
|
|
6182
6213
|
}
|
|
6183
|
-
throw new
|
|
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
|
|
6226
|
+
throw new HTTPException3(401, { message: "Authentication required" });
|
|
6196
6227
|
}
|
|
6197
6228
|
if (!isAdmin(user)) {
|
|
6198
|
-
throw new
|
|
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
|
|
6233
|
+
if (error instanceof HTTPException3) {
|
|
6203
6234
|
throw error;
|
|
6204
6235
|
}
|
|
6205
|
-
throw new
|
|
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",
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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",
|
|
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",
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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}"`,
|
|
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}"`,
|
|
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}"`,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
|
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
|
-
...
|
|
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",
|
|
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
|
|
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",
|
|
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
|
|
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
|
-
...
|
|
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",
|
|
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",
|
|
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(
|
|
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",
|
|
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",
|
|
10166
|
+
logger.warn("[Redis] Error closing client during shutdown", extractErrorLogFields9(error));
|
|
10131
10167
|
});
|
|
10132
10168
|
await destroyDb();
|
|
10133
10169
|
process.exit(0);
|