@truefoundry/trueforge 0.2.0-rc.2 → 0.2.0-rc.4

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 (239) hide show
  1. package/dist/_frontend/assets/AgentCodeSnippets-U6KQWVBJ-mo8URLKV.js +1 -0
  2. package/dist/_frontend/assets/AgentCodeSnippets-U6KQWVBJ-mo8URLKV.js.br +0 -0
  3. package/dist/_frontend/assets/AgentCodeSnippets-U6KQWVBJ-mo8URLKV.js.gz +0 -0
  4. package/dist/_frontend/assets/AgentMetricChart-3D6FUFO6-DzIcybRU.js +1 -0
  5. package/dist/_frontend/assets/AgentMetricChart-3D6FUFO6-DzIcybRU.js.br +0 -0
  6. package/dist/_frontend/assets/AgentMetricChart-3D6FUFO6-DzIcybRU.js.gz +0 -0
  7. package/dist/_frontend/assets/{AgentOverview-3FJ5EE6N-D1pX5Emq.js → AgentOverview-RLJ6HZCN-YJvNjt8b.js} +1 -1
  8. package/dist/_frontend/assets/AgentOverview-RLJ6HZCN-YJvNjt8b.js.br +0 -0
  9. package/dist/_frontend/assets/AgentOverview-RLJ6HZCN-YJvNjt8b.js.gz +0 -0
  10. package/dist/_frontend/assets/AgentSessionEventTimeline-CDXRRUZQ-CnbfBoc3.js +1 -0
  11. package/dist/_frontend/assets/AgentSessionEventTimeline-CDXRRUZQ-CnbfBoc3.js.br +0 -0
  12. package/dist/_frontend/assets/AgentSessionEventTimeline-CDXRRUZQ-CnbfBoc3.js.gz +0 -0
  13. package/dist/_frontend/assets/AgentSessionEventTimelineChart-S2WX6ZEA-BjzWPaWE.js +1 -0
  14. package/dist/_frontend/assets/AgentSessionEventTimelineChart-S2WX6ZEA-BjzWPaWE.js.br +0 -0
  15. package/dist/_frontend/assets/AgentSessionEventTimelineChart-S2WX6ZEA-BjzWPaWE.js.gz +0 -0
  16. package/dist/_frontend/assets/AgentSessions-UI3L7XY2-CG8nWJdo.js +1 -0
  17. package/dist/_frontend/assets/AgentSessions-UI3L7XY2-CG8nWJdo.js.br +0 -0
  18. package/dist/_frontend/assets/AgentSessions-UI3L7XY2-CG8nWJdo.js.gz +0 -0
  19. package/dist/_frontend/assets/ConnectorSettings-OIGAC2HU-xm76mpmk.js +1 -0
  20. package/dist/_frontend/assets/ConnectorSettings-OIGAC2HU-xm76mpmk.js.br +0 -0
  21. package/dist/_frontend/assets/ConnectorSettings-OIGAC2HU-xm76mpmk.js.gz +0 -0
  22. package/dist/_frontend/assets/{DockLayout-NLFNU6F2-BGJvqqVS.js → DockLayout-J5BRKMJZ-xjQQzILb.js} +1 -1
  23. package/dist/_frontend/assets/DrawerLayout-65YHGHIF-CehQ0ZjJ.js +2 -0
  24. package/dist/_frontend/assets/DrawerLayout-65YHGHIF-CehQ0ZjJ.js.br +0 -0
  25. package/dist/_frontend/assets/DrawerLayout-65YHGHIF-CehQ0ZjJ.js.gz +0 -0
  26. package/dist/_frontend/assets/ModelSettings-VP6WCMGT-DuhYOy95.js +1 -0
  27. package/dist/_frontend/assets/ModelSettings-VP6WCMGT-DuhYOy95.js.br +0 -0
  28. package/dist/_frontend/assets/ModelSettings-VP6WCMGT-DuhYOy95.js.gz +0 -0
  29. package/dist/_frontend/assets/SandboxSettings-GTZT7LD6-F_5p7NeO.js +1 -0
  30. package/dist/_frontend/assets/SandboxSettings-GTZT7LD6-F_5p7NeO.js.br +0 -0
  31. package/dist/_frontend/assets/SandboxSettings-GTZT7LD6-F_5p7NeO.js.gz +0 -0
  32. package/dist/_frontend/assets/SchedulesPage-ARWU7BZF-BIZcHayD.js +1 -0
  33. package/dist/_frontend/assets/SchedulesPage-ARWU7BZF-BIZcHayD.js.br +0 -0
  34. package/dist/_frontend/assets/SchedulesPage-ARWU7BZF-BIZcHayD.js.gz +0 -0
  35. package/dist/_frontend/assets/{SettingsBuilder-LSXK2VN4-B0Y9JGuK.js → SettingsBuilder-A4BPYIFZ-B4p1JpXq.js} +2 -2
  36. package/dist/_frontend/assets/SettingsBuilder-A4BPYIFZ-B4p1JpXq.js.br +0 -0
  37. package/dist/_frontend/assets/SettingsBuilder-A4BPYIFZ-B4p1JpXq.js.gz +0 -0
  38. package/dist/_frontend/assets/ShellRouteSync-SSLGM35F-Cqt-1Q8u.js +1 -0
  39. package/dist/_frontend/assets/ShellRouteSync-SSLGM35F-Cqt-1Q8u.js.br +0 -0
  40. package/dist/_frontend/assets/ShellRouteSync-SSLGM35F-Cqt-1Q8u.js.gz +0 -0
  41. package/dist/_frontend/assets/SidebarLayout-MFDOGAVJ-pSgzH70r.js +2 -0
  42. package/dist/_frontend/assets/SidebarLayout-MFDOGAVJ-pSgzH70r.js.br +0 -0
  43. package/dist/_frontend/assets/SidebarLayout-MFDOGAVJ-pSgzH70r.js.gz +0 -0
  44. package/dist/_frontend/assets/SkillSettings-WQPUQ5TE-x17-_tYg.js +1 -0
  45. package/dist/_frontend/assets/SkillSettings-WQPUQ5TE-x17-_tYg.js.br +0 -0
  46. package/dist/_frontend/assets/SkillSettings-WQPUQ5TE-x17-_tYg.js.gz +0 -0
  47. package/dist/_frontend/assets/TrueForgeUIWithRouter-5CDICMCE-DcMl1KUh.js +1 -0
  48. package/dist/_frontend/assets/WidgetLayout-HE7E4UL5-D_jC6D5-.js +1 -0
  49. package/dist/_frontend/assets/WidgetLayout-HE7E4UL5-D_jC6D5-.js.br +0 -0
  50. package/dist/_frontend/assets/WidgetLayout-HE7E4UL5-D_jC6D5-.js.gz +0 -0
  51. package/dist/_frontend/assets/chunk-2BDTG544-FxcOqFr-.js +1 -0
  52. package/dist/_frontend/assets/chunk-2BDTG544-FxcOqFr-.js.br +0 -0
  53. package/dist/_frontend/assets/chunk-2BDTG544-FxcOqFr-.js.gz +0 -0
  54. package/dist/_frontend/assets/{chunk-62JRHF6Z-gAUkEAjv.js → chunk-62JRHF6Z-6aeTVQm8.js} +1 -1
  55. package/dist/_frontend/assets/chunk-62JRHF6Z-6aeTVQm8.js.br +0 -0
  56. package/dist/_frontend/assets/{chunk-62JRHF6Z-gAUkEAjv.js.gz → chunk-62JRHF6Z-6aeTVQm8.js.gz} +0 -0
  57. package/dist/_frontend/assets/chunk-TGKQRK3S-D5Bs7icZ.js +1 -0
  58. package/dist/_frontend/assets/chunk-TGKQRK3S-D5Bs7icZ.js.br +0 -0
  59. package/dist/_frontend/assets/chunk-TGKQRK3S-D5Bs7icZ.js.gz +0 -0
  60. package/dist/_frontend/assets/chunk-VXKNS7FH-Dm2ZAGlE.js +2 -0
  61. package/dist/_frontend/assets/chunk-VXKNS7FH-Dm2ZAGlE.js.br +0 -0
  62. package/dist/_frontend/assets/chunk-VXKNS7FH-Dm2ZAGlE.js.gz +0 -0
  63. package/dist/_frontend/assets/cssMode-BSK94pjD.js +1 -0
  64. package/dist/_frontend/assets/cssMode-BSK94pjD.js.br +0 -0
  65. package/dist/_frontend/assets/cssMode-BSK94pjD.js.gz +0 -0
  66. package/dist/_frontend/assets/{freemarker2-BqULNxdn.js → freemarker2-hYZ9lU-u.js} +1 -1
  67. package/dist/_frontend/assets/freemarker2-hYZ9lU-u.js.br +0 -0
  68. package/dist/_frontend/assets/freemarker2-hYZ9lU-u.js.gz +0 -0
  69. package/dist/_frontend/assets/{handlebars-D-wN_MMv.js → handlebars-CJdvCy_0.js} +1 -1
  70. package/dist/_frontend/assets/handlebars-CJdvCy_0.js.br +0 -0
  71. package/dist/_frontend/assets/handlebars-CJdvCy_0.js.gz +0 -0
  72. package/dist/_frontend/assets/{html-DX_2Eu_G.js → html-BHnJtaJv.js} +1 -1
  73. package/dist/_frontend/assets/html-BHnJtaJv.js.br +0 -0
  74. package/dist/_frontend/assets/html-BHnJtaJv.js.gz +0 -0
  75. package/dist/_frontend/assets/htmlMode-BTNbHYXw.js +1 -0
  76. package/dist/_frontend/assets/htmlMode-BTNbHYXw.js.br +0 -0
  77. package/dist/_frontend/assets/htmlMode-BTNbHYXw.js.gz +0 -0
  78. package/dist/_frontend/assets/{index-MPbqVnOf.js → index-B1sBHguz.js} +1 -1
  79. package/dist/_frontend/assets/index-B1sBHguz.js.br +0 -0
  80. package/dist/_frontend/assets/index-B1sBHguz.js.gz +0 -0
  81. package/dist/_frontend/assets/{index-SN54UIUh.css → index-BBGLYdJn.css} +1 -1
  82. package/dist/_frontend/assets/index-BBGLYdJn.css.br +0 -0
  83. package/dist/_frontend/assets/index-BBGLYdJn.css.gz +0 -0
  84. package/dist/_frontend/assets/{index-CNHFMp3w.js → index-BU6gYO7K.js} +4 -4
  85. package/dist/_frontend/assets/index-BU6gYO7K.js.br +0 -0
  86. package/dist/_frontend/assets/index-BU6gYO7K.js.gz +0 -0
  87. package/dist/_frontend/assets/index-DZOZ1xN3.js +933 -0
  88. package/dist/_frontend/assets/index-DZOZ1xN3.js.br +0 -0
  89. package/dist/_frontend/assets/index-DZOZ1xN3.js.gz +0 -0
  90. package/dist/_frontend/assets/index-DhA9jnhv.css +1 -0
  91. package/dist/_frontend/assets/index-DhA9jnhv.css.br +0 -0
  92. package/dist/_frontend/assets/index-DhA9jnhv.css.gz +0 -0
  93. package/dist/_frontend/assets/{javascript-CO_8uS79.js → javascript-BKY4Sujy.js} +1 -1
  94. package/dist/_frontend/assets/{jsonMode-D0kqu8c3.js → jsonMode-B_jTSLwe.js} +4 -4
  95. package/dist/_frontend/assets/jsonMode-B_jTSLwe.js.br +0 -0
  96. package/dist/_frontend/assets/jsonMode-B_jTSLwe.js.gz +0 -0
  97. package/dist/_frontend/assets/{liquid-CB807zJs.js → liquid-OVC8bSZr.js} +1 -1
  98. package/dist/_frontend/assets/liquid-OVC8bSZr.js.br +0 -0
  99. package/dist/_frontend/assets/liquid-OVC8bSZr.js.gz +0 -0
  100. package/dist/_frontend/assets/{lspLanguageFeatures-D0-0mkv4.js → lspLanguageFeatures-BpQc31SX.js} +1 -1
  101. package/dist/_frontend/assets/lspLanguageFeatures-BpQc31SX.js.br +0 -0
  102. package/dist/_frontend/assets/lspLanguageFeatures-BpQc31SX.js.gz +0 -0
  103. package/dist/_frontend/assets/{mdx-7_H2_m8y.js → mdx-Rt-sDg8a.js} +1 -1
  104. package/dist/_frontend/assets/mdx-Rt-sDg8a.js.br +0 -0
  105. package/dist/_frontend/assets/mdx-Rt-sDg8a.js.gz +0 -0
  106. package/dist/_frontend/assets/{python-DhB7kQ15.js → python-CLLuhWlP.js} +1 -1
  107. package/dist/_frontend/assets/python-CLLuhWlP.js.br +0 -0
  108. package/dist/_frontend/assets/python-CLLuhWlP.js.gz +0 -0
  109. package/dist/_frontend/assets/{razor-CDzQiIjH.js → razor-CTEZKBpz.js} +1 -1
  110. package/dist/_frontend/assets/razor-CTEZKBpz.js.br +0 -0
  111. package/dist/_frontend/assets/razor-CTEZKBpz.js.gz +0 -0
  112. package/dist/_frontend/assets/{tsMode-CVP7xaF5.js → tsMode-BsjOp9ss.js} +1 -1
  113. package/dist/_frontend/assets/tsMode-BsjOp9ss.js.br +0 -0
  114. package/dist/_frontend/assets/tsMode-BsjOp9ss.js.gz +0 -0
  115. package/dist/_frontend/assets/{typescript-BTAuo6jN.js → typescript-CpIJvyBH.js} +1 -1
  116. package/dist/_frontend/assets/typescript-CpIJvyBH.js.br +0 -0
  117. package/dist/_frontend/assets/typescript-CpIJvyBH.js.gz +0 -0
  118. package/dist/_frontend/assets/{workers-Dl5avODY.js → workers-C_uhAUan.js} +1 -1
  119. package/dist/_frontend/assets/workers-C_uhAUan.js.br +0 -0
  120. package/dist/_frontend/assets/workers-C_uhAUan.js.gz +0 -0
  121. package/dist/_frontend/assets/{xml-CKI7eM7V.js → xml-BxHi2HCJ.js} +1 -1
  122. package/dist/_frontend/assets/xml-BxHi2HCJ.js.br +0 -0
  123. package/dist/_frontend/assets/xml-BxHi2HCJ.js.gz +0 -0
  124. package/dist/_frontend/assets/{yaml-Czn9FR3r.js → yaml-DyyH_CDu.js} +1 -1
  125. package/dist/_frontend/assets/yaml-DyyH_CDu.js.br +0 -0
  126. package/dist/_frontend/assets/yaml-DyyH_CDu.js.gz +0 -0
  127. package/dist/_frontend/index.html +5 -2
  128. package/dist/controller-main.js +197 -118
  129. package/dist/controller-main.js.map +1 -1
  130. package/dist/main.js +10461 -8718
  131. package/dist/main.js.map +1 -1
  132. package/dist/postgres/migrations/20260907_000001_schedule_run_reason.js +15 -0
  133. package/dist/postgres/migrations/20260907_000001_schedule_run_reason.js.map +1 -0
  134. package/dist/sqlite/migrations/20260907_000001_schedule_run_reason.js +17 -0
  135. package/dist/sqlite/migrations/20260907_000001_schedule_run_reason.js.map +1 -0
  136. package/package.json +3 -4
  137. package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js +0 -1
  138. package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js.br +0 -0
  139. package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js.gz +0 -0
  140. package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js +0 -1
  141. package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js.br +0 -0
  142. package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js.gz +0 -0
  143. package/dist/_frontend/assets/AgentOverview-3FJ5EE6N-D1pX5Emq.js.br +0 -0
  144. package/dist/_frontend/assets/AgentOverview-3FJ5EE6N-D1pX5Emq.js.gz +0 -0
  145. package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js +0 -1
  146. package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js.br +0 -0
  147. package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js.gz +0 -0
  148. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js +0 -1
  149. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js.br +0 -0
  150. package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js.gz +0 -0
  151. package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js +0 -1
  152. package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js.br +0 -0
  153. package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js.gz +0 -0
  154. package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js +0 -1
  155. package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js.br +0 -0
  156. package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js.gz +0 -0
  157. package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js +0 -2
  158. package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js.br +0 -0
  159. package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js.gz +0 -0
  160. package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js +0 -1
  161. package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js.br +0 -0
  162. package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js.gz +0 -0
  163. package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js +0 -1
  164. package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js.br +0 -0
  165. package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js.gz +0 -0
  166. package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js +0 -1
  167. package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js.br +0 -0
  168. package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js.gz +0 -0
  169. package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js.br +0 -0
  170. package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js.gz +0 -0
  171. package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js +0 -1
  172. package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js.br +0 -0
  173. package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js.gz +0 -0
  174. package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js +0 -2
  175. package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js.br +0 -0
  176. package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js.gz +0 -0
  177. package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js +0 -1
  178. package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js.br +0 -0
  179. package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js.gz +0 -0
  180. package/dist/_frontend/assets/TrueForgeUIWithRouter-3TSLV22Q-BiR4AwMi.js +0 -1
  181. package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js +0 -1
  182. package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js.br +0 -0
  183. package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js.gz +0 -0
  184. package/dist/_frontend/assets/chunk-62JRHF6Z-gAUkEAjv.js.br +0 -0
  185. package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js +0 -2
  186. package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js.br +0 -0
  187. package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js.gz +0 -0
  188. package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js +0 -1
  189. package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js.br +0 -0
  190. package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js.gz +0 -0
  191. package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js +0 -1
  192. package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js.br +0 -0
  193. package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js.gz +0 -0
  194. package/dist/_frontend/assets/cssMode-Bmk_AUwV.js +0 -1
  195. package/dist/_frontend/assets/cssMode-Bmk_AUwV.js.br +0 -0
  196. package/dist/_frontend/assets/cssMode-Bmk_AUwV.js.gz +0 -0
  197. package/dist/_frontend/assets/freemarker2-BqULNxdn.js.br +0 -0
  198. package/dist/_frontend/assets/freemarker2-BqULNxdn.js.gz +0 -0
  199. package/dist/_frontend/assets/handlebars-D-wN_MMv.js.br +0 -0
  200. package/dist/_frontend/assets/handlebars-D-wN_MMv.js.gz +0 -0
  201. package/dist/_frontend/assets/html-DX_2Eu_G.js.br +0 -0
  202. package/dist/_frontend/assets/html-DX_2Eu_G.js.gz +0 -0
  203. package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js +0 -1
  204. package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js.br +0 -0
  205. package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js.gz +0 -0
  206. package/dist/_frontend/assets/index-CB2SckMT.css +0 -1
  207. package/dist/_frontend/assets/index-CB2SckMT.css.br +0 -0
  208. package/dist/_frontend/assets/index-CB2SckMT.css.gz +0 -0
  209. package/dist/_frontend/assets/index-CNHFMp3w.js.br +0 -0
  210. package/dist/_frontend/assets/index-CNHFMp3w.js.gz +0 -0
  211. package/dist/_frontend/assets/index-G4wOqi3O.js +0 -923
  212. package/dist/_frontend/assets/index-G4wOqi3O.js.br +0 -0
  213. package/dist/_frontend/assets/index-G4wOqi3O.js.gz +0 -0
  214. package/dist/_frontend/assets/index-MPbqVnOf.js.br +0 -0
  215. package/dist/_frontend/assets/index-MPbqVnOf.js.gz +0 -0
  216. package/dist/_frontend/assets/index-SN54UIUh.css.br +0 -0
  217. package/dist/_frontend/assets/index-SN54UIUh.css.gz +0 -0
  218. package/dist/_frontend/assets/jsonMode-D0kqu8c3.js.br +0 -0
  219. package/dist/_frontend/assets/jsonMode-D0kqu8c3.js.gz +0 -0
  220. package/dist/_frontend/assets/liquid-CB807zJs.js.br +0 -0
  221. package/dist/_frontend/assets/liquid-CB807zJs.js.gz +0 -0
  222. package/dist/_frontend/assets/lspLanguageFeatures-D0-0mkv4.js.br +0 -0
  223. package/dist/_frontend/assets/lspLanguageFeatures-D0-0mkv4.js.gz +0 -0
  224. package/dist/_frontend/assets/mdx-7_H2_m8y.js.br +0 -0
  225. package/dist/_frontend/assets/mdx-7_H2_m8y.js.gz +0 -0
  226. package/dist/_frontend/assets/python-DhB7kQ15.js.br +0 -0
  227. package/dist/_frontend/assets/python-DhB7kQ15.js.gz +0 -0
  228. package/dist/_frontend/assets/razor-CDzQiIjH.js.br +0 -0
  229. package/dist/_frontend/assets/razor-CDzQiIjH.js.gz +0 -0
  230. package/dist/_frontend/assets/tsMode-CVP7xaF5.js.br +0 -0
  231. package/dist/_frontend/assets/tsMode-CVP7xaF5.js.gz +0 -0
  232. package/dist/_frontend/assets/typescript-BTAuo6jN.js.br +0 -0
  233. package/dist/_frontend/assets/typescript-BTAuo6jN.js.gz +0 -0
  234. package/dist/_frontend/assets/workers-Dl5avODY.js.br +0 -0
  235. package/dist/_frontend/assets/workers-Dl5avODY.js.gz +0 -0
  236. package/dist/_frontend/assets/xml-CKI7eM7V.js.br +0 -0
  237. package/dist/_frontend/assets/xml-CKI7eM7V.js.gz +0 -0
  238. package/dist/_frontend/assets/yaml-Czn9FR3r.js.br +0 -0
  239. package/dist/_frontend/assets/yaml-Czn9FR3r.js.gz +0 -0
@@ -16,6 +16,7 @@ var DEFAULT_POSTGRES_DB = "trueforge";
16
16
  var DEFAULT_POSTGRES_HOST = "localhost";
17
17
  var DEFAULT_POSTGRES_PORT = 5432;
18
18
  var DEFAULT_REDIS_URL = "redis://localhost:6379";
19
+ var STANDALONE_TRUEFORGE_API_KEY = "trueforge-standalone";
19
20
  var DEFAULT_OIDC_USER_REFERENCE_CLAIM = "sub";
20
21
  var DEFAULT_OIDC_USER_DISPLAY_NAME_CLAIM = "name";
21
22
  var DEFAULT_OIDC_USER_ROLE_CLAIM = "groups";
@@ -85,6 +86,38 @@ function parseBoolean(options) {
85
86
  }
86
87
  throw new Error(`Environment variable ${envKey} must be "true" or "false", got "${raw}"`);
87
88
  }
89
+ function parsePublicBaseUrl(raw) {
90
+ if (raw === void 0 || raw.trim() === "") {
91
+ return "";
92
+ }
93
+ let parsed;
94
+ try {
95
+ parsed = new URL(raw.trim());
96
+ } catch (error) {
97
+ throw new Error("PUBLIC_BASE_URL must be a valid URL", { cause: error });
98
+ }
99
+ if (parsed.search !== "" || parsed.hash !== "") {
100
+ throw new Error("PUBLIC_BASE_URL must not include a query or hash");
101
+ }
102
+ const segments = parsed.pathname.split("/").filter((part) => part.length > 0);
103
+ if (segments.some((part) => part === "." || part === "..")) {
104
+ throw new Error('PUBLIC_BASE_URL path must not contain "." or ".." segments');
105
+ }
106
+ const path3 = segments.length === 0 ? "" : `/${segments.join("/")}`;
107
+ return `${parsed.origin}${path3}`;
108
+ }
109
+ function parseTrueFoundrySandboxProvider(raw) {
110
+ if (raw === void 0 || raw.trim() === "") {
111
+ return void 0;
112
+ }
113
+ const value = raw.trim();
114
+ if (value === "daytona" || value === "truefoundry") {
115
+ return value;
116
+ }
117
+ throw new Error(
118
+ `Environment variable TRUEFOUNDRY_SANDBOX_PROVIDER must be "daytona" or "truefoundry", got ${JSON.stringify(raw)}`
119
+ );
120
+ }
88
121
  function parsePostgresSslMode(raw) {
89
122
  if (!raw) {
90
123
  return "";
@@ -296,8 +329,9 @@ var shared = {
296
329
  raw: getEnv("REDIS_REQUEST_REPLY_POLL_INTERVAL_MS"),
297
330
  defaultValue: 500
298
331
  }),
299
- PUBLIC_BASE_URL: getEnv("PUBLIC_BASE_URL", { defaultValue: "" }) ?? "",
332
+ PUBLIC_BASE_URL: parsePublicBaseUrl(getEnv("PUBLIC_BASE_URL", { defaultValue: "" })),
300
333
  SERVER_URL: getEnv("SERVER_URL", { defaultValue: `http://localhost:${String(port)}` }) ?? `http://localhost:${String(port)}`,
334
+ TRUEFORGE_API_KEY: standalone ? getEnv("TRUEFORGE_API_KEY", { defaultValue: STANDALONE_TRUEFORGE_API_KEY }) ?? STANDALONE_TRUEFORGE_API_KEY : getEnv("TRUEFORGE_API_KEY", { required: true }) ?? "",
301
335
  TRUEFORGE_MTLS_ENABLED: parseBoolean({
302
336
  envKey: "TRUEFORGE_MTLS_ENABLED",
303
337
  raw: getEnv("TRUEFORGE_MTLS_ENABLED"),
@@ -333,6 +367,7 @@ var configuration = standalone ? {
333
367
  REDIS_URL: resolveRedisUrl(),
334
368
  OIDC: resolveOIDCConfig(),
335
369
  TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URL: getEnv("TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URL", { required: false }),
370
+ TRUEFOUNDRY_API_KEY: getEnv("TRUEFOUNDRY_API_KEY", { required: false }),
336
371
  TRUEFOUNDRY_SERVICEFOUNDRY_HTTP_TIMEOUT_MS: parsePositiveInt({
337
372
  envKey: "TRUEFOUNDRY_SERVICEFOUNDRY_HTTP_TIMEOUT_MS",
338
373
  raw: getEnv("TRUEFOUNDRY_SERVICEFOUNDRY_HTTP_TIMEOUT_MS"),
@@ -354,8 +389,12 @@ var configuration = standalone ? {
354
389
  raw: getEnv("TRUEFOUNDRY_SANDBOX_ENABLED"),
355
390
  defaultValue: false
356
391
  }),
392
+ TRUEFOUNDRY_SANDBOX_PROVIDER: parseTrueFoundrySandboxProvider(
393
+ getEnv("TRUEFOUNDRY_SANDBOX_PROVIDER", { required: false })
394
+ ),
357
395
  TRUEFOUNDRY_SANDBOX_API_KEY: getEnv("TRUEFOUNDRY_SANDBOX_API_KEY", { required: false }),
358
- TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL: getEnv("TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL", { required: false })
396
+ TRUEFOUNDRY_SANDBOX_SERVER_URL: getEnv("TRUEFOUNDRY_SANDBOX_SERVER_URL", { required: false }),
397
+ TRUEFOUNDRY_SANDBOX_SETTINGS: getEnv("TRUEFOUNDRY_SANDBOX_SETTINGS", { required: false })
359
398
  };
360
399
  function isOidcConfigured(value) {
361
400
  return !value.STANDALONE && value.OIDC !== void 0;
@@ -369,19 +408,42 @@ if (isTrueFoundryModeEnabled(configuration)) {
369
408
  "TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URL (TrueFoundry mode) and OIDC (SSO) cannot both be enabled at once."
370
409
  );
371
410
  }
411
+ if (configuration.TRUEFOUNDRY_API_KEY === void 0) {
412
+ throw new Error("TRUEFOUNDRY_API_KEY is required when TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URL is set.");
413
+ }
372
414
  if (configuration.TRUEFOUNDRY_SANDBOX_ENABLED) {
373
- if (configuration.TRUEFOUNDRY_SANDBOX_API_KEY === void 0 || configuration.TRUEFOUNDRY_SANDBOX_SETTINGS_SERVER_URL === void 0) {
415
+ if (configuration.TRUEFOUNDRY_SANDBOX_PROVIDER === void 0) {
416
+ throw new Error(
417
+ 'TRUEFOUNDRY_SANDBOX_ENABLED is true but TRUEFOUNDRY_SANDBOX_PROVIDER is not set. Set TRUEFOUNDRY_SANDBOX_PROVIDER to "daytona" or "truefoundry", or set TRUEFOUNDRY_SANDBOX_ENABLED=false.'
418
+ );
419
+ }
420
+ if (configuration.TRUEFOUNDRY_SANDBOX_SETTINGS === void 0) {
421
+ throw new Error(
422
+ "TRUEFOUNDRY_SANDBOX_ENABLED is true but TRUEFOUNDRY_SANDBOX_SETTINGS is not set. Provide a JSON settings object, or set TRUEFOUNDRY_SANDBOX_ENABLED=false."
423
+ );
424
+ }
425
+ try {
426
+ JSON.parse(configuration.TRUEFOUNDRY_SANDBOX_SETTINGS);
427
+ } catch (error) {
428
+ throw new Error("TRUEFOUNDRY_SANDBOX_SETTINGS must be valid JSON", { cause: error });
429
+ }
430
+ if (configuration.TRUEFOUNDRY_SANDBOX_PROVIDER === "daytona" && configuration.TRUEFOUNDRY_SANDBOX_API_KEY === void 0) {
431
+ throw new Error(
432
+ "TRUEFOUNDRY_SANDBOX_PROVIDER=daytona requires TRUEFOUNDRY_SANDBOX_API_KEY, or set TRUEFOUNDRY_SANDBOX_ENABLED=false."
433
+ );
434
+ }
435
+ if (configuration.TRUEFOUNDRY_SANDBOX_PROVIDER === "truefoundry" && configuration.TRUEFOUNDRY_SANDBOX_SERVER_URL === void 0) {
374
436
  throw new Error(
375
- "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."
437
+ "TRUEFOUNDRY_SANDBOX_PROVIDER=truefoundry requires TRUEFOUNDRY_SANDBOX_SERVER_URL, or set TRUEFOUNDRY_SANDBOX_ENABLED=false."
376
438
  );
377
439
  }
378
440
  }
379
441
  }
442
+ if (!configuration.STANDALONE && configuration.TRUEFORGE_API_KEY.trim() === "") {
443
+ throw new Error("TRUEFORGE_API_KEY must not be empty when STANDALONE=false.");
444
+ }
380
445
  var config_default = configuration;
381
446
 
382
- // src/controller.ts
383
- import { TrueForge } from "@truefoundry/trueforge-sdk";
384
-
385
447
  // src/controller/Controller.ts
386
448
  var CONTROLLER_STOPPED = "controller-stopped";
387
449
  var Controller = class {
@@ -476,6 +538,9 @@ var Controller = class {
476
538
  }
477
539
  };
478
540
 
541
+ // src/controller/scheduleDispatch.ts
542
+ import { TrueForge } from "@truefoundry/trueforge-sdk";
543
+
479
544
  // src/db/scheduleStore.ts
480
545
  import { randomUUID } from "crypto";
481
546
 
@@ -554,14 +619,21 @@ var ScheduleRunSchema = z2.object({
554
619
  status: ScheduleRunStatusSchema,
555
620
  created_by_subject: CreatedBySubjectSchema,
556
621
  triggered_at: NullableIsoTimestamp,
622
+ reason: z2.string().nullable(),
557
623
  created_at: IsoTimestamp,
558
624
  updated_at: IsoTimestamp
559
625
  }).strict().openapi("ScheduleRun");
560
- var ListScheduleRunsResponseSchema = z2.object({ data: z2.array(ScheduleRunSchema) }).openapi("ListScheduleRunsResponse");
626
+ var ListScheduleRunsResponseSchema = z2.object({
627
+ data: z2.array(ScheduleRunSchema),
628
+ pagination: TokenPaginationSchema
629
+ }).openapi("ListScheduleRunsResponse");
561
630
  var CreateScheduleRunRequestSchema = z2.object({
562
631
  schedule_id: z2.string().min(1).max(64).describe("Immutable schedule identifier.")
563
632
  }).strict().describe("Trigger an immediate run for the given schedule. The task is taken from the schedule manifest.").openapi("CreateScheduleRunRequest");
564
633
  var CreateScheduleRunResponseSchema = z2.object({ data: ScheduleRunSchema }).openapi("CreateScheduleRunResponse");
634
+ var ExecuteScheduleRunRequestSchema = z2.object({
635
+ schedule_run_id: z2.string().min(1).max(64).describe("Immutable schedule run identifier.")
636
+ }).strict().openapi("ExecuteScheduleRunRequest");
565
637
 
566
638
  // src/db/scheduleStore.ts
567
639
  function cronRunName(scheduledFor) {
@@ -592,6 +664,71 @@ function shouldSyncPendingRun(previous, next) {
592
664
  return previous.status !== next.status || previous.manifest.cron !== next.manifest.cron || previous.manifest.timezone !== next.manifest.timezone;
593
665
  }
594
666
 
667
+ // src/http/tls.ts
668
+ import { readFileSync } from "fs";
669
+ import { createServer as createHttpsServer } from "https";
670
+ import { join } from "path";
671
+ import { rootCertificates, TLSSocket } from "tls";
672
+ import { Agent, fetch as undiciFetch } from "undici";
673
+ var TLS_CERT_FILE = "tls.crt";
674
+ var TLS_KEY_FILE = "tls.key";
675
+ var TLS_CA_FILE = "ca.crt";
676
+ function readTlsFile(input) {
677
+ const filePath = join(input.dir, input.fileName);
678
+ try {
679
+ return readFileSync(filePath, "utf8");
680
+ } catch (error) {
681
+ throw new Error(
682
+ `${input.enabledEnvKey} is true but ${filePath} could not be read. Check that the mTLS secret is mounted at the configured certs directory, or set ${input.enabledEnvKey}=false.`,
683
+ { cause: error }
684
+ );
685
+ }
686
+ }
687
+ function normalizeTlsUrl(input) {
688
+ if (!input.enabled) {
689
+ return input.url;
690
+ }
691
+ const parsed = new URL(input.url);
692
+ if (parsed.protocol === "http:") {
693
+ parsed.protocol = "https:";
694
+ }
695
+ return parsed.href;
696
+ }
697
+ function createTlsDispatcher(options) {
698
+ if (!options.enabled) {
699
+ return void 0;
700
+ }
701
+ const read = (fileName) => readTlsFile({ dir: options.dir, fileName, enabledEnvKey: options.enabledEnvKey });
702
+ return new Agent({
703
+ connect: {
704
+ // Appended to the default roots, not replacing them: passing `ca` alone would override Node's
705
+ // entire trust store for this dispatcher (breaks public HTTPS peers on the same agent).
706
+ ca: [...rootCertificates, read(TLS_CA_FILE)],
707
+ cert: read(TLS_CERT_FILE),
708
+ key: read(TLS_KEY_FILE)
709
+ }
710
+ });
711
+ }
712
+ function requestUrlFromFetchInput(input) {
713
+ if (typeof input === "string") {
714
+ return input;
715
+ }
716
+ if (input instanceof URL) {
717
+ return input.href;
718
+ }
719
+ return input.url;
720
+ }
721
+ function createTlsFetch(options) {
722
+ const dispatcher = createTlsDispatcher({
723
+ ...options,
724
+ enabledEnvKey: "TRUEFORGE_MTLS_ENABLED"
725
+ });
726
+ if (dispatcher === void 0) {
727
+ return void 0;
728
+ }
729
+ return (input, init) => undiciFetch(requestUrlFromFetchInput(input), { ...init, dispatcher });
730
+ }
731
+
595
732
  // src/runtime/cron.ts
596
733
  import { CronExpressionParser } from "cron-parser";
597
734
  function nextTriggerAfter(input) {
@@ -609,30 +746,33 @@ function nextTriggerAfter(input) {
609
746
 
610
747
  // src/controller/scheduleDispatch.ts
611
748
  var DISPATCH_BATCH_LIMIT = 20;
749
+ function scheduleRunFailureReason(error) {
750
+ return error instanceof Error && error.message.trim() !== "" ? error.message : "Schedule run failed";
751
+ }
612
752
  var SCHEDULE_DISPATCH_INTERVAL_MS = 6e4;
613
753
  var SCHEDULE_DISPATCH_LOOP_NAME = "schedule-dispatch";
614
- function executeScheduledRun(client) {
615
- return async ({ run, schedule }) => {
616
- const { data: session } = await client.internal.sessions.getOrCreateByExternalId({
617
- externalId: run.id,
618
- agent: { name: schedule.agent_name },
619
- source: { type: "schedule", id: schedule.id, runId: run.id }
620
- });
621
- const turns = await client.sessions.listTurns(session.id, { limit: 1 });
622
- if (turns.data.length > 0) {
623
- return;
624
- }
625
- await client.sessions.createTurn(session.id, {
626
- input: [{ type: "user.message", content: schedule.manifest.task }],
627
- previousTurnId: "none"
628
- });
754
+ function createHttpScheduleRunExecutor() {
755
+ const tls = {
756
+ enabled: config_default.TRUEFORGE_MTLS_ENABLED,
757
+ dir: config_default.TRUEFORGE_MTLS_CERTS_DIR
629
758
  };
759
+ const tlsFetch = createTlsFetch(tls);
760
+ const client = new TrueForge({
761
+ baseUrl: normalizeTlsUrl({ url: config_default.SERVER_URL, enabled: tls.enabled }),
762
+ token: config_default.TRUEFORGE_API_KEY,
763
+ timeoutInSeconds: 60,
764
+ ...tlsFetch === void 0 ? {} : { fetch: tlsFetch }
765
+ });
766
+ return (scheduleRunId) => client.internal.schedules.executeRun({ scheduleRunId });
630
767
  }
631
768
  async function finishScheduledRun(params) {
632
- const { store, withTransaction, run, status, now: now2 } = params;
769
+ const { store, withTransaction, run, status, reason, now: now2 } = params;
633
770
  await withTransaction(async (txn) => {
634
771
  const latest = await store.getScheduleForUpdate({ tenant_id: run.tenant_id, id: run.schedule_id }, txn);
635
- const updated = await store.updateRunStatus({ tenant_id: run.tenant_id, id: run.id, status }, txn);
772
+ const updated = await store.updateRunStatus(
773
+ { tenant_id: run.tenant_id, id: run.id, status, reason: reason ?? null },
774
+ txn
775
+ );
636
776
  if (updated === void 0) {
637
777
  return;
638
778
  }
@@ -697,6 +837,7 @@ async function dispatchScheduledRuns(params) {
697
837
  run,
698
838
  now: now2,
699
839
  status: "failed",
840
+ reason: scheduleRunFailureReason(error),
700
841
  withTransaction
701
842
  });
702
843
  failed += 1;
@@ -721,14 +862,15 @@ async function dispatchScheduledRuns(params) {
721
862
  return { dispatched, failed };
722
863
  }
723
864
  function scheduleDispatchLoop(params) {
724
- const { scheduleStore, client, withTransaction, logger } = params;
865
+ const { scheduleStore, withTransaction, logger } = params;
866
+ const executeRun = createHttpScheduleRunExecutor();
725
867
  return {
726
868
  name: SCHEDULE_DISPATCH_LOOP_NAME,
727
869
  intervalMs: SCHEDULE_DISPATCH_INTERVAL_MS,
728
870
  async tick(signal) {
729
871
  const result = await dispatchScheduledRuns({
730
872
  store: scheduleStore,
731
- onTriggered: executeScheduledRun(client),
873
+ onTriggered: (item) => executeRun(item.run.id),
732
874
  logger,
733
875
  withTransaction,
734
876
  signal
@@ -740,94 +882,17 @@ function scheduleDispatchLoop(params) {
740
882
  };
741
883
  }
742
884
 
743
- // src/http/tls.ts
744
- import { readFileSync } from "fs";
745
- import { createServer as createHttpsServer } from "https";
746
- import { join } from "path";
747
- import { rootCertificates, TLSSocket } from "tls";
748
- import { Agent, fetch as undiciFetch } from "undici";
749
- var TLS_CERT_FILE = "tls.crt";
750
- var TLS_KEY_FILE = "tls.key";
751
- var TLS_CA_FILE = "ca.crt";
752
- function readTlsFile(input) {
753
- const filePath = join(input.dir, input.fileName);
754
- try {
755
- return readFileSync(filePath, "utf8");
756
- } catch (error) {
757
- throw new Error(
758
- `${input.enabledEnvKey} is true but ${filePath} could not be read. Check that the mTLS secret is mounted at the configured certs directory, or set ${input.enabledEnvKey}=false.`,
759
- { cause: error }
760
- );
761
- }
762
- }
763
- function normalizeTlsUrl(input) {
764
- if (!input.enabled) {
765
- return input.url;
766
- }
767
- const parsed = new URL(input.url);
768
- if (parsed.protocol === "http:") {
769
- parsed.protocol = "https:";
770
- }
771
- return parsed.href;
772
- }
773
- function createTlsDispatcher(options) {
774
- if (!options.enabled) {
775
- return void 0;
776
- }
777
- const read = (fileName) => readTlsFile({ dir: options.dir, fileName, enabledEnvKey: options.enabledEnvKey });
778
- return new Agent({
779
- connect: {
780
- // Appended to the default roots, not replacing them: passing `ca` alone would override Node's
781
- // entire trust store for this dispatcher (breaks public HTTPS peers on the same agent).
782
- ca: [...rootCertificates, read(TLS_CA_FILE)],
783
- cert: read(TLS_CERT_FILE),
784
- key: read(TLS_KEY_FILE)
785
- }
786
- });
787
- }
788
- function requestUrlFromFetchInput(input) {
789
- if (typeof input === "string") {
790
- return input;
791
- }
792
- if (input instanceof URL) {
793
- return input.href;
794
- }
795
- return input.url;
796
- }
797
- function createTlsFetch(options) {
798
- const dispatcher = createTlsDispatcher({
799
- ...options,
800
- enabledEnvKey: "TRUEFORGE_MTLS_ENABLED"
801
- });
802
- if (dispatcher === void 0) {
803
- return void 0;
804
- }
805
- return (input, init) => undiciFetch(requestUrlFromFetchInput(input), { ...init, dispatcher });
806
- }
807
-
808
885
  // src/controller.ts
809
- function createScheduleApiClient(params) {
810
- const baseUrl = normalizeTlsUrl({ url: params.baseUrl, enabled: params.tls.enabled });
811
- const fetchImpl = createTlsFetch(params.tls);
812
- return new TrueForge({
813
- baseUrl,
814
- auth: false,
815
- ...fetchImpl !== void 0 ? { fetch: fetchImpl } : {}
816
- });
817
- }
818
886
  function createController(params) {
819
- const { scheduleStore, withTransaction, logger, baseUrl } = params;
820
- const tls = params.tls ?? { enabled: false, dir: "" };
821
887
  return new Controller({
822
888
  loops: [
823
889
  scheduleDispatchLoop({
824
- scheduleStore,
825
- client: createScheduleApiClient({ baseUrl, tls }),
826
- withTransaction,
827
- logger
890
+ scheduleStore: params.scheduleStore,
891
+ withTransaction: params.withTransaction,
892
+ logger: params.logger
828
893
  })
829
894
  ],
830
- logger
895
+ logger: params.logger
831
896
  });
832
897
  }
833
898
  function runController(params) {
@@ -912,6 +977,7 @@ import {
912
977
  decodeOffsetPageToken,
913
978
  paginateOffsetRows
914
979
  } from "@truefoundry/trueforge-core/agent-session/store/OffsetPageToken";
980
+ import { sql as sql3 } from "kysely";
915
981
 
916
982
  // src/utils/id.ts
917
983
  import { ulid } from "ulid";
@@ -967,6 +1033,7 @@ function toRunRecord(row) {
967
1033
  status: row.status,
968
1034
  created_by_subject: CreatedBySubjectSchema2.parse(row.created_by_subject),
969
1035
  triggered_at: row.triggered_at === null ? null : row.triggered_at.toISOString(),
1036
+ reason: row.reason,
970
1037
  created_at: row.created_at.toISOString(),
971
1038
  updated_at: row.updated_at.toISOString()
972
1039
  };
@@ -1086,16 +1153,31 @@ var PostgresScheduleStore = class {
1086
1153
  const { data, pagination } = paginateOffsetRows(rows, input.limit, offset);
1087
1154
  return { data: data.map(toScheduleRecord), pagination };
1088
1155
  }
1156
+ async getOwnedIds(input, transaction) {
1157
+ if (input.ids.length === 0) {
1158
+ return [];
1159
+ }
1160
+ const db = transaction ?? this.#db;
1161
+ const rows = await db.selectFrom("schedule").select("id").where("tenant_id", "=", input.tenant_id).where("id", "in", [...input.ids]).where(sql3`created_by_subject->>'subject_id'`, "=", input.subject_id).execute();
1162
+ return rows.map((row) => row.id);
1163
+ }
1089
1164
  async listRuns(input, transaction) {
1165
+ const offset = decodeOffsetPageToken(input.page_token);
1090
1166
  const db = transaction ?? this.#db;
1091
- const rows = await db.selectFrom("schedule_run").selectAll().where("tenant_id", "=", input.tenant_id).where("schedule_id", "=", input.schedule_id).orderBy("scheduled_for", "desc").orderBy("id").execute();
1092
- return rows.map(toRunRecord);
1167
+ const rows = await db.selectFrom("schedule_run").selectAll().where("tenant_id", "=", input.tenant_id).where("schedule_id", "=", input.schedule_id).orderBy("scheduled_for", "desc").orderBy("id").limit(input.limit + 1).offset(offset).execute();
1168
+ const { data, pagination } = paginateOffsetRows(rows, input.limit, offset);
1169
+ return { data: data.map(toRunRecord), pagination };
1093
1170
  }
1094
1171
  async getRun(input, transaction) {
1095
1172
  const db = transaction ?? this.#db;
1096
1173
  const row = await db.selectFrom("schedule_run").selectAll().where("tenant_id", "=", input.tenant_id).where("id", "=", input.id).executeTakeFirst();
1097
1174
  return row === void 0 ? void 0 : toRunRecord(row);
1098
1175
  }
1176
+ async getRunById(input, transaction) {
1177
+ const db = transaction ?? this.#db;
1178
+ const row = await db.selectFrom("schedule_run").selectAll().where("id", "=", input.id).executeTakeFirst();
1179
+ return row === void 0 ? void 0 : toRunRecord(row);
1180
+ }
1099
1181
  async getScheduledRunFor(input, transaction) {
1100
1182
  const db = transaction ?? this.#db;
1101
1183
  const row = await db.selectFrom("schedule_run").selectAll().where("tenant_id", "=", input.tenant_id).where("schedule_id", "=", input.schedule_id).where("status", "=", "scheduled").executeTakeFirst();
@@ -1113,6 +1195,7 @@ var PostgresScheduleStore = class {
1113
1195
  status: input.status,
1114
1196
  created_by_subject: json(input.created_by_subject),
1115
1197
  triggered_at: input.triggered_at ?? null,
1198
+ reason: input.reason ?? null,
1116
1199
  created_at: now(),
1117
1200
  updated_at: now()
1118
1201
  }).returningAll().executeTakeFirstOrThrow();
@@ -1126,7 +1209,9 @@ var PostgresScheduleStore = class {
1126
1209
  }
1127
1210
  async updateRunStatus(input, transaction) {
1128
1211
  const db = transaction ?? this.#db;
1129
- const patch = input.status === "triggered" ? { status: input.status, triggered_at: now(), updated_at: now() } : { status: input.status, updated_at: now() };
1212
+ const timestamp = now();
1213
+ const reason = input.status === "failed" ? input.reason ?? null : null;
1214
+ const patch = input.status === "triggered" ? { status: input.status, triggered_at: timestamp, reason, updated_at: timestamp } : { status: input.status, reason, updated_at: timestamp };
1130
1215
  const row = await db.updateTable("schedule_run").set(patch).where("tenant_id", "=", input.tenant_id).where("id", "=", input.id).returningAll().executeTakeFirst();
1131
1216
  return row === void 0 ? void 0 : toRunRecord(row);
1132
1217
  }
@@ -1247,20 +1332,14 @@ try {
1247
1332
  statementTimeoutMs: config_default.POSTGRES_STATEMENT_TIMEOUT_MS,
1248
1333
  idleInTransactionSessionTimeoutMs: config_default.POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS
1249
1334
  });
1250
- const mtls = {
1251
- enabled: config_default.TRUEFORGE_MTLS_ENABLED,
1252
- dir: config_default.TRUEFORGE_MTLS_CERTS_DIR
1253
- };
1254
1335
  logger.info("Controller starting", {
1255
1336
  serverUrl: config_default.SERVER_URL,
1256
- mTlsEnabled: mtls.enabled
1337
+ mTlsEnabled: config_default.TRUEFORGE_MTLS_ENABLED
1257
1338
  });
1258
1339
  runController({
1259
1340
  scheduleStore: new PostgresScheduleStore(db),
1260
1341
  withTransaction: (callback) => db.transaction().execute(callback),
1261
1342
  logger,
1262
- baseUrl: config_default.SERVER_URL,
1263
- tls: mtls,
1264
1343
  gracefulTimeoutSeconds: config_default.GRACEFUL_TIMEOUT_SECONDS,
1265
1344
  onStopped: () => db.destroy()
1266
1345
  });