@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.
- package/dist/_frontend/assets/{AgentCodeSnippets-NZOFJE57-Bn94i1Ie.js → AgentCodeSnippets-637HQUXD-C5c8zg9J.js} +1 -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-JPU3MFQ2-pn-oatgo.js → AgentMetricChart-4FYECRIN-BN07l9mr.js} +1 -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-EEBHJC32-Bn4qidnv.js → AgentOverview-3FJ5EE6N-D1pX5Emq.js} +1 -1
- 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 +1 -0
- 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 +1 -0
- 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-3MPDZASK-Dp6vYfGN.js → AgentSessions-T7MOGOTZ-wppcDkIn.js} +1 -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 +1 -0
- 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/{DockLayout-LM4AFMFY-DoBwJ3-e.js → DockLayout-NLFNU6F2-BGJvqqVS.js} +1 -1
- package/dist/_frontend/assets/DrawerLayout-PR3SMKA6-C13frtIA.js +2 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +2 -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 +1 -0
- 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 +2 -0
- 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 +1 -0
- 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 +1 -0
- package/dist/_frontend/assets/{WidgetLayout-6QM45OQQ-Bp0tde9v.js → WidgetLayout-Q5P7PYSJ-D-NJInrA.js} +1 -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-BLb_tkPU.js → chunk-62JRHF6Z-gAUkEAjv.js} +1 -1
- package/dist/_frontend/assets/chunk-62JRHF6Z-gAUkEAjv.js.br +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-gAUkEAjv.js.gz +0 -0
- package/dist/_frontend/assets/{chunk-FJW36PD7-R_XSoO50.js → chunk-I3AL54MA--fCRbraS.js} +2 -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-WVE3F724-CL71bP7s.js → chunk-SQGT43Z3-Di5-vYAQ.js} +1 -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 +1 -0
- 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-CVefs5W-.js → cssMode-Bmk_AUwV.js} +1 -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-mt8l8QVE.js → freemarker2-BqULNxdn.js} +1 -1
- 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-C97jT8Zn.js → handlebars-D-wN_MMv.js} +1 -1
- 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-DKtvlaWU.js → html-DX_2Eu_G.js} +1 -1
- 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-BHsrcqlc.js → htmlMode-CqQ0rpq1.js} +1 -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-BW-oaxAt.js → index-CNHFMp3w.js} +3 -3
- 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-DVCxCjDg.js → index-G4wOqi3O.js} +237 -237
- 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 +18 -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-D8eVAzN5.css → index-SN54UIUh.css} +1 -1
- package/dist/_frontend/assets/index-SN54UIUh.css.br +0 -0
- package/dist/_frontend/assets/index-SN54UIUh.css.gz +0 -0
- package/dist/_frontend/assets/{javascript-Cs0N3w-s.js → javascript-CO_8uS79.js} +1 -1
- package/dist/_frontend/assets/{jsonMode-CqrfFSVA.js → jsonMode-D0kqu8c3.js} +1 -1
- 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-C11lKF6J.js → liquid-CB807zJs.js} +1 -1
- 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-DBZtnSMo.js → lspLanguageFeatures-D0-0mkv4.js} +1 -1
- 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-CCo4oKJJ.js → mdx-7_H2_m8y.js} +1 -1
- 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-627g_SSG.js → python-DhB7kQ15.js} +1 -1
- 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-BGDxoA7p.js → razor-CDzQiIjH.js} +1 -1
- 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-gPT7Bbjh.js → tsMode-CVP7xaF5.js} +1 -1
- 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-Cb0PzreF.js → typescript-BTAuo6jN.js} +1 -1
- 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-BAgwFgJ0.js → workers-Dl5avODY.js} +1 -1
- 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-BpvCCHF9.js → xml-CKI7eM7V.js} +1 -1
- 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-f3XKmHoH.js → yaml-Czn9FR3r.js} +1 -1
- package/dist/_frontend/assets/yaml-Czn9FR3r.js.br +0 -0
- package/dist/_frontend/assets/yaml-Czn9FR3r.js.gz +0 -0
- package/dist/_frontend/index.html +2 -2
- package/dist/controller-main.js +26 -14
- package/dist/controller-main.js.map +1 -1
- package/dist/main.js +581 -239
- package/dist/main.js.map +1 -1
- package/dist/postgres/migrations/20260831_000001_session_external_id.js.map +1 -1
- package/dist/postgres/migrations/20260902_000002_agent_external_id.js.map +1 -1
- package/dist/postgres/migrations/20260903_000002_created_by_subject.js +1 -1
- package/dist/postgres/migrations/20260903_000002_created_by_subject.js.map +1 -1
- package/dist/postgres/migrations/20260904_000001_schedule_agent_id.js.map +1 -1
- package/dist/postgres/migrations/20260904_000002_session_source.js +31 -0
- package/dist/postgres/migrations/20260904_000002_session_source.js.map +1 -0
- package/dist/postgres/migrations/20260904_000003_session_metadata_gin.js +24 -0
- package/dist/postgres/migrations/20260904_000003_session_metadata_gin.js.map +1 -0
- package/dist/sqlite/migrations/20260831_000001_session_external_id.js.map +1 -1
- package/dist/sqlite/migrations/20260902_000001_session_metadata.js.map +1 -1
- package/dist/sqlite/migrations/20260902_000002_agent_external_id.js.map +1 -1
- package/dist/sqlite/migrations/20260903_000001_drop_agent_metadata.js.map +1 -1
- package/dist/sqlite/migrations/20260903_000002_created_by_subject.js +1 -1
- package/dist/sqlite/migrations/20260903_000002_created_by_subject.js.map +1 -1
- package/dist/sqlite/migrations/20260904_000001_schedule_agent_id.js.map +1 -1
- package/dist/sqlite/migrations/20260904_000002_session_source.js +28 -0
- package/dist/sqlite/migrations/20260904_000002_session_source.js.map +1 -0
- package/package.json +18 -16
- package/dist/_frontend/assets/AgentCodeSnippets-NZOFJE57-Bn94i1Ie.js.br +0 -0
- package/dist/_frontend/assets/AgentCodeSnippets-NZOFJE57-Bn94i1Ie.js.gz +0 -0
- package/dist/_frontend/assets/AgentMetricChart-JPU3MFQ2-pn-oatgo.js.br +0 -0
- package/dist/_frontend/assets/AgentMetricChart-JPU3MFQ2-pn-oatgo.js.gz +0 -0
- package/dist/_frontend/assets/AgentOverview-EEBHJC32-Bn4qidnv.js.br +0 -0
- package/dist/_frontend/assets/AgentOverview-EEBHJC32-Bn4qidnv.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-26Z6IB3B-D_yCZz1m.js +0 -1
- package/dist/_frontend/assets/AgentSessionEventTimeline-26Z6IB3B-D_yCZz1m.js.br +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimeline-26Z6IB3B-D_yCZz1m.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-CGCU7WBK-JGwv6e5T.js +0 -1
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-CGCU7WBK-JGwv6e5T.js.br +0 -0
- package/dist/_frontend/assets/AgentSessionEventTimelineChart-CGCU7WBK-JGwv6e5T.js.gz +0 -0
- package/dist/_frontend/assets/AgentSessions-3MPDZASK-Dp6vYfGN.js.br +0 -0
- package/dist/_frontend/assets/AgentSessions-3MPDZASK-Dp6vYfGN.js.gz +0 -0
- package/dist/_frontend/assets/ConnectorSettings-MXFRWWR6-BEwXZbPM.js +0 -1
- package/dist/_frontend/assets/ConnectorSettings-MXFRWWR6-BEwXZbPM.js.br +0 -0
- package/dist/_frontend/assets/ConnectorSettings-MXFRWWR6-BEwXZbPM.js.gz +0 -0
- package/dist/_frontend/assets/DrawerLayout-JR3O6RRB-BZ9sffvm.js +0 -2
- package/dist/_frontend/assets/DrawerLayout-JR3O6RRB-BZ9sffvm.js.br +0 -0
- package/dist/_frontend/assets/DrawerLayout-JR3O6RRB-BZ9sffvm.js.gz +0 -0
- package/dist/_frontend/assets/ModelSettings-G7IFNC2Y-DxVYHG2m.js +0 -1
- package/dist/_frontend/assets/ModelSettings-G7IFNC2Y-DxVYHG2m.js.br +0 -0
- package/dist/_frontend/assets/ModelSettings-G7IFNC2Y-DxVYHG2m.js.gz +0 -0
- package/dist/_frontend/assets/SandboxSettings-NXAANMAX-DhC28qE6.js +0 -1
- package/dist/_frontend/assets/SandboxSettings-NXAANMAX-DhC28qE6.js.br +0 -0
- package/dist/_frontend/assets/SandboxSettings-NXAANMAX-DhC28qE6.js.gz +0 -0
- package/dist/_frontend/assets/SchedulesPage-KKLUDO6B-CWdrd7KY.js +0 -1
- package/dist/_frontend/assets/SchedulesPage-KKLUDO6B-CWdrd7KY.js.br +0 -0
- package/dist/_frontend/assets/SchedulesPage-KKLUDO6B-CWdrd7KY.js.gz +0 -0
- package/dist/_frontend/assets/SettingsBuilder-L34IQ56S-BQuxGH5w.js +0 -2
- package/dist/_frontend/assets/SettingsBuilder-L34IQ56S-BQuxGH5w.js.br +0 -0
- package/dist/_frontend/assets/SettingsBuilder-L34IQ56S-BQuxGH5w.js.gz +0 -0
- package/dist/_frontend/assets/ShellRouteSync-CEBETGEJ-C4NOyyck.js +0 -1
- package/dist/_frontend/assets/ShellRouteSync-CEBETGEJ-C4NOyyck.js.br +0 -0
- package/dist/_frontend/assets/ShellRouteSync-CEBETGEJ-C4NOyyck.js.gz +0 -0
- package/dist/_frontend/assets/SidebarLayout-A2HJPPHS-kusjDx4J.js +0 -2
- package/dist/_frontend/assets/SidebarLayout-A2HJPPHS-kusjDx4J.js.br +0 -0
- package/dist/_frontend/assets/SidebarLayout-A2HJPPHS-kusjDx4J.js.gz +0 -0
- package/dist/_frontend/assets/SkillSettings-FGGMSUNO-CjrGBX5J.js +0 -1
- package/dist/_frontend/assets/SkillSettings-FGGMSUNO-CjrGBX5J.js.br +0 -0
- package/dist/_frontend/assets/SkillSettings-FGGMSUNO-CjrGBX5J.js.gz +0 -0
- package/dist/_frontend/assets/TrueForgeUIWithRouter-MZVJWJMB-CZ8BOF1k.js +0 -1
- package/dist/_frontend/assets/WidgetLayout-6QM45OQQ-Bp0tde9v.js.br +0 -0
- package/dist/_frontend/assets/WidgetLayout-6QM45OQQ-Bp0tde9v.js.gz +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-BLb_tkPU.js.br +0 -0
- package/dist/_frontend/assets/chunk-62JRHF6Z-BLb_tkPU.js.gz +0 -0
- package/dist/_frontend/assets/chunk-DMMZSZTN-BBNhHida.js +0 -1
- package/dist/_frontend/assets/chunk-DMMZSZTN-BBNhHida.js.br +0 -0
- package/dist/_frontend/assets/chunk-DMMZSZTN-BBNhHida.js.gz +0 -0
- package/dist/_frontend/assets/chunk-FJW36PD7-R_XSoO50.js.br +0 -0
- package/dist/_frontend/assets/chunk-FJW36PD7-R_XSoO50.js.gz +0 -0
- package/dist/_frontend/assets/chunk-WVE3F724-CL71bP7s.js.br +0 -0
- package/dist/_frontend/assets/chunk-WVE3F724-CL71bP7s.js.gz +0 -0
- package/dist/_frontend/assets/cssMode-CVefs5W-.js.br +0 -0
- package/dist/_frontend/assets/cssMode-CVefs5W-.js.gz +0 -0
- package/dist/_frontend/assets/freemarker2-mt8l8QVE.js.br +0 -0
- package/dist/_frontend/assets/freemarker2-mt8l8QVE.js.gz +0 -0
- package/dist/_frontend/assets/handlebars-C97jT8Zn.js.br +0 -0
- package/dist/_frontend/assets/handlebars-C97jT8Zn.js.gz +0 -0
- package/dist/_frontend/assets/html-DKtvlaWU.js.br +0 -0
- package/dist/_frontend/assets/html-DKtvlaWU.js.gz +0 -0
- package/dist/_frontend/assets/htmlMode-BHsrcqlc.js.br +0 -0
- package/dist/_frontend/assets/htmlMode-BHsrcqlc.js.gz +0 -0
- package/dist/_frontend/assets/index-BW-oaxAt.js.br +0 -0
- package/dist/_frontend/assets/index-BW-oaxAt.js.gz +0 -0
- package/dist/_frontend/assets/index-D8eVAzN5.css.br +0 -0
- package/dist/_frontend/assets/index-D8eVAzN5.css.gz +0 -0
- package/dist/_frontend/assets/index-DVCxCjDg.js.br +0 -0
- package/dist/_frontend/assets/index-DVCxCjDg.js.gz +0 -0
- package/dist/_frontend/assets/index-DuKoX4ct.js +0 -18
- package/dist/_frontend/assets/index-DuKoX4ct.js.br +0 -0
- package/dist/_frontend/assets/index-DuKoX4ct.js.gz +0 -0
- package/dist/_frontend/assets/jsonMode-CqrfFSVA.js.br +0 -0
- package/dist/_frontend/assets/jsonMode-CqrfFSVA.js.gz +0 -0
- package/dist/_frontend/assets/liquid-C11lKF6J.js.br +0 -0
- package/dist/_frontend/assets/liquid-C11lKF6J.js.gz +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-DBZtnSMo.js.br +0 -0
- package/dist/_frontend/assets/lspLanguageFeatures-DBZtnSMo.js.gz +0 -0
- package/dist/_frontend/assets/mdx-CCo4oKJJ.js.br +0 -0
- package/dist/_frontend/assets/mdx-CCo4oKJJ.js.gz +0 -0
- package/dist/_frontend/assets/python-627g_SSG.js.br +0 -0
- package/dist/_frontend/assets/python-627g_SSG.js.gz +0 -0
- package/dist/_frontend/assets/razor-BGDxoA7p.js.br +0 -0
- package/dist/_frontend/assets/razor-BGDxoA7p.js.gz +0 -0
- package/dist/_frontend/assets/tsMode-gPT7Bbjh.js.br +0 -0
- package/dist/_frontend/assets/tsMode-gPT7Bbjh.js.gz +0 -0
- package/dist/_frontend/assets/typescript-Cb0PzreF.js.br +0 -0
- package/dist/_frontend/assets/typescript-Cb0PzreF.js.gz +0 -0
- package/dist/_frontend/assets/workers-BAgwFgJ0.js.br +0 -0
- package/dist/_frontend/assets/workers-BAgwFgJ0.js.gz +0 -0
- package/dist/_frontend/assets/xml-BpvCCHF9.js.br +0 -0
- package/dist/_frontend/assets/xml-BpvCCHF9.js.gz +0 -0
- package/dist/_frontend/assets/yaml-f3XKmHoH.js.br +0 -0
- package/dist/_frontend/assets/yaml-f3XKmHoH.js.gz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/postgres/migrations/20260831_000001_session_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional session `external_id`, unique within a tenant when set.\n * NULLs are excluded so sessions without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await db.schema.alterTable('session').addColumn('external_id', 'text').execute();\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_EXTERNAL_ID_UQ)}`.execute(db);\n await db.schema.alterTable('session').dropColumn('external_id').execute();\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/postgres/migrations/20260831_000001_session_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional session `external_id`, unique within a tenant when set.\n * NULLs are excluded so sessions without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await db.schema.alterTable('session').addColumn('external_id', 'text').execute();\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_EXTERNAL_ID_UQ)}`.execute(db);\n await db.schema.alterTable('session').dropColumn('external_id').execute();\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACC1B,IAAM,yBAAyB;;;ADMtC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM,GAAG,OAAO,WAAW,SAAS,EAAE,UAAU,eAAe,MAAM,EAAE,QAAQ;AAC/E,QAAM;AAAA,0BACkB,IAAI,IAAI,sBAAsB,CAAC;AAAA;AAAA;AAAA,IAGrD,QAAQ,EAAE;AACd;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM,2BAA2B,IAAI,IAAI,sBAAsB,CAAC,GAAG,QAAQ,EAAE;AAC7E,QAAM,GAAG,OAAO,WAAW,SAAS,EAAE,WAAW,aAAa,EAAE,QAAQ;AAC1E;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/postgres/migrations/20260902_000002_agent_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { AGENT_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional agent `external_id`, unique within a tenant when set.\n * NULLs are excluded so agents without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await db.schema.alterTable('agent').addColumn('external_id', 'text').execute();\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`DROP INDEX IF EXISTS ${sql.raw(AGENT_EXTERNAL_ID_UQ)}`.execute(db);\n await db.schema.alterTable('agent').dropColumn('external_id').execute();\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/postgres/migrations/20260902_000002_agent_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { AGENT_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional agent `external_id`, unique within a tenant when set.\n * NULLs are excluded so agents without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await db.schema.alterTable('agent').addColumn('external_id', 'text').execute();\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`DROP INDEX IF EXISTS ${sql.raw(AGENT_EXTERNAL_ID_UQ)}`.execute(db);\n await db.schema.alterTable('agent').dropColumn('external_id').execute();\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACa1B,IAAM,uBAAuB;;;ADNpC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM,GAAG,OAAO,WAAW,OAAO,EAAE,UAAU,eAAe,MAAM,EAAE,QAAQ;AAC7E,QAAM;AAAA,0BACkB,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA;AAAA,IAGnD,QAAQ,EAAE;AACd;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM,2BAA2B,IAAI,IAAI,oBAAoB,CAAC,GAAG,QAAQ,EAAE;AAC3E,QAAM,GAAG,OAAO,WAAW,OAAO,EAAE,WAAW,aAAa,EAAE,QAAQ;AACxE;","names":[]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { sql } from "kysely";
|
|
3
3
|
|
|
4
4
|
// src/db/indexes.ts
|
|
5
|
-
var AGENT_CREATED_BY_SUBJECT_ID_IDX = "agent_created_by_subject_id_idx";
|
|
6
5
|
var SESSION_CREATED_BY_SUBJECT_ID_IDX = "session_created_by_subject_id_idx";
|
|
6
|
+
var AGENT_CREATED_BY_SUBJECT_ID_IDX = "agent_created_by_subject_id_idx";
|
|
7
7
|
var SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = "schedule_created_by_subject_id_idx";
|
|
8
8
|
var SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = "schedule_run_created_by_subject_id_idx";
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/postgres/migrations/20260903_000002_created_by_subject.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport {\n AGENT_CREATED_BY_SUBJECT_ID_IDX,\n SCHEDULE_CREATED_BY_SUBJECT_ID_IDX,\n SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX,\n SESSION_CREATED_BY_SUBJECT_ID_IDX,\n} from '../../indexes';\n\n/**\n * Add `created_by_subject` jsonb on agent, session, schedule, and schedule_run.\n * Backfills session/schedule/schedule_run from created_by/triggered_by;\n * agent backfills best-effort from its first created session (fallback: trueforge-default).\n * Runs inside the Migrator's transaction — do not nest `db.transaction()`.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n ALTER TABLE session\n ADD COLUMN created_by_subject jsonb;\n UPDATE session\n SET created_by_subject = jsonb_build_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n );\n ALTER TABLE session\n ALTER COLUMN created_by_subject SET NOT NULL;\n ALTER TABLE session DROP COLUMN created_by;\n CREATE INDEX ${sql.raw(SESSION_CREATED_BY_SUBJECT_ID_IDX)}\n ON session (tenant_id, (created_by_subject->>'subject_id'));\n\n ALTER TABLE agent\n ADD COLUMN created_by_subject jsonb;\n UPDATE agent AS a\n SET created_by_subject = COALESCE(\n (\n SELECT s.created_by_subject\n FROM session AS s\n WHERE s.tenant_id = a.tenant_id\n AND (s.agent_id = a.id OR (s.agent_id IS NULL AND s.agent_name = a.name))\n ORDER BY s.created_at ASC\n LIMIT 1\n ),\n '{\"subject_id\":\"trueforge-default\",\"subject_type\":\"user\",\"subject_display_name\":\"trueforge-default\"}'::jsonb\n );\n ALTER TABLE agent\n ALTER COLUMN created_by_subject SET NOT NULL;\n CREATE INDEX ${sql.raw(AGENT_CREATED_BY_SUBJECT_ID_IDX)}\n ON agent (tenant_id, (created_by_subject->>'subject_id'));\n\n ALTER TABLE schedule\n ADD COLUMN created_by_subject jsonb;\n UPDATE schedule\n SET created_by_subject = jsonb_build_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n );\n ALTER TABLE schedule\n ALTER COLUMN created_by_subject SET NOT NULL;\n ALTER TABLE schedule DROP COLUMN created_by;\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, (created_by_subject->>'subject_id'));\n\n ALTER TABLE schedule_run\n ADD COLUMN created_by_subject jsonb;\n UPDATE schedule_run\n SET created_by_subject = jsonb_build_object(\n 'subject_id', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END\n );\n ALTER TABLE schedule_run\n ALTER COLUMN created_by_subject SET NOT NULL;\n ALTER TABLE schedule_run DROP COLUMN triggered_by;\n CREATE INDEX ${sql.raw(SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule_run (tenant_id, (created_by_subject->>'subject_id'));\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n DROP INDEX IF EXISTS ${sql.raw(SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE schedule_run\n ADD COLUMN triggered_by text NOT NULL DEFAULT '';\n UPDATE schedule_run\n SET triggered_by = COALESCE(created_by_subject->>'subject_id', '');\n ALTER TABLE schedule_run DROP COLUMN created_by_subject;\n\n DROP INDEX IF EXISTS ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE schedule\n ADD COLUMN created_by text NOT NULL DEFAULT '';\n UPDATE schedule\n SET created_by = COALESCE(created_by_subject->>'subject_id', '');\n ALTER TABLE schedule DROP COLUMN created_by_subject;\n\n DROP INDEX IF EXISTS ${sql.raw(AGENT_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE agent DROP COLUMN IF EXISTS created_by_subject;\n\n DROP INDEX IF EXISTS ${sql.raw(SESSION_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE session\n ADD COLUMN created_by text NOT NULL DEFAULT '';\n UPDATE session\n SET created_by = COALESCE(created_by_subject->>'subject_id', '');\n ALTER TABLE session DROP COLUMN created_by_subject;\n `.execute(db);\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/postgres/migrations/20260903_000002_created_by_subject.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport {\n AGENT_CREATED_BY_SUBJECT_ID_IDX,\n SCHEDULE_CREATED_BY_SUBJECT_ID_IDX,\n SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX,\n SESSION_CREATED_BY_SUBJECT_ID_IDX,\n} from '../../indexes';\n\n/**\n * Add `created_by_subject` jsonb on agent, session, schedule, and schedule_run.\n * Backfills session/schedule/schedule_run from created_by/triggered_by;\n * agent backfills best-effort from its first created session (fallback: trueforge-default).\n * Runs inside the Migrator's transaction — do not nest `db.transaction()`.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n ALTER TABLE session\n ADD COLUMN created_by_subject jsonb;\n UPDATE session\n SET created_by_subject = jsonb_build_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n );\n ALTER TABLE session\n ALTER COLUMN created_by_subject SET NOT NULL;\n ALTER TABLE session DROP COLUMN created_by;\n CREATE INDEX ${sql.raw(SESSION_CREATED_BY_SUBJECT_ID_IDX)}\n ON session (tenant_id, (created_by_subject->>'subject_id'));\n\n ALTER TABLE agent\n ADD COLUMN created_by_subject jsonb;\n UPDATE agent AS a\n SET created_by_subject = COALESCE(\n (\n SELECT s.created_by_subject\n FROM session AS s\n WHERE s.tenant_id = a.tenant_id\n AND (s.agent_id = a.id OR (s.agent_id IS NULL AND s.agent_name = a.name))\n ORDER BY s.created_at ASC\n LIMIT 1\n ),\n '{\"subject_id\":\"trueforge-default\",\"subject_type\":\"user\",\"subject_display_name\":\"trueforge-default\"}'::jsonb\n );\n ALTER TABLE agent\n ALTER COLUMN created_by_subject SET NOT NULL;\n CREATE INDEX ${sql.raw(AGENT_CREATED_BY_SUBJECT_ID_IDX)}\n ON agent (tenant_id, (created_by_subject->>'subject_id'));\n\n ALTER TABLE schedule\n ADD COLUMN created_by_subject jsonb;\n UPDATE schedule\n SET created_by_subject = jsonb_build_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n );\n ALTER TABLE schedule\n ALTER COLUMN created_by_subject SET NOT NULL;\n ALTER TABLE schedule DROP COLUMN created_by;\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, (created_by_subject->>'subject_id'));\n\n ALTER TABLE schedule_run\n ADD COLUMN created_by_subject jsonb;\n UPDATE schedule_run\n SET created_by_subject = jsonb_build_object(\n 'subject_id', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END\n );\n ALTER TABLE schedule_run\n ALTER COLUMN created_by_subject SET NOT NULL;\n ALTER TABLE schedule_run DROP COLUMN triggered_by;\n CREATE INDEX ${sql.raw(SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule_run (tenant_id, (created_by_subject->>'subject_id'));\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n DROP INDEX IF EXISTS ${sql.raw(SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE schedule_run\n ADD COLUMN triggered_by text NOT NULL DEFAULT '';\n UPDATE schedule_run\n SET triggered_by = COALESCE(created_by_subject->>'subject_id', '');\n ALTER TABLE schedule_run DROP COLUMN created_by_subject;\n\n DROP INDEX IF EXISTS ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE schedule\n ADD COLUMN created_by text NOT NULL DEFAULT '';\n UPDATE schedule\n SET created_by = COALESCE(created_by_subject->>'subject_id', '');\n ALTER TABLE schedule DROP COLUMN created_by_subject;\n\n DROP INDEX IF EXISTS ${sql.raw(AGENT_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE agent DROP COLUMN IF EXISTS created_by_subject;\n\n DROP INDEX IF EXISTS ${sql.raw(SESSION_CREATED_BY_SUBJECT_ID_IDX)};\n ALTER TABLE session\n ADD COLUMN created_by text NOT NULL DEFAULT '';\n UPDATE session\n SET created_by = COALESCE(created_by_subject->>'subject_id', '');\n ALTER TABLE session DROP COLUMN created_by_subject;\n `.execute(db);\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACI1B,IAAM,oCAAoC;AAe1C,IAAM,kCAAkC;AAGxC,IAAM,qCAAqC;AAM3C,IAAM,yCAAyC;;;ADdtD,eAAsB,GAAG,IAAoC;AAC3D,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAcW,IAAI,IAAI,iCAAiC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAmB1C,IAAI,IAAI,+BAA+B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAcxC,IAAI,IAAI,kCAAkC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAc3C,IAAI,IAAI,sCAAsC,CAAC;AAAA;AAAA,IAE9D,QAAQ,EAAE;AACd;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM;AAAA;AAAA;AAAA,2BAGmB,IAAI,IAAI,sCAAsC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAO/C,IAAI,IAAI,kCAAkC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAO3C,IAAI,IAAI,+BAA+B,CAAC;AAAA;AAAA;AAAA,2BAGxC,IAAI,IAAI,iCAAiC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMjE,QAAQ,EAAE;AACd;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/postgres/migrations/20260904_000001_schedule_agent_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SCHEDULE_AGENT_ID_IDX } from '../../indexes';\n\n/**\n * Add `agent_id` on schedule (stable ULID binding). Backfills from `agent` via\n * `(tenant_id, agent_name)`, then drops the name FK in favor of `agent(id)`.\n * Index mirrors `session_agent_id_idx` for per-agent schedule lists.\n * Runs inside the Migrator's transaction — do not nest `db.transaction()`.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n ALTER TABLE schedule\n ADD COLUMN agent_id text;\n UPDATE schedule AS s\n SET agent_id = a.id\n FROM agent AS a\n WHERE s.tenant_id = a.tenant_id\n AND s.agent_name = a.name;\n ALTER TABLE schedule\n ALTER COLUMN agent_id SET NOT NULL;\n ALTER TABLE schedule\n DROP CONSTRAINT schedule_agent_name_fk;\n ALTER TABLE schedule\n ADD CONSTRAINT schedule_agent_id_fk\n FOREIGN KEY (agent_id) REFERENCES agent (id) ON DELETE CASCADE;\n CREATE INDEX ${sql.raw(SCHEDULE_AGENT_ID_IDX)}\n ON schedule (tenant_id, agent_id);\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n DROP INDEX IF EXISTS ${sql.raw(SCHEDULE_AGENT_ID_IDX)};\n ALTER TABLE schedule\n DROP CONSTRAINT IF EXISTS schedule_agent_id_fk;\n ALTER TABLE schedule\n ADD CONSTRAINT schedule_agent_name_fk\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE;\n ALTER TABLE schedule\n DROP COLUMN agent_id;\n `.execute(db);\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/postgres/migrations/20260904_000001_schedule_agent_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SCHEDULE_AGENT_ID_IDX } from '../../indexes';\n\n/**\n * Add `agent_id` on schedule (stable ULID binding). Backfills from `agent` via\n * `(tenant_id, agent_name)`, then drops the name FK in favor of `agent(id)`.\n * Index mirrors `session_agent_id_idx` for per-agent schedule lists.\n * Runs inside the Migrator's transaction — do not nest `db.transaction()`.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n ALTER TABLE schedule\n ADD COLUMN agent_id text;\n UPDATE schedule AS s\n SET agent_id = a.id\n FROM agent AS a\n WHERE s.tenant_id = a.tenant_id\n AND s.agent_name = a.name;\n ALTER TABLE schedule\n ALTER COLUMN agent_id SET NOT NULL;\n ALTER TABLE schedule\n DROP CONSTRAINT schedule_agent_name_fk;\n ALTER TABLE schedule\n ADD CONSTRAINT schedule_agent_id_fk\n FOREIGN KEY (agent_id) REFERENCES agent (id) ON DELETE CASCADE;\n CREATE INDEX ${sql.raw(SCHEDULE_AGENT_ID_IDX)}\n ON schedule (tenant_id, agent_id);\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n DROP INDEX IF EXISTS ${sql.raw(SCHEDULE_AGENT_ID_IDX)};\n ALTER TABLE schedule\n DROP CONSTRAINT IF EXISTS schedule_agent_id_fk;\n ALTER TABLE schedule\n ADD CONSTRAINT schedule_agent_name_fk\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE;\n ALTER TABLE schedule\n DROP COLUMN agent_id;\n `.execute(db);\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACyB1B,IAAM,wBAAwB;;;ADhBrC,eAAsB,GAAG,IAAoC;AAC3D,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAiBW,IAAI,IAAI,qBAAqB,CAAC;AAAA;AAAA,IAE7C,QAAQ,EAAE;AACd;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM;AAAA;AAAA;AAAA,2BAGmB,IAAI,IAAI,qBAAqB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQrD,QAAQ,EAAE;AACd;","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// src/db/postgres/migrations/20260904_000002_session_source.ts
|
|
2
|
+
import { sql } from "kysely";
|
|
3
|
+
|
|
4
|
+
// src/db/indexes.ts
|
|
5
|
+
var SESSION_SOURCE_IDX = "session_source_idx";
|
|
6
|
+
|
|
7
|
+
// src/db/postgres/migrations/20260904_000002_session_source.ts
|
|
8
|
+
async function up(db) {
|
|
9
|
+
await sql`
|
|
10
|
+
SET LOCAL lock_timeout = '5s';
|
|
11
|
+
|
|
12
|
+
ALTER TABLE session
|
|
13
|
+
ADD COLUMN source jsonb;
|
|
14
|
+
CREATE INDEX ${sql.raw(SESSION_SOURCE_IDX)}
|
|
15
|
+
ON session (tenant_id, (source->>'type'), (source->>'id'))
|
|
16
|
+
WHERE source IS NOT NULL;
|
|
17
|
+
`.execute(db);
|
|
18
|
+
}
|
|
19
|
+
async function down(db) {
|
|
20
|
+
await sql`
|
|
21
|
+
SET LOCAL lock_timeout = '5s';
|
|
22
|
+
|
|
23
|
+
DROP INDEX IF EXISTS ${sql.raw(SESSION_SOURCE_IDX)};
|
|
24
|
+
ALTER TABLE session DROP COLUMN IF EXISTS source;
|
|
25
|
+
`.execute(db);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
down,
|
|
29
|
+
up
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=20260904_000002_session_source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/db/postgres/migrations/20260904_000002_session_source.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_SOURCE_IDX } from '../../indexes';\n\n/**\n * Add nullable JSONB `source` on session (schedule provenance).\n * Expression index for list filters; no denormalized scalar filter columns.\n * Runs inside the Migrator's transaction — do not nest `db.transaction()`.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n ALTER TABLE session\n ADD COLUMN source jsonb;\n CREATE INDEX ${sql.raw(SESSION_SOURCE_IDX)}\n ON session (tenant_id, (source->>'type'), (source->>'id'))\n WHERE source IS NOT NULL;\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`\n SET LOCAL lock_timeout = '5s';\n\n DROP INDEX IF EXISTS ${sql.raw(SESSION_SOURCE_IDX)};\n ALTER TABLE session DROP COLUMN IF EXISTS source;\n `.execute(db);\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACU1B,IAAM,qBAAqB;;;ADFlC,eAAsB,GAAG,IAAoC;AAC3D,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKW,IAAI,IAAI,kBAAkB,CAAC;AAAA;AAAA;AAAA,IAG1C,QAAQ,EAAE;AACd;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM;AAAA;AAAA;AAAA,2BAGmB,IAAI,IAAI,kBAAkB,CAAC;AAAA;AAAA,IAElD,QAAQ,EAAE;AACd;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/db/postgres/migrations/20260904_000003_session_metadata_gin.ts
|
|
2
|
+
import { sql } from "kysely";
|
|
3
|
+
|
|
4
|
+
// src/db/indexes.ts
|
|
5
|
+
var SESSION_METADATA_GIN = "session_metadata_gin";
|
|
6
|
+
|
|
7
|
+
// src/db/postgres/migrations/20260904_000003_session_metadata_gin.ts
|
|
8
|
+
async function up(db) {
|
|
9
|
+
await sql`SET LOCAL lock_timeout = '5s'`.execute(db);
|
|
10
|
+
await sql`
|
|
11
|
+
CREATE INDEX ${sql.raw(SESSION_METADATA_GIN)}
|
|
12
|
+
ON session
|
|
13
|
+
USING GIN (metadata jsonb_path_ops)
|
|
14
|
+
`.execute(db);
|
|
15
|
+
}
|
|
16
|
+
async function down(db) {
|
|
17
|
+
await sql`SET LOCAL lock_timeout = '5s'`.execute(db);
|
|
18
|
+
await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_METADATA_GIN)}`.execute(db);
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
down,
|
|
22
|
+
up
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=20260904_000003_session_metadata_gin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/db/postgres/migrations/20260904_000003_session_metadata_gin.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_METADATA_GIN } from '../../indexes';\n\n/** GIN index for list-sessions metadata containment (`metadata @> …`). */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`\n CREATE INDEX ${sql.raw(SESSION_METADATA_GIN)}\n ON session\n USING GIN (metadata jsonb_path_ops)\n `.execute(db);\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_METADATA_GIN)}`.execute(db);\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACgB1B,IAAM,uBAAuB;;;ADZpC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM;AAAA,mBACW,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA;AAAA,IAG5C,QAAQ,EAAE;AACd;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM,2BAA2B,IAAI,IAAI,oBAAoB,CAAC,GAAG,QAAQ,EAAE;AAC7E;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260831_000001_session_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\nimport { SESSION_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional session `external_id`, unique within a tenant when set.\n * NULLs are excluded so sessions without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`ALTER TABLE session ADD COLUMN external_id TEXT`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_EXTERNAL_ID_UQ)}`.execute(trx);\n await sql`ALTER TABLE session DROP COLUMN external_id`.execute(trx);\n });\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260831_000001_session_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\nimport { SESSION_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional session `external_id`, unique within a tenant when set.\n * NULLs are excluded so sessions without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`ALTER TABLE session ADD COLUMN external_id TEXT`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_EXTERNAL_ID_UQ)}`.execute(trx);\n await sql`ALTER TABLE session DROP COLUMN external_id`.execute(trx);\n });\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAsB,WAAW;;;ACC1B,IAAM,yBAAyB;;;ADMtC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,UAAM,qDAAqD,QAAQ,GAAG;AACtE,UAAM;AAAA,4BACkB,IAAI,IAAI,sBAAsB,CAAC;AAAA;AAAA;AAAA,MAGrD,QAAQ,GAAG;AAAA,EACf,CAAC;AACH;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,UAAM,2BAA2B,IAAI,IAAI,sBAAsB,CAAC,GAAG,QAAQ,GAAG;AAC9E,UAAM,iDAAiD,QAAQ,GAAG;AAAA,EACpE,CAAC;AACH;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260902_000001_session_metadata.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Caller-owned session metadata. Rebuilds `session` because ADD COLUMN cannot\n * take DEFAULT (jsonb('{}')) (expression default). Keeps `custom` unchanged.\n * DROP TABLE session needs FKs off; PRAGMA foreign_keys is a no-op inside a txn.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE session_new (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by TEXT NOT NULL DEFAULT '',\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO session_new (\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n jsonb('{}'),\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_new RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx\n ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx\n ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE session_old (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by TEXT NOT NULL DEFAULT '',\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO session_old (\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_old RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx\n ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx\n ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260902_000001_session_metadata.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Caller-owned session metadata. Rebuilds `session` because ADD COLUMN cannot\n * take DEFAULT (jsonb('{}')) (expression default). Keeps `custom` unchanged.\n * DROP TABLE session needs FKs off; PRAGMA foreign_keys is a no-op inside a txn.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE session_new (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by TEXT NOT NULL DEFAULT '',\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO session_new (\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n jsonb('{}'),\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_new RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx\n ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx\n ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE session_old (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by TEXT NOT NULL DEFAULT '',\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO session_old (\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_old RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx\n ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx\n ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACC1B,IAAM,yBAAyB;;;ADOtC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAuBJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAmCJ,QAAQ,GAAG;AAEb,YAAM,wBAAwB,QAAQ,GAAG;AACzC,YAAM,+CAA+C,QAAQ,GAAG;AAChE,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA,8BACkB,IAAI,IAAI,sBAAsB,CAAC;AAAA;AAAA;AAAA,QAGrD,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAsBJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAiCJ,QAAQ,GAAG;AAEb,YAAM,wBAAwB,QAAQ,GAAG;AACzC,YAAM,+CAA+C,QAAQ,GAAG;AAChE,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA,8BACkB,IAAI,IAAI,sBAAsB,CAAC;AAAA;AAAA;AAAA,QAGrD,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260902_000002_agent_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\nimport { AGENT_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional agent `external_id`, unique within a tenant when set.\n * NULLs are excluded so agents without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`ALTER TABLE agent ADD COLUMN external_id TEXT`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(AGENT_EXTERNAL_ID_UQ)}`.execute(trx);\n await sql`ALTER TABLE agent DROP COLUMN external_id`.execute(trx);\n });\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260902_000002_agent_external_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\nimport { AGENT_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Optional agent `external_id`, unique within a tenant when set.\n * NULLs are excluded so agents without an external id do not collide.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`ALTER TABLE agent ADD COLUMN external_id TEXT`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(AGENT_EXTERNAL_ID_UQ)}`.execute(trx);\n await sql`ALTER TABLE agent DROP COLUMN external_id`.execute(trx);\n });\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAsB,WAAW;;;ACa1B,IAAM,uBAAuB;;;ADNpC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,UAAM,mDAAmD,QAAQ,GAAG;AACpE,UAAM;AAAA,4BACkB,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA;AAAA,MAGnD,QAAQ,GAAG;AAAA,EACf,CAAC;AACH;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,UAAM,2BAA2B,IAAI,IAAI,oBAAoB,CAAC,GAAG,QAAQ,GAAG;AAC5E,UAAM,+CAA+C,QAAQ,GAAG;AAAA,EAClE,CAAC;AACH;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260903_000001_drop_agent_metadata.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\nimport { AGENT_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Drop agent.metadata. Rebuild: ADD/DROP COLUMN cannot take DEFAULT (jsonb(...)) / STRICT drop.\n * Keeps external_id + partial unique index from 20260902_000002.\n * DROP TABLE agent needs FKs off (`schedule` REFERENCES it).\n * PRAGMA foreign_keys is a no-op inside a txn.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE agent_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO agent_new (\n id,\n tenant_id,\n name,\n manifest,\n external_id,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n name,\n manifest,\n external_id,\n created_at,\n updated_at\n FROM agent\n `.execute(trx);\n\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_new RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(AGENT_EXTERNAL_ID_UQ)}`.execute(trx);\n await sql`\n CREATE TABLE agent_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO agent_old (\n id,\n tenant_id,\n name,\n manifest,\n metadata,\n external_id,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n name,\n manifest,\n jsonb('{}'),\n external_id,\n created_at,\n updated_at\n FROM agent\n `.execute(trx);\n\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_old RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260903_000001_drop_agent_metadata.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\nimport { AGENT_EXTERNAL_ID_UQ } from '../../indexes';\n\n/**\n * Drop agent.metadata. Rebuild: ADD/DROP COLUMN cannot take DEFAULT (jsonb(...)) / STRICT drop.\n * Keeps external_id + partial unique index from 20260902_000002.\n * DROP TABLE agent needs FKs off (`schedule` REFERENCES it).\n * PRAGMA foreign_keys is a no-op inside a txn.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE agent_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO agent_new (\n id,\n tenant_id,\n name,\n manifest,\n external_id,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n name,\n manifest,\n external_id,\n created_at,\n updated_at\n FROM agent\n `.execute(trx);\n\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_new RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(AGENT_EXTERNAL_ID_UQ)}`.execute(trx);\n await sql`\n CREATE TABLE agent_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO agent_old (\n id,\n tenant_id,\n name,\n manifest,\n metadata,\n external_id,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n name,\n manifest,\n jsonb('{}'),\n external_id,\n created_at,\n updated_at\n FROM agent\n `.execute(trx);\n\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_old RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAsB,WAAW;;;ACa1B,IAAM,uBAAuB;;;ADJpC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAmBJ,QAAQ,GAAG;AAEb,YAAM,sBAAsB,QAAQ,GAAG;AACvC,YAAM,2CAA2C,QAAQ,GAAG;AAC5D,YAAM;AAAA,8BACkB,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA;AAAA,QAGnD,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM,2BAA2B,IAAI,IAAI,oBAAoB,CAAC,GAAG,QAAQ,GAAG;AAC5E,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAaJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAqBJ,QAAQ,GAAG;AAEb,YAAM,sBAAsB,QAAQ,GAAG;AACvC,YAAM,2CAA2C,QAAQ,GAAG;AAC5D,YAAM;AAAA,8BACkB,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA;AAAA,QAGnD,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;","names":[]}
|
|
@@ -3,9 +3,9 @@ import { sql } from "kysely";
|
|
|
3
3
|
|
|
4
4
|
// src/db/indexes.ts
|
|
5
5
|
var SESSION_EXTERNAL_ID_UQ = "session_external_id_uq";
|
|
6
|
+
var SESSION_CREATED_BY_SUBJECT_ID_IDX = "session_created_by_subject_id_idx";
|
|
6
7
|
var AGENT_EXTERNAL_ID_UQ = "agent_external_id_uq";
|
|
7
8
|
var AGENT_CREATED_BY_SUBJECT_ID_IDX = "agent_created_by_subject_id_idx";
|
|
8
|
-
var SESSION_CREATED_BY_SUBJECT_ID_IDX = "session_created_by_subject_id_idx";
|
|
9
9
|
var SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = "schedule_created_by_subject_id_idx";
|
|
10
10
|
var SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = "schedule_run_created_by_subject_id_idx";
|
|
11
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260903_000002_created_by_subject.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport {\n AGENT_CREATED_BY_SUBJECT_ID_IDX,\n AGENT_EXTERNAL_ID_UQ,\n SCHEDULE_CREATED_BY_SUBJECT_ID_IDX,\n SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX,\n SESSION_CREATED_BY_SUBJECT_ID_IDX,\n SESSION_EXTERNAL_ID_UQ,\n} from '../../indexes';\n\n/**\n * Add `created_by_subject` on agent, session, schedule, and schedule_run.\n * STRICT rebuilds (cannot ADD NOT NULL with expression default / DROP DEFAULT).\n * Backfills session/schedule/schedule_run from created_by/triggered_by;\n * agent backfills best-effort from its first created session (fallback: trueforge-default).\n * Agent has no metadata (dropped in 20260903_000001). FKs off for agent/schedule swaps.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE session_new (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by_subject BLOB NOT NULL,\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO session_new (\n tenant_id,\n session_id,\n created_by_subject,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n jsonb(json_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n )),\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_new RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx\n ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx\n ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SESSION_CREATED_BY_SUBJECT_ID_IDX)}\n ON session (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n\n await sql`\n CREATE TABLE agent_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n external_id TEXT,\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO agent_new (\n id, tenant_id, name, manifest, external_id, created_by_subject, created_at, updated_at\n )\n SELECT\n a.id,\n a.tenant_id,\n a.name,\n a.manifest,\n a.external_id,\n COALESCE(\n (\n SELECT s.created_by_subject\n FROM session AS s\n WHERE s.tenant_id = a.tenant_id\n AND (s.agent_id = a.id OR (s.agent_id IS NULL AND s.agent_name = a.name))\n ORDER BY s.created_at ASC\n LIMIT 1\n ),\n jsonb('{\"subject_id\":\"trueforge-default\",\"subject_type\":\"user\",\"subject_display_name\":\"trueforge-default\"}')\n ),\n a.created_at,\n a.updated_at\n FROM agent AS a\n `.execute(trx);\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_new RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(AGENT_CREATED_BY_SUBJECT_ID_IDX)}\n ON agent (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n\n await sql`\n CREATE TABLE schedule_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_new (\n id, tenant_id, agent_name, name, manifest, status, created_by_subject, created_at, updated_at\n )\n SELECT\n id,\n tenant_id,\n agent_name,\n name,\n manifest,\n status,\n jsonb(json_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n )),\n created_at,\n updated_at\n FROM schedule\n `.execute(trx);\n\n await sql`\n CREATE TABLE schedule_run_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n schedule_id TEXT NOT NULL REFERENCES schedule_new (id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n scheduled_for TEXT NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n triggered_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_run_new (\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n created_by_subject,\n triggered_at,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n jsonb(json_object(\n 'subject_id', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END\n )),\n triggered_at,\n created_at,\n updated_at\n FROM schedule_run\n `.execute(trx);\n\n await sql`DROP TABLE schedule_run`.execute(trx);\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_new RENAME TO schedule`.execute(trx);\n await sql`ALTER TABLE schedule_run_new RENAME TO schedule_run`.execute(trx);\n\n await sql`\n CREATE INDEX schedule_agent_idx\n ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq\n ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_name_idx\n ON schedule_run (tenant_id, schedule_id, name)\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_scheduled_for_idx\n ON schedule_run (scheduled_for)\n WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_pending_uq\n ON schedule_run (schedule_id)\n WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_list_idx\n ON schedule_run (schedule_id, scheduled_for DESC)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule_run (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE schedule_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_old (\n id, tenant_id, agent_name, name, manifest, status, created_by, created_at, updated_at\n )\n SELECT\n id,\n tenant_id,\n agent_name,\n name,\n manifest,\n status,\n COALESCE(json_extract(created_by_subject, '$.subject_id'), ''),\n created_at,\n updated_at\n FROM schedule\n `.execute(trx);\n\n await sql`\n CREATE TABLE schedule_run_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n schedule_id TEXT NOT NULL REFERENCES schedule_old (id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n scheduled_for TEXT NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n triggered_by TEXT NOT NULL,\n triggered_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_run_old (\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n triggered_by,\n triggered_at,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n COALESCE(json_extract(created_by_subject, '$.subject_id'), ''),\n triggered_at,\n created_at,\n updated_at\n FROM schedule_run\n `.execute(trx);\n\n await sql`DROP TABLE schedule_run`.execute(trx);\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_old RENAME TO schedule`.execute(trx);\n await sql`ALTER TABLE schedule_run_old RENAME TO schedule_run`.execute(trx);\n await sql`\n CREATE INDEX schedule_agent_idx ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_name_idx ON schedule_run (tenant_id, schedule_id, name)\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_scheduled_for_idx\n ON schedule_run (scheduled_for) WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_pending_uq\n ON schedule_run (schedule_id) WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_list_idx ON schedule_run (schedule_id, scheduled_for DESC)\n `.execute(trx);\n\n await sql`\n CREATE TABLE agent_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO agent_old (id, tenant_id, name, manifest, external_id, created_at, updated_at)\n SELECT id, tenant_id, name, manifest, external_id, created_at, updated_at\n FROM agent\n `.execute(trx);\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_old RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id) WHERE external_id IS NOT NULL\n `.execute(trx);\n\n await sql`\n CREATE TABLE session_old (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by TEXT NOT NULL DEFAULT '',\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO session_old (\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n COALESCE(json_extract(created_by_subject, '$.subject_id'), ''),\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_old RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id) WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at) WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id) WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260903_000002_created_by_subject.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport {\n AGENT_CREATED_BY_SUBJECT_ID_IDX,\n AGENT_EXTERNAL_ID_UQ,\n SCHEDULE_CREATED_BY_SUBJECT_ID_IDX,\n SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX,\n SESSION_CREATED_BY_SUBJECT_ID_IDX,\n SESSION_EXTERNAL_ID_UQ,\n} from '../../indexes';\n\n/**\n * Add `created_by_subject` on agent, session, schedule, and schedule_run.\n * STRICT rebuilds (cannot ADD NOT NULL with expression default / DROP DEFAULT).\n * Backfills session/schedule/schedule_run from created_by/triggered_by;\n * agent backfills best-effort from its first created session (fallback: trueforge-default).\n * Agent has no metadata (dropped in 20260903_000001). FKs off for agent/schedule swaps.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE session_new (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by_subject BLOB NOT NULL,\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO session_new (\n tenant_id,\n session_id,\n created_by_subject,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n jsonb(json_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n )),\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_new RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx\n ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx\n ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at)\n WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SESSION_CREATED_BY_SUBJECT_ID_IDX)}\n ON session (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n\n await sql`\n CREATE TABLE agent_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n external_id TEXT,\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO agent_new (\n id, tenant_id, name, manifest, external_id, created_by_subject, created_at, updated_at\n )\n SELECT\n a.id,\n a.tenant_id,\n a.name,\n a.manifest,\n a.external_id,\n COALESCE(\n (\n SELECT s.created_by_subject\n FROM session AS s\n WHERE s.tenant_id = a.tenant_id\n AND (s.agent_id = a.id OR (s.agent_id IS NULL AND s.agent_name = a.name))\n ORDER BY s.created_at ASC\n LIMIT 1\n ),\n jsonb('{\"subject_id\":\"trueforge-default\",\"subject_type\":\"user\",\"subject_display_name\":\"trueforge-default\"}')\n ),\n a.created_at,\n a.updated_at\n FROM agent AS a\n `.execute(trx);\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_new RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id)\n WHERE external_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(AGENT_CREATED_BY_SUBJECT_ID_IDX)}\n ON agent (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n\n await sql`\n CREATE TABLE schedule_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_new (\n id, tenant_id, agent_name, name, manifest, status, created_by_subject, created_at, updated_at\n )\n SELECT\n id,\n tenant_id,\n agent_name,\n name,\n manifest,\n status,\n jsonb(json_object(\n 'subject_id', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN created_by = '' THEN 'trueforge-default' ELSE created_by END\n )),\n created_at,\n updated_at\n FROM schedule\n `.execute(trx);\n\n await sql`\n CREATE TABLE schedule_run_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n schedule_id TEXT NOT NULL REFERENCES schedule_new (id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n scheduled_for TEXT NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n triggered_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_run_new (\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n created_by_subject,\n triggered_at,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n jsonb(json_object(\n 'subject_id', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END,\n 'subject_type', 'user',\n 'subject_display_name', CASE WHEN triggered_by = '' THEN 'trueforge-default' ELSE triggered_by END\n )),\n triggered_at,\n created_at,\n updated_at\n FROM schedule_run\n `.execute(trx);\n\n await sql`DROP TABLE schedule_run`.execute(trx);\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_new RENAME TO schedule`.execute(trx);\n await sql`ALTER TABLE schedule_run_new RENAME TO schedule_run`.execute(trx);\n\n await sql`\n CREATE INDEX schedule_agent_idx\n ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq\n ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_name_idx\n ON schedule_run (tenant_id, schedule_id, name)\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_scheduled_for_idx\n ON schedule_run (scheduled_for)\n WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_pending_uq\n ON schedule_run (schedule_id)\n WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_list_idx\n ON schedule_run (schedule_id, scheduled_for DESC)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule_run (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE schedule_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_old (\n id, tenant_id, agent_name, name, manifest, status, created_by, created_at, updated_at\n )\n SELECT\n id,\n tenant_id,\n agent_name,\n name,\n manifest,\n status,\n COALESCE(json_extract(created_by_subject, '$.subject_id'), ''),\n created_at,\n updated_at\n FROM schedule\n `.execute(trx);\n\n await sql`\n CREATE TABLE schedule_run_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n schedule_id TEXT NOT NULL REFERENCES schedule_old (id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n scheduled_for TEXT NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n triggered_by TEXT NOT NULL,\n triggered_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO schedule_run_old (\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n triggered_by,\n triggered_at,\n created_at,\n updated_at\n )\n SELECT\n id,\n tenant_id,\n schedule_id,\n name,\n scheduled_for,\n status,\n COALESCE(json_extract(created_by_subject, '$.subject_id'), ''),\n triggered_at,\n created_at,\n updated_at\n FROM schedule_run\n `.execute(trx);\n\n await sql`DROP TABLE schedule_run`.execute(trx);\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_old RENAME TO schedule`.execute(trx);\n await sql`ALTER TABLE schedule_run_old RENAME TO schedule_run`.execute(trx);\n await sql`\n CREATE INDEX schedule_agent_idx ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_name_idx ON schedule_run (tenant_id, schedule_id, name)\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_scheduled_for_idx\n ON schedule_run (scheduled_for) WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_run_pending_uq\n ON schedule_run (schedule_id) WHERE status = 'scheduled'\n `.execute(trx);\n await sql`\n CREATE INDEX schedule_run_list_idx ON schedule_run (schedule_id, scheduled_for DESC)\n `.execute(trx);\n\n await sql`\n CREATE TABLE agent_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n UNIQUE (tenant_id, name)\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO agent_old (id, tenant_id, name, manifest, external_id, created_at, updated_at)\n SELECT id, tenant_id, name, manifest, external_id, created_at, updated_at\n FROM agent\n `.execute(trx);\n await sql`DROP TABLE agent`.execute(trx);\n await sql`ALTER TABLE agent_old RENAME TO agent`.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(AGENT_EXTERNAL_ID_UQ)}\n ON agent (tenant_id, external_id) WHERE external_id IS NOT NULL\n `.execute(trx);\n\n await sql`\n CREATE TABLE session_old (\n tenant_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n created_by TEXT NOT NULL DEFAULT '',\n agent_id TEXT,\n agent_name TEXT,\n agent_spec BLOB,\n title TEXT,\n last_turn_id TEXT,\n external_id TEXT,\n custom BLOB,\n metadata BLOB NOT NULL DEFAULT (jsonb('{}')),\n metrics BLOB NOT NULL DEFAULT (jsonb('{\"total_cost_in_usd\":0,\"total_duration_ms\":0,\"total_turns\":0}')),\n last_activity_timestamp_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (session_id),\n CHECK (\n (agent_id IS NOT NULL AND agent_spec IS NULL)\n OR (agent_id IS NULL AND agent_spec IS NOT NULL)\n )\n ) STRICT\n `.execute(trx);\n await sql`\n INSERT INTO session_old (\n tenant_id,\n session_id,\n created_by,\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n )\n SELECT\n tenant_id,\n session_id,\n COALESCE(json_extract(created_by_subject, '$.subject_id'), ''),\n agent_id,\n agent_name,\n agent_spec,\n title,\n last_turn_id,\n external_id,\n custom,\n metadata,\n metrics,\n last_activity_timestamp_ms,\n created_at,\n updated_at\n FROM session\n `.execute(trx);\n await sql`DROP TABLE session`.execute(trx);\n await sql`ALTER TABLE session_old RENAME TO session`.execute(trx);\n await sql`\n CREATE INDEX session_list_idx ON session (tenant_id, created_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_id_idx\n ON session (tenant_id, agent_id) WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE INDEX session_list_updated_at_idx ON session (tenant_id, updated_at, session_id)\n `.execute(trx);\n await sql`\n CREATE INDEX session_agent_created_at_idx\n ON session (tenant_id, agent_id, created_at) WHERE agent_id IS NOT NULL\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX ${sql.raw(SESSION_EXTERNAL_ID_UQ)}\n ON session (tenant_id, external_id) WHERE external_id IS NOT NULL\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACC1B,IAAM,yBAAyB;AAG/B,IAAM,oCAAoC;AAS1C,IAAM,uBAAuB;AAM7B,IAAM,kCAAkC;AAGxC,IAAM,qCAAqC;AAM3C,IAAM,yCAAyC;;;ADXtD,eAAsB,GAAG,IAAoC;AAC3D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAuBJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAuCJ,QAAQ,GAAG;AACb,YAAM,wBAAwB,QAAQ,GAAG;AACzC,YAAM,+CAA+C,QAAQ,GAAG;AAChE,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA,8BACkB,IAAI,IAAI,sBAAsB,CAAC;AAAA;AAAA;AAAA,QAGrD,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,iCAAiC,CAAC;AAAA;AAAA,QAEzD,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAaJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAwBJ,QAAQ,GAAG;AACb,YAAM,sBAAsB,QAAQ,GAAG;AACvC,YAAM,2CAA2C,QAAQ,GAAG;AAC5D,YAAM;AAAA,8BACkB,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA;AAAA,QAGnD,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,+BAA+B,CAAC;AAAA;AAAA,QAEvD,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAcJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAmBJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAcJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA6BJ,QAAQ,GAAG;AAEb,YAAM,6BAA6B,QAAQ,GAAG;AAC9C,YAAM,yBAAyB,QAAQ,GAAG;AAC1C,YAAM,iDAAiD,QAAQ,GAAG;AAClE,YAAM,yDAAyD,QAAQ,GAAG;AAE1E,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,kCAAkC,CAAC;AAAA;AAAA,QAE1D,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,sCAAsC,CAAC;AAAA;AAAA,QAE9D,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAcJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAeJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAcJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAyBJ,QAAQ,GAAG;AAEb,YAAM,6BAA6B,QAAQ,GAAG;AAC9C,YAAM,yBAAyB,QAAQ,GAAG;AAC1C,YAAM,iDAAiD,QAAQ,GAAG;AAClE,YAAM,yDAAyD,QAAQ,GAAG;AAC1E,YAAM;AAAA;AAAA,QAEJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA,QAEJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA,QAEJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA,QAEJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,QAAQ,GAAG;AACb,YAAM,sBAAsB,QAAQ,GAAG;AACvC,YAAM,2CAA2C,QAAQ,GAAG;AAC5D,YAAM;AAAA,8BACkB,IAAI,IAAI,oBAAoB,CAAC;AAAA;AAAA,QAEnD,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAuBJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAmCJ,QAAQ,GAAG;AACb,YAAM,wBAAwB,QAAQ,GAAG;AACzC,YAAM,+CAA+C,QAAQ,GAAG;AAChE,YAAM;AAAA;AAAA,QAEJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA,QAEJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA,8BACkB,IAAI,IAAI,sBAAsB,CAAC;AAAA;AAAA,QAErD,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260904_000001_schedule_agent_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SCHEDULE_AGENT_ID_IDX, SCHEDULE_CREATED_BY_SUBJECT_ID_IDX } from '../../indexes';\n\n/**\n * Add NOT NULL `agent_id` on schedule — mirrors\n * db/postgres/migrations/20260904_000001_schedule_agent_id.ts.\n * Drops the `(tenant_id, agent_name)` FK; binding is `agent(id)` only.\n *\n * SQLite STRICT cannot ADD a NOT NULL column without a DEFAULT, so rebuild\n * `schedule` (FKs off so `schedule_run` rows survive the drop/rename).\n * better-sqlite3 prepares one statement per call — keep statements separate.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE schedule_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (agent_id) REFERENCES agent (id) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO schedule_new (\n id,\n tenant_id,\n agent_id,\n agent_name,\n name,\n manifest,\n status,\n created_by_subject,\n created_at,\n updated_at\n )\n SELECT\n s.id,\n s.tenant_id,\n a.id,\n s.agent_name,\n s.name,\n s.manifest,\n s.status,\n s.created_by_subject,\n s.created_at,\n s.updated_at\n FROM schedule AS s\n INNER JOIN agent AS a\n ON a.tenant_id = s.tenant_id\n AND a.name = s.agent_name\n `.execute(trx);\n\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_new RENAME TO schedule`.execute(trx);\n\n await sql`\n CREATE INDEX schedule_agent_idx\n ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq\n ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_AGENT_ID_IDX)}\n ON schedule (tenant_id, agent_id)\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE schedule_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO schedule_old (\n id, tenant_id, agent_name, name, manifest, status, created_by_subject, created_at, updated_at\n )\n SELECT\n id, tenant_id, agent_name, name, manifest, status, created_by_subject, created_at, updated_at\n FROM schedule\n `.execute(trx);\n\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_old RENAME TO schedule`.execute(trx);\n\n await sql`\n CREATE INDEX schedule_agent_idx\n ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq\n ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** `
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260904_000001_schedule_agent_id.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SCHEDULE_AGENT_ID_IDX, SCHEDULE_CREATED_BY_SUBJECT_ID_IDX } from '../../indexes';\n\n/**\n * Add NOT NULL `agent_id` on schedule — mirrors\n * db/postgres/migrations/20260904_000001_schedule_agent_id.ts.\n * Drops the `(tenant_id, agent_name)` FK; binding is `agent(id)` only.\n *\n * SQLite STRICT cannot ADD a NOT NULL column without a DEFAULT, so rebuild\n * `schedule` (FKs off so `schedule_run` rows survive the drop/rename).\n * better-sqlite3 prepares one statement per call — keep statements separate.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE schedule_new (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (agent_id) REFERENCES agent (id) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO schedule_new (\n id,\n tenant_id,\n agent_id,\n agent_name,\n name,\n manifest,\n status,\n created_by_subject,\n created_at,\n updated_at\n )\n SELECT\n s.id,\n s.tenant_id,\n a.id,\n s.agent_name,\n s.name,\n s.manifest,\n s.status,\n s.created_by_subject,\n s.created_at,\n s.updated_at\n FROM schedule AS s\n INNER JOIN agent AS a\n ON a.tenant_id = s.tenant_id\n AND a.name = s.agent_name\n `.execute(trx);\n\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_new RENAME TO schedule`.execute(trx);\n\n await sql`\n CREATE INDEX schedule_agent_idx\n ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq\n ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_AGENT_ID_IDX)}\n ON schedule (tenant_id, agent_id)\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`PRAGMA foreign_keys = OFF`.execute(db);\n try {\n await db.transaction().execute(async trx => {\n await sql`\n CREATE TABLE schedule_old (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n name TEXT NOT NULL,\n manifest BLOB NOT NULL,\n status TEXT NOT NULL CHECK (length(status) <= 16),\n created_by_subject BLOB NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (id),\n FOREIGN KEY (tenant_id, agent_name) REFERENCES agent (tenant_id, name) ON DELETE CASCADE\n ) STRICT\n `.execute(trx);\n\n await sql`\n INSERT INTO schedule_old (\n id, tenant_id, agent_name, name, manifest, status, created_by_subject, created_at, updated_at\n )\n SELECT\n id, tenant_id, agent_name, name, manifest, status, created_by_subject, created_at, updated_at\n FROM schedule\n `.execute(trx);\n\n await sql`DROP TABLE schedule`.execute(trx);\n await sql`ALTER TABLE schedule_old RENAME TO schedule`.execute(trx);\n\n await sql`\n CREATE INDEX schedule_agent_idx\n ON schedule (tenant_id, agent_name)\n `.execute(trx);\n await sql`\n CREATE UNIQUE INDEX schedule_name_uq\n ON schedule (tenant_id, agent_name, name)\n `.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SCHEDULE_CREATED_BY_SUBJECT_ID_IDX)}\n ON schedule (tenant_id, json_extract(created_by_subject, '$.subject_id'))\n `.execute(trx);\n });\n } finally {\n await sql`PRAGMA foreign_keys = ON`.execute(db);\n }\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACsB1B,IAAM,qCAAqC;AAG3C,IAAM,wBAAwB;;;ADbrC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAeJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA4BJ,QAAQ,GAAG;AAEb,YAAM,yBAAyB,QAAQ,GAAG;AAC1C,YAAM,iDAAiD,QAAQ,GAAG;AAElE,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,kCAAkC,CAAC;AAAA;AAAA,QAE1D,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,qBAAqB,CAAC;AAAA;AAAA,QAE7C,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,+BAA+B,QAAQ,EAAE;AAC/C,MAAI;AACF,UAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAcJ,QAAQ,GAAG;AAEb,YAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOJ,QAAQ,GAAG;AAEb,YAAM,yBAAyB,QAAQ,GAAG;AAC1C,YAAM,iDAAiD,QAAQ,GAAG;AAElE,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA;AAAA;AAAA,QAGJ,QAAQ,GAAG;AACb,YAAM;AAAA,uBACW,IAAI,IAAI,kCAAkC,CAAC;AAAA;AAAA,QAE1D,QAAQ,GAAG;AAAA,IACf,CAAC;AAAA,EACH,UAAE;AACA,UAAM,8BAA8B,QAAQ,EAAE;AAAA,EAChD;AACF;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// src/db/sqlite/migrations/20260904_000002_session_source.ts
|
|
2
|
+
import { sql } from "kysely";
|
|
3
|
+
|
|
4
|
+
// src/db/indexes.ts
|
|
5
|
+
var SESSION_SOURCE_IDX = "session_source_idx";
|
|
6
|
+
|
|
7
|
+
// src/db/sqlite/migrations/20260904_000002_session_source.ts
|
|
8
|
+
async function up(db) {
|
|
9
|
+
await db.transaction().execute(async (trx) => {
|
|
10
|
+
await sql`ALTER TABLE session ADD COLUMN source BLOB`.execute(trx);
|
|
11
|
+
await sql`
|
|
12
|
+
CREATE INDEX ${sql.raw(SESSION_SOURCE_IDX)}
|
|
13
|
+
ON session (tenant_id, json_extract(source, '$.type'), json_extract(source, '$.id'))
|
|
14
|
+
WHERE source IS NOT NULL
|
|
15
|
+
`.execute(trx);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async function down(db) {
|
|
19
|
+
await db.transaction().execute(async (trx) => {
|
|
20
|
+
await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_SOURCE_IDX)}`.execute(trx);
|
|
21
|
+
await sql`ALTER TABLE session DROP COLUMN source`.execute(trx);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
down,
|
|
26
|
+
up
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=20260904_000002_session_source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/db/sqlite/migrations/20260904_000002_session_source.ts","../../../src/db/indexes.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\nimport { SESSION_SOURCE_IDX } from '../../indexes';\n\n/**\n * Add nullable JSONB `source` on session. Mirrors\n * db/postgres/migrations/20260904_000002_session_source.ts.\n * Nullable ADD COLUMN needs no table rebuild.\n * Kysely does not wrap SQLite migrations — keep ADD COLUMN + index atomic.\n */\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`ALTER TABLE session ADD COLUMN source BLOB`.execute(trx);\n await sql`\n CREATE INDEX ${sql.raw(SESSION_SOURCE_IDX)}\n ON session (tenant_id, json_extract(source, '$.type'), json_extract(source, '$.id'))\n WHERE source IS NOT NULL\n `.execute(trx);\n });\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.transaction().execute(async trx => {\n await sql`DROP INDEX IF EXISTS ${sql.raw(SESSION_SOURCE_IDX)}`.execute(trx);\n await sql`ALTER TABLE session DROP COLUMN source`.execute(trx);\n });\n}\n","/** Partial unique index on `session (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const SESSION_EXTERNAL_ID_UQ = 'session_external_id_uq';\n\n/** `(tenant_id, created_by_subject.subject_id)` on session. */\nexport const SESSION_CREATED_BY_SUBJECT_ID_IDX = 'session_created_by_subject_id_idx';\n\n/**\n * `(tenant_id, source.type, source.id)` on session — list filter by source.\n * Partial WHERE source IS NOT NULL (interactive sessions omit source).\n */\nexport const SESSION_SOURCE_IDX = 'session_source_idx';\n\n/** Partial unique index on `agent (tenant_id, external_id) WHERE external_id IS NOT NULL`. */\nexport const AGENT_EXTERNAL_ID_UQ = 'agent_external_id_uq';\n\n/** GIN index for `session.metadata` containment queries (`@>`). */\nexport const SESSION_METADATA_GIN = 'session_metadata_gin';\n\n/** `(tenant_id, created_by_subject.subject_id)` on agent. */\nexport const AGENT_CREATED_BY_SUBJECT_ID_IDX = 'agent_created_by_subject_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule. */\nexport const SCHEDULE_CREATED_BY_SUBJECT_ID_IDX = 'schedule_created_by_subject_id_idx';\n\n/** `(tenant_id, agent_id)` on schedule — list schedules for one agent by id. */\nexport const SCHEDULE_AGENT_ID_IDX = 'schedule_agent_id_idx';\n\n/** `(tenant_id, created_by_subject.subject_id)` on schedule_run. */\nexport const SCHEDULE_RUN_CREATED_BY_SUBJECT_ID_IDX = 'schedule_run_created_by_subject_id_idx';\n"],"mappings":";AAAA,SAAS,WAAwB;;;ACU1B,IAAM,qBAAqB;;;ADDlC,eAAsB,GAAG,IAAoC;AAC3D,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,UAAM,gDAAgD,QAAQ,GAAG;AACjE,UAAM;AAAA,qBACW,IAAI,IAAI,kBAAkB,CAAC;AAAA;AAAA;AAAA,MAG1C,QAAQ,GAAG;AAAA,EACf,CAAC;AACH;AAEA,eAAsB,KAAK,IAAoC;AAC7D,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,QAAO;AAC1C,UAAM,2BAA2B,IAAI,IAAI,kBAAkB,CAAC,GAAG,QAAQ,GAAG;AAC1E,UAAM,4CAA4C,QAAQ,GAAG;AAAA,EAC/D,CAAC;AACH;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truefoundry/trueforge",
|
|
3
|
-
"version": "0.2.0-rc.
|
|
3
|
+
"version": "0.2.0-rc.2",
|
|
4
4
|
"description": "TrueForge Agent Harness: server, HTTP API, and chat UI (npx @truefoundry/trueforge)",
|
|
5
5
|
"author": "TrueFoundry",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"hono": "^4.13.5",
|
|
40
40
|
"jose": "^6.2.10",
|
|
41
41
|
"kysely": "^0.29.5",
|
|
42
|
+
"lru-cache": "^11.5.2",
|
|
42
43
|
"openid-client": "^6.8.7",
|
|
43
44
|
"pg": "^8.23.0",
|
|
44
45
|
"redis": "^5.12.1",
|
|
@@ -47,8 +48,8 @@
|
|
|
47
48
|
"winston": "^3.19.0",
|
|
48
49
|
"yaml": "^2.9.0",
|
|
49
50
|
"zod": "^4.4.3",
|
|
50
|
-
"@truefoundry/trueforge-core": "0.2.0-rc.
|
|
51
|
-
"@truefoundry/trueforge-sdk": "0.1.4-rc.
|
|
51
|
+
"@truefoundry/trueforge-core": "0.2.0-rc.2",
|
|
52
|
+
"@truefoundry/trueforge-sdk": "0.1.4-rc.2"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
55
|
"@swc/core": "^1.16.1",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"@types/jest": "^29.5.14",
|
|
58
59
|
"@types/node": "^24.13.3",
|
|
59
60
|
"@types/pg": "^8.23.1",
|
|
61
|
+
"cross-env": "^10.1.0",
|
|
60
62
|
"jest": "^29.7.0",
|
|
61
63
|
"tsup": "^8.5.1",
|
|
62
64
|
"tsx": "^4.23.12",
|
|
@@ -67,19 +69,19 @@
|
|
|
67
69
|
"build:gen:local-sandbox": "node scripts/generate-local-sandbox-scripts.mjs",
|
|
68
70
|
"build:gen:watch": "node --watch-path=catalog/model-catalog.yaml --watch-path=catalog/mcp-catalog.yaml --watch-path=catalog/skill-catalog.yaml --watch-path=catalog/sandbox-catalog.yaml --watch-path=src/sandbox/local/scripts scripts/generate-dev.mjs",
|
|
69
71
|
"build:gen": "pnpm run build:gen:local-sandbox && node scripts/generate-catalog.mjs",
|
|
70
|
-
"build:clean": "rm
|
|
71
|
-
"build": "pnpm run build:gen && tsc --noEmit && pnpm run build:clean && tsup && chmod
|
|
72
|
-
"dev:serve": "NODE_OPTIONS
|
|
72
|
+
"build:clean": "node ../../scripts/rm-path.mjs dist",
|
|
73
|
+
"build": "pnpm run build:gen && tsc --noEmit && pnpm run build:clean && tsup && node ../../scripts/chmod-path.mjs dist/cli.js 755 && pnpm run build:frontend-assets",
|
|
74
|
+
"dev:serve": "cross-env NODE_OPTIONS=--conditions=trueforge-dev NODE_ENV=development tsx watch --env-file=.env src/main.ts",
|
|
73
75
|
"dev": "pnpm run \"/^(build:gen:watch|dev:serve|dev:controller)$/\"",
|
|
74
76
|
"dev:no-watch": "pnpm run \"/^(dev:serve:no-watch|dev:controller:no-watch)$/\"",
|
|
75
|
-
"dev:serve:no-watch": "NODE_OPTIONS
|
|
76
|
-
"dev:controller": "NODE_OPTIONS
|
|
77
|
-
"dev:controller:no-watch": "NODE_OPTIONS
|
|
78
|
-
"start": "NODE_ENV=production node --env-file=.env dist/main.js",
|
|
79
|
-
"start:controller": "NODE_ENV=production node --env-file=.env dist/controller-main.js",
|
|
77
|
+
"dev:serve:no-watch": "cross-env NODE_OPTIONS=--conditions=trueforge-dev NODE_ENV=development tsx --env-file=.env src/main.ts",
|
|
78
|
+
"dev:controller": "cross-env NODE_OPTIONS=--conditions=trueforge-dev NODE_ENV=development tsx watch --env-file=.env src/controller-main.ts",
|
|
79
|
+
"dev:controller:no-watch": "cross-env NODE_OPTIONS=--conditions=trueforge-dev NODE_ENV=development tsx --env-file=.env src/controller-main.ts",
|
|
80
|
+
"start": "cross-env NODE_ENV=production node --env-file=.env dist/main.js",
|
|
81
|
+
"start:controller": "cross-env NODE_ENV=production node --env-file=.env dist/controller-main.js",
|
|
80
82
|
"push-sandbox-image-to-daytona": "node scripts/push-sandbox-image-to-daytona.mjs",
|
|
81
|
-
"migrate": "NODE_OPTIONS
|
|
82
|
-
"openapi:write": "pnpm run build:gen && NODE_OPTIONS
|
|
83
|
+
"migrate": "cross-env NODE_OPTIONS=--conditions=trueforge-dev STANDALONE=false tsx --env-file=.env src/db/postgres/migrate-cli.ts",
|
|
84
|
+
"openapi:write": "pnpm run build:gen && cross-env NODE_OPTIONS=--conditions=trueforge-dev tsx --env-file=.env.test scripts/write-openapi.ts",
|
|
83
85
|
"pack:dry": "pnpm pack --dry-run",
|
|
84
86
|
"predev:no-watch": "pnpm --filter @truefoundry/trueforge-core build:gen && pnpm run build:gen",
|
|
85
87
|
"predev": "pnpm --filter @truefoundry/trueforge-core build:gen && pnpm run build:gen",
|
|
@@ -87,9 +89,9 @@
|
|
|
87
89
|
"test:eventsub": "jest --config jest.eventsub.config.cjs",
|
|
88
90
|
"test:store:postgres": "jest --config jest.store.postgres.config.cjs",
|
|
89
91
|
"test:store:sqlite": "jest --config jest.store.sqlite.config.cjs",
|
|
90
|
-
"test": "pnpm run build:gen && NODE_OPTIONS
|
|
91
|
-
"test:local-sandbox:contract": "pnpm run build:gen && NODE_OPTIONS
|
|
92
|
-
"smoke:local-sandbox": "pnpm run build:gen && NODE_OPTIONS
|
|
92
|
+
"test": "pnpm run build:gen && cross-env NODE_OPTIONS=--conditions=trueforge-dev node --env-file=.env.test ./node_modules/jest/bin/jest.js --config jest.unit.config.cjs",
|
|
93
|
+
"test:local-sandbox:contract": "pnpm run build:gen && cross-env NODE_OPTIONS=--conditions=trueforge-dev node --env-file=.env.test ./node_modules/jest/bin/jest.js --config jest.local-sandbox.contract.config.cjs",
|
|
94
|
+
"smoke:local-sandbox": "pnpm run build:gen && cross-env NODE_OPTIONS=--conditions=trueforge-dev jest --config jest.local-sandbox.smoke.config.cjs --runInBand --forceExit tests/sandbox/local/smoke.test.ts",
|
|
93
95
|
"smoke:local-sandbox:lima": "bash scripts/local-sandbox/smoke-lima.sh",
|
|
94
96
|
"probe:loopback": "pnpm exec tsx scripts/local-sandbox/probe-loopback.ts",
|
|
95
97
|
"typecheck": "pnpm run build:gen && tsc --noEmit && tsc --noEmit -p tests/db/tsconfig.json && tsc --noEmit -p tests/unit/tsconfig.json"
|
|
Binary file
|
|
Binary file
|