@wular/coder 0.4.13 → 0.5.1
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/README.md +3 -3
- package/dist/actions-DO8MvHwc.js +3 -0
- package/dist/agent-Cgala63h.js +1 -0
- package/dist/app-server-dnlLhhZb.js +6 -0
- package/dist/approvals-C8XV7CK2.js +5 -0
- package/dist/apps-BORri-28.js +18 -0
- package/dist/args-CJsHYWbt.js +66 -0
- package/dist/async-BS9tyhva.js +3 -0
- package/dist/auth-C16ylySv.js +1 -0
- package/dist/builtin/coder/agent.json +6 -6
- package/dist/builtin/coder/system.md +7 -5
- package/dist/{chat-bwKd3y6V.js → chat-Bfu9XKRa.js} +1 -1
- package/dist/chat-czruXAt3.js +13 -0
- package/dist/cli.js +18 -13
- package/dist/{client-C4QCT6cG.js → client-nBo9Mhsr.js} +4 -4
- package/dist/cmd-C1gHyVG7.js +122 -0
- package/dist/config-_32PHl9g.js +5 -0
- package/dist/connection-CgA5_NJ7.js +1 -0
- package/dist/connections-B90TemYf.js +2 -0
- package/dist/context-C1XBbfEL.js +6 -0
- package/dist/crypto-Ittsv-m4.js +1 -0
- package/dist/dash/standalone/server/build-index.json +1 -1
- package/dist/dash/standalone/server/manifest.json +1690 -1452
- package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/event-json.856d33f567e58d0e.js +30 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/client/http.e78b470f4ecf125b.js +58 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.de1f1311bab4252f.js → index.91e126d7a389d4bd.js} +46 -75
- package/dist/dash/standalone/server/modules-server-server-react-server/src/core/task/{log-view.ec6391dbf3063330.js → view.e20379d8f741754a.js} +38 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/core/types.9d22123d6296f5af.js +37 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.30ed8c28774a1a82.js → load.858c062c7891a2c1.js} +18 -11
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.118a70787eff1761.js → page.9375ab741dc9791e.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{loading.fcdfd50c21031895.js → loading.56c14183236be231.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.98dfcd316c306258.js → notify.c36570a56d279ce2.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.74c59322f5fe8a2c.js → page.13fdd9cc55ad3a52.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.730aa96b086ac996.js → sign-out.38a7f39cddc670f7.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agent-menu.1be5795272b245c8.js → agent-menu.5c780867b82081b1.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.2c30ace077893029.js → agents-grid.2385ffa8fdad08d6.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{loading.733f0acc2af5ceda.js → loading.0130f8533d8f1b1e.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/page.5ca6921e50484f8c.js +48 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.b26006f060cd48f0.js → layout.afc4a8a5a8360975.js} +89 -32
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{loading.388aeaf0c2edf8f8.js → loading.90bf37c903ce6f0d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.4b23e9df21433bd3.js → page.ba65063a1aa99a62.js} +22 -88
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{loading.e06845585ca67abc.js → loading.d56ef50b0694f975.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.4048048acb374c67.js → page.03c5e72b0fe50ba9.js} +51 -123
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.000f2f87a48bfbc6.js → platform-actions.7c8c75bd0c05df4a.js} +234 -134
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/platform-state.6b6132518ca61635.js +21 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/platform-step.d6a980d1181dc940.js +82 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.ee0bb2dc4d403ec3.js → agent-settings-form.b5299f5130a4e8af.js} +53 -76
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{loading.0e3641f3e4abaa7c.js → loading.2800c65e45a4a1d9.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.649b4ba135ded99b.js → page.fad77cea17947d47.js} +10 -11
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.195e168e8e41d797.js → loading.4120e6979eaed441.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.96f7573208644f40.js → page.474b3524d5ea53b7.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{loading.905293c9aa9afbc9.js → loading.3a615597ca648452.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.5f2b8585db8b27ad.js → page.7868a07efcaa26f4.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.8700f0106f4e8c15.js → versions-list.ba93a53773cab8a8.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.f94b2f9ab04aaf21.js → loading.6e53829bd1f3021d.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.e898c4b5ef16ecb0.js → page.5798ede8ba8ace97.js} +10 -10
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/app-cards.55778a4b3177846d.js +142 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/loading.f0d91d48e2b79e50.js +14 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/page.ce391cad0d78795f.js +99 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-pills.44e689e546fb042b.js → agent-pills.1012e04bfbc7bffd.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.4c67dfbb7d28a416.js → agent-toggle.0cec822c6099f058.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.9740a8e2f4b41f28.js → hero.7151c467e7ecf6a5.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{instructions.85b1cd986a9edbb5.js → instructions.1b8c9189961c5a4f.js} +13 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.ff8b78a03153239b.js → connect-repositories.4e121d31ed0cfe02.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.471af698b8060eba.js → editor.f314d92af0bb33b0.js} +164 -127
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.b7b5c89e618e8f89.js → import-picker.11028d5329ad537b.js} +11 -11
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{loading.ecb9dfd4d0f9d107.js → loading.9b65a8c1cdc8346f.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.880bdac7fe843635.js → page.1476d31e4554e88b.js} +9 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.81f7e055829854a3.js → layout.150d950d191db477.js} +89 -26
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/operator-apps.3e72de86b86a7338.js +155 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.8f8697b1b6b34ad7.js → page.6a4be3b1a473ff8c.js} +10 -10
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.fe608b8e661aba1d.js → page.262ed73437c17872.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/advanced-list.7180570379e2625c.js +63 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/connection-add.632b1847c16ecd42.js +526 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/connections-list.4378ae707b2092ed.js +439 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.a4d8338c7f6a5702.js → credentials-list.e47897acb6867df8.js} +116 -101
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.1443bbed1ff1d441.js → credentials.6bd06f96afbe7329.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/list.38e70272eeb98cd0.js +201 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{loading.7ca95dcb4fb3362b.js → loading.71ca4f6c99a8a9d5.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/models-list.a08cd37d0f7ff86c.js +635 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.805d0f8a2c5817d6.js → page.f096b5a9ac419326.js} +67 -41
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.1e83449aa6593224.js → runners-list.0df1f9329df1b67d.js} +42 -37
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.17ac06593005b8ba.js → secrets-list.6d2f56fa7d6fcab0.js} +19 -17
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/chain-hint.65c4cc04c78e8bfd.js +18 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.8c4a2b31b194ba3e.js → layout.0fd865c865e5bab4.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/model-options.0d6077fe68db3af9.js +147 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/model-pick.695538b2edf9dd15.js +160 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.a77996786278cda0.js → page.c57b81c2197cce0f.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{settings-head.705be0b1129b97af.js → settings-head.004ced21e02ffa48.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{tunnel-guide.29eee1a0b1852168.js → tunnel-guide.1bc6bff9d8019098.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.19b4c50ef497aca1.js → create-link.60aadbe43ea1e39c.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{outcome-dialog.18cf32fa42247b91.js → outcome-dialog.a74e686aaed0c584.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/outcome-toast.e2b9ef0344b1a1a2.js +24 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{outcome.cbbc8cd1bbbee01b.js → outcome.22a83d756e4020a7.js} +3 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.616f0b36bf7925bc.js → page.c456ad99c8a9f875.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.a911169a820ba604.js → activity.2ec05d78d609b7b2.js} +12 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{loading.76f851da5cc5268d.js → loading.779ecdd9c9d2ff09.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.ddb594bb6567ee13.js → page.578be2f6c89fcba0.js} +16 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-actions.d131453dd2a423c3.js +408 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-missing.33ec27a4a5eafefe.js +27 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.3276538e8306fd8a.js → task-view.3d72a4ecd2b3826e.js} +44 -81
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer-data.05fc39e1a7fd1ab7.js → composer-data.c16854be11a561e4.js} +4 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.dbf06b05c5e2eba3.js → composer.97be3e67214889c1.js} +130 -195
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/pending-approvals.9175908da02960e1.js +40 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{status.cb704b48ce86cc7d.js → status.d2c05c397780b833.js} +7 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{task.f089c1c122ed6dd2.js → task.a25847399a4dfb30.js} +9 -26
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.5a00d69851dae119.js → tasks-list.028798c79227a366.js} +43 -35
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.36e70c93f7d0feee.js → tasks-section.9a9d13057b326f25.js} +16 -10
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.185b1ba0c803db3f.js → page.045c6db0c56975b2.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{custom-range.2e21c7f891966c15.js → custom-range.fe91164d7a311356.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{day-chart.261b6651df2d3966.js → day-chart.20faaaf57c81ad9e.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{loading.a7e0ec01bfa769e3.js → loading.5b973a8bb29197d5.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.d41fea7676e37bfc.js → page.938d29ff7edb678d.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{range-bar.69e68c9dae09f238.js → range-bar.0b9038e9df707843.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{top-agents.18fc469e781e2305.js → top-agents.93c916167299ffb6.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{layout.296d70b95894209f.js → layout.94ea3908b03bede6.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/login/{page.a82be2fd23e9ac67.js → page.4827d64c71c0690a.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{drawer.d3e61538dbc8ec39.js → drawer.1a08ff611df7fe38.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{foreign-link.8c6adf9c5a6f467c.js → foreign-link.1d4f63a0379cbd1d.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{loading-card.1cea8a722c10b998.js → loading-card.77bea8c5870b5d3c.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{page-head.87b92529dbb53ceb.js → page-head.2eb1e0213eb50349.js} +3 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.c32d78562f75db25.js → stream.2cdb8eabd8f6df70.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.44075fa7e04575e8.js → task-toasts.8733901ca0e4c246.js} +28 -18
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{theme-choices.85100ed66d6f9200.js → theme-choices.fc86071c1b634176.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{back.d6109e72fbd04b45.js → back.7aa0ae82dbec38cd.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{org.d3abfd4053b711ce.js → org.853d173b55368728.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{side-toggle.489faf1a259479f7.js → side-toggle.be7d2a7529557435.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{badge.c0bc352791a95fd6.js → badge.9f63fd615cf0ee22.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/button.2b18ba19ae01e2bb.css.pnext-asset.js +0 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{button.ce9e6cdb08ca86db.js → button.b62fa52e18fa338b.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/card.4ab7ad42a0770726.css.pnext-asset.js +0 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{card.9f0d45b73bc78b4f.js → card.c0030eafd76587e3.js} +21 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{collapse.93e4d1b20c2873ed.js → collapse.eb578fdf42029754.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{combo.54270c0251466fda.js → combo.e4e08287494081a3.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{confirm.29e198be34578222.js → confirm.e21b7f5e486dafb8.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{copy.bd6fc1577a393965.js → copy.043e0695c08c72f9.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{filter.81bb9a5c60cd1089.js → filter.0730dccad6332327.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/filter.6fdff1e7355aaa0e.css.pnext-asset.js +0 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{icons.e36c72f54750663a.js → icons.f769275420d072ce.js} +4 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{menu-items.1d082ac4dae8f3d4.js → menu-items.759a1b1f7c5ee365.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{menu.ee45bace979944b6.js → menu.7f558c7c6f6345d5.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/menu.cd96fa0495fe0fde.css.pnext-asset.js +0 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{modal.0b69c7fd9db025b9.js → modal.08ac85d31f4c76c1.js} +7 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{select.2eb33e5bea28d804.js → select.0ee9e8f04ddd8b47.js} +9 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{tail.04132db0c5033d4f.js → tail.7eb303330802ac18.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/toolbar.cdbd0357f2c5e1fe.css.pnext-asset.js +0 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{toolbar.8b3a460a65edf85a.js → toolbar.ff8367c641d28c1e.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.67dd6f8ab1ae067d.js → action.56cea462eb725c39.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.78267fa3d7905d17.js → client.685154f230716834.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/routes/http.394704f4f12ada08.js +165 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/utils/crypto.24a6439ff8d10d3d.js +11 -0
- package/dist/dash/standalone/static/assets/chunks/advanced-list-b75a9c2bd11026de.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/agent-pills-54564413a57d7fa7.js +2 -0
- package/dist/dash/standalone/static/assets/chunks/agent-settings-form-55d294dad2ce5a0d.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/agent-toggle-b5dcc4ea6292fb3d.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/agents-grid-69461c53abbba433.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{back-e29cb10f5548ddae.js → back-ba5e4340a9f8bbd2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/chain-hint-491eb09a20a15702.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{combo-702c94817bf6ac17.js → combo-6df61e8a1cc31037.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/composer-198b844da57b82a3.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/composer-b26a3332a1243461.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/composer-data-b05f3d93fdc472d7.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{confirm-a78147b6ecef3847.js → confirm-14d018653fbe50fc.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connect-repositories-7770ab805160028d.js → connect-repositories-5118edc019fc7890.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/connections-list-5412dad7e0def52f.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{copy-bdc60bdafe336316.js → copy-04781f9af4e10f06.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-0651addf1461f901.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/credentials-list-e64c973aee5602d3.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/custom-range-b6919bab9846ebf7.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/editor-68e9ccd1764fc512.js +6 -0
- package/dist/dash/standalone/static/assets/chunks/{field-bb8191aa02d07282.js → field-adcb6e6a5f9b7131.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-0022dd3bdd57c13f.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/instructions-7b274685ceb26457.js +2 -0
- package/dist/dash/standalone/static/assets/chunks/list-662f042656857c82.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/model-options-5e07b3318d69d218.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/models-list-ae1e2eff30d21824.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-546fe090efc129c2.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-fde11a52c282301d.js → outcome-dialog-fd86ded4c44c2de7.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-toast-c00becdb638cd9a8.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/platform-actions-2be223e68e648134.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/platform-actions-f3979ab69a6ceb53.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/platform-step-5454b6c0a19caefd.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/platform-step-9a52703f4c4f6a31.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/runners-list-20d42f19fb4bec8a.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{runtime-6e12333f12903a62-1.js → runtime-3fcac605fffcc273-1.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/secrets-list-89f89ee70edb3856.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{segmented-0b6dc6b93c35e0f5.js → segmented-66a8c77c6294fec3.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-3fcac605fffcc273-2.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-96225b8c7758de9d.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-96cde32cd50254c0.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-abd7653140f37a0c.js +9 -0
- package/dist/dash/standalone/static/assets/chunks/side-toggle-8a410cc6d6bd9b1d.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{tail-f8804b80cf32f8d0.js → tail-40f16e09eade7eee.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/task-396d849e58e50d59.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/task-actions-0b3054dc0f8d17c0.js +3 -0
- package/dist/dash/standalone/static/assets/chunks/task-view-9e026dc5da58af5b.js +3 -0
- package/dist/dash/standalone/static/assets/chunks/tasks-list-04c6568d7f7237b7.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/versions-list-ceb756236e69b761.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{wular-pnext-6e12333f12903a62-0.js → wular-pnext-3fcac605fffcc273-0.js} +1 -1
- package/dist/dash/standalone/static/assets/create-param-id-2c72f3e32e7f8b8d.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-a7f30a8c5a6fa651.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-account-76fffb9337b633f2.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-cc5d59edfc3cf0b1.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-new-170499c849114150.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-dd4ac319a0d62432.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-edit-199a9991de1bf2d9.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-9d2e1439f3f7e81b.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-param-app-a6d559f0e26bd01b.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-settings-f21d4fcd3948139b.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-tasks-c8d6aa06f6e75f4c.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-9cc128ba8af6ef62.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-operator-8d5ef55834d8deba.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-settings-7138821f5422d087.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-settings-param-tab-586fec34f285e9cb.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-setup-67679c1f84f352cf.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-be3cb3d64573f3d9.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-param-id-c20a0537bc82620d.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-usage-c534db20ce538fd2.css +1 -0
- package/dist/dash/standalone/static/assets/global-df2c26ad15039e8a.css +1 -0
- package/dist/dash/standalone/static/assets/{login-9760b85feae40270.css → login-148795638d6ff5d4.css} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-07b41bfab64b61c0.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-0d388d56250f9f46.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-1443e45181b60bb0.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-27207e4f43f9a21b.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-435db60553fa3a67.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-523dd4071aa294ba.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-5f6bda3919f68382.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-684fd8ad16563ed3.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-6b952cdda9a1eb2b.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-6fe9e98f7dd8dcbf.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-730c2c507a159f9e.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-7c46573e45b67166.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-83a865c3d75705bd.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-907d1db4fb398a1d.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-9baf701f3e641d09.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-a57705e4e1047a9e.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b1af82c6f0db0033.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-cede3bd7b2735942.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-d9a3996f22b6816b.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-f95364a0073ca4ce.js +1 -0
- package/dist/definition-D0OpQfGX.js +1 -0
- package/dist/discover-BfYHHJN_.js +1 -0
- package/dist/dispatch-BkoIU4GU.js +12 -0
- package/dist/{dist-DAnSqY1s.js → dist-B5qUdWUG.js} +35 -35
- package/dist/{dist-B2jiMMxZ.js → dist-Clxdruuu.js} +3 -3
- package/dist/{dist-ClCNj65n.js → dist-CymLGfHl.js} +4 -4
- package/dist/{adapter-Bz0E-DAY.js → dist-DX0JzVC6.js} +990 -990
- package/dist/{adapter-CsacmMmv.js → dist-DfD9WmV8.js} +39 -39
- package/dist/dist-node-B8VIVzUc.js +20 -0
- package/dist/docs-CxklYa3P.js +2 -0
- package/dist/drive-B7SBFfcb.js +1 -0
- package/dist/drizzle-orm-CYU7WOQS.js +2 -0
- package/dist/{emit-BrkJJPUE.js → emit-BgeqsCkC.js} +3 -3
- package/dist/env-BwFCHakK.js +1 -0
- package/dist/errors-DK_trCff.js +1 -0
- package/dist/exec-D9jF2F-H.js +3 -0
- package/dist/executor-DBW7R7Tf.js +11 -0
- package/dist/flow/builtin/review/index.d.ts +2 -2
- package/dist/flow/builtin/review/index.js +10 -15
- package/dist/flow/index.d.ts +2 -2
- package/dist/flow/index.js +1 -1
- package/dist/github-actions-2RjyRseX.js +36 -0
- package/dist/{hook-CIipj9MJ.js → hook-DN__zYOG.js} +1 -1
- package/dist/http-615JJgHo.js +5 -0
- package/dist/http-DRk8cDjf.js +1 -0
- package/dist/{index-ChcxzFdB.d.ts → index-CTAQrCRU.d.ts} +403 -307
- package/dist/integrations-DSZSa8Rc.js +9 -0
- package/dist/lib/broker.js +2 -2
- package/dist/load-BtIDghgd.js +2 -0
- package/dist/local-BzMvgiwL.js +5 -0
- package/dist/local-GIxwz_Or.js +1 -0
- package/dist/login-LlZrIlxb.js +8 -0
- package/dist/maintenance-DyiyHI8S.js +1 -0
- package/dist/mcp-Caq72REF.js +1 -0
- package/dist/mcp-CrtKQoVi.js +1 -0
- package/dist/mcp-cEIva8Pd.js +27 -0
- package/dist/metadata-D_bBfr3H.js +1 -0
- package/dist/models-BVxs3I8o.js +1 -0
- package/dist/output-BKeyLbvt.js +5 -0
- package/dist/permission-RSZM3DUk.js +1 -0
- package/dist/post-DLenID75.js +11 -0
- package/dist/prompt-CpwbsEWM.js +4 -0
- package/dist/refresh-CWEpTAkD.js +1 -0
- package/dist/remote-BDMuKaON.js +2 -0
- package/dist/remote-CY-qYX2C.js +1 -0
- package/dist/runner-CKMOh5Q3.js +1 -0
- package/dist/runner.json +1 -1
- package/dist/runner.tgz +0 -0
- package/dist/schema.d.ts +2 -2
- package/dist/schema.js +2 -3
- package/dist/sdk.d.ts +2857 -1405
- package/dist/sdk.js +1 -1
- package/dist/serve-D23JqDip.js +12 -0
- package/dist/serve-DoYbHm_k.js +5 -0
- package/dist/serve-YlU04KO7.js +1 -0
- package/dist/session-D7eeJIaH.js +1 -0
- package/dist/sessions-BGUfSe8L.js +1 -0
- package/dist/shared-BzNReirj.js +1 -0
- package/dist/sign-in-Dr6sU7vz.js +3 -0
- package/dist/state-CxAUec80.js +6 -0
- package/dist/store-BrnWdtRw.js +349 -0
- package/dist/task-CyqtCXo3.js +1 -0
- package/dist/task-DN4assR8.js +7 -0
- package/dist/tool-search-C9Ty3hhL.js +6 -0
- package/dist/tools-Ck-ZWtmB.js +1 -0
- package/dist/tools-DVtBtED6.js +1 -0
- package/dist/tools-search-BNDea9vZ.js +1 -0
- package/dist/turn-eI4iRPsq.js +3 -0
- package/dist/types-DHBqXFE2.js +1 -0
- package/dist/update-check-Bap3dwaj.js +1 -0
- package/dist/view-D-rbQ1Kz.js +4 -0
- package/dist/views-Bxm_5J6T.js +2 -0
- package/dist/worker-DJANNSCT.js +1 -0
- package/dist/worker-DeuC38Vp.js +7 -0
- package/dist/zod-_-snqfdO.js +1 -0
- package/dist/zod.js +65 -1
- package/docs/agents/coder.md +5 -1
- package/docs/agents/index.md +53 -82
- package/docs/approvals.md +47 -0
- package/docs/cli/agent.md +34 -13
- package/docs/cli/auth.md +1 -1
- package/docs/cli/connection.md +22 -21
- package/docs/cli/index.md +18 -14
- package/docs/cli/model.md +11 -11
- package/docs/cli/task.md +28 -30
- package/docs/config.md +37 -65
- package/docs/connections.md +80 -0
- package/docs/dash.md +23 -19
- package/docs/flows.md +46 -213
- package/docs/models.md +48 -78
- package/docs/review.md +49 -18
- package/docs/runners.md +49 -0
- package/docs/sdk.md +49 -73
- package/docs/self-host.md +81 -82
- package/package.json +4 -5
- package/plugins/agents/skills/coder/SKILL.md +3 -3
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/skills/dispatch/SKILL.md +3 -3
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/README.md +3 -3
- package/plugins/cursor/skills/coder/SKILL.md +3 -3
- package/dist/actions-D12xDiQS.js +0 -4
- package/dist/adapter-DzpdWewB.js +0 -1
- package/dist/agent-JJStALIx.js +0 -8
- package/dist/apps-Bnk7F3A2.js +0 -379
- package/dist/args-Dqf5Y1RP.js +0 -1
- package/dist/async-Tj4zKHXR.js +0 -3
- package/dist/auth-BhpnOCbn.js +0 -1
- package/dist/base64url-CsVsW4Id.js +0 -1
- package/dist/chat-CSepnsrK.js +0 -13
- package/dist/cmd-BHZwhrfa.js +0 -118
- package/dist/connection-BkYTuJjV.js +0 -1
- package/dist/context-zhSlmXOp.js +0 -7
- package/dist/conversation-DT-35cEt.js +0 -1
- package/dist/core-DwsAMCnL.js +0 -65
- package/dist/dash/standalone/node_modules/contextjsx/dist/index.mjs +0 -1
- package/dist/dash/standalone/node_modules/contextjsx/dist/jsx-runtime.mjs +0 -1
- package/dist/dash/standalone/node_modules/contextjsx/dist/src-BJ0QFeB8.mjs +0 -2
- package/dist/dash/standalone/node_modules/contextjsx/package.json +0 -70
- package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/context/turn.6bb73458768e222e.js +0 -129
- package/dist/dash/standalone/server/modules-server-server-react-server/src/core/defaults.e972c134a1ae918f.js +0 -55
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/auth/sign-in.661b3a4139af5bd7.js +0 -11
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/connect/page.04762872666a6f0a.js +0 -26
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/connect-apps.8a20501ccb244421.js +0 -36
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/page.d066b77dd3187026.js +0 -65
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/operator-apps.09bf294d753ee9d7.js +0 -115
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/connections-list.97381888bfdd711b.js +0 -642
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/engines-list.d47db60d7dc01ebd.js +0 -73
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/list.a5b273558fb7f0f0.js +0 -156
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/models-list.31d369f1b7ab45da.js +0 -444
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/model-options.73f8d0d54f79d8e3.js +0 -100
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-actions.51fbeac76459433a.js +0 -240
- package/dist/dash/standalone/static/assets/chunks/action-a76e495fb39a73d3.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/agent-pills-4d3c6a2aa9eb1522.js +0 -2
- package/dist/dash/standalone/static/assets/chunks/agent-settings-form-f7231a66e391f6b6.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/agent-toggle-d7d27123f2070f18.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/agents-grid-185ecb3d86c6c447.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-56ebf36d63400423.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-a686289a79f64bae.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-data-f46a9bc7a14b4f9a.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/connect-apps-696726aedab42c96.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/connections-list-07559f145f3e3da3.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-426b0a5871ee41dd.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/credentials-list-f07d090410104148.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/custom-range-6618f32ef6cd4e80.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/editor-0860e370cbfc6b03.js +0 -6
- package/dist/dash/standalone/static/assets/chunks/engines-list-31b9bb7885924b05.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/format-a27067f0186e78ac.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-06b63e558f879da5.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-2d9fbcbfadac4f40.js +0 -2
- package/dist/dash/standalone/static/assets/chunks/list-2773686bf8df64c7.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/model-options-8d2170eebe0d061d.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/models-list-03611e64b6a07efe.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/notice-d14fdac28139c0a8.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-d3ba8ef89c59f801.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-2a71c62b9f7eaef3.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-70600c9943320152.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/runners-list-edf536eb8003eab5.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/secrets-list-e86122f73525ff95.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-6e12333f12903a62-2.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-b281027d465e004f.js +0 -5
- package/dist/dash/standalone/static/assets/chunks/shared-init-c3bd249cf1eca6d1.js +0 -2
- package/dist/dash/standalone/static/assets/chunks/side-toggle-9b3af821cfe4c824.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/task-a37e7c26e82eb77d.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/task-actions-705395565f2d83b8.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/task-view-cb21169f38b56d15.js +0 -6
- package/dist/dash/standalone/static/assets/chunks/tasks-list-d7dccfd7e0623ae0.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/versions-list-f8f2e71df691efda.js +0 -1
- package/dist/dash/standalone/static/assets/connect-a550b6f3a8c00186.css +0 -1
- package/dist/dash/standalone/static/assets/create-param-id-c2c756f652f2fc30.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-account-702f8a1b213e4026.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-aad2f9f93c06e9ab.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-new-f9dcbcec36586f2b.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-8ff47f5d622c1f9b.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-edit-907036d553cfeb36.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-5cc77badad15f00c.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-settings-705d7c15868b4fd6.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-tasks-04e189c045098772.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-76fcd1ce7b3dae71.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-eccb6bb9297a53e6.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-operator-635a121f7a9a95bd.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-settings-a3297dc4d9e0c961.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-settings-param-tab-bcb06f81d9e8268d.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-setup-df4be8b188b9777f.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-16f9866a1b4801cd.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-param-id-02ae551dcd852b57.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-usage-f2175403069aab99.css +0 -1
- package/dist/dash/standalone/static/assets/global-e1de614478b64717.css +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-0dc829ba60df5c26.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-14d191f7f1da6602.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-169eaa63783b71fd.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-1e34cfefafa70fac.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-285d61f00a80f40b.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-35b89c3ba23ee845.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-6c42784e005d4b87.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-6cd93f9bd4cf6ffd.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-7355f473fade532d.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-815c3c297f75efb0.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-87fe73c10a4dc33c.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-98b56a142d441260.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-b4bafe68a40f720b.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-bf61ff39bdc0db48.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-c9fa86c244813f74.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-d2e7a75e16221224.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-d34e774405ea8da8.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-d511822afdb41d1d.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-e113aa2f25ecfe01.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-eb62f461d0c32266.js +0 -1
- package/dist/discover-CHfF4cEz.js +0 -1
- package/dist/dist-node-Bv1kCqyi.js +0 -20
- package/dist/docs-KHc0_gFX.js +0 -2
- package/dist/drive-Bwl7Bjme.js +0 -1
- package/dist/env-6Y-NNnYD.js +0 -1
- package/dist/errors-DO_IltpP.js +0 -16
- package/dist/exec-BmTa0vcO.js +0 -4
- package/dist/executor-ufWRqhdS.js +0 -11
- package/dist/http-Cg8PSe-c.js +0 -1
- package/dist/integrations-I7fRDk_l.js +0 -4
- package/dist/load-BDlEFetB.js +0 -2
- package/dist/local-COlczLwI.js +0 -5
- package/dist/log-view-CfX9lakH.js +0 -4
- package/dist/maintenance-CKCIWOvn.js +0 -1
- package/dist/match-CufHAZQH.js +0 -1
- package/dist/mcp-BkwmRHI9.js +0 -2
- package/dist/mcp-CGU7aoJ-.js +0 -1
- package/dist/mcp-DAHbhfUh.js +0 -13
- package/dist/models-CzggS7p2.js +0 -1
- package/dist/output-SNqdgh9A.js +0 -17
- package/dist/permission-MWFjKxqX.js +0 -1
- package/dist/prompt-CIx4jwQF.js +0 -8
- package/dist/refresh-CxsaX5R9.js +0 -1
- package/dist/remote-C9Hj2cby.js +0 -2
- package/dist/remote-HUZCWgfl.js +0 -3
- package/dist/runner-DYysY1-G.js +0 -1
- package/dist/runners-CfaGE0nV.js +0 -36
- package/dist/serve-DdAdw7Su.js +0 -4
- package/dist/serve-NQykWAKV.js +0 -1
- package/dist/serve-vKNqVaVy.js +0 -12
- package/dist/slack-BtKvW_4v.js +0 -5
- package/dist/task-CFxs0E_J.js +0 -1
- package/dist/task-iuYQ0zAK.js +0 -7
- package/dist/tools-B6ZxcqRi.js +0 -2
- package/dist/tools-FVop8XYG.js +0 -1
- package/dist/tools-search-kjKKolwp.js +0 -1
- package/dist/turn-DQ13lkPF.js +0 -2
- package/dist/types-DPtbvoo3.js +0 -1
- package/dist/types-DmThhjcW.js +0 -1
- package/dist/views-CMHXBMJp.js +0 -3
- package/dist/wire-C9CupY_A.js +0 -1
- package/dist/worker-BQpx1dPr.js +0 -9
- package/dist/worker-sTJL2eoe.js +0 -1
- package/dist/zod-BoqHoRCH.js +0 -1
- package/docs/access.md +0 -33
- package/docs/mcp.md +0 -54
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/core/{errors.1bd0542d832ae0c0.js → errors.200335e62a9d9564.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.061f6006f2685f5e.css.pnext-asset.js → page.abe7a6d16eb15c41.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.107e622830bff31d.css.pnext-asset.js → page.1c7947d6f79d6447.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{settings/agent-settings-form.ca926c58d15044aa.css.pnext-asset.js → platforms/platform-step.a722e3b8539a0f85.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/{agent/instructions.446bccc375f30eeb.css.pnext-asset.js → [slug]/(tabs)/settings/agent-settings-form.bf5430862c505c55.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/{editor/editor.1eb1bce282b289c9.css.pnext-asset.js → [slug]/platforms/[app]/@/app/dash/[org]/agents/[slug]/(tabs)/platforms/page.db05694ed4113dab.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.a4efa8d807fe5416.css.pnext-asset.js → agents/[slug]/platforms/[app]/app-cards.d2f5c8d620066e05.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{settings/[tab]/@/app/dash/[org]/setup/outcome.3ad5f7ec67e5238d.css.pnext-asset.js → agents/agent/instructions.4c31196fcbf9846c.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{settings/[tab]/connections-list.46786fe36b121a43.css.pnext-asset.js → agents/editor/editor.6b9a1d5c0a490153.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{settings/[tab]/credentials-list.f7c27f170ec1e868.css.pnext-asset.js → layout.52abe52dcfa736d7.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{engines-list.9927d602ebe9e7fc.css.pnext-asset.js → advanced-list.819e410e4178b328.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.8cbee173a5aff98d.css.pnext-asset.js → connections-list.87962937438296f1.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.53c7ea80b6fb734c.css.pnext-asset.js → credentials-list.973f91751525bcb6.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{tasks/[id]/task-view.42337a0d7c6ad0b6.css.pnext-asset.js → settings/[tab]/list.69d1b62c4066015b.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{tasks/composer.5b8687662e1629fa.css.pnext-asset.js → settings/[tab]/models-list.efd3f5781314c1d9.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{tasks/list/tasks-list.2f90c4410f843fff.css.pnext-asset.js → settings/[tab]/runners-list.df35d33aba0c8b07.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{globals.f8ac779f0ebf888b.css.pnext-asset.js → dash/[org]/settings/model-pick.74fababc0cc0bba7.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{responsive.ebc5f7d77b4b86a0.css.pnext-asset.js → dash/[org]/tasks/[id]/task-view.440367ae07204ee7.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/frame/task-toasts.d13d9f628e530552.css.pnext-asset.js → app/dash/[org]/tasks/composer.33d49ad218253703.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/badge.0cb1513f8b077560.css.pnext-asset.js → app/dash/[org]/tasks/list/pending-approvals.07e59a9cae7ccf29.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/button.d7f4433f4e7faa80.css.pnext-asset.js → app/dash/[org]/tasks/list/tasks-list.f3737549b4696cc8.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/card.f80288cc42f9bcae.css.pnext-asset.js → app/globals.3b53a3feaa1d72e1.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/filter.b53f21acc3e2cfef.css.pnext-asset.js → app/responsive.2979ffa0161a5afd.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/{ui/menu.25b184f68cba7b46.css.pnext-asset.js → frame/task-toasts.682322f6f729b33e.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{toolbar.19e1ce5224a23acf.css.pnext-asset.js → badge.8e2a9842b28f44a6.css.pnext-asset.js} +0 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import{Ea as e}from"./args-CJsHYWbt.js";import{dt as t,ft as n,t as r,vt as i}from"./state-CxAUec80.js";import{n as a,x as o,y as s}from"./approvals-C8XV7CK2.js";import{c,l}from"./view-D-rbQ1Kz.js";import"./turn-eI4iRPsq.js";import{C as u,K as d,S as f,_ as p,b as m,d as ee,f as h,g,h as te,ht as _,m as v,p as y,u as b,v as ne,w as x,x as re,y as S}from"./drizzle-orm-CYU7WOQS.js";import{agent as C,agentVersion as w,approvalPost as T,c as ie,chatItem as ae,chatState as E,connection as oe,engineCredential as D,integrationApp as se,integrationAppInstallation as ce,platformLink as O,privateSpace as k,runner as A,secret as j,spaceMember as M,task as N,taskHistory as le,taskInbox as P,taskLog as F,taskSecret as I,taskTombstone as ue,workspace as L}from"./schema.js";import{At as de,Gt as fe,It as pe,Nt as me,Zt as he,ar as ge,cr as _e,ht as ve,kt as ye,lr as be,mt as xe,pt as Se,qt as Ce,sr as we,ur as Te,vt as Ee}from"./apps-BORri-28.js";import{S as De,T as Oe,l as ke,s as Ae,w as je,x as Me}from"./local-BzMvgiwL.js";import{i as R,r as z}from"./client-nBo9Mhsr.js";import{C as Ne,S as Pe,T as Fe,_ as B,a as V,b as Ie,c as H,d as U,f as Le,h as Re,i as W,l as G,m as ze,n as Be,o as K,p as q,r as Ve,s as J,u as Y,v as X,w as He,x as Ue,y as We}from"./shared-BzNReirj.js";import{createHash as Ge,randomBytes as Ke,randomUUID as qe}from"node:crypto";import{isDeepStrictEqual as Je}from"node:util";const Z=ie(W,`shared_app`),Q=ie(j,`installation_secret`),$=(e,t,n)=>K({id:e.key,integration:e.integration,agent:e.agent,name:e.name,agentsRepo:e.agentsRepo,branch:e.branch,builtin:e.organizationId===``||void 0,shared:n,credentials:t,createdAt:U(e.createdAt)});function Ye(e){let t=W;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({row:t,credentials:j.value,sharedKey:Z.key}).from(t).innerJoin(j,y(j.id,t.credentialsSecretId)).leftJoin(Z,y(Z.id,t.sharedAppId)).where(h(e.mine(t.organizationId),n)).orderBy(b(t.key));return(await(r===void 0?i:i.limit(r))).map(({row:e,credentials:t,sharedKey:n})=>({id:e.key,value:$(e,t,n)}))},put:(n,r)=>e.transaction(`app:${n}`,async e=>{let[i]=await e.db.select({secretId:t.credentialsSecretId,sharedAppId:t.sharedAppId,credentials:j.value}).from(t).innerJoin(j,y(j.id,t.credentialsSecretId)).where(h(e.mine(t.organizationId),y(t.key,n))),[a]=r.shared?await e.db.select({id:t.id,secretId:t.credentialsSecretId}).from(t).where(h(y(t.organizationId,``),y(t.key,r.shared))):[];if(r.shared&&!a)throw Error(`No shared app ${r.shared}`);let o=i&&!i.sharedAppId?i.secretId:void 0,s=a?.secretId??o??await Be(e.db,r.credentials);o!==void 0&&i?.credentials!==r.credentials&&await Re(e.db,o,r.credentials);let c={integration:r.integration,agent:r.agent,name:r.name,agentsRepo:r.agentsRepo??null,branch:r.branch??null,credentialsSecretId:s,sharedAppId:a?.id??null,createdAt:V(r.createdAt),updatedAt:e.at()};await e.db.insert(t).values({organizationId:e.organizationId,key:n,...c}).onConflictDoUpdate({target:[t.organizationId,t.key],set:c}),i&&i.secretId!==s&&await J(e.db,[i.secretId])}),delete:n=>e.transaction(`app:${n}`,async e=>{let r=await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.key,n))).returning({secretId:t.credentialsSecretId});await J(e.db,r.map(e=>e.secretId))})}}function Xe(e,t,n){return K({id:e.key,app:t.key,integration:t.integration,account:e.account,token:n,installer:e.installer,self:e.self,covers:e.covers,repos:e.repos,createdAt:U(e.createdAt),deletedAt:e.deletedAt?U(e.deletedAt):void 0,uninstalled:e.uninstalled||void 0})}function Ze(e,t,n){let r=n.app.split(`/`)[0],i=[t.slice(n.app.length+1),...n.covers??[]],a=_`array[${_.join(i.map(e=>_`${e}`),_`, `)}]::text[]`;return e.transaction(`binding:${r}`,async e=>{let[n]=await e.db.select({id:Y.id}).from(Y).innerJoin(W,y(W.id,Y.appId)).where(h(x(p(Y.platformInstallId,i),_`${Y.covers} ?| ${a}`),S(Y.deletedAt),u(Y.key,t),x(y(W.key,r),_`left(${W.key}, ${r.length+1}) = ${`${r}/`}`))).limit(1);if(n)throw new De(`Installation "${t}" is bound through another app.`)})}function Qe(e){let t=Y;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({row:t,app:{key:W.key,integration:W.integration},token:j.value}).from(t).innerJoin(W,y(W.id,t.appId)).leftJoin(j,y(j.id,t.tokenSecretId)).where(h(e.mine(t.organizationId),n)).orderBy(b(t.key));return(await(r===void 0?i:i.limit(r))).map(({row:e,app:t,token:n})=>({id:e.key,value:Xe(e,t,n)}))},put:(n,r)=>e.transaction(`installation:${n}`,async e=>{let[i]=await e.db.select({row:t,token:j.value,appKey:W.key,parent:_`(select id from ${W} where organization_id in (${e.organizationId}, ${``}) and key = ${r.app} order by organization_id desc limit 1)`}).from(_`(select 1) as anchor`).leftJoin(t,y(t.key,n)).leftJoin(W,y(W.id,t.appId)).leftJoin(j,y(j.id,t.tokenSecretId)),a=i?.row,o=()=>Error(`Installation "${n}" belongs to another workspace.`);if(a&&a.organizationId!==e.organizationId)throw o();if(!i?.parent)throw Error(`Unknown app "${r.app}".`);r.deletedAt===void 0&&(!a||i.appKey!==r.app||a.deletedAt!==null||JSON.stringify(a.covers??[])!==JSON.stringify(r.covers??[]))&&await Ze(e,n,r);let s=a?.tokenSecretId??null;r.token&&(s?i.token!==r.token&&await Re(e.db,s,r.token):s=await Be(e.db,r.token));let c={appId:i.parent,platformInstallId:n.slice(r.app.length+1),account:r.account,tokenSecretId:r.token?s:null,installer:r.installer??null,self:r.self??null,covers:r.covers??null,repos:r.repos??null,createdAt:V(r.createdAt),updatedAt:e.at(),deletedAt:r.deletedAt===void 0?null:V(r.deletedAt),uninstalled:r.uninstalled??null},[l]=await e.db.insert(t).values({organizationId:e.organizationId,key:n,...c}).onConflictDoUpdate({target:t.key,set:c,setWhere:e.mine(t.organizationId)}).returning({id:t.id});if(!l)throw o();r.token||await J(e.db,[a?.tokenSecretId])}),delete:n=>e.transaction(`installation:${n}`,async e=>{let r=await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.key,n))).returning({secretId:t.tokenSecretId});await J(e.db,r.map(e=>e.secretId))})}}async function $e(e,t){let n=ie(Y,`locked`),[r]=await e.db.select({row:n,app:{key:W.key,integration:W.integration},token:j.value}).from(n).innerJoin(W,y(W.id,n.appId)).leftJoin(j,y(j.id,n.tokenSecretId)).where(h(e.mine(n.organizationId),y(n.key,t))).for(`update`,{of:n});return r&&Xe(r.row,r.app,r.token)}const et=(e,t)=>K({...ze(t),owner:e.owner,account:e.account,createdAt:U(e.createdAt)}),tt=(e,t)=>`credential:${JSON.stringify([e.organizationId,t??null])}`;async function nt(e,t){let n=D;return(await e.db.select({row:n,sealed:j.value}).from(n).innerJoin(j,y(j.id,n.secretId)).where(h(e.mine(n.organizationId),t?y(n.owner,t):S(n.owner))).orderBy(b(n.label)).for(`update`)).map(({row:e,sealed:t})=>({id:Ce(e.owner??void 0,e.label),value:et(e,t),row:e}))}async function rt(e,t,n,r){let i=D;if(!r){t&&(await e.db.delete(i).where(y(i.id,t.row.id)),await J(e.db,[t.row.secretId]));return}let a=Le(r),o={account:r.account??null,createdAt:r.createdAt===void 0?t?.row.createdAt??e.at():V(r.createdAt),updatedAt:e.at()};if(t){Le(t.value)!==a&&await Re(e.db,t.row.secretId,a),await e.db.update(i).set(o).where(y(i.id,t.row.id));return}let{owner:s,name:c}=he(n);await e.db.insert(i).values({organizationId:e.organizationId,owner:s??null,label:c,secretId:await Be(e.db,a),...o})}function it(e){let t=D,n=(t,n)=>{let{owner:r}=he(t);return e.transaction(tt(e,r),async e=>rt(e,(await nt(e,r)).find(e=>e.id===t),t,n))};return{key:_`coalesce(${t.owner} || '/', '') || ${t.label}`,rows:async(n,r)=>{let i=e.db.select({row:t,sealed:j.value}).from(t).innerJoin(j,y(j.id,t.secretId)).where(h(e.mine(t.organizationId),n)).orderBy(b(_`coalesce(${t.owner} || '/', '') || ${t.label}`));return(await(r===void 0?i:i.limit(r))).map(({row:e,sealed:t})=>({id:Ce(e.owner??void 0,e.label),value:et(e,t)}))},put:(e,t)=>n(e,t),delete:e=>n(e,null)}}const at=e=>e.secret,ot=e=>{let t=G(D,e);return{id:Ce(t.owner??void 0,t.label),value:et(t,at(e))}},st=e=>{let t=G(A,e);return{id:t.publicId,value:vt(t,at(e))}},ct=e=>{let t=G(W,e.app);return{installation:Xe(G(Y,e.row),t,e.token),app:$(t,e.credentials)}};function lt(e,t,n,r){let i=E,a=t.map(t=>`${H(X(e,`snapshot`,Oe(t)))}%`),o=[...t,...n].map(t=>X(e,`snapshot`,je(t)));return _`(select coalesce(jsonb_object_agg(${i.key}, ${i.value}), '{}'::jsonb) from ${i}
|
|
2
|
+
where (${i.expiresAt} is null or ${i.expiresAt} > clock_timestamp()) and (${i.key} like any(${_.param(a)}::text[])
|
|
3
|
+
or ${i.key} in (select unnest(${_.param(o)}::text[])${r?_` union all ${r}`:_``})))`}function ut(e,t){let n=We(e,`snapshot`),r={held:new Map,drops:new Map};for(let[e,i]of Object.entries(t)){let t=e.slice(n.length);t.startsWith(`token-drop:`)?r.drops.set(t,i.drop):r.held.set(t,i)}return r}function dt(e){let t=_`coalesce((${E.value}->>'version')::bigint, jsonb_array_length(${E.value}->'messages') + (${E.value}->>'more')::bigint)`,n=_`greatest(coalesce((${E.value}->>'acknowledged')::bigint, 0), least(${e}, ${t}))`;return _`(select ${E.value} || jsonb_build_object('version', ${t}, 'acknowledged', ${n},
|
|
4
|
+
'messages', remaining, 'more', ${t} - ${n} - jsonb_array_length(remaining))
|
|
5
|
+
from (select coalesce(jsonb_agg(item order by n) filter (where coalesce((item->>'sequence')::bigint, n) > ${n}), '[]'::jsonb) as remaining
|
|
6
|
+
from jsonb_array_elements(${E.value}->'messages') with ordinality e(item,n)) as pending)`}function ft(e,t){let n=E,r=We(e.organizationId,t),i=n.key;return{key:i,where:e=>h(e.id===void 0?_`${n.key} like ${`${H(r+(e.prefix??``))}%`}`:y(n.key,r+e.id),e.after===void 0?void 0:v(n.key,r+e.after)),rows:async(t,a)=>{let o=e.db.select({id:i,value:_`${n.value}`}).from(n).where(h(_`${n.key} like ${`${H(r)}%`}`,e.live(n.expiresAt),t)).orderBy(b(n.key));return(await(a===void 0?o:o.limit(a))).map(e=>({id:e.id.slice(r.length),value:e.value}))},put:async(i,a,o)=>{let s=t===`login`?o??e.at():o,c=e.db.insert(n).values({key:r+i,value:a,expiresAt:s}).onConflictDoUpdate({target:n.key,set:{value:a,expiresAt:t===`login`&&!o?_`${n.expiresAt}`:s}}),l=t===`delivery`&&i.startsWith(`connection-authorized:`)?e.notification(t,i):void 0;await(l?c.returning(l):c)},delete:async t=>{await e.db.delete(n).where(y(n.key,r+t))}}}function pt(e){let t=T,n=e=>e===void 0?null:V(e);return{key:t.key,where:e=>h(e.id===void 0?m(t.key,`${H(e.prefix??``)}%`):y(t.key,e.id),e.after===void 0?void 0:v(t.key,e.after)),rows:async(n,r)=>{let i=e.db.select({id:t.key,value:t.value}).from(t).where(h(e.mine(t.organizationId),e.live(t.expiresAt),n)).orderBy(b(t.key));return await(r===void 0?i:i.limit(r))},put:async(r,i,a)=>{let o={value:i,at:V(i.at),shownAt:i.shownAt?V(i.shownAt):null,retryAt:n(i.retryAt),expiresAt:a};await e.db.insert(t).values({organizationId:e.organizationId,key:r,...o}).onConflictDoUpdate({target:[t.organizationId,t.key],set:o})},delete:async n=>{await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.key,n)))}}}function mt(e){let t=L;return{key:t.organizationId,where:()=>_`${t.config} is not null`,rows:async()=>{let[n]=await e.db.select({value:t.config}).from(t).where(h(e.mine(t.organizationId),_`${t.config} is not null`));return n?[{id:`workspace`,value:n.value}]:[]},put:async(n,r)=>{await e.db.insert(t).values({organizationId:e.organizationId,config:r}).onConflictDoUpdate({target:t.organizationId,set:{config:r}})},delete:async()=>{await e.db.update(t).set({config:null}).where(e.mine(t.organizationId))}}}const ht=(e,t)=>t===null?e:{...e,secret:t},gt=(e,t)=>`app:${e.organizationId}:connection:${t}`;function _t(e){let t=oe;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({id:t.key,record:t.record,sealed:j.value}).from(t).leftJoin(j,y(j.id,t.secretId)).where(h(e.mine(t.organizationId),n)).orderBy(b(t.key));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.id,value:ht(e.record,e.sealed)}))},put:(n,r)=>e.transaction(gt(e,n),async e=>{let{secret:i,...a}=r,[o]=await e.db.select({secretId:t.secretId,sealed:j.value}).from(t).leftJoin(j,y(j.id,t.secretId)).where(h(e.mine(t.organizationId),y(t.key,n))),s=o?.secretId??null;i&&(s?o.sealed!==i&&await Re(e.db,s,i):s=await Be(e.db,i));let c={owner:r.owner??null,record:a,secretId:i?s:null};await e.db.insert(t).values({organizationId:e.organizationId,key:n,...c}).onConflictDoUpdate({target:[t.organizationId,t.key],set:c}),i||await J(e.db,[o?.secretId])}),delete:n=>e.transaction(gt(e,n),async e=>{let r=await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.key,n))).returning({secretId:t.secretId});await J(e.db,r.map(e=>e.secretId))})}}const vt=(e,t)=>K({name:e.name,owner:e.owner,kind:e.kind,scope:e.owner?`personal`:`workspace`,config:e.config,createdBy:e.createdBy,default:e.isDefault,lastSeen:e.lastSeen?U(e.lastSeen):void 0,secret:t,createdAt:U(e.createdAt),updatedAt:U(e.updatedAt)});function yt(e){let t=A;return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select({row:t,sealed:j.value}).from(t).innerJoin(j,y(j.id,t.secretId)).where(h(e.mine(t.organizationId),n)).orderBy(b(t.publicId));return(await(r===void 0?i:i.limit(r))).map(({row:e,sealed:t})=>({id:e.publicId,value:vt(e,t)}))},put:(n,r)=>e.transaction(`app:runners:${e.organizationId}`,async e=>{let[i]=await e.db.select({secretId:t.secretId,sealed:j.value}).from(t).innerJoin(j,y(j.id,t.secretId)).where(h(e.mine(t.organizationId),y(t.publicId,n)));i&&i.sealed!==r.secret&&await Re(e.db,i.secretId,r.secret);let a={owner:r.owner??null,name:r.name,kind:r.kind,config:r.config,createdBy:r.createdBy??null,isDefault:r.default,lastSeen:r.lastSeen===void 0?null:V(r.lastSeen),updatedAt:V(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,publicId:n,secretId:i?.secretId??await Be(e.db,r.secret),createdAt:V(r.createdAt),...a}).onConflictDoUpdate({target:[t.organizationId,t.publicId],set:a})}),delete:n=>e.transaction(`app:runners:${e.organizationId}`,async e=>{let r=await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.publicId,n))).returning({secretId:t.secretId});await J(e.db,r.map(e=>e.secretId))})}}const bt=e=>e.split(`:`)[1]??``,xt=e=>/^connection(s|-secrets):/.test(e),St=(e,t,n)=>K(e.startsWith(`connections:`)?{resolvedConnections:t,expiresAt:n&&U(n)}:{secret:t,expiresAt:n&&U(n)});function Ct(e){let t=I,n=t=>h(e.mine(N.organizationId),y(N.publicId,bt(t)));return{key:t.key,rows:async(n,r)=>{let i=e.db.select({id:t.key,sealed:j.value,expiresAt:t.expiresAt}).from(t).innerJoin(N,y(N.id,t.taskId)).innerJoin(j,y(j.id,t.secretId)).where(h(e.mine(N.organizationId),e.live(t.expiresAt),n)).orderBy(b(t.key));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.id,value:St(e.id,e.sealed,e.expiresAt)}))},put:(r,i,a)=>e.transaction(`app:${e.organizationId}:connections:${bt(r)}`,async e=>{let o=`secret`in i?i.secret:`resolvedConnections`in i?i.resolvedConnections:void 0,s=a??(`expiresAt`in i&&i.expiresAt?V(i.expiresAt):null);if(o===void 0)throw Error(`Not a task secret: ${r}`);let[c]=await e.db.select({taskId:N.id,secretId:t.secretId}).from(N).leftJoin(t,h(y(t.taskId,N.id),y(t.key,r))).where(n(r));if(c){if(c.secretId){await Re(e.db,c.secretId,o),await e.db.update(t).set({expiresAt:s}).where(y(t.secretId,c.secretId));return}await e.db.insert(t).values({taskId:c.taskId,key:r,secretId:await Be(e.db,o),expiresAt:s})}}),delete:r=>e.transaction(`app:${e.organizationId}:connections:${bt(r)}`,async e=>{let i=await e.db.delete(t).where(h(y(t.key,r),_`${t.taskId} in (select ${N.id} from ${N} where ${n(r)})`)).returning({secretId:t.secretId});await J(e.db,i.map(e=>e.secretId))})}}var wt=e({DrizzleQueue:()=>Vt});const Tt=(e,t)=>_`('[' || to_json(${e})::text || ',' || to_json(${t}::text)::text || ']:')`,Et=e=>_`(select ${Fe(_`to_jsonb(c)`,_`s.value`)} from ${D} c join ${j} s on s.id = c.secret_id
|
|
7
|
+
where c.organization_id = ${e}.organization_id and coalesce(c.owner || '/', '') || c.label = ${e}.models->0->>'credential')`,Dt=e=>_`(select ${L.config} from ${L} where ${L.organizationId} = ${e})`,Ot=e=>_`coalesce((select jsonb_strip_nulls(jsonb_build_object('slug', ${L.slug}, 'name', ${L.name}))
|
|
8
|
+
from ${L} where ${L.organizationId} = ${e}), '{}'::jsonb)`,kt=e=>_`(select ${Fe(_`to_jsonb(r)`,_`s.value`)} from ${A} r join ${j} s on s.id = r.secret_id
|
|
9
|
+
where r.organization_id = ${e}.organization_id and r.public_id = ${e}.runner_id)`,At=e=>_`(select jsonb_build_object('row', to_jsonb(a), 'credentials', s.value)
|
|
10
|
+
from ${se} a join ${j} s on s.id = a.credentials_secret_id where ${e})`,jt=e=>_`task_secrets as (delete from ${I} where task_id in (${e}) returning secret_id),
|
|
11
|
+
dropped_secrets as (delete from ${j} where id in (select secret_id from task_secrets))`;function Mt(e,t){if(typeof t==`number`)return _`to_jsonb(coalesce(case when jsonb_typeof(${e}) = 'number' then (${e} #>> '{}')::numeric end, 0) + ${t}::numeric)`;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=Object.entries(t).map(([t,n])=>_`${t}::text, ${Mt(_`(${e} -> ${t}::text)`,n)}`);return _`(case when jsonb_typeof(${e}) = 'object' then ${e} else '{}'::jsonb end || jsonb_build_object(${_.join(n,_`, `)}))`}const Nt=e=>_`(case ${e} ${_.join([...ye,...n].map(e=>_`when ${e} then ${_.raw(String(c(e)))}`),_` `)} end)`,Pt=e=>_`date_trunc('milliseconds', ${e})`,Ft=e=>_`${e} collate "C"`,It=x(y(N.status,`waiting`),_`jsonb_path_exists(${N.context}, '$.approvals[*] ? (!(exists(@.response)) || @.response == null)')`),Lt=_`'space:' || ${k.integration} || ':' || ${k.account} || ':' || ${k.space}`,Rt=(e,t)=>_`array(select ${Lt} from ${k} join ${M} on ${M.spaceId} = ${k.id} join ${O} on ${O.platform} = ${k.integration} and ${O.platformUserId} = ${M.member} where ${O.userId} = ${t} and ${k.organizationId} = ${e})`,zt=e=>[b(Nt(e.status)),ee(Pt(e.createdAt)),ee(Ft(e.publicId))],Bt=e=>[b(e.updatedAt),b(Ft(e.publicId))];var Vt=class{db;constructor(e){this.db=e}async metrics(e,t){let n=await this.db.select({status:N.status,total:_`count(*)::int`,recent:_`count(*) filter (where ${N.createdAt} >= ${new Date(t).toISOString()}::timestamptz)::int`}).from(N).where(y(N.organizationId,e)).groupBy(N.status),r={tasks:{queued:0,running:0,waiting:0,completed:0,failed:0,cancelled:0},queueDepth:0};for(let e of n)r.tasks[e.status]=e.recent,e.status===`queued`&&(r.queueDepth=e.total);return r}where(e,t){return h(y(N.organizationId,e),y(N.publicId,t))}fence(e,t,n={}){return h(this.where(e,t),n.generation===void 0?void 0:y(N.generation,n.generation),n.attempts===void 0?void 0:y(N.attempts,n.attempts),n.tokenHash===void 0?void 0:n.tokenHash===null?S(N.tokenHash):y(N.tokenHash,n.tokenHash),n.handle===void 0?void 0:n.handle===null?S(N.handle):y(N.handle,n.handle),n.lastSeenAt===void 0?void 0:n.lastSeenAt===null?S(N.lastSeenAt):y(N.lastSeenAt,new Date(n.lastSeenAt)),n.updatedAt===void 0?void 0:y(N.updatedAt,new Date(n.updatedAt)),n.statuses?p(N.status,n.statuses):void 0,n.unanswered===void 0?void 0:_`not exists (select 1 from jsonb_array_elements(coalesce(${N.context} -> 'approvals', '[]'::jsonb)) as entry where entry ->> 'id' = ${n.unanswered} and jsonb_typeof(entry -> 'response') = 'object')`)}async enqueue(e,t,n,r,i,a){let o=this.insertion(e,t,n,r,i,void 0,a),[s]=await z(this.db,i===void 0?[]:[_`select pg_advisory_xact_lock(1, hashtext(${e}))`],o);if(!s?.allowed)throw Error(`Organization task queue is full`);return!!s.inserted}insertion(e,t,n,r,i,a,o){let s=t.event,{audience:c,space:l}=Te(t),u=new Date(n).toISOString(),d=e=>_`${e===void 0?null:JSON.stringify(e)}::jsonb`,f=t=>X(e,`delivery`,t),p=r?_`
|
|
12
|
+
receipt as (
|
|
13
|
+
insert into ${E} (key, value, expires_at)
|
|
14
|
+
select ${f(r.key)}, ${d({at:n})}, ${new Date(n+r.ttlMs).toISOString()}::timestamptz
|
|
15
|
+
from capacity where allowed ${a?_`and (${a.create} or exists (select 1 from target))`:_``}
|
|
16
|
+
on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at
|
|
17
|
+
where ${E.expiresAt} <= ${u}::timestamptz or ${E.value}->>'owner' = ${r.owner??null}::text
|
|
18
|
+
returning key
|
|
19
|
+
),`:_``,m=_`exists (select 1 from inserted)`,ee=_`on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at`,{conversation:h,unseen:g,secrets:te}=o??{},v=_`${h?_`, remembered as (insert into ${E} (key, value, expires_at)
|
|
20
|
+
select key, value, ${new Date(n+h.ttlMs).toISOString()}::timestamptz from (values
|
|
21
|
+
(${f(h.key)}, ${d(h.record)}), (${f(h.root)}, ${d({at:h.record.at})})) as row(key, value)
|
|
22
|
+
where ${m} ${ee})`:_``}${g?_`, acknowledged as (update ${E} set value = ${dt(g.version)}
|
|
23
|
+
where key = ${f(`since:${g.key}`)} and ${E.value}->>'epoch' is not distinct from ${g.epoch??null}::text
|
|
24
|
+
and (expires_at is null or expires_at > ${u}::timestamptz) and ${m})`:_``}${te?.length?_`, ${nn(te,_`select id from inserted`)}`:_``}`;return _`
|
|
25
|
+
with ${a?_`target as materialized (${a.target}),`:_``} capacity as (
|
|
26
|
+
select ${i===void 0?_`true`:_`(select count(*) from ${N} where organization_id = ${e} and status = 'queued') < ${i} ${r?_`or exists (select 1 from ${E} where key = ${f(r.key)} and expires_at > ${u}::timestamptz and value->>'owner' is distinct from ${r.owner??null}::text)`:_``}`} ${a?_`or exists (select 1 from target) or not ${a.create}`:_``} as allowed
|
|
27
|
+
), ${p} ${a?_`advanced as (
|
|
28
|
+
update ${N} set inbox_seq = inbox_seq + 1, updated_at = ${u}::timestamptz where id in (select id from target) and exists (select 1 from receipt)
|
|
29
|
+
returning id, inbox_seq, generation
|
|
30
|
+
), forwarded as (
|
|
31
|
+
insert into ${P} (task_id, seq, generation, at, kind, value)
|
|
32
|
+
select id, inbox_seq, generation, ${u}::timestamptz, 'steer', ${d({text:a.steer,asker:t.context?.asker??null})} from advanced returning seq
|
|
33
|
+
),`:_``} inserted as (
|
|
34
|
+
insert into ${N} (organization_id, public_id, source, status, agent, flow, runner_kind, access,
|
|
35
|
+
installation_id, event, audience, space, parent, connections, models, name, cwd, prompt, args, mcp, append_system, add_dirs, author, definition, requested_by,
|
|
36
|
+
runner_id, engine_settings, tools, context, files, failure_reply, notice, task_url, settings_url, attempts, created_at, updated_at)
|
|
37
|
+
select ${e}, ${t.id}, ${t.source}, 'queued', ${t.agent}, ${t.flow}, ${t.runner}, ${t.access??null},
|
|
38
|
+
${s?_`coalesce((select id from ${ce} where key = ${`${s.appId}:${s.installationId}`} and organization_id = ${e}), 0)`:_`null`},
|
|
39
|
+
${d(s)}, ${c}, ${l??null}, ${t.parent??null}, ${d(t.connections)}, ${d(t.models)},
|
|
40
|
+
${t.name??null}, ${t.cwd??null}, ${t.prompt??null}, ${d(t.args)}, ${d(t.mcp)},
|
|
41
|
+
${t.appendSystem??null}, ${d(t.addDirs)}, ${t.author??null}, ${d(t.definition)},
|
|
42
|
+
${t.requestedBy??null}, ${t.runnerId??null}, ${d(t.usage)}, ${d(t.tools)},
|
|
43
|
+
${d(t.context)}, ${d(t.files)}, ${t.failureReply??null}, ${t.notice??null}, ${t.taskUrl??null}, ${t.settingsUrl??null},
|
|
44
|
+
0, ${u}::timestamptz, ${u}::timestamptz
|
|
45
|
+
from capacity where allowed ${a?_`and ${a.create} and not exists (select 1 from target)`:_``} ${r?_`and exists (select 1 from receipt)`:_``}
|
|
46
|
+
returning id
|
|
47
|
+
)${v} select allowed, exists (select 1 from inserted) as inserted ${a?_`, exists (select 1 from forwarded) as steered`:_``} from capacity`}async deliver(e,t,n,r,i,a,o=!0,s){if(i===void 0)return o&&await this.enqueue(e,t,n,r,a,s)?{taskId:t.id}:{};let c=t.event,l=_`select id from ${N} where organization_id = ${e} and status in ('queued', 'running', 'waiting')
|
|
48
|
+
and agent = ${t.agent} and source = ${t.source} and flow = 'default'
|
|
49
|
+
and event->>'appId' is not distinct from ${c?.appId??null}
|
|
50
|
+
and event->>'installationId' is not distinct from ${c?.installationId??null}
|
|
51
|
+
and event->'chat'->'thread'->>'id' = ${c?.chat?.thread.id||null}
|
|
52
|
+
order by created_at desc, public_id desc limit 1 for update`,u=this.insertion(e,t,n,r,a,{target:l,create:o,steer:i},s),d=[_`select pg_advisory_xact_lock(3, hashtext(${JSON.stringify([e,pe(t)])}))`];a!==void 0&&o&&d.push(_`select pg_advisory_xact_lock(1, hashtext(${e}))`);let[f]=await z(this.db,d,u);if(!f?.allowed)throw Error(`Organization task queue is full`);return f.inserted?{taskId:t.id}:f.steered?{steered:!0}:{}}async claim(e,t,n=!1,r){let i=r===void 0?_`true`:_`(select count(*) from ${N} active where active.organization_id = ${N.organizationId} and active.status in ('running', 'waiting')) < ${r}`;if(!n){let[e]=await R(this.db,()=>q(this.db,_`select exists (select 1 from ${N} where status = 'queued' and ${i})
|
|
53
|
+
and ${t===void 0?_`true`:_`(select count(*) from ${N} where status in ('running', 'waiting')) < ${t}`} as ready`));if(!e?.ready)return}let a=Ke(32).toString(`base64url`),o=_`translate(rtrim(replace(encode(convert_to(format('{"task":%s,"organization":%s,"attempt":%s}',
|
|
54
|
+
to_json(public_id), to_json(organization_id), attempts + 1), 'UTF8'), 'base64'), E'\\n', ''), '='), '+/', '-_') || '.' || ${a}`,s=_`with stamp as materialized (select date_trunc('milliseconds', clock_timestamp()) as at), picked as materialized (
|
|
55
|
+
select id, ${o} as bearer from ${N} where status = 'queued'
|
|
56
|
+
and ${i}
|
|
57
|
+
${t===void 0?_``:_`and (select count(*) from ${N} where status in ('running', 'waiting')) < ${t}`}
|
|
58
|
+
order by created_at, id limit 1 for update
|
|
59
|
+
), claimed as (
|
|
60
|
+
update ${N} set status = 'running', attempts = attempts + 1, logs_complete = null,
|
|
61
|
+
started_at = (select at from stamp), updated_at = (select at from stamp), last_seen_at = (select at from stamp),
|
|
62
|
+
token_hash = translate(rtrim(encode(sha256(convert_to(picked.bearer, 'UTF8')), 'base64'), '='), '+/', '-_')
|
|
63
|
+
from picked where ${N.id} = picked.id returning ${N}.*
|
|
64
|
+
) select to_jsonb(claimed) as record, exists (select 1 from ${N} where status = 'queued' and id <> claimed.id
|
|
65
|
+
and ${r===void 0?_`true`:_`(select count(*) from ${N} active where active.organization_id = ${N.organizationId} and active.status in ('running', 'waiting')) + case when ${N.organizationId} = claimed.organization_id then 1 else 0 end < ${r}`})
|
|
66
|
+
and ${t===void 0?_`true`:_`(select count(*) from ${N} where status in ('running', 'waiting')) + 1 < ${t}`} as more,
|
|
67
|
+
${Et(_`claimed`)} as credential, ${Dt(_`claimed.organization_id`)} as config, ${kt(_`claimed`)} as runner
|
|
68
|
+
from claimed`,[c]=await z(this.db,[_`select pg_advisory_xact_lock(2, 0)`],s);if(!c)return;let l=G(N,c.record);return{organizationId:l.organizationId,status:Ie(l),token:we(l.publicId,l.organizationId,l.attempts,a).token,more:c.more,loaded:{credential:c.credential?ot(c.credential).value:void 0,config:c.config??void 0,runner:c.runner?st(c.runner).value:void 0}}}async authorize(e,t,n,r,i,a={}){let o=new Date(i).toISOString(),s=this.fence(r,e,{tokenHash:t,attempts:n,statuses:a.allowCompleted?[`running`,`waiting`,`completed`,`failed`,`cancelled`]:[`running`,`waiting`]}),c=_`${p(N.status,[`running`,`waiting`])} and (${N.lastSeenAt} is null or ${N.lastSeenAt} < ${new Date(i-15e3).toISOString()}::timestamptz)`,l=this.db.update(N).set({lastSeenAt:new Date(i)}).where(h(s,c)).returning(),u=this.db.select().from(N).where(h(s,_`not exists (select 1 from beaten)`)),d=a.include===`context`,f=!!a.include,m=E,ee=_`touched.organization_id`,g=e=>_`('o:' || ${Tt(ee,`snapshot`)} || ${e})`,te=e=>_`replace(replace(replace(${e}, '\\', '\\\\'), '%', '\\%'), '_', '\\_')`,v=_`(${m.expiresAt} is null or ${m.expiresAt} > ${o}::timestamptz)`,[y]=await q(this.db,_`with beaten as (${l.getSQL()}), touched as (
|
|
69
|
+
select * from beaten union all ${u.getSQL()}
|
|
70
|
+
), target as (
|
|
71
|
+
select i.key, a.key as app from touched, ${ce} i join ${se} a on a.id = i.app_id
|
|
72
|
+
where i.key = touched.event->>'appId' || ':' || (touched.event->>'installationId') and i.organization_id = touched.organization_id and ${d}
|
|
73
|
+
)
|
|
74
|
+
select to_jsonb(touched) as status,
|
|
75
|
+
case when ${d} then ${At(_`a.key = touched.event->>'appId' and a.organization_id in (touched.organization_id, '')`)} end as app,
|
|
76
|
+
case when ${f} then (select jsonb_build_object('row', to_jsonb(i), 'app', to_jsonb(a), 'credentials', cs.value, 'token', ts.value)
|
|
77
|
+
from ${ce} i join ${se} a on a.id = i.app_id join ${j} cs on cs.id = a.credentials_secret_id left join ${j} ts on ts.id = i.token_secret_id
|
|
78
|
+
where i.key = touched.event->>'appId' || ':' || (touched.event->>'installationId') and i.organization_id = touched.organization_id and i.deleted_at is null) end as installation,
|
|
79
|
+
case when ${f} then ${Et(_`touched`)} end as credential,
|
|
80
|
+
case when ${f} then (select coalesce(jsonb_agg(${Fe(_`to_jsonb(c)`,_`s.value`)}), '[]'::jsonb)
|
|
81
|
+
from ${D} c join ${j} s on s.id = c.secret_id where c.organization_id = touched.organization_id
|
|
82
|
+
and (c.owner is null or c.owner = touched.requested_by)) end as credentials,
|
|
83
|
+
case when ${f} then ${Dt(ee)} end as config,
|
|
84
|
+
case when ${d} then ${Ot(ee)} end as workspace,
|
|
85
|
+
case when ${d} then ${kt(_`touched`)} end as runner,
|
|
86
|
+
case when ${f} then jsonb_build_object('rows', coalesce((select jsonb_agg(s.value) from ${I} ts join ${j} s on s.id = ts.secret_id
|
|
87
|
+
where ts.task_id = touched.id and starts_with(ts.key, 'connection-secrets:' || touched.public_id || ':') and ts.expires_at > ${o}::timestamptz), '[]'::jsonb)) end as secrets,
|
|
88
|
+
case when ${d} then (select jsonb_build_object('key', ts.key, 'value', jsonb_build_object('resolvedConnections', s.value, 'expiresAt', (extract(epoch from ts.expires_at) * 1000)::bigint))
|
|
89
|
+
from ${I} ts join ${j} s on s.id = ts.secret_id where ts.task_id = touched.id
|
|
90
|
+
and starts_with(ts.key, 'connections:' || touched.public_id || ':' || touched.generation || ':' || touched.attempts || ':') and ts.expires_at > ${o}::timestamptz limit 1) end as resolved,
|
|
91
|
+
case when ${d} then (select coalesce(jsonb_object_agg(${m.key}, ${m.value}), '{}'::jsonb) from ${m} where ${v} and (
|
|
92
|
+
${m.key} like any (select ${te(g(_`'token:' || key || ':'`))} || '%' from target)
|
|
93
|
+
or ${m.key} in (select ${g(_`'token-drop:' || key`)} from target union all select ${g(_`'token-drop:' || app`)} from target))) end as tokens
|
|
94
|
+
from touched`);if(!y)return;let b=G(N,y.status),ne=(e,t)=>e?t(e):void 0;return{organizationId:b.organizationId,status:Ie(b),...f?{loaded:{installation:ne(y.installation,e=>ct(e).installation),credential:ne(y.credential,e=>ot(e).value),...y.credentials?{credentials:y.credentials.map(ot)}:{},secrets:y.secrets??void 0,config:y.config??void 0,...d?{app:ne(y.app,e=>$(G(se,e.row),e.credentials)),workspace:y.workspace??void 0,runner:ne(y.runner,e=>st(e).value),resolved:ne(y.resolved,e=>({id:e.key,value:e.value})),tokens:ut(b.organizationId,y.tokens??{})}:{}}}:{}}}async touch(e,t,n,r,i,a=!1){return(await this.authorize(t,n,r,e,i,{allowCompleted:a}))?.status}async patchTask(e,t,n,r,i={}){let{answer:a,approvals:o,archivedAt:c,autoArchived:l,lastSeenAt:u,logsComplete:d,resolvedModel:f,...p}=n,[m]=await this.db.transaction(async l=>{let[m]=o?await l.select({context:N.context}).from(N).where(this.where(e,t)).for(`update`):[];return l.update(N).set({...Object.fromEntries(Object.entries(p).map(([e,t])=>[e,t??null])),...o?{context:_`jsonb_set(coalesce(${N.context}, '{}'::jsonb), '{approvals}', ${JSON.stringify(s(m?.context?.approvals??[],o))}::jsonb)`}:{},...Object.hasOwn(n,`logsComplete`)?{logsComplete:d??null}:Object.hasOwn(n,`handle`)?{logsComplete:_`case when ${N.handle} is distinct from ${n.handle??null}::text then null else ${N.logsComplete} end`}:{},...a===void 0?{}:{answer:_`coalesce(${N.answer}, '[]'::jsonb) || ${JSON.stringify([a])}::jsonb`},...f?{engineSettings:_`coalesce(${N.engineSettings}, '{}'::jsonb) || ${JSON.stringify({resolvedModel:f})}::jsonb`}:{},...Object.hasOwn(n,`archivedAt`)?{archivedAt:c===void 0?null:new Date(c)}:{},...Object.hasOwn(n,`lastSeenAt`)?{lastSeenAt:u===void 0?null:new Date(u)}:{},updatedAt:new Date(r)}).where(this.fence(e,t,i)).returning({id:N.id})});return!!m}async setRequestedBy(e,t,n,r){let[i]=await this.db.update(N).set({requestedBy:n,audience:_`case when ${N.audience} = 'dm:' then ${`dm:${n}`} else ${N.audience} end`,updatedAt:new Date(r)}).where(h(this.where(e,t),S(N.requestedBy))).returning({id:N.id});return!!i}async archiveStopped(e,t,i){await this.db.update(N).set({archivedAt:new Date(t),updatedAt:new Date(t)}).where(h(e===void 0?void 0:y(N.organizationId,e),i?p(N.publicId,i):void 0,S(N.archivedAt),p(N.status,[...n]),re(_`coalesce(${N.finishedAt}, ${N.updatedAt})`,_`${new Date(t-r).toISOString()}::timestamptz`)))}async requeue(e,t,n,r={}){let[i]=await this.db.update(N).set({status:`queued`,handle:null,tokenHash:null,lastSeenAt:null,logsComplete:null,updatedAt:new Date(n)}).where(this.fence(e,t,{...r,statuses:[`running`,`waiting`]})).returning({id:N.id});return!!i}connectionLock(e,t){return _`select pg_advisory_xact_lock(3, hashtext(${`app:${e}:connections:${t}`}))`}async deleteTask(e,t,n){let[r]=await z(this.db,[this.connectionLock(e,t)],_`
|
|
95
|
+
with gone as (
|
|
96
|
+
delete from ${N} where ${this.fence(e,t,n)}
|
|
97
|
+
returning id, organization_id, public_id, audience, requested_by
|
|
98
|
+
), marked as (
|
|
99
|
+
insert into ${ue} (organization_id, public_id, audience, requested_by, deleted_at)
|
|
100
|
+
select organization_id, public_id, audience, requested_by, clock_timestamp() from gone
|
|
101
|
+
), ${jt(_`select id from gone`)}
|
|
102
|
+
select count(*)::int as deleted from gone`);return!!r?.deleted}async finish(e,t,n,r,i={}){let a=new Date(r),o=this.db.update(N).set({status:n.status,result:n.result??null,error:n.error??null,tokens:n.tokens??null,lastSeenAt:a,finishedAt:a,updatedAt:a}).where(this.fence(e,t,{...i,statuses:[`queued`,`running`,`waiting`]})).returning({id:N.id}),[s]=await z(this.db,[this.connectionLock(e,t)],_`
|
|
103
|
+
with finished as (${o.getSQL()}), ${jt(_`select id from finished`)}
|
|
104
|
+
select id from finished`);return!!s}async continueTask(e,t,n,r,i){let[a]=await this.db.transaction(async a=>{let[o]=await a.select({context:N.context}).from(N).where(this.where(e,t)).for(`update`),c=n.context&&{...n.context,approvals:s(n.context.approvals??[],o?.context?.approvals??[])};return a.update(N).set({prompt:n.prompt??null,context:c??null,...n.event?{event:n.event}:{},...n.definition?{definition:n.definition}:{},...n.usage?{engineSettings:n.usage}:{},...n.tools?{tools:n.tools}:{},...`files`in n?{files:n.files??null}:{},...`access`in n?{access:n.access??null}:{},...n.models?{models:n.models}:{},...n.runner?{runnerKind:n.runner}:{},...`runnerId`in n?{runnerId:n.runnerId??null}:{},...`failureReply`in n?{failureReply:n.failureReply??null}:{},...`notice`in n?{notice:n.notice??null}:{},status:`queued`,attempts:0,generation:_`${N.generation} + 1`,inboxAck:-1,typingEnded:null,result:null,error:null,tokens:null,handle:null,tokenHash:null,lastSeenAt:null,logCursor:null,logsComplete:null,startedAt:null,finishedAt:null,cancelRequestedAt:null,approval:null,answer:null,archivedAt:null,updatedAt:new Date(r)}).where(this.fence(e,t,{...i,statuses:[`completed`,`failed`,`cancelled`]})).returning({id:N.id})});return!!a}async completeTask(e,t,n,r){let{outcome:i,usage:a}=n,o=new Date(r).toISOString(),s=n.logsComplete?_`, logs_complete = true`:_``,c=n.known?.length?_`, posts as (insert into ${E} (key, value, expires_at)
|
|
105
|
+
select key, ${JSON.stringify({at:r})}::jsonb, expires_at from (values ${_.join(n.known.map(t=>_`(${X(e,`delivery`,t.id)}, ${new Date(r+t.ttlMs).toISOString()}::timestamptz)`),_`, `)}) as row(key, expires_at) where exists (select 1 from finished)
|
|
106
|
+
on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at)`:_``,[l]=await z(this.db,[this.connectionLock(e,t)],_`
|
|
107
|
+
with finished as (
|
|
108
|
+
update ${N} set status = ${i.status}, result = ${JSON.stringify(i.result??null)}::jsonb,
|
|
109
|
+
error = ${i.error??null}, tokens = ${JSON.stringify(i.tokens??null)}::jsonb,
|
|
110
|
+
engine = ${a.engine??null}, model = ${a.model??null}, credential = ${a.credential??null}, runner_ms = coalesce(runner_ms, 0) + ${a.runnerElapsedMs},
|
|
111
|
+
token_count = coalesce(token_count, 0) + ${ve(a.tokens)}, usage_tokens = ${Mt(_`usage_tokens`,a.tokens)},
|
|
112
|
+
last_seen_at = ${o}::timestamptz, finished_at = ${o}::timestamptz, updated_at = ${o}::timestamptz${s}
|
|
113
|
+
where ${this.fence(e,t,{attempts:n.attempts,tokenHash:n.tokenHash,statuses:[`running`,`waiting`]})}
|
|
114
|
+
returning id, generation
|
|
115
|
+
), ${jt(_`select id from finished`)}, inbox as (delete from ${P} where (task_id, generation) in (select id, generation from finished))${c}
|
|
116
|
+
select exists (select 1 from finished) as completed`);return!!l?.completed}async cancel(e,n,r,i={}){let a=new Date(r).toISOString(),[o]=await z(this.db,[this.connectionLock(e,n)],_`
|
|
117
|
+
with cancelled as (
|
|
118
|
+
update ${N} set status = case when status = 'queued' then 'cancelled' else status end,
|
|
119
|
+
finished_at = case when status = 'queued' then ${a}::timestamptz else finished_at end,
|
|
120
|
+
error = case when status = 'queued' then ${t} else error end,
|
|
121
|
+
inbox_seq = case when status = 'queued' then inbox_seq else inbox_seq + 1 end,
|
|
122
|
+
cancel_requested_at = ${a}::timestamptz, updated_at = ${a}::timestamptz
|
|
123
|
+
where ${this.fence(e,n,{...i,statuses:ye})} returning id, generation, inbox_seq, status
|
|
124
|
+
), ${jt(_`select id from cancelled where status = 'cancelled'`)}, message as (
|
|
125
|
+
insert into ${P} (task_id, seq, generation, kind, value, at)
|
|
126
|
+
select id, inbox_seq, generation, 'cancel', 'null'::jsonb, ${a}::timestamptz from cancelled where status in ('running', 'waiting')
|
|
127
|
+
) select exists(select 1 from cancelled) as accepted`);return!!o?.accepted}async cancelRequested(e,t){let[n]=await R(this.db,()=>this.db.select({at:N.cancelRequestedAt}).from(N).where(this.where(e,t)));return!!n?.at}filter(e,t){let n=t.status&&t.status!==`waiting`?[t.status]:t.statuses,r=t.q?.trim(),i=r&&`%${r.replace(/[\\%_]/g,`\\$&`)}%`;return h(y(N.organizationId,e),n?p(N.status,n):void 0,t.status===`waiting`?It:void 0,t.agent?y(N.agent,t.agent):void 0,t.source?y(N.source,t.source):void 0,t.parent?y(N.parent,t.parent):void 0,t.runnerId?y(N.runnerId,t.runnerId):void 0,t.archived===void 0?void 0:t.archived?ne(N.archivedAt):S(N.archivedAt),t.viewer===void 0?void 0:x(y(N.audience,``),y(N.requestedBy,t.viewer.id),t.viewer.spaces?t.viewer.spaces.length?p(N.audience,t.viewer.spaces):void 0:_`${N.audience} = any(${Rt(e,t.viewer.id)})`),i?x(g(_`${N.event}->>'text'`,i),g(N.prompt,i),g(N.agent,i),g(N.publicId,i)):void 0)}pageQuery(e,t){let{before:n}=t,r=t.summary?{publicId:N.publicId,source:N.source,agent:N.agent,flow:N.flow,prompt:N.prompt,access:N.access,requestedBy:N.requestedBy,event:_`case when ${N.event} is not null then jsonb_strip_nulls(jsonb_build_object('integration', ${N.event}->>'integration', 'type', ${N.event}->>'type', 'text', ${N.event}->>'text', 'actor', ${N.event}->'actor')) end`.as(`event`),context:_`jsonb_strip_nulls(jsonb_build_object('user', ${N.context}->'user', 'approvals', ${N.context}->'approvals', 'turns', case when ${N.context}->'turns'->0 is not null then jsonb_build_array(jsonb_build_object('prompt', ${N.context}->'turns'->0->'prompt')) end))`.as(`context`),usage:_`jsonb_strip_nulls(case when coalesce(${N.engineSettings}->>'engine', ${N.engineSettings}->>'model') is not null then jsonb_build_object('engine', ${N.engineSettings}->>'engine', 'model', ${N.engineSettings}->>'model', 'effort', ${N.engineSettings}->>'effort') else jsonb_build_object('model', ${N.definition}->>'model') end || jsonb_build_object('resolvedModel', ${N.engineSettings}->>'resolvedModel'))`.as(`usage`),status:N.status,attempts:N.attempts,approval:N.approval,archivedAt:N.archivedAt,createdAt:N.createdAt,startedAt:N.startedAt,finishedAt:N.finishedAt,lastSeenAt:N.lastSeenAt,updatedAt:N.updatedAt}:d(N),i=this.db.select(r).from(N).where(h(this.filter(e,t),t.since===void 0?void 0:x(v(N.updatedAt,new Date(t.since)),t.sinceId?h(y(N.updatedAt,new Date(t.since)),v(Ft(N.publicId),t.sinceId)):void 0),n?this.after(n):void 0)).orderBy(...t.since===void 0?zt(N):Bt(N));return t.limit===void 0?i:i.limit(t.limit)}after(e){if(`updatedAt`in e)return x(v(N.updatedAt,new Date(e.updatedAt)),h(y(N.updatedAt,new Date(e.updatedAt)),v(Ft(N.publicId),e.id)));let t=_`(${Pt(N.createdAt)}, ${Ft(N.publicId)}) < (${new Date(e.createdAt).toISOString()}::timestamptz, ${e.id})`;return x(v(Nt(N.status),e.rank),h(y(Nt(N.status),e.rank),t))}record(e,t){return t?K({task:K({id:e.publicId,source:e.source,agent:e.agent,flow:e.flow,prompt:e.prompt,access:e.access,requestedBy:e.requestedBy,event:e.event,context:Object.keys(e.context??{}).length?e.context:void 0,usage:Object.keys(e.usage??{}).length?e.usage:void 0}),status:e.status,attempts:e.attempts,approval:e.approval,archivedAt:e.archivedAt?U(e.archivedAt):void 0,createdAt:U(e.createdAt),startedAt:e.startedAt?U(e.startedAt):void 0,finishedAt:e.finishedAt?U(e.finishedAt):void 0,lastSeenAt:e.lastSeenAt?U(e.lastSeenAt):void 0,updatedAt:U(e.updatedAt)}):Ie(e)}async list(e,t={}){return(await R(this.db,()=>this.pageQuery(e,t))).map(e=>this.record(e,t.summary))}async memberSpaces(e,t,n){return n.length?(await R(this.db,()=>this.db.selectDistinct({audience:Lt}).from(k).innerJoin(M,y(M.spaceId,k.id)).innerJoin(O,h(y(O.platform,k.integration),y(O.platformUserId,M.member))).where(h(y(k.organizationId,e),y(O.userId,t),p(Lt,n))))).map(e=>e.audience):[]}async listedSpaces(e,t){return(await R(this.db,()=>this.db.select({integration:k.integration,appId:k.app,installationId:k.installation,account:k.account,kind:k.kind,id:k.space}).from(k).where(h(y(k.organizationId,e),y(k.integration,t.integration),y(k.account,t.account??t.installationId),_`exists (select 1 from ${N} where ${N.organizationId} = ${k.organizationId} and ${N.audience} = ${Lt})`)))).map(({account:e,kind:t,id:n,...r})=>({...r,...e===r.installationId?{}:{account:e},space:{kind:t,id:n}}))}async linkedMembers(e,t){return(await R(this.db,()=>this.db.select({id:O.platformUserId,login:O.login}).from(O).where(h(y(O.platform,t),_`${O.organizations} @> ${JSON.stringify([e])}::jsonb`)))).map(e=>K(e))}async spaceSynced(e,t){let[n]=await R(this.db,()=>this.db.select({syncedAt:k.syncedAt}).from(k).where(this.space(e,t)));return n?.syncedAt?U(n.syncedAt):void 0}async claimSpace(e,t,n,r=!1){let i=new Date(n).toISOString(),[a]=await q(this.db,_`insert into ${k} (organization_id, integration, app, installation, account, kind, space, claimed_at)
|
|
128
|
+
values (${e}, ${t.integration}, ${t.appId}, ${t.installationId}, ${t.account??t.installationId}, ${t.space?.kind??`channel`}, ${t.space?.id??``}, ${i}::timestamptz)
|
|
129
|
+
on conflict (organization_id, integration, account, space) do update set claimed_at = excluded.claimed_at
|
|
130
|
+
where ${r} or ${k.claimedAt} is null or ${k.claimedAt} < ${new Date(n-ge).toISOString()}::timestamptz
|
|
131
|
+
returning id`);return!!a}async saveSpaceMembers(e,t,n,r){let i=h(this.space(e,t),y(k.claimedAt,new Date(r)));if(!n){await this.db.update(k).set({claimedAt:null}).where(i);return}await z(this.db,[],_`
|
|
132
|
+
with saved as (
|
|
133
|
+
update ${k} set synced_at = ${new Date(r).toISOString()}::timestamptz, claimed_at = null
|
|
134
|
+
where ${i} returning id
|
|
135
|
+
), gone as (
|
|
136
|
+
delete from ${M} where space_id = (select id from saved) and member <> all(${_.param(n)}::text[])
|
|
137
|
+
)
|
|
138
|
+
insert into ${M} (space_id, member)
|
|
139
|
+
select saved.id, member from saved, unnest(${_.param(n)}::text[]) as member
|
|
140
|
+
on conflict do nothing`)}async spaceChanged(e,t,n,r){let i=_`select id from ${k} where ${this.space(e,t)}`;if((n.joined||n.left)&&await this.db.update(k).set({claimedAt:null}).where(this.space(e,t)),n.joined&&await this.db.execute(_`insert into ${M} (space_id, member) select id, ${n.joined} from (${i}) as saved on conflict do nothing`),n.left&&await this.db.execute(_`delete from ${M} where space_id in (${i}) and member = ${n.left}`),n.private===void 0)return;let a=_`to_jsonb(${n.private}::boolean)`;await this.db.update(N).set({audience:n.private?_e(t):``,event:_`case when ${N.event}->'space' is not null then jsonb_set(${N.event}, '{space,private}', ${a}) else ${N.event} end`,updatedAt:new Date(r)}).where(h(y(N.organizationId,e),y(N.space,be(t)),_`${N.audience} not like 'dm:%'`)),await this.db.delete(k).where(this.space(e,t))}space(e,t){return h(y(k.organizationId,e),y(k.integration,t.integration),y(k.account,t.account??t.installationId),y(k.space,t.space?.id??``))}async changes(e,t){if(!e.length)return{rows:[],deleted:[]};let n=e.map(e=>e.organizationId),r=t=>{let n=e.flatMap(e=>e[t].map(()=>e.organizationId)),r=e.flatMap(e=>e[t]);return r.length?_`(${N.organizationId}, ${N.publicId}) in (select * from unnest(${_.param(n)}::text[], ${_.param(r)}::text[]))`:void 0},i=r(`ids`)??_`false`,a=r(`fresh`),[o,s]=await Promise.all([R(this.db,()=>this.db.select({organizationId:N.organizationId,publicId:N.publicId,source:N.source,agent:N.agent,flow:N.flow,requestedBy:N.requestedBy,audience:N.audience,parent:N.parent,status:N.status,approval:N.approval,approvals:_`case when ${i} then ${N.context}->'approvals' end`,answer:_`case when ${i} then ${N.answer} end`,result:_`case when ${i} then ${N.result} end`,error:_`case when ${i} then ${N.error} end`,attempts:N.attempts,archivedAt:N.archivedAt,createdAt:N.createdAt,startedAt:N.startedAt,finishedAt:N.finishedAt,updatedAt:N.updatedAt}).from(N).where(x(h(p(N.organizationId,n),v(N.updatedAt,new Date(t))),a))),R(this.db,()=>this.db.select().from(ue).where(h(p(ue.organizationId,n),v(ue.deletedAt,new Date(t)))))]);return{rows:o.map(e=>({organizationId:e.organizationId,status:K({task:K({id:e.publicId,source:e.source,agent:e.agent,flow:e.flow,requestedBy:e.requestedBy,audience:e.audience,parent:e.parent}),status:e.status,approval:e.approval,approvals:Array.isArray(e.approvals)?e.approvals:void 0,answer:Array.isArray(e.answer)?e.answer:void 0,result:e.result,error:e.error,attempts:e.attempts,archivedAt:e.archivedAt&&U(e.archivedAt),createdAt:U(e.createdAt),startedAt:e.startedAt&&U(e.startedAt),finishedAt:e.finishedAt&&U(e.finishedAt),updatedAt:U(e.updatedAt)})})),deleted:s.map(e=>({organizationId:e.organizationId,id:e.publicId,at:U(e.deletedAt),...e.audience===null?{}:{audience:e.audience},...e.requestedBy===null?{}:{requestedBy:e.requestedBy}}))}}async logTails(e,t){if(!e.length)return[];let n=_`(line->>'seq')::int`,r=await R(this.db,()=>q(this.db,_`select tail.n::int as n, ${N.status} as status, ${N.approval} as approval,
|
|
141
|
+
${N.audience} as audience, ${N.requestedBy} as requested_by,
|
|
142
|
+
(select coalesce(jsonb_agg(line order by ${n}), '[]'::jsonb) from (
|
|
143
|
+
select line from ${F} cross join jsonb_array_elements(${F.lines}) line
|
|
144
|
+
where ${F.taskId} = ${N.id} and ${F.seqTo} > tail.after and ${n} > tail.after
|
|
145
|
+
order by ${n} limit ${t}) page) as lines
|
|
146
|
+
from unnest(${_.param(e.map(e=>e.organizationId))}::text[], ${_.param(e.map(e=>e.id))}::text[], ${_.param(e.map(e=>e.after))}::int[])
|
|
147
|
+
with ordinality as tail(organization_id, public_id, after, n)
|
|
148
|
+
join ${N} on ${N.organizationId} = tail.organization_id and ${N.publicId} = tail.public_id`)),i=new Map(r.map(e=>[e.n-1,e]));return e.map((e,t)=>{let n=i.get(t);return n&&{status:K({status:n.status,approval:n.approval,task:K({id:e.id,audience:n.audience,requestedBy:n.requested_by})}),lines:n.lines.map(e=>{let t=l(e.line);return t?{...e,entry:t}:e})}})}countQuery(e,t){return this.db.select({all:_`count(*)::int`.as(`all`),active:_`(count(*) filter (where ${p(N.status,ye)}))::int`.as(`active`),waiting:_`(count(*) filter (where ${It}))::int`.as(`waiting`)}).from(N).where(this.filter(e,t))}async counts(e,t={}){let[n]=await R(this.db,()=>this.countQuery(e,t));return n??{all:0,active:0,waiting:0}}async activeCounts(e){return(await R(this.db,()=>this.db.select({audience:N.audience,requestedBy:N.requestedBy,active:_`count(*)::int`}).from(N).where(h(y(N.organizationId,e),p(N.status,ye),S(N.archivedAt))).groupBy(N.audience,N.requestedBy))).map(e=>K(e))}async listWithCounts(e,t){let n=this.db.$with(`totals`).as(this.countQuery(e,t)),r=this.db.$with(`page`).as(this.pageQuery(e,{...t,limit:t.limit??20})),i=Object.fromEntries(Object.keys(r._.selectedFields).map(e=>[e,r[e]])),a=await R(this.db,()=>this.db.with(n,r).select({...i,all:n.all,active:n.active,waiting:n.waiting}).from(n).leftJoin(r,_`true`).orderBy(...t.since===void 0?zt({status:i.status,createdAt:i.createdAt,publicId:i.publicId}):Bt({updatedAt:i.updatedAt,publicId:i.publicId}))),{all:o=0,active:s=0,waiting:c=0}=a[0]??{};return{items:a.filter(e=>e.publicId!==null&&e.publicId!==void 0).map(e=>this.record(e,t.summary)),counts:{all:o,active:s,waiting:c}}}async runningCount(){let[e]=await R(this.db,()=>this.db.select({value:_`count(*)::int`}).from(N).where(p(N.status,[`running`,`waiting`])));return e?.value??0}async running(){return(await R(this.db,()=>this.db.select({organizationId:N.organizationId,publicId:N.publicId,runner:N.runnerKind,runnerId:N.runnerId,status:N.status,attempts:N.attempts,generation:N.generation,handle:N.handle,tokenHash:N.tokenHash,lastSeenAt:N.lastSeenAt,logsComplete:N.logsComplete,startedAt:N.startedAt,cancelRequestedAt:N.cancelRequestedAt,updatedAt:N.updatedAt}).from(N).where(p(N.status,[`running`,`waiting`])))).map(({organizationId:e,publicId:t,runner:n,runnerId:r,...i})=>({organizationId:e,status:K({...i,task:K({id:t,runner:n,runnerId:r}),lastSeenAt:i.lastSeenAt&&U(i.lastSeenAt),startedAt:i.startedAt&&U(i.startedAt),cancelRequestedAt:i.cancelRequestedAt&&U(i.cancelRequestedAt),updatedAt:U(i.updatedAt)})}))}async appendLogs(e,t,n,r,i,a,o){let s=n.length?_`, inserted as (
|
|
149
|
+
insert into ${F} (task_id, seq_from, seq_to, lines)
|
|
150
|
+
select accepted.id, ${n[0].seq}, ${n[n.length-1].seq}, ${JSON.stringify(n)}::jsonb from accepted
|
|
151
|
+
on conflict (task_id, seq_from) do update set seq_to = excluded.seq_to, lines = excluded.lines
|
|
152
|
+
)`:_``,[c]=await q(this.db,_`
|
|
153
|
+
with accepted as (
|
|
154
|
+
update ${N} set log_cursor = ${i.cursor}, log_seq = ${i.seq}, log_bytes = ${i.bytes}
|
|
155
|
+
where ${this.fence(e,t,o)} and coalesce(log_seq, 0) = ${r.seq} and coalesce(log_cursor, -1) = ${r.cursor}
|
|
156
|
+
returning id
|
|
157
|
+
) ${s} select exists (select 1 from accepted) as accepted`);return!!c?.accepted}async readInbox(e,t,n,r){return(await R(this.db,()=>this.db.select({seq:P.seq,generation:P.generation,at:P.at,kind:P.kind,value:P.value}).from(P).innerJoin(N,y(N.id,P.taskId)).where(h(this.where(e,t),y(N.generation,n),p(N.status,ye),y(P.generation,n),_`${P.seq} > ${r}`)).orderBy(b(P.seq)).limit(100))).map(e=>({...e,at:U(e.at)}))}async appendInbox(e,t,n,r,i,c,l,u){return u?this.db.transaction(async d=>{let[f]=await d.select({context:N.context}).from(N).where(this.where(e,t)).for(`update`);for(let e of u){let t=o(f?.context?.approvals?.find(t=>t.id===e.id),e);if(t)throw new a(t)}let p=s(f?.context?.approvals??[],u);return this.insertInbox(d,e,t,n,r,i,c,l,p)}):this.insertInbox(this.db,e,t,n,r,i,c,l)}async insertInbox(e,t,n,r,i,a,o,s,c){let l=s?_`select key, value from ${E}
|
|
158
|
+
where key = ${X(t,`delivery`,s.key)}
|
|
159
|
+
and value->'sending'->>'owner' = ${s.owner}
|
|
160
|
+
and (expires_at is null or expires_at > ${new Date(a).toISOString()}::timestamptz) for update`:_`select null`,u=s&&me(s),d=u?_`, context = coalesce(${N.context}, '{}'::jsonb) || jsonb_build_object('admissions',
|
|
161
|
+
coalesce(${N.context}->'admissions', '{}'::jsonb) || ${JSON.stringify(u)}::jsonb)`:c?_`, context = jsonb_set(coalesce(${N.context}, '{}'::jsonb), '{approvals}', ${JSON.stringify(c)}::jsonb)`:_``,f=_`(${E.value}->'sending'->>'count')::int`,p=_`coalesce((select n from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n)
|
|
162
|
+
where n <= ${f} and item->>'admission' = ${s?.through??null}::text limit 1), 0)`,[m]=await q(e,_`
|
|
163
|
+
with held as materialized (${l}), next as (
|
|
164
|
+
update ${N} set inbox_seq = inbox_seq + 1, updated_at = ${new Date(a).toISOString()}::timestamptz${d}
|
|
165
|
+
where ${this.fence(t,n,{generation:o,statuses:ye})}
|
|
166
|
+
and exists(select 1 from held) returning id, inbox_seq, generation
|
|
167
|
+
), admitted as (
|
|
168
|
+
insert into ${P} (task_id, seq, generation, kind, value, at)
|
|
169
|
+
select id, inbox_seq, generation, ${r}, ${JSON.stringify(u?{...i,admissions:u}:i??null)}::jsonb, ${new Date(a).toISOString()}::timestamptz from next returning seq
|
|
170
|
+
) ${s?_`, acknowledged as (
|
|
171
|
+
update ${E} set value = (${E.value} - 'sending') || jsonb_build_object(
|
|
172
|
+
'items', coalesce((select jsonb_agg(item order by n) from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n) where n > ${p}), '[]'::jsonb)) ||
|
|
173
|
+
case when ${f} > ${p} then jsonb_build_object('sending',
|
|
174
|
+
(${E.value}->'sending') || jsonb_build_object('count', ${f} - ${p}, 'until', ${a+Me}::bigint)) else '{}'::jsonb end
|
|
175
|
+
where key in (select key from held) and exists(select 1 from admitted)
|
|
176
|
+
)`:_``}
|
|
177
|
+
select (select seq from admitted) as seq, exists(select 1 from held) as held`);if(s&&!m?.held)throw new de;return m?.seq==null?void 0:{seq:m.seq,generation:o,at:a,kind:r,value:i}}async fetchInbox(e,t,n,r,i){let[a]=await R(this.db,()=>q(this.db,_`
|
|
178
|
+
select coalesce(jsonb_agg(jsonb_build_object('seq', i.seq, 'generation', i.generation, 'at', extract(epoch from i.at) * 1000, 'kind', i.kind, 'value', i.value) order by i.seq) filter (where i.seq is not null), '[]'::jsonb) as entries
|
|
179
|
+
from ${N} left join ${P} i on i.task_id = ${N.id} and i.generation = ${N.generation} and i.seq > ${i}
|
|
180
|
+
where ${this.fence(e,t,{tokenHash:n,attempts:r,statuses:[`running`,`waiting`]})} group by ${N.id}`));return a?.entries}async ackInbox(e,n,r,i){if(i.generation!==void 0&&i.generation!==r.generation)return;let[a]=await z(this.db,[this.connectionLock(e,n)],_`
|
|
181
|
+
with current as (
|
|
182
|
+
select id from ${N} where ${this.fence(e,n,{...i,generation:r.generation,statuses:void 0})}
|
|
183
|
+
and inbox_seq >= ${r.seq} and (status in ('running', 'waiting') or (status in ('completed', 'failed', 'cancelled') and inbox_ack >= ${r.seq})) for update
|
|
184
|
+
), applied as (
|
|
185
|
+
delete from ${P} where task_id in (select id from current) and generation = ${r.generation} and seq <= ${r.seq} returning seq, kind, value
|
|
186
|
+
), answers as (
|
|
187
|
+
select jsonb_agg(a.value order by a.seq) as value from jsonb_to_recordset(${JSON.stringify(r.answers??[])}::jsonb) a(seq int, value jsonb)
|
|
188
|
+
where exists (select 1 from applied where applied.seq = a.seq and applied.kind = 'ask')
|
|
189
|
+
), updated as (
|
|
190
|
+
update ${N} set inbox_ack = greatest(inbox_ack, ${r.seq}), answer = coalesce(answer, '[]'::jsonb) || coalesce(answers.value, '[]'::jsonb),
|
|
191
|
+
status = case when exists(select 1 from applied where kind = 'cancel') then 'cancelled'
|
|
192
|
+
when exists(select 1 from applied where kind = 'approve' and value->>'approvalId' = ${N.approval}->>'id') then 'running' else status end,
|
|
193
|
+
approval = case when exists(select 1 from applied where kind = 'approve' and value->>'approvalId' = ${N.approval}->>'id') then null else approval end,
|
|
194
|
+
finished_at = case when exists(select 1 from applied where kind = 'cancel') then now() else finished_at end,
|
|
195
|
+
error = case when exists(select 1 from applied where kind = 'cancel') then ${t} else error end,
|
|
196
|
+
updated_at = now()
|
|
197
|
+
from answers where id in (select id from current) returning id, status
|
|
198
|
+
), ${jt(_`select id from updated where status = 'cancelled'`)}
|
|
199
|
+
select exists (select 1 from current) as accepted, (select status from updated) as status`);return a?.accepted?a.status??void 0:void 0}async pendingInbox(e){return(await R(this.db,()=>this.db.select().from(N).where(h(e===void 0?void 0:y(N.organizationId,e),p(N.status,[`running`,`waiting`]),_`exists (select 1 from ${P} where ${P.taskId} = ${N.id} and ${P.generation} = ${N.generation})`)))).map(e=>({organizationId:e.organizationId,status:Ie(e)}))}};function Ht(e,t,n,r){return e.db.transaction(async i=>{let[a]=await i.insert(C).values({organizationId:e.organizationId,slug:t.id,name:t.name,description:t.description??null,source:t.source,repo:t.repo??null,path:t.path??null,currentVersion:0,createdAt:V(t.createdAt),updatedAt:V(t.updatedAt)}).onConflictDoUpdate({target:[C.organizationId,C.slug],set:{slug:t.id}}).returning(),o=Ve(a);if(r&&o.currentVersion!==r.currentVersion)return;let[s]=o.currentVersion?await i.select().from(w).where(h(y(w.agentId,a.id),y(w.version,o.currentVersion))):[],c=s&&He(s,t.id),l=!!(c&&Je(c.definition,n.definition)&&c.systemPrompt===n.systemPrompt&&Je(c.files,n.files)),u=l?c:{...n,version:o.currentVersion+1},d={...t,currentVersion:u.version,createdAt:o.createdAt,...o.settings?{settings:o.settings}:{},updatedAt:o.updatedAt};if(l&&Je(d,o))return{record:o,version:u,unchanged:l};d={...d,updatedAt:t.updatedAt};let f=l?_``:_`with published as (
|
|
200
|
+
insert into ${w} (agent_id, version, definition, system_prompt, files, commit, imported_from, created_at)
|
|
201
|
+
values (${a.id}, ${u.version}, ${JSON.stringify(u.definition)}::jsonb, ${u.systemPrompt},
|
|
202
|
+
${u.files?JSON.stringify(u.files):null}::jsonb, ${u.commit??null}, ${u.importedFrom}, ${V(u.createdAt).toISOString()}::timestamptz)
|
|
203
|
+
returning version
|
|
204
|
+
)`;return await i.execute(_`${f} update ${C} set
|
|
205
|
+
name = ${d.name}, description = ${d.description??null}, problems = null, source = ${d.source},
|
|
206
|
+
repo = ${d.repo??null}, path = ${d.path??null},
|
|
207
|
+
current_version = ${l?_`${u.version}`:_`(select version from published)`}, updated_at = ${V(d.updatedAt).toISOString()}::timestamptz
|
|
208
|
+
where id = ${a.id}`),{record:d,version:u,unchanged:l}})}function Ut(e){let t=C;return{key:t.slug,rows:async(n,r)=>{let i=e.db.select().from(t).where(h(e.mine(t.organizationId),n)).orderBy(b(t.slug));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.slug,value:Ve(e)}))},put:async(n,r)=>{let i={name:r.name,description:r.description??null,problems:r.problems??null,source:r.source,repo:r.repo??null,path:r.path??null,currentVersion:r.currentVersion,engineSettings:r.settings??null,createdAt:V(r.createdAt),updatedAt:V(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,slug:n,...i}).onConflictDoUpdate({target:[t.organizationId,t.slug],set:i})},delete:async n=>{await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.slug,n)))}}}async function Wt(e,t,n){let r=t.lastIndexOf(`:`);return(await e.db.insert(w).values({agentId:_`(select id from ${C} where organization_id = ${e.organizationId} and slug = ${t.slice(0,r)})`,version:Number(t.slice(r+1)),definition:n.definition,systemPrompt:n.systemPrompt,files:n.files??null,commit:n.commit??null,importedFrom:n.importedFrom,createdAt:V(n.createdAt)}).onConflictDoNothing().returning({id:w.id})).length>0}function Gt(e){let t=w,n=_`${C.slug} || ':' || lpad(${t.version}::text, 6, '0')`;return{key:n,split:(e,n,r)=>h(y(C.slug,e),n===void 0?void 0:r?y(t.version,n):v(t.version,n)),rows:async(r,i)=>{let a=e.db.select({row:t,slug:C.slug,key:n}).from(t).innerJoin(C,y(C.id,t.agentId)).where(h(e.mine(C.organizationId),r)).orderBy(b(C.slug),b(t.version));return(await(i===void 0?a:a.limit(i))).map(({row:e,slug:t,key:n})=>({id:n,value:He(e,t)}))},put:async(t,n)=>{await Wt(e,t,n)},delete:async n=>{let r=n.lastIndexOf(`:`),i=_`(select id from ${C} where organization_id = ${e.organizationId} and slug = ${n.slice(0,r)})`;await e.db.delete(t).where(h(y(t.agentId,i),y(t.version,Number(n.slice(r+1)))))}}}const Kt=(e,t)=>_`(select ${N.id} from ${N} where ${N.organizationId} = ${e.organizationId} and ${N.publicId} = ${t})`;function qt(e){let t=N;return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select().from(t).where(h(e.mine(t.organizationId),n)).orderBy(b(t.publicId));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.publicId,value:Ie(e)}))},put:async(n,r,i,a={})=>{let{task:o}=r,{audience:s,space:c}=Te(o),l={source:o.source,status:r.status,agent:o.agent,flow:o.flow,runnerKind:o.runner,access:o.access??null,installationId:o.event?_`(select id from ${Y} where organization_id = ${e.organizationId} and key = ${`${o.event.appId}:${o.event.installationId}`})`:null,event:o.event??null,audience:s,space:c??null,parent:o.parent??null,connections:o.connections??null,models:o.models??null,name:o.name??null,cwd:o.cwd??null,prompt:o.prompt??null,args:o.args??null,mcp:o.mcp??null,appendSystem:o.appendSystem??null,addDirs:o.addDirs??null,author:o.author??null,definition:o.definition,requestedBy:o.requestedBy??null,runnerId:o.runnerId??null,engineSettings:o.usage??null,tools:o.tools,context:o.context??null,files:o.files??null,failureReply:o.failureReply??null,notice:o.notice??null,taskUrl:o.taskUrl??null,settingsUrl:o.settingsUrl??null,result:r.result??null,error:r.error??null,fallbacks:r.fallbacks??null,tokens:r.tokens??null,handle:r.handle??null,tokenHash:r.tokenHash??null,lastSeenAt:r.lastSeenAt===void 0?null:V(r.lastSeenAt),logCursor:r.logCursor??null,logSeq:r.logSeq??null,logBytes:r.logBytes??null,logsComplete:r.logsComplete??null,archivedAt:r.archivedAt===void 0?null:V(r.archivedAt),approval:r.approval??null,answer:r.answer??null,attempts:r.attempts,generation:r.generation??0,inboxSeq:r.inboxSeq??-1,inboxAck:r.inboxAck?.generation===(r.generation??0)?r.inboxAck.seq:-1,createdAt:V(r.createdAt),startedAt:r.startedAt===void 0?null:V(r.startedAt),finishedAt:r.finishedAt===void 0?null:V(r.finishedAt),cancelRequestedAt:r.cancelRequestedAt===void 0?null:V(r.cancelRequestedAt),updatedAt:V(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,publicId:n,...l}).onConflictDoUpdate({target:[t.organizationId,t.publicId],set:{...l,archivedAt:a.unarchive?l.archivedAt:_`coalesce(${t.archivedAt}, ${l.archivedAt})`}})},delete:async n=>{await e.db.delete(t).where(h(e.mine(t.organizationId),y(t.publicId,n)))}}}async function Jt(e,t){return(await e.db.select({engine:le.engine,conversation:le.conversation,savedAt:le.savedAt}).from(le).innerJoin(N,y(N.id,le.taskId)).where(h(e.mine(N.organizationId),y(N.publicId,t))).orderBy(b(le.savedAt))).map(e=>({...e,savedAt:U(e.savedAt)}))}function Yt(e){let t=le,n=_`${N.publicId} || ':' || ${t.conversation}`,r=e=>[e.slice(0,e.indexOf(`:`)),e.slice(e.indexOf(`:`)+1)];return{key:n,where:({id:n,prefix:i})=>{let[a,o]=r(n??i??``);return h(e.mine(N.organizationId),y(N.publicId,a),n===void 0?void 0:y(t.conversation,o))},rows:async(r,i)=>{let a=e.db.select({row:t,key:n}).from(t).innerJoin(N,y(N.id,t.taskId)).where(r).orderBy(b(t.savedAt));return(await(i===void 0?a:a.limit(i))).map(({row:e,key:t})=>({id:t,value:K({engine:e.engine,conversation:e.conversation,data:e.data,state:e.state,savedAt:U(e.savedAt)})}))},put:async(n,i)=>{let a={engine:i.engine,data:i.data,state:i.state??null,savedAt:V(i.savedAt)};await e.db.insert(t).values({taskId:Kt(e,r(n)[0]),conversation:i.conversation,...a}).onConflictDoUpdate({target:[t.taskId,t.conversation],set:a})},delete:async n=>{let[i,a]=r(n);await e.db.delete(t).where(h(y(t.taskId,Kt(e,i)),y(t.conversation,a)))}}}function Xt(e){let t=F,n=_`(line->>'seq')::int`,r=_`${N.publicId} || ':' || lpad(${n}::text, 6, '0')`;return{key:r,split:(r,i,a)=>h(e.mine(N.organizationId),y(N.publicId,r),i===void 0?void 0:a?te(t.seqTo,i):v(t.seqTo,i),i===void 0?void 0:a?y(n,i):v(n,i)),rows:async(i,a)=>{let o=e.db.select({key:r,line:_`line`}).from(t).innerJoin(N,y(N.id,t.taskId)).innerJoin(_`jsonb_array_elements(${t.lines}) line`,_`true`).where(i).orderBy(b(N.publicId),b(n));return(await(a===void 0?o:o.limit(a))).map(({key:e,line:t})=>({id:e,value:{at:t.at,level:t.level,line:t.line}}))},put:async(t,n)=>{let[r,i]=B(t);await Zt(e,r,[{seq:i,...n}])},delete:async n=>{let[r,i]=B(n);await e.db.update(t).set({lines:_`(select coalesce(jsonb_agg(line), '[]'::jsonb) from jsonb_array_elements(${t.lines}) line where ${i} <> ${i})`}).where(h(y(t.taskId,Kt(e,r)),te(t.seqTo,i),f(t.seqFrom,i)))}}}async function Zt(e,t,n){n.length&&await e.db.insert(F).values({taskId:Kt(e,t),seqFrom:n[0].seq,seqTo:n[n.length-1].seq,lines:n}).onConflictDoUpdate({target:[F.taskId,F.seqFrom],set:{seqTo:_`excluded.seq_to`,lines:_`excluded.lines`}})}function Qt(e){let t=P,n=_`${N.publicId} || ':' || lpad(${t.seq}::text, 8, '0')`;return{key:n,split:(n,r,i)=>h(e.mine(N.organizationId),y(N.publicId,n),r===void 0?void 0:i?y(t.seq,r):v(t.seq,r)),rows:async(r,i)=>{let a=e.db.select({row:t,key:n}).from(t).innerJoin(N,y(N.id,t.taskId)).where(r).orderBy(b(N.publicId),b(t.seq));return(await(i===void 0?a:a.limit(i))).map(({row:e,key:t})=>({id:t,value:{seq:e.seq,generation:e.generation,at:U(e.at),kind:e.kind,value:e.value}}))},put:async(n,r)=>{await e.db.insert(t).values({taskId:Kt(e,n.slice(0,n.lastIndexOf(`:`))),seq:r.seq,generation:r.generation,kind:r.kind,value:r.value,at:V(r.at)})},delete:async n=>{let[r,i]=B(n);await e.db.delete(t).where(h(y(t.taskId,Kt(e,r)),y(t.seq,i)))}}}function $t(e){let t=N;return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select({row:t,installationKey:Y.key}).from(t).leftJoin(Y,y(Y.id,t.installationId)).where(h(e.mine(t.organizationId),ne(t.runnerMs),n)).orderBy(b(t.publicId));return(await(r===void 0?i:i.limit(r))).flatMap(({row:e,installationKey:t})=>{let n=Ue(e,t);return n?[{id:e.publicId,value:n}]:[]})},put:async(n,r)=>{let i=B(n)?.[0]??n;await e.db.update(t).set({engine:r.engine??null,model:r.model??null,credential:r.credential,runnerMs:r.runnerElapsedMs,tokenCount:ve(r.tokens),usageTokens:r.tokens??null,finishedAt:V(r.at)}).where(h(e.mine(t.organizationId),y(t.publicId,i)))},delete:async n=>{await e.db.update(t).set({engine:null,model:null,runnerMs:null,tokenCount:null,usageTokens:null}).where(h(e.mine(t.organizationId),y(t.publicId,n)))}}}var en=e({DrizzleStore:()=>tn,taskSecretRows:()=>nn}),tn=class e{db;organizationId;now;encryption;locks;notifications;recordChannel(e,t){return`record_${Ge(`sha256`).update(JSON.stringify([this.organizationId,e,t])).digest(`hex`).slice(0,48)}`}notification(e,t){return this.notifications?{notified:_`pg_notify(${this.recordChannel(e,t)}, '')`}:void 0}async watch(e,t){let n=i(),r=this.db.$client,a=r?.listen?await r.listen(this.recordChannel(e,t),n.notify,n.notify).catch(()=>void 0):void 0;return{...n,close(){a?.unlisten().catch(()=>{}),n.close()}}}publishAgent=(e,t,n)=>Ht(this,e,t,n);kinds;constructor(e,t,n=Date.now,r={},i,a=!!e.$client?.unsafe){this.db=e,this.organizationId=t,this.now=n,this.encryption=r,this.locks=i,this.notifications=a,this.kinds={agent:Ut(this),agentversion:Gt(this),app:Ye(this),installation:Qe(this),credential:it(this),task:qt(this),history:Yt(this),tasklog:Xt(this),inbox:Qt(this),usage:$t(this),delivery:ft(this,`delivery`),login:ft(this,`login`),config:mt(this),runner:yt(this),snapshot:ft(this,`snapshot`),connection:_t(this)},this.posts=pt(this),this.secrets=Ct(this)}posts;secrets;kind(e,t){return e===`delivery`&&t?.startsWith(`approval:`)?this.posts:e===`snapshot`&&t&&xt(t)?this.secrets:this.kinds[e]}static async webhookTarget(e,t,n){let[r]=await R(e,()=>e.select({app:W,credentials:j.value,installation:Y,token:Q.value}).from(W).innerJoin(j,y(j.id,W.credentialsSecretId)).leftJoin(Y,h(y(Y.appId,W.id),y(Y.key,n??``),S(Y.deletedAt))).leftJoin(Q,y(Q.id,Y.tokenSecretId)).where(y(W.key,t)));if(r&&!r.installation&&n){let r=`${t}/`,[i]=await R(e,()=>e.select({app:W,credentials:j.value,installation:Y,token:Q.value}).from(Y).innerJoin(W,y(W.id,Y.appId)).innerJoin(j,y(j.id,W.credentialsSecretId)).leftJoin(Q,y(Q.id,Y.tokenSecretId)).where(h(_`left(${W.key}, ${r.length}) = ${r}`,y(Y.platformInstallId,n.slice(t.length+1)),S(Y.deletedAt))).limit(1));if(i)return{organizationId:i.app.organizationId,app:$(i.app,i.credentials),bound:{organizationId:i.installation.organizationId,installation:Xe(i.installation,i.app,i.token)}}}return r&&{organizationId:r.app.organizationId,app:$(r.app,r.credentials),...r.installation?{bound:{organizationId:r.installation.organizationId,installation:Xe(r.installation,r.app,r.token)}}:{}}}static async appRecord(e,t){let[n]=await R(e,()=>e.select({row:W,credentials:j.value}).from(W).innerJoin(j,y(j.id,W.credentialsSecretId)).where(y(W.key,t)));return n&&{organizationId:n.row.organizationId,app:$(n.row,n.credentials)}}static async apps(e,t){return(await R(e,()=>e.select({row:W,credentials:j.value}).from(W).innerJoin(j,y(j.id,W.credentialsSecretId)).where(y(W.integration,t)))).map(({row:e,credentials:t})=>({organizationId:e.organizationId,app:$(e,t)}))}static async installationOrganization(e,t){let[n]=await R(e,()=>e.select({organizationId:Y.organizationId}).from(Y).where(y(Y.key,t)));return n?.organizationId}static async installations(e,t){return R(e,()=>e.select({key:Y.key,organizationId:Y.organizationId}).from(Y).where(h(_`${Y.key} like ${`${H(t)}:%`}`,S(Y.deletedAt))))}static async taskOrganization(e,t,n){let[r]=await R(e,()=>e.select({organizationId:N.organizationId}).from(N).where(h(y(N.publicId,t),y(N.tokenHash,n))));return r?.organizationId}async getApps(e){return e.length?(await R(this.db,()=>this.db.select({row:W,credentials:j.value,sharedKey:Z.key}).from(W).innerJoin(j,y(j.id,W.credentialsSecretId)).leftJoin(Z,y(Z.id,W.sharedAppId)).where(h(p(W.organizationId,[this.organizationId,``]),p(W.key,e))))).map(e=>({id:e.row.key,value:$(e.row,e.credentials,e.sharedKey)})):[]}async listCredentials(e){let t=D,n=this.db.select({row:t,sealed:j.value}).from(t).innerJoin(j,y(j.id,t.secretId)).where(h(this.mine(t.organizationId),e.owner?x(S(t.owner),y(t.owner,e.owner)):S(t.owner))).orderBy(b(_`case when ${t.owner} is null then 'workspace' else 'personal' end`),b(t.label));return(await R(this.db,()=>e.limit===void 0?n:n.limit(e.limit))).map(({row:e,sealed:t})=>({id:Ce(e.owner??void 0,e.label),value:et(e,t)}))}async updateMetadata(e,t,n){return e===`installation`&&(`covers`in n||`deletedAt`in n)?this.transaction(`installation:${t}`,async r=>{let i=await r.get(`installation`,t);if(!i)return!1;let a={...i,...n};return a.deletedAt===void 0&&await Ze(r,t,a),r.writeMetadata(e,t,n)}):this.writeMetadata(e,t,n)}async writeMetadata(e,t,n){let r=e===`app`?W:e===`installation`?Y:A,i=e===`app`?[`name`,`agentsRepo`,`branch`]:e===`installation`?[`account`,`self`,`covers`,`repos`,`deletedAt`,`uninstalled`]:[`name`,`config`,`lastSeen`,`updatedAt`];if(Object.keys(n).some(e=>!i.includes(e)))throw Error(`Invalid metadata fields`);let a=Object.fromEntries(Object.entries(n).map(([e,t])=>[e,t===void 0?null:[`deletedAt`,`updatedAt`,`lastSeen`].includes(e)?V(t):t])),o=e===`runner`?A.publicId:e===`app`?W.key:Y.key,[s]=await this.db.update(r).set({...a,updatedAt:typeof n.updatedAt==`number`?V(n.updatedAt):this.at()}).where(h(this.mine(r.organizationId),y(o,t))).returning({id:r.id});return!!s}withAppLock(e,t){let n=/^connections?[:-]/.test(e)?`${this.organizationId}:${e}`:e;return this.transaction(`app:${n}`,t)}queue(){return new Vt(this.db)}withConfigLock(e){return this.transaction(`config:${this.organizationId}`,e)}async transaction(t,n){let r=_`select pg_advisory_xact_lock(3, hashtext(${t}))`;return this.locks?(this.locks.has(t)||await this.db.execute(r),this.locks.add(t),n(this)):this.db.transaction(async i=>(await i.execute(r),n(new e(i,this.organizationId,this.now,this.encryption,new Set([t]),this.notifications))))}withCredential(e,t,n){if(e===`runner`)return this.withAppLock(`runners:${this.organizationId}`,e=>ke(e,`runner`,t,n));if(e===`installation`)return this.transaction(`installation:${t}`,async e=>{let r=await $e(e,t),i=await n(r,r?[{id:t,value:r}]:[],e);for(let t of i??[])t.value===null?await e.delete(`installation`,t.id):await e.put(`installation`,t.id,t.value);return!!i?.length});let{owner:r}=he(t);return this.transaction(tt(this,r),async e=>{let i=await nt(e,r),a=i.map(({id:e,value:t})=>({id:e,value:t})),o=await n(a.find(e=>e.id===t)?.value,a,e);for(let t of o??[])await rt(e,i.find(e=>e.id===t.id),t.id,t.value);return!!o?.length})}at(){return V(this.now())}live(e){return x(S(e),v(e,this.at()))}mine(e){return y(e,this.organizationId)}async get(e,t){if(e===`app`)return(await this.getApps([t]))[0]?.value;let n=this.kind(e,t),r=B(t),i=n.where?n.where({id:t}):n.split&&r?n.split(r[0],r[1],!0):_`${n.key} = ${t}`;return(await R(this.db,async()=>await n.rows(i,1)))[0]?.value}async patchLogin(e,t,n={}){let[r]=await this.db.update(E).set({value:_`jsonb_strip_nulls(${E.value} || ${JSON.stringify(t)}::jsonb)`}).where(h(y(E.key,X(this.organizationId,`login`,e)),this.live(E.expiresAt),_`(${E.value}->>'expiresAt')::bigint > ${this.now()}`,...Object.entries(n).map(([e,t])=>Array.isArray(t)?p(_`${E.value}->>${e}`,t):_`${E.value}->>${e} = ${t}`))).returning({value:_`${E.value}`,...this.notification(`login`,e)});return r?.value}completeLogin(e,t,n){return fe(this,e,t,n)}async listAgentsWithVersions(e){return(await R(this.db,()=>this.db.select({record:C,version:w}).from(C).leftJoin(w,h(y(w.agentId,C.id),y(w.version,C.currentVersion))).where(h(this.mine(C.organizationId),e===void 0?void 0:Array.isArray(e)?e.length?p(C.slug,e):_`false`:y(C.slug,e))).orderBy(b(C.slug)))).map(({record:e,version:t})=>({record:Ve(e),...t?{version:He(t,e.slug)}:{}}))}async listAgentSummaries(e={}){let t=e.q?`%${H(e.q)}%`:void 0,n=_`${C.source} <> 'builtin'`,r=this.db.select({record:C,version:Pe}).from(C).leftJoin(w,h(y(w.agentId,C.id),y(w.version,C.currentVersion))).where(h(this.mine(C.organizationId),e.slug===void 0?void 0:y(C.slug,e.slug),e.after?_`(${n}, ${C.slug}) > (${e.after[0]===`1`}, ${e.after.slice(2)})`:void 0,e.source?y(C.source,e.source):void 0,t?x(g(C.slug,t),g(C.name,t),g(C.description,t),g(C.repo,t)):void 0,e.platform?_`${w.definition}->'integrations' ? ${e.platform}`:void 0)).orderBy(n,b(C.slug));return(await R(this.db,()=>e.limit===void 0?r:r.limit(e.limit))).map(({record:e,version:t})=>({record:Ve(e),...t?{version:Ne(t,e.slug)}:{}}))}async listVersions(e,t,n){let r=this.db.select({version:Pe}).from(w).innerJoin(C,y(C.id,w.agentId)).where(h(this.mine(C.organizationId),y(C.slug,e),n===void 0?t===void 0?void 0:f(w.version,C.currentVersion):re(w.version,n),t===void 0?void 0:te(w.version,n===void 0?_`${C.currentVersion} + 1 - ${t}`:n-t))).orderBy(b(w.version));return(await R(this.db,()=>r)).map(({version:t})=>({id:`${e}:${String(t.version).padStart(6,`0`)}`,value:Ne(t,e)}))}async put(e,t,n,r={}){let i=r.ttlMs===void 0?null:V(this.now()+r.ttlMs);await this.kind(e,t).put(t,n,i,r)}async putMany(e,t,n={}){if(!t.length)return;if(e===`delivery`&&!t.some(e=>e.id.startsWith(`approval:`))){await this.db.insert(E).values(t.map(({id:t,value:r})=>({key:X(this.organizationId,e,t),value:r,expiresAt:n.ttlMs===void 0?null:V(this.now()+n.ttlMs)}))).onConflictDoUpdate({target:E.key,set:{value:_`excluded.value`,expiresAt:_`excluded.expires_at`}});return}if(e!==`tasklog`){await Promise.all(t.map(t=>this.put(e,t.id,t.value,n)));return}let[r]=B(t[0].id),i=t.map(e=>{let[t,n]=B(e.id);if(t!==r)throw Error(`A log batch must belong to one task`);return{seq:n,...e.value}});await Zt(this,r,i)}async approvalPostsDue(e,t){let n=T;return R(this.db,()=>this.db.select({organizationId:n.organizationId,id:n.key,value:n.value}).from(n).where(h(this.live(n.expiresAt),x(f(n.retryAt,V(e)),h(S(n.shownAt),f(n.at,V(e-t)))))))}async list(e,t={}){return e===`snapshot`&&!t.ids&&`connections:`.startsWith(t.prefix??``)?[...await this.listRows(e,t,this.kinds.snapshot),...await this.listRows(e,t,this.secrets)].sort((e,t)=>e.id<t.id?-1:+(e.id>t.id)).slice(0,t.limit):this.listRows(e,t,this.kind(e,t.prefix))}async listRows(e,t,n){let r=[];if(t.ids&&r.push(t.ids.length?p(_`${n.key}`,t.ids.map(t=>n.where?X(this.organizationId,e,t):t)):_`false`),t.runner&&r.push(e===`runner`?x(y(A.publicId,t.runner),y(A.name,t.runner)):_`false`),t.defaults&&r.push(e===`runner`?y(A.isDefault,!0):_`false`),t.installation&&r.push(e===`usage`?y(Y.key,t.installation):_`false`),t.agent&&r.push(e===`app`||e===`installation`?y(W.agent,t.agent):e===`agent`?y(C.slug,t.agent):_`false`),t.active&&r.push(e===`installation`?x(S(Y.deletedAt),...t.includeUninstalled?[y(Y.uninstalled,!0)]:[]):void 0),t.apps&&r.push(e===`installation`&&t.apps.length?p(W.key,t.apps):_`false`),Object.hasOwn(t,`visibleTo`)){let n=e===`runner`?A.owner:e===`credential`?D.owner:oe.owner;r.push(x(S(n),t.visibleTo?y(_`${n}`,t.visibleTo):void 0))}if(n.where)return R(this.db,async()=>await n.rows(h(n.where(t),...r),t.limit));let i=t.prefix?.endsWith(`:`)?t.prefix.slice(0,-1):void 0,a=t.after===void 0?void 0:B(t.after);if(n.split&&i&&!i.includes(`:`)&&(t.after===void 0||a?.[0]===i))return R(this.db,async()=>await n.rows(n.split(i,a?.[1]),t.limit));let o=t.prefix?_`${n.key} like ${`${H(t.prefix)}%`}`:void 0,s=t.after?_`${n.key} > ${t.after}`:void 0,c=h(o,s,...r);return R(this.db,async()=>await n.rows(c,t.limit))}async delete(e,t){let n=e===`login`?this.notification(e,t):void 0;if(n){await this.db.delete(E).where(y(E.key,X(this.organizationId,e,t))).returning(n);return}await this.kind(e,t).delete(t)}async create(e,t,n,r={}){if(e===`agentversion`)return Wt(this,t,n);if(e===`connection`)return this.transaction(gt(this,t),async e=>{let{secret:r,...i}=n,a=r?await Be(e.db,r):null,o=await e.db.insert(oe).values({organizationId:e.organizationId,key:t,owner:i.owner,record:i,secretId:a}).onConflictDoNothing().returning({id:oe.id});return o.length||await J(e.db,[a]),o.length>0});if(e!==`delivery`)throw Error(`Atomic create is not supported for ${e}`);let i=r.ttlMs===void 0?null:V(this.now()+r.ttlMs);if(t.startsWith(`approval:`)){let e=n,r={value:e,at:V(e.at),shownAt:e.shownAt?V(e.shownAt):null,retryAt:e.retryAt===void 0?null:V(e.retryAt),expiresAt:i};return(await this.db.insert(T).values({organizationId:this.organizationId,key:t,...r}).onConflictDoUpdate({target:[T.organizationId,T.key],set:r,setWhere:f(T.expiresAt,this.at())}).returning({id:T.id})).length>0}return(await this.db.insert(E).values({key:X(this.organizationId,e,t),value:n,expiresAt:i}).onConflictDoUpdate({target:E.key,set:{value:n,expiresAt:i},setWhere:f(E.expiresAt,this.at())}).returning({key:E.key})).length>0}async claimDeliveryLease(e,t,n){let r=_`clock_timestamp() + ${n}::int * interval '1 millisecond'`,[i]=await this.db.insert(E).values({key:X(this.organizationId,`delivery`,e),value:{owner:t,failures:0},expiresAt:r}).onConflictDoUpdate({target:E.key,set:{value:_`${E.value} || ${JSON.stringify({owner:t})}::jsonb`,expiresAt:r},setWhere:_`${E.expiresAt} <= clock_timestamp()`}).returning({value:E.value});return i?i.value.failures:void 0}async updateDeliveryLease(e,t,n,r={ttlMs:3e4}){let i=h(y(E.key,X(this.organizationId,`delivery`,e)),_`${E.value}->>'owner' = ${t} and ${E.expiresAt} > clock_timestamp()`),a=_`clock_timestamp() + ${r.ttlMs}::int * interval '1 millisecond'`;return(n===void 0?await this.db.delete(E).where(i).returning({key:E.key}):await this.db.update(E).set({value:n.next===void 0?n:_`${JSON.stringify(n)}::jsonb || jsonb_build_object('next', floor(extract(epoch from (${a})) * 1000))`,expiresAt:a}).where(i).returning({key:E.key})).length>0}async updateDelivery(e,t,n,r={}){let i=h(y(E.key,X(this.organizationId,`delivery`,e)),_`${E.value}->>'owner' = ${t}`,this.live(E.expiresAt));return(n===void 0?await this.db.delete(E).where(i).returning({key:E.key}):await this.db.update(E).set({value:n,expiresAt:r.ttlMs===void 0?null:V(this.now()+r.ttlMs)}).where(i).returning({key:E.key})).length>0}listHistory(e){return Jt(this,e)}async installationApp(e){let[t]=await R(this.db,()=>this.db.select({installation:Y,app:W,credentials:j.value,token:Q.value,sharedKey:Z.key}).from(Y).innerJoin(W,h(y(W.id,Y.appId),p(W.organizationId,[this.organizationId,``]))).innerJoin(j,y(j.id,W.credentialsSecretId)).leftJoin(Z,y(Z.id,W.sharedAppId)).leftJoin(Q,y(Q.id,Y.tokenSecretId)).where(h(this.mine(Y.organizationId),y(Y.key,e),S(Y.deletedAt))));return t&&{installation:Xe(t.installation,t.app,t.token),app:$(t.app,t.credentials,t.sharedKey)}}async conversationState(e){let t=ie(E,`unseen`),n=ie(E,`batch`),[r]=await R(this.db,()=>this.db.select({record:E.value,unseen:t.value,batch:n.value,task:N}).from(_`(select 1) as anchor`).leftJoin(E,h(y(E.key,X(this.organizationId,`delivery`,e)),this.live(E.expiresAt))).leftJoin(t,h(y(t.key,X(this.organizationId,`delivery`,`since:${e}`)),this.live(t.expiresAt))).leftJoin(n,h(y(n.key,X(this.organizationId,`delivery`,`batch:${e}`)),this.live(n.expiresAt))).leftJoin(N,h(this.mine(N.organizationId),y(N.publicId,_`${E.value}->>'taskId'`),y(N.flow,`default`))));return{...r?.record?{record:r.record}:{},...r?.unseen?{unseen:r.unseen}:{},...r?.batch?{batch:r.batch}:{},...r?.task?{status:Ie(r.task)}:{}}}async heldTokens(e,t){let[n]=await R(this.db,()=>q(this.db,_`select ${lt(this.organizationId,e,t)} as tokens`));return ut(this.organizationId,n?.tokens??{})}async holdToken(e){let t=E,n=e=>X(this.organizationId,`snapshot`,e);await this.db.execute(_`insert into ${t} (key, value, expires_at)
|
|
209
|
+
select ${n(e.key)}, ${JSON.stringify(e.value)}::jsonb, ${V(this.now()+e.ttlMs).toISOString()}::timestamptz
|
|
210
|
+
where ${_.join(e.drops.map(e=>_`coalesce((select ${t.value}->>'drop' from ${t} where ${t.key} = ${n(e.key)} and ${this.live(t.expiresAt)}), '') = ${e.drop??``}`),_` and `)}
|
|
211
|
+
on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at`)}async saveTaskSecrets(e,t){let[n]=await z(this.db,[_`select pg_advisory_xact_lock(3, hashtext(${`app:${this.organizationId}:connections:${e}`}))`],_`with active as (select id from ${N} where ${this.mine(N.organizationId)} and ${N.publicId} = ${e} and ${N.status} in ('queued', 'running', 'waiting')),
|
|
212
|
+
${nn(t,_`select id from active`)}
|
|
213
|
+
select exists (select 1 from active) as active`);return!!n?.active}async dispatchState(e){let t=E,n=e=>X(this.organizationId,`delivery`,e),r=e.conversation??``,i=e=>_`(select ${t.value} from ${t} where ${t.key} = ${n(e)} and ${this.live(t.expiresAt)})`,a=e=>_`(${e} is null or ${e} = (select requester from member))`,o=e=>_`${e} = ${this.organizationId}`,s=(e,t)=>_`(select coalesce(jsonb_agg(${Fe(_`to_jsonb(r)`,_`s.value`)}), '[]'::jsonb)
|
|
214
|
+
from ${e} r join ${j} s on s.id = r.secret_id where ${t})`,c=We(this.organizationId,`snapshot`),l=e.files.map(e=>`${H(c+e)}%`),[u]=await q(this.db,_`
|
|
215
|
+
with claim as (
|
|
216
|
+
insert into ${t} (key, value, expires_at)
|
|
217
|
+
values (${n(e.delivery.key)}, ${JSON.stringify({at:e.delivery.at,owner:e.delivery.owner,pending:!0})}::jsonb, ${V(e.delivery.at+e.delivery.ttlMs).toISOString()}::timestamptz)
|
|
218
|
+
on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at
|
|
219
|
+
where ${t.expiresAt} <= ${this.at().toISOString()}::timestamptz
|
|
220
|
+
returning key
|
|
221
|
+
), conversation as (select ${i(r)} as value),
|
|
222
|
+
member as (select ${O.userId} as requester, ${O.name} as name, ${O.email} as email from ${O}
|
|
223
|
+
where ${O.platform} = ${e.actor?.platform??null}::text and ${O.platformUserId} = ${e.actor?.id??null}::text
|
|
224
|
+
and ${O.organizations} ? ${this.organizationId} limit 1)
|
|
225
|
+
select exists (select 1 from claim) as claimed,
|
|
226
|
+
(select to_jsonb(a) from ${C} a where ${o(_`a.organization_id`)} and a.slug = ${e.agent}) as record,
|
|
227
|
+
(select to_jsonb(v) from ${w} v join ${C} a on a.id = v.agent_id and v.version = a.current_version
|
|
228
|
+
where ${o(_`a.organization_id`)} and a.slug = ${e.agent}) as version,
|
|
229
|
+
(select value from conversation) as conversation,
|
|
230
|
+
${i(`since:${r}`)} as unseen,
|
|
231
|
+
${i(`batch:${r}`)} as batch,
|
|
232
|
+
(select to_jsonb(t) from ${N} t, conversation c where ${o(_`t.organization_id`)} and t.public_id = c.value->>'taskId' and t.flow = 'default') as task,
|
|
233
|
+
(select jsonb_build_object('id', requester, 'name', name, 'email', email) from member) as member,
|
|
234
|
+
${s(_`${D}`,_`${o(_`r.organization_id`)} and ${a(_`r.owner`)}`)} as credentials,
|
|
235
|
+
${s(_`${A}`,_`${o(_`r.organization_id`)} and r.is_default and ${a(_`r.owner`)}`)} as runners,
|
|
236
|
+
(select coalesce(jsonb_agg(${Fe(_`c.record`,_`s.value`)} order by c.key), '[]'::jsonb) from ${oe} c left join ${j} s on s.id = c.secret_id
|
|
237
|
+
where ${o(_`c.organization_id`)} and ${a(_`c.owner`)}) as connections,
|
|
238
|
+
coalesce((select jsonb_strip_nulls(jsonb_build_object('slug', ${L.slug}, 'name', ${L.name}))
|
|
239
|
+
from ${L} where ${o(L.organizationId)}), '{}'::jsonb) as workspace,
|
|
240
|
+
(select coalesce(jsonb_object_agg(${t.key}, ${t.value}), '{}'::jsonb) from ${t}
|
|
241
|
+
where ${this.live(t.expiresAt)} and ${t.key} like any(${_.param(l)}::text[])) as files,
|
|
242
|
+
${lt(this.organizationId,[e.installation.id],[e.installation.app])} as tokens`);if(!u?.claimed)return{claimed:!1};let d=u.record?Ve(G(C,u.record)):void 0,f=u.version&&d?He(G(w,u.version),d.id):void 0;return{claimed:!0,loaded:{...d?{record:d}:{},...f?{version:f}:{},conversation:{...u.conversation?{record:u.conversation}:{},...u.unseen?{unseen:u.unseen}:{},...u.batch?{batch:u.batch}:{},...u.task?{status:Ie(G(N,u.task))}:{}},...u.member?{member:u.member}:{},credentials:u.credentials.map(ot),runners:u.runners.map(st),connections:u.connections,...u.workspace?{workspace:u.workspace}:{},files:Object.fromEntries(Object.entries(u.files).map(([e,t])=>[e.slice(c.length),t])),tokens:ut(this.organizationId,u.tokens)}}}async markConversation(e,t,n,r,i){await this.db.update(E).set({value:_`${E.value} || ${JSON.stringify({at:r,seen:n})}::jsonb`,expiresAt:V(this.now()+i)}).where(h(y(E.key,X(this.organizationId,`delivery`,e)),_`${E.value}->>'taskId' = ${t}`,this.live(E.expiresAt)))}async appendUnseen(e,t,n){let r=_`coalesce((${E.value}->>'version')::bigint, jsonb_array_length(${E.value}->'messages') + (${E.value}->>'more')::bigint)`,i={messages:[{...t,sequence:1}],more:0,version:1,epoch:qe()};await this.db.execute(_`
|
|
243
|
+
insert into ${E} (key, value, expires_at)
|
|
244
|
+
select ${X(this.organizationId,`delivery`,`since:${e}`)}, ${JSON.stringify(i)}::jsonb, ${V(this.now()+n).toISOString()}::timestamptz
|
|
245
|
+
where exists (select 1 from ${E} where key = ${X(this.organizationId,`delivery`,e)} and ${this.live(E.expiresAt)})
|
|
246
|
+
on conflict (key) do update set value = case when ${E.expiresAt} <= ${this.at().toISOString()}::timestamptz then excluded.value else
|
|
247
|
+
${E.value} || jsonb_build_object('version', ${r} + 1,
|
|
248
|
+
'messages', case when jsonb_array_length(${E.value}->'messages') < ${50} then
|
|
249
|
+
(${E.value}->'messages') || jsonb_build_array(${JSON.stringify(t)}::jsonb || jsonb_build_object('sequence', ${r} + 1)) else ${E.value}->'messages' end,
|
|
250
|
+
'more', (${E.value}->>'more')::int + case when jsonb_array_length(${E.value}->'messages') < ${50} then 0 else 1 end) end,
|
|
251
|
+
expires_at = excluded.expires_at
|
|
252
|
+
`)}async acknowledgeUnseen(e,t,n){await this.db.update(E).set({value:dt(t)}).where(h(y(E.key,X(this.organizationId,`delivery`,`since:${e}`)),_`${E.value}->>'epoch' is not distinct from ${n??null}::text`,this.live(E.expiresAt)))}async appendBatch(e,t,n,r,i){let a=Ae(void 0,t,n,r),o=V(this.now()+i);await this.db.insert(E).values({key:X(this.organizationId,`delivery`,e),value:a,expiresAt:o}).onConflictDoUpdate({target:E.key,set:{value:_`case when ${E.expiresAt} <= ${this.at().toISOString()}::timestamptz then excluded.value else
|
|
253
|
+
(select ${E.value} || excluded.value || jsonb_build_object(
|
|
254
|
+
'items', prefix || coalesce((select jsonb_agg(item order by n) from jsonb_array_elements(pending) with ordinality e(item,n) where n > greatest(jsonb_array_length(pending) - 50, 0)), '[]'::jsonb),
|
|
255
|
+
'more', coalesce((${E.value}->>'more')::int, 0) + coalesce((excluded.value->>'more')::int, 0) + greatest(jsonb_array_length(pending) - 50, 0),
|
|
256
|
+
'mustReply', coalesce((${E.value}->>'mustReply')::boolean, false) or coalesce((excluded.value->>'mustReply')::boolean, false) or exists(select 1 from jsonb_array_elements(pending) with ordinality e(item,n) where n <= greatest(jsonb_array_length(pending) - 50, 0) and item->'event'->>'mustReply' = 'true'))
|
|
257
|
+
from (select coalesce(jsonb_agg(item order by n) filter (where n <= coalesce((${E.value}->'sending'->>'count')::int, 0)), '[]'::jsonb) as prefix,
|
|
258
|
+
coalesce(jsonb_agg(item order by n) filter (where n > coalesce((${E.value}->'sending'->>'count')::int, 0)), '[]'::jsonb) || (excluded.value->'items') as pending
|
|
259
|
+
from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n)) queued) end`,expiresAt:o}})}async claimBatch(e,t){let n=X(this.organizationId,`delivery`,e),r=(await q(this.db,_`
|
|
260
|
+
with held as materialized (
|
|
261
|
+
select key as batch_key, value as previous from ${E}
|
|
262
|
+
where key = ${n} and value->>'owner' = ${t} and ${this.live(E.expiresAt)} for update
|
|
263
|
+
), claimed as (
|
|
264
|
+
update ${E} set value = (
|
|
265
|
+
select ready || jsonb_build_object('more', 0, 'mustReply', false, 'sending', jsonb_build_object(
|
|
266
|
+
'owner', ${t}::text, 'until', ${this.now()+Me}::bigint,
|
|
267
|
+
'count', jsonb_array_length(ready->'items'), 'more', ready->'more', 'mustReply', ready->'mustReply'))
|
|
268
|
+
from (select (value - 'sending') || jsonb_build_object(
|
|
269
|
+
'items', coalesce((select jsonb_agg(item order by n) from jsonb_array_elements(value->'items') with ordinality e(item,n)
|
|
270
|
+
where n > greatest(jsonb_array_length(value->'items') - 50, 0)), '[]'::jsonb),
|
|
271
|
+
'more', coalesce((value->>'more')::int, 0) + coalesce((value->'sending'->>'more')::int, 0) + greatest(jsonb_array_length(value->'items') - 50, 0),
|
|
272
|
+
'mustReply', coalesce((value->>'mustReply')::boolean, false) or coalesce((value->'sending'->>'mustReply')::boolean, false) or exists(
|
|
273
|
+
select 1 from jsonb_array_elements(value->'items') with ordinality e(item,n)
|
|
274
|
+
where n <= greatest(jsonb_array_length(value->'items') - 50, 0) and item->'event'->>'mustReply' = 'true')) as ready) as available)
|
|
275
|
+
from held where key = held.batch_key and coalesce((value->'sending'->>'until')::bigint, 0) <= ${this.now()}
|
|
276
|
+
and jsonb_array_length(value->'items') > 0
|
|
277
|
+
returning value
|
|
278
|
+
) select value, true as claimed from claimed
|
|
279
|
+
union all select previous, false from held where not exists (select 1 from claimed)
|
|
280
|
+
`))[0];return r?.claimed?{...r.value,more:r.value.sending?.more,mustReply:r.value.sending?.mustReply}:r?.value.sending?null:void 0}async finishBatch(e,t,n,r){let i=_`(${E.value}->'sending'->>'count')::int`,a=r===void 0?i:_`coalesce((select n from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n)
|
|
281
|
+
where n <= ${i} and item->>'admission' = ${r} limit 1), 0)`;return(await this.db.update(E).set({value:_`case when ${n} and ${i} > ${a} then
|
|
282
|
+
${E.value} || jsonb_build_object('items',
|
|
283
|
+
coalesce((select jsonb_agg(item order by n) from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n)
|
|
284
|
+
where n > ${a}), '[]'::jsonb),
|
|
285
|
+
'sending', (${E.value}->'sending') || jsonb_build_object(
|
|
286
|
+
'count', ${i} - ${a},
|
|
287
|
+
'until', ${this.now()+Me}::bigint))
|
|
288
|
+
else (${E.value} - 'sending') || jsonb_build_object('items',
|
|
289
|
+
case when ${n} then coalesce((select jsonb_agg(item order by n) from jsonb_array_elements(${E.value}->'items') with ordinality as entries(item, n)
|
|
290
|
+
where n > ${i}), '[]'::jsonb) else
|
|
291
|
+
coalesce((select jsonb_agg(item order by n) from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n)
|
|
292
|
+
where n > greatest(jsonb_array_length(${E.value}->'items') - 50, 0)), '[]'::jsonb) end,
|
|
293
|
+
'more', coalesce((${E.value}->>'more')::int, 0) + case when ${n} then 0 else coalesce((${E.value}->'sending'->>'more')::int, 0) + greatest(jsonb_array_length(${E.value}->'items') - 50, 0) end,
|
|
294
|
+
'mustReply', coalesce((${E.value}->>'mustReply')::boolean, false) or (not ${n} and (coalesce((${E.value}->'sending'->>'mustReply')::boolean, false) or exists(select 1 from jsonb_array_elements(${E.value}->'items') with ordinality e(item,n)
|
|
295
|
+
where n <= greatest(jsonb_array_length(${E.value}->'items') - 50, 0) and item->'event'->>'mustReply' = 'true')))) end`}).where(h(y(E.key,X(this.organizationId,`delivery`,e)),_`${E.value}->'sending'->>'owner' = ${t}`,this.live(E.expiresAt))).returning({key:E.key})).length>0}async take(e,t,n){if(e===`delivery`||e===`snapshot`){let[r]=await this.db.delete(E).where(h(y(E.key,X(this.organizationId,e,t)),this.live(E.expiresAt),n?_`${E.value} @> ${JSON.stringify(n)}::jsonb`:void 0)).returning({value:E.value});return r?.value}let r=await this.get(e,t);if(!(r===void 0||Object.entries(n??{}).some(([e,t])=>r[e]!==t)))return await this.delete(e,t),r}async usageSummary(e,t){let n=N,r=_`case groups.kind when 'agent' then ${n.agent} when 'engine' then coalesce(${n.engine}, 'unknown') else coalesce(${Y.key}, 'none') end`,i=t?r:_`groups.kind || ':' || (${r})`,a=(await R(this.db,()=>q(this.db,_`
|
|
296
|
+
select ${i} as key, count(*)::int as tasks, sum(${n.runnerMs})::float8 as runner_ms,
|
|
297
|
+
jsonb_agg(${n.usageTokens} order by ${n.publicId}) filter (where ${n.usageTokens} is not null) as tokens
|
|
298
|
+
from ${n} left join ${Y} on ${Y.id} = ${n.installationId}
|
|
299
|
+
cross join unnest(${_.param(t?[t]:[`agent`,`installation`,`engine`])}::text[]) groups(kind)
|
|
300
|
+
where ${this.mine(n.organizationId)} and ${n.runnerMs} is not null and ${n.finishedAt} >= ${new Date(e).toISOString()}::timestamptz
|
|
301
|
+
group by 1 order by 1
|
|
302
|
+
`))).map(e=>{let t=e.tokens?.reduce(Se,void 0);return{key:e.key,tasks:e.tasks,runnerMs:e.runner_ms,...t===void 0?{}:{tokens:t}}});if(t)return a;let o={agent:[],installation:[],engine:[]};for(let e of a){let t=e.key.indexOf(`:`);o[e.key.slice(0,t)].push({...e,key:e.key.slice(t+1)})}return o}async usageTotals(e){let t=N,n=e.by===`agent`?_`${t.agent}`:e.by===`engine`?_`coalesce(${t.engine}, 'unknown')`:e.by===`installation`?_`coalesce(${Y.key}, 'none')`:_`to_char(${t.finishedAt} at time zone ${Ee(e.tz)}, 'YYYY-MM-DD')`,r=h(this.mine(t.organizationId),ne(t.runnerMs),te(t.finishedAt,V(e.since)),e.until===void 0?void 0:re(t.finishedAt,V(e.until)),e.agent?y(t.agent,e.agent):void 0),i={tasks:_`count(*)`,runnerMs:_`coalesce(sum(${t.runnerMs}), 0)`,tokenCount:_`coalesce(sum(${t.tokenCount}), 0)`},a=e.top?_`case when ${t.agent} in (
|
|
303
|
+
select ${t.agent} from ${t} where ${r} group by ${t.agent}
|
|
304
|
+
order by ${i[e.top.by]} desc, ${t.agent} limit ${e.top.count}
|
|
305
|
+
) then ${t.agent} end`:e.parts?.length?_`case when ${p(t.agent,e.parts)} then ${t.agent} end`:_`null::text`,o=e.by===`installation`?_`left join ${Y} on ${Y.id} = ${t.installationId}`:_``,s=await R(this.db,()=>q(this.db,_`
|
|
306
|
+
select ${n} as key, ${a} as part, ${i.tasks}::int as tasks,
|
|
307
|
+
${i.runnerMs}::float8 as runner_ms,
|
|
308
|
+
${i.tokenCount}::float8 as token_count
|
|
309
|
+
from ${t} ${o}
|
|
310
|
+
where ${r}
|
|
311
|
+
group by 1, 2
|
|
312
|
+
`)),c=new Map;for(let e of s){let t={tasks:Number(e.tasks),runnerMs:Number(e.runner_ms),tokenCount:Number(e.token_count)},n=c.get(e.key)??{key:e.key,tasks:0,runnerMs:0,tokenCount:0};xe(n,t),e.part&&((n.parts??={})[e.part]=t),c.set(e.key,n)}return[...c.values()].sort((e,t)=>e.key.localeCompare(t.key))}async sweep(e=1e3){if(!Number.isInteger(e)||e<1)throw Error(`Sweep batch must be positive`);let t=this.at().toISOString();await this.db.execute(_`
|
|
313
|
+
with tombstones as (
|
|
314
|
+
delete from ${ue} where (organization_id, public_id) in (
|
|
315
|
+
select organization_id, public_id from ${ue}
|
|
316
|
+
where deleted_at < ${new Date(this.now()-6e5).toISOString()}::timestamptz
|
|
317
|
+
order by deleted_at limit ${e}
|
|
318
|
+
)
|
|
319
|
+
), expired_state as (
|
|
320
|
+
delete from ${E} where expires_at <= clock_timestamp() and key in (
|
|
321
|
+
select key from ${E} where expires_at <= clock_timestamp() order by expires_at limit ${e}
|
|
322
|
+
)
|
|
323
|
+
), expired_posts as (
|
|
324
|
+
delete from ${T} where id in (
|
|
325
|
+
select id from ${T} where expires_at <= clock_timestamp() order by expires_at limit ${e}
|
|
326
|
+
)
|
|
327
|
+
), expired_task_secrets as (
|
|
328
|
+
delete from ${I} where id in (
|
|
329
|
+
select id from ${I} where expires_at <= clock_timestamp() order by expires_at limit ${e}
|
|
330
|
+
) returning secret_id
|
|
331
|
+
), expired_secrets as (
|
|
332
|
+
delete from ${j} where id in (select secret_id from expired_task_secrets)
|
|
333
|
+
), lists as (
|
|
334
|
+
select expired.key from ${ae} as expired
|
|
335
|
+
where expired.key like 'k:%' and expired.expires_at <= ${t}::timestamptz
|
|
336
|
+
and not exists (select 1 from ${ae} as newer where newer.key = expired.key and newer.seq > expired.seq)
|
|
337
|
+
order by expired.expires_at limit ${e}
|
|
338
|
+
), expired_items as (
|
|
339
|
+
select key, seq from ${ae} where key in (select key from lists) order by seq limit ${e}
|
|
340
|
+
), expired_queue as (
|
|
341
|
+
select key, seq from ${ae} where key like 'q:%' and expires_at <= ${t}::timestamptz order by expires_at limit ${e}
|
|
342
|
+
)
|
|
343
|
+
delete from ${ae} where (key, seq) in (
|
|
344
|
+
select key, seq from expired_items union all select key, seq from expired_queue
|
|
345
|
+
)`)}};function nn(e,t){let n=_.join(e.map(e=>_`(${e.id}, ${e.value}, ${V(e.expiresAt).toISOString()}::timestamptz)`),_`, `);return _`task_secret_rows as (select * from (values ${n}) as row(key, value, expires_at)
|
|
346
|
+
where not exists (select 1 from ${I} where task_id in (${t}) and key = row.key)),
|
|
347
|
+
sealed as (insert into ${j} (value) select value from task_secret_rows where exists (${t}) returning id, value),
|
|
348
|
+
kept as (insert into ${I} (task_id, key, secret_id, expires_at)
|
|
349
|
+
select (${t}), r.key, s.id, r.expires_at from task_secret_rows r join sealed s on s.value = r.value)`}export{en as n,wt as r,tn as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ea as e}from"./args-CJsHYWbt.js";import{_ as t,a as n,b as r,f as i,h as a,i as o,m as s,o as c,p as l,r as u,u as d,y as f}from"./actions-DO8MvHwc.js";var p=e({tasks:()=>m});const m={run:s,result:l,list:d,watch:r,stream:f,steer:a,ask:c,approvals:u,approve:o,stop:t,archive:n,delete:i};export{m as n,p as t};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{Ea as e}from"./args-CJsHYWbt.js";import{$ as t,N as n,T as r,V as i,b as a,bt as o,et as s,f as c,gt as l,m as u,mt as d,o as f,u as p,vt as m,w as h,y as g,yt as _}from"./state-CxAUec80.js";import{R as ee,l as v,u as y,w as b}from"./config-_32PHl9g.js";import{a as x,f as S}from"./connections-B90TemYf.js";import{v as C}from"./app-server-dnlLhhZb.js";import{t as w}from"./integrations-DSZSa8Rc.js";import{a as te}from"./definition-D0OpQfGX.js";import{B as ne,C as T,D as re,L as ie,R as E,S as D,_ as ae,d as oe,s as se,u as O,w as k}from"./dispatch-BkoIU4GU.js";import{t as A}from"./sessions-BGUfSe8L.js";import{_ as ce}from"./approvals-C8XV7CK2.js";import{i as le,r as ue}from"./view-D-rbQ1Kz.js";import{g as de,l as j,n as M,s as N,v as fe}from"./actions-DO8MvHwc.js";import{i as P,o as F}from"./mcp-cEIva8Pd.js";import{a as pe,d as me,r as he,s as ge,u as _e}from"./exec-D9jF2F-H.js";import{s as ve}from"./http-DRk8cDjf.js";import{t as ye}from"./tools-DVtBtED6.js";import{i as be,n as xe,r as Se}from"./async-BS9tyhva.js";import{r as Ce}from"./post-DLenID75.js";import I from"node:path";import L from"node:process";import{execFile as R}from"node:child_process";import z from"node:net";import B from"node:os";import{createHash as we}from"node:crypto";import V from"node:http";import H from"node:fs/promises";import{promisify as U}from"node:util";import{gunzipSync as W,gzipSync as Te}from"node:zlib";const G=e=>we(`sha256`).update(e).digest(`hex`);function K(e,t,n){if(e===`claude`)return I.join(T(),process.env.CLAUDE_CODE_PROJECT_DIR_NAME||`coder`,`${t}.jsonl`);let r=new Date(JSON.parse(n.slice(0,n.indexOf(`
|
|
2
|
+
`))).timestamp).toISOString().slice(0,19).replaceAll(`:`,`-`);return I.join(A(),`sessions`,...r.slice(0,10).split(`-`),`rollout-${r}-${t}.jsonl`)}function Ee(e,t){return t.flatMap(e=>[e,...e.startsWith(`Bearer `)?[e.slice(7)]:[]]).filter(e=>e.length>=8).flatMap(e=>[e,JSON.stringify(e).slice(1,-1)]).sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e)}function De(e,t){let n=new Map;return{async restore(){let t=await e(`/history`).catch(e=>(console.error(`coder runner: saved history could not be listed`,e),[])),r=t.at(-1),i;return await Promise.all(t.map(async({engine:t,conversation:a})=>{if(D.test(a))try{let{data:o,state:s}=await e(`/history/${a}`);a===r.conversation&&(i=s);let c=W(Buffer.from(o,`base64`)).toString(`utf8`);for(let e of c.split(`
|
|
3
|
+
`))e.trim()&&JSON.parse(e);let[l]=await re({engine:t},a);l||(l=K(t,a,c),await H.mkdir(I.dirname(l),{recursive:!0,mode:448}),await H.writeFile(l,c,{mode:384})),n.set(a,{engine:t,hash:G(c),file:l})}catch(e){console.error(`coder runner: history ${a} could not be restored`,e)}})),{...r?{resume:{...i,engine:r.engine,threadId:r.conversation}}:{},restored:!!(r&&n.has(r.conversation))}},async save(r){let i=new Map([...n].map(([e,{engine:t}])=>[e,t]));if(r?.engine===`claude`||r?.engine===`codex`)for(let e of k(r))i.delete(e),i.set(e,r.engine);let a=await t();for(let[t,o]of i){let i=n.get(t)?.file,s=i&&await H.stat(i).then(e=>e.isFile(),()=>!1)?i:(await re({engine:o},t))[0],c=s?await H.readFile(s,`utf8`).catch(()=>``):``,l=t===r?.threadId;if(!c||!l&&G(c)===n.get(t)?.hash)continue;let u=Te(Ee(c,a)).toString(`base64`);if(u.length>3145728){console.error(`coder runner: history ${t} is too large to save`);continue}let d=l?{previousThreadIds:r.previousThreadIds}:void 0;await e(`/history`,{method:`POST`,body:JSON.stringify({engine:o,conversation:t,data:u,...d?{state:d}:{}})}).then(()=>n.set(t,{engine:o,hash:G(c),file:s}),e=>console.error(`coder runner: history ${t} was not saved`,e))}}}}var q=e({INBOX_COMMAND:()=>Qe,INBOX_SOCKET:()=>Ye,applyTaskMessage:()=>Ge,checkout:()=>Z,checkoutCache:()=>ke,inboxSocket:()=>Xe,liveConnections:()=>Ue,prepareRepo:()=>ze,receiveInbox:()=>$e,releaseCheckout:()=>Ae,requestInboxControl:()=>Ve,runTask:()=>qe,sendInbox:()=>Ze,serveTaskServer:()=>tt,serverConnections:()=>He,startInboxControl:()=>Be,taskServer:()=>Y,withCheckoutLock:()=>Q});const J=U(R);function Y(){let e=L.env.CODER_SERVER?.replace(/\/+$/,``),t=L.env.CODER_TASK_TOKEN;if(!e||!t)throw Error(`CODER_SERVER and CODER_TASK_TOKEN are required with --task`);return{server:e,token:t}}async function X(e,t,n,r=``,i={}){let a=await fetch(`${e}/tasks/${encodeURIComponent(n)}${r}`,{...i,signal:i.signal?AbortSignal.any([i.signal,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4),headers:{authorization:`Bearer ${t}`,...i.body?{"content-type":`application/json`}:{},...i.headers}}),o=await a.json().catch(()=>({}));if(!a.ok)throw Object.assign(Error(o.error??`Coder server answered ${a.status}`),{status:a.status});return o}function Oe(e){return e.length>0&&!e.startsWith(`-`)&&!e.endsWith(`/`)&&!e.endsWith(`.`)&&!e.endsWith(`.lock`)&&!/[\x00-\x20\x7f~^:?*[\\]/.test(e)&&!e.includes(`..`)&&!e.includes(`@{`)&&!e.includes(`//`)}async function Z(e,t,n,r,i){let a=e.event?.repo,o=I.join(t,`work`);if(!a)return await H.mkdir(o,{recursive:!0}),o;let s=e=>H.stat(e).then(Boolean,()=>!1);if(await s(I.join(o,`.git`))&&(r||await s(I.join(t,`.runner-task.json`))))return o;if(!Oe(a.defaultBranch))throw Error(`Invalid repository ref`);let c=new URL(a.cloneUrl),l=w[e.event.integration]?.repos?.cloneHosts??[];if(c.protocol!==`https:`||!l.includes(c.hostname))throw Error(`Repository clone host does not match the integration`);await H.mkdir(t,{recursive:!0});let u=await H.mkdtemp(I.join(t,`.git-credential-`)),d=I.join(u,`token`),f=I.join(u,`askpass.sh`);n&&(await H.writeFile(d,n,{mode:384}),await H.writeFile(f,`#!/bin/sh
|
|
4
|
+
case "$1" in *Username*) printf x-access-token;; *) command cat "$CODER_GIT_TOKEN_FILE";; esac
|
|
5
|
+
`,{mode:448}));let p=n?{env:{...L.env,GIT_ASKPASS:f,CODER_GIT_TOKEN_FILE:d,GIT_TERMINAL_PROMPT:`0`}}:void 0;try{let e={...p,signal:i,maxBuffer:67108864};r?await Q(r,async()=>{if(!await H.stat(I.join(r,`.git`)).catch(()=>void 0)){let t=await H.mkdtemp(`${r}-clone-`);try{await J(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,t],e),await H.rename(t,r)}finally{await H.rm(t,{recursive:!0,force:!0})}}await J(`git`,[`-C`,r,`worktree`,`prune`,`--expire`,`now`],e),await J(`git`,[`-C`,r,`remote`,`set-url`,`origin`,a.cloneUrl],e),await J(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await J(`git`,[`-C`,r,`worktree`,`add`,`--detach`,o,`FETCH_HEAD`],e)}):(await s(I.join(o,`.git`))||await J(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,o],e),await J(`git`,[`-C`,o,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await J(`git`,[`-C`,o,`checkout`,`--detach`,`FETCH_HEAD`],e)),await H.writeFile(je(t),(await J(`git`,[`-C`,o,`rev-parse`,`HEAD`])).stdout)}finally{await H.rm(u,{recursive:!0,force:!0})}return o}function ke(e){let t=e.event?.repo;if(t){if(![t.owner,t.name].every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e)))throw Error(`Invalid repository name`);return c(`checkouts`,new URL(t.cloneUrl).hostname,t.owner,t.name)}}async function Q(e,t){return _(`${e}.lock`,t,1/0,3e5)}async function Ae(e){if(!(await H.stat(I.join(e,`.git`)).catch(()=>void 0))?.isFile())return;let t=await J(`git`,[`-C`,e,`rev-parse`,`--git-common-dir`]).catch(async t=>{if(await H.stat(I.join(e,`.git`)).catch(()=>void 0))throw t});if(!t)return;let{stdout:n}=t,r=I.resolve(e,n.trim());await Q(I.dirname(r),async()=>{await H.stat(I.join(e,`.git`)).catch(()=>void 0)&&await J(`git`,[`--git-dir`,r,`worktree`,`remove`,`--force`,e])})}const $=1048576,je=e=>I.join(e,`.checkout-base`);async function Me(e,t){let n={maxBuffer:67108864},r=(await H.readFile(je(t),`utf8`).catch(()=>`HEAD`)).trim();await J(`git`,[`-C`,e,`add`,`--intent-to-add`,`--all`],n);let{stdout:i}=await J(`git`,[`-C`,e,`diff`,r],n);return Buffer.byteLength(i)>$?`${Buffer.from(i).subarray(0,$).toString()}\n[diff truncated]`:i}async function Ne(e,t,n){L.env.CODER_SERVER=`unix:${n}`,e.dashboard&&(L.env.CODER_DASHBOARD=e.dashboard),delete L.env.CODER_TASK_TOKEN,delete L.env.APP_TOKEN;for(let t of Object.keys(e.tokens))delete L.env[F(t)];for(let t of e.engineCredentials??[])for(let e of Object.keys(t.credential.env))delete L.env[e];let{CODEX_AUTH_JSON:r,[v]:i,...a}=e.credential.env;if(Object.assign(L.env,a),L.env[y]=JSON.stringify(e.config??{}),delete L.env.CODER_GIT_AUTHOR,e.gitAuthor&&(L.env.CODER_GIT_AUTHOR=JSON.stringify(e.gitAuthor)),L.env.CODER_MCP_MODE=`cloud`,L.env.CODER_MCP_CONNECTION_ENV=JSON.stringify(S(e.connections??{})),!r)return;let o=await H.mkdtemp(I.join(t,`.codex-`));return await H.writeFile(I.join(o,`auth.json`),r,{mode:384}),L.env.CODEX_HOME=o,o}async function Pe(e,t){let{ANTHROPIC_API_KEY:n,CLAUDE_CODE_OAUTH_TOKEN:r}=e.credential.env;if(e.credential.engine!==`claude`||!n&&!r)return;let i=await H.mkdtemp(I.join(t,`.claude-`));return L.env.CLAUDE_CONFIG_DIR=i,L.env.CLAUDE_CODE_PROJECT_DIR_NAME=`coder`,i}async function Fe(e,t,n){let r=n?await H.readFile(I.join(n,`auth.json`),`utf8`).catch(()=>``):``,i=(e=``)=>{let t=[];try{JSON.parse(e,(e,n)=>(typeof n==`string`&&/token|key/i.test(e)&&t.push(n),n))}catch{e&&console.error(`coder runner: history credentials could not be parsed`)}return t};return[t,...Object.values(e.tokens),...e.checksToken?[e.checksToken]:[],...e.postToken?[e.postToken]:[],...Object.values(e.connectionEnv??{}),...Object.entries(e.credential.env).filter(([e])=>/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH/i.test(e)).map(([,e])=>e),...i(e.credential.env.CODEX_AUTH_JSON),...e.engineCredentials?.flatMap(e=>[...Object.values(e.credential.env),...i(e.credential.env.CODEX_AUTH_JSON)])??[],...i(r)]}async function Ie(e,t,n,r){if(!r)return;let i=await H.readFile(I.join(r,`auth.json`),`utf8`).catch(()=>``);i&&n.id&&i!==n.authJson&&await X(e.server,e.token,t,`/credential`,{method:`POST`,body:JSON.stringify({authJson:i,credentialId:n.id})}).catch(()=>{}),await H.rm(r,{recursive:!0,force:!0})}function Le(e,t,n,r){let i=new Map;return{credentials:async a=>{let o=e.engineCredentials??[],s=a.engine===`custom`?b(t).models?.[a.model??``]?.envKey??`OPENAI_API_KEY`:void 0,c=o.filter(e=>s?e.credential.env[s]!==void 0:e.credential.engine===a.engine),l=e.task.runner===`http`||e.task.models?.some(e=>!e.credential);if(!c.length)return l?[{}]:[];let u=Object.fromEntries(o.flatMap(e=>Object.keys(e.credential.env)).map(e=>[e,void 0]));return Promise.all(c.map(async e=>{let{CODEX_AUTH_JSON:a,...o}=e.credential.env,s=e.id===r(),c=a&&s?L.env.CODEX_HOME:n.CODEX_HOME;if(a&&!s){if(!i.has(e.id)){let n=await H.mkdtemp(I.join(t,`.codex-`));await H.writeFile(I.join(n,`auth.json`),a,{mode:384}),i.set(e.id,{home:n,authJson:a})}c=i.get(e.id).home}return{...u,...o,CODEX_HOME:c,CLAUDE_CONFIG_DIR:s?L.env.CLAUDE_CONFIG_DIR:n.CLAUDE_CONFIG_DIR}}))},release:async(e,t)=>{await Promise.all([...i].map(([n,{home:r,authJson:i}])=>Ie(e,t,{id:n,authJson:i},r))),i.clear()}}}const Re=[[`bun.lock`,`bun`,[`install`,`--frozen-lockfile`]],[`bun.lockb`,`bun`,[`install`,`--frozen-lockfile`]],[`pnpm-lock.yaml`,`npx`,[`-y`,`pnpm`,`install`,`--frozen-lockfile`]],[`yarn.lock`,`npx`,[`-y`,`yarn`,`install`,`--frozen-lockfile`]],[`package-lock.json`,`npm`,[`ci`]]];async function ze(e,t){let n=Y(),r=await X(n.server,n.token,e),i=r.task.event;if(!i?.repo)throw Error(`The task has no repository`);let a=await Z(r.task,t,r.tokens[i.integration]);for(let[e,t,n]of Re)if(await H.stat(I.join(a,e)).catch(()=>void 0)){await J(t,n,{cwd:a,maxBuffer:67108864}).catch(()=>{});break}let o=(await J(`git`,[`-C`,a,`rev-parse`,`HEAD`])).stdout.trim();return console.log(`coder-snapshot ${o}`),{sha:o}}function Be(e,t,n){let r=new Set,i=ne(I.join(e,`inbox-control`),{apply(e){let i=e.entry;if(e.task!==t||!Number.isInteger(i?.seq)||i.seq<0||!Number.isInteger(i.generation)||i.generation<0||![`steer`,`ask`,`approve`].includes(i.kind))throw Error(`Invalid engine inbox command`);let a=n(i);return r.add(a),a.finally(()=>r.delete(a)).catch(()=>{}),a}});return{close:async()=>{i(),await Promise.allSettled([...r])}}}function Ve(e,t,n){let r=E({task:t,generation:n.generation,seq:n.seq});return ie(`apply`,{task:t,entry:n},{dir:I.join(e,`inbox-control`),id:r,keepReply:!0,timeoutMs:3e4})}function He(e){return async()=>{let t=await fetch(e.url,{headers:{authorization:`Bearer ${e.token}`},signal:AbortSignal.timeout(3e4)});if(!t.ok)throw Error(`Coder server answered ${t.status}`);let n=await t.json(),r=x(n.connections??{},n.connectionEnv),i=P(n.task,n.tokens,{...e,...n.dashboard?{dashboard:n.dashboard}:{}});return{mcp:r.mcp,env:{...r.env,...i.env},warnings:[]}}}function Ue(e){return async t=>{let n=O(e.mcp,L.env).find(e=>e.name===`conversation`)?.env;return(n?.CODER_REPLY_URL&&n.CODER_REPLY_TOKEN?He({url:n.CODER_REPLY_URL,token:n.CODER_REPLY_TOKEN}):j(e.mcp))(t)}}function We(e){return{...typeof e?.model==`string`&&e.model?{model:e.model}:{},...e?.access===`read-only`||e?.access===`auto`?{access:e.access}:{}}}async function Ge(e,t,n,a=Ue(t)){let o={task:t.name?.slice(6)??t.id,generation:n.generation,seq:n.seq},c=I.join(i(e,t.id),`inbox-control`,`${E(o)}.transcript.jsonl`);return _(`${c}.lock`,async()=>{let i=await H.readFile(c,`utf8`).catch(e=>{if(e.code===`ENOENT`)return``;throw e});for(let e of i.split(`
|
|
6
|
+
`)){if(!e.trim())continue;let t;try{t=JSON.parse(e)}catch{continue}if(E(t.command)===E(o)&&Object.hasOwn(t,`result`))return t.result}let l=n.value;if(n.kind===`steer`){let i=String(l?.text??n.value??``),c=!1;t.threadId||(c=await s(e,t.id,()=>{let n=r(e,t.id)??t;if(n.threadId)return!1;if(n.steerClosed||![`running`,`queued`].includes(n.status))throw Error(`Task stopped before it opened a conversation`);return u(e,t.id,i),!0})),c||await de(e,r(e,t.id)??t,i,{command:o,resolveConnections:a,...We(l)})}else if(n.kind===`ask`){let r=await N(e,t,String(l?.question??n.value??``),{command:o,...typeof l?.model==`string`&&l.model?{model:l.model}:{}});return r.finalMessage??r.error?.message??``}else if(n.kind===`approve`){let n=String(l?.approvalId??l?.id??``);try{await M(e,t,n,l?.decision===`deny`||l?.decision===`decline`?`decline`:`accept`,{...typeof l?.reason==`string`?{reason:l.reason}:{},command:o,resolveConnections:a})}catch(r){if(!(r instanceof Error&&r.message.includes(`already approved`)))throw r;f(e,t.id,{kind:`status`,message:`Ignored an answer to approval ${n}: ${r.message}`})}}await H.mkdir(I.dirname(c),{recursive:!0}),await H.appendFile(c,JSON.stringify({command:o,result:null})+`
|
|
7
|
+
`)})}async function Ke(e){for(let t=1;;t++)try{return await e()}catch(e){let n=e.status;if(n!==void 0&&n<500||t>=6)throw e;console.error(`coder runner: Coder server did not take the request, trying again: ${e instanceof Error?e.message:e}`),await new Promise(e=>setTimeout(e,1e3*2**(t-1)))}}async function qe(e,t){let n=Y();C(`runner.credentials.start`);let i=await Ke(()=>X(n.server,n.token,e)).catch(async t=>{throw await X(n.server,n.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`failed`,error:t instanceof Error?t.message:String(t)})}).catch(()=>{}),t});C(`runner.credentials.done`);let a=i.task.event,o=a&&i.tokens[a.integration],s=L.env.CODER_INBOX_MODE===`poll`;delete L.env.CODER_INBOX_MODE;let c=L.env.CODER_CHECKOUT_CACHE;delete L.env.CODER_CHECKOUT_CACHE;let u,d,f={CODEX_HOME:L.env.CODEX_HOME,CLAUDE_CONFIG_DIR:L.env.CLAUDE_CONFIG_DIR},p,m,h=new AbortController,g=setTimeout(()=>h.abort(Error(`timeout`)),i.timeoutMs??18e5),_=setInterval(()=>{X(n.server,n.token,e,`/heartbeat`,{method:`POST`,signal:AbortSignal.timeout(1e4)}).catch(()=>{})},3e4),v,b=async()=>{let a=l(I.join(t,`.runner-task.json`)),o=v&&a?.generation===i.generation?r(v,a.id):void 0;await p?.save(o??void 0).catch(e=>console.error(`coder runner: history upload failed`,e)),d&&await H.rm(d,{recursive:!0,force:!0}),await Ie(n,e,{id:x,authJson:i.credential.env.CODEX_AUTH_JSON},u)},x=i.task.models?.[0]?.credential,S=Le(i,t,f,()=>x),te=!1,ne=async t=>{te=!0,await b(),await S.release(n,e),await Ke(()=>X(n.server,n.token,e,`/result`,{method:`POST`,body:JSON.stringify(t)}))};try{let r=(async()=>{m=await tt(n),[u,d]=await Promise.all([Ne(i,t,m.socketPath),Pe(i,t)]),p=i.task.flow==="default"?De((t,r)=>X(n.server,n.token,e,t,r),()=>Fe(i,n.token,u)):void 0,C(`runner.environment.done`);let r=await p?.restore();return C(`runner.history.done`),r})();C(`runner.checkout.start`);let a=Promise.race([Z(i.task,t,o,c,h.signal),new Promise((e,t)=>h.signal.addEventListener(`abort`,()=>t(h.signal.reason),{once:!0}))]).then(e=>(v=e,C(`runner.checkout.done`),e)),[l,g]=await Promise.allSettled([a,r]);if(l.status===`rejected`)throw l.reason;if(g.status===`rejected`)throw g.reason;return h.signal.throwIfAborted(),await Je(e,t,n,i,l.value,o,s,h.signal,b,ne,g.value,async e=>{if(e.credential===x)return!0;let n=i.engineCredentials?.find(t=>t.id===e.credential);if(e.credential&&!n)return!1;await b();for(let[e,t]of Object.entries(f))t===void 0?delete L.env[e]:L.env[e]=t;return i.credential=n?.credential??{engine:ee(e.model).engine,env:{}},x=e.credential,[u,d]=await Promise.all([Ne(i,t,m.socketPath),Pe(i,t)]),!0},S.credentials)}catch(e){throw te||await ne({status:`failed`,error:e instanceof Error?e.message:String(e),...i.task.event&&w[i.task.event.integration]?.isUninstalled?.(e)?{installationRevoked:!0}:{}}).catch(e=>console.error(`coder runner: result delivery failed`,e)),e}finally{clearTimeout(g),clearInterval(_),await m?.close(),delete L.env[y],delete L.env.CODER_MCP_MODE,delete L.env.CODER_MCP_CONNECTION_ENV,delete L.env.CODER_SERVER,delete L.env.CODER_DASHBOARD}}async function Je(e,s,c,_,v,y,x,S,C,ne,T,re,ie){let E=_.task.event,D=_.task.flow==="default"?_.postToken:y,O=new AbortController,k,A,j=!1,M=await $e({root:s,generation:_.generation,apply:async t=>{let n=k&&r(v,k);if(!n)throw Error(`The task is not ready`);if(t.kind===`cancel`){await fe(v,n),j=!0,await Te(),await C();return}return Ve(i(v,n.id),e,t)}}),N=M.ack().seq>=0?M.ack():void 0,P,F=()=>{if(P)return P;if(!N)return Promise.resolve();let t=N;return P=X(c.server,c.token,e,`/ack`,{method:`POST`,body:JSON.stringify(t),signal:O.signal}).then(()=>{N&&N.seq<=t.seq&&(N=void 0)}).catch(e=>{throw(e.status===401||e.status===403)&&(N=void 0),e}).finally(()=>{P=void 0}),P},ve=async()=>{let t=await X(c.server,c.token,e,`/messages?after=${M.ack().seq}`,{signal:O.signal});try{t.length&&await M.apply(t)}finally{t.length&&M.ack().seq>=0&&(N=M.ack()),await F().catch(()=>{})}},L=setInterval(()=>{F().catch(()=>{})},1e3),R=l(I.join(s,`.runner-task.json`)),z=new Map,B=new Map,we=(_.logCursor??-1)+1,V=0,H=[],U,W=()=>{for(let e of B.values())for(let t of e()){if(V>=2097152)continue;let e=Buffer.byteLength(t)>65536?`A task log entry exceeded 64 KB`:t;H.push({seq:we++,at:Date.now(),level:`out`,line:e}),V+=Buffer.byteLength(e)}return U||(U=(async()=>{for(;H.length;){let t=0,n=H.slice(0,100).filter(e=>(t+=Buffer.byteLength(JSON.stringify(e)))<524288);if(!n.length)throw Error(`Task log batch is too large`);let r=!1;for(let t=0;t<3;t++)try{await X(c.server,c.token,e,`/logs`,{method:`POST`,signal:AbortSignal.timeout(5e3),body:JSON.stringify({entries:n})}),r=!0;break}catch(e){if(t===2)throw e;await new Promise(e=>setTimeout(e,1e3))}r&&H.splice(0,n.length)}})().finally(()=>{U=void 0}),U)},Te=()=>W().catch(e=>{console.error(`coder runner: log delivery failed`,e)}),G,K,Ee=!1,De=R?.generation===_.generation?R.usageStart:0,q=R?.generation===_.generation?R.turn:0,J=q+1,Y=e=>pe(w[E.integration],E,e,D,_.task.author),Oe=()=>k?ce(i(v,k)):[],Z=async t=>{await X(c.server,c.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`waiting`,approval:t,approvals:Oe()})})},ke=0,Q=async t=>{let n=k&&r(v,k)?.fallbacks||[];n.length<=ke||(ke=n.length,await X(c.server,c.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`running`,fallbacks:n,model:t.model,...t.credential?{credential:t.credential}:{}})}).catch(e=>console.error(`coder runner: fallback report failed`,e)))},Ae=new Set,$=e=>xe(i(v,e)).then(t=>{for(let n of t){let t=ye.find(e=>e.name===n.tool);if(!t)continue;let r=Se(t,n.runId,v,e,n.timeout,{integrationToken:t.platform?_.tokens[t.platform]:void 0,checksToken:_.checksToken,links:Ce(c.server,_.task.taskUrl,_.reviewAssets),onModel:ie,stop:S}).catch(e=>console.error(`coder runner: ${n.tool} ${n.runId} failed`,e)).finally(()=>Ae.delete(r));Ae.add(r)}}).catch(e=>console.error(`coder runner: async calls could not be read`,e));try{let l=_.task.models?.[0]?.model,h=T?.restored&&T.resume?.engine===(l?ee(l).engine:oe(te(_.task),b(v)).engine),y,C=he({cwd:v,...R?.generation===_.generation?{resumeTaskId:R.id,resumeTurn:q}:{},...T?.resume?{resume:T.resume}:{},agent:_.task.agent,flow:_.task.flow,task:h?{..._.task,context:{..._.task.context,messages:void 0}}:_.task,toolEnvironment:{tokens:_.tokens},replyEndpoint:{url:`${c.server}/tasks/${encodeURIComponent(e)}`,token:c.token,..._.dashboard?{dashboard:_.dashboard}:{}},connections:_.connections,connectionEnv:_.connectionEnv,post:_.task.source===E?.integration,...D?{postToken:D}:{},onStart(e){A=e},onWorker(e,t){y=t,t.once(`error`,()=>{y=void 0})},async onTask(e,t){if(k=e,S.aborted){let t=r(v,e);throw t&&await fe(v,t),S.reason}B.has(e)||B.set(e,d(I.join(i(v,e),`log.jsonl`))),z.has(e)||z.set(e,m(i(v,e),t=>{(!t||t===`log.jsonl`)&&W().catch(()=>{}),(!t||t===`async.json`)&&$(e)})),W().catch(()=>{}),$(e),o(I.join(s,`.runner-task.json`),{generation:_.generation,id:e,turn:t??q,usageStart:De}),await F().catch(()=>{}),await ve().catch(()=>{}),clearInterval(G),x&&(G=setInterval(()=>{K||=ve().catch(()=>{}).finally(()=>{K=void 0})},4e3))},onApproval:Z,async onModel(e){return await Q(e),re(e)},onFlowModel:ie}),w=new Promise((e,t)=>{let n=()=>t(S.reason);S.addEventListener(`abort`,n,{once:!0}),S.aborted&&n()}),O=await Promise.race([C,w]);if(J=(O.turn??q)+1,k&&_.task.flow==="default"){let o=[...O.postedMessages??[]],s=t(v,k,y);try{for(;;){let t=n(v,k);for(let[e,n]of t.slice(J).entries()){let t=_e(_.task,n,j,n);t.skipped&&f(v,k,{kind:`status`,message:ue}),_.task.source===E?.integration&&t.text&&!t.duplicate&&o.push(...await ge(v,k,J+e,()=>Y(t.text))),O.reply=t.text,O.ok=n.status===0,O.error=n.error?.message}J=Math.max(J,t.length);let l=r(v,k);if(l?.status===`running`||l?.status===`queued`){await Promise.race([me(v,k,Z,(e,t,n)=>ae(e,t,{...n,turn:J,worker:y,signal:S})),w]);continue}if(l&&!a(l.pid)&&g(v,k)){if(l.status!==`completed`){let e=p(v,k).length;f(v,k,{kind:`status`,message:`Discarded ${e} queued follow-up${e===1?``:`s`}: the task is ${l.status}.`});continue}let[t,...n]=p(v,k);for(let e of n)u(v,k,e);if(t){await de(v,l,t,{resolveConnections:He({url:`${c.server}/tasks/${encodeURIComponent(e)}`,token:c.token}),onWorker:e=>{y=e}});continue}}if(y?.exitCode===null&&!y.signalCode||g(v,k)||be(i(v,k))){await Promise.race([s.wait(3e4),w]);continue}if(!Ee){clearInterval(G),await K,await M.close(),Ee=!0;continue}if(n(v,k).length<=J)break}}finally{s.close()}let l=(r(v,k)?.turnUsage??[]).slice(De).flatMap(e=>e.tokens?[e.tokens]:[]);O.tokens=l.length?l.reduce((e,t)=>le(e,t)):se(v,k)?.tokens??O.tokens,o.length&&(O.postedMessages=o)}for(await Te();N;)S.throwIfAborted(),await F().catch(()=>{}),N&&await new Promise(e=>setTimeout(e,1e3));return await ne({status:j?`cancelled`:O.ok?`completed`:`failed`,result:O.reply??O.result,...!O.ok&&O.error?{error:O.error}:{},tokens:O.tokens,...Oe().length?{approvals:Oe()}:{},...O.postedMessages?.length?{postedMessages:O.postedMessages}:{},...E?.repo?{diff:await Me(v,s).catch(()=>void 0)}:{}}),O}catch(t){if(S.aborted){A?.requestStop();let t=new Set([...k?[k]:[],...A?.runningIds()??[],...h(v).filter(t=>t.name===`agent:${e}`||A&&t.flowRunId===A.runId).map(e=>e.id)]);for(let e of t){B.has(e)||B.set(e,d(I.join(i(v,e),`log.jsonl`)));let t=r(v,e);t&&await fe(v,t)}}throw await Te(),t}finally{for(let e of z.values())e.close();await U?.catch(()=>{}),clearInterval(L),clearInterval(G),O.abort(),await Promise.allSettled([K,P]),Ee||await M.close()}}const Ye=`/tmp/coder-inbox.sock`,Xe=e=>I.join(B.tmpdir(),`coder-${we(`sha256`).update(e).digest(`hex`).slice(0,24)}.sock`);function Ze(e,t){return new Promise((n,r)=>{let i=V.request({socketPath:e,path:`/messages`,method:`POST`,headers:{"content-type":`application/json`}},e=>{let t=``;e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{if(e.statusCode!==200)return r(Error(`Task inbox answered ${e.statusCode}`));try{n(JSON.parse(t))}catch(e){r(e)}}),e.on(`error`,r)});i.setTimeout(1e4,()=>i.destroy(Error(`Task inbox timed out`))),i.on(`error`,r),i.end(JSON.stringify({entries:t}))})}const Qe=`const http=require('node:http');const req=http.request({socketPath:process.env.CODER_INBOX_SOCKET||'/tmp/coder-inbox.sock',path:'/messages',method:'POST',headers:{'content-type':'application/json'}},res=>{res.pipe(process.stdout);res.on('end',()=>{if(res.statusCode!==200)process.exitCode=1})});req.on('error',()=>{process.exitCode=1});req.setTimeout(10000,()=>req.destroy());req.end(JSON.stringify({entries:JSON.parse(process.env.CODER_INBOX_MESSAGES)}));`;async function $e(e){let t=I.join(e.root,`.runner-inbox.json`),n=l(t),r=n?.generation===e.generation?n:{generation:e.generation,seq:-1,answers:[]},i=Promise.resolve(),a=n=>{let a=async()=>{if(!Array.isArray(n)||n.some(t=>!Number.isInteger(t.seq)||t.seq<0||t.generation!==e.generation||![`steer`,`ask`,`approve`,`cancel`].includes(t.kind)))throw Error(`Invalid task messages`);for(let i of[...n].sort((e,t)=>e.seq-t.seq)){if(i.seq<=r.seq)continue;let n=await e.apply(i),a={generation:e.generation,seq:i.seq,answers:[...r.answers??[],...i.kind===`ask`?[{seq:i.seq,value:n}]:[]]};o(t,a),r=a}return r},s=i.then(a,a);return i=s.then(()=>{},()=>{}),s},s=e.socketPath??L.env.CODER_INBOX_SOCKET??Xe(e.root);if(await H.lstat(s).then(()=>!0,()=>!1)){if(!await new Promise((e,t)=>{let n=z.connect(s);n.once(`connect`,()=>{n.destroy(),e(!1)}),n.once(`error`,n=>n.code===`ECONNREFUSED`?e(!0):t(n))}))throw Error(`The task inbox is already running`);await H.unlink(s)}let c=V.createServer(async(e,t)=>{if(e.method!==`POST`||e.url!==`/messages`){t.writeHead(404).end();return}let n=``;try{for await(let t of e)if(n+=t,Buffer.byteLength(n)>1048576)throw Error(`Messages too large`);let r=await a(JSON.parse(n).entries);t.writeHead(200,{"content-type":`application/json`}).end(JSON.stringify(r))}catch{t.writeHead(409).end()}});return await H.mkdir(e.root,{recursive:!0}),await new Promise((e,t)=>{c.once(`error`,t),c.listen(s,e)}),await H.chmod(s,384),{apply:a,ack:()=>r,close:async()=>{await i,await new Promise(e=>c.close(()=>e()))}}}const et=new Set([`authorization`,`proxy-authorization`,`cookie`,`host`,`connection`,`keep-alive`,`upgrade`,`transfer-encoding`,`content-length`,`content-encoding`]);async function tt(e){let t=await H.realpath(await H.mkdtemp(`/tmp/coder-`)),n=I.join(t,`server.sock`),r=V.createServer(ve(async t=>{let n=new URL(t.url);if(!n.pathname.startsWith(`/admin/`))return Response.json({error:`Not found`},{status:404});let r=new URL(`${e.server}${n.pathname}${n.search}`),i=new Headers(t.headers);for(let e of et)i.delete(e);i.set(`authorization`,`Bearer ${e.token}`);let a=await fetch(r,{method:t.method,headers:i,body:t.body,duplex:`half`,redirect:`manual`,signal:t.signal}),o=new Headers(a.headers);for(let e of et)o.delete(e);return new Response(a.body,{status:a.status,headers:o})}));return await new Promise((e,t)=>{r.once(`error`,t),r.listen(n,e)}),await H.chmod(n,384),{socketPath:n,close:async()=>{r.closeAllConnections(),await new Promise(e=>r.close(()=>e())),await H.rm(t,{recursive:!0,force:!0})}}}export{Xe as a,Y as c,ke as i,q as l,Ye as n,Ae as o,Ge as r,Ze as s,Qe as t,Q as u};
|