upfynai-code 2.4.0 → 2.5.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/client/dist/assets/AppContent-CRld2UWX.js +513 -0
- package/client/dist/assets/CanvasPanel-CB4sweQq.js +34 -0
- package/client/dist/assets/CanvasPanel-WhZulBJw.css +1 -0
- package/client/dist/assets/DashboardPanel-BXaA-b9z.js +1 -0
- package/client/dist/assets/LoginModal-BwkvjfPR.js +19 -0
- package/client/dist/assets/{Onboarding-CtIoXiTp.js → Onboarding-2A_5fPxy.js} +1 -1
- package/client/dist/assets/{SetupForm-B4p8im5O.js → SetupForm-CH5EA5W0.js} +1 -1
- package/client/dist/assets/WorkflowsPanel-CO5g5yGG.js +1 -0
- package/client/dist/assets/{ar-SA-G6X2FPQ2-2gfmdvHk.js → ar-SA-G6X2FPQ2-DoJuo98H.js} +2 -2
- package/client/dist/assets/{arc-DCZSHhoJ.js → arc-B0wBaTeh.js} +1 -1
- package/client/dist/assets/az-AZ-76LH7QW2-xdrt1Z13.js +1 -0
- package/client/dist/assets/{bg-BG-XCXSNQG7-D6__XtOK.js → bg-BG-XCXSNQG7-D8NAiF6Y.js} +2 -2
- package/client/dist/assets/{blockDiagram-38ab4fdb-Cfbaeyp6.js → blockDiagram-38ab4fdb-DSnyKzK4.js} +2 -2
- package/client/dist/assets/{bn-BD-2XOGV67Q-DHNJw3OG.js → bn-BD-2XOGV67Q-B0qWv8_J.js} +2 -2
- package/client/dist/assets/{c4Diagram-3d4e48cf-BBCnjOTy.js → c4Diagram-3d4e48cf-DoZJ13XA.js} +2 -2
- package/client/dist/assets/{ca-ES-6MX7JW3Y-r5g4o3zQ.js → ca-ES-6MX7JW3Y-RgLhfbZZ.js} +3 -3
- package/client/dist/assets/channel-BmO6nY0W.js +1 -0
- package/client/dist/assets/classDiagram-70f12bd4-GNyDrRCk.js +2 -0
- package/client/dist/assets/classDiagram-v2-f2320105-CxdGhHm2.js +2 -0
- package/client/dist/assets/clone-xuHMqFoD.js +1 -0
- package/client/dist/assets/{createText-2e5e7dd3-B8jCDmF_.js → createText-2e5e7dd3-DiPywQOa.js} +1 -1
- package/client/dist/assets/{cs-CZ-2BRQDIVT-p08jRLRC.js → cs-CZ-2BRQDIVT-BAjmnuoC.js} +2 -2
- package/client/dist/assets/{da-DK-5WZEPLOC-CnhOImFf.js → da-DK-5WZEPLOC-JxKVGt8o.js} +2 -2
- package/client/dist/assets/{de-DE-XR44H4JA-BunSXZ-Y.js → de-DE-XR44H4JA-CrnRlt4z.js} +2 -2
- package/client/dist/assets/{edges-e0da2a9e-CGBBhG8k.js → edges-e0da2a9e-DDsXzXLJ.js} +1 -1
- package/client/dist/assets/{el-GR-BZB4AONW-D4wv1oIz.js → el-GR-BZB4AONW-DQd8iogq.js} +2 -2
- package/client/dist/assets/{erDiagram-9861fffd-CYaF3q1I.js → erDiagram-9861fffd-CBiCC4rl.js} +2 -2
- package/client/dist/assets/{es-ES-U4NZUMDT-CGeTKXgd.js → es-ES-U4NZUMDT-vvUblc5i.js} +2 -2
- package/client/dist/assets/{eu-ES-A7QVB2H4-Cayx1TxR.js → eu-ES-A7QVB2H4-De4NNCc1.js} +2 -2
- package/client/dist/assets/{fa-IR-HGAKTJCU-CmUg8pmw.js → fa-IR-HGAKTJCU-DFBXqIqq.js} +2 -2
- package/client/dist/assets/{fi-FI-Z5N7JZ37-xvHcPhsU.js → fi-FI-Z5N7JZ37-DV9zESPg.js} +2 -2
- package/client/dist/assets/{flowDb-956e92f1-C-_LFz70.js → flowDb-956e92f1-BhdSHbdO.js} +1 -1
- package/client/dist/assets/{flowDiagram-66a62f08-C1sHdSjn.js → flowDiagram-66a62f08-M-fp1_Ie.js} +2 -2
- package/client/dist/assets/flowDiagram-v2-96b9c2cf-C5eiN8Pg.js +1 -0
- package/client/dist/assets/{flowchart-elk-definition-4a651766-CNGfpudb.js → flowchart-elk-definition-4a651766-Bp0SonQx.js} +2 -2
- package/client/dist/assets/{fr-FR-RHASNOE6-DBoHEcNj.js → fr-FR-RHASNOE6-CKTMXuGk.js} +2 -2
- package/client/dist/assets/ganttDiagram-c361ad54-iA737GUS.js +257 -0
- package/client/dist/assets/{gitGraphDiagram-72cf32ee-DojCDvlS.js → gitGraphDiagram-72cf32ee-BX-wj-PV.js} +2 -2
- package/client/dist/assets/{gl-ES-HMX3MZ6V-p6hrn2cN.js → gl-ES-HMX3MZ6V-Cdiqq4jY.js} +2 -2
- package/client/dist/assets/{graph-DXM7lcy1.js → graph-Rxkx3sEa.js} +1 -1
- package/client/dist/assets/{he-IL-6SHJWFNN-y2jEX6-0.js → he-IL-6SHJWFNN-gYmR5_KT.js} +2 -2
- package/client/dist/assets/{hi-IN-IWLTKZ5I-99pNfyWr.js → hi-IN-IWLTKZ5I-pyqK94AR.js} +2 -2
- package/client/dist/assets/{hu-HU-A5ZG7DT2-hygceGMS.js → hu-HU-A5ZG7DT2-DpacJgJy.js} +2 -2
- package/client/dist/assets/{id-ID-SAP4L64H-CyIqi1hv.js → id-ID-SAP4L64H-CAvIX-mj.js} +2 -2
- package/client/dist/assets/{index-3862675e-4idOQN2N.js → index-3862675e-BX3Fpn6V.js} +1 -1
- package/client/dist/assets/{index-BHZfFT_V.js → index-BBlwbHq_.js} +4 -4
- package/client/dist/assets/{index-BGmwbRlb.js → index-ClfzLIqY.js} +6 -6
- package/client/dist/assets/index-Td4UdtLF.css +1 -0
- package/client/dist/assets/{infoDiagram-f8f76790-CFLrHqtc.js → infoDiagram-f8f76790-Ckv8imiv.js} +2 -2
- package/client/dist/assets/{it-IT-JPQ66NNP-DzVvVdQI.js → it-IT-JPQ66NNP-BtpNRSce.js} +2 -2
- package/client/dist/assets/{ja-JP-DBVTYXUO-BI4fPexV.js → ja-JP-DBVTYXUO-CwJRyY6M.js} +2 -2
- package/client/dist/assets/{journeyDiagram-49397b02-C3CFDo8z.js → journeyDiagram-49397b02-DWWZssji.js} +2 -2
- package/client/dist/assets/kaa-6HZHGXH3-DIWQEb4A.js +1 -0
- package/client/dist/assets/{kab-KAB-ZGHBKWFO-DBI_ri48.js → kab-KAB-ZGHBKWFO-DjGbqhUg.js} +2 -2
- package/client/dist/assets/kk-KZ-P5N5QNE5-B_VzJdWf.js +1 -0
- package/client/dist/assets/{km-KH-HSX4SM5Z-DOMFSres.js → km-KH-HSX4SM5Z-DUD5mi0o.js} +2 -2
- package/client/dist/assets/{ko-KR-MTYHY66A-tb08hXzd.js → ko-KR-MTYHY66A--sDB10db.js} +3 -3
- package/client/dist/assets/{ku-TR-6OUDTVRD-DlIQCCY4.js → ku-TR-6OUDTVRD-CKvKrkcX.js} +2 -2
- package/client/dist/assets/{layout-B_11mCXA.js → layout-CkB7sSeq.js} +1 -1
- package/client/dist/assets/{line-B-qmK_vI.js → line-DC7MA9qY.js} +1 -1
- package/client/dist/assets/{linear-Ph6uuYcX.js → linear-C1lBBthf.js} +1 -1
- package/client/dist/assets/{lt-LT-XHIRWOB4--qWy24_Z.js → lt-LT-XHIRWOB4-MSZf7xYG.js} +2 -2
- package/client/dist/assets/{lv-LV-5QDEKY6T-Bnd_1GDb.js → lv-LV-5QDEKY6T-C-gvvmBB.js} +2 -2
- package/client/dist/assets/{mindmap-definition-fc14e90a-Do79tIc0.js → mindmap-definition-fc14e90a-B3O7hztq.js} +2 -2
- package/client/dist/assets/{mr-IN-CRQNXWMA-BsV6HaD9.js → mr-IN-CRQNXWMA-XHtBUWQH.js} +2 -2
- package/client/dist/assets/my-MM-5M5IBNSE-D9eD2edL.js +1 -0
- package/client/dist/assets/{nb-NO-T6EIAALU-Cvf9FdSF.js → nb-NO-T6EIAALU-BlImC6gp.js} +3 -3
- package/client/dist/assets/{nl-NL-IS3SIHDZ-DA1yqpXw.js → nl-NL-IS3SIHDZ-CPFhnaSP.js} +2 -2
- package/client/dist/assets/{nn-NO-6E72VCQL-89lm3vku.js → nn-NO-6E72VCQL-BMvoJSKQ.js} +2 -2
- package/client/dist/assets/{oc-FR-POXYY2M6-BsrjTJQh.js → oc-FR-POXYY2M6-Buye63LS.js} +2 -2
- package/client/dist/assets/{pa-IN-N4M65BXN-CczefYaj.js → pa-IN-N4M65BXN-D9uQ3niy.js} +2 -2
- package/client/dist/assets/{percentages-BXMCSKIN-Be6p9phi.js → percentages-BXMCSKIN-BzXIakGM.js} +7 -7
- package/client/dist/assets/{pieDiagram-8a3498a8-CfblQHdm.js → pieDiagram-8a3498a8-BU38mzx-.js} +3 -3
- package/client/dist/assets/{pl-PL-T2D74RX3-DdhH-zcK.js → pl-PL-T2D74RX3-BqM4xdcg.js} +2 -2
- package/client/dist/assets/{pt-BR-5N22H2LF-gpwlheL6.js → pt-BR-5N22H2LF-rAjrxGyI.js} +2 -2
- package/client/dist/assets/{pt-PT-UZXXM6DQ-Cs87vICi.js → pt-PT-UZXXM6DQ-DXsqcwLt.js} +2 -2
- package/client/dist/assets/{quadrantDiagram-120e2f19-CRMSamSP.js → quadrantDiagram-120e2f19-HhK4H1WU.js} +2 -2
- package/client/dist/assets/{requirementDiagram-deff3bca-D3LBN016.js → requirementDiagram-deff3bca-aDrcyj-A.js} +2 -2
- package/client/dist/assets/{ro-RO-JPDTUUEW-CWTSJ1Dt.js → ro-RO-JPDTUUEW-D_F9UKer.js} +2 -2
- package/client/dist/assets/{ru-RU-B4JR7IUQ-Bq7aN2ep.js → ru-RU-B4JR7IUQ-MirqN29p.js} +2 -2
- package/client/dist/assets/sankeyDiagram-04a897e0-C6ij7qbQ.js +8 -0
- package/client/dist/assets/{sequenceDiagram-704730f1-BRYXVDGX.js → sequenceDiagram-704730f1-C0EKO3th.js} +2 -2
- package/client/dist/assets/si-LK-N5RQ5JYF-DyZC3mkC.js +1 -0
- package/client/dist/assets/{sk-SK-C5VTKIMK-ByjKQzUb.js → sk-SK-C5VTKIMK-D-ksz-WY.js} +2 -2
- package/client/dist/assets/{sl-SI-NN7IZMDC-B8WCyMBU.js → sl-SI-NN7IZMDC-CknuYoQ1.js} +2 -2
- package/client/dist/assets/stateDiagram-587899a1-CYoq2VjL.js +1 -0
- package/client/dist/assets/stateDiagram-v2-d93cdb3a-C5lbp5px.js +1 -0
- package/client/dist/assets/{styles-6aaf32cf-Dr-lfIOW.js → styles-6aaf32cf-Dkfsk8gt.js} +1 -1
- package/client/dist/assets/{styles-9a916d00-DS4wRpL7.js → styles-9a916d00-CMYqtcEN.js} +1 -1
- package/client/dist/assets/{styles-c10674c1-nKRF6NrH.js → styles-c10674c1-Bp-5OlRU.js} +1 -1
- package/client/dist/assets/{subset-shared.chunk-KT79s7KG.js → subset-shared.chunk-kfIB1Zam.js} +3 -3
- package/client/dist/assets/subset-worker.chunk-DwQBgc4z.js +1 -0
- package/client/dist/assets/{sv-SE-XGPEYMSR-BiIPUVbv.js → sv-SE-XGPEYMSR-DwN13se1.js} +2 -2
- package/client/dist/assets/{svgDrawCommon-08f97a94-C3uP9PYr.js → svgDrawCommon-08f97a94-CEgCMqs4.js} +1 -1
- package/client/dist/assets/{ta-IN-2NMHFXQM-Cidadso2.js → ta-IN-2NMHFXQM-ejDfFhwa.js} +2 -2
- package/client/dist/assets/th-TH-HPSO5L25-Bqc90ZNn.js +2 -0
- package/client/dist/assets/{timeline-definition-85554ec2-BSsLsIgF.js → timeline-definition-85554ec2-BmGdKqG0.js} +2 -2
- package/client/dist/assets/{tr-TR-DEFEU3FU-DaFcI-KL.js → tr-TR-DEFEU3FU-CJvlPbcW.js} +2 -2
- package/client/dist/assets/{uk-UA-QMV73CPH-DkBW36St.js → uk-UA-QMV73CPH-D26-cbWL.js} +3 -3
- package/client/dist/assets/vendor-codemirror-D_s0aGBu.js +35 -0
- package/client/dist/assets/{vendor-icons-Dh9m_Ydt.js → vendor-icons-aNdOvTr_.js} +159 -119
- package/client/dist/assets/{vi-VN-M7AON7JQ-KrtfxOzl.js → vi-VN-M7AON7JQ-MbqIIwYM.js} +2 -2
- package/client/dist/assets/{xychartDiagram-e933f94c-CgNgZ4pp.js → xychartDiagram-e933f94c-gfcTauxU.js} +2 -2
- package/client/dist/assets/{zh-CN-LNUGB5OW-BQu12RoD.js → zh-CN-LNUGB5OW-BZSmhUdL.js} +3 -3
- package/client/dist/assets/zh-HK-E62DVLB3-BJqejpiX.js +1 -0
- package/client/dist/assets/{zh-TW-RAJ6MFWO-ffJWgVxn.js → zh-TW-RAJ6MFWO-BBXtV-Uz.js} +2 -2
- package/client/dist/index.html +3 -3
- package/package.json +5 -2
- package/server/cli.js +64 -5
- package/server/constants/config.js +29 -3
- package/server/database/auth.db +0 -0
- package/server/database/db.js +203 -1
- package/server/index.js +348 -48
- package/server/mcp-server.js +2 -1
- package/server/middleware/auth.js +20 -9
- package/server/projects.js +95 -202
- package/server/relay-client.js +205 -11
- package/server/routes/auth.js +6 -0
- package/server/routes/commands.js +1 -1
- package/server/routes/dashboard.js +52 -0
- package/server/routes/projects.js +38 -35
- package/server/routes/voice.js +198 -0
- package/server/routes/webhooks.js +166 -0
- package/server/routes/workflows.js +118 -0
- package/server/services/whisperService.js +84 -0
- package/server/services/workflowScheduler.js +186 -0
- package/client/dist/assets/AppContent-DTZ2FbvM.js +0 -513
- package/client/dist/assets/CanvasPanel-DlTW6Jh6.js +0 -6
- package/client/dist/assets/CanvasPanel-q4HEqNtV.css +0 -1
- package/client/dist/assets/LoginModal-CWoFm0au.js +0 -19
- package/client/dist/assets/az-AZ-76LH7QW2-CDdeucRZ.js +0 -1
- package/client/dist/assets/channel-O3ovC0x9.js +0 -1
- package/client/dist/assets/classDiagram-70f12bd4-D0lhAcxU.js +0 -2
- package/client/dist/assets/classDiagram-v2-f2320105-BuwUsF3F.js +0 -2
- package/client/dist/assets/clone-BG9u7vLi.js +0 -1
- package/client/dist/assets/flowDiagram-v2-96b9c2cf-Cd0Iascd.js +0 -1
- package/client/dist/assets/ganttDiagram-c361ad54-B8HJQqjt.js +0 -257
- package/client/dist/assets/index-B8wwD_Xo.css +0 -1
- package/client/dist/assets/kaa-6HZHGXH3-fwOleoQB.js +0 -1
- package/client/dist/assets/kk-KZ-P5N5QNE5-zpl7uvyF.js +0 -1
- package/client/dist/assets/my-MM-5M5IBNSE-kZQURVIi.js +0 -1
- package/client/dist/assets/sankeyDiagram-04a897e0-CsFqOQZN.js +0 -8
- package/client/dist/assets/si-LK-N5RQ5JYF-BBjcNYQh.js +0 -1
- package/client/dist/assets/stateDiagram-587899a1-BHoy9LtD.js +0 -1
- package/client/dist/assets/stateDiagram-v2-d93cdb3a-BvMUA6bS.js +0 -1
- package/client/dist/assets/subset-worker.chunk-BMx1eyv3.js +0 -1
- package/client/dist/assets/th-TH-HPSO5L25-CFNnJwSv.js +0 -2
- package/client/dist/assets/vendor-codemirror-langs-BH1ZcKHY.js +0 -20
- package/client/dist/assets/vendor-codemirror-rix45NST.js +0 -16
- package/client/dist/assets/zh-HK-E62DVLB3-zx9CvERq.js +0 -1
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Environment Flag: Is Platform
|
|
3
|
-
*
|
|
2
|
+
* Environment Flag: Is Platform (Self-Hosted / Local Mode)
|
|
3
|
+
*
|
|
4
|
+
* When true, the app runs in single-user local mode:
|
|
5
|
+
* - Skips JWT authentication (uses first DB user)
|
|
6
|
+
* - Claude Code SDK runs directly on the machine
|
|
7
|
+
* - No relay connection needed
|
|
8
|
+
*
|
|
9
|
+
* Auto-detected when:
|
|
10
|
+
* - VITE_IS_PLATFORM=true is set, OR
|
|
11
|
+
* - Running locally (not on Railway/Vercel/cloud)
|
|
4
12
|
*/
|
|
5
|
-
|
|
13
|
+
const isCloudEnv = !!(
|
|
14
|
+
process.env.RAILWAY_ENVIRONMENT ||
|
|
15
|
+
process.env.VERCEL ||
|
|
16
|
+
process.env.RENDER ||
|
|
17
|
+
process.env.FLY_APP_NAME ||
|
|
18
|
+
process.env.HEROKU_APP_NAME
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export const IS_PLATFORM = process.env.VITE_IS_PLATFORM === 'true' || (!isCloudEnv && !process.env.FORCE_HOSTED_MODE);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* True when running on a cloud provider (Railway, Vercel, etc.)
|
|
25
|
+
*/
|
|
26
|
+
export const IS_CLOUD = isCloudEnv;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* True when running locally (self-hosted mode)
|
|
30
|
+
*/
|
|
31
|
+
export const IS_LOCAL = IS_PLATFORM && !isCloudEnv;
|
package/server/database/auth.db
CHANGED
|
Binary file
|
package/server/database/db.js
CHANGED
|
@@ -170,6 +170,63 @@ CREATE TABLE IF NOT EXISTS payments (
|
|
|
170
170
|
CREATE INDEX IF NOT EXISTS idx_payments_user_id ON payments(user_id);
|
|
171
171
|
CREATE INDEX IF NOT EXISTS idx_payments_order_id ON payments(razorpay_order_id);
|
|
172
172
|
CREATE INDEX IF NOT EXISTS idx_payments_status ON payments(status);
|
|
173
|
+
|
|
174
|
+
CREATE TABLE IF NOT EXISTS webhooks (
|
|
175
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
176
|
+
user_id INTEGER NOT NULL,
|
|
177
|
+
name TEXT NOT NULL,
|
|
178
|
+
url TEXT NOT NULL,
|
|
179
|
+
method TEXT NOT NULL DEFAULT 'POST',
|
|
180
|
+
headers TEXT DEFAULT '{}',
|
|
181
|
+
description TEXT,
|
|
182
|
+
is_active BOOLEAN DEFAULT 1,
|
|
183
|
+
last_triggered DATETIME,
|
|
184
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
185
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
186
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_webhooks_user_id ON webhooks(user_id);
|
|
190
|
+
CREATE INDEX IF NOT EXISTS idx_webhooks_active ON webhooks(is_active);
|
|
191
|
+
|
|
192
|
+
CREATE TABLE IF NOT EXISTS workflows (
|
|
193
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
194
|
+
user_id INTEGER NOT NULL,
|
|
195
|
+
name TEXT NOT NULL,
|
|
196
|
+
description TEXT,
|
|
197
|
+
steps TEXT NOT NULL DEFAULT '[]',
|
|
198
|
+
schedule TEXT DEFAULT NULL,
|
|
199
|
+
schedule_enabled BOOLEAN DEFAULT 0,
|
|
200
|
+
schedule_timezone TEXT DEFAULT 'UTC',
|
|
201
|
+
is_active BOOLEAN DEFAULT 1,
|
|
202
|
+
last_run DATETIME,
|
|
203
|
+
next_run DATETIME,
|
|
204
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
205
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
206
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
CREATE INDEX IF NOT EXISTS idx_workflows_user_id ON workflows(user_id);
|
|
210
|
+
CREATE INDEX IF NOT EXISTS idx_workflows_active ON workflows(is_active);
|
|
211
|
+
|
|
212
|
+
CREATE TABLE IF NOT EXISTS workflow_runs (
|
|
213
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
214
|
+
workflow_id INTEGER NOT NULL,
|
|
215
|
+
user_id INTEGER NOT NULL,
|
|
216
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
217
|
+
steps_completed INTEGER DEFAULT 0,
|
|
218
|
+
total_steps INTEGER DEFAULT 0,
|
|
219
|
+
result TEXT,
|
|
220
|
+
error TEXT,
|
|
221
|
+
started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
222
|
+
completed_at DATETIME,
|
|
223
|
+
FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,
|
|
224
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_runs_workflow_id ON workflow_runs(workflow_id);
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_runs_user_id ON workflow_runs(user_id);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_runs_status ON workflow_runs(status);
|
|
173
230
|
`;
|
|
174
231
|
|
|
175
232
|
// ─── Migrations ─────────────────────────────────────────────────────────────────
|
|
@@ -603,4 +660,149 @@ const relayTokensDb = {
|
|
|
603
660
|
}
|
|
604
661
|
};
|
|
605
662
|
|
|
606
|
-
|
|
663
|
+
// ─── Webhook DB ──────────────────────────────────────────────────────────────
|
|
664
|
+
|
|
665
|
+
const webhookDb = {
|
|
666
|
+
getAll: async (userId) => {
|
|
667
|
+
const result = await db.execute({
|
|
668
|
+
sql: 'SELECT * FROM webhooks WHERE user_id = ? ORDER BY created_at DESC',
|
|
669
|
+
args: [userId]
|
|
670
|
+
});
|
|
671
|
+
return result.rows;
|
|
672
|
+
},
|
|
673
|
+
|
|
674
|
+
getById: async (id, userId) => {
|
|
675
|
+
const result = await db.execute({
|
|
676
|
+
sql: 'SELECT * FROM webhooks WHERE id = ? AND user_id = ?',
|
|
677
|
+
args: [id, userId]
|
|
678
|
+
});
|
|
679
|
+
return getRow(result);
|
|
680
|
+
},
|
|
681
|
+
|
|
682
|
+
create: async (userId, { name, url, method, headers, description }) => {
|
|
683
|
+
const result = await db.execute({
|
|
684
|
+
sql: 'INSERT INTO webhooks (user_id, name, url, method, headers, description) VALUES (?, ?, ?, ?, ?, ?)',
|
|
685
|
+
args: [userId, name, url, method || 'POST', headers || '{}', description || null]
|
|
686
|
+
});
|
|
687
|
+
return { id: Number(result.lastInsertRowid), name, url, method: method || 'POST' };
|
|
688
|
+
},
|
|
689
|
+
|
|
690
|
+
update: async (id, userId, { name, url, method, headers, description }) => {
|
|
691
|
+
const result = await db.execute({
|
|
692
|
+
sql: 'UPDATE webhooks SET name = ?, url = ?, method = ?, headers = ?, description = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND user_id = ?',
|
|
693
|
+
args: [name, url, method, headers || '{}', description || null, id, userId]
|
|
694
|
+
});
|
|
695
|
+
return result.rowsAffected > 0;
|
|
696
|
+
},
|
|
697
|
+
|
|
698
|
+
delete: async (id, userId) => {
|
|
699
|
+
await ensureForeignKeys();
|
|
700
|
+
const result = await db.execute({
|
|
701
|
+
sql: 'DELETE FROM webhooks WHERE id = ? AND user_id = ?',
|
|
702
|
+
args: [id, userId]
|
|
703
|
+
});
|
|
704
|
+
return result.rowsAffected > 0;
|
|
705
|
+
},
|
|
706
|
+
|
|
707
|
+
updateLastTriggered: async (id) => {
|
|
708
|
+
await db.execute({
|
|
709
|
+
sql: 'UPDATE webhooks SET last_triggered = CURRENT_TIMESTAMP WHERE id = ?',
|
|
710
|
+
args: [id]
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
|
|
715
|
+
// ─── Workflow DB ─────────────────────────────────────────────────────────────
|
|
716
|
+
|
|
717
|
+
const workflowDb = {
|
|
718
|
+
getAll: async (userId) => {
|
|
719
|
+
const result = await db.execute({
|
|
720
|
+
sql: 'SELECT * FROM workflows WHERE user_id = ? ORDER BY created_at DESC',
|
|
721
|
+
args: [userId]
|
|
722
|
+
});
|
|
723
|
+
return result.rows;
|
|
724
|
+
},
|
|
725
|
+
|
|
726
|
+
getById: async (id, userId) => {
|
|
727
|
+
const result = await db.execute({
|
|
728
|
+
sql: 'SELECT * FROM workflows WHERE id = ? AND user_id = ?',
|
|
729
|
+
args: [id, userId]
|
|
730
|
+
});
|
|
731
|
+
return getRow(result);
|
|
732
|
+
},
|
|
733
|
+
|
|
734
|
+
create: async (userId, { name, description, steps, schedule, schedule_enabled, schedule_timezone }) => {
|
|
735
|
+
const result = await db.execute({
|
|
736
|
+
sql: 'INSERT INTO workflows (user_id, name, description, steps, schedule, schedule_enabled, schedule_timezone) VALUES (?, ?, ?, ?, ?, ?, ?)',
|
|
737
|
+
args: [userId, name, description || null, JSON.stringify(steps || []), schedule || null, schedule_enabled ? 1 : 0, schedule_timezone || 'UTC']
|
|
738
|
+
});
|
|
739
|
+
return { id: Number(result.lastInsertRowid), name };
|
|
740
|
+
},
|
|
741
|
+
|
|
742
|
+
update: async (id, userId, { name, description, steps, schedule, schedule_enabled, schedule_timezone }) => {
|
|
743
|
+
const result = await db.execute({
|
|
744
|
+
sql: 'UPDATE workflows SET name = ?, description = ?, steps = ?, schedule = ?, schedule_enabled = ?, schedule_timezone = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND user_id = ?',
|
|
745
|
+
args: [name, description || null, JSON.stringify(steps || []), schedule || null, schedule_enabled ? 1 : 0, schedule_timezone || 'UTC', id, userId]
|
|
746
|
+
});
|
|
747
|
+
return result.rowsAffected > 0;
|
|
748
|
+
},
|
|
749
|
+
|
|
750
|
+
delete: async (id, userId) => {
|
|
751
|
+
await ensureForeignKeys();
|
|
752
|
+
const result = await db.execute({
|
|
753
|
+
sql: 'DELETE FROM workflows WHERE id = ? AND user_id = ?',
|
|
754
|
+
args: [id, userId]
|
|
755
|
+
});
|
|
756
|
+
return result.rowsAffected > 0;
|
|
757
|
+
},
|
|
758
|
+
|
|
759
|
+
updateLastRun: async (id) => {
|
|
760
|
+
await db.execute({
|
|
761
|
+
sql: 'UPDATE workflows SET last_run = CURRENT_TIMESTAMP WHERE id = ?',
|
|
762
|
+
args: [id]
|
|
763
|
+
});
|
|
764
|
+
},
|
|
765
|
+
|
|
766
|
+
getScheduled: async () => {
|
|
767
|
+
const result = await db.execute(
|
|
768
|
+
'SELECT * FROM workflows WHERE schedule IS NOT NULL AND schedule_enabled = 1 AND is_active = 1'
|
|
769
|
+
);
|
|
770
|
+
return result.rows;
|
|
771
|
+
},
|
|
772
|
+
|
|
773
|
+
updateNextRun: async (id, nextRun) => {
|
|
774
|
+
await db.execute({
|
|
775
|
+
sql: 'UPDATE workflows SET next_run = ? WHERE id = ?',
|
|
776
|
+
args: [nextRun, id]
|
|
777
|
+
});
|
|
778
|
+
},
|
|
779
|
+
|
|
780
|
+
createRun: async (workflowId, userId, totalSteps) => {
|
|
781
|
+
const result = await db.execute({
|
|
782
|
+
sql: 'INSERT INTO workflow_runs (workflow_id, user_id, status, total_steps) VALUES (?, ?, ?, ?)',
|
|
783
|
+
args: [workflowId, userId, 'running', totalSteps]
|
|
784
|
+
});
|
|
785
|
+
return { id: Number(result.lastInsertRowid) };
|
|
786
|
+
},
|
|
787
|
+
|
|
788
|
+
updateRun: async (runId, { status, stepsCompleted, result: runResult, error }) => {
|
|
789
|
+
const sets = ['status = ?'];
|
|
790
|
+
const args = [status];
|
|
791
|
+
if (stepsCompleted !== undefined) { sets.push('steps_completed = ?'); args.push(stepsCompleted); }
|
|
792
|
+
if (runResult !== undefined) { sets.push('result = ?'); args.push(typeof runResult === 'string' ? runResult : JSON.stringify(runResult)); }
|
|
793
|
+
if (error !== undefined) { sets.push('error = ?'); args.push(error); }
|
|
794
|
+
if (status === 'completed' || status === 'failed') { sets.push('completed_at = CURRENT_TIMESTAMP'); }
|
|
795
|
+
args.push(runId);
|
|
796
|
+
await db.execute({ sql: `UPDATE workflow_runs SET ${sets.join(', ')} WHERE id = ?`, args });
|
|
797
|
+
},
|
|
798
|
+
|
|
799
|
+
getRuns: async (workflowId, userId) => {
|
|
800
|
+
const result = await db.execute({
|
|
801
|
+
sql: 'SELECT * FROM workflow_runs WHERE workflow_id = ? AND user_id = ? ORDER BY started_at DESC LIMIT 20',
|
|
802
|
+
args: [workflowId, userId]
|
|
803
|
+
});
|
|
804
|
+
return result.rows;
|
|
805
|
+
}
|
|
806
|
+
};
|
|
807
|
+
|
|
808
|
+
export { db, initializeDatabase, userDb, apiKeysDb, credentialsDb, relayTokensDb, githubTokensDb, subscriptionDb, paymentDb, webhookDb, workflowDb, PLAN_DURATIONS };
|