@desplega.ai/agent-swarm 1.131.1 → 1.134.0
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-jgcy477k.js → actions-7kast243.js} +20 -18
- package/dist/{anthropic-messages-rjmd2e7n.js → anthropic-messages-706yad38.js} +33 -17
- package/dist/app-0g84t8wf.js +28 -0
- package/dist/{artifact-jysj3wrg.js → artifact-dje5ke4h.js} +37 -131
- package/dist/{assistant-f2vkk1hj.js → assistant-ac4htcky.js} +25 -22
- package/dist/{azure-openai-responses-c0yjmbfd.js → azure-openai-responses-be59fbsz.js} +13 -13
- package/dist/{boot-reembed-q7mp8hcr.js → boot-reembed-b1rcqn85.js} +13 -11
- package/dist/{boot-reembed-xmw8wcx6.js → boot-reembed-kw2541c4.js} +14 -12
- package/dist/{boot-scrub-logs-dsqrv79n.js → boot-scrub-logs-ja29t92g.js} +11 -9
- package/dist/{claude-adapter-q6x7yspx.js → claude-adapter-5cg1fv8s.js} +33 -29
- package/dist/{claude-managed-adapter-wsg37bt8.js → claude-managed-adapter-9z9sdytx.js} +9 -9
- package/dist/{claude-managed-setup-52z4mq9w.js → claude-managed-setup-3zqp51cr.js} +5 -5
- package/dist/{claude-1ex232fc.js → claude-wqn3dtca.js} +1 -1
- package/dist/{cli-4wgngmwv.js → cli-00w4hbam.js} +1 -1
- package/dist/{cli-er3a4bb0.js → cli-15429qdw.js} +6 -1
- package/dist/{cli-e5dabkx0.js → cli-1cwhyvta.js} +4 -4
- package/dist/{cli-zsspvvm2.js → cli-1ybr6vw2.js} +237 -237
- package/dist/{cli-xpxde7rm.js → cli-2wv4kj0e.js} +60 -31
- package/dist/cli-34w2584r.js +530 -0
- package/dist/{cli-se2p6rkb.js → cli-38taxznr.js} +6 -6
- package/dist/{cli-9sbhdpvb.js → cli-3cgfyfzm.js} +14 -14
- package/dist/{cli-5n6e5yfn.js → cli-3zmdzfjf.js} +79 -74
- package/dist/{cli-3ty0t082.js → cli-43x36mty.js} +197 -8
- package/dist/{cli-ycrnynpw.js → cli-480nehnh.js} +29 -22
- package/dist/{cli-0258203w.js → cli-492e7ap5.js} +140 -20
- package/dist/{cli-3fj60etf.js → cli-497b685t.js} +3 -3
- package/dist/{cli-pxfxkx5m.js → cli-4bap00k0.js} +1 -1
- package/dist/{cli-w2wxd56v.js → cli-4bc8vmhm.js} +848 -770
- package/dist/{cli-aca5pz9f.js → cli-589599p9.js} +1 -1
- package/dist/{cli-t930g0xh.js → cli-5tnr64pm.js} +1 -1
- package/dist/{cli-jxg3s9ey.js → cli-65d93ves.js} +7 -7
- package/dist/{cli-6dpytdr2.js → cli-6x363v1z.js} +2 -2
- package/dist/{cli-dxak0fqd.js → cli-787ph852.js} +11 -11
- package/dist/{cli-793jvbsh.js → cli-7bv8nckk.js} +16 -11
- package/dist/{cli-zyxs93y9.js → cli-7jcc9y1r.js} +3 -3
- package/dist/{cli-f1am9szv.js → cli-87t2gstf.js} +1 -1
- package/dist/{cli-9aryf9tv.js → cli-95m51ztz.js} +1 -1
- package/dist/{cli-4w4fmq9x.js → cli-9w49enmh.js} +2 -2
- package/dist/{cli-v69vk5h0.js → cli-9y5b02vr.js} +13 -13
- package/dist/{cli-x23me2mg.js → cli-a1rrkrb4.js} +1 -1
- package/dist/{cli-psrqtw2m.js → cli-a3pkfpqs.js} +2 -2
- package/dist/{cli-h0rgxd24.js → cli-a4ajmfvp.js} +6 -6
- package/dist/{cli-ygrbmjja.js → cli-aw8bb6sf.js} +6 -6
- package/dist/{cli-g74vpjp2.js → cli-brm3et47.js} +55 -22
- package/dist/{cli-czkae1fp.js → cli-c5ddbdfj.js} +9 -9
- package/dist/{cli-114fvtmj.js → cli-c79a9zrc.js} +1 -1
- package/dist/{cli-49n9f49x.js → cli-dx3dz0ms.js} +3 -3
- package/dist/{cli-6dp3ydxa.js → cli-e07exmsb.js} +18 -14
- package/dist/cli-et1bbwqf.js +13 -0
- package/dist/{cli-yazx6hap.js → cli-f3s9dry0.js} +14 -14
- package/dist/{cli-t8d349cy.js → cli-f4wj0s3m.js} +3 -3
- package/dist/{cli-d6n0thxw.js → cli-f64gdfxc.js} +1 -1
- package/dist/{cli-pwfsqc2x.js → cli-fyd58xgb.js} +55 -55
- package/dist/{cli-7dm2zqy2.js → cli-g0j14czv.js} +2 -2
- package/dist/{cli-b0p7rfnd.js → cli-g2p9bd1z.js} +14 -14
- package/dist/{cli-z905tvmm.js → cli-g814jbst.js} +2 -2
- package/dist/{cli-5dsbcjjw.js → cli-ghexzd2d.js} +970 -970
- package/dist/{cli-jvv0g8bh.js → cli-gpt9kf01.js} +15 -15
- package/dist/{cli-rgrfzg8z.js → cli-grt6qv91.js} +380 -380
- package/dist/{cli-wz9115x0.js → cli-gtafvdy0.js} +8 -8
- package/dist/{cli-q5dzzak0.js → cli-gy07xk4s.js} +2 -2
- package/dist/{cli-sy7jk3tx.js → cli-h0djenzm.js} +2 -2
- package/dist/{cli-nrkkknat.js → cli-h37gbjbf.js} +2 -281
- package/dist/{cli-jevgrb4w.js → cli-h39xxnq6.js} +1200 -491
- package/dist/{cli-gz9sbyk3.js → cli-jepmgn7r.js} +1 -1
- package/dist/{cli-ccf9vy7q.js → cli-jmvk6et8.js} +7 -7
- package/dist/{cli-2rk0cx7s.js → cli-jxj92gkt.js} +51 -41
- package/dist/{cli-bqw0mt1n.js → cli-k46t4664.js} +18 -3
- package/dist/{cli-50vbt00w.js → cli-m07313tr.js} +1153 -696
- package/dist/{cli-4j2mrzag.js → cli-mkq1rk7b.js} +1 -1
- package/dist/{cli-1z7048dy.js → cli-mnm7w46e.js} +1 -1
- package/dist/{cli-kd1ck4rx.js → cli-mp9sg4cg.js} +14 -8
- package/dist/{cli-jbcva0xj.js → cli-mrammd8c.js} +60 -35
- package/dist/cli-nanaxrz6.js +27 -0
- package/dist/{cli-p9swy5t3.js → cli-pq2ee5ja.js} +8 -6
- package/dist/{cli-2wadx7p2.js → cli-pt43pdp1.js} +2 -2
- package/dist/{cli-7sgrxg9a.js → cli-q6d0vvey.js} +4 -4
- package/dist/{cli-k9qkf1hw.js → cli-qf9kpsve.js} +9 -9
- package/dist/cli-qh4sqfws.js +15 -0
- package/dist/{cli-e15jhafb.js → cli-qntkxysp.js} +14 -14
- package/dist/{cli-sajgpkqg.js → cli-qs9hhsvb.js} +1723 -325
- package/dist/{cli-z2zcxes1.js → cli-qt5bt3vk.js} +1 -1
- package/dist/{cli-wx82tw1k.js → cli-qtekrty1.js} +3 -3
- package/dist/{cli-g1re8r05.js → cli-rh6f3s9n.js} +3 -3
- package/dist/{cli-n0krnc6d.js → cli-rzhcrw2p.js} +2 -2
- package/dist/{cli-gecy3z2s.js → cli-snw62ze5.js} +4 -4
- package/dist/{cli-n6h8qt8n.js → cli-snz3p4yf.js} +15 -10
- package/dist/{cli-r6kqqbj0.js → cli-tkf8n6cw.js} +11 -11
- package/dist/{cli-4rkfg1wx.js → cli-tkrr24mz.js} +14 -9
- package/dist/{cli-9dr5qzc0.js → cli-tv9f1kyb.js} +54 -43
- package/dist/{cli-gm9cbhbq.js → cli-vtz6yj3v.js} +28 -9
- package/dist/{cli-2f07m0xr.js → cli-wf86d5t7.js} +1 -1
- package/dist/{cli-7zd05xb4.js → cli-whrvct19.js} +45 -45
- package/dist/{cli-ap1czx8f.js → cli-wrrea8xm.js} +3 -3
- package/dist/{cli-57khth04.js → cli-xmyqv00z.js} +120 -4
- package/dist/{cli-cwy5hqbq.js → cli-yjmk7tzc.js} +1 -1
- package/dist/{cli-6pcz9h15.js → cli-zykjrwcx.js} +180 -394
- package/dist/cli.js +45 -45
- package/dist/{codex-adapter-htjkn22b.js → codex-adapter-hsq6mz3m.js} +21 -19
- package/dist/{codex-hook-hq54t9ft.js → codex-hook-8c500gq8.js} +8 -7
- package/dist/{codex-login-z6yhbkmk.js → codex-login-x7603481.js} +3 -3
- package/dist/{codex-session-runner-wjfc7smz.js → codex-session-runner-c1x3x143.js} +15 -13
- package/dist/{commands-xhrfwqsk.js → commands-rwtddtst.js} +11 -9
- package/dist/{db-anvwb22f.js → db-j2b355vz.js} +458 -444
- package/dist/{devin-adapter-v1sarqtw.js → devin-adapter-8qmhqpy3.js} +3 -3
- package/dist/{devtools-2y1r7yqk.js → devtools-j2rnj8w7.js} +4 -4
- package/dist/{e2b-jdkwemv2.js → e2b-znpx78eg.js} +16 -16
- package/dist/{es5-vjgtkgp6.js → es5-fmqrjzy3.js} +2 -2
- package/dist/{event-bus-axn823e9.js → event-bus-n8sb35pw.js} +4 -4
- package/dist/{getMachineId-bsd-6tc9wxdj.js → getMachineId-bsd-wpzbhkm6.js} +4 -4
- package/dist/{getMachineId-darwin-sjt9sgnc.js → getMachineId-darwin-45zabjy0.js} +4 -4
- package/dist/{getMachineId-linux-v5n18y9p.js → getMachineId-linux-warnp5pd.js} +3 -3
- package/dist/{getMachineId-unsupported-yrjyqw3d.js → getMachineId-unsupported-5spent2a.js} +3 -3
- package/dist/{getMachineId-win-w3r8063c.js → getMachineId-win-v4bvcw7a.js} +4 -4
- package/dist/{google-generative-ai-hysrd8qx.js → google-generative-ai-b0wzss55.js} +17 -14
- package/dist/{google-vertex-p5arrga0.js → google-vertex-e8q4dpya.js} +18 -15
- package/dist/{handlers-b9kbc621.js → handlers-hchgrxkh.js} +32 -29
- package/dist/{hook-xkvn6c5h.js → hook-p49egqc0.js} +66 -52
- package/dist/hook-spb00w76.js +34 -0
- package/dist/{http-9xh6ta4r.js → http-nh14kkms.js} +663 -181
- package/dist/index-1qthq7vc.js +6 -0
- package/dist/{index-0g68f0p6.js → index-20xqmn3v.js} +3 -3
- package/dist/{index-vdkr5z2w.js → index-3e03k6e4.js} +114 -114
- package/dist/{index-ywds4812.js → index-4cbyhq2g.js} +43 -41
- package/dist/index-67pzqfrb.js +36 -0
- package/dist/{index-bccrkdkn.js → index-7m8yxkw5.js} +16 -16
- package/dist/{index-eaxyqcmj.js → index-dvsk64sm.js} +163 -83
- package/dist/{index-dqkpnmqm.js → index-e19s2m8k.js} +18 -18
- package/dist/{index-j30k5zxn.js → index-emvxcy98.js} +16 -16
- package/dist/{index-7ndw6ecy.js → index-gqnmr60d.js} +9 -9
- package/dist/{index-9znhar3x.js → index-j02xvjtd.js} +184 -185
- package/dist/{index-1s2442yw.js → index-ns5kksc1.js} +7 -7
- package/dist/{index-dpy2hth8.js → index-pdxc8kfh.js} +71 -71
- package/dist/{index-z1m7pw0v.js → index-ptcqm8bc.js} +107 -107
- package/dist/{index-070v4eyb.js → index-pyp7rexm.js} +5 -6
- package/dist/{index-86znjz1p.js → index-shne41sd.js} +13 -13
- package/dist/{index-2qn2qndv.js → index-t36q2v4t.js} +183 -183
- package/dist/index-tcnvv8w6.js +7 -0
- package/dist/index-w91qbfv1.js +7 -0
- package/dist/{index-fzc0mwvj.js → index-yqweff5n.js} +32 -32
- package/dist/index-yrfphye1.js +39 -0
- package/dist/{keepalive-vc7s2aa6.js → keepalive-9k51nqhc.js} +21 -15
- package/dist/lead-2xq3dxbz.js +88 -0
- package/dist/maintenance-0c0g6nym.js +28 -0
- package/dist/mistral-conversations-2njwdwhj.js +717 -0
- package/dist/{multipart-parser-qaktc7p8.js → multipart-parser-6gftesw0.js} +2 -2
- package/dist/{oauth-refresh-sweep-yecgjpk4.js → oauth-refresh-sweep-273a64r2.js} +14 -12
- package/dist/{onboard-xj0f73f9.js → onboard-tsv9wwhz.js} +12 -12
- package/dist/{openai-codex-responses-5g27pd6f.js → openai-codex-responses-kt84eq86.js} +26 -26
- package/dist/{openai-completions-3vkmfz2a.js → openai-completions-mrypq7qp.js} +17 -16
- package/dist/{openai-responses-dg4t7j7a.js → openai-responses-qhrk21ez.js} +20 -17
- package/dist/{opencode-adapter-1gm38aba.js → opencode-adapter-rar9676j.js} +13 -11
- package/dist/{openrouter-images-g3gm8931.js → openrouter-images-684fysx9.js} +5 -5
- package/dist/{otel-impl-nxg0n0b3.js → otel-impl-wp1mfzd2.js} +752 -537
- package/dist/{photon_rs-ky7dj5qw.js → photon_rs-8dwt2pzy.js} +581 -581
- package/dist/{pi-messages-tqj8q6b9.js → pi-messages-txp9f97r.js} +7 -7
- package/dist/{pi-mono-adapter-4g5kby31.js → pi-mono-adapter-yz47kk8e.js} +1910 -1180
- package/dist/pricing-refresh-jw1yw2fn.js +22 -0
- package/dist/rbac-roles-dg964c8p.js +32 -0
- package/dist/{rbac-roles-1hcxdtg7.js → rbac-roles-p53cg5cv.js} +19 -17
- package/dist/{registry-02cy9z5z.js → registry-mh12y17v.js} +4 -4
- package/dist/render-v2-56vn2rk9.js +36 -0
- package/dist/seed-pricing-52xx6z63.js +19 -0
- package/dist/{setup-46xtgq3c.js → setup-e8gp79sy.js} +7 -7
- package/dist/token-util-zy908s1a.js +6 -0
- package/dist/{token-fxkn2zf2.js → token-xg5711x5.js} +4 -4
- package/dist/worker-s17f1g46.js +88 -0
- package/dist/{x-6mg4kfpe.js → x-xkfh0w0v.js} +5 -5
- package/openapi.json +566 -22
- package/package.json +6 -6
- package/src/be/budget-refusal-notify.ts +14 -7
- package/src/be/db-queries/task-artifacts.ts +182 -0
- package/src/be/db.ts +834 -171
- package/src/be/events.ts +5 -0
- package/src/be/migrations/131_session_logs_created_at_index.sql +2 -0
- package/src/be/migrations/132_multi_runtime_instances.sql +44 -0
- package/src/be/migrations/133_workflow_run_trigger_type.sql +12 -0
- package/src/be/migrations/135_backfill_task_pull_request_attachments.sql +228 -0
- package/src/be/migrations/136_task_requester_provenance.sql +37 -0
- package/src/be/migrations/137_memory_retrieval_composite_index.sql +1 -0
- package/src/be/migrations/runner.ts +17 -11
- package/src/be/multi-runtime.ts +430 -0
- package/src/be/scripts/extract-schema.ts +3 -1
- package/src/be/scripts/typecheck.ts +6 -2
- package/src/be/seed-prompt-templates.ts +25 -2
- package/src/be/seed-skills/index.ts +7 -0
- package/src/be/steering.ts +1 -1
- package/src/be/swarm-config-guard.ts +18 -0
- package/src/commands/credential-wait.ts +54 -0
- package/src/commands/onboard/steps/core-credentials.tsx +1 -1
- package/src/commands/onboard/steps/custom-templates.tsx +1 -1
- package/src/commands/onboard/steps/harness-credentials.tsx +1 -1
- package/src/commands/onboard/steps/health-check.tsx +1 -1
- package/src/commands/onboard/steps/start.tsx +1 -1
- package/src/commands/profile-sync-audit.ts +56 -0
- package/src/commands/profile-sync.ts +287 -15
- package/src/commands/provider-credentials.ts +46 -19
- package/src/commands/runner.ts +199 -33
- package/src/commands/templates.ts +22 -0
- package/src/github/handlers.ts +55 -9
- package/src/heartbeat/heartbeat.ts +109 -17
- package/src/hooks/hook.ts +49 -33
- package/src/http/active-sessions.ts +11 -1
- package/src/http/agents.ts +261 -30
- package/src/http/all-routes.ts +1 -0
- package/src/http/config.ts +13 -2
- package/src/http/core.ts +102 -4
- package/src/http/db-query-bounded.ts +313 -0
- package/src/http/db-query-shared.ts +249 -0
- package/src/http/db-query.ts +54 -42
- package/src/http/events.ts +2 -0
- package/src/http/index.ts +23 -2
- package/src/http/mcp-bridge.ts +37 -3
- package/src/http/mcp.ts +12 -0
- package/src/http/memory.ts +13 -2
- package/src/http/openapi.ts +1 -0
- package/src/http/poll.ts +70 -27
- package/src/http/prompt-templates.ts +36 -13
- package/src/http/route-def.ts +43 -9
- package/src/http/schedules.ts +2 -2
- package/src/http/scripts.ts +10 -1
- package/src/http/session-data.ts +44 -0
- package/src/http/tasks.ts +2 -2
- package/src/http/users.ts +74 -52
- package/src/http/webhooks.ts +5 -2
- package/src/http/workflows.ts +1 -4
- package/src/integrations/kapso/inbound.ts +1 -1
- package/src/jira/outbound.ts +39 -8
- package/src/jira/webhook-lifecycle.ts +13 -2
- package/src/linear/outbound.ts +43 -10
- package/src/oauth/keepalive.ts +13 -2
- package/src/prompts/base-prompt.ts +1 -1
- package/src/prompts/default-drift.ts +21 -0
- package/src/prompts/session-templates.ts +56 -7
- package/src/providers/claude-adapter.ts +6 -0
- package/src/providers/codex-adapter.ts +6 -0
- package/src/providers/opencode-adapter.ts +6 -0
- package/src/providers/pi-mono-adapter.ts +8 -0
- package/src/providers/pricing-sources.md +24 -0
- package/src/queue-stall-alarm.ts +216 -0
- package/src/rbac/legacy-policy.ts +3 -0
- package/src/rbac/permissions.ts +12 -0
- package/src/scheduler/scheduler.ts +7 -0
- package/src/script-workflows/executor.ts +2 -1
- package/src/scripts-runtime/executors/native.ts +2 -1
- package/src/scripts-runtime/executors/types.ts +5 -0
- package/src/scripts-runtime/loader.ts +5 -0
- package/src/scripts-runtime/sdk-allowlist.ts +3 -0
- package/src/scripts-runtime/swarm-config.ts +8 -0
- package/src/scripts-runtime/swarm-sdk.ts +7 -0
- package/src/scripts-runtime/types/stdlib.d.ts +4 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +4 -0
- package/src/server.ts +6 -0
- package/src/slack/channel-join.ts +22 -3
- package/src/slack/channel-lifecycle.ts +114 -0
- package/src/tests/budget-claim-gate.test.ts +20 -0
- package/src/tests/claude-adapter.test.ts +32 -0
- package/src/tests/codex-adapter.test.ts +30 -0
- package/src/tests/create-task-validation.test.ts +128 -0
- package/src/tests/credential-wait.test.ts +67 -1
- package/src/tests/db-query.test.ts +711 -2
- package/src/tests/heartbeat-checklist.test.ts +28 -0
- package/src/tests/http-api-integration.test.ts +81 -0
- package/src/tests/http-users.test.ts +166 -1
- package/src/tests/identity-field-budget.test.ts +176 -0
- package/src/tests/mcp-tools-user.test.ts +34 -0
- package/src/tests/mcp-user-route.test.ts +17 -0
- package/src/tests/metrics-http.test.ts +44 -0
- package/src/tests/migration-failure.test.ts +86 -0
- package/src/tests/multi-runtime-registration.test.ts +2810 -0
- package/src/tests/openapi-response-contract.test.ts +24 -0
- package/src/tests/openapi-route-headers.test.ts +83 -0
- package/src/tests/opencode-adapter.test.ts +40 -0
- package/src/tests/outbound-listener-rejection.test.ts +138 -0
- package/src/tests/pi-mono-adapter.test.ts +98 -0
- package/src/tests/preload.ts +2 -0
- package/src/tests/profile-sync-warning.test.ts +277 -0
- package/src/tests/profile-sync.test.ts +232 -6
- package/src/tests/prompt-template-resolver.test.ts +177 -6
- package/src/tests/prompt-template-session.test.ts +39 -3
- package/src/tests/queue-stall-alarm.test.ts +226 -0
- package/src/tests/rbac-charact-slack.test.ts +29 -0
- package/src/tests/rbac-engine.test.ts +3 -0
- package/src/tests/requester-comms.test.ts +32 -0
- package/src/tests/runner-requester-profile.test.ts +38 -0
- package/src/tests/schedule-target-type.test.ts +38 -0
- package/src/tests/script-connections.test.ts +13 -1
- package/src/tests/scripts-runtime-identity.test.ts +375 -0
- package/src/tests/scripts-runtime.test.ts +4 -3
- package/src/tests/sdk-allowlist.test.ts +47 -0
- package/src/tests/send-task-requested-by.test.ts +9 -0
- package/src/tests/session-costs.test.ts +506 -1
- package/src/tests/shutdown-error-scrubbing.test.ts +92 -0
- package/src/tests/slack-channel-lifecycle.test.ts +241 -0
- package/src/tests/slack-render-v2.test.ts +43 -0
- package/src/tests/steering-core.test.ts +28 -0
- package/src/tests/swarm-config-reserved-keys.test.ts +22 -0
- package/src/tests/task-artifacts.test.ts +386 -0
- package/src/tests/task-attachments-schema.test.ts +17 -1
- package/src/tests/task-completion-idempotency.test.ts +57 -0
- package/src/tests/task-pull-request-backfill-migration.test.ts +321 -0
- package/src/tests/tool-annotations.test.ts +4 -0
- package/src/tests/update-profile-api.test.ts +67 -39
- package/src/tests/update-profile-auth.test.ts +48 -4
- package/src/tests/user-attribution-migration.test.ts +54 -0
- package/src/tests/user-identity.test.ts +72 -0
- package/src/tests/workflow-async-v2.test.ts +39 -1
- package/src/tests/workflow-http-v2.test.ts +3 -2
- package/src/tests/workflow-mcp-trigger-schema.test.ts +52 -3
- package/src/tests/workflow-retry-v2.test.ts +45 -1
- package/src/tools/db-query.ts +18 -8
- package/src/tools/get-task-details.ts +24 -3
- package/src/tools/manage-user.ts +36 -3
- package/src/tools/poll-task.ts +93 -14
- package/src/tools/script-common.ts +5 -0
- package/src/tools/send-task.ts +1 -4
- package/src/tools/slack-archive-channel.ts +70 -0
- package/src/tools/slack-create-channel.ts +74 -0
- package/src/tools/slack-invite-to-channel.ts +78 -0
- package/src/tools/store-progress.ts +13 -2
- package/src/tools/swarm-config/delete-config.ts +9 -0
- package/src/tools/swarm-config/set-config.ts +3 -2
- package/src/tools/task-action.ts +30 -0
- package/src/tools/task-tool-ctx.ts +8 -1
- package/src/tools/tool-config.ts +4 -1
- package/src/tools/update-profile.ts +16 -21
- package/src/tools/utils.ts +5 -0
- package/src/tools/workflows/trigger-workflow.ts +7 -1
- package/src/types.ts +165 -1
- package/src/utils/github-pull-request.ts +76 -0
- package/src/utils/identity-field-budget.ts +73 -0
- package/src/utils/multi-runtime.ts +20 -0
- package/src/utils/requester-comms.ts +24 -0
- package/src/workflows/engine.ts +22 -2
- package/src/workflows/resume.ts +19 -11
- package/src/workflows/retry-poller.ts +1 -0
- package/src/workflows/triggers.ts +4 -0
- package/templates/skills/db-query-guidance/config.json +14 -0
- package/templates/skills/db-query-guidance/content.md +57 -0
- package/dist/app-5da78bd4.js +0 -26
- package/dist/cli-3te4jdkm.js +0 -225
- package/dist/cli-bmze986d.js +0 -7
- package/dist/cli-kh3ba2zf.js +0 -607
- package/dist/hook-cgk4wxmx.js +0 -31
- package/dist/index-25wjsdv2.js +0 -34
- package/dist/index-76at2ymp.js +0 -7
- package/dist/index-hase6zbe.js +0 -6
- package/dist/index-vg4snay4.js +0 -36
- package/dist/index-vy8edt27.js +0 -7
- package/dist/lead-r2yqfmx7.js +0 -85
- package/dist/maintenance-mw70k468.js +0 -26
- package/dist/mistral-conversations-81fwav0j.js +0 -30578
- package/dist/otel-nqa12wf3.js +0 -3149
- package/dist/pricing-refresh-2cn6effr.js +0 -20
- package/dist/rbac-roles-vynday5g.js +0 -30
- package/dist/render-v2-tc0bh8kk.js +0 -34
- package/dist/seed-pricing-8kceb43f.js +0 -17
- package/dist/token-util-pqyc8kng.js +0 -6
- package/dist/worker-qrbz6hmv.js +0 -85
package/src/be/events.ts
CHANGED
|
@@ -266,6 +266,7 @@ export function getEventsFiltered(filters: {
|
|
|
266
266
|
agentId?: string;
|
|
267
267
|
taskId?: string;
|
|
268
268
|
sessionId?: string;
|
|
269
|
+
dataField?: string;
|
|
269
270
|
since?: string;
|
|
270
271
|
until?: string;
|
|
271
272
|
limit?: number;
|
|
@@ -301,6 +302,10 @@ export function getEventsFiltered(filters: {
|
|
|
301
302
|
conditions.push("sessionId = ?");
|
|
302
303
|
params.push(filters.sessionId);
|
|
303
304
|
}
|
|
305
|
+
if (filters.dataField) {
|
|
306
|
+
conditions.push("json_extract(data, '$.field') = ?");
|
|
307
|
+
params.push(filters.dataField);
|
|
308
|
+
}
|
|
304
309
|
if (filters.since) {
|
|
305
310
|
conditions.push("createdAt >= ?");
|
|
306
311
|
params.push(filters.since);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- Multi-runtime support: one logical agent may be served by several worker
|
|
2
|
+
-- processes at once.
|
|
3
|
+
--
|
|
4
|
+
-- `runtime_instances` holds one row per worker process serving an agent. The
|
|
5
|
+
-- `agents` row stays the durable identity; these rows carry only
|
|
6
|
+
-- process-scoped state (self-reported capacity and liveness) and are written
|
|
7
|
+
-- exclusively while MULTI_RUNTIME_ENABLED is set, so the table stays empty in
|
|
8
|
+
-- the default configuration. Rows are retired and pruned through the runtime
|
|
9
|
+
-- lifecycle rather than kept as history.
|
|
10
|
+
--
|
|
11
|
+
-- `status` values live in Zod (RuntimeInstanceStatusSchema, src/types.ts)
|
|
12
|
+
-- rather than a SQL CHECK, so adding a lifecycle state later needs no table
|
|
13
|
+
-- rebuild — the convention agent_tasks.source adopted in migration 056.
|
|
14
|
+
--
|
|
15
|
+
-- No FK from agent_tasks: task history must survive the disappearance of
|
|
16
|
+
-- whatever ran it.
|
|
17
|
+
CREATE TABLE runtime_instances (
|
|
18
|
+
id TEXT PRIMARY KEY,
|
|
19
|
+
agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
20
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
21
|
+
-- This runtime's own concurrent task capacity, self-reported at
|
|
22
|
+
-- registration. Composes with, but is never an alias for, agents.maxTasks.
|
|
23
|
+
reported_slots INTEGER NOT NULL DEFAULT 1,
|
|
24
|
+
-- Credential readiness is process-local: one runtime waiting on credentials
|
|
25
|
+
-- must not disable a ready sibling. NULL means "never reported" (e.g.
|
|
26
|
+
-- CRED_CHECK_DISABLE), which counts as ready so those workers stay usable.
|
|
27
|
+
credential_ready INTEGER,
|
|
28
|
+
metadata TEXT,
|
|
29
|
+
last_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
30
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
31
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
32
|
+
created_by TEXT,
|
|
33
|
+
updated_by TEXT
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE INDEX idx_runtime_instances_agent ON runtime_instances(agent_id);
|
|
37
|
+
|
|
38
|
+
-- Record which runtime owns each session so a starting worker clears only its
|
|
39
|
+
-- own leftovers instead of deleting a sibling's live session (which would
|
|
40
|
+
-- requeue a task another process is still executing). Nullable: pre-existing
|
|
41
|
+
-- rows and single-runtime deployments keep the agent-wide semantics.
|
|
42
|
+
ALTER TABLE active_sessions ADD COLUMN runtimeInstanceId TEXT;
|
|
43
|
+
|
|
44
|
+
CREATE INDEX idx_active_sessions_runtime ON active_sessions(runtimeInstanceId);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- Persist workflow trigger provenance outside caller-controlled triggerData.
|
|
2
|
+
-- `created_by` already snapshots the human requester; together these columns
|
|
3
|
+
-- distinguish a creatorless scheduled run from a requester-less manual run.
|
|
4
|
+
ALTER TABLE workflow_runs
|
|
5
|
+
ADD COLUMN triggerType TEXT NOT NULL DEFAULT 'manual'
|
|
6
|
+
CHECK(triggerType IN ('schedule', 'manual', 'event', 'api'));
|
|
7
|
+
|
|
8
|
+
-- Historical triggerData is caller-controlled for manual/API runs, so it
|
|
9
|
+
-- cannot be promoted into trusted provenance. Existing rows keep the safe
|
|
10
|
+
-- `manual` default; all future engine writes populate the server-owned value.
|
|
11
|
+
|
|
12
|
+
CREATE INDEX idx_workflow_runs_trigger_type ON workflow_runs(triggerType);
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
-- Migration 135: backfill canonical GitHub pull-request attachments from historical task output.
|
|
2
|
+
--
|
|
3
|
+
-- Runtime task completion and VCS detection now write these rows directly. This
|
|
4
|
+
-- migration repairs the legacy history without deleting or rewriting any
|
|
5
|
+
-- caller-authored attachment. Re-running is safe: the NOT EXISTS guard treats
|
|
6
|
+
-- task + canonical URL as the identity regardless of display name.
|
|
7
|
+
|
|
8
|
+
WITH RECURSIVE
|
|
9
|
+
candidate_sources(task_id, agent_id, source_text) AS (
|
|
10
|
+
SELECT id, agentId, output
|
|
11
|
+
FROM agent_tasks
|
|
12
|
+
WHERE output IS NOT NULL
|
|
13
|
+
AND instr(lower(output), 'github.com/') > 0
|
|
14
|
+
|
|
15
|
+
UNION ALL
|
|
16
|
+
|
|
17
|
+
SELECT id, agentId, vcsUrl
|
|
18
|
+
FROM agent_tasks
|
|
19
|
+
WHERE lower(vcsProvider) = 'github'
|
|
20
|
+
AND vcsUrl IS NOT NULL
|
|
21
|
+
AND instr(lower(vcsUrl), 'github.com/') > 0
|
|
22
|
+
),
|
|
23
|
+
whitespace_delimiters(position, code_point) AS (
|
|
24
|
+
VALUES
|
|
25
|
+
(1, 9), (2, 10), (3, 11), (4, 12), (5, 13), (6, 32), (7, 160), (8, 5760),
|
|
26
|
+
(9, 8192), (10, 8193), (11, 8194), (12, 8195), (13, 8196), (14, 8197),
|
|
27
|
+
(15, 8198), (16, 8199), (17, 8200), (18, 8201), (19, 8202), (20, 8232),
|
|
28
|
+
(21, 8233), (22, 8239), (23, 8287), (24, 12288), (25, 65279)
|
|
29
|
+
),
|
|
30
|
+
token_delimiters(position, code_point) AS (
|
|
31
|
+
SELECT position, code_point FROM whitespace_delimiters
|
|
32
|
+
UNION ALL SELECT 26, 40
|
|
33
|
+
UNION ALL SELECT 27, 41
|
|
34
|
+
UNION ALL SELECT 28, 91
|
|
35
|
+
UNION ALL SELECT 29, 93
|
|
36
|
+
UNION ALL SELECT 30, 123
|
|
37
|
+
UNION ALL SELECT 31, 125
|
|
38
|
+
UNION ALL SELECT 32, 60
|
|
39
|
+
UNION ALL SELECT 33, 62
|
|
40
|
+
UNION ALL SELECT 34, 34
|
|
41
|
+
UNION ALL SELECT 35, 39
|
|
42
|
+
UNION ALL SELECT 36, 96
|
|
43
|
+
),
|
|
44
|
+
whitespace_characters(value, position) AS (
|
|
45
|
+
SELECT '', 0
|
|
46
|
+
|
|
47
|
+
UNION ALL
|
|
48
|
+
|
|
49
|
+
SELECT value || char(code_point), whitespace_characters.position + 1
|
|
50
|
+
FROM whitespace_characters
|
|
51
|
+
JOIN whitespace_delimiters
|
|
52
|
+
ON whitespace_delimiters.position = whitespace_characters.position + 1
|
|
53
|
+
),
|
|
54
|
+
normalized(task_id, agent_id, value, position) AS (
|
|
55
|
+
SELECT
|
|
56
|
+
task_id,
|
|
57
|
+
agent_id,
|
|
58
|
+
source_text,
|
|
59
|
+
0
|
|
60
|
+
FROM candidate_sources
|
|
61
|
+
|
|
62
|
+
UNION ALL
|
|
63
|
+
|
|
64
|
+
SELECT
|
|
65
|
+
task_id,
|
|
66
|
+
agent_id,
|
|
67
|
+
replace(value, char(code_point), ' '),
|
|
68
|
+
normalized.position + 1
|
|
69
|
+
FROM normalized
|
|
70
|
+
JOIN token_delimiters ON token_delimiters.position = normalized.position + 1
|
|
71
|
+
),
|
|
72
|
+
tokens(task_id, agent_id, remaining, token) AS (
|
|
73
|
+
SELECT
|
|
74
|
+
task_id,
|
|
75
|
+
agent_id,
|
|
76
|
+
trim(value) || ' ',
|
|
77
|
+
NULL
|
|
78
|
+
FROM normalized
|
|
79
|
+
WHERE position = (SELECT max(position) FROM token_delimiters)
|
|
80
|
+
|
|
81
|
+
UNION ALL
|
|
82
|
+
|
|
83
|
+
SELECT
|
|
84
|
+
task_id,
|
|
85
|
+
agent_id,
|
|
86
|
+
ltrim(substr(remaining, instr(remaining, ' ') + 1)),
|
|
87
|
+
substr(remaining, 1, instr(remaining, ' ') - 1)
|
|
88
|
+
FROM tokens
|
|
89
|
+
WHERE remaining <> ''
|
|
90
|
+
),
|
|
91
|
+
token_paths(task_id, agent_id, token, path) AS (
|
|
92
|
+
SELECT
|
|
93
|
+
task_id,
|
|
94
|
+
agent_id,
|
|
95
|
+
token,
|
|
96
|
+
CASE
|
|
97
|
+
WHEN lower(token) GLOB 'https://github.com/*'
|
|
98
|
+
THEN substr(token, length('https://github.com/') + 1)
|
|
99
|
+
WHEN lower(token) GLOB 'http://github.com/*'
|
|
100
|
+
THEN substr(token, length('http://github.com/') + 1)
|
|
101
|
+
ELSE substr(token, length('github.com/') + 1)
|
|
102
|
+
END
|
|
103
|
+
FROM tokens
|
|
104
|
+
WHERE lower(token) GLOB 'https://github.com/*'
|
|
105
|
+
OR lower(token) GLOB 'http://github.com/*'
|
|
106
|
+
OR lower(token) GLOB 'github.com/*'
|
|
107
|
+
),
|
|
108
|
+
token_segments(task_id, agent_id, token, owner, repo, remainder) AS (
|
|
109
|
+
SELECT
|
|
110
|
+
task_id,
|
|
111
|
+
agent_id,
|
|
112
|
+
token,
|
|
113
|
+
substr(path, 1, instr(path, '/') - 1),
|
|
114
|
+
substr(
|
|
115
|
+
substr(path, instr(path, '/') + 1),
|
|
116
|
+
1,
|
|
117
|
+
instr(substr(path, instr(path, '/') + 1), '/') - 1
|
|
118
|
+
),
|
|
119
|
+
substr(
|
|
120
|
+
substr(path, instr(path, '/') + 1),
|
|
121
|
+
instr(substr(path, instr(path, '/') + 1), '/') + 1
|
|
122
|
+
)
|
|
123
|
+
FROM token_paths
|
|
124
|
+
WHERE instr(path, '/') > 1
|
|
125
|
+
AND instr(substr(path, instr(path, '/') + 1), '/') > 1
|
|
126
|
+
),
|
|
127
|
+
digit_scan(task_id, agent_id, token, position) AS (
|
|
128
|
+
SELECT
|
|
129
|
+
task_id,
|
|
130
|
+
agent_id,
|
|
131
|
+
'https://github.com/' || owner || '/' || repo || '/' || remainder,
|
|
132
|
+
instr(
|
|
133
|
+
lower('https://github.com/' || owner || '/' || repo || '/' || remainder),
|
|
134
|
+
'/pull/'
|
|
135
|
+
) + length('/pull/')
|
|
136
|
+
FROM token_segments
|
|
137
|
+
WHERE owner NOT GLOB '*[^A-Za-z0-9._-]*'
|
|
138
|
+
AND repo NOT GLOB '*[^A-Za-z0-9._-]*'
|
|
139
|
+
AND owner NOT IN ('.', '..')
|
|
140
|
+
AND repo NOT IN ('.', '..')
|
|
141
|
+
AND lower(remainder) GLOB 'pull/[0-9]*'
|
|
142
|
+
|
|
143
|
+
UNION ALL
|
|
144
|
+
|
|
145
|
+
SELECT task_id, agent_id, token, position + 1
|
|
146
|
+
FROM digit_scan
|
|
147
|
+
WHERE substr(token, position, 1) GLOB '[0-9]'
|
|
148
|
+
),
|
|
149
|
+
canonical_pull_requests(task_id, agent_id, url) AS (
|
|
150
|
+
SELECT
|
|
151
|
+
task_id,
|
|
152
|
+
agent_id,
|
|
153
|
+
substr(token, 1, max(position) - 1)
|
|
154
|
+
FROM digit_scan
|
|
155
|
+
GROUP BY task_id, agent_id, token
|
|
156
|
+
HAVING substr(token, max(position), 1) = ''
|
|
157
|
+
OR substr(token, max(position), 1) IN ('/', '?', '#')
|
|
158
|
+
OR trim(substr(token, max(position)), ')]},.;:!') = ''
|
|
159
|
+
)
|
|
160
|
+
INSERT INTO task_attachments (
|
|
161
|
+
id,
|
|
162
|
+
task_id,
|
|
163
|
+
agent_id,
|
|
164
|
+
name,
|
|
165
|
+
kind,
|
|
166
|
+
url,
|
|
167
|
+
provider_id,
|
|
168
|
+
provider_key,
|
|
169
|
+
capabilities,
|
|
170
|
+
intent,
|
|
171
|
+
description,
|
|
172
|
+
is_primary
|
|
173
|
+
)
|
|
174
|
+
SELECT
|
|
175
|
+
lower(hex(randomblob(4))) || '-' ||
|
|
176
|
+
lower(hex(randomblob(2))) || '-4' ||
|
|
177
|
+
substr(lower(hex(randomblob(2))), 2) || '-' ||
|
|
178
|
+
substr('89ab', abs(random()) % 4 + 1, 1) ||
|
|
179
|
+
substr(lower(hex(randomblob(2))), 2) || '-' ||
|
|
180
|
+
lower(hex(randomblob(6))),
|
|
181
|
+
candidate.task_id,
|
|
182
|
+
candidate.agent_id,
|
|
183
|
+
'GitHub pull request #' || substr(candidate.url, instr(lower(candidate.url), '/pull/') + 6),
|
|
184
|
+
'url',
|
|
185
|
+
candidate.url,
|
|
186
|
+
'github',
|
|
187
|
+
candidate.url,
|
|
188
|
+
json_object('_agentSwarmGeneratedBy', 'task-pull-request-recorder'),
|
|
189
|
+
'task-deliverable',
|
|
190
|
+
'Pull request shipped by this task',
|
|
191
|
+
0
|
|
192
|
+
FROM canonical_pull_requests candidate
|
|
193
|
+
WHERE NOT EXISTS (
|
|
194
|
+
SELECT 1
|
|
195
|
+
FROM task_attachments existing
|
|
196
|
+
WHERE existing.task_id = candidate.task_id
|
|
197
|
+
AND existing.kind = 'url'
|
|
198
|
+
AND EXISTS (
|
|
199
|
+
SELECT 1
|
|
200
|
+
FROM (
|
|
201
|
+
SELECT substr(lower(candidate.url), 9) AS base_url
|
|
202
|
+
UNION ALL
|
|
203
|
+
SELECT lower(candidate.url)
|
|
204
|
+
UNION ALL
|
|
205
|
+
SELECT 'http://' || substr(lower(candidate.url), 9)
|
|
206
|
+
) forms
|
|
207
|
+
WHERE lower(trim(
|
|
208
|
+
existing.url,
|
|
209
|
+
(SELECT value FROM whitespace_characters
|
|
210
|
+
WHERE position = (SELECT max(position) FROM whitespace_delimiters))
|
|
211
|
+
)) = forms.base_url
|
|
212
|
+
OR (
|
|
213
|
+
substr(lower(trim(
|
|
214
|
+
existing.url,
|
|
215
|
+
(SELECT value FROM whitespace_characters
|
|
216
|
+
WHERE position = (SELECT max(position) FROM whitespace_delimiters))
|
|
217
|
+
)), 1, length(forms.base_url)) = forms.base_url
|
|
218
|
+
AND unicode(substr(lower(trim(
|
|
219
|
+
existing.url,
|
|
220
|
+
(SELECT value FROM whitespace_characters
|
|
221
|
+
WHERE position = (SELECT max(position) FROM whitespace_delimiters))
|
|
222
|
+
)), length(forms.base_url) + 1, 1)) IN (
|
|
223
|
+
9, 10, 13, 32, 33, 34, 35, 39, 41, 44, 46, 47, 58, 59, 62, 63, 93, 96, 125
|
|
224
|
+
)
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
GROUP BY candidate.task_id, lower(candidate.url);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
-- Record whether requester attribution was copied from a parent task. This is
|
|
2
|
+
-- server-owned provenance: callers may set requestedByUserId, but never this
|
|
3
|
+
-- marker.
|
|
4
|
+
ALTER TABLE agent_tasks
|
|
5
|
+
ADD COLUMN requestedByUserIdInherited INTEGER NOT NULL DEFAULT 0
|
|
6
|
+
CHECK (requestedByUserIdInherited IN (0, 1));
|
|
7
|
+
|
|
8
|
+
-- Migration 127 copied requester ids through task trees before provenance was
|
|
9
|
+
-- stored. Reconstruct only the historical case that affects human-free
|
|
10
|
+
-- attribution: stale requesters propagated below heartbeat roots. An audited
|
|
11
|
+
-- `created_by` is durable evidence of an original human handoff and stops the
|
|
12
|
+
-- reconstruction. Legacy unaudited same-user handoffs are indistinguishable,
|
|
13
|
+
-- so this deliberately avoids guessing across ordinary human task trees.
|
|
14
|
+
WITH RECURSIVE inherited_from_heartbeat(id, requester, depth) AS (
|
|
15
|
+
SELECT id, requestedByUserId, 0
|
|
16
|
+
FROM agent_tasks
|
|
17
|
+
WHERE requestedByUserId IS NOT NULL
|
|
18
|
+
AND (
|
|
19
|
+
IFNULL(taskType, '') IN ('heartbeat', 'heartbeat-checklist', 'boot-triage')
|
|
20
|
+
OR IFNULL(tags, '[]') LIKE '%"heartbeat"%'
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
UNION ALL
|
|
24
|
+
|
|
25
|
+
SELECT child.id, lineage.requester, lineage.depth + 1
|
|
26
|
+
FROM agent_tasks AS child
|
|
27
|
+
JOIN inherited_from_heartbeat AS lineage ON child.parentTaskId = lineage.id
|
|
28
|
+
WHERE child.requestedByUserId = lineage.requester
|
|
29
|
+
AND child.created_by IS NULL
|
|
30
|
+
)
|
|
31
|
+
UPDATE agent_tasks
|
|
32
|
+
SET requestedByUserIdInherited = 1
|
|
33
|
+
WHERE id IN (
|
|
34
|
+
SELECT id
|
|
35
|
+
FROM inherited_from_heartbeat
|
|
36
|
+
WHERE depth > 0
|
|
37
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CREATE INDEX IF NOT EXISTS idx_memret_memory_agent_retrieved_at ON memory_retrieval(memoryId, agentId, retrievedAt);
|
|
@@ -226,21 +226,27 @@ export function runMigrations(db: Database): void {
|
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
// Apply migration in a transaction
|
|
229
|
-
console.
|
|
229
|
+
console.log(`[migrations] Applying: ${migration.name}`);
|
|
230
230
|
const start = performance.now();
|
|
231
231
|
|
|
232
|
-
|
|
233
|
-
db.
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
232
|
+
try {
|
|
233
|
+
db.transaction(() => {
|
|
234
|
+
db.exec(migration.sql);
|
|
235
|
+
db.run(
|
|
236
|
+
"INSERT INTO _migrations (version, name, applied_at, checksum) VALUES (?, ?, ?, ?)",
|
|
237
|
+
[migration.version, migration.name, new Date().toISOString(), migration.checksum],
|
|
238
|
+
);
|
|
239
|
+
})();
|
|
240
|
+
} catch (error) {
|
|
241
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
242
|
+
throw new Error(
|
|
243
|
+
`[migrations] Migration ${migration.version} (${migration.name}) failed: ${detail}`,
|
|
244
|
+
{ cause: error },
|
|
245
|
+
);
|
|
246
|
+
}
|
|
241
247
|
|
|
242
248
|
const elapsed = (performance.now() - start).toFixed(1);
|
|
243
|
-
console.
|
|
249
|
+
console.log(`[migrations] Applied: ${migration.name} (${elapsed}ms)`);
|
|
244
250
|
}
|
|
245
251
|
|
|
246
252
|
db.run("PRAGMA foreign_keys = ON");
|