@paperclipai/server 0.3.1 → 2026.3.17-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +23 -2
- package/dist/adapters/registry.js.map +1 -1
- package/dist/adapters/types.d.ts +1 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +115 -3
- package/dist/app.js.map +1 -1
- package/dist/attachment-types.d.ts.map +1 -1
- package/dist/attachment-types.js +6 -0
- package/dist/attachment-types.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/home-paths.d.ts +5 -0
- package/dist/home-paths.d.ts.map +1 -1
- package/dist/home-paths.js +18 -0
- package/dist/home-paths.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -42
- package/dist/index.js.map +1 -1
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.js +90 -1
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +64 -1
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +191 -13
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/companies.d.ts.map +1 -1
- package/dist/routes/companies.js +10 -1
- package/dist/routes/companies.js.map +1 -1
- package/dist/routes/costs.d.ts.map +1 -1
- package/dist/routes/costs.js +160 -5
- package/dist/routes/costs.js.map +1 -1
- package/dist/routes/execution-workspaces.d.ts +3 -0
- package/dist/routes/execution-workspaces.d.ts.map +1 -0
- package/dist/routes/execution-workspaces.js +165 -0
- package/dist/routes/execution-workspaces.js.map +1 -0
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +3 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/instance-settings.d.ts +3 -0
- package/dist/routes/instance-settings.d.ts.map +1 -0
- package/dist/routes/instance-settings.js +46 -0
- package/dist/routes/instance-settings.js.map +1 -0
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +339 -4
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/plugin-ui-static.d.ts +69 -0
- package/dist/routes/plugin-ui-static.d.ts.map +1 -0
- package/dist/routes/plugin-ui-static.js +411 -0
- package/dist/routes/plugin-ui-static.js.map +1 -0
- package/dist/routes/plugins.d.ts +120 -0
- package/dist/routes/plugins.d.ts.map +1 -0
- package/dist/routes/plugins.js +1784 -0
- package/dist/routes/plugins.js.map +1 -0
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +5 -1
- package/dist/routes/projects.js.map +1 -1
- package/dist/services/access.d.ts +2 -2
- package/dist/services/activity-log.d.ts +3 -0
- package/dist/services/activity-log.d.ts.map +1 -1
- package/dist/services/activity-log.js +34 -0
- package/dist/services/activity-log.js.map +1 -1
- package/dist/services/agents.d.ts +39 -15
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/agents.js +60 -8
- package/dist/services/agents.js.map +1 -1
- package/dist/services/approvals.d.ts +5 -5
- package/dist/services/approvals.d.ts.map +1 -1
- package/dist/services/approvals.js +11 -0
- package/dist/services/approvals.js.map +1 -1
- package/dist/services/assets.d.ts +4 -4
- package/dist/services/budgets.d.ts +38 -0
- package/dist/services/budgets.d.ts.map +1 -0
- package/dist/services/budgets.js +784 -0
- package/dist/services/budgets.js.map +1 -0
- package/dist/services/companies.d.ts +39 -418
- package/dist/services/companies.d.ts.map +1 -1
- package/dist/services/companies.js +157 -21
- package/dist/services/companies.js.map +1 -1
- package/dist/services/costs.d.ts +67 -3
- package/dist/services/costs.d.ts.map +1 -1
- package/dist/services/costs.js +185 -57
- package/dist/services/costs.js.map +1 -1
- package/dist/services/cron.d.ts +80 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +300 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/dashboard.d.ts +6 -0
- package/dist/services/dashboard.d.ts.map +1 -1
- package/dist/services/dashboard.js +9 -0
- package/dist/services/dashboard.js.map +1 -1
- package/dist/services/documents.d.ts +164 -0
- package/dist/services/documents.d.ts.map +1 -0
- package/dist/services/documents.js +382 -0
- package/dist/services/documents.js.map +1 -0
- package/dist/services/execution-workspace-policy.d.ts +2 -1
- package/dist/services/execution-workspace-policy.d.ts.map +1 -1
- package/dist/services/execution-workspace-policy.js +63 -15
- package/dist/services/execution-workspace-policy.js.map +1 -1
- package/dist/services/execution-workspaces.d.ts +19 -0
- package/dist/services/execution-workspaces.d.ts.map +1 -0
- package/dist/services/execution-workspaces.js +87 -0
- package/dist/services/execution-workspaces.js.map +1 -0
- package/dist/services/finance.d.ts +93 -0
- package/dist/services/finance.d.ts.map +1 -0
- package/dist/services/finance.js +120 -0
- package/dist/services/finance.js.map +1 -0
- package/dist/services/heartbeat.d.ts +11 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +1292 -559
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts +9 -0
- package/dist/services/instance-settings.d.ts.map +1 -0
- package/dist/services/instance-settings.js +80 -0
- package/dist/services/instance-settings.js.map +1 -0
- package/dist/services/issue-approvals.d.ts +1 -1
- package/dist/services/issues.d.ts +14 -2
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +161 -9
- package/dist/services/issues.js.map +1 -1
- package/dist/services/live-events.d.ts +5 -0
- package/dist/services/live-events.d.ts.map +1 -1
- package/dist/services/live-events.js +9 -0
- package/dist/services/live-events.js.map +1 -1
- package/dist/services/plugin-capability-validator.d.ts +108 -0
- package/dist/services/plugin-capability-validator.d.ts.map +1 -0
- package/dist/services/plugin-capability-validator.js +268 -0
- package/dist/services/plugin-capability-validator.js.map +1 -0
- package/dist/services/plugin-config-validator.d.ts +26 -0
- package/dist/services/plugin-config-validator.d.ts.map +1 -0
- package/dist/services/plugin-config-validator.js +41 -0
- package/dist/services/plugin-config-validator.js.map +1 -0
- package/dist/services/plugin-dev-watcher.d.ts +30 -0
- package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
- package/dist/services/plugin-dev-watcher.js +241 -0
- package/dist/services/plugin-dev-watcher.js.map +1 -0
- package/dist/services/plugin-event-bus.d.ts +149 -0
- package/dist/services/plugin-event-bus.d.ts.map +1 -0
- package/dist/services/plugin-event-bus.js +258 -0
- package/dist/services/plugin-event-bus.js.map +1 -0
- package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
- package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
- package/dist/services/plugin-host-service-cleanup.js +37 -0
- package/dist/services/plugin-host-service-cleanup.js.map +1 -0
- package/dist/services/plugin-host-services.d.ts +13 -0
- package/dist/services/plugin-host-services.d.ts.map +1 -0
- package/dist/services/plugin-host-services.js +969 -0
- package/dist/services/plugin-host-services.js.map +1 -0
- package/dist/services/plugin-job-coordinator.d.ts +81 -0
- package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
- package/dist/services/plugin-job-coordinator.js +172 -0
- package/dist/services/plugin-job-coordinator.js.map +1 -0
- package/dist/services/plugin-job-scheduler.d.ts +163 -0
- package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
- package/dist/services/plugin-job-scheduler.js +454 -0
- package/dist/services/plugin-job-scheduler.js.map +1 -0
- package/dist/services/plugin-job-store.d.ts +208 -0
- package/dist/services/plugin-job-store.d.ts.map +1 -0
- package/dist/services/plugin-job-store.js +350 -0
- package/dist/services/plugin-job-store.js.map +1 -0
- package/dist/services/plugin-lifecycle.d.ts +203 -0
- package/dist/services/plugin-lifecycle.d.ts.map +1 -0
- package/dist/services/plugin-lifecycle.js +476 -0
- package/dist/services/plugin-lifecycle.js.map +1 -0
- package/dist/services/plugin-loader.d.ts +441 -0
- package/dist/services/plugin-loader.d.ts.map +1 -0
- package/dist/services/plugin-loader.js +1192 -0
- package/dist/services/plugin-loader.js.map +1 -0
- package/dist/services/plugin-log-retention.d.ts +20 -0
- package/dist/services/plugin-log-retention.d.ts.map +1 -0
- package/dist/services/plugin-log-retention.js +63 -0
- package/dist/services/plugin-log-retention.js.map +1 -0
- package/dist/services/plugin-manifest-validator.d.ts +79 -0
- package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
- package/dist/services/plugin-manifest-validator.js +84 -0
- package/dist/services/plugin-manifest-validator.js.map +1 -0
- package/dist/services/plugin-registry.d.ts +2542 -0
- package/dist/services/plugin-registry.d.ts.map +1 -0
- package/dist/services/plugin-registry.js +539 -0
- package/dist/services/plugin-registry.js.map +1 -0
- package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
- package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
- package/dist/services/plugin-runtime-sandbox.js +154 -0
- package/dist/services/plugin-runtime-sandbox.js.map +1 -0
- package/dist/services/plugin-secrets-handler.d.ts +81 -0
- package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
- package/dist/services/plugin-secrets-handler.js +275 -0
- package/dist/services/plugin-secrets-handler.js.map +1 -0
- package/dist/services/plugin-state-store.d.ts +92 -0
- package/dist/services/plugin-state-store.d.ts.map +1 -0
- package/dist/services/plugin-state-store.js +190 -0
- package/dist/services/plugin-state-store.js.map +1 -0
- package/dist/services/plugin-stream-bus.d.ts +29 -0
- package/dist/services/plugin-stream-bus.d.ts.map +1 -0
- package/dist/services/plugin-stream-bus.js +48 -0
- package/dist/services/plugin-stream-bus.js.map +1 -0
- package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
- package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
- package/dist/services/plugin-tool-dispatcher.js +224 -0
- package/dist/services/plugin-tool-dispatcher.js.map +1 -0
- package/dist/services/plugin-tool-registry.d.ts +192 -0
- package/dist/services/plugin-tool-registry.d.ts.map +1 -0
- package/dist/services/plugin-tool-registry.js +224 -0
- package/dist/services/plugin-tool-registry.js.map +1 -0
- package/dist/services/plugin-worker-manager.d.ts +260 -0
- package/dist/services/plugin-worker-manager.d.ts.map +1 -0
- package/dist/services/plugin-worker-manager.js +835 -0
- package/dist/services/plugin-worker-manager.js.map +1 -0
- package/dist/services/projects.d.ts +12 -1
- package/dist/services/projects.d.ts.map +1 -1
- package/dist/services/projects.js +100 -4
- package/dist/services/projects.js.map +1 -1
- package/dist/services/quota-windows.d.ts +9 -0
- package/dist/services/quota-windows.d.ts.map +1 -0
- package/dist/services/quota-windows.js +56 -0
- package/dist/services/quota-windows.js.map +1 -0
- package/dist/services/secrets.d.ts +5 -5
- package/dist/services/work-products.d.ts +14 -0
- package/dist/services/work-products.d.ts.map +1 -0
- package/dist/services/work-products.js +100 -0
- package/dist/services/work-products.js.map +1 -0
- package/dist/services/workspace-operation-log-store.d.ts +33 -0
- package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
- package/dist/services/workspace-operation-log-store.js +110 -0
- package/dist/services/workspace-operation-log-store.js.map +1 -0
- package/dist/services/workspace-operations.d.ts +44 -0
- package/dist/services/workspace-operations.d.ts.map +1 -0
- package/dist/services/workspace-operations.js +204 -0
- package/dist/services/workspace-operations.js.map +1 -0
- package/dist/services/workspace-runtime.d.ts +43 -5
- package/dist/services/workspace-runtime.d.ts.map +1 -1
- package/dist/services/workspace-runtime.js +413 -30
- package/dist/services/workspace-runtime.js.map +1 -1
- package/dist/ui-branding.d.ts +10 -1
- package/dist/ui-branding.d.ts.map +1 -1
- package/dist/ui-branding.js +164 -14
- package/dist/ui-branding.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +32 -14
- package/skills/paperclip/SKILL.md +34 -20
- package/skills/paperclip-create-plugin/SKILL.md +101 -0
- package/ui-dist/assets/{_basePickBy-B0xbZITw.js → _basePickBy-Chytvk8p.js} +1 -1
- package/ui-dist/assets/{_baseUniq-Cfd5u3qc.js → _baseUniq-BVL8b2zA.js} +1 -1
- package/ui-dist/assets/{arc-7Xbu8tBF.js → arc-D5hJS7gD.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-VXUJARFQ-C8F7ZRYc.js → architectureDiagram-VXUJARFQ-BFq3iN58.js} +1 -1
- package/ui-dist/assets/{blockDiagram-VD42YOAC-Dp08a65A.js → blockDiagram-VD42YOAC-B69ok7vL.js} +1 -1
- package/ui-dist/assets/{c4Diagram-YG6GDRKO-BJfslTgZ.js → c4Diagram-YG6GDRKO-FE0D9aiA.js} +1 -1
- package/ui-dist/assets/channel-CiKAknwU.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-BhaYWH7e.js → chunk-4BX2VUAB-SAhF6g-l.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-BOzJUsYW.js → chunk-55IACEB6-yxKD70bX.js} +1 -1
- package/ui-dist/assets/{chunk-B4BG7PRW-CbVcziyE.js → chunk-B4BG7PRW-qB4VaAIx.js} +1 -1
- package/ui-dist/assets/{chunk-DI55MBZ5-DghPtP3y.js → chunk-DI55MBZ5-B4NIq1Ee.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-CB095Kfn.js → chunk-FMBD7UC4-B5kLoRe2.js} +1 -1
- package/ui-dist/assets/{chunk-QN33PNHL-DfpzfDqJ.js → chunk-QN33PNHL-BVVG2n_X.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-Df3d5z1y.js → chunk-QZHKN3VN-ncMubclp.js} +1 -1
- package/ui-dist/assets/{chunk-TZMSLE5B-B6tX6bZI.js → chunk-TZMSLE5B-DSyjQk8C.js} +1 -1
- package/ui-dist/assets/classDiagram-2ON5EDUG-B93oQX02.js +1 -0
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-B93oQX02.js +1 -0
- package/ui-dist/assets/clone-Dld-3yq0.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-38wg_s9V.js → cose-bilkent-S5V4N54A-BAikNewC.js} +1 -1
- package/ui-dist/assets/{dagre-6UL2VRFP-DPVj3XLS.js → dagre-6UL2VRFP-j223UI8_.js} +1 -1
- package/ui-dist/assets/{diagram-PSM6KHXK-BJh89zUA.js → diagram-PSM6KHXK-Bhg27ZsN.js} +1 -1
- package/ui-dist/assets/{diagram-QEK2KX5R-Bw0m_j10.js → diagram-QEK2KX5R-BmtcrTHq.js} +1 -1
- package/ui-dist/assets/{diagram-S2PKOQOG-D7_M2F3u.js → diagram-S2PKOQOG-x8XuP7dH.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q2GNP2WA-CLsjqTWP.js → erDiagram-Q2GNP2WA-Dc8mHvB-.js} +1 -1
- package/ui-dist/assets/{flowDiagram-NV44I4VS-BZZ7ezVB.js → flowDiagram-NV44I4VS-Br08v6xs.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-JELNMOA3-KzsFuwBt.js → ganttDiagram-JELNMOA3-CksKhiV8.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-V2S2FVAM-DSHtY7Vu.js → gitGraphDiagram-V2S2FVAM-DmitztAD.js} +1 -1
- package/ui-dist/assets/{graph-luIG1UAS.js → graph-Xzh7bNfz.js} +1 -1
- package/ui-dist/assets/{index-nFjLambq.js → index-B-MPJNeS.js} +1 -1
- package/ui-dist/assets/{index-RUBFVv6t.js → index-BAOC35TS.js} +1 -1
- package/ui-dist/assets/{index-CaR9XM4h.js → index-BCtrpKdJ.js} +1 -1
- package/ui-dist/assets/{index-itc7BfMy.js → index-B_mlwDCG.js} +1 -1
- package/ui-dist/assets/{index-1gX09-Fl.js → index-Bp8oJMwx.js} +1 -1
- package/ui-dist/assets/{index-B_3g3Rie.js → index-BqOfMG1d.js} +1 -1
- package/ui-dist/assets/{index-uR3zjYaD.js → index-C0hw7cTu.js} +1 -1
- package/ui-dist/assets/{index-Ds7vLTSK.js → index-C1ENEd6Y.js} +1 -1
- package/ui-dist/assets/{index-CeDCs_2i.js → index-CGB1OHQi.js} +1 -1
- package/ui-dist/assets/{index-DBy0vJy3.js → index-CZlfAt7E.js} +1 -1
- package/ui-dist/assets/{index-00kuG4sI.js → index-CeL-QouZ.js} +1 -1
- package/ui-dist/assets/{index-Bv4xCjxl.js → index-Cz0TxJbw.js} +1 -1
- package/ui-dist/assets/{index-DJf8diAA.js → index-DBxUCwDG.js} +1 -1
- package/ui-dist/assets/{index-DnIPDZLp.js → index-DGzQUMWC.js} +1 -1
- package/ui-dist/assets/{index-CbGtsjW7.js → index-DI9dat7c.js} +1 -1
- package/ui-dist/assets/{index-BfB4lKJN.js → index-DMpo-QSZ.js} +1 -1
- package/ui-dist/assets/{index-DcfLFstG.js → index-DQ6xyFaN.js} +1 -1
- package/ui-dist/assets/{index-B1ZMzzs0.js → index-DWMQ1Fyj.js} +1 -1
- package/ui-dist/assets/index-DbrFgvLd.css +1 -0
- package/ui-dist/assets/{index-C8XyGAr9.js → index-Er4i9aLN.js} +1 -1
- package/ui-dist/assets/{index-C2SZYIDA.js → index-I5K-yQx5.js} +1 -1
- package/ui-dist/assets/index-MuodIbDJ.js +1120 -0
- package/ui-dist/assets/{index-BeeKMqNU.js → index-auLN8BHe.js} +1 -1
- package/ui-dist/assets/{index-DoTq-BeR.js → index-xw01-Pl4.js} +1 -1
- package/ui-dist/assets/{infoDiagram-HS3SLOUP-CDEfWpme.js → infoDiagram-HS3SLOUP-DHb4TS1W.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-XKPGCS4Q-i7nsbg_Y.js → journeyDiagram-XKPGCS4Q-CLRBeXVU.js} +1 -1
- package/ui-dist/assets/{kanban-definition-3W4ZIXB7-DDlx1qVE.js → kanban-definition-3W4ZIXB7-CsQp6woE.js} +1 -1
- package/ui-dist/assets/{layout-C7AtmJzX.js → layout-DwD9tZ5r.js} +1 -1
- package/ui-dist/assets/{linear-C5jHT-WP.js → linear-DF9n_1d3.js} +1 -1
- package/ui-dist/assets/{mermaid.core-C8YQ4fcY.js → mermaid.core-CDm4Crkq.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-VGOIOE7T-B9m9PuUg.js → mindmap-definition-VGOIOE7T-CVzU1x4i.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ADFJNKIX-SvKywCSE.js → pieDiagram-ADFJNKIX-CWgl0Up8.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-AYHSOK5B-QfBPm7Y1.js → quadrantDiagram-AYHSOK5B-CcedyN6Q.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-UZGBJVZJ-DnfQQuwi.js → requirementDiagram-UZGBJVZJ-DZ4BVz3s.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-TZEHDZUN-DvLkjzIW.js → sankeyDiagram-TZEHDZUN-CLHEx34B.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-WL72ISMW-5Lq2rWBc.js → sequenceDiagram-WL72ISMW-nmTJbPyy.js} +1 -1
- package/ui-dist/assets/{stateDiagram-FKZM4ZOC-DcYPHDyi.js → stateDiagram-FKZM4ZOC-_UGwFEqN.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-CvFVoOUd.js +1 -0
- package/ui-dist/assets/{timeline-definition-IT6M3QCI-lrN4JmWa.js → timeline-definition-IT6M3QCI-Bibk8Daj.js} +1 -1
- package/ui-dist/assets/{treemap-GDKQZRPO-DFJKIBTQ.js → treemap-GDKQZRPO-Ch3rlaqT.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-PRI3JC2R-CT47vtdm.js → xychartDiagram-PRI3JC2R-DBUudr-E.js} +1 -1
- package/ui-dist/index.html +4 -2
- package/skills/create-agent-adapter/SKILL.md +0 -718
- package/ui-dist/assets/channel-BViQDbSq.js +0 -1
- package/ui-dist/assets/classDiagram-2ON5EDUG-CjMCmxMT.js +0 -1
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-CjMCmxMT.js +0 -1
- package/ui-dist/assets/clone-Dbn9wtE1.js +0 -1
- package/ui-dist/assets/index-BHP9dico.js +0 -1006
- package/ui-dist/assets/index-BfNaDZnn.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-nv50YYrl.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-runtime.d.ts","sourceRoot":"","sources":["../../src/services/workspace-runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-runtime.d.ts","sourceRoot":"","sources":["../../src/services/workspace-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,16 @@ function stableStringify(value) {
|
|
|
21
21
|
}
|
|
22
22
|
return JSON.stringify(value);
|
|
23
23
|
}
|
|
24
|
+
export function sanitizeRuntimeServiceBaseEnv(baseEnv) {
|
|
25
|
+
const env = { ...baseEnv };
|
|
26
|
+
for (const key of Object.keys(env)) {
|
|
27
|
+
if (key.startsWith("PAPERCLIP_")) {
|
|
28
|
+
delete env[key];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
delete env.DATABASE_URL;
|
|
32
|
+
return env;
|
|
33
|
+
}
|
|
24
34
|
function stableRuntimeServiceId(input) {
|
|
25
35
|
if (input.reportId)
|
|
26
36
|
return input.reportId;
|
|
@@ -44,6 +54,7 @@ function toRuntimeServiceRef(record, overrides) {
|
|
|
44
54
|
companyId: record.companyId,
|
|
45
55
|
projectId: record.projectId,
|
|
46
56
|
projectWorkspaceId: record.projectWorkspaceId,
|
|
57
|
+
executionWorkspaceId: record.executionWorkspaceId,
|
|
47
58
|
issueId: record.issueId,
|
|
48
59
|
serviceName: record.serviceName,
|
|
49
60
|
status: record.status,
|
|
@@ -115,12 +126,17 @@ function resolveConfiguredPath(value, baseDir) {
|
|
|
115
126
|
}
|
|
116
127
|
return path.resolve(baseDir, value);
|
|
117
128
|
}
|
|
118
|
-
|
|
129
|
+
function formatCommandForDisplay(command, args) {
|
|
130
|
+
return [command, ...args]
|
|
131
|
+
.map((part) => (/^[A-Za-z0-9_./:-]+$/.test(part) ? part : JSON.stringify(part)))
|
|
132
|
+
.join(" ");
|
|
133
|
+
}
|
|
134
|
+
async function executeProcess(input) {
|
|
119
135
|
const proc = await new Promise((resolve, reject) => {
|
|
120
|
-
const child = spawn(
|
|
121
|
-
cwd,
|
|
136
|
+
const child = spawn(input.command, input.args, {
|
|
137
|
+
cwd: input.cwd,
|
|
122
138
|
stdio: ["ignore", "pipe", "pipe"],
|
|
123
|
-
env: process.env,
|
|
139
|
+
env: input.env ?? process.env,
|
|
124
140
|
});
|
|
125
141
|
let stdout = "";
|
|
126
142
|
let stderr = "";
|
|
@@ -133,14 +149,42 @@ async function runGit(args, cwd) {
|
|
|
133
149
|
child.on("error", reject);
|
|
134
150
|
child.on("close", (code) => resolve({ stdout, stderr, code }));
|
|
135
151
|
});
|
|
152
|
+
return proc;
|
|
153
|
+
}
|
|
154
|
+
async function runGit(args, cwd) {
|
|
155
|
+
const proc = await executeProcess({
|
|
156
|
+
command: "git",
|
|
157
|
+
args,
|
|
158
|
+
cwd,
|
|
159
|
+
});
|
|
136
160
|
if (proc.code !== 0) {
|
|
137
161
|
throw new Error(proc.stderr.trim() || proc.stdout.trim() || `git ${args.join(" ")} failed`);
|
|
138
162
|
}
|
|
139
163
|
return proc.stdout.trim();
|
|
140
164
|
}
|
|
165
|
+
function gitErrorIncludes(error, needle) {
|
|
166
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
167
|
+
return message.toLowerCase().includes(needle.toLowerCase());
|
|
168
|
+
}
|
|
141
169
|
async function directoryExists(value) {
|
|
142
170
|
return fs.stat(value).then((stats) => stats.isDirectory()).catch(() => false);
|
|
143
171
|
}
|
|
172
|
+
function terminateChildProcess(child) {
|
|
173
|
+
if (!child.pid)
|
|
174
|
+
return;
|
|
175
|
+
if (process.platform !== "win32") {
|
|
176
|
+
try {
|
|
177
|
+
process.kill(-child.pid, "SIGTERM");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Fall through to the direct child kill.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!child.killed) {
|
|
185
|
+
child.kill("SIGTERM");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
144
188
|
function buildWorkspaceCommandEnv(input) {
|
|
145
189
|
const env = { ...process.env };
|
|
146
190
|
env.PAPERCLIP_WORKSPACE_CWD = input.worktreePath;
|
|
@@ -165,22 +209,11 @@ function buildWorkspaceCommandEnv(input) {
|
|
|
165
209
|
}
|
|
166
210
|
async function runWorkspaceCommand(input) {
|
|
167
211
|
const shell = process.env.SHELL?.trim() || "/bin/sh";
|
|
168
|
-
const proc = await
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
});
|
|
174
|
-
let stdout = "";
|
|
175
|
-
let stderr = "";
|
|
176
|
-
child.stdout?.on("data", (chunk) => {
|
|
177
|
-
stdout += String(chunk);
|
|
178
|
-
});
|
|
179
|
-
child.stderr?.on("data", (chunk) => {
|
|
180
|
-
stderr += String(chunk);
|
|
181
|
-
});
|
|
182
|
-
child.on("error", reject);
|
|
183
|
-
child.on("close", (code) => resolve({ stdout, stderr, code }));
|
|
212
|
+
const proc = await executeProcess({
|
|
213
|
+
command: shell,
|
|
214
|
+
args: ["-c", input.command],
|
|
215
|
+
cwd: input.cwd,
|
|
216
|
+
env: input.env,
|
|
184
217
|
});
|
|
185
218
|
if (proc.code === 0)
|
|
186
219
|
return;
|
|
@@ -189,11 +222,90 @@ async function runWorkspaceCommand(input) {
|
|
|
189
222
|
? `${input.label} failed: ${details}`
|
|
190
223
|
: `${input.label} failed with exit code ${proc.code ?? -1}`);
|
|
191
224
|
}
|
|
225
|
+
async function recordGitOperation(recorder, input) {
|
|
226
|
+
if (!recorder) {
|
|
227
|
+
return runGit(input.args, input.cwd);
|
|
228
|
+
}
|
|
229
|
+
let stdout = "";
|
|
230
|
+
let stderr = "";
|
|
231
|
+
let code = null;
|
|
232
|
+
await recorder.recordOperation({
|
|
233
|
+
phase: input.phase,
|
|
234
|
+
command: formatCommandForDisplay("git", input.args),
|
|
235
|
+
cwd: input.cwd,
|
|
236
|
+
metadata: input.metadata ?? null,
|
|
237
|
+
run: async () => {
|
|
238
|
+
const result = await executeProcess({
|
|
239
|
+
command: "git",
|
|
240
|
+
args: input.args,
|
|
241
|
+
cwd: input.cwd,
|
|
242
|
+
});
|
|
243
|
+
stdout = result.stdout;
|
|
244
|
+
stderr = result.stderr;
|
|
245
|
+
code = result.code;
|
|
246
|
+
return {
|
|
247
|
+
status: result.code === 0 ? "succeeded" : "failed",
|
|
248
|
+
exitCode: result.code,
|
|
249
|
+
stdout: result.stdout,
|
|
250
|
+
stderr: result.stderr,
|
|
251
|
+
system: result.code === 0 ? input.successMessage ?? null : null,
|
|
252
|
+
};
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
if (code !== 0) {
|
|
256
|
+
const details = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
|
|
257
|
+
throw new Error(details.length > 0
|
|
258
|
+
? `${input.failureLabel ?? `git ${input.args.join(" ")}`} failed: ${details}`
|
|
259
|
+
: `${input.failureLabel ?? `git ${input.args.join(" ")}`} failed with exit code ${code ?? -1}`);
|
|
260
|
+
}
|
|
261
|
+
return stdout.trim();
|
|
262
|
+
}
|
|
263
|
+
async function recordWorkspaceCommandOperation(recorder, input) {
|
|
264
|
+
if (!recorder) {
|
|
265
|
+
await runWorkspaceCommand(input);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
let stdout = "";
|
|
269
|
+
let stderr = "";
|
|
270
|
+
let code = null;
|
|
271
|
+
await recorder.recordOperation({
|
|
272
|
+
phase: input.phase,
|
|
273
|
+
command: input.command,
|
|
274
|
+
cwd: input.cwd,
|
|
275
|
+
metadata: input.metadata ?? null,
|
|
276
|
+
run: async () => {
|
|
277
|
+
const shell = process.env.SHELL?.trim() || "/bin/sh";
|
|
278
|
+
const result = await executeProcess({
|
|
279
|
+
command: shell,
|
|
280
|
+
args: ["-c", input.command],
|
|
281
|
+
cwd: input.cwd,
|
|
282
|
+
env: input.env,
|
|
283
|
+
});
|
|
284
|
+
stdout = result.stdout;
|
|
285
|
+
stderr = result.stderr;
|
|
286
|
+
code = result.code;
|
|
287
|
+
return {
|
|
288
|
+
status: result.code === 0 ? "succeeded" : "failed",
|
|
289
|
+
exitCode: result.code,
|
|
290
|
+
stdout: result.stdout,
|
|
291
|
+
stderr: result.stderr,
|
|
292
|
+
system: result.code === 0 ? input.successMessage ?? null : null,
|
|
293
|
+
};
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
if (code === 0)
|
|
297
|
+
return;
|
|
298
|
+
const details = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
|
|
299
|
+
throw new Error(details.length > 0
|
|
300
|
+
? `${input.label} failed: ${details}`
|
|
301
|
+
: `${input.label} failed with exit code ${code ?? -1}`);
|
|
302
|
+
}
|
|
192
303
|
async function provisionExecutionWorktree(input) {
|
|
193
304
|
const provisionCommand = asString(input.strategy.provisionCommand, "").trim();
|
|
194
305
|
if (!provisionCommand)
|
|
195
306
|
return;
|
|
196
|
-
await
|
|
307
|
+
await recordWorkspaceCommandOperation(input.recorder, {
|
|
308
|
+
phase: "workspace_provision",
|
|
197
309
|
command: provisionCommand,
|
|
198
310
|
cwd: input.worktreePath,
|
|
199
311
|
env: buildWorkspaceCommandEnv({
|
|
@@ -206,8 +318,47 @@ async function provisionExecutionWorktree(input) {
|
|
|
206
318
|
created: input.created,
|
|
207
319
|
}),
|
|
208
320
|
label: `Execution workspace provision command "${provisionCommand}"`,
|
|
321
|
+
metadata: {
|
|
322
|
+
repoRoot: input.repoRoot,
|
|
323
|
+
worktreePath: input.worktreePath,
|
|
324
|
+
branchName: input.branchName,
|
|
325
|
+
created: input.created,
|
|
326
|
+
},
|
|
327
|
+
successMessage: `Provisioned workspace at ${input.worktreePath}\n`,
|
|
209
328
|
});
|
|
210
329
|
}
|
|
330
|
+
function buildExecutionWorkspaceCleanupEnv(input) {
|
|
331
|
+
const env = sanitizeRuntimeServiceBaseEnv(process.env);
|
|
332
|
+
env.PAPERCLIP_WORKSPACE_CWD = input.workspace.cwd ?? "";
|
|
333
|
+
env.PAPERCLIP_WORKSPACE_PATH = input.workspace.cwd ?? "";
|
|
334
|
+
env.PAPERCLIP_WORKSPACE_WORKTREE_PATH =
|
|
335
|
+
input.workspace.providerRef ?? input.workspace.cwd ?? "";
|
|
336
|
+
env.PAPERCLIP_WORKSPACE_BRANCH = input.workspace.branchName ?? "";
|
|
337
|
+
env.PAPERCLIP_WORKSPACE_BASE_CWD = input.projectWorkspaceCwd ?? "";
|
|
338
|
+
env.PAPERCLIP_WORKSPACE_REPO_ROOT = input.projectWorkspaceCwd ?? "";
|
|
339
|
+
env.PAPERCLIP_WORKSPACE_REPO_URL = input.workspace.repoUrl ?? "";
|
|
340
|
+
env.PAPERCLIP_WORKSPACE_REPO_REF = input.workspace.baseRef ?? "";
|
|
341
|
+
env.PAPERCLIP_PROJECT_ID = input.workspace.projectId ?? "";
|
|
342
|
+
env.PAPERCLIP_PROJECT_WORKSPACE_ID = input.workspace.projectWorkspaceId ?? "";
|
|
343
|
+
env.PAPERCLIP_ISSUE_ID = input.workspace.sourceIssueId ?? "";
|
|
344
|
+
return env;
|
|
345
|
+
}
|
|
346
|
+
async function resolveGitRepoRootForWorkspaceCleanup(worktreePath, projectWorkspaceCwd) {
|
|
347
|
+
if (projectWorkspaceCwd) {
|
|
348
|
+
const resolvedProjectWorkspaceCwd = path.resolve(projectWorkspaceCwd);
|
|
349
|
+
const gitDir = await runGit(["rev-parse", "--git-common-dir"], resolvedProjectWorkspaceCwd)
|
|
350
|
+
.catch(() => null);
|
|
351
|
+
if (gitDir) {
|
|
352
|
+
const resolvedGitDir = path.resolve(resolvedProjectWorkspaceCwd, gitDir);
|
|
353
|
+
return path.dirname(resolvedGitDir);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const gitDir = await runGit(["rev-parse", "--git-common-dir"], worktreePath).catch(() => null);
|
|
357
|
+
if (!gitDir)
|
|
358
|
+
return null;
|
|
359
|
+
const resolvedGitDir = path.resolve(worktreePath, gitDir);
|
|
360
|
+
return path.dirname(resolvedGitDir);
|
|
361
|
+
}
|
|
211
362
|
export async function realizeExecutionWorkspace(input) {
|
|
212
363
|
const rawStrategy = parseObject(input.config.workspaceStrategy);
|
|
213
364
|
const strategyType = asString(rawStrategy.type, "project_primary");
|
|
@@ -242,6 +393,25 @@ export async function realizeExecutionWorkspace(input) {
|
|
|
242
393
|
if (existingWorktree) {
|
|
243
394
|
const existingGitDir = await runGit(["rev-parse", "--git-dir"], worktreePath).catch(() => null);
|
|
244
395
|
if (existingGitDir) {
|
|
396
|
+
if (input.recorder) {
|
|
397
|
+
await input.recorder.recordOperation({
|
|
398
|
+
phase: "worktree_prepare",
|
|
399
|
+
cwd: repoRoot,
|
|
400
|
+
metadata: {
|
|
401
|
+
repoRoot,
|
|
402
|
+
worktreePath,
|
|
403
|
+
branchName,
|
|
404
|
+
baseRef,
|
|
405
|
+
created: false,
|
|
406
|
+
reused: true,
|
|
407
|
+
},
|
|
408
|
+
run: async () => ({
|
|
409
|
+
status: "succeeded",
|
|
410
|
+
exitCode: 0,
|
|
411
|
+
system: `Reused existing git worktree at ${worktreePath}\n`,
|
|
412
|
+
}),
|
|
413
|
+
});
|
|
414
|
+
}
|
|
245
415
|
await provisionExecutionWorktree({
|
|
246
416
|
strategy: rawStrategy,
|
|
247
417
|
base: input.base,
|
|
@@ -251,6 +421,7 @@ export async function realizeExecutionWorkspace(input) {
|
|
|
251
421
|
issue: input.issue,
|
|
252
422
|
agent: input.agent,
|
|
253
423
|
created: false,
|
|
424
|
+
recorder: input.recorder ?? null,
|
|
254
425
|
});
|
|
255
426
|
return {
|
|
256
427
|
...input.base,
|
|
@@ -264,7 +435,42 @@ export async function realizeExecutionWorkspace(input) {
|
|
|
264
435
|
}
|
|
265
436
|
throw new Error(`Configured worktree path "${worktreePath}" already exists and is not a git worktree.`);
|
|
266
437
|
}
|
|
267
|
-
|
|
438
|
+
try {
|
|
439
|
+
await recordGitOperation(input.recorder, {
|
|
440
|
+
phase: "worktree_prepare",
|
|
441
|
+
args: ["worktree", "add", "-b", branchName, worktreePath, baseRef],
|
|
442
|
+
cwd: repoRoot,
|
|
443
|
+
metadata: {
|
|
444
|
+
repoRoot,
|
|
445
|
+
worktreePath,
|
|
446
|
+
branchName,
|
|
447
|
+
baseRef,
|
|
448
|
+
created: true,
|
|
449
|
+
},
|
|
450
|
+
successMessage: `Created git worktree at ${worktreePath}\n`,
|
|
451
|
+
failureLabel: `git worktree add ${worktreePath}`,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
if (!gitErrorIncludes(error, "already exists")) {
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
await recordGitOperation(input.recorder, {
|
|
459
|
+
phase: "worktree_prepare",
|
|
460
|
+
args: ["worktree", "add", worktreePath, branchName],
|
|
461
|
+
cwd: repoRoot,
|
|
462
|
+
metadata: {
|
|
463
|
+
repoRoot,
|
|
464
|
+
worktreePath,
|
|
465
|
+
branchName,
|
|
466
|
+
baseRef,
|
|
467
|
+
created: false,
|
|
468
|
+
reusedExistingBranch: true,
|
|
469
|
+
},
|
|
470
|
+
successMessage: `Attached existing branch ${branchName} at ${worktreePath}\n`,
|
|
471
|
+
failureLabel: `git worktree add ${worktreePath}`,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
268
474
|
await provisionExecutionWorktree({
|
|
269
475
|
strategy: rawStrategy,
|
|
270
476
|
base: input.base,
|
|
@@ -274,6 +480,7 @@ export async function realizeExecutionWorkspace(input) {
|
|
|
274
480
|
issue: input.issue,
|
|
275
481
|
agent: input.agent,
|
|
276
482
|
created: true,
|
|
483
|
+
recorder: input.recorder ?? null,
|
|
277
484
|
});
|
|
278
485
|
return {
|
|
279
486
|
...input.base,
|
|
@@ -285,6 +492,134 @@ export async function realizeExecutionWorkspace(input) {
|
|
|
285
492
|
created: true,
|
|
286
493
|
};
|
|
287
494
|
}
|
|
495
|
+
export async function cleanupExecutionWorkspaceArtifacts(input) {
|
|
496
|
+
const warnings = [];
|
|
497
|
+
const workspacePath = input.workspace.providerRef ?? input.workspace.cwd;
|
|
498
|
+
const cleanupEnv = buildExecutionWorkspaceCleanupEnv({
|
|
499
|
+
workspace: input.workspace,
|
|
500
|
+
projectWorkspaceCwd: input.projectWorkspace?.cwd ?? null,
|
|
501
|
+
});
|
|
502
|
+
const createdByRuntime = input.workspace.metadata?.createdByRuntime === true;
|
|
503
|
+
const cleanupCommands = [
|
|
504
|
+
input.projectWorkspace?.cleanupCommand ?? null,
|
|
505
|
+
input.teardownCommand ?? null,
|
|
506
|
+
]
|
|
507
|
+
.map((value) => asString(value, "").trim())
|
|
508
|
+
.filter(Boolean);
|
|
509
|
+
for (const command of cleanupCommands) {
|
|
510
|
+
try {
|
|
511
|
+
await recordWorkspaceCommandOperation(input.recorder, {
|
|
512
|
+
phase: "workspace_teardown",
|
|
513
|
+
command,
|
|
514
|
+
cwd: workspacePath ?? input.projectWorkspace?.cwd ?? process.cwd(),
|
|
515
|
+
env: cleanupEnv,
|
|
516
|
+
label: `Execution workspace cleanup command "${command}"`,
|
|
517
|
+
metadata: {
|
|
518
|
+
workspaceId: input.workspace.id,
|
|
519
|
+
workspacePath,
|
|
520
|
+
branchName: input.workspace.branchName,
|
|
521
|
+
providerType: input.workspace.providerType,
|
|
522
|
+
},
|
|
523
|
+
successMessage: `Completed cleanup command "${command}"\n`,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
catch (err) {
|
|
527
|
+
warnings.push(err instanceof Error ? err.message : String(err));
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
if (input.workspace.providerType === "git_worktree" && workspacePath) {
|
|
531
|
+
const repoRoot = await resolveGitRepoRootForWorkspaceCleanup(workspacePath, input.projectWorkspace?.cwd ?? null);
|
|
532
|
+
const worktreeExists = await directoryExists(workspacePath);
|
|
533
|
+
if (worktreeExists) {
|
|
534
|
+
if (!repoRoot) {
|
|
535
|
+
warnings.push(`Could not resolve git repo root for "${workspacePath}".`);
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
try {
|
|
539
|
+
await recordGitOperation(input.recorder, {
|
|
540
|
+
phase: "worktree_cleanup",
|
|
541
|
+
args: ["worktree", "remove", "--force", workspacePath],
|
|
542
|
+
cwd: repoRoot,
|
|
543
|
+
metadata: {
|
|
544
|
+
workspaceId: input.workspace.id,
|
|
545
|
+
workspacePath,
|
|
546
|
+
branchName: input.workspace.branchName,
|
|
547
|
+
cleanupAction: "worktree_remove",
|
|
548
|
+
},
|
|
549
|
+
successMessage: `Removed git worktree ${workspacePath}\n`,
|
|
550
|
+
failureLabel: `git worktree remove ${workspacePath}`,
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
catch (err) {
|
|
554
|
+
warnings.push(err instanceof Error ? err.message : String(err));
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
if (createdByRuntime && input.workspace.branchName) {
|
|
559
|
+
if (!repoRoot) {
|
|
560
|
+
warnings.push(`Could not resolve git repo root to delete branch "${input.workspace.branchName}".`);
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
try {
|
|
564
|
+
await recordGitOperation(input.recorder, {
|
|
565
|
+
phase: "worktree_cleanup",
|
|
566
|
+
args: ["branch", "-d", input.workspace.branchName],
|
|
567
|
+
cwd: repoRoot,
|
|
568
|
+
metadata: {
|
|
569
|
+
workspaceId: input.workspace.id,
|
|
570
|
+
workspacePath,
|
|
571
|
+
branchName: input.workspace.branchName,
|
|
572
|
+
cleanupAction: "branch_delete",
|
|
573
|
+
},
|
|
574
|
+
successMessage: `Deleted branch ${input.workspace.branchName}\n`,
|
|
575
|
+
failureLabel: `git branch -d ${input.workspace.branchName}`,
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
catch (err) {
|
|
579
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
580
|
+
warnings.push(`Skipped deleting branch "${input.workspace.branchName}": ${message}`);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
else if (input.workspace.providerType === "local_fs" && createdByRuntime && workspacePath) {
|
|
586
|
+
const projectWorkspaceCwd = input.projectWorkspace?.cwd ? path.resolve(input.projectWorkspace.cwd) : null;
|
|
587
|
+
const resolvedWorkspacePath = path.resolve(workspacePath);
|
|
588
|
+
const containsProjectWorkspace = projectWorkspaceCwd
|
|
589
|
+
? (resolvedWorkspacePath === projectWorkspaceCwd ||
|
|
590
|
+
projectWorkspaceCwd.startsWith(`${resolvedWorkspacePath}${path.sep}`))
|
|
591
|
+
: false;
|
|
592
|
+
if (containsProjectWorkspace) {
|
|
593
|
+
warnings.push(`Refusing to remove path "${workspacePath}" because it contains the project workspace.`);
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
await fs.rm(resolvedWorkspacePath, { recursive: true, force: true });
|
|
597
|
+
if (input.recorder) {
|
|
598
|
+
await input.recorder.recordOperation({
|
|
599
|
+
phase: "workspace_teardown",
|
|
600
|
+
cwd: projectWorkspaceCwd ?? process.cwd(),
|
|
601
|
+
metadata: {
|
|
602
|
+
workspaceId: input.workspace.id,
|
|
603
|
+
workspacePath: resolvedWorkspacePath,
|
|
604
|
+
cleanupAction: "remove_local_fs",
|
|
605
|
+
},
|
|
606
|
+
run: async () => ({
|
|
607
|
+
status: "succeeded",
|
|
608
|
+
exitCode: 0,
|
|
609
|
+
system: `Removed local workspace directory ${resolvedWorkspacePath}\n`,
|
|
610
|
+
}),
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
const cleaned = !workspacePath ||
|
|
616
|
+
!(await directoryExists(workspacePath));
|
|
617
|
+
return {
|
|
618
|
+
cleanedPath: workspacePath,
|
|
619
|
+
cleaned,
|
|
620
|
+
warnings,
|
|
621
|
+
};
|
|
622
|
+
}
|
|
288
623
|
async function allocatePort() {
|
|
289
624
|
return await new Promise((resolve, reject) => {
|
|
290
625
|
const server = net.createServer();
|
|
@@ -336,8 +671,9 @@ function resolveServiceScopeId(input) {
|
|
|
336
671
|
: "run";
|
|
337
672
|
if (scopeType === "project_workspace")
|
|
338
673
|
return { scopeType, scopeId: input.workspace.workspaceId ?? input.workspace.projectId };
|
|
339
|
-
if (scopeType === "execution_workspace")
|
|
340
|
-
return { scopeType, scopeId: input.workspace.cwd };
|
|
674
|
+
if (scopeType === "execution_workspace") {
|
|
675
|
+
return { scopeType, scopeId: input.executionWorkspaceId ?? input.workspace.cwd };
|
|
676
|
+
}
|
|
341
677
|
if (scopeType === "agent")
|
|
342
678
|
return { scopeType, scopeId: input.agent.id };
|
|
343
679
|
return { scopeType: "run", scopeId: input.runId };
|
|
@@ -371,6 +707,7 @@ function toPersistedWorkspaceRuntimeService(record) {
|
|
|
371
707
|
companyId: record.companyId,
|
|
372
708
|
projectId: record.projectId,
|
|
373
709
|
projectWorkspaceId: record.projectWorkspaceId,
|
|
710
|
+
executionWorkspaceId: record.executionWorkspaceId,
|
|
374
711
|
issueId: record.issueId,
|
|
375
712
|
scopeType: record.scopeType,
|
|
376
713
|
scopeId: record.scopeId,
|
|
@@ -406,6 +743,7 @@ async function persistRuntimeServiceRecord(db, record) {
|
|
|
406
743
|
set: {
|
|
407
744
|
projectId: values.projectId,
|
|
408
745
|
projectWorkspaceId: values.projectWorkspaceId,
|
|
746
|
+
executionWorkspaceId: values.executionWorkspaceId,
|
|
409
747
|
issueId: values.issueId,
|
|
410
748
|
scopeType: values.scopeType,
|
|
411
749
|
scopeId: values.scopeId,
|
|
@@ -444,7 +782,7 @@ export function normalizeAdapterManagedRuntimeServices(input) {
|
|
|
444
782
|
(scopeType === "project_workspace"
|
|
445
783
|
? input.workspace.workspaceId
|
|
446
784
|
: scopeType === "execution_workspace"
|
|
447
|
-
? input.workspace.cwd
|
|
785
|
+
? input.executionWorkspaceId ?? input.workspace.cwd
|
|
448
786
|
: scopeType === "agent"
|
|
449
787
|
? input.agent.id
|
|
450
788
|
: input.runId) ??
|
|
@@ -468,6 +806,7 @@ export function normalizeAdapterManagedRuntimeServices(input) {
|
|
|
468
806
|
companyId: input.agent.companyId,
|
|
469
807
|
projectId: report.projectId ?? input.workspace.projectId,
|
|
470
808
|
projectWorkspaceId: report.projectWorkspaceId ?? input.workspace.workspaceId,
|
|
809
|
+
executionWorkspaceId: input.executionWorkspaceId ?? null,
|
|
471
810
|
issueId: report.issueId ?? input.issue?.id ?? null,
|
|
472
811
|
serviceName,
|
|
473
812
|
status,
|
|
@@ -510,7 +849,10 @@ async function startLocalRuntimeService(input) {
|
|
|
510
849
|
port,
|
|
511
850
|
});
|
|
512
851
|
const serviceCwd = resolveConfiguredPath(renderTemplate(serviceCwdTemplate, templateData), input.workspace.cwd);
|
|
513
|
-
const env = {
|
|
852
|
+
const env = {
|
|
853
|
+
...sanitizeRuntimeServiceBaseEnv(process.env),
|
|
854
|
+
...input.adapterEnv,
|
|
855
|
+
};
|
|
514
856
|
for (const [key, value] of Object.entries(envConfig)) {
|
|
515
857
|
if (typeof value === "string") {
|
|
516
858
|
env[key] = renderTemplate(value, templateData);
|
|
@@ -524,7 +866,7 @@ async function startLocalRuntimeService(input) {
|
|
|
524
866
|
const child = spawn(shell, ["-lc", command], {
|
|
525
867
|
cwd: serviceCwd,
|
|
526
868
|
env,
|
|
527
|
-
detached:
|
|
869
|
+
detached: process.platform !== "win32",
|
|
528
870
|
stdio: ["ignore", "pipe", "pipe"],
|
|
529
871
|
});
|
|
530
872
|
let stderrExcerpt = "";
|
|
@@ -550,7 +892,7 @@ async function startLocalRuntimeService(input) {
|
|
|
550
892
|
await waitForReadiness({ service: input.service, url });
|
|
551
893
|
}
|
|
552
894
|
catch (err) {
|
|
553
|
-
child
|
|
895
|
+
terminateChildProcess(child);
|
|
554
896
|
throw new Error(`Failed to start runtime service "${serviceName}": ${err instanceof Error ? err.message : String(err)}${stderrExcerpt ? ` | stderr: ${stderrExcerpt.trim()}` : ""}`);
|
|
555
897
|
}
|
|
556
898
|
const envFingerprint = createHash("sha256").update(stableStringify(envConfig)).digest("hex");
|
|
@@ -559,6 +901,7 @@ async function startLocalRuntimeService(input) {
|
|
|
559
901
|
companyId: input.agent.companyId,
|
|
560
902
|
projectId: input.workspace.projectId,
|
|
561
903
|
projectWorkspaceId: input.workspace.workspaceId,
|
|
904
|
+
executionWorkspaceId: input.executionWorkspaceId ?? null,
|
|
562
905
|
issueId: input.issue?.id ?? null,
|
|
563
906
|
serviceName,
|
|
564
907
|
status: "running",
|
|
@@ -605,8 +948,8 @@ async function stopRuntimeService(serviceId) {
|
|
|
605
948
|
record.status = "stopped";
|
|
606
949
|
record.lastUsedAt = new Date().toISOString();
|
|
607
950
|
record.stoppedAt = new Date().toISOString();
|
|
608
|
-
if (record.child &&
|
|
609
|
-
record.child
|
|
951
|
+
if (record.child && record.child.pid) {
|
|
952
|
+
terminateChildProcess(record.child);
|
|
610
953
|
}
|
|
611
954
|
runtimeServicesById.delete(serviceId);
|
|
612
955
|
if (record.reuseKey) {
|
|
@@ -614,6 +957,19 @@ async function stopRuntimeService(serviceId) {
|
|
|
614
957
|
}
|
|
615
958
|
await persistRuntimeServiceRecord(record.db, record);
|
|
616
959
|
}
|
|
960
|
+
async function markPersistedRuntimeServicesStoppedForExecutionWorkspace(input) {
|
|
961
|
+
const now = new Date();
|
|
962
|
+
await input.db
|
|
963
|
+
.update(workspaceRuntimeServices)
|
|
964
|
+
.set({
|
|
965
|
+
status: "stopped",
|
|
966
|
+
healthStatus: "unknown",
|
|
967
|
+
stoppedAt: now,
|
|
968
|
+
lastUsedAt: now,
|
|
969
|
+
updatedAt: now,
|
|
970
|
+
})
|
|
971
|
+
.where(and(eq(workspaceRuntimeServices.executionWorkspaceId, input.executionWorkspaceId), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
|
|
972
|
+
}
|
|
617
973
|
function registerRuntimeService(db, record) {
|
|
618
974
|
record.db = db;
|
|
619
975
|
runtimeServicesById.set(record.id, record);
|
|
@@ -650,6 +1006,7 @@ export async function ensureRuntimeServicesForRun(input) {
|
|
|
650
1006
|
const { scopeType, scopeId } = resolveServiceScopeId({
|
|
651
1007
|
service,
|
|
652
1008
|
workspace: input.workspace,
|
|
1009
|
+
executionWorkspaceId: input.executionWorkspaceId,
|
|
653
1010
|
issue: input.issue,
|
|
654
1011
|
runId: input.runId,
|
|
655
1012
|
agent: input.agent,
|
|
@@ -680,6 +1037,7 @@ export async function ensureRuntimeServicesForRun(input) {
|
|
|
680
1037
|
agent: input.agent,
|
|
681
1038
|
issue: input.issue,
|
|
682
1039
|
workspace: input.workspace,
|
|
1040
|
+
executionWorkspaceId: input.executionWorkspaceId,
|
|
683
1041
|
adapterEnv: input.adapterEnv,
|
|
684
1042
|
service,
|
|
685
1043
|
onLog: input.onLog,
|
|
@@ -719,6 +1077,29 @@ export async function releaseRuntimeServicesForRun(runId) {
|
|
|
719
1077
|
}
|
|
720
1078
|
}
|
|
721
1079
|
}
|
|
1080
|
+
export async function stopRuntimeServicesForExecutionWorkspace(input) {
|
|
1081
|
+
const normalizedWorkspaceCwd = input.workspaceCwd ? path.resolve(input.workspaceCwd) : null;
|
|
1082
|
+
const matchingServiceIds = Array.from(runtimeServicesById.values())
|
|
1083
|
+
.filter((record) => {
|
|
1084
|
+
if (record.executionWorkspaceId === input.executionWorkspaceId)
|
|
1085
|
+
return true;
|
|
1086
|
+
if (!normalizedWorkspaceCwd || !record.cwd)
|
|
1087
|
+
return false;
|
|
1088
|
+
const resolvedCwd = path.resolve(record.cwd);
|
|
1089
|
+
return (resolvedCwd === normalizedWorkspaceCwd ||
|
|
1090
|
+
resolvedCwd.startsWith(`${normalizedWorkspaceCwd}${path.sep}`));
|
|
1091
|
+
})
|
|
1092
|
+
.map((record) => record.id);
|
|
1093
|
+
for (const serviceId of matchingServiceIds) {
|
|
1094
|
+
await stopRuntimeService(serviceId);
|
|
1095
|
+
}
|
|
1096
|
+
if (input.db) {
|
|
1097
|
+
await markPersistedRuntimeServicesStoppedForExecutionWorkspace({
|
|
1098
|
+
db: input.db,
|
|
1099
|
+
executionWorkspaceId: input.executionWorkspaceId,
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
722
1103
|
export async function listWorkspaceRuntimeServicesForProjectWorkspaces(db, companyId, projectWorkspaceIds) {
|
|
723
1104
|
if (projectWorkspaceIds.length === 0)
|
|
724
1105
|
return new Map();
|
|
@@ -779,6 +1160,7 @@ export async function persistAdapterManagedRuntimeServices(input) {
|
|
|
779
1160
|
companyId: ref.companyId,
|
|
780
1161
|
projectId: ref.projectId,
|
|
781
1162
|
projectWorkspaceId: ref.projectWorkspaceId,
|
|
1163
|
+
executionWorkspaceId: ref.executionWorkspaceId,
|
|
782
1164
|
issueId: ref.issueId,
|
|
783
1165
|
scopeType: ref.scopeType,
|
|
784
1166
|
scopeId: ref.scopeId,
|
|
@@ -807,6 +1189,7 @@ export async function persistAdapterManagedRuntimeServices(input) {
|
|
|
807
1189
|
set: {
|
|
808
1190
|
projectId: ref.projectId,
|
|
809
1191
|
projectWorkspaceId: ref.projectWorkspaceId,
|
|
1192
|
+
executionWorkspaceId: ref.executionWorkspaceId,
|
|
810
1193
|
issueId: ref.issueId,
|
|
811
1194
|
scopeType: ref.scopeType,
|
|
812
1195
|
scopeId: ref.scopeId,
|