@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.
- package/dist/_frontend/assets/AgentCodeSnippets-U6KQWVBJ-mo8URLKV.js +1 -0
- package/dist/_frontend/assets/AgentCodeSnippets-U6KQWVBJ-mo8URLKV.js.br +0 -0
- package/dist/_frontend/assets/AgentCodeSnippets-U6KQWVBJ-mo8URLKV.js.gz +0 -0
- package/dist/_frontend/assets/AgentMetricChart-3D6FUFO6-DzIcybRU.js +1 -0
- package/dist/_frontend/assets/AgentMetricChart-3D6FUFO6-DzIcybRU.js.br +0 -0
- package/dist/_frontend/assets/AgentMetricChart-3D6FUFO6-DzIcybRU.js.gz +0 -0
- package/dist/_frontend/assets/{AgentOverview-3FJ5EE6N-D1pX5Emq.js → AgentOverview-RLJ6HZCN-YJvNjt8b.js} +1 -1
- package/dist/_frontend/assets/AgentOverview-RLJ6HZCN-YJvNjt8b.js.br +0 -0
- package/dist/_frontend/assets/AgentOverview-RLJ6HZCN-YJvNjt8b.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-CDXRRUZQ-CnbfBoc3.js +1 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-CDXRRUZQ-CnbfBoc3.js.br +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-CDXRRUZQ-CnbfBoc3.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-S2WX6ZEA-BjzWPaWE.js +1 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-S2WX6ZEA-BjzWPaWE.js.br +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-S2WX6ZEA-BjzWPaWE.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessions-UI3L7XY2-CG8nWJdo.js +1 -0
- package/dist/_frontend/assets/AgentSessions-UI3L7XY2-CG8nWJdo.js.br +0 -0
- package/dist/_frontend/assets/AgentSessions-UI3L7XY2-CG8nWJdo.js.gz +0 -0
- package/dist/_frontend/assets/ConnectorSettings-OIGAC2HU-xm76mpmk.js +1 -0
- package/dist/_frontend/assets/ConnectorSettings-OIGAC2HU-xm76mpmk.js.br +0 -0
- package/dist/_frontend/assets/ConnectorSettings-OIGAC2HU-xm76mpmk.js.gz +0 -0
- package/dist/_frontend/assets/{DockLayout-NLFNU6F2-BGJvqqVS.js → DockLayout-J5BRKMJZ-xjQQzILb.js} +1 -1
- package/dist/_frontend/assets/DrawerLayout-65YHGHIF-CehQ0ZjJ.js +2 -0
- package/dist/_frontend/assets/DrawerLayout-65YHGHIF-CehQ0ZjJ.js.br +0 -0
- package/dist/_frontend/assets/DrawerLayout-65YHGHIF-CehQ0ZjJ.js.gz +0 -0
- package/dist/_frontend/assets/ModelSettings-VP6WCMGT-DuhYOy95.js +1 -0
- package/dist/_frontend/assets/ModelSettings-VP6WCMGT-DuhYOy95.js.br +0 -0
- package/dist/_frontend/assets/ModelSettings-VP6WCMGT-DuhYOy95.js.gz +0 -0
- package/dist/_frontend/assets/SandboxSettings-GTZT7LD6-F_5p7NeO.js +1 -0
- package/dist/_frontend/assets/SandboxSettings-GTZT7LD6-F_5p7NeO.js.br +0 -0
- package/dist/_frontend/assets/SandboxSettings-GTZT7LD6-F_5p7NeO.js.gz +0 -0
- package/dist/_frontend/assets/SchedulesPage-ARWU7BZF-BIZcHayD.js +1 -0
- package/dist/_frontend/assets/SchedulesPage-ARWU7BZF-BIZcHayD.js.br +0 -0
- package/dist/_frontend/assets/SchedulesPage-ARWU7BZF-BIZcHayD.js.gz +0 -0
- package/dist/_frontend/assets/{SettingsBuilder-LSXK2VN4-B0Y9JGuK.js → SettingsBuilder-A4BPYIFZ-B4p1JpXq.js} +2 -2
- package/dist/_frontend/assets/SettingsBuilder-A4BPYIFZ-B4p1JpXq.js.br +0 -0
- package/dist/_frontend/assets/SettingsBuilder-A4BPYIFZ-B4p1JpXq.js.gz +0 -0
- package/dist/_frontend/assets/ShellRouteSync-SSLGM35F-Cqt-1Q8u.js +1 -0
- package/dist/_frontend/assets/ShellRouteSync-SSLGM35F-Cqt-1Q8u.js.br +0 -0
- package/dist/_frontend/assets/ShellRouteSync-SSLGM35F-Cqt-1Q8u.js.gz +0 -0
- package/dist/_frontend/assets/SidebarLayout-MFDOGAVJ-pSgzH70r.js +2 -0
- package/dist/_frontend/assets/SidebarLayout-MFDOGAVJ-pSgzH70r.js.br +0 -0
- package/dist/_frontend/assets/SidebarLayout-MFDOGAVJ-pSgzH70r.js.gz +0 -0
- package/dist/_frontend/assets/SkillSettings-WQPUQ5TE-x17-_tYg.js +1 -0
- package/dist/_frontend/assets/SkillSettings-WQPUQ5TE-x17-_tYg.js.br +0 -0
- package/dist/_frontend/assets/SkillSettings-WQPUQ5TE-x17-_tYg.js.gz +0 -0
- package/dist/_frontend/assets/TrueForgeUIWithRouter-5CDICMCE-DcMl1KUh.js +1 -0
- package/dist/_frontend/assets/WidgetLayout-HE7E4UL5-D_jC6D5-.js +1 -0
- package/dist/_frontend/assets/WidgetLayout-HE7E4UL5-D_jC6D5-.js.br +0 -0
- package/dist/_frontend/assets/WidgetLayout-HE7E4UL5-D_jC6D5-.js.gz +0 -0
- package/dist/_frontend/assets/chunk-2BDTG544-FxcOqFr-.js +1 -0
- package/dist/_frontend/assets/chunk-2BDTG544-FxcOqFr-.js.br +0 -0
- package/dist/_frontend/assets/chunk-2BDTG544-FxcOqFr-.js.gz +0 -0
- package/dist/_frontend/assets/{chunk-62JRHF6Z-gAUkEAjv.js → chunk-62JRHF6Z-6aeTVQm8.js} +1 -1
- package/dist/_frontend/assets/chunk-62JRHF6Z-6aeTVQm8.js.br +0 -0
- package/dist/_frontend/assets/{chunk-62JRHF6Z-gAUkEAjv.js.gz → chunk-62JRHF6Z-6aeTVQm8.js.gz} +0 -0
- package/dist/_frontend/assets/chunk-TGKQRK3S-D5Bs7icZ.js +1 -0
- package/dist/_frontend/assets/chunk-TGKQRK3S-D5Bs7icZ.js.br +0 -0
- package/dist/_frontend/assets/chunk-TGKQRK3S-D5Bs7icZ.js.gz +0 -0
- package/dist/_frontend/assets/chunk-VXKNS7FH-Dm2ZAGlE.js +2 -0
- package/dist/_frontend/assets/chunk-VXKNS7FH-Dm2ZAGlE.js.br +0 -0
- package/dist/_frontend/assets/chunk-VXKNS7FH-Dm2ZAGlE.js.gz +0 -0
- package/dist/_frontend/assets/cssMode-BSK94pjD.js +1 -0
- package/dist/_frontend/assets/cssMode-BSK94pjD.js.br +0 -0
- package/dist/_frontend/assets/cssMode-BSK94pjD.js.gz +0 -0
- package/dist/_frontend/assets/{freemarker2-BqULNxdn.js → freemarker2-hYZ9lU-u.js} +1 -1
- package/dist/_frontend/assets/freemarker2-hYZ9lU-u.js.br +0 -0
- package/dist/_frontend/assets/freemarker2-hYZ9lU-u.js.gz +0 -0
- package/dist/_frontend/assets/{handlebars-D-wN_MMv.js → handlebars-CJdvCy_0.js} +1 -1
- package/dist/_frontend/assets/handlebars-CJdvCy_0.js.br +0 -0
- package/dist/_frontend/assets/handlebars-CJdvCy_0.js.gz +0 -0
- package/dist/_frontend/assets/{html-DX_2Eu_G.js → html-BHnJtaJv.js} +1 -1
- package/dist/_frontend/assets/html-BHnJtaJv.js.br +0 -0
- package/dist/_frontend/assets/html-BHnJtaJv.js.gz +0 -0
- package/dist/_frontend/assets/htmlMode-BTNbHYXw.js +1 -0
- package/dist/_frontend/assets/htmlMode-BTNbHYXw.js.br +0 -0
- package/dist/_frontend/assets/htmlMode-BTNbHYXw.js.gz +0 -0
- package/dist/_frontend/assets/{index-MPbqVnOf.js → index-B1sBHguz.js} +1 -1
- package/dist/_frontend/assets/index-B1sBHguz.js.br +0 -0
- package/dist/_frontend/assets/index-B1sBHguz.js.gz +0 -0
- package/dist/_frontend/assets/{index-SN54UIUh.css → index-BBGLYdJn.css} +1 -1
- package/dist/_frontend/assets/index-BBGLYdJn.css.br +0 -0
- package/dist/_frontend/assets/index-BBGLYdJn.css.gz +0 -0
- package/dist/_frontend/assets/{index-CNHFMp3w.js → index-BU6gYO7K.js} +4 -4
- package/dist/_frontend/assets/index-BU6gYO7K.js.br +0 -0
- package/dist/_frontend/assets/index-BU6gYO7K.js.gz +0 -0
- package/dist/_frontend/assets/index-DZOZ1xN3.js +933 -0
- package/dist/_frontend/assets/index-DZOZ1xN3.js.br +0 -0
- package/dist/_frontend/assets/index-DZOZ1xN3.js.gz +0 -0
- package/dist/_frontend/assets/index-DhA9jnhv.css +1 -0
- package/dist/_frontend/assets/index-DhA9jnhv.css.br +0 -0
- package/dist/_frontend/assets/index-DhA9jnhv.css.gz +0 -0
- package/dist/_frontend/assets/{javascript-CO_8uS79.js → javascript-BKY4Sujy.js} +1 -1
- package/dist/_frontend/assets/{jsonMode-D0kqu8c3.js → jsonMode-B_jTSLwe.js} +4 -4
- package/dist/_frontend/assets/jsonMode-B_jTSLwe.js.br +0 -0
- package/dist/_frontend/assets/jsonMode-B_jTSLwe.js.gz +0 -0
- package/dist/_frontend/assets/{liquid-CB807zJs.js → liquid-OVC8bSZr.js} +1 -1
- package/dist/_frontend/assets/liquid-OVC8bSZr.js.br +0 -0
- package/dist/_frontend/assets/liquid-OVC8bSZr.js.gz +0 -0
- package/dist/_frontend/assets/{lspLanguageFeatures-D0-0mkv4.js → lspLanguageFeatures-BpQc31SX.js} +1 -1
- package/dist/_frontend/assets/lspLanguageFeatures-BpQc31SX.js.br +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-BpQc31SX.js.gz +0 -0
- package/dist/_frontend/assets/{mdx-7_H2_m8y.js → mdx-Rt-sDg8a.js} +1 -1
- package/dist/_frontend/assets/mdx-Rt-sDg8a.js.br +0 -0
- package/dist/_frontend/assets/mdx-Rt-sDg8a.js.gz +0 -0
- package/dist/_frontend/assets/{python-DhB7kQ15.js → python-CLLuhWlP.js} +1 -1
- package/dist/_frontend/assets/python-CLLuhWlP.js.br +0 -0
- package/dist/_frontend/assets/python-CLLuhWlP.js.gz +0 -0
- package/dist/_frontend/assets/{razor-CDzQiIjH.js → razor-CTEZKBpz.js} +1 -1
- package/dist/_frontend/assets/razor-CTEZKBpz.js.br +0 -0
- package/dist/_frontend/assets/razor-CTEZKBpz.js.gz +0 -0
- package/dist/_frontend/assets/{tsMode-CVP7xaF5.js → tsMode-BsjOp9ss.js} +1 -1
- package/dist/_frontend/assets/tsMode-BsjOp9ss.js.br +0 -0
- package/dist/_frontend/assets/tsMode-BsjOp9ss.js.gz +0 -0
- package/dist/_frontend/assets/{typescript-BTAuo6jN.js → typescript-CpIJvyBH.js} +1 -1
- package/dist/_frontend/assets/typescript-CpIJvyBH.js.br +0 -0
- package/dist/_frontend/assets/typescript-CpIJvyBH.js.gz +0 -0
- package/dist/_frontend/assets/{workers-Dl5avODY.js → workers-C_uhAUan.js} +1 -1
- package/dist/_frontend/assets/workers-C_uhAUan.js.br +0 -0
- package/dist/_frontend/assets/workers-C_uhAUan.js.gz +0 -0
- package/dist/_frontend/assets/{xml-CKI7eM7V.js → xml-BxHi2HCJ.js} +1 -1
- package/dist/_frontend/assets/xml-BxHi2HCJ.js.br +0 -0
- package/dist/_frontend/assets/xml-BxHi2HCJ.js.gz +0 -0
- package/dist/_frontend/assets/{yaml-Czn9FR3r.js → yaml-DyyH_CDu.js} +1 -1
- package/dist/_frontend/assets/yaml-DyyH_CDu.js.br +0 -0
- package/dist/_frontend/assets/yaml-DyyH_CDu.js.gz +0 -0
- package/dist/_frontend/index.html +5 -2
- package/dist/controller-main.js +197 -118
- package/dist/controller-main.js.map +1 -1
- package/dist/main.js +10461 -8718
- package/dist/main.js.map +1 -1
- package/dist/postgres/migrations/20260907_000001_schedule_run_reason.js +15 -0
- package/dist/postgres/migrations/20260907_000001_schedule_run_reason.js.map +1 -0
- package/dist/sqlite/migrations/20260907_000001_schedule_run_reason.js +17 -0
- package/dist/sqlite/migrations/20260907_000001_schedule_run_reason.js.map +1 -0
- package/package.json +3 -4
- package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js +0 -1
- package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js.br +0 -0
- package/dist/_frontend/assets/AgentCodeSnippets-637HQUXD-C5c8zg9J.js.gz +0 -0
- package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js +0 -1
- package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js.br +0 -0
- package/dist/_frontend/assets/AgentMetricChart-4FYECRIN-BN07l9mr.js.gz +0 -0
- package/dist/_frontend/assets/AgentOverview-3FJ5EE6N-D1pX5Emq.js.br +0 -0
- package/dist/_frontend/assets/AgentOverview-3FJ5EE6N-D1pX5Emq.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js +0 -1
- package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js.br +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-VELWUYPR-S1LS04B9.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js +0 -1
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js.br +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-CUKETHWM-D4LvjUpF.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js +0 -1
- package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js.br +0 -0
- package/dist/_frontend/assets/AgentSessions-T7MOGOTZ-wppcDkIn.js.gz +0 -0
- package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js +0 -1
- package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js.br +0 -0
- package/dist/_frontend/assets/ConnectorSettings-ESZ2RSRG-DLxrylX3.js.gz +0 -0
- package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js +0 -2
- package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js.br +0 -0
- package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js.gz +0 -0
- package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js +0 -1
- package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js.br +0 -0
- package/dist/_frontend/assets/ModelSettings-LYW64IRR-BLLhCXsR.js.gz +0 -0
- package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js +0 -1
- package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js.br +0 -0
- package/dist/_frontend/assets/SandboxSettings-DF64LHYI-7AeygCju.js.gz +0 -0
- package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js +0 -1
- package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js.br +0 -0
- package/dist/_frontend/assets/SchedulesPage-WQU4H25F-BGlu6WXG.js.gz +0 -0
- package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js.br +0 -0
- package/dist/_frontend/assets/SettingsBuilder-LSXK2VN4-B0Y9JGuK.js.gz +0 -0
- package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js +0 -1
- package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js.br +0 -0
- package/dist/_frontend/assets/ShellRouteSync-B22IAV2W-leIgCXVi.js.gz +0 -0
- package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js +0 -2
- package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js.br +0 -0
- package/dist/_frontend/assets/SidebarLayout-XW6LXB7R-Cfmnvl3i.js.gz +0 -0
- package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js +0 -1
- package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js.br +0 -0
- package/dist/_frontend/assets/SkillSettings-64VXUO6J-CeuMawWX.js.gz +0 -0
- package/dist/_frontend/assets/TrueForgeUIWithRouter-3TSLV22Q-BiR4AwMi.js +0 -1
- package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js +0 -1
- package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js.br +0 -0
- package/dist/_frontend/assets/WidgetLayout-Q5P7PYSJ-D-NJInrA.js.gz +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-gAUkEAjv.js.br +0 -0
- package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js +0 -2
- package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js.br +0 -0
- package/dist/_frontend/assets/chunk-I3AL54MA--fCRbraS.js.gz +0 -0
- package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js +0 -1
- package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js.br +0 -0
- package/dist/_frontend/assets/chunk-SQGT43Z3-Di5-vYAQ.js.gz +0 -0
- package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js +0 -1
- package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js.br +0 -0
- package/dist/_frontend/assets/chunk-VUMGMGKZ-CUX2iOMe.js.gz +0 -0
- package/dist/_frontend/assets/cssMode-Bmk_AUwV.js +0 -1
- package/dist/_frontend/assets/cssMode-Bmk_AUwV.js.br +0 -0
- package/dist/_frontend/assets/cssMode-Bmk_AUwV.js.gz +0 -0
- package/dist/_frontend/assets/freemarker2-BqULNxdn.js.br +0 -0
- package/dist/_frontend/assets/freemarker2-BqULNxdn.js.gz +0 -0
- package/dist/_frontend/assets/handlebars-D-wN_MMv.js.br +0 -0
- package/dist/_frontend/assets/handlebars-D-wN_MMv.js.gz +0 -0
- package/dist/_frontend/assets/html-DX_2Eu_G.js.br +0 -0
- package/dist/_frontend/assets/html-DX_2Eu_G.js.gz +0 -0
- package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js +0 -1
- package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js.br +0 -0
- package/dist/_frontend/assets/htmlMode-CqQ0rpq1.js.gz +0 -0
- package/dist/_frontend/assets/index-CB2SckMT.css +0 -1
- package/dist/_frontend/assets/index-CB2SckMT.css.br +0 -0
- package/dist/_frontend/assets/index-CB2SckMT.css.gz +0 -0
- package/dist/_frontend/assets/index-CNHFMp3w.js.br +0 -0
- package/dist/_frontend/assets/index-CNHFMp3w.js.gz +0 -0
- package/dist/_frontend/assets/index-G4wOqi3O.js +0 -923
- package/dist/_frontend/assets/index-G4wOqi3O.js.br +0 -0
- package/dist/_frontend/assets/index-G4wOqi3O.js.gz +0 -0
- package/dist/_frontend/assets/index-MPbqVnOf.js.br +0 -0
- package/dist/_frontend/assets/index-MPbqVnOf.js.gz +0 -0
- package/dist/_frontend/assets/index-SN54UIUh.css.br +0 -0
- package/dist/_frontend/assets/index-SN54UIUh.css.gz +0 -0
- package/dist/_frontend/assets/jsonMode-D0kqu8c3.js.br +0 -0
- package/dist/_frontend/assets/jsonMode-D0kqu8c3.js.gz +0 -0
- package/dist/_frontend/assets/liquid-CB807zJs.js.br +0 -0
- package/dist/_frontend/assets/liquid-CB807zJs.js.gz +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-D0-0mkv4.js.br +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-D0-0mkv4.js.gz +0 -0
- package/dist/_frontend/assets/mdx-7_H2_m8y.js.br +0 -0
- package/dist/_frontend/assets/mdx-7_H2_m8y.js.gz +0 -0
- package/dist/_frontend/assets/python-DhB7kQ15.js.br +0 -0
- package/dist/_frontend/assets/python-DhB7kQ15.js.gz +0 -0
- package/dist/_frontend/assets/razor-CDzQiIjH.js.br +0 -0
- package/dist/_frontend/assets/razor-CDzQiIjH.js.gz +0 -0
- package/dist/_frontend/assets/tsMode-CVP7xaF5.js.br +0 -0
- package/dist/_frontend/assets/tsMode-CVP7xaF5.js.gz +0 -0
- package/dist/_frontend/assets/typescript-BTAuo6jN.js.br +0 -0
- package/dist/_frontend/assets/typescript-BTAuo6jN.js.gz +0 -0
- package/dist/_frontend/assets/workers-Dl5avODY.js.br +0 -0
- package/dist/_frontend/assets/workers-Dl5avODY.js.gz +0 -0
- package/dist/_frontend/assets/xml-CKI7eM7V.js.br +0 -0
- package/dist/_frontend/assets/xml-CKI7eM7V.js.gz +0 -0
- package/dist/_frontend/assets/yaml-Czn9FR3r.js.br +0 -0
- package/dist/_frontend/assets/yaml-Czn9FR3r.js.gz +0 -0
package/dist/controller-main.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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({
|
|
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
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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(
|
|
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,
|
|
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:
|
|
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
|
-
|
|
826
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
});
|