@truefoundry/trueforge 0.2.0-rc.1 → 0.2.0-rc.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 (241) hide show
  1. package/dist/_frontend/assets/{AgentCodeSnippets-NZOFJE57-Bn94i1Ie.js → AgentCodeSnippets-637HQUXD-C5c8zg9J.js} +1 -1
  2. package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js.br +0 -0
  3. package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js.gz +0 -0
  4. package/dist/_frontend/assets/{AgentMetricChart-JPU3MFQ2-pn-oatgo.js → AgentMetricChart-4FYECRIN-BN07l9mr.js} +1 -1
  5. package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js.br +0 -0
  6. package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js.gz +0 -0
  7. package/dist/_frontend/assets/{AgentOverview-EEBHJC32-Bn4qidnv.js → AgentOverview-3FJ5EE6N-D1pX5Emq.js} +1 -1
  8. package/dist/_frontend/assets/AgentOverview-3FJ5EE6N-D1pX5Emq.js.br +0 -0
  9. package/dist/_frontend/assets/AgentOverview-3FJ5EE6N-D1pX5Emq.js.gz +0 -0
  10. package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js +1 -0
  11. package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js.br +0 -0
  12. package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js.gz +0 -0
  13. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js +1 -0
  14. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js.br +0 -0
  15. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js.gz +0 -0
  16. package/dist/_frontend/assets/{AgentSessions-3MPDZASK-Dp6vYfGN.js → AgentSessions-T7MOGOTZ-wppcDkIn.js} +1 -1
  17. package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js.br +0 -0
  18. package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js.gz +0 -0
  19. package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js +1 -0
  20. package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js.br +0 -0
  21. package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js.gz +0 -0
  22. package/dist/_frontend/assets/{DockLayout-LM4AFMFY-DoBwJ3-e.js → DockLayout-NLFNU6F2-BGJvqqVS.js} +1 -1
  23. package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js +2 -0
  24. package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js.br +0 -0
  25. package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js.gz +0 -0
  26. package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js +1 -0
  27. package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js.br +0 -0
  28. package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js.gz +0 -0
  29. package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js +1 -0
  30. package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js.br +0 -0
  31. package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js.gz +0 -0
  32. package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js +1 -0
  33. package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js.br +0 -0
  34. package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js.gz +0 -0
  35. package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js +2 -0
  36. package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js.br +0 -0
  37. package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js.gz +0 -0
  38. package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js +1 -0
  39. package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js.br +0 -0
  40. package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js.gz +0 -0
  41. package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js +2 -0
  42. package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js.br +0 -0
  43. package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js.gz +0 -0
  44. package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js +1 -0
  45. package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js.br +0 -0
  46. package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js.gz +0 -0
  47. package/dist/_frontend/assets/TrueForgeUIWithRouter-3TSLV22Q-BiR4AwMi.js +1 -0
  48. package/dist/_frontend/assets/{WidgetLayout-6QM45OQQ-Bp0tde9v.js → WidgetLayout-Q5P7PYSJ-D-NJInrA.js} +1 -1
  49. package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js.br +0 -0
  50. package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js.gz +0 -0
  51. package/dist/_frontend/assets/{chunk-62JRHF6Z-BLb_tkPU.js → chunk-62JRHF6Z-gAUkEAjv.js} +1 -1
  52. package/dist/_frontend/assets/chunk-62JRHF6Z-gAUkEAjv.js.br +0 -0
  53. package/dist/_frontend/assets/chunk-62JRHF6Z-gAUkEAjv.js.gz +0 -0
  54. package/dist/_frontend/assets/{chunk-FJW36PD7-R_XSoO50.js → chunk-I3AL54MA--fCRbraS.js} +2 -2
  55. package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js.br +0 -0
  56. package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js.gz +0 -0
  57. package/dist/_frontend/assets/{chunk-WVE3F724-CL71bP7s.js → chunk-SQGT43Z3-Di5-vYAQ.js} +1 -1
  58. package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js.br +0 -0
  59. package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js.gz +0 -0
  60. package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js +1 -0
  61. package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js.br +0 -0
  62. package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js.gz +0 -0
  63. package/dist/_frontend/assets/{cssMode-CVefs5W-.js → cssMode-Bmk_AUwV.js} +1 -1
  64. package/dist/_frontend/assets/cssMode-Bmk_AUwV.js.br +0 -0
  65. package/dist/_frontend/assets/cssMode-Bmk_AUwV.js.gz +0 -0
  66. package/dist/_frontend/assets/{freemarker2-mt8l8QVE.js → freemarker2-BqULNxdn.js} +1 -1
  67. package/dist/_frontend/assets/freemarker2-BqULNxdn.js.br +0 -0
  68. package/dist/_frontend/assets/freemarker2-BqULNxdn.js.gz +0 -0
  69. package/dist/_frontend/assets/{handlebars-C97jT8Zn.js → handlebars-D-wN_MMv.js} +1 -1
  70. package/dist/_frontend/assets/handlebars-D-wN_MMv.js.br +0 -0
  71. package/dist/_frontend/assets/handlebars-D-wN_MMv.js.gz +0 -0
  72. package/dist/_frontend/assets/{html-DKtvlaWU.js → html-DX_2Eu_G.js} +1 -1
  73. package/dist/_frontend/assets/html-DX_2Eu_G.js.br +0 -0
  74. package/dist/_frontend/assets/html-DX_2Eu_G.js.gz +0 -0
  75. package/dist/_frontend/assets/{htmlMode-BHsrcqlc.js → htmlMode-CqQ0rpq1.js} +1 -1
  76. package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js.br +0 -0
  77. package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js.gz +0 -0
  78. package/dist/_frontend/assets/{index-BW-oaxAt.js → index-CNHFMp3w.js} +3 -3
  79. package/dist/_frontend/assets/index-CNHFMp3w.js.br +0 -0
  80. package/dist/_frontend/assets/index-CNHFMp3w.js.gz +0 -0
  81. package/dist/_frontend/assets/{index-DVCxCjDg.js → index-G4wOqi3O.js} +237 -237
  82. package/dist/_frontend/assets/index-G4wOqi3O.js.br +0 -0
  83. package/dist/_frontend/assets/index-G4wOqi3O.js.gz +0 -0
  84. package/dist/_frontend/assets/index-MPbqVnOf.js +18 -0
  85. package/dist/_frontend/assets/index-MPbqVnOf.js.br +0 -0
  86. package/dist/_frontend/assets/index-MPbqVnOf.js.gz +0 -0
  87. package/dist/_frontend/assets/{index-D8eVAzN5.css → index-SN54UIUh.css} +1 -1
  88. package/dist/_frontend/assets/index-SN54UIUh.css.br +0 -0
  89. package/dist/_frontend/assets/index-SN54UIUh.css.gz +0 -0
  90. package/dist/_frontend/assets/{javascript-Cs0N3w-s.js → javascript-CO_8uS79.js} +1 -1
  91. package/dist/_frontend/assets/{jsonMode-CqrfFSVA.js → jsonMode-D0kqu8c3.js} +1 -1
  92. package/dist/_frontend/assets/jsonMode-D0kqu8c3.js.br +0 -0
  93. package/dist/_frontend/assets/jsonMode-D0kqu8c3.js.gz +0 -0
  94. package/dist/_frontend/assets/{liquid-C11lKF6J.js → liquid-CB807zJs.js} +1 -1
  95. package/dist/_frontend/assets/liquid-CB807zJs.js.br +0 -0
  96. package/dist/_frontend/assets/liquid-CB807zJs.js.gz +0 -0
  97. package/dist/_frontend/assets/{lspLanguageFeatures-DBZtnSMo.js → lspLanguageFeatures-D0-0mkv4.js} +1 -1
  98. package/dist/_frontend/assets/lspLanguageFeatures-D0-0mkv4.js.br +0 -0
  99. package/dist/_frontend/assets/lspLanguageFeatures-D0-0mkv4.js.gz +0 -0
  100. package/dist/_frontend/assets/{mdx-CCo4oKJJ.js → mdx-7_H2_m8y.js} +1 -1
  101. package/dist/_frontend/assets/mdx-7_H2_m8y.js.br +0 -0
  102. package/dist/_frontend/assets/mdx-7_H2_m8y.js.gz +0 -0
  103. package/dist/_frontend/assets/{python-627g_SSG.js → python-DhB7kQ15.js} +1 -1
  104. package/dist/_frontend/assets/python-DhB7kQ15.js.br +0 -0
  105. package/dist/_frontend/assets/python-DhB7kQ15.js.gz +0 -0
  106. package/dist/_frontend/assets/{razor-BGDxoA7p.js → razor-CDzQiIjH.js} +1 -1
  107. package/dist/_frontend/assets/razor-CDzQiIjH.js.br +0 -0
  108. package/dist/_frontend/assets/razor-CDzQiIjH.js.gz +0 -0
  109. package/dist/_frontend/assets/{tsMode-gPT7Bbjh.js → tsMode-CVP7xaF5.js} +1 -1
  110. package/dist/_frontend/assets/tsMode-CVP7xaF5.js.br +0 -0
  111. package/dist/_frontend/assets/tsMode-CVP7xaF5.js.gz +0 -0
  112. package/dist/_frontend/assets/{typescript-Cb0PzreF.js → typescript-BTAuo6jN.js} +1 -1
  113. package/dist/_frontend/assets/typescript-BTAuo6jN.js.br +0 -0
  114. package/dist/_frontend/assets/typescript-BTAuo6jN.js.gz +0 -0
  115. package/dist/_frontend/assets/{workers-BAgwFgJ0.js → workers-Dl5avODY.js} +1 -1
  116. package/dist/_frontend/assets/workers-Dl5avODY.js.br +0 -0
  117. package/dist/_frontend/assets/workers-Dl5avODY.js.gz +0 -0
  118. package/dist/_frontend/assets/{xml-BpvCCHF9.js → xml-CKI7eM7V.js} +1 -1
  119. package/dist/_frontend/assets/xml-CKI7eM7V.js.br +0 -0
  120. package/dist/_frontend/assets/xml-CKI7eM7V.js.gz +0 -0
  121. package/dist/_frontend/assets/{yaml-f3XKmHoH.js → yaml-Czn9FR3r.js} +1 -1
  122. package/dist/_frontend/assets/yaml-Czn9FR3r.js.br +0 -0
  123. package/dist/_frontend/assets/yaml-Czn9FR3r.js.gz +0 -0
  124. package/dist/_frontend/index.html +2 -2
  125. package/dist/controller-main.js +26 -14
  126. package/dist/controller-main.js.map +1 -1
  127. package/dist/main.js +581 -239
  128. package/dist/main.js.map +1 -1
  129. package/dist/postgres/migrations/20260831_000001_session_external_id.js.map +1 -1
  130. package/dist/postgres/migrations/20260902_000002_agent_external_id.js.map +1 -1
  131. package/dist/postgres/migrations/20260903_000002_created_by_subject.js +1 -1
  132. package/dist/postgres/migrations/20260903_000002_created_by_subject.js.map +1 -1
  133. package/dist/postgres/migrations/20260904_000001_schedule_agent_id.js.map +1 -1
  134. package/dist/postgres/migrations/20260904_000002_session_source.js +31 -0
  135. package/dist/postgres/migrations/20260904_000002_session_source.js.map +1 -0
  136. package/dist/postgres/migrations/20260904_000003_session_metadata_gin.js +24 -0
  137. package/dist/postgres/migrations/20260904_000003_session_metadata_gin.js.map +1 -0
  138. package/dist/sqlite/migrations/20260831_000001_session_external_id.js.map +1 -1
  139. package/dist/sqlite/migrations/20260902_000001_session_metadata.js.map +1 -1
  140. package/dist/sqlite/migrations/20260902_000002_agent_external_id.js.map +1 -1
  141. package/dist/sqlite/migrations/20260903_000001_drop_agent_metadata.js.map +1 -1
  142. package/dist/sqlite/migrations/20260903_000002_created_by_subject.js +1 -1
  143. package/dist/sqlite/migrations/20260903_000002_created_by_subject.js.map +1 -1
  144. package/dist/sqlite/migrations/20260904_000001_schedule_agent_id.js.map +1 -1
  145. package/dist/sqlite/migrations/20260904_000002_session_source.js +28 -0
  146. package/dist/sqlite/migrations/20260904_000002_session_source.js.map +1 -0
  147. package/package.json +18 -16
  148. package/dist/_frontend/assets/AgentCodeSnippets-NZOFJE57-Bn94i1Ie.js.br +0 -0
  149. package/dist/_frontend/assets/AgentCodeSnippets-NZOFJE57-Bn94i1Ie.js.gz +0 -0
  150. package/dist/_frontend/assets/AgentMetricChart-JPU3MFQ2-pn-oatgo.js.br +0 -0
  151. package/dist/_frontend/assets/AgentMetricChart-JPU3MFQ2-pn-oatgo.js.gz +0 -0
  152. package/dist/_frontend/assets/AgentOverview-EEBHJC32-Bn4qidnv.js.br +0 -0
  153. package/dist/_frontend/assets/AgentOverview-EEBHJC32-Bn4qidnv.js.gz +0 -0
  154. package/dist/_frontend/assets/AgentSessionEventTimeline-26Z6IB3B-D_yCZz1m.js +0 -1
  155. package/dist/_frontend/assets/AgentSessionEventTimeline-26Z6IB3B-D_yCZz1m.js.br +0 -0
  156. package/dist/_frontend/assets/AgentSessionEventTimeline-26Z6IB3B-D_yCZz1m.js.gz +0 -0
  157. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CGCU7WBK-JGwv6e5T.js +0 -1
  158. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CGCU7WBK-JGwv6e5T.js.br +0 -0
  159. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CGCU7WBK-JGwv6e5T.js.gz +0 -0
  160. package/dist/_frontend/assets/AgentSessions-3MPDZASK-Dp6vYfGN.js.br +0 -0
  161. package/dist/_frontend/assets/AgentSessions-3MPDZASK-Dp6vYfGN.js.gz +0 -0
  162. package/dist/_frontend/assets/ConnectorSettings-MXFRWWR6-BEwXZbPM.js +0 -1
  163. package/dist/_frontend/assets/ConnectorSettings-MXFRWWR6-BEwXZbPM.js.br +0 -0
  164. package/dist/_frontend/assets/ConnectorSettings-MXFRWWR6-BEwXZbPM.js.gz +0 -0
  165. package/dist/_frontend/assets/DrawerLayout-JR3O6RRB-BZ9sffvm.js +0 -2
  166. package/dist/_frontend/assets/DrawerLayout-JR3O6RRB-BZ9sffvm.js.br +0 -0
  167. package/dist/_frontend/assets/DrawerLayout-JR3O6RRB-BZ9sffvm.js.gz +0 -0
  168. package/dist/_frontend/assets/ModelSettings-G7IFNC2Y-DxVYHG2m.js +0 -1
  169. package/dist/_frontend/assets/ModelSettings-G7IFNC2Y-DxVYHG2m.js.br +0 -0
  170. package/dist/_frontend/assets/ModelSettings-G7IFNC2Y-DxVYHG2m.js.gz +0 -0
  171. package/dist/_frontend/assets/SandboxSettings-NXAANMAX-DhC28qE6.js +0 -1
  172. package/dist/_frontend/assets/SandboxSettings-NXAANMAX-DhC28qE6.js.br +0 -0
  173. package/dist/_frontend/assets/SandboxSettings-NXAANMAX-DhC28qE6.js.gz +0 -0
  174. package/dist/_frontend/assets/SchedulesPage-KKLUDO6B-CWdrd7KY.js +0 -1
  175. package/dist/_frontend/assets/SchedulesPage-KKLUDO6B-CWdrd7KY.js.br +0 -0
  176. package/dist/_frontend/assets/SchedulesPage-KKLUDO6B-CWdrd7KY.js.gz +0 -0
  177. package/dist/_frontend/assets/SettingsBuilder-L34IQ56S-BQuxGH5w.js +0 -2
  178. package/dist/_frontend/assets/SettingsBuilder-L34IQ56S-BQuxGH5w.js.br +0 -0
  179. package/dist/_frontend/assets/SettingsBuilder-L34IQ56S-BQuxGH5w.js.gz +0 -0
  180. package/dist/_frontend/assets/ShellRouteSync-CEBETGEJ-C4NOyyck.js +0 -1
  181. package/dist/_frontend/assets/ShellRouteSync-CEBETGEJ-C4NOyyck.js.br +0 -0
  182. package/dist/_frontend/assets/ShellRouteSync-CEBETGEJ-C4NOyyck.js.gz +0 -0
  183. package/dist/_frontend/assets/SidebarLayout-A2HJPPHS-kusjDx4J.js +0 -2
  184. package/dist/_frontend/assets/SidebarLayout-A2HJPPHS-kusjDx4J.js.br +0 -0
  185. package/dist/_frontend/assets/SidebarLayout-A2HJPPHS-kusjDx4J.js.gz +0 -0
  186. package/dist/_frontend/assets/SkillSettings-FGGMSUNO-CjrGBX5J.js +0 -1
  187. package/dist/_frontend/assets/SkillSettings-FGGMSUNO-CjrGBX5J.js.br +0 -0
  188. package/dist/_frontend/assets/SkillSettings-FGGMSUNO-CjrGBX5J.js.gz +0 -0
  189. package/dist/_frontend/assets/TrueForgeUIWithRouter-MZVJWJMB-CZ8BOF1k.js +0 -1
  190. package/dist/_frontend/assets/WidgetLayout-6QM45OQQ-Bp0tde9v.js.br +0 -0
  191. package/dist/_frontend/assets/WidgetLayout-6QM45OQQ-Bp0tde9v.js.gz +0 -0
  192. package/dist/_frontend/assets/chunk-62JRHF6Z-BLb_tkPU.js.br +0 -0
  193. package/dist/_frontend/assets/chunk-62JRHF6Z-BLb_tkPU.js.gz +0 -0
  194. package/dist/_frontend/assets/chunk-DMMZSZTN-BBNhHida.js +0 -1
  195. package/dist/_frontend/assets/chunk-DMMZSZTN-BBNhHida.js.br +0 -0
  196. package/dist/_frontend/assets/chunk-DMMZSZTN-BBNhHida.js.gz +0 -0
  197. package/dist/_frontend/assets/chunk-FJW36PD7-R_XSoO50.js.br +0 -0
  198. package/dist/_frontend/assets/chunk-FJW36PD7-R_XSoO50.js.gz +0 -0
  199. package/dist/_frontend/assets/chunk-WVE3F724-CL71bP7s.js.br +0 -0
  200. package/dist/_frontend/assets/chunk-WVE3F724-CL71bP7s.js.gz +0 -0
  201. package/dist/_frontend/assets/cssMode-CVefs5W-.js.br +0 -0
  202. package/dist/_frontend/assets/cssMode-CVefs5W-.js.gz +0 -0
  203. package/dist/_frontend/assets/freemarker2-mt8l8QVE.js.br +0 -0
  204. package/dist/_frontend/assets/freemarker2-mt8l8QVE.js.gz +0 -0
  205. package/dist/_frontend/assets/handlebars-C97jT8Zn.js.br +0 -0
  206. package/dist/_frontend/assets/handlebars-C97jT8Zn.js.gz +0 -0
  207. package/dist/_frontend/assets/html-DKtvlaWU.js.br +0 -0
  208. package/dist/_frontend/assets/html-DKtvlaWU.js.gz +0 -0
  209. package/dist/_frontend/assets/htmlMode-BHsrcqlc.js.br +0 -0
  210. package/dist/_frontend/assets/htmlMode-BHsrcqlc.js.gz +0 -0
  211. package/dist/_frontend/assets/index-BW-oaxAt.js.br +0 -0
  212. package/dist/_frontend/assets/index-BW-oaxAt.js.gz +0 -0
  213. package/dist/_frontend/assets/index-D8eVAzN5.css.br +0 -0
  214. package/dist/_frontend/assets/index-D8eVAzN5.css.gz +0 -0
  215. package/dist/_frontend/assets/index-DVCxCjDg.js.br +0 -0
  216. package/dist/_frontend/assets/index-DVCxCjDg.js.gz +0 -0
  217. package/dist/_frontend/assets/index-DuKoX4ct.js +0 -18
  218. package/dist/_frontend/assets/index-DuKoX4ct.js.br +0 -0
  219. package/dist/_frontend/assets/index-DuKoX4ct.js.gz +0 -0
  220. package/dist/_frontend/assets/jsonMode-CqrfFSVA.js.br +0 -0
  221. package/dist/_frontend/assets/jsonMode-CqrfFSVA.js.gz +0 -0
  222. package/dist/_frontend/assets/liquid-C11lKF6J.js.br +0 -0
  223. package/dist/_frontend/assets/liquid-C11lKF6J.js.gz +0 -0
  224. package/dist/_frontend/assets/lspLanguageFeatures-DBZtnSMo.js.br +0 -0
  225. package/dist/_frontend/assets/lspLanguageFeatures-DBZtnSMo.js.gz +0 -0
  226. package/dist/_frontend/assets/mdx-CCo4oKJJ.js.br +0 -0
  227. package/dist/_frontend/assets/mdx-CCo4oKJJ.js.gz +0 -0
  228. package/dist/_frontend/assets/python-627g_SSG.js.br +0 -0
  229. package/dist/_frontend/assets/python-627g_SSG.js.gz +0 -0
  230. package/dist/_frontend/assets/razor-BGDxoA7p.js.br +0 -0
  231. package/dist/_frontend/assets/razor-BGDxoA7p.js.gz +0 -0
  232. package/dist/_frontend/assets/tsMode-gPT7Bbjh.js.br +0 -0
  233. package/dist/_frontend/assets/tsMode-gPT7Bbjh.js.gz +0 -0
  234. package/dist/_frontend/assets/typescript-Cb0PzreF.js.br +0 -0
  235. package/dist/_frontend/assets/typescript-Cb0PzreF.js.gz +0 -0
  236. package/dist/_frontend/assets/workers-BAgwFgJ0.js.br +0 -0
  237. package/dist/_frontend/assets/workers-BAgwFgJ0.js.gz +0 -0
  238. package/dist/_frontend/assets/xml-BpvCCHF9.js.br +0 -0
  239. package/dist/_frontend/assets/xml-BpvCCHF9.js.gz +0 -0
  240. package/dist/_frontend/assets/yaml-f3XKmHoH.js.br +0 -0
  241. package/dist/_frontend/assets/yaml-f3XKmHoH.js.gz +0 -0
package/dist/main.js CHANGED
@@ -397,7 +397,14 @@ var init_config = __esm({
397
397
  raw: getEnv("TRUEFOUNDRY_MTLS_ENABLED"),
398
398
  defaultValue: false
399
399
  }),
400
- TRUEFOUNDRY_MTLS_CERTS_DIR: getEnv("TRUEFOUNDRY_MTLS_CERTS_DIR", { defaultValue: "/etc/tls/truefoundry" }) ?? "/etc/tls/truefoundry"
400
+ TRUEFOUNDRY_MTLS_CERTS_DIR: getEnv("TRUEFOUNDRY_MTLS_CERTS_DIR", { defaultValue: "/etc/tls/truefoundry" }) ?? "/etc/tls/truefoundry",
401
+ TRUEFOUNDRY_SANDBOX_ENABLED: parseBoolean({
402
+ envKey: "TRUEFOUNDRY_SANDBOX_ENABLED",
403
+ raw: getEnv("TRUEFOUNDRY_SANDBOX_ENABLED"),
404
+ defaultValue: false
405
+ }),
406
+ TRUEFOUNDRY_SANDBOX_API_KEY: getEnv("TRUEFOUNDRY_SANDBOX_API_KEY", { required: false }),
407
+ TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL: getEnv("TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL", { required: false })
401
408
  };
402
409
  TrueForgeAuthMode = /* @__PURE__ */ ((TrueForgeAuthMode3) => {
403
410
  TrueForgeAuthMode3["Standalone"] = "standalone";
@@ -405,10 +412,19 @@ var init_config = __esm({
405
412
  TrueForgeAuthMode3["TrueFoundry"] = "truefoundry";
406
413
  return TrueForgeAuthMode3;
407
414
  })(TrueForgeAuthMode || {});
408
- if (isTrueFoundryModeEnabled(configuration) && isOidcConfigured(configuration)) {
409
- throw new Error(
410
- "TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URL (TrueFoundry mode) and OIDC (SSO) cannot both be enabled at once."
411
- );
415
+ if (isTrueFoundryModeEnabled(configuration)) {
416
+ if (isOidcConfigured(configuration)) {
417
+ throw new Error(
418
+ "TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URL (TrueFoundry mode) and OIDC (SSO) cannot both be enabled at once."
419
+ );
420
+ }
421
+ if (configuration.TRUEFOUNDRY_SANDBOX_ENABLED) {
422
+ if (configuration.TRUEFOUNDRY_SANDBOX_API_KEY === void 0 || configuration.TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL === void 0) {
423
+ throw new Error(
424
+ "TRUEFOUNDRY_SANDBOX_ENABLED is true but no sandbox provider is configured. Set TRUEFOUNDRY_SANDBOX_API_KEY + TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL, or set TRUEFOUNDRY_SANDBOX_ENABLED=false."
425
+ );
426
+ }
427
+ }
412
428
  }
413
429
  config_default = configuration;
414
430
  }
@@ -2622,17 +2638,6 @@ var init_skillStore = __esm({
2622
2638
  }
2623
2639
  });
2624
2640
 
2625
- // src/db/createdBySubject.ts
2626
- import { CreatedBySubjectSchema as CreatedBySubjectSchema3 } from "@truefoundry/trueforge-core/agent-session";
2627
- function parseStoredCreatedBySubject(value) {
2628
- return CreatedBySubjectSchema3.parse(value);
2629
- }
2630
- var init_createdBySubject = __esm({
2631
- "src/db/createdBySubject.ts"() {
2632
- "use strict";
2633
- }
2634
- });
2635
-
2636
2641
  // src/db/indexes.ts
2637
2642
  var SESSION_EXTERNAL_ID_UQ, AGENT_EXTERNAL_ID_UQ;
2638
2643
  var init_indexes = __esm({
@@ -2795,6 +2800,7 @@ var PostgresAgentStore_exports = {};
2795
2800
  __export(PostgresAgentStore_exports, {
2796
2801
  PostgresAgentStore: () => PostgresAgentStore
2797
2802
  });
2803
+ import { CreatedBySubjectSchema as CreatedBySubjectSchema3 } from "@truefoundry/trueforge-core/agent-session";
2798
2804
  function toRecord(row) {
2799
2805
  return {
2800
2806
  id: row.id,
@@ -2802,7 +2808,7 @@ function toRecord(row) {
2802
2808
  name: row.name,
2803
2809
  manifest: parseStoredAgentSpec(row.manifest),
2804
2810
  external_id: row.external_id,
2805
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject),
2811
+ created_by_subject: CreatedBySubjectSchema3.parse(row.created_by_subject),
2806
2812
  created_at: row.created_at.toISOString(),
2807
2813
  updated_at: row.updated_at.toISOString()
2808
2814
  };
@@ -2824,7 +2830,6 @@ var init_PostgresAgentStore = __esm({
2824
2830
  "use strict";
2825
2831
  init_id();
2826
2832
  init_agentStore();
2827
- init_createdBySubject();
2828
2833
  init_indexes();
2829
2834
  init_client();
2830
2835
  init_sqlExpressions();
@@ -3040,11 +3045,26 @@ var init_client2 = __esm({
3040
3045
  "oauth_client",
3041
3046
  "token",
3042
3047
  "auth_data",
3043
- "created_by_subject"
3048
+ "created_by_subject",
3049
+ "source"
3044
3050
  ]);
3045
3051
  }
3046
3052
  });
3047
3053
 
3054
+ // src/util/crossPlatform.ts
3055
+ import { pathToFileURL } from "url";
3056
+ function importAbsoluteModule(filePath) {
3057
+ if (filePath.endsWith(".ts")) {
3058
+ return import(filePath);
3059
+ }
3060
+ return import(pathToFileURL(filePath).href);
3061
+ }
3062
+ var init_crossPlatform = __esm({
3063
+ "src/util/crossPlatform.ts"() {
3064
+ "use strict";
3065
+ }
3066
+ });
3067
+
3048
3068
  // src/db/migrateSqlite.ts
3049
3069
  var migrateSqlite_exports = {};
3050
3070
  __export(migrateSqlite_exports, {
@@ -3059,6 +3079,7 @@ async function migrateSqliteToLatest(db) {
3059
3079
  provider: new FileMigrationProvider({
3060
3080
  fs: fs2,
3061
3081
  path: path4,
3082
+ import: importAbsoluteModule,
3062
3083
  migrationFolder: path4.join(import.meta.dirname, "sqlite", "migrations")
3063
3084
  })
3064
3085
  });
@@ -3078,6 +3099,7 @@ async function migrateSqliteToLatest(db) {
3078
3099
  var init_migrateSqlite = __esm({
3079
3100
  "src/db/migrateSqlite.ts"() {
3080
3101
  "use strict";
3102
+ init_crossPlatform();
3081
3103
  }
3082
3104
  });
3083
3105
 
@@ -3157,14 +3179,19 @@ function parseTurnCustom(value) {
3157
3179
  }
3158
3180
  async function addSessionCostAndDuration(trx, input) {
3159
3181
  const elapsed_ms = Date.parse(input.turn_state.completed_at) - input.turn_created_at.getTime();
3160
- const total_cost_in_usd = input.turn_state.metrics?.total_cost_in_usd ?? 0;
3161
3182
  const total_duration_ms = elapsed_ms > 0 ? Math.trunc(elapsed_ms) : 0;
3183
+ const turnCost = input.turn_state.metrics?.total_cost_in_usd;
3184
+ const withDuration = sql5`jsonb_set(
3185
+ metrics,
3186
+ '$.total_duration_ms',
3187
+ jsonb((metrics->>'total_duration_ms') + ${total_duration_ms})
3188
+ )`;
3162
3189
  await trx.updateTable("session").set({
3163
- metrics: sql5`jsonb_set(
3164
- jsonb_set(metrics, '$.total_cost_in_usd', jsonb((metrics->>'total_cost_in_usd') + ${total_cost_in_usd})),
3165
- '$.total_duration_ms',
3166
- jsonb((metrics->>'total_duration_ms') + ${total_duration_ms})
3167
- )`
3190
+ metrics: turnCost === void 0 ? withDuration : sql5`jsonb_set(
3191
+ ${withDuration},
3192
+ '$.total_cost_in_usd',
3193
+ jsonb(COALESCE(metrics->>'total_cost_in_usd', 0) + ${turnCost})
3194
+ )`
3168
3195
  }).where("session_id", "=", input.session_id).execute();
3169
3196
  }
3170
3197
  function terminalTurnState(state, turn_id) {
@@ -3807,7 +3834,11 @@ var init_sessionAgentColumns = __esm({
3807
3834
  });
3808
3835
 
3809
3836
  // src/db/sqlite/session-store/queries/sessions.ts
3810
- import { SessionMetadataSchema as SessionMetadataSchema2 } from "@truefoundry/trueforge-core/agent-session";
3837
+ import {
3838
+ CreatedBySubjectSchema as CreatedBySubjectSchema4,
3839
+ SessionMetadataSchema as SessionMetadataSchema2,
3840
+ SessionSourceSchema
3841
+ } from "@truefoundry/trueforge-core/agent-session";
3811
3842
  import {
3812
3843
  decodeSessionListPageToken,
3813
3844
  paginateSessionListRows
@@ -3838,7 +3869,8 @@ function mapRowToSessionRecord(row) {
3838
3869
  return {
3839
3870
  tenant_id: row.tenant_id,
3840
3871
  session_id: row.session_id,
3841
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject),
3872
+ created_by_subject: CreatedBySubjectSchema4.parse(row.created_by_subject),
3873
+ source: SessionSourceSchema.nullable().parse(row.source),
3842
3874
  agent: sessionAgentFromColumns({
3843
3875
  session_id: row.session_id,
3844
3876
  agent_id: row.agent_id,
@@ -3861,6 +3893,7 @@ function sessionSelectColumns() {
3861
3893
  "tenant_id",
3862
3894
  "session_id",
3863
3895
  jsonText(sql8.ref("created_by_subject")).as("created_by_subject"),
3896
+ jsonText(sql8.ref("source")).as("source"),
3864
3897
  "agent_id",
3865
3898
  "agent_name",
3866
3899
  jsonText(sql8.ref("agent_spec")).as("agent_spec"),
@@ -3883,6 +3916,7 @@ async function createSession(db, input) {
3883
3916
  tenant_id: input.tenant_id,
3884
3917
  session_id: input.session_id,
3885
3918
  created_by_subject: jsonbBind(input.created_by_subject),
3919
+ source: input.source !== null ? jsonbBind(input.source) : null,
3886
3920
  agent_id: columns.agent_id,
3887
3921
  agent_name: columns.agent_name,
3888
3922
  agent_spec: columns.agent_spec !== null ? jsonbBind(columns.agent_spec) : null,
@@ -3891,7 +3925,6 @@ async function createSession(db, input) {
3891
3925
  metadata: jsonbBind(input.metadata),
3892
3926
  external_id: input.external_id,
3893
3927
  metrics: jsonbBind({
3894
- total_cost_in_usd: 0,
3895
3928
  total_duration_ms: 0,
3896
3929
  total_turns: 0
3897
3930
  }),
@@ -3973,6 +4006,23 @@ async function listSessions(db, input) {
3973
4006
  query = query.where("agent_id", "=", input.agent_id);
3974
4007
  }
3975
4008
  query = whereCreatedByOrAgentIds2(query, input.created_by_or_agent_ids);
4009
+ if (input.metadata !== void 0) {
4010
+ if (Object.keys(input.metadata).length === 0) {
4011
+ query = query.where(sql8`NOT EXISTS (SELECT 1 FROM json_each(metadata))`);
4012
+ } else {
4013
+ for (const [key, value] of Object.entries(input.metadata)) {
4014
+ query = query.where(
4015
+ sql8`EXISTS (SELECT 1 FROM json_each(metadata) WHERE key = ${key} AND atom = ${value})`
4016
+ );
4017
+ }
4018
+ }
4019
+ }
4020
+ if (input.source_type !== void 0) {
4021
+ query = query.where(sql8`json_extract(source, '$.type')`, "=", input.source_type);
4022
+ }
4023
+ if (input.source_id !== void 0) {
4024
+ query = query.where(sql8`json_extract(source, '$.id')`, "=", input.source_id);
4025
+ }
3976
4026
  if (input.start_timestamp !== void 0) {
3977
4027
  query = query.where("created_at", ">=", input.start_timestamp.toISOString());
3978
4028
  }
@@ -4010,7 +4060,6 @@ async function listSessions(db, input) {
4010
4060
  var init_sessions = __esm({
4011
4061
  "src/db/sqlite/session-store/queries/sessions.ts"() {
4012
4062
  "use strict";
4013
- init_createdBySubject();
4014
4063
  init_sessionAgentColumns();
4015
4064
  init_client2();
4016
4065
  init_sqlExpressions2();
@@ -4979,6 +5028,9 @@ var SqliteAgentStore_exports = {};
4979
5028
  __export(SqliteAgentStore_exports, {
4980
5029
  SqliteAgentStore: () => SqliteAgentStore
4981
5030
  });
5031
+ import {
5032
+ CreatedBySubjectSchema as CreatedBySubjectSchema5
5033
+ } from "@truefoundry/trueforge-core/agent-session";
4982
5034
  function recordColumns5(eb) {
4983
5035
  return [
4984
5036
  "id",
@@ -4995,7 +5047,7 @@ function toRecord3(row) {
4995
5047
  return {
4996
5048
  ...row,
4997
5049
  manifest: parseStoredAgentSpec(row.manifest),
4998
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject)
5050
+ created_by_subject: CreatedBySubjectSchema5.parse(row.created_by_subject)
4999
5051
  };
5000
5052
  }
5001
5053
  var SqliteAgentStore;
@@ -5004,7 +5056,6 @@ var init_SqliteAgentStore = __esm({
5004
5056
  "use strict";
5005
5057
  init_id();
5006
5058
  init_agentStore();
5007
- init_createdBySubject();
5008
5059
  init_client2();
5009
5060
  init_sqlExpressions2();
5010
5061
  SqliteAgentStore = class {
@@ -5115,6 +5166,9 @@ var SqliteScheduleStore_exports = {};
5115
5166
  __export(SqliteScheduleStore_exports, {
5116
5167
  SqliteScheduleStore: () => SqliteScheduleStore
5117
5168
  });
5169
+ import {
5170
+ CreatedBySubjectSchema as CreatedBySubjectSchema6
5171
+ } from "@truefoundry/trueforge-core/agent-session";
5118
5172
  import {
5119
5173
  decodeOffsetPageToken as decodeOffsetPageToken5,
5120
5174
  paginateOffsetRows as paginateOffsetRows4
@@ -5151,13 +5205,13 @@ function toScheduleRecord(row) {
5151
5205
  return {
5152
5206
  ...row,
5153
5207
  manifest: parseStoredScheduleManifest(row.manifest),
5154
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject)
5208
+ created_by_subject: CreatedBySubjectSchema6.parse(row.created_by_subject)
5155
5209
  };
5156
5210
  }
5157
5211
  function toRunRecord(row) {
5158
5212
  return {
5159
5213
  ...row,
5160
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject)
5214
+ created_by_subject: CreatedBySubjectSchema6.parse(row.created_by_subject)
5161
5215
  };
5162
5216
  }
5163
5217
  var SqliteScheduleStore;
@@ -5166,7 +5220,6 @@ var init_SqliteScheduleStore = __esm({
5166
5220
  "use strict";
5167
5221
  init_cron();
5168
5222
  init_id();
5169
- init_createdBySubject();
5170
5223
  init_scheduleStore();
5171
5224
  init_client2();
5172
5225
  init_sqlExpressions2();
@@ -5364,6 +5417,7 @@ function createMigrator(db) {
5364
5417
  provider: new FileMigrationProvider2({
5365
5418
  fs: fs3,
5366
5419
  path: path5,
5420
+ import: importAbsoluteModule,
5367
5421
  migrationFolder: path5.join(import.meta.dirname, "postgres", "migrations")
5368
5422
  }),
5369
5423
  migrationTableSchema: TRUEFORGE_SCHEMA
@@ -5396,6 +5450,7 @@ async function migrateTo(db, targetMigrationName) {
5396
5450
  var init_migratePostgres = __esm({
5397
5451
  "src/db/migratePostgres.ts"() {
5398
5452
  "use strict";
5453
+ init_crossPlatform();
5399
5454
  init_schema();
5400
5455
  }
5401
5456
  });
@@ -5487,18 +5542,18 @@ function incrementSessionTotalTurns() {
5487
5542
  }
5488
5543
  async function addSessionCostAndDuration2(trx, input) {
5489
5544
  const elapsed_ms = Date.parse(input.turn_state.completed_at) - input.turn_created_at.getTime();
5490
- const total_cost_in_usd = input.turn_state.metrics?.total_cost_in_usd ?? 0;
5491
5545
  const total_duration_ms = elapsed_ms > 0 ? Math.trunc(elapsed_ms) : 0;
5546
+ const turnCost = input.turn_state.metrics?.total_cost_in_usd;
5547
+ const withDuration = jsonbSet(
5548
+ sql14`metrics`,
5549
+ sql14`'{total_duration_ms}'`,
5550
+ sql14`to_jsonb((metrics->>'total_duration_ms')::bigint + ${total_duration_ms}::bigint)`
5551
+ );
5492
5552
  await trx.updateTable("session").set({
5493
- metrics: jsonbSet(
5494
- jsonbSet(
5495
- sql14`metrics`,
5496
- sql14`'{total_cost_in_usd}'`,
5497
- sql14`to_jsonb((metrics->>'total_cost_in_usd')::double precision + ${total_cost_in_usd}::double precision)`
5498
- ),
5499
- // bigint: ::int overflows at ~24.8 days of summed ms and would roll back the terminal tx.
5500
- sql14`'{total_duration_ms}'`,
5501
- sql14`to_jsonb((metrics->>'total_duration_ms')::bigint + ${total_duration_ms}::bigint)`
5553
+ metrics: turnCost === void 0 ? withDuration : jsonbSet(
5554
+ withDuration,
5555
+ sql14`'{total_cost_in_usd}'`,
5556
+ sql14`to_jsonb(COALESCE((metrics->>'total_cost_in_usd')::double precision, 0) + ${turnCost}::double precision)`
5502
5557
  )
5503
5558
  }).where("session_id", "=", input.session_id).execute();
5504
5559
  }
@@ -6034,7 +6089,11 @@ var init_events2 = __esm({
6034
6089
  });
6035
6090
 
6036
6091
  // src/db/postgres/session-store/queries/sessions.ts
6037
- import { SessionMetadataSchema as SessionMetadataSchema3 } from "@truefoundry/trueforge-core/agent-session";
6092
+ import {
6093
+ CreatedBySubjectSchema as CreatedBySubjectSchema7,
6094
+ SessionMetadataSchema as SessionMetadataSchema3,
6095
+ SessionSourceSchema as SessionSourceSchema2
6096
+ } from "@truefoundry/trueforge-core/agent-session";
6038
6097
  import {
6039
6098
  decodeSessionListPageToken as decodeSessionListPageToken2,
6040
6099
  paginateSessionListRows as paginateSessionListRows2
@@ -6065,7 +6124,8 @@ function mapRowToSessionRecord2(row) {
6065
6124
  return {
6066
6125
  tenant_id: row.tenant_id,
6067
6126
  session_id: row.session_id,
6068
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject),
6127
+ created_by_subject: CreatedBySubjectSchema7.parse(row.created_by_subject),
6128
+ source: SessionSourceSchema2.nullable().parse(row.source),
6069
6129
  agent: sessionAgentFromColumns({
6070
6130
  session_id: row.session_id,
6071
6131
  agent_id: row.agent_id,
@@ -6091,6 +6151,7 @@ async function createSession2(db, input) {
6091
6151
  tenant_id: input.tenant_id,
6092
6152
  session_id: input.session_id,
6093
6153
  created_by_subject: json(input.created_by_subject),
6154
+ source: input.source !== null ? json(input.source) : null,
6094
6155
  agent_id: columns.agent_id,
6095
6156
  agent_name: columns.agent_name,
6096
6157
  agent_spec: columns.agent_spec !== null ? json(columns.agent_spec) : null,
@@ -6099,7 +6160,6 @@ async function createSession2(db, input) {
6099
6160
  metadata: json(input.metadata),
6100
6161
  external_id: input.external_id,
6101
6162
  metrics: json({
6102
- total_cost_in_usd: 0,
6103
6163
  total_duration_ms: 0,
6104
6164
  total_turns: 0
6105
6165
  }),
@@ -6182,6 +6242,19 @@ async function listSessions2(db, input) {
6182
6242
  query = query.where("agent_id", "=", input.agent_id);
6183
6243
  }
6184
6244
  query = whereCreatedByOrAgentIds(query, input.created_by_or_agent_ids);
6245
+ if (input.metadata !== void 0) {
6246
+ if (Object.keys(input.metadata).length === 0) {
6247
+ query = query.where(sql17`metadata = '{}'::jsonb`);
6248
+ } else {
6249
+ query = query.where(sql17`metadata @> ${json(input.metadata)}`);
6250
+ }
6251
+ }
6252
+ if (input.source_type !== void 0) {
6253
+ query = query.where(sql17`source->>'type'`, "=", input.source_type);
6254
+ }
6255
+ if (input.source_id !== void 0) {
6256
+ query = query.where(sql17`source->>'id'`, "=", input.source_id);
6257
+ }
6185
6258
  if (input.start_timestamp !== void 0) {
6186
6259
  query = query.where("created_at", ">=", input.start_timestamp);
6187
6260
  }
@@ -6219,7 +6292,6 @@ async function listSessions2(db, input) {
6219
6292
  var init_sessions2 = __esm({
6220
6293
  "src/db/postgres/session-store/queries/sessions.ts"() {
6221
6294
  "use strict";
6222
- init_createdBySubject();
6223
6295
  init_indexes();
6224
6296
  init_sessionAgentColumns();
6225
6297
  init_client();
@@ -7168,6 +7240,7 @@ var PostgresScheduleStore_exports = {};
7168
7240
  __export(PostgresScheduleStore_exports, {
7169
7241
  PostgresScheduleStore: () => PostgresScheduleStore
7170
7242
  });
7243
+ import { CreatedBySubjectSchema as CreatedBySubjectSchema8 } from "@truefoundry/trueforge-core/agent-session";
7171
7244
  import {
7172
7245
  decodeOffsetPageToken as decodeOffsetPageToken9,
7173
7246
  paginateOffsetRows as paginateOffsetRows7
@@ -7181,7 +7254,7 @@ function toScheduleRecord2(row) {
7181
7254
  name: row.name,
7182
7255
  manifest: parseStoredScheduleManifest(row.manifest),
7183
7256
  status: row.status,
7184
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject),
7257
+ created_by_subject: CreatedBySubjectSchema8.parse(row.created_by_subject),
7185
7258
  created_at: row.created_at.toISOString(),
7186
7259
  updated_at: row.updated_at.toISOString()
7187
7260
  };
@@ -7194,7 +7267,7 @@ function toRunRecord2(row) {
7194
7267
  name: row.name,
7195
7268
  scheduled_for: row.scheduled_for.toISOString(),
7196
7269
  status: row.status,
7197
- created_by_subject: parseStoredCreatedBySubject(row.created_by_subject),
7270
+ created_by_subject: CreatedBySubjectSchema8.parse(row.created_by_subject),
7198
7271
  triggered_at: row.triggered_at === null ? null : row.triggered_at.toISOString(),
7199
7272
  created_at: row.created_at.toISOString(),
7200
7273
  updated_at: row.updated_at.toISOString()
@@ -7206,7 +7279,6 @@ var init_PostgresScheduleStore = __esm({
7206
7279
  "use strict";
7207
7280
  init_cron();
7208
7281
  init_id();
7209
- init_createdBySubject();
7210
7282
  init_scheduleStore();
7211
7283
  init_client();
7212
7284
  init_sqlExpressions();
@@ -7380,7 +7452,7 @@ var init_PostgresScheduleStore = __esm({
7380
7452
 
7381
7453
  // src/main.ts
7382
7454
  import { extractErrorLogFields as extractErrorLogFields10 } from "@truefoundry/trueforge-core/core";
7383
- import { HTTPException as HTTPException15 } from "hono/http-exception";
7455
+ import { HTTPException as HTTPException17 } from "hono/http-exception";
7384
7456
  import { mkdir as mkdir5 } from "fs/promises";
7385
7457
  import path6 from "path";
7386
7458
 
@@ -7412,6 +7484,9 @@ function getCachedLocalSandboxSupport() {
7412
7484
  return cachedSupport;
7413
7485
  }
7414
7486
  function isLocalSandboxFallbackEnabled() {
7487
+ if (isTrueFoundryModeEnabled(config_default)) {
7488
+ return false;
7489
+ }
7415
7490
  return config_default.STANDALONE && cachedSupport?.supported === true;
7416
7491
  }
7417
7492
 
@@ -7425,7 +7500,7 @@ import { RequestReplyExecutor, RequestReplyRouter } from "@truefoundry/trueforge
7425
7500
 
7426
7501
  // src/app.ts
7427
7502
  import { swaggerUI } from "@hono/swagger-ui";
7428
- import { OpenAPIHono as OpenAPIHono16, z as z29 } from "@hono/zod-openapi";
7503
+ import { OpenAPIHono as OpenAPIHono16, z as z30 } from "@hono/zod-openapi";
7429
7504
  import { extractErrorLogFields as extractErrorLogFields7 } from "@truefoundry/trueforge-core/core";
7430
7505
  import { bodyLimit } from "hono/body-limit";
7431
7506
  import { HTTPException as HTTPException6 } from "hono/http-exception";
@@ -8198,6 +8273,7 @@ async function validateManifest({
8198
8273
  deps,
8199
8274
  modelProviderStore,
8200
8275
  mcpServerStore,
8276
+ sandboxProviderStore,
8201
8277
  tenant_id
8202
8278
  }) {
8203
8279
  await validateAgentSpec({
@@ -8206,7 +8282,7 @@ async function validateManifest({
8206
8282
  modelProviderStore,
8207
8283
  mcpServerStore,
8208
8284
  skillStore: deps.skillStore,
8209
- sandboxProviderStore: deps.sandboxProviderStore
8285
+ sandboxProviderStore
8210
8286
  });
8211
8287
  return spec;
8212
8288
  }
@@ -8229,6 +8305,7 @@ function createAgentsRouter(deps) {
8229
8305
  deps,
8230
8306
  modelProviderStore: deps.resolveModelProviderStore(c),
8231
8307
  mcpServerStore: deps.resolveMcpServerStore(c),
8308
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c),
8232
8309
  tenant_id: requestContext.tenant_id
8233
8310
  });
8234
8311
  try {
@@ -8289,7 +8366,7 @@ function createAgentsRouter(deps) {
8289
8366
  const existing = await agentIfAccessible({
8290
8367
  authorizer: deps.authorizer,
8291
8368
  context: requestContext,
8292
- action: "manage",
8369
+ action: "delete",
8293
8370
  agent: await deps.resolveAgentStore(c).getAgent({ tenant_id: requestContext.tenant_id, id: agentId })
8294
8371
  });
8295
8372
  if (existing === void 0) {
@@ -8316,6 +8393,7 @@ function createAgentsRouter(deps) {
8316
8393
  deps,
8317
8394
  modelProviderStore: deps.resolveModelProviderStore(c),
8318
8395
  mcpServerStore: deps.resolveMcpServerStore(c),
8396
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c),
8319
8397
  tenant_id: requestContext.tenant_id
8320
8398
  });
8321
8399
  const record = await deps.resolveAgentStore(c).updateAgent({
@@ -8924,7 +9002,7 @@ function createCapabilitiesRouter(deps) {
8924
9002
  let status;
8925
9003
  try {
8926
9004
  const refreshed = await checkSnapshotStatus({
8927
- store: deps.sandboxProviderStore,
9005
+ store: deps.resolveSandboxProviderStore(c),
8928
9006
  tenant_id: requestContext.tenant_id,
8929
9007
  logger: deps.logger
8930
9008
  });
@@ -10580,7 +10658,8 @@ function executeScheduledRun(client) {
10580
10658
  return async ({ run, schedule }) => {
10581
10659
  const { data: session } = await client.internal.sessions.getOrCreateByExternalId({
10582
10660
  externalId: run.id,
10583
- agent: { name: schedule.agent_name }
10661
+ agent: { name: schedule.agent_name },
10662
+ source: { type: "schedule", id: schedule.id, runId: run.id }
10584
10663
  });
10585
10664
  const turns = await client.sessions.listTurns(session.id, { limit: 1 });
10586
10665
  if (turns.data.length > 0) {
@@ -10607,7 +10686,8 @@ async function startScheduleRun(params) {
10607
10686
  tenant_id: schedule.tenant_id,
10608
10687
  external_id: run.id,
10609
10688
  created_by_subject: schedule.created_by_subject,
10610
- agent: { type: "reference", id: named.id, name: named.name }
10689
+ agent: { type: "reference", id: named.id, name: named.name },
10690
+ source: { type: "schedule", id: schedule.id, run_id: run.id }
10611
10691
  });
10612
10692
  const { data: turns } = await session.listTurns({ limit: 1 });
10613
10693
  if (turns.length > 0) {
@@ -10999,7 +11079,7 @@ import { HTTPException as HTTPException5 } from "hono/http-exception";
10999
11079
  import { streamSSE } from "hono/streaming";
11000
11080
 
11001
11081
  // src/routes/turnRoutes.ts
11002
- import { createRoute as createRoute10, z as z25 } from "@hono/zod-openapi";
11082
+ import { createRoute as createRoute10, z as z26 } from "@hono/zod-openapi";
11003
11083
 
11004
11084
  // src/schemas/events.ts
11005
11085
  init_common();
@@ -11095,60 +11175,166 @@ var DownloadSandboxFileRequestQuerySchema = z22.object({
11095
11175
  }).openapi("DownloadSandboxFileRequestQuery");
11096
11176
 
11097
11177
  // src/routes/sessionRoutes.ts
11098
- import { createRoute as createRoute9, z as z24 } from "@hono/zod-openapi";
11178
+ import { createRoute as createRoute9, z as z25 } from "@hono/zod-openapi";
11099
11179
 
11100
11180
  // src/schemas/session.ts
11101
11181
  init_common();
11102
- import { z as z23 } from "@hono/zod-openapi";
11182
+ import { z as z24 } from "@hono/zod-openapi";
11103
11183
  import {
11104
11184
  AgentSpecSchema as AgentSpecSchema3,
11105
11185
  SessionMetadataSchema,
11106
11186
  SessionSchema,
11187
+ SessionSourceScheduleSchema,
11188
+ SessionSourceTypeSchema,
11107
11189
  TokenPaginationSchema as TokenPaginationSchema5
11108
11190
  } from "@truefoundry/trueforge-core/agent-session";
11109
- var SessionAgentNameRefSchema = z23.object({ name: NameSchema }).strict().openapi("SessionAgentNameRef");
11110
- var SessionAgentSpecBodySchema = z23.object({ spec: AgentSpecSchema3 }).strict().openapi("SessionAgentSpecBody");
11111
- var CreateSessionAgentSchema = z23.union([SessionAgentNameRefSchema, SessionAgentSpecBodySchema]).openapi("CreateSessionAgent");
11191
+
11192
+ // src/schemas/deepObjectQuery.ts
11193
+ import { z as z23 } from "@hono/zod-openapi";
11194
+ function deepObjectQueryIssue({ name, message }) {
11195
+ return new z23.ZodError([
11196
+ {
11197
+ code: "custom",
11198
+ path: [name],
11199
+ message
11200
+ }
11201
+ ]);
11202
+ }
11203
+ function requireSingleString({ name, key, value }) {
11204
+ if (typeof value === "string") {
11205
+ return value;
11206
+ }
11207
+ if (Array.isArray(value)) {
11208
+ throw deepObjectQueryIssue({ name, message: `Query parameter "${key}" must appear at most once` });
11209
+ }
11210
+ throw deepObjectQueryIssue({ name, message: `Query parameter "${key}" must be a string` });
11211
+ }
11212
+ function honoQueriesToRecord(queries) {
11213
+ const out = {};
11214
+ for (const [key, values2] of Object.entries(queries)) {
11215
+ out[key] = values2.length === 1 ? values2[0] : values2;
11216
+ }
11217
+ return out;
11218
+ }
11219
+ function foldDeepObjectQueryParam({
11220
+ query,
11221
+ name,
11222
+ maxKeys
11223
+ }) {
11224
+ const equalKey = new RegExp(`^${name}\\[([^\\]]+)\\]$`);
11225
+ const nestedBrackets = new RegExp(`^${name}\\[[^\\]]*\\]\\[[^\\]]+\\]`);
11226
+ const out = {};
11227
+ const folded = {};
11228
+ for (const [key, value] of Object.entries(query)) {
11229
+ if (key === name) {
11230
+ throw deepObjectQueryIssue({
11231
+ name,
11232
+ message: `Use ${name}[key]=value query parameters; bare ${name} is not supported`
11233
+ });
11234
+ }
11235
+ if (nestedBrackets.test(key)) {
11236
+ throw deepObjectQueryIssue({
11237
+ name,
11238
+ message: `Nested ${name} query parameters like ${name}[key][\u2026] are not supported; use ${name}[key]=value`
11239
+ });
11240
+ }
11241
+ const equalMatch = equalKey.exec(key);
11242
+ if (equalMatch) {
11243
+ const mapKey = equalMatch[1];
11244
+ if (mapKey === void 0 || mapKey.length === 0) {
11245
+ throw deepObjectQueryIssue({ name, message: `${name} filter key must be non-empty` });
11246
+ }
11247
+ if (Object.hasOwn(folded, mapKey)) {
11248
+ throw deepObjectQueryIssue({ name, message: `Duplicate ${name} filter key "${mapKey}"` });
11249
+ }
11250
+ folded[mapKey] = requireSingleString({ name, key, value });
11251
+ continue;
11252
+ }
11253
+ if (key.startsWith(`${name}[`)) {
11254
+ throw deepObjectQueryIssue({ name, message: `Invalid ${name} query parameter "${key}"` });
11255
+ }
11256
+ out[key] = value;
11257
+ }
11258
+ const filterKeyCount = Object.keys(folded).length;
11259
+ if (maxKeys !== void 0 && filterKeyCount > maxKeys) {
11260
+ throw deepObjectQueryIssue({ name, message: `at most ${String(maxKeys)} ${name} filter keys` });
11261
+ }
11262
+ if (filterKeyCount > 0) {
11263
+ out[name] = folded;
11264
+ }
11265
+ return out;
11266
+ }
11267
+
11268
+ // src/schemas/session.ts
11269
+ var SessionAgentNameRefSchema = z24.object({ name: NameSchema }).strict().openapi("SessionAgentNameRef");
11270
+ var SessionAgentSpecBodySchema = z24.object({ spec: AgentSpecSchema3 }).strict().openapi("SessionAgentSpecBody");
11271
+ var CreateSessionAgentSchema = z24.union([SessionAgentNameRefSchema, SessionAgentSpecBodySchema]).openapi("CreateSessionAgent");
11112
11272
  function isSessionAgentNameRef(agent) {
11113
11273
  return SessionAgentNameRefSchema.safeParse(agent).success;
11114
11274
  }
11115
- var CreateSessionRequestSchema = z23.object({
11275
+ var CreateSessionRequestSchema = z24.object({
11116
11276
  agent: CreateSessionAgentSchema,
11117
11277
  metadata: SessionMetadataSchema.optional()
11118
11278
  }).strict().openapi("CreateSessionRequest");
11119
- var GetOrCreateSessionByExternalIdRequestSchema = z23.object({
11120
- external_id: z23.string().min(1).max(128).describe("Caller-supplied id unique within the tenant."),
11121
- agent: CreateSessionAgentSchema
11279
+ var GetOrCreateSessionByExternalIdRequestSchema = z24.object({
11280
+ external_id: z24.string().min(1).max(128).describe("Caller-supplied id unique within the tenant."),
11281
+ agent: CreateSessionAgentSchema,
11282
+ /** Internal-only provenance; not on public create/update. */
11283
+ source: SessionSourceScheduleSchema.optional()
11122
11284
  }).strict().openapi("GetOrCreateSessionByExternalIdRequest");
11123
- var UpdateSessionRequestSchema = z23.object({
11285
+ var UpdateSessionRequestSchema = z24.object({
11124
11286
  agent: SessionAgentSpecBodySchema.optional(),
11125
11287
  metadata: SessionMetadataSchema.optional()
11126
11288
  }).strict().openapi("UpdateSessionRequest");
11127
- var IsoTimestampQueryParam = z23.iso.datetime({ offset: true }).openapi({ type: "string", format: "date-time" }).transform((s) => new Date(s));
11128
- var ListSessionsRequestQuerySchema = z23.object({
11129
- limit: z23.coerce.number().int().min(1).max(PAGE_LIMIT).optional().default(PAGE_LIMIT).describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(PAGE_LIMIT)}.`),
11130
- order: z23.enum(["asc", "desc"]).optional().default("desc").describe('Sort sessions by `updated_at`. Defaults to "desc".').openapi("ListSessionsOrder"),
11131
- page_token: z23.string().min(1).optional().describe("Opaque keyset cursor from a previous response `next_page_token`."),
11289
+ var IsoTimestampQueryParam = z24.iso.datetime({ offset: true }).openapi({ type: "string", format: "date-time" }).transform((s) => new Date(s));
11290
+ var LIST_SESSIONS_METADATA_FILTER_MAX_KEYS = 10;
11291
+ var ListSessionsRequestQuerySchema = z24.object({
11292
+ limit: z24.coerce.number().int().min(1).max(PAGE_LIMIT).optional().default(PAGE_LIMIT).describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(PAGE_LIMIT)}.`),
11293
+ order: z24.enum(["asc", "desc"]).optional().default("desc").describe('Sort sessions by `updated_at`. Defaults to "desc".').openapi("ListSessionsOrder"),
11294
+ page_token: z24.string().min(1).optional().describe("Opaque keyset cursor from a previous response `next_page_token`."),
11132
11295
  start_timestamp: IsoTimestampQueryParam.optional().describe(
11133
11296
  "Inclusive lower bound on `created_at` (ISO-8601 / RFC 3339)."
11134
11297
  ),
11135
11298
  end_timestamp: IsoTimestampQueryParam.optional().describe(
11136
11299
  "Inclusive upper bound on `created_at` (ISO-8601 / RFC 3339)."
11137
11300
  ),
11138
- agent_id: z23.string().min(1).optional().describe("When set, only sessions bound to this agent id are returned."),
11139
- created_by_me: z23.stringbool().optional().describe("When true, only sessions created by the authenticated subject.").openapi({ type: "boolean" })
11301
+ agent_id: z24.string().min(1).optional().describe("When set, only sessions bound to this agent id are returned."),
11302
+ created_by_me: z24.stringbool().optional().describe("When true, only sessions created by the authenticated subject.").openapi({ type: "boolean" }),
11303
+ metadata: SessionMetadataSchema.optional().openapi({
11304
+ param: {
11305
+ style: "deepObject",
11306
+ explode: true,
11307
+ description: "Exact metadata pairs as metadata[key]=value. Sessions must contain all pairs."
11308
+ }
11309
+ }).transform((metadata) => metadata === void 0 || Object.keys(metadata).length === 0 ? void 0 : metadata),
11310
+ source_type: SessionSourceTypeSchema.optional().describe(
11311
+ "When set, returns only sessions created by this source type."
11312
+ ),
11313
+ source_id: z24.string().min(1).optional().describe("When set, returns only sessions from this specific source. Requires source_type.")
11314
+ }).refine((q) => q.source_id === void 0 || q.source_type !== void 0, {
11315
+ message: "source_id requires source_type",
11316
+ path: ["source_id"]
11140
11317
  }).openapi("ListSessionsRequestQuery");
11141
- var GetSessionResponseSchema = z23.object({
11318
+ function parseListSessionsQuery(raw) {
11319
+ return ListSessionsRequestQuerySchema.parse(
11320
+ foldDeepObjectQueryParam({
11321
+ query: raw,
11322
+ name: "metadata",
11323
+ maxKeys: LIST_SESSIONS_METADATA_FILTER_MAX_KEYS
11324
+ })
11325
+ );
11326
+ }
11327
+ var GetSessionResponseSchema = z24.object({
11142
11328
  data: SessionSchema
11143
11329
  }).openapi("GetSessionResponse");
11144
- var ListSessionsResponseSchema = z23.object({
11145
- data: z23.array(SessionSchema),
11330
+ var ListSessionsResponseSchema = z24.object({
11331
+ data: z24.array(SessionSchema),
11146
11332
  pagination: TokenPaginationSchema5
11147
11333
  }).openapi("ListSessionsResponse");
11148
11334
 
11149
11335
  // src/routes/sessionRoutes.ts
11150
- var SessionIdParamsSchema = z24.object({
11151
- session_id: z24.string().min(1).max(64).describe("Session identifier.")
11336
+ var SessionIdParamsSchema = z25.object({
11337
+ session_id: z25.string().min(1).max(64).describe("Session identifier.")
11152
11338
  });
11153
11339
  var createSessionRoute = createRoute9({
11154
11340
  method: "post",
@@ -11314,7 +11500,7 @@ var listSessionsRoute = createRoute9({
11314
11500
  path: "/",
11315
11501
  tags: ["Agent Sessions" /* AGENT_SESSIONS */],
11316
11502
  summary: "List sessions",
11317
- description: "List the caller's sessions (newest first by default).",
11503
+ description: "List the sessions (newest first by default).",
11318
11504
  "x-fern-sdk-group-name": ["sessions"],
11319
11505
  "x-fern-sdk-method-name": "list",
11320
11506
  "x-fern-pagination": TOKEN_PAGINATION,
@@ -11401,7 +11587,7 @@ var listSessionEventsRoute = createRoute9({
11401
11587
 
11402
11588
  // src/routes/turnRoutes.ts
11403
11589
  var TurnIdParamsSchema = SessionIdParamsSchema.extend({
11404
- turn_id: z25.string().min(1).describe("Turn identifier.")
11590
+ turn_id: z26.string().min(1).describe("Turn identifier.")
11405
11591
  });
11406
11592
  var listTurnsRoute = createRoute10({
11407
11593
  method: "get",
@@ -11475,7 +11661,7 @@ var downloadSandboxFileRoute = createRoute10({
11475
11661
  },
11476
11662
  responses: {
11477
11663
  200: {
11478
- content: { "application/octet-stream": { schema: z25.string().openapi({ format: "binary" }) } },
11664
+ content: { "application/octet-stream": { schema: z26.string().openapi({ format: "binary" }) } },
11479
11665
  description: "File contents."
11480
11666
  },
11481
11667
  400: {
@@ -12310,7 +12496,7 @@ function createTurnsRouter(deps) {
12310
12496
  }
12311
12497
  const provider = await resolveSandboxProvider({
12312
12498
  tenant_id: requestContext.tenant_id,
12313
- store: deps.sandboxProviderStore,
12499
+ store: deps.resolveSandboxProviderStore(c),
12314
12500
  logger: deps.logger,
12315
12501
  sessionId
12316
12502
  });
@@ -12402,12 +12588,12 @@ function createTurnsRouter(deps) {
12402
12588
  if (agent === void 0) {
12403
12589
  return c.json({ error: { message: `Agent not found: ${agentId}` } }, 422);
12404
12590
  }
12405
- const canReadAgent = await deps.authorizer.canAccessAgent({
12591
+ const canUseAgent = await deps.authorizer.canAccessAgent({
12406
12592
  context: requestContext,
12407
- action: "read",
12593
+ action: "use",
12408
12594
  agent
12409
12595
  });
12410
- if (!canReadAgent) {
12596
+ if (!canUseAgent) {
12411
12597
  return c.json({ error: { message: `Agent not found: ${agentId}` } }, 404);
12412
12598
  }
12413
12599
  }
@@ -12420,7 +12606,8 @@ function createTurnsRouter(deps) {
12420
12606
  ...deps,
12421
12607
  modelProviderStore: deps.resolveModelProviderStore(c),
12422
12608
  mcpServerStore: deps.resolveMcpServerStore(c),
12423
- agentStore: deps.resolveAgentStore(c)
12609
+ agentStore: deps.resolveAgentStore(c),
12610
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c)
12424
12611
  }
12425
12612
  };
12426
12613
  try {
@@ -12658,7 +12845,7 @@ function createSchedulesRouter(deps) {
12658
12845
  const agent = await agentIfAccessible({
12659
12846
  authorizer: deps.authorizer,
12660
12847
  context: requestContext,
12661
- action: "read",
12848
+ action: "use",
12662
12849
  agent: await deps.resolveAgentStore(c).getAgent({
12663
12850
  tenant_id: requestContext.tenant_id,
12664
12851
  name: schedule.agent_name
@@ -12722,7 +12909,7 @@ function createSchedulesRouter(deps) {
12722
12909
  const agent = await agentIfAccessible({
12723
12910
  authorizer: deps.authorizer,
12724
12911
  context: requestContext,
12725
- action: "read",
12912
+ action: "use",
12726
12913
  agent: await deps.resolveAgentStore(c).getAgent({ tenant_id: requestContext.tenant_id, name: body.agent_name })
12727
12914
  });
12728
12915
  if (agent === void 0) {
@@ -12859,13 +13046,13 @@ import { OpenAPIHono as OpenAPIHono10 } from "@hono/zod-openapi";
12859
13046
  import { createRoute as createRoute11 } from "@hono/zod-openapi";
12860
13047
 
12861
13048
  // src/schemas/sessionMetrics.ts
12862
- import { z as z26 } from "@hono/zod-openapi";
13049
+ import { z as z27 } from "@hono/zod-openapi";
12863
13050
  var MAX_SESSION_METRICS_WINDOW_MS = 30 * 24 * 60 * 60 * 1e3;
12864
- var SessionMetricsPointSchema = z26.object({
12865
- timestamp: z26.string(),
12866
- value: z26.number().nonnegative()
13051
+ var SessionMetricsPointSchema = z27.object({
13052
+ timestamp: z27.string(),
13053
+ value: z27.number().nonnegative()
12867
13054
  }).strict().openapi("SessionMetricsPoint");
12868
- var SessionMetricsMeterNameSchema = z26.enum([
13055
+ var SessionMetricsMeterNameSchema = z27.enum([
12869
13056
  "total_sessions",
12870
13057
  "total_cost_in_usd",
12871
13058
  "total_turns",
@@ -12882,47 +13069,47 @@ var SessionMetricsMeterNameSchema = z26.enum([
12882
13069
  var METRICS_USD_FERN_ENUM = {
12883
13070
  $: { name: "USD" }
12884
13071
  };
12885
- var MetricsUnitSchema = z26.enum(["count", "$", "ms"]).openapi("MetricsUnit", {
13072
+ var MetricsUnitSchema = z27.enum(["count", "$", "ms"]).openapi("MetricsUnit", {
12886
13073
  "x-fern-enum": METRICS_USD_FERN_ENUM
12887
13074
  });
12888
- var SessionMetricsMeterSchema = z26.object({
13075
+ var SessionMetricsMeterSchema = z27.object({
12889
13076
  name: SessionMetricsMeterNameSchema,
12890
- aggregate_value: z26.number().nonnegative(),
12891
- description: z26.string(),
13077
+ aggregate_value: z27.number().nonnegative(),
13078
+ description: z27.string(),
12892
13079
  unit: MetricsUnitSchema
12893
13080
  }).strict().openapi("SessionMetricsMeter");
12894
- var SessionMetricsMeterResponseSchema = z26.object({
12895
- meters: z26.array(SessionMetricsMeterSchema)
13081
+ var SessionMetricsMeterResponseSchema = z27.object({
13082
+ meters: z27.array(SessionMetricsMeterSchema)
12896
13083
  }).strict().openapi("SessionMetricsMeterResponse");
12897
- var SessionMetricsChartNameSchema = z26.enum(["sessions_over_time", "sessions_cost_over_time", "turns_over_time"]).describe("Session metrics chart to return.").openapi("SessionMetricsChartName");
12898
- var SessionMetricsChartSchema = z26.object({
13084
+ var SessionMetricsChartNameSchema = z27.enum(["sessions_over_time", "sessions_cost_over_time", "turns_over_time"]).describe("Session metrics chart to return.").openapi("SessionMetricsChartName");
13085
+ var SessionMetricsChartSchema = z27.object({
12899
13086
  name: SessionMetricsChartNameSchema,
12900
- display_name: z26.string(),
12901
- description: z26.string(),
12902
- chart_type: z26.literal("line")
13087
+ display_name: z27.string(),
13088
+ description: z27.string(),
13089
+ chart_type: z27.literal("line")
12903
13090
  }).strict().openapi("SessionMetricsChart");
12904
- var SessionMetricsChartResponseSchema = z26.object({
12905
- charts: z26.array(SessionMetricsChartSchema)
13091
+ var SessionMetricsChartResponseSchema = z27.object({
13092
+ charts: z27.array(SessionMetricsChartSchema)
12906
13093
  }).strict().openapi("SessionMetricsChartResponse");
12907
- var SessionMetricsGraphLineSchema = z26.object({
12908
- name: z26.string(),
12909
- values: z26.array(SessionMetricsPointSchema)
13094
+ var SessionMetricsGraphLineSchema = z27.object({
13095
+ name: z27.string(),
13096
+ values: z27.array(SessionMetricsPointSchema)
12910
13097
  }).strict().openapi("SessionMetricsGraphLine");
12911
- var SessionMetricsGraphSchema = z26.object({
13098
+ var SessionMetricsGraphSchema = z27.object({
12912
13099
  name: SessionMetricsChartNameSchema,
12913
- display_name: z26.string(),
12914
- description: z26.string(),
13100
+ display_name: z27.string(),
13101
+ description: z27.string(),
12915
13102
  unit: MetricsUnitSchema,
12916
- chart_type: z26.literal("line"),
12917
- graph_lines: z26.array(SessionMetricsGraphLineSchema)
13103
+ chart_type: z27.literal("line"),
13104
+ graph_lines: z27.array(SessionMetricsGraphLineSchema)
12918
13105
  }).strict().openapi("SessionMetricsGraph");
12919
- var SessionMetricsChartDataResponseSchema = z26.object({
12920
- step: z26.string(),
12921
- graphs: z26.array(SessionMetricsGraphSchema)
13106
+ var SessionMetricsChartDataResponseSchema = z27.object({
13107
+ step: z27.string(),
13108
+ graphs: z27.array(SessionMetricsGraphSchema)
12922
13109
  }).strict().openapi("SessionMetricsChartDataResponse");
12923
- var IsoTimestampQueryParam2 = z26.iso.datetime({ offset: true }).openapi({ type: "string", format: "date-time" }).transform((s) => new Date(s));
12924
- var GetSessionMetricsRequestQueryObjectSchema = z26.object({
12925
- agent_id: z26.string().min(1).max(64).describe("Named agent identifier."),
13110
+ var IsoTimestampQueryParam2 = z27.iso.datetime({ offset: true }).openapi({ type: "string", format: "date-time" }).transform((s) => new Date(s));
13111
+ var GetSessionMetricsRequestQueryObjectSchema = z27.object({
13112
+ agent_id: z27.string().min(1).max(64).describe("Named agent identifier."),
12926
13113
  start_timestamp: IsoTimestampQueryParam2.describe("Inclusive lower bound on session `created_at`."),
12927
13114
  end_timestamp: IsoTimestampQueryParam2.describe("Inclusive upper bound on session `created_at`.")
12928
13115
  });
@@ -12947,17 +13134,17 @@ function refineSessionMetricsTimeWindow(query, ctx) {
12947
13134
  var GetSessionMetricsRequestQuerySchema = GetSessionMetricsRequestQueryObjectSchema.superRefine(
12948
13135
  refineSessionMetricsTimeWindow
12949
13136
  ).openapi("GetSessionMetricsRequestQuery");
12950
- var GetSessionMetricsChartDataRequestQuerySchema = z26.object({
13137
+ var GetSessionMetricsChartDataRequestQuerySchema = z27.object({
12951
13138
  ...GetSessionMetricsRequestQueryObjectSchema.shape,
12952
13139
  chart_name: SessionMetricsChartNameSchema
12953
13140
  }).superRefine(refineSessionMetricsTimeWindow).openapi("GetSessionMetricsChartDataRequestQuery");
12954
- var GetSessionMetricsMeterResponseSchema = z26.object({
13141
+ var GetSessionMetricsMeterResponseSchema = z27.object({
12955
13142
  data: SessionMetricsMeterResponseSchema
12956
13143
  }).openapi("GetSessionMetricsMeterResponse");
12957
- var GetSessionMetricsChartResponseSchema = z26.object({
13144
+ var GetSessionMetricsChartResponseSchema = z27.object({
12958
13145
  data: SessionMetricsChartResponseSchema
12959
13146
  }).openapi("GetSessionMetricsChartResponse");
12960
- var GetSessionMetricsChartDataResponseSchema = z26.object({
13147
+ var GetSessionMetricsChartDataResponseSchema = z27.object({
12961
13148
  data: SessionMetricsChartDataResponseSchema
12962
13149
  }).openapi("GetSessionMetricsChartDataResponse");
12963
13150
 
@@ -13083,14 +13270,14 @@ import {
13083
13270
  redisRequest,
13084
13271
  RequestTimeoutError
13085
13272
  } from "@truefoundry/trueforge-core/request-reply";
13086
- import { z as z27 } from "zod";
13273
+ import { z as z28 } from "zod";
13087
13274
  init_config();
13088
13275
  init_id();
13089
13276
  var SESSIONS_CANCEL_PATH = "sessions/cancel";
13090
- var CancelPeerBodySchema = z27.object({
13091
- session_id: z27.string(),
13092
- turn_id: z27.string(),
13093
- reason: z27.enum(CancellationReason2)
13277
+ var CancelPeerBodySchema = z28.object({
13278
+ session_id: z28.string(),
13279
+ turn_id: z28.string(),
13280
+ reason: z28.enum(CancellationReason2)
13094
13281
  });
13095
13282
  function toWireSession(record) {
13096
13283
  return {
@@ -13101,7 +13288,8 @@ function toWireSession(record) {
13101
13288
  created_at: record.created_at.toISOString(),
13102
13289
  updated_at: record.updated_at.toISOString(),
13103
13290
  metrics: record.metrics,
13104
- metadata: record.metadata
13291
+ metadata: record.metadata,
13292
+ source: record.source
13105
13293
  };
13106
13294
  }
13107
13295
  function cancelTurnOnThisExecutor(activeTurns, input) {
@@ -13218,7 +13406,7 @@ function createGetOrCreateSessionByExternalIdHandler(deps) {
13218
13406
  const named = await agentIfAccessible({
13219
13407
  authorizer: deps.authorizer,
13220
13408
  context: requestContext,
13221
- action: "read",
13409
+ action: "use",
13222
13410
  agent: await deps.resolveAgentStore(c).getAgent({
13223
13411
  tenant_id: requestContext.tenant_id,
13224
13412
  name: body.agent.name
@@ -13235,7 +13423,7 @@ function createGetOrCreateSessionByExternalIdHandler(deps) {
13235
13423
  modelProviderStore: deps.resolveModelProviderStore(c),
13236
13424
  mcpServerStore: deps.resolveMcpServerStore(c),
13237
13425
  skillStore: deps.skillStore,
13238
- sandboxProviderStore: deps.sandboxProviderStore
13426
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c)
13239
13427
  });
13240
13428
  agent = { type: "inline", spec: body.agent.spec };
13241
13429
  }
@@ -13243,7 +13431,8 @@ function createGetOrCreateSessionByExternalIdHandler(deps) {
13243
13431
  tenant_id: requestContext.tenant_id,
13244
13432
  external_id: body.external_id,
13245
13433
  created_by_subject: createdBySubjectFromRequestContext(requestContext),
13246
- agent
13434
+ agent,
13435
+ source: body.source ?? null
13247
13436
  });
13248
13437
  if (!created && !await canReadAgentBoundResource({
13249
13438
  store: deps.resolveAgentStore(c),
@@ -13271,7 +13460,7 @@ function createSessionsRouter(deps) {
13271
13460
  const agent = await agentIfAccessible({
13272
13461
  authorizer: deps.authorizer,
13273
13462
  context: requestContext,
13274
- action: "read",
13463
+ action: "use",
13275
13464
  agent: await deps.resolveAgentStore(c).getAgent({
13276
13465
  tenant_id: requestContext.tenant_id,
13277
13466
  name: body.agent.name
@@ -13296,7 +13485,7 @@ function createSessionsRouter(deps) {
13296
13485
  modelProviderStore: deps.resolveModelProviderStore(c),
13297
13486
  mcpServerStore: deps.resolveMcpServerStore(c),
13298
13487
  skillStore: deps.skillStore,
13299
- sandboxProviderStore: deps.sandboxProviderStore
13488
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c)
13300
13489
  });
13301
13490
  const session = await deps.sessions.create({
13302
13491
  tenant_id: requestContext.tenant_id,
@@ -13375,7 +13564,7 @@ function createSessionsRouter(deps) {
13375
13564
  modelProviderStore: deps.resolveModelProviderStore(c),
13376
13565
  mcpServerStore: deps.resolveMcpServerStore(c),
13377
13566
  skillStore: deps.skillStore,
13378
- sandboxProviderStore: deps.sandboxProviderStore
13567
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c)
13379
13568
  });
13380
13569
  }
13381
13570
  try {
@@ -13405,7 +13594,7 @@ function createSessionsRouter(deps) {
13405
13594
  return c.json({ data: toWireSession(record) }, 200);
13406
13595
  };
13407
13596
  const listSessionsHandler = async (c) => {
13408
- const query = c.req.valid("query");
13597
+ const query = parseListSessionsQuery(honoQueriesToRecord(c.req.queries()));
13409
13598
  const requestContext = deps.resolveRequestContext(c);
13410
13599
  try {
13411
13600
  const managedAgentIds = query.created_by_me ? [] : await resolveManagedAgentIds({
@@ -13420,11 +13609,14 @@ function createSessionsRouter(deps) {
13420
13609
  agent_ids: managedAgentIds
13421
13610
  },
13422
13611
  tenant_id: requestContext.tenant_id,
13612
+ metadata: query.metadata,
13423
13613
  limit: query.limit,
13424
13614
  order: query.order,
13425
13615
  page_token: query.page_token,
13426
13616
  start_timestamp: query.start_timestamp,
13427
- end_timestamp: query.end_timestamp
13617
+ end_timestamp: query.end_timestamp,
13618
+ source_type: query.source_type,
13619
+ source_id: query.source_id
13428
13620
  });
13429
13621
  return c.json({ data: data.map(toWireSession), pagination }, 200);
13430
13622
  } catch (error) {
@@ -13754,12 +13946,13 @@ function redactSandboxProvider(manifest) {
13754
13946
  function createSandboxProvidersRouter(deps) {
13755
13947
  const getHandler = async (c) => {
13756
13948
  const requestContext = deps.resolveRequestContext(c);
13757
- const record = await deps.sandboxProviderStore.getSandboxProvider(requestContext.tenant_id);
13949
+ const store = deps.resolveSandboxProviderStore(c);
13950
+ const record = await store.getSandboxProvider(requestContext.tenant_id);
13758
13951
  if (record === void 0) {
13759
13952
  return c.json({ error: { message: "No sandbox provider configured" } }, 404);
13760
13953
  }
13761
13954
  const status = await checkSnapshotStatus({
13762
- store: deps.sandboxProviderStore,
13955
+ store,
13763
13956
  tenant_id: requestContext.tenant_id,
13764
13957
  logger: deps.logger
13765
13958
  });
@@ -13777,6 +13970,7 @@ function createSandboxProvidersRouter(deps) {
13777
13970
  const putHandler = async (c) => {
13778
13971
  const body = c.req.valid("json");
13779
13972
  const requestContext = deps.resolveRequestContext(c);
13973
+ const store = deps.resolveSandboxProviderStore(c);
13780
13974
  const incoming = body.manifest;
13781
13975
  const resolveManifest = (existing) => ({
13782
13976
  ...incoming,
@@ -13789,10 +13983,7 @@ function createSandboxProvidersRouter(deps) {
13789
13983
  });
13790
13984
  try {
13791
13985
  const { manifest, status } = await deps.withTransaction(async (transaction) => {
13792
- const locked = await deps.sandboxProviderStore.getSandboxProviderForUpdate(
13793
- requestContext.tenant_id,
13794
- transaction
13795
- );
13986
+ const locked = await store.getSandboxProviderForUpdate(requestContext.tenant_id, transaction);
13796
13987
  const resolved = resolveManifest(locked);
13797
13988
  const provider = toDaytonaSandboxProvider({
13798
13989
  manifest: resolved,
@@ -13803,7 +13994,7 @@ function createSandboxProvidersRouter(deps) {
13803
13994
  const built = toSandboxStatus(
13804
13995
  await withTimeout2(provider.buildImage(), BUILD_REQUEST_TIMEOUT_MS, "sandbox buildImage")
13805
13996
  );
13806
- await deps.sandboxProviderStore.upsertSandboxProvider(
13997
+ await store.upsertSandboxProvider(
13807
13998
  { tenant_id: requestContext.tenant_id, manifest: resolved, ...built },
13808
13999
  transaction
13809
14000
  );
@@ -14052,7 +14243,7 @@ function createSettingsRouter(deps) {
14052
14243
  router.route(
14053
14244
  "/sandbox-providers",
14054
14245
  createSandboxProvidersRouter({
14055
- sandboxProviderStore: deps.sandboxProviderStore,
14246
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14056
14247
  withTransaction: deps.withTransaction,
14057
14248
  logger: deps.logger,
14058
14249
  resolveRequestContext: deps.resolveRequestContext
@@ -14189,9 +14380,9 @@ var PACKAGE_VERSION = readPackageVersion();
14189
14380
  init_schedule();
14190
14381
 
14191
14382
  // src/zodErrorResponse.ts
14192
- import { z as z28 } from "@hono/zod-openapi";
14383
+ import { z as z29 } from "@hono/zod-openapi";
14193
14384
  function zodErrorResponse(c, error) {
14194
- return c.json({ error: { message: z28.prettifyError(error) } }, 400);
14385
+ return c.json({ error: { message: z29.prettifyError(error) } }, 400);
14195
14386
  }
14196
14387
  var zodValidationHook = (result, c) => {
14197
14388
  if (!result.success) {
@@ -14237,7 +14428,7 @@ function createRequestBodyLimitMiddleware(maxSize) {
14237
14428
  }
14238
14429
  function createAppErrorHandler(params) {
14239
14430
  return (error, c) => {
14240
- if (error instanceof z29.ZodError) {
14431
+ if (error instanceof z30.ZodError) {
14241
14432
  return zodErrorResponse(c, error);
14242
14433
  }
14243
14434
  if (error instanceof InvalidCronError) {
@@ -14311,7 +14502,7 @@ function createServerApp(deps) {
14311
14502
  "/api/v1/capabilities",
14312
14503
  withAuth(
14313
14504
  createCapabilitiesRouter({
14314
- sandboxProviderStore: deps.sandboxProviderStore,
14505
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14315
14506
  withTransaction: deps.withTransaction,
14316
14507
  logger: deps.logger,
14317
14508
  resolveRequestContext
@@ -14382,7 +14573,7 @@ function createServerApp(deps) {
14382
14573
  resolveModelProviderStore: deps.resolveModelProviderStore,
14383
14574
  resolveMcpServerStore: deps.resolveMcpServerStore,
14384
14575
  skillStore: deps.skillStore,
14385
- sandboxProviderStore: deps.sandboxProviderStore,
14576
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14386
14577
  withTransaction: deps.withTransaction,
14387
14578
  resolveRequestContext,
14388
14579
  authorizer: deps.authorizer
@@ -14404,7 +14595,7 @@ function createServerApp(deps) {
14404
14595
  mcpServerStore: deps.resolveMcpServerStore(c),
14405
14596
  skillStore: deps.skillStore,
14406
14597
  agentStore: deps.resolveAgentStore(c),
14407
- sandboxProviderStore: deps.sandboxProviderStore,
14598
+ sandboxProviderStore: deps.resolveSandboxProviderStore(c),
14408
14599
  logger: deps.logger
14409
14600
  }),
14410
14601
  withTransaction: deps.withTransaction,
@@ -14422,7 +14613,7 @@ function createServerApp(deps) {
14422
14613
  resolveMcpServerStore: deps.resolveMcpServerStore,
14423
14614
  tokenStore: deps.tokenStore,
14424
14615
  skillStore: deps.skillStore,
14425
- sandboxProviderStore: deps.sandboxProviderStore,
14616
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14426
14617
  withTransaction: deps.withTransaction,
14427
14618
  logger: deps.logger,
14428
14619
  resolveRequestContext
@@ -14439,7 +14630,7 @@ function createServerApp(deps) {
14439
14630
  resolveMcpServerStore: deps.resolveMcpServerStore,
14440
14631
  skillStore: deps.skillStore,
14441
14632
  resolveAgentStore: deps.resolveAgentStore,
14442
- sandboxProviderStore: deps.sandboxProviderStore,
14633
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14443
14634
  resolveRequestContext,
14444
14635
  authorizer: deps.authorizer
14445
14636
  }),
@@ -14469,7 +14660,7 @@ function createServerApp(deps) {
14469
14660
  resolveMcpServerStore: deps.resolveMcpServerStore,
14470
14661
  skillStore: deps.skillStore,
14471
14662
  resolveAgentStore: deps.resolveAgentStore,
14472
- sandboxProviderStore: deps.sandboxProviderStore,
14663
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14473
14664
  redis: deps.redis,
14474
14665
  requestReplyRouter: deps.requestReplyRouter,
14475
14666
  resolveRequestContext,
@@ -14491,7 +14682,7 @@ function createServerApp(deps) {
14491
14682
  skillStore: deps.skillStore,
14492
14683
  resolveAgentStore: deps.resolveAgentStore,
14493
14684
  eventSubscriptions: deps.eventSubscriptions,
14494
- sandboxProviderStore: deps.sandboxProviderStore,
14685
+ resolveSandboxProviderStore: deps.resolveSandboxProviderStore,
14495
14686
  logger: deps.logger,
14496
14687
  resolveRequestContext,
14497
14688
  authorizer: deps.authorizer
@@ -14512,7 +14703,7 @@ var TrueForgeAuthorizer = class {
14512
14703
  return Promise.resolve({ kind: "all" });
14513
14704
  }
14514
14705
  canAccessAgent(input) {
14515
- if (input.action === "read") {
14706
+ if (input.action === "read" || input.action === "use") {
14516
14707
  return Promise.resolve(true);
14517
14708
  }
14518
14709
  return Promise.resolve(input.agent.created_by_subject.subject_id === input.context.subject.id);
@@ -15417,9 +15608,9 @@ function printStandaloneStartupBanner(options) {
15417
15608
 
15418
15609
  // src/truefoundry/perServerMcpHeaders.ts
15419
15610
  import { HTTPException as HTTPException9 } from "hono/http-exception";
15420
- import { z as z30 } from "zod";
15611
+ import { z as z31 } from "zod";
15421
15612
  var X_TFG_MCP_HEADERS = "x-tfg-mcp-headers";
15422
- var PerServerMcpHeadersSchema = z30.record(z30.string().min(1), z30.record(z30.string().min(1), z30.string()));
15613
+ var PerServerMcpHeadersSchema = z31.record(z31.string().min(1), z31.record(z31.string().min(1), z31.string()));
15423
15614
  function parsePerServerMcpHeaders(raw) {
15424
15615
  let decoded;
15425
15616
  try {
@@ -15445,7 +15636,7 @@ import { sql as sql3 } from "kysely";
15445
15636
  import { extractErrorLogFields as extractErrorLogFields8 } from "@truefoundry/trueforge-core/core";
15446
15637
  import { HTTPException as HTTPException10 } from "hono/http-exception";
15447
15638
  import { fetch as undiciFetch2 } from "undici";
15448
- import { z as z32 } from "zod";
15639
+ import { z as z33 } from "zod";
15449
15640
 
15450
15641
  // src/truefoundry/internalTls.ts
15451
15642
  function normalizeInternalTlsUrl(input) {
@@ -15459,48 +15650,48 @@ function createInternalTlsDispatcher(options) {
15459
15650
  }
15460
15651
 
15461
15652
  // src/truefoundry/mapSfyMcpServers.ts
15462
- import { z as z31 } from "zod";
15653
+ import { z as z32 } from "zod";
15463
15654
  var MCP_PROXY_BASE_URL_TEMPLATE = "{{mcpProxyBaseURL}}";
15464
- var IsoInstantSchema = z31.union([z31.string().min(1), z31.date()]).transform((value, ctx) => {
15655
+ var IsoInstantSchema = z32.union([z32.string().min(1), z32.date()]).transform((value, ctx) => {
15465
15656
  if (value instanceof Date) {
15466
15657
  if (!Number.isFinite(value.getTime())) {
15467
15658
  ctx.addIssue({ code: "custom", message: "Invalid Date" });
15468
- return z31.NEVER;
15659
+ return z32.NEVER;
15469
15660
  }
15470
15661
  return value.toISOString();
15471
15662
  }
15472
15663
  const ms = Date.parse(value);
15473
15664
  if (!Number.isFinite(ms)) {
15474
15665
  ctx.addIssue({ code: "custom", message: "Invalid ISO timestamp" });
15475
- return z31.NEVER;
15666
+ return z32.NEVER;
15476
15667
  }
15477
15668
  return new Date(ms).toISOString();
15478
15669
  });
15479
- var SfyMcpServerRowSchema = z31.object({
15480
- id: z31.string().min(1),
15481
- name: z31.string().min(1),
15482
- proxyUrl: z31.string().min(1),
15670
+ var SfyMcpServerRowSchema = z32.object({
15671
+ id: z32.string().min(1),
15672
+ name: z32.string().min(1),
15673
+ proxyUrl: z32.string().min(1),
15483
15674
  createdAt: IsoInstantSchema,
15484
15675
  updatedAt: IsoInstantSchema,
15485
- manifest: z31.object({
15486
- description: z31.string().min(1).optional(),
15487
- auth_data: z31.object({
15488
- type: z31.string().min(1).optional()
15676
+ manifest: z32.object({
15677
+ description: z32.string().min(1).optional(),
15678
+ auth_data: z32.object({
15679
+ type: z32.string().min(1).optional()
15489
15680
  }).optional()
15490
15681
  }).optional()
15491
15682
  });
15492
- var SfyMcpAuthStatusAuthenticatedSchema = z31.object({ status: z31.literal("authenticated") });
15493
- var SfyMcpAuthStatusNotRequiredSchema = z31.object({ status: z31.literal("authentication_not_required") });
15494
- var SfyMcpAuthStatusRequiredSchema = z31.object({ status: z31.literal("authentication_required") });
15683
+ var SfyMcpAuthStatusAuthenticatedSchema = z32.object({ status: z32.literal("authenticated") });
15684
+ var SfyMcpAuthStatusNotRequiredSchema = z32.object({ status: z32.literal("authentication_not_required") });
15685
+ var SfyMcpAuthStatusRequiredSchema = z32.object({ status: z32.literal("authentication_required") });
15495
15686
  var SfyMcpAuthorizeRequiredSchema = SfyMcpAuthStatusRequiredSchema.extend({
15496
- authorization_endpoint: z31.url()
15687
+ authorization_endpoint: z32.url()
15497
15688
  });
15498
- var SfyMcpAuthStatusSchema = z31.discriminatedUnion("status", [
15689
+ var SfyMcpAuthStatusSchema = z32.discriminatedUnion("status", [
15499
15690
  SfyMcpAuthStatusAuthenticatedSchema,
15500
15691
  SfyMcpAuthStatusRequiredSchema,
15501
15692
  SfyMcpAuthStatusNotRequiredSchema
15502
15693
  ]);
15503
- var SfyMcpAuthorizeResultSchema = z31.discriminatedUnion("status", [
15694
+ var SfyMcpAuthorizeResultSchema = z32.discriminatedUnion("status", [
15504
15695
  SfyMcpAuthStatusAuthenticatedSchema,
15505
15696
  SfyMcpAuthorizeRequiredSchema,
15506
15697
  SfyMcpAuthStatusNotRequiredSchema
@@ -15566,37 +15757,37 @@ var TFG_AGENTS_PATH = "internal/tfg/agents";
15566
15757
  var SESSION_PATH = "v1/session";
15567
15758
  var AGENT_PERMISSIONS_PATH = "v1/authorize/permissions";
15568
15759
  var INTEGRATIONS_PAGE_SIZE = 1e3;
15569
- var SessionSubjectSchema = z32.object({
15570
- subjectId: z32.string().min(1),
15571
- subjectType: z32.string().min(1),
15572
- subjectDisplayName: z32.string().nullable().optional(),
15573
- subjectSlug: z32.string().nullable().optional()
15760
+ var SessionSubjectSchema = z33.object({
15761
+ subjectId: z33.string().min(1),
15762
+ subjectType: z33.string().min(1),
15763
+ subjectDisplayName: z33.string().nullable().optional(),
15764
+ subjectSlug: z33.string().nullable().optional()
15574
15765
  });
15575
- var GetSessionUserSchema = z32.object({
15576
- tenantName: z32.string().min(1),
15577
- roles: z32.array(z32.string()),
15766
+ var GetSessionUserSchema = z33.object({
15767
+ tenantName: z33.string().min(1),
15768
+ roles: z33.array(z33.string()),
15578
15769
  subject: SessionSubjectSchema
15579
15770
  });
15580
- var GetSessionWireSchema = z32.object({
15771
+ var GetSessionWireSchema = z33.object({
15581
15772
  user: GetSessionUserSchema.nullable()
15582
15773
  });
15583
- var ListResponseSchema = z32.union([
15584
- z32.array(z32.unknown()),
15585
- z32.object({
15586
- data: z32.array(z32.unknown()).catch([]),
15587
- pagination: z32.object({ total: z32.number().optional() }).optional()
15774
+ var ListResponseSchema = z33.union([
15775
+ z33.array(z33.unknown()),
15776
+ z33.object({
15777
+ data: z33.array(z33.unknown()).catch([]),
15778
+ pagination: z33.object({ total: z33.number().optional() }).optional()
15588
15779
  })
15589
15780
  ]);
15590
- var ServiceFoundryErrorSchema = z32.object({
15591
- message: z32.union([z32.string(), z32.array(z32.string())]).optional()
15781
+ var ServiceFoundryErrorSchema = z33.object({
15782
+ message: z33.union([z33.string(), z33.array(z33.string())]).optional()
15592
15783
  });
15593
- var PutRemoteAgentResponseSchema = z32.object({
15594
- agentId: z32.string().min(1)
15784
+ var PutRemoteAgentResponseSchema = z33.object({
15785
+ agentId: z33.string().min(1)
15595
15786
  });
15596
- var AgentPermissionSchema = z32.enum(["READ_AGENT", "MANAGE_AGENT"]);
15597
- var AgentPermissionsSchema = z32.record(
15598
- z32.string(),
15599
- z32.array(z32.string()).transform(
15787
+ var AgentPermissionSchema = z33.enum(["READ_AGENT", "USE_AGENT", "MANAGE_AGENT", "DELETE_AGENT"]);
15788
+ var AgentPermissionsSchema = z33.record(
15789
+ z33.string(),
15790
+ z33.array(z33.string()).transform(
15600
15791
  (permissions) => permissions.flatMap((permission) => {
15601
15792
  const parsed = AgentPermissionSchema.safeParse(permission);
15602
15793
  return parsed.success ? [parsed.data] : [];
@@ -15965,7 +16156,7 @@ function toPutRemoteAgentPayload({
15965
16156
  }) {
15966
16157
  return {
15967
16158
  name,
15968
- description: manifest.instructions ?? name,
16159
+ description: name,
15969
16160
  model: manifest.model.name,
15970
16161
  mcp_servers: (manifest.mcp_servers ?? []).map((server) => server.name)
15971
16162
  };
@@ -16092,8 +16283,14 @@ var TrueFoundryAgentStore = class {
16092
16283
 
16093
16284
  // src/truefoundry/TrueFoundryAuthorizer.ts
16094
16285
  import { HTTPException as HTTPException11 } from "hono/http-exception";
16286
+ var permissionByAction = {
16287
+ read: "READ_AGENT",
16288
+ use: "USE_AGENT",
16289
+ manage: "MANAGE_AGENT",
16290
+ delete: "DELETE_AGENT"
16291
+ };
16095
16292
  function allowsAction(permissions, action) {
16096
- return action === "manage" ? permissions.includes("MANAGE_AGENT") : permissions.includes("READ_AGENT") || permissions.includes("MANAGE_AGENT");
16293
+ return permissions.includes(permissionByAction[action]);
16097
16294
  }
16098
16295
  function requireUserCredential(context) {
16099
16296
  if (context.user_credential === null) {
@@ -16140,24 +16337,24 @@ init_mcpServerStore();
16140
16337
  // src/truefoundry/mapEnabledModels.ts
16141
16338
  import { SUPPORTED_REASONING_EFFORTS as SUPPORTED_REASONING_EFFORTS3 } from "@truefoundry/trueforge-core/core";
16142
16339
  import { HTTPException as HTTPException12 } from "hono/http-exception";
16143
- import { z as z33 } from "zod";
16144
- var ModelParamSchema = z33.object({
16145
- key: z33.string(),
16146
- supportedValues: z33.array(z33.string()).optional()
16340
+ import { z as z34 } from "zod";
16341
+ var ModelParamSchema = z34.object({
16342
+ key: z34.string(),
16343
+ supportedValues: z34.array(z34.string()).optional()
16147
16344
  });
16148
- var MetadataSchema = z33.object({
16149
- limits: z33.object({
16150
- context_window: z33.number().optional(),
16151
- max_input_tokens: z33.number().optional(),
16152
- max_output_tokens: z33.number().optional(),
16153
- max_tokens: z33.number().optional()
16345
+ var MetadataSchema = z34.object({
16346
+ limits: z34.object({
16347
+ context_window: z34.number().optional(),
16348
+ max_input_tokens: z34.number().optional(),
16349
+ max_output_tokens: z34.number().optional(),
16350
+ max_tokens: z34.number().optional()
16154
16351
  }).optional(),
16155
- params: z33.array(ModelParamSchema).optional()
16352
+ params: z34.array(ModelParamSchema).optional()
16156
16353
  });
16157
- var IntegrationSchema = z33.object({
16158
- name: z33.string().min(1),
16159
- manifest: z33.object({ model_types: z33.array(z33.string()).optional() }),
16160
- providerAccount: z33.object({ name: z33.string().min(1) }),
16354
+ var IntegrationSchema = z34.object({
16355
+ name: z34.string().min(1),
16356
+ manifest: z34.object({ model_types: z34.array(z34.string()).optional() }),
16357
+ providerAccount: z34.object({ name: z34.string().min(1) }),
16161
16358
  metadata: MetadataSchema.optional()
16162
16359
  });
16163
16360
  function toReasoningEfforts(params) {
@@ -16204,11 +16401,11 @@ function mapEnabledModels(input) {
16204
16401
  }
16205
16402
  return models;
16206
16403
  }
16207
- var InstallationSchema = z33.object({
16208
- isDefault: z33.boolean().optional(),
16209
- manifest: z33.object({ url: z33.string().min(1) })
16404
+ var InstallationSchema = z34.object({
16405
+ isDefault: z34.boolean().optional(),
16406
+ manifest: z34.object({ url: z34.string().min(1) })
16210
16407
  });
16211
- var InstallationsEnvelopeSchema = z33.union([z33.array(z33.unknown()), z33.object({ data: z33.array(z33.unknown()) })]);
16408
+ var InstallationsEnvelopeSchema = z34.union([z34.array(z34.unknown()), z34.object({ data: z34.array(z34.unknown()) })]);
16212
16409
  function resolveDefaultGatewayUrl(payload) {
16213
16410
  const envelope = InstallationsEnvelopeSchema.parse(payload);
16214
16411
  const rows = Array.isArray(envelope) ? envelope : envelope.data;
@@ -16290,13 +16487,15 @@ var TrueFoundryMcpServerStore = class {
16290
16487
  if (input.names?.length === 0) {
16291
16488
  return paginateOffsetRows([], input.limit, offset);
16292
16489
  }
16293
- const rows = await this.#client.listMcpServers({
16294
- accessToken: this.#accessToken,
16295
- limit: input.limit + 1,
16296
- offset,
16297
- ...input.names !== void 0 ? { names: input.names } : {}
16298
- });
16299
- const gatewayUrl = await this.#resolveGatewayUrl();
16490
+ const [rows, gatewayUrl] = await Promise.all([
16491
+ this.#client.listMcpServers({
16492
+ accessToken: this.#accessToken,
16493
+ limit: input.limit + 1,
16494
+ offset,
16495
+ ...input.names !== void 0 ? { names: input.names } : {}
16496
+ }),
16497
+ this.#resolveGatewayUrl()
16498
+ ]);
16300
16499
  const records = mapSfyMcpServers({ rows }).map(
16301
16500
  (server) => toRecord2({ tenant_id: input.tenant_id, server, gatewayUrl })
16302
16501
  );
@@ -16304,12 +16503,14 @@ var TrueFoundryMcpServerStore = class {
16304
16503
  }
16305
16504
  async getServer(input, transaction) {
16306
16505
  void transaction;
16307
- const row = await this.#client.getMcpServerByName({ accessToken: this.#accessToken, name: input.name });
16506
+ const [row, gatewayUrl] = await Promise.all([
16507
+ this.#client.getMcpServerByName({ accessToken: this.#accessToken, name: input.name }),
16508
+ this.#resolveGatewayUrl()
16509
+ ]);
16308
16510
  if (row === void 0) {
16309
16511
  return void 0;
16310
16512
  }
16311
16513
  const server = parseSfyMcpServerSummary(row);
16312
- const gatewayUrl = await this.#resolveGatewayUrl();
16313
16514
  return toRecord2({ tenant_id: input.tenant_id, server, gatewayUrl });
16314
16515
  }
16315
16516
  getServerForUpdate(input, transaction) {
@@ -16500,6 +16701,135 @@ function toManifest(input) {
16500
16701
  };
16501
16702
  }
16502
16703
 
16704
+ // src/truefoundry/TrueFoundrySandboxProviderStore.ts
16705
+ import { HTTPException as HTTPException16 } from "hono/http-exception";
16706
+ import { LRUCache } from "lru-cache";
16707
+ import { z as z35 } from "zod";
16708
+
16709
+ // src/truefoundry/resolveTrueFoundrySandboxProviderConfig.ts
16710
+ init_config();
16711
+ import { HTTPException as HTTPException15 } from "hono/http-exception";
16712
+ function resolveTrueFoundrySandboxProviderConfig(config = config_default) {
16713
+ if (config.STANDALONE) {
16714
+ throw new HTTPException15(500, {
16715
+ message: "TrueFoundry sandbox provider config is not available in standalone mode"
16716
+ });
16717
+ }
16718
+ if (config.TRUEFOUNDRY_SANDBOX_ENABLED && config.TRUEFOUNDRY_SANDBOX_API_KEY !== void 0 && config.TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL !== void 0) {
16719
+ return {
16720
+ type: "daytona",
16721
+ apiKey: config.TRUEFOUNDRY_SANDBOX_API_KEY,
16722
+ settingsServerUrl: config.TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL
16723
+ };
16724
+ }
16725
+ return void 0;
16726
+ }
16727
+
16728
+ // src/truefoundry/TrueFoundrySandboxProviderStore.ts
16729
+ var SETTINGS_CACHE_TTL_MS = 5 * 60 * 1e3;
16730
+ var SETTINGS_FETCH_TIMEOUT_MS = 1e4;
16731
+ var SANDBOX_DEFAULT_SETTINGS = {
16732
+ timeoutMs: 6e4,
16733
+ autoStopIntervalInMinutes: 5,
16734
+ autoArchiveIntervalInMinutes: 60,
16735
+ autoDeleteIntervalInMinutes: 43200
16736
+ };
16737
+ var DaytonaSandboxSettingsSchema = z35.object({
16738
+ snapshotName: z35.string().min(1, "snapshotName is required"),
16739
+ autoStopIntervalInMinutes: z35.number().default(SANDBOX_DEFAULT_SETTINGS.autoStopIntervalInMinutes),
16740
+ autoArchiveIntervalInMinutes: z35.number().default(SANDBOX_DEFAULT_SETTINGS.autoArchiveIntervalInMinutes),
16741
+ autoDeleteIntervalInMinutes: z35.number().default(SANDBOX_DEFAULT_SETTINGS.autoDeleteIntervalInMinutes),
16742
+ timeoutMs: z35.number().default(SANDBOX_DEFAULT_SETTINGS.timeoutMs)
16743
+ });
16744
+ var DAYTONA_SETTINGS_CACHE_KEY = "daytona-settings";
16745
+ var daytonaSettingsCache = new LRUCache({
16746
+ max: 1,
16747
+ ttl: SETTINGS_CACHE_TTL_MS
16748
+ });
16749
+ async function resolveDaytonaSandboxSettings({
16750
+ accessToken,
16751
+ settingsServerUrl
16752
+ }) {
16753
+ const cached = daytonaSettingsCache.get(DAYTONA_SETTINGS_CACHE_KEY);
16754
+ if (cached !== void 0) {
16755
+ return cached;
16756
+ }
16757
+ let response;
16758
+ try {
16759
+ response = await fetch(settingsServerUrl, {
16760
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}` },
16761
+ signal: AbortSignal.timeout(SETTINGS_FETCH_TIMEOUT_MS)
16762
+ });
16763
+ } catch (error) {
16764
+ const timedOut = error instanceof Error && error.name === "TimeoutError";
16765
+ throw new Error(
16766
+ timedOut ? `Sandbox settings endpoint timed out after ${String(SETTINGS_FETCH_TIMEOUT_MS / 1e3)}s` : "Sandbox settings endpoint request failed",
16767
+ { cause: error }
16768
+ );
16769
+ }
16770
+ if (!response.ok) {
16771
+ const body = await response.text();
16772
+ throw new Error(`Sandbox settings endpoint returned ${String(response.status)}: ${body}`);
16773
+ }
16774
+ const settings = DaytonaSandboxSettingsSchema.parse(await response.json());
16775
+ daytonaSettingsCache.set(DAYTONA_SETTINGS_CACHE_KEY, settings);
16776
+ return settings;
16777
+ }
16778
+ function managed3() {
16779
+ throw new HTTPException16(TRUEFOUNDRY_MANAGED_STATUS, { message: TRUEFOUNDRY_MANAGED_MESSAGE });
16780
+ }
16781
+ var TrueFoundrySandboxProviderStore = class {
16782
+ #accessToken;
16783
+ constructor(input) {
16784
+ this.#accessToken = input.accessToken;
16785
+ }
16786
+ async getSandboxProvider(tenantId, transaction) {
16787
+ void transaction;
16788
+ const providerConfig = resolveTrueFoundrySandboxProviderConfig();
16789
+ if (!providerConfig) {
16790
+ return void 0;
16791
+ }
16792
+ const settings = await resolveDaytonaSandboxSettings({
16793
+ accessToken: this.#accessToken,
16794
+ settingsServerUrl: providerConfig.settingsServerUrl
16795
+ });
16796
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
16797
+ return {
16798
+ tenant_id: tenantId,
16799
+ manifest: {
16800
+ type: "daytona",
16801
+ auth: { api_key: providerConfig.apiKey },
16802
+ exec_timeout_ms: settings.timeoutMs,
16803
+ auto_stop_interval_in_minutes: settings.autoStopIntervalInMinutes,
16804
+ auto_archive_interval_in_minutes: settings.autoArchiveIntervalInMinutes,
16805
+ auto_delete_interval_in_minutes: settings.autoDeleteIntervalInMinutes
16806
+ },
16807
+ status: "ready",
16808
+ status_reason: null,
16809
+ // Snapshot name only — no image_uri; TFY mode never registers a snapshot.
16810
+ build_metadata: { build_ref: settings.snapshotName },
16811
+ created_at: now2,
16812
+ // Fresh on every get so checkSnapshotStatus short-circuits without Daytona.
16813
+ updated_at: now2
16814
+ };
16815
+ }
16816
+ getSandboxProviderForUpdate(tenantId, transaction) {
16817
+ void tenantId;
16818
+ void transaction;
16819
+ return managed3();
16820
+ }
16821
+ upsertSandboxProvider(input, transaction) {
16822
+ void input;
16823
+ void transaction;
16824
+ return managed3();
16825
+ }
16826
+ updateSandboxStatus(input, transaction) {
16827
+ void input;
16828
+ void transaction;
16829
+ return managed3();
16830
+ }
16831
+ };
16832
+
16503
16833
  // src/main.ts
16504
16834
  var configuration2;
16505
16835
  var isOidcConfigured2;
@@ -16524,8 +16854,8 @@ try {
16524
16854
  function requireRequestCredentialToken(c) {
16525
16855
  const credential = resolveRequestContext(c).user_credential;
16526
16856
  if (credential === null) {
16527
- throw new HTTPException15(401, {
16528
- message: "Authentication token required to list or call TrueFoundry models, MCP servers, and agents"
16857
+ throw new HTTPException17(401, {
16858
+ message: "Authentication token required to list or call TrueFoundry models, MCP servers, agents, and sandbox"
16529
16859
  });
16530
16860
  }
16531
16861
  return credential;
@@ -16589,6 +16919,15 @@ function buildResolveAgentStore(options) {
16589
16919
  return persistenceStore;
16590
16920
  };
16591
16921
  }
16922
+ function buildResolveSandboxProviderStore(options) {
16923
+ const { persistenceStore } = options;
16924
+ if (!isTrueFoundryModeEnabled2(configuration2)) {
16925
+ return () => persistenceStore;
16926
+ }
16927
+ return (c) => new TrueFoundrySandboxProviderStore({
16928
+ accessToken: requireRequestCredentialToken(c)
16929
+ });
16930
+ }
16592
16931
  async function createStandalonePersistence(options) {
16593
16932
  const { sqlitePath, logger } = options;
16594
16933
  await mkdir5(path6.dirname(sqlitePath), { recursive: true });
@@ -16630,16 +16969,17 @@ async function createStandalonePersistence(options) {
16630
16969
  tokenStore,
16631
16970
  clientName: configuration2.MCP_DCR_OAUTH_CLIENT_NAME
16632
16971
  });
16972
+ const sandboxProviderStore = new SqliteSandboxProviderStore2(db);
16633
16973
  return {
16634
16974
  sessionStore: new SqliteSessionStore2(db),
16635
16975
  sessionMetricsStore: new SqliteSessionMetricsStore2(db),
16636
16976
  resolveModelProviderStore: () => modelProviderStore,
16637
16977
  resolveMcpServerStore: () => mcpServerStore,
16638
16978
  resolveAgentStore: () => agentStore,
16979
+ resolveSandboxProviderStore: () => sandboxProviderStore,
16639
16980
  withTransaction: (callback) => db.transaction().execute(callback),
16640
16981
  tokenStore,
16641
16982
  skillStore: new SqliteSkillStore2(db),
16642
- sandboxProviderStore: new SqliteSandboxProviderStore2(db),
16643
16983
  scheduleStore: new SqliteScheduleStore2(db),
16644
16984
  destroyDb: () => db.destroy(),
16645
16985
  redis: void 0,
@@ -16714,10 +17054,12 @@ async function createDistributedPersistence(options) {
16714
17054
  db,
16715
17055
  client: serviceFoundryClient
16716
17056
  }),
17057
+ resolveSandboxProviderStore: buildResolveSandboxProviderStore({
17058
+ persistenceStore: new PostgresSandboxProviderStore2(db)
17059
+ }),
16717
17060
  withTransaction: (callback) => db.transaction().execute(callback),
16718
17061
  tokenStore,
16719
17062
  skillStore: new PostgresSkillStore2(db),
16720
- sandboxProviderStore: new PostgresSandboxProviderStore2(db),
16721
17063
  scheduleStore: new PostgresScheduleStore2(db),
16722
17064
  destroyDb: () => db.destroy(),
16723
17065
  redis: await connectRedis2({ url: redisUrl, logger }),
@@ -16731,10 +17073,10 @@ async function createServerRuntime(persistence, logger) {
16731
17073
  resolveModelProviderStore,
16732
17074
  resolveMcpServerStore,
16733
17075
  resolveAgentStore,
17076
+ resolveSandboxProviderStore,
16734
17077
  withTransaction,
16735
17078
  tokenStore,
16736
17079
  skillStore,
16737
- sandboxProviderStore,
16738
17080
  scheduleStore,
16739
17081
  destroyDb,
16740
17082
  redis,
@@ -16783,10 +17125,10 @@ async function createServerRuntime(persistence, logger) {
16783
17125
  resolveModelProviderStore,
16784
17126
  resolveMcpServerStore,
16785
17127
  resolveAgentStore,
17128
+ resolveSandboxProviderStore,
16786
17129
  withTransaction,
16787
17130
  tokenStore,
16788
17131
  skillStore,
16789
- sandboxProviderStore,
16790
17132
  scheduleStore,
16791
17133
  sessionStore,
16792
17134
  sessionMetricsStore,