upfynai-code 2.5.0 → 2.6.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.
Files changed (130) hide show
  1. package/README.md +131 -0
  2. package/client/dist/assets/{AppContent-CRld2UWX.js → AppContent-C0CyP3g5.js} +3 -3
  3. package/client/dist/assets/{CanvasPanel-CB4sweQq.js → CanvasPanel-0u9QR7U-.js} +5 -5
  4. package/client/dist/assets/DashboardPanel-Dgqw1yZk.js +1 -0
  5. package/client/dist/assets/{LoginModal-BwkvjfPR.js → LoginModal-CZDEzqjK.js} +1 -1
  6. package/client/dist/assets/Onboarding-DR6NZ4Vz.js +1 -0
  7. package/client/dist/assets/{SetupForm-CH5EA5W0.js → SetupForm-D49gtWY4.js} +1 -1
  8. package/client/dist/assets/{WorkflowsPanel-CO5g5yGG.js → WorkflowsPanel-CqlbEJA_.js} +1 -1
  9. package/client/dist/assets/{ar-SA-G6X2FPQ2-DoJuo98H.js → ar-SA-G6X2FPQ2-BWqa1yBH.js} +1 -1
  10. package/client/dist/assets/{arc-B0wBaTeh.js → arc-BegSKqEW.js} +1 -1
  11. package/client/dist/assets/{az-AZ-76LH7QW2-xdrt1Z13.js → az-AZ-76LH7QW2-DrVlbZDP.js} +1 -1
  12. package/client/dist/assets/{bg-BG-XCXSNQG7-D8NAiF6Y.js → bg-BG-XCXSNQG7-DdunjBgT.js} +1 -1
  13. package/client/dist/assets/{blockDiagram-38ab4fdb-DSnyKzK4.js → blockDiagram-38ab4fdb-BKMbwGHu.js} +1 -1
  14. package/client/dist/assets/{bn-BD-2XOGV67Q-B0qWv8_J.js → bn-BD-2XOGV67Q-_7DtmvwO.js} +1 -1
  15. package/client/dist/assets/{c4Diagram-3d4e48cf-DoZJ13XA.js → c4Diagram-3d4e48cf-hJuiHhSn.js} +1 -1
  16. package/client/dist/assets/{ca-ES-6MX7JW3Y-RgLhfbZZ.js → ca-ES-6MX7JW3Y-BFIrmojG.js} +1 -1
  17. package/client/dist/assets/channel-Bur-rRTp.js +1 -0
  18. package/client/dist/assets/{classDiagram-70f12bd4-GNyDrRCk.js → classDiagram-70f12bd4-BjiAf9cM.js} +1 -1
  19. package/client/dist/assets/{classDiagram-v2-f2320105-CxdGhHm2.js → classDiagram-v2-f2320105-pwBewejc.js} +1 -1
  20. package/client/dist/assets/clone-BtqXeoBJ.js +1 -0
  21. package/client/dist/assets/{createText-2e5e7dd3-DiPywQOa.js → createText-2e5e7dd3-Dq_acOWe.js} +1 -1
  22. package/client/dist/assets/{cs-CZ-2BRQDIVT-BAjmnuoC.js → cs-CZ-2BRQDIVT-B-x4F6TJ.js} +1 -1
  23. package/client/dist/assets/{da-DK-5WZEPLOC-JxKVGt8o.js → da-DK-5WZEPLOC-Btlc8Dgn.js} +1 -1
  24. package/client/dist/assets/{de-DE-XR44H4JA-CrnRlt4z.js → de-DE-XR44H4JA-BVu3ZIoD.js} +1 -1
  25. package/client/dist/assets/{edges-e0da2a9e-DDsXzXLJ.js → edges-e0da2a9e-DH0wVTXR.js} +1 -1
  26. package/client/dist/assets/{el-GR-BZB4AONW-DQd8iogq.js → el-GR-BZB4AONW-h2ll8_ZC.js} +1 -1
  27. package/client/dist/assets/{erDiagram-9861fffd-CBiCC4rl.js → erDiagram-9861fffd-BYezLIR7.js} +1 -1
  28. package/client/dist/assets/{es-ES-U4NZUMDT-vvUblc5i.js → es-ES-U4NZUMDT-Cveiulwt.js} +1 -1
  29. package/client/dist/assets/{eu-ES-A7QVB2H4-De4NNCc1.js → eu-ES-A7QVB2H4-DQluL2PY.js} +1 -1
  30. package/client/dist/assets/{fa-IR-HGAKTJCU-DFBXqIqq.js → fa-IR-HGAKTJCU-BJtcMBSv.js} +1 -1
  31. package/client/dist/assets/{fi-FI-Z5N7JZ37-DV9zESPg.js → fi-FI-Z5N7JZ37-D8NfbVXV.js} +1 -1
  32. package/client/dist/assets/{flowDb-956e92f1-BhdSHbdO.js → flowDb-956e92f1-scnUykhM.js} +1 -1
  33. package/client/dist/assets/{flowDiagram-66a62f08-M-fp1_Ie.js → flowDiagram-66a62f08-jVyWsfyU.js} +1 -1
  34. package/client/dist/assets/flowDiagram-v2-96b9c2cf-N6xgi25h.js +1 -0
  35. package/client/dist/assets/{flowchart-elk-definition-4a651766-Bp0SonQx.js → flowchart-elk-definition-4a651766-gKGX3HqR.js} +1 -1
  36. package/client/dist/assets/{fr-FR-RHASNOE6-CKTMXuGk.js → fr-FR-RHASNOE6-vdj42kC6.js} +1 -1
  37. package/client/dist/assets/{ganttDiagram-c361ad54-iA737GUS.js → ganttDiagram-c361ad54-C2CiWFUP.js} +1 -1
  38. package/client/dist/assets/{gitGraphDiagram-72cf32ee-BX-wj-PV.js → gitGraphDiagram-72cf32ee-C59Yz2LK.js} +1 -1
  39. package/client/dist/assets/{gl-ES-HMX3MZ6V-Cdiqq4jY.js → gl-ES-HMX3MZ6V-DQo0TzoP.js} +1 -1
  40. package/client/dist/assets/{graph-Rxkx3sEa.js → graph-Dx_H43Kv.js} +1 -1
  41. package/client/dist/assets/{he-IL-6SHJWFNN-gYmR5_KT.js → he-IL-6SHJWFNN-DKXK5e33.js} +1 -1
  42. package/client/dist/assets/{hi-IN-IWLTKZ5I-pyqK94AR.js → hi-IN-IWLTKZ5I-C2Qgqc0R.js} +1 -1
  43. package/client/dist/assets/{hu-HU-A5ZG7DT2-DpacJgJy.js → hu-HU-A5ZG7DT2-Ss-6vX0m.js} +1 -1
  44. package/client/dist/assets/{id-ID-SAP4L64H-CAvIX-mj.js → id-ID-SAP4L64H-D7Wsg1S2.js} +1 -1
  45. package/client/dist/assets/{index-3862675e-BX3Fpn6V.js → index-3862675e-u8Nv7hHC.js} +1 -1
  46. package/client/dist/assets/{index-BBlwbHq_.js → index-BVowJdZF.js} +4 -4
  47. package/client/dist/assets/{index-ClfzLIqY.js → index-ce18TYkg.js} +4 -4
  48. package/client/dist/assets/index-kQoJx-bc.css +1 -0
  49. package/client/dist/assets/{infoDiagram-f8f76790-Ckv8imiv.js → infoDiagram-f8f76790-LmoJYsxo.js} +1 -1
  50. package/client/dist/assets/{it-IT-JPQ66NNP-BtpNRSce.js → it-IT-JPQ66NNP-CAPTVl7M.js} +1 -1
  51. package/client/dist/assets/{ja-JP-DBVTYXUO-CwJRyY6M.js → ja-JP-DBVTYXUO-eNVPawR2.js} +1 -1
  52. package/client/dist/assets/{journeyDiagram-49397b02-DWWZssji.js → journeyDiagram-49397b02-BaJqehpR.js} +1 -1
  53. package/client/dist/assets/{kaa-6HZHGXH3-DIWQEb4A.js → kaa-6HZHGXH3-tpuNkKhS.js} +1 -1
  54. package/client/dist/assets/{kab-KAB-ZGHBKWFO-DjGbqhUg.js → kab-KAB-ZGHBKWFO-Dp83kx4x.js} +1 -1
  55. package/client/dist/assets/{kk-KZ-P5N5QNE5-B_VzJdWf.js → kk-KZ-P5N5QNE5-B9IlC6YN.js} +1 -1
  56. package/client/dist/assets/{km-KH-HSX4SM5Z-DUD5mi0o.js → km-KH-HSX4SM5Z-B_KMYaMj.js} +1 -1
  57. package/client/dist/assets/{ko-KR-MTYHY66A--sDB10db.js → ko-KR-MTYHY66A-yebnUNdb.js} +1 -1
  58. package/client/dist/assets/{ku-TR-6OUDTVRD-CKvKrkcX.js → ku-TR-6OUDTVRD-BR6fh6-5.js} +1 -1
  59. package/client/dist/assets/{layout-CkB7sSeq.js → layout-DLl5Jwcl.js} +1 -1
  60. package/client/dist/assets/{line-DC7MA9qY.js → line-FpB7omSK.js} +1 -1
  61. package/client/dist/assets/{linear-C1lBBthf.js → linear-CkXqUFJ8.js} +1 -1
  62. package/client/dist/assets/{lt-LT-XHIRWOB4-MSZf7xYG.js → lt-LT-XHIRWOB4-SutZSWtR.js} +1 -1
  63. package/client/dist/assets/{lv-LV-5QDEKY6T-C-gvvmBB.js → lv-LV-5QDEKY6T-DuAxdcZL.js} +1 -1
  64. package/client/dist/assets/{mindmap-definition-fc14e90a-B3O7hztq.js → mindmap-definition-fc14e90a-DyxXOExh.js} +1 -1
  65. package/client/dist/assets/{mr-IN-CRQNXWMA-XHtBUWQH.js → mr-IN-CRQNXWMA-DqDUWM_8.js} +1 -1
  66. package/client/dist/assets/{my-MM-5M5IBNSE-D9eD2edL.js → my-MM-5M5IBNSE-C40kMFMR.js} +1 -1
  67. package/client/dist/assets/{nb-NO-T6EIAALU-BlImC6gp.js → nb-NO-T6EIAALU-DVij32Ju.js} +1 -1
  68. package/client/dist/assets/{nl-NL-IS3SIHDZ-CPFhnaSP.js → nl-NL-IS3SIHDZ-rT84mDYq.js} +1 -1
  69. package/client/dist/assets/{nn-NO-6E72VCQL-BMvoJSKQ.js → nn-NO-6E72VCQL-BBZXBW8V.js} +1 -1
  70. package/client/dist/assets/{oc-FR-POXYY2M6-Buye63LS.js → oc-FR-POXYY2M6-DzjOugOf.js} +1 -1
  71. package/client/dist/assets/{pa-IN-N4M65BXN-D9uQ3niy.js → pa-IN-N4M65BXN-DD1iU8_F.js} +1 -1
  72. package/client/dist/assets/{percentages-BXMCSKIN-BzXIakGM.js → percentages-BXMCSKIN-WVlHS4wx.js} +6 -6
  73. package/client/dist/assets/{pieDiagram-8a3498a8-BU38mzx-.js → pieDiagram-8a3498a8-Dd_85qBH.js} +1 -1
  74. package/client/dist/assets/{pl-PL-T2D74RX3-BqM4xdcg.js → pl-PL-T2D74RX3-ukVXa48G.js} +1 -1
  75. package/client/dist/assets/{pt-BR-5N22H2LF-rAjrxGyI.js → pt-BR-5N22H2LF-BibawarT.js} +1 -1
  76. package/client/dist/assets/{pt-PT-UZXXM6DQ-DXsqcwLt.js → pt-PT-UZXXM6DQ-So3i9l9w.js} +1 -1
  77. package/client/dist/assets/{quadrantDiagram-120e2f19-HhK4H1WU.js → quadrantDiagram-120e2f19-C4dFVDEx.js} +1 -1
  78. package/client/dist/assets/{requirementDiagram-deff3bca-aDrcyj-A.js → requirementDiagram-deff3bca-DrTO7yFl.js} +1 -1
  79. package/client/dist/assets/{ro-RO-JPDTUUEW-D_F9UKer.js → ro-RO-JPDTUUEW-DY0Xq_Hd.js} +1 -1
  80. package/client/dist/assets/{ru-RU-B4JR7IUQ-MirqN29p.js → ru-RU-B4JR7IUQ-B7u_Zvkd.js} +1 -1
  81. package/client/dist/assets/{sankeyDiagram-04a897e0-C6ij7qbQ.js → sankeyDiagram-04a897e0-D24gfzuS.js} +1 -1
  82. package/client/dist/assets/{sequenceDiagram-704730f1-C0EKO3th.js → sequenceDiagram-704730f1-Dgji2XLQ.js} +1 -1
  83. package/client/dist/assets/{si-LK-N5RQ5JYF-DyZC3mkC.js → si-LK-N5RQ5JYF-OejsLzQ_.js} +1 -1
  84. package/client/dist/assets/{sk-SK-C5VTKIMK-D-ksz-WY.js → sk-SK-C5VTKIMK-_vy2Bt-M.js} +1 -1
  85. package/client/dist/assets/{sl-SI-NN7IZMDC-CknuYoQ1.js → sl-SI-NN7IZMDC-DKOl_u2M.js} +1 -1
  86. package/client/dist/assets/{stateDiagram-587899a1-CYoq2VjL.js → stateDiagram-587899a1-CJ8eBaiU.js} +1 -1
  87. package/client/dist/assets/{stateDiagram-v2-d93cdb3a-C5lbp5px.js → stateDiagram-v2-d93cdb3a-C5K3l-Nt.js} +1 -1
  88. package/client/dist/assets/{styles-6aaf32cf-Dkfsk8gt.js → styles-6aaf32cf-DAKE0jbx.js} +1 -1
  89. package/client/dist/assets/{styles-9a916d00-CMYqtcEN.js → styles-9a916d00-LFAJCgEy.js} +1 -1
  90. package/client/dist/assets/{styles-c10674c1-Bp-5OlRU.js → styles-c10674c1-CllKO8NG.js} +1 -1
  91. package/client/dist/assets/{subset-shared.chunk-kfIB1Zam.js → subset-shared.chunk-Uy-J87FQ.js} +1 -1
  92. package/client/dist/assets/{subset-worker.chunk-DwQBgc4z.js → subset-worker.chunk-dvgDvqt9.js} +1 -1
  93. package/client/dist/assets/{sv-SE-XGPEYMSR-DwN13se1.js → sv-SE-XGPEYMSR-CDCB2ZV5.js} +1 -1
  94. package/client/dist/assets/{svgDrawCommon-08f97a94-CEgCMqs4.js → svgDrawCommon-08f97a94-CObOzbFQ.js} +1 -1
  95. package/client/dist/assets/{ta-IN-2NMHFXQM-ejDfFhwa.js → ta-IN-2NMHFXQM-DHUNdO69.js} +1 -1
  96. package/client/dist/assets/{th-TH-HPSO5L25-Bqc90ZNn.js → th-TH-HPSO5L25-zI2hnBq3.js} +1 -1
  97. package/client/dist/assets/{timeline-definition-85554ec2-BmGdKqG0.js → timeline-definition-85554ec2-C2XHRmxK.js} +1 -1
  98. package/client/dist/assets/{tr-TR-DEFEU3FU-CJvlPbcW.js → tr-TR-DEFEU3FU-l-6Hu4-D.js} +1 -1
  99. package/client/dist/assets/{uk-UA-QMV73CPH-D26-cbWL.js → uk-UA-QMV73CPH-CqSOwrl7.js} +1 -1
  100. package/client/dist/assets/{vendor-icons-aNdOvTr_.js → vendor-icons-Lb69KSFJ.js} +136 -126
  101. package/client/dist/assets/{vi-VN-M7AON7JQ-MbqIIwYM.js → vi-VN-M7AON7JQ-CUL8-mBZ.js} +1 -1
  102. package/client/dist/assets/{xychartDiagram-e933f94c-gfcTauxU.js → xychartDiagram-e933f94c-1fmf6slj.js} +1 -1
  103. package/client/dist/assets/{zh-CN-LNUGB5OW-BZSmhUdL.js → zh-CN-LNUGB5OW-CB5y5VVU.js} +1 -1
  104. package/client/dist/assets/{zh-HK-E62DVLB3-BJqejpiX.js → zh-HK-E62DVLB3-BHcrrEeJ.js} +1 -1
  105. package/client/dist/assets/{zh-TW-RAJ6MFWO-BBXtV-Uz.js → zh-TW-RAJ6MFWO-DoDUdkaJ.js} +1 -1
  106. package/client/dist/index.html +3 -3
  107. package/package.json +17 -14
  108. package/server/cli.js +44 -0
  109. package/server/database/db.js +16 -2
  110. package/server/index.js +2738 -2621
  111. package/server/middleware/auth.js +10 -2
  112. package/server/relay-client.js +73 -20
  113. package/server/routes/agent.js +1226 -1266
  114. package/server/routes/auth.js +32 -29
  115. package/server/routes/commands.js +598 -601
  116. package/server/routes/cursor.js +806 -807
  117. package/server/routes/dashboard.js +154 -1
  118. package/server/routes/git.js +1151 -1165
  119. package/server/routes/mcp.js +534 -551
  120. package/server/routes/settings.js +261 -269
  121. package/server/routes/taskmaster.js +1927 -1963
  122. package/server/routes/vapi-chat.js +94 -0
  123. package/server/routes/voice.js +0 -4
  124. package/server/sandbox.js +120 -0
  125. package/client/dist/assets/DashboardPanel-BXaA-b9z.js +0 -1
  126. package/client/dist/assets/Onboarding-2A_5fPxy.js +0 -1
  127. package/client/dist/assets/channel-BmO6nY0W.js +0 -1
  128. package/client/dist/assets/clone-xuHMqFoD.js +0 -1
  129. package/client/dist/assets/flowDiagram-v2-96b9c2cf-C5eiN8Pg.js +0 -1
  130. package/client/dist/assets/index-Td4UdtLF.css +0 -1
@@ -0,0 +1,94 @@
1
+ import express from 'express';
2
+
3
+ const router = express.Router();
4
+
5
+ const VAPI_PRIVATE_KEY = process.env.VAPI_PRIVATE_KEY;
6
+ const VAPI_PUBLIC_KEY = process.env.VAPI_PUBLIC_KEY;
7
+ const VAPI_ASSISTANT_ID = process.env.VAPI_ASSISTANT_ID;
8
+
9
+ /**
10
+ * POST /api/vapi/chat — Proxy to VAPI Chat API
11
+ * Body: { message, chatId? }
12
+ * Returns: { reply, chatId }
13
+ */
14
+ router.post('/chat', async (req, res) => {
15
+ if (!VAPI_PRIVATE_KEY || !VAPI_ASSISTANT_ID) {
16
+ return res.status(503).json({ error: 'VAPI chat not configured' });
17
+ }
18
+
19
+ const { message, chatId } = req.body;
20
+ if (!message || typeof message !== 'string') {
21
+ return res.status(400).json({ error: 'Message is required' });
22
+ }
23
+
24
+ try {
25
+ const body = {
26
+ assistantId: VAPI_ASSISTANT_ID,
27
+ input: message.slice(0, 2000),
28
+ };
29
+ if (chatId) body.previousChatId = chatId;
30
+
31
+ const response = await fetch('https://api.vapi.ai/chat', {
32
+ method: 'POST',
33
+ headers: {
34
+ 'Authorization': `Bearer ${VAPI_PRIVATE_KEY}`,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ body: JSON.stringify(body),
38
+ });
39
+
40
+ if (!response.ok) {
41
+ const err = await response.text().catch(() => '');
42
+ return res.status(response.status).json({ error: 'VAPI chat request failed' });
43
+ }
44
+
45
+ const data = await response.json();
46
+
47
+ // Extract the assistant's reply from the output array
48
+ const assistantMsg = data.output?.find(o => o.role === 'assistant');
49
+ const reply = assistantMsg?.content || data.output?.[0]?.content || 'No response';
50
+
51
+ res.json({
52
+ reply,
53
+ chatId: data.chat?.id || chatId || null,
54
+ });
55
+ } catch (error) {
56
+ res.status(500).json({ error: 'Chat request failed' });
57
+ }
58
+ });
59
+
60
+ /**
61
+ * POST /api/vapi/call — Create a VAPI web call server-side
62
+ * Returns: { webCallUrl, callId }
63
+ */
64
+ router.post('/call', async (req, res) => {
65
+ if (!VAPI_PUBLIC_KEY || !VAPI_ASSISTANT_ID) {
66
+ return res.status(503).json({ error: 'VAPI voice not configured' });
67
+ }
68
+
69
+ try {
70
+ const response = await fetch('https://api.vapi.ai/call/web', {
71
+ method: 'POST',
72
+ headers: {
73
+ 'Authorization': `Bearer ${VAPI_PUBLIC_KEY}`,
74
+ 'Content-Type': 'application/json',
75
+ },
76
+ body: JSON.stringify({ assistantId: VAPI_ASSISTANT_ID }),
77
+ });
78
+
79
+ if (!response.ok) {
80
+ const err = await response.text().catch(() => '');
81
+ return res.status(response.status).json({ error: 'Failed to create call', details: err });
82
+ }
83
+
84
+ const data = await response.json();
85
+ res.json({
86
+ webCallUrl: data.webCallUrl || data.transport?.callUrl,
87
+ callId: data.id,
88
+ });
89
+ } catch (error) {
90
+ res.status(500).json({ error: 'Call creation failed' });
91
+ }
92
+ });
93
+
94
+ export default router;
@@ -75,7 +75,6 @@ router.post('/stt', upload.single('audio'), async (req, res) => {
75
75
  return res.json({ text, source: 'openai' });
76
76
  } catch (err) {
77
77
  // If cloud fails, try local fallback
78
- console.warn('[Voice STT] OpenAI API failed, trying local:', err.message);
79
78
  }
80
79
  }
81
80
 
@@ -95,7 +94,6 @@ router.post('/stt', upload.single('audio'), async (req, res) => {
95
94
 
96
95
  return res.status(500).json({ error: 'No STT engine available. Add your OpenAI key in Settings > AI Providers, or install nodejs-whisper + ffmpeg for local transcription.' });
97
96
  } catch (error) {
98
- console.error('[Voice STT] Error:', error.message);
99
97
  res.status(500).json({ error: 'Transcription failed' });
100
98
  }
101
99
  });
@@ -123,7 +121,6 @@ router.post('/tts', async (req, res) => {
123
121
  res.setHeader('Content-Length', audioBuffer.length);
124
122
  res.send(audioBuffer);
125
123
  } catch (error) {
126
- console.error('[Voice TTS] Error:', error.message);
127
124
  res.status(500).json({ error: 'TTS synthesis failed' });
128
125
  }
129
126
  });
@@ -148,7 +145,6 @@ router.get('/voices', async (req, res) => {
148
145
 
149
146
  res.json({ voices: englishVoices });
150
147
  } catch (error) {
151
- console.error('[Voice Voices] Error:', error.message);
152
148
  res.status(500).json({ error: 'Failed to fetch voices' });
153
149
  }
154
150
  });
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Sandbox Client — connects the backend to the separate sandbox-service on Railway.
3
+ * All sandbox operations are proxied to the sandbox service via HTTP.
4
+ */
5
+
6
+ const SANDBOX_SERVICE_URL = process.env.SANDBOX_SERVICE_URL || 'http://localhost:4300';
7
+ const SANDBOX_SERVICE_SECRET = process.env.SANDBOX_SERVICE_SECRET || 'dev-sandbox-secret';
8
+
9
+ async function sandboxFetch(path, userId, body = null) {
10
+ const opts = {
11
+ method: body ? 'POST' : 'GET',
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ 'x-sandbox-secret': SANDBOX_SERVICE_SECRET,
15
+ 'x-user-id': String(userId),
16
+ },
17
+ };
18
+ if (body) opts.body = JSON.stringify(body);
19
+
20
+ const res = await fetch(`${SANDBOX_SERVICE_URL}${path}`, opts);
21
+ const data = await res.json();
22
+ if (!res.ok) throw new Error(data.error || `Sandbox service error: ${res.status}`);
23
+ return data;
24
+ }
25
+
26
+ const sandboxClient = {
27
+
28
+ /**
29
+ * Check if the sandbox service is reachable.
30
+ */
31
+ async isAvailable() {
32
+ try {
33
+ const res = await fetch(`${SANDBOX_SERVICE_URL}/health`, { signal: AbortSignal.timeout(3000) });
34
+ return res.ok;
35
+ } catch {
36
+ return false;
37
+ }
38
+ },
39
+
40
+ /**
41
+ * Initialize a user's sandbox (creates if doesn't exist).
42
+ */
43
+ async initSandbox(userId) {
44
+ return sandboxFetch('/api/sandbox/init', userId, {});
45
+ },
46
+
47
+ /**
48
+ * Get sandbox status.
49
+ */
50
+ async getStatus(userId) {
51
+ return sandboxFetch('/api/sandbox/status', userId);
52
+ },
53
+
54
+ /**
55
+ * Destroy a user's sandbox.
56
+ */
57
+ async destroySandbox(userId) {
58
+ const res = await fetch(`${SANDBOX_SERVICE_URL}/api/sandbox`, {
59
+ method: 'DELETE',
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ 'x-sandbox-secret': SANDBOX_SERVICE_SECRET,
63
+ 'x-user-id': String(userId),
64
+ },
65
+ });
66
+ const data = await res.json();
67
+ if (!res.ok) throw new Error(data.error || 'Failed to destroy sandbox');
68
+ return data;
69
+ },
70
+
71
+ /**
72
+ * Execute a command in the user's sandbox.
73
+ */
74
+ async exec(userId, command, opts = {}) {
75
+ return sandboxFetch('/api/exec', userId, {
76
+ command,
77
+ cwd: opts.cwd,
78
+ timeout: opts.timeout,
79
+ userKeys: opts.userKeys,
80
+ });
81
+ },
82
+
83
+ /**
84
+ * Read a file from the user's sandbox.
85
+ */
86
+ async readFile(userId, filePath) {
87
+ return sandboxFetch('/api/file/read', userId, { filePath });
88
+ },
89
+
90
+ /**
91
+ * Write a file to the user's sandbox.
92
+ */
93
+ async writeFile(userId, filePath, content) {
94
+ return sandboxFetch('/api/file/write', userId, { filePath, content });
95
+ },
96
+
97
+ /**
98
+ * Get file tree from the user's sandbox.
99
+ */
100
+ async getFileTree(userId, dirPath, depth = 3) {
101
+ return sandboxFetch('/api/file/tree', userId, { dirPath, depth });
102
+ },
103
+
104
+ /**
105
+ * Run a git command in the user's sandbox.
106
+ */
107
+ async gitOperation(userId, gitCommand, cwd) {
108
+ return sandboxFetch('/api/git', userId, { gitCommand, cwd });
109
+ },
110
+
111
+ /**
112
+ * Get the WebSocket URL for an interactive shell session.
113
+ */
114
+ getShellWsUrl(userId, sessionId) {
115
+ const wsBase = SANDBOX_SERVICE_URL.replace(/^http/, 'ws');
116
+ return `${wsBase}/shell?secret=${encodeURIComponent(SANDBOX_SERVICE_SECRET)}&userId=${userId}&sessionId=${sessionId || 'default'}`;
117
+ },
118
+ };
119
+
120
+ export { sandboxClient, SANDBOX_SERVICE_URL };
@@ -1 +0,0 @@
1
- import{r as o,j as e}from"./vendor-react-9mUTKBHH.js";import{a as f,I as u}from"./index-ClfzLIqY.js";import{d as m,R as j,e as v,Z as N,E as w,A as y}from"./vendor-icons-aNdOvTr_.js";import"./vendor-syntax-DnmwQQJF.js";import"./vendor-markdown-BXEi_H3G.js";import"./vendor-i18n-DCFGyhQR.js";function L({selectedProject:s}){const[t,n]=o.useState(null),[r,i]=o.useState(null),[a,x]=o.useState(!0),[S,h]=o.useState(null),d=o.useCallback(async()=>{x(!0),h(null);try{const c=await f("/api/dashboard/stats");if(c.ok){const b=await c.json();n(b)}}catch{}x(!1)},[]);return o.useEffect(()=>{d()},[d]),e.jsxs("div",{className:"h-full overflow-y-auto p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("h2",{className:"text-lg font-semibold text-foreground flex items-center gap-2",children:[e.jsx(m,{className:"w-5 h-5 text-blue-500"}),"Dashboard"]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-0.5",children:s?`Project: ${s.displayName||s.name}`:"Overview"})]}),e.jsx("button",{onClick:d,disabled:a,className:"p-2 rounded-lg hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-colors",title:"Refresh stats",children:e.jsx(j,{className:`w-4 h-4 ${a?"animate-spin":""}`})})]}),e.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-3",children:[e.jsx(p,{icon:v,label:"Sessions",value:(t==null?void 0:t.total)??"—",subtext:t!=null&&t.today?`${t.today} today`:void 0,color:"blue"}),e.jsx(p,{icon:N,label:"AI Providers",value:t!=null&&t.providers?Object.keys(t.providers).length:"—",subtext:t!=null&&t.providers?Object.keys(t.providers).join(", "):void 0,color:"purple"}),u]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium text-muted-foreground mb-3 uppercase tracking-wider",children:"Quick Actions"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2",children:[e.jsx(g,{label:"Install CLI",description:"npm install -g upfynai-code",onClick:()=>navigator.clipboard.writeText("npm install -g upfynai-code")}),e.jsx(g,{label:"Connect Machine",description:"uc connect",onClick:()=>navigator.clipboard.writeText("uc connect")}),u]})]}),u,s&&e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium text-muted-foreground mb-3 uppercase tracking-wider",children:"Project Info"}),e.jsxs("div",{className:"rounded-lg bg-muted/30 border border-border/50 p-4 space-y-2",children:[e.jsx(l,{label:"Name",value:s.displayName||s.name}),e.jsx(l,{label:"Path",value:s.fullPath||s.path||"—"}),s.sessions&&e.jsx(l,{label:"Claude Sessions",value:String(s.sessions.length)}),s.cursorSessions&&e.jsx(l,{label:"Cursor Sessions",value:String(s.cursorSessions.length)}),s.codexSessions&&e.jsx(l,{label:"Codex Sessions",value:String(s.codexSessions.length)})]})]}),!s&&e.jsxs("div",{className:"text-center py-12 text-muted-foreground",children:[e.jsx(m,{className:"w-12 h-12 mx-auto mb-4 opacity-30"}),e.jsx("p",{className:"text-sm",children:"Select a project to see analytics"})]})]})}function p({icon:s,label:t,value:n,subtext:r,color:i}){const a={blue:"text-blue-500 bg-blue-500/10",purple:"text-purple-500 bg-purple-500/10",amber:"text-amber-500 bg-amber-500/10",emerald:"text-emerald-500 bg-emerald-500/10"};return e.jsxs("div",{className:"rounded-lg border border-border/50 bg-card/50 p-3 sm:p-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx("div",{className:`w-7 h-7 rounded-md flex items-center justify-center ${a[i]}`,children:e.jsx(s,{className:"w-3.5 h-3.5"})}),e.jsx("span",{className:"text-xs text-muted-foreground",children:t})]}),e.jsx("p",{className:"text-xl font-semibold text-foreground",children:n}),r&&e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5",children:r})]})}function g({label:s,description:t,onClick:n,href:r}){const i=r?"a":"button",a=r?{href:r,target:"_blank",rel:"noopener noreferrer"}:{onClick:n};return e.jsxs(i,{...a,className:"flex items-center justify-between p-3 rounded-lg border border-border/50 bg-card/50 hover:bg-muted/60 transition-colors text-left group",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t})]}),r?e.jsx(w,{className:"w-3.5 h-3.5 text-muted-foreground group-hover:text-foreground"}):e.jsx(y,{className:"w-3.5 h-3.5 text-muted-foreground group-hover:text-foreground"})]})}function l({label:s,value:t}){return e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsx("span",{className:"text-muted-foreground",children:s}),e.jsx("span",{className:"text-foreground font-mono text-xs truncate max-w-[60%] text-right",children:t})]})}export{L as default};
@@ -1 +0,0 @@
1
- import{r as a,j as e,v as Y}from"./vendor-react-9mUTKBHH.js";import{L as D,C as V,a as H,b as K}from"./LoginModal-BwkvjfPR.js";import{u as Q,a as m}from"./index-ClfzLIqY.js";import{G as P,L as W,C as g,a as X,b as G,c as Z,U as _,M as ee}from"./vendor-icons-aNdOvTr_.js";import"./vendor-xterm-CZq1hqo1.js";import"./vendor-syntax-DnmwQQJF.js";import"./vendor-markdown-BXEi_H3G.js";import"./vendor-i18n-DCFGyhQR.js";const ce=({onComplete:y})=>{const[r,b]=a.useState(0),[x,w]=a.useState(""),[u,C]=a.useState(""),[i,h]=a.useState(!1),[k,o]=a.useState(""),[n,f]=a.useState(null),[I]=a.useState({name:"default",fullPath:""}),[l,p]=a.useState({authenticated:!1,email:null,loading:!0,error:null}),[d,j]=a.useState({authenticated:!1,email:null,loading:!0,error:null}),[c,N]=a.useState({authenticated:!1,email:null,loading:!0,error:null}),{user:te}=Q(),S=a.useRef(void 0);a.useEffect(()=>{M()},[]);const M=async()=>{try{const t=await m("/api/user/git-config");if(t.ok){const s=await t.json();s.gitName&&w(s.gitName),s.gitEmail&&C(s.gitEmail)}}catch(t){console.error("Error loading git config:",t)}};a.useEffect(()=>{const t=S.current;S.current=n,(t===void 0||t!==null&&n===null)&&(L(),A(),E())},[n]);const L=async()=>{try{const t=await m("/api/cli/claude/status");if(t.ok){const s=await t.json();p({authenticated:s.authenticated,email:s.email,loading:!1,error:s.error||null})}else p({authenticated:!1,email:null,loading:!1,error:"Failed to check authentication status"})}catch(t){console.error("Error checking Claude auth status:",t),p({authenticated:!1,email:null,loading:!1,error:t.message})}},A=async()=>{try{const t=await m("/api/cli/cursor/status");if(t.ok){const s=await t.json();j({authenticated:s.authenticated,email:s.email,loading:!1,error:s.error||null})}else j({authenticated:!1,email:null,loading:!1,error:"Failed to check authentication status"})}catch(t){console.error("Error checking Cursor auth status:",t),j({authenticated:!1,email:null,loading:!1,error:t.message})}},E=async()=>{try{const t=await m("/api/cli/codex/status");if(t.ok){const s=await t.json();N({authenticated:s.authenticated,email:s.email,loading:!1,error:s.error||null})}else N({authenticated:!1,email:null,loading:!1,error:"Failed to check authentication status"})}catch(t){console.error("Error checking Codex auth status:",t),N({authenticated:!1,email:null,loading:!1,error:t.message})}},$=()=>f("claude"),q=()=>f("cursor"),O=()=>f("codex"),R=t=>{t===0&&(n==="claude"?L():n==="cursor"?A():n==="codex"&&E())},T=async()=>{if(o(""),r===0){if(!x.trim()||!u.trim()){o("Both git name and email are required");return}if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(u)){o("Please enter a valid email address");return}h(!0);try{const s=await m("/api/user/git-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({gitName:x,gitEmail:u})});if(!s.ok){const F=await s.json();throw new Error(F.error||"Failed to save git configuration")}b(r+1)}catch(s){o(s.message)}finally{h(!1)}return}b(r+1)},z=()=>{o(""),b(r-1)},B=async()=>{h(!0),o("");try{const t=await m("/api/user/complete-onboarding",{method:"POST"});if(!t.ok){const s=await t.json();throw new Error(s.error||"Failed to complete onboarding")}y&&y()}catch(t){o(t.message)}finally{h(!1)}},v=[{title:"Git Configuration",description:"Set up your git identity for commits",icon:P,required:!0},{title:"Connect Agents",description:"Connect your AI coding assistants",icon:W,required:!1}],J=()=>{switch(r){case 0:return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(P,{className:"w-8 h-8 text-blue-600 dark:text-blue-400"})}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:"Git Configuration"}),e.jsx("p",{className:"text-muted-foreground",children:"Configure your git identity to ensure proper attribution for your commits"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"gitName",className:"flex items-center gap-2 text-sm font-medium text-foreground mb-2",children:[e.jsx(_,{className:"w-4 h-4"}),"Git Name ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("input",{type:"text",id:"gitName",value:x,onChange:t=>w(t.target.value),className:"w-full px-4 py-3 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:"John Doe",required:!0,disabled:i}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"This will be used as: git config --global user.name"})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"gitEmail",className:"flex items-center gap-2 text-sm font-medium text-foreground mb-2",children:[e.jsx(ee,{className:"w-4 h-4"}),"Git Email ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("input",{type:"email",id:"gitEmail",value:u,onChange:t=>C(t.target.value),className:"w-full px-4 py-3 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:"john@example.com",required:!0,disabled:i}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"This will be used as: git config --global user.email"})]})]})]});case 1:return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:"Connect Your AI Agents"}),e.jsx("p",{className:"text-muted-foreground",children:"Login to one or more AI coding assistants. All are optional."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:`border rounded-lg p-4 transition-colors ${l.authenticated?"bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800":"border-border bg-card"}`,children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center",children:e.jsx(V,{size:20})}),e.jsxs("div",{children:[e.jsxs("div",{className:"font-medium text-foreground flex items-center gap-2",children:["Claude Code",l.authenticated&&e.jsx(g,{className:"w-4 h-4 text-green-500"})]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:l.loading?"Checking...":l.authenticated?l.email||"Connected":"Not connected"})]})]}),!l.authenticated&&!l.loading&&e.jsx("button",{onClick:$,className:"bg-blue-600 hover:bg-blue-700 text-white text-sm font-medium py-2 px-4 rounded-lg transition-colors",children:"Login"})]})}),e.jsx("div",{className:`border rounded-lg p-4 transition-colors ${d.authenticated?"bg-purple-50 dark:bg-purple-900/20 border-purple-200 dark:border-purple-800":"border-border bg-card"}`,children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 bg-purple-100 dark:bg-purple-900/30 rounded-full flex items-center justify-center",children:e.jsx(H,{size:20})}),e.jsxs("div",{children:[e.jsxs("div",{className:"font-medium text-foreground flex items-center gap-2",children:["Cursor",d.authenticated&&e.jsx(g,{className:"w-4 h-4 text-green-500"})]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:d.loading?"Checking...":d.authenticated?d.email||"Connected":"Not connected"})]})]}),!d.authenticated&&!d.loading&&e.jsx("button",{onClick:q,className:"bg-purple-600 hover:bg-purple-700 text-white text-sm font-medium py-2 px-4 rounded-lg transition-colors",children:"Login"})]})}),e.jsx("div",{className:`border rounded-lg p-4 transition-colors ${c.authenticated?"bg-gray-100 dark:bg-gray-800/50 border-gray-300 dark:border-gray-600":"border-border bg-card"}`,children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center",children:e.jsx(K,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsxs("div",{className:"font-medium text-foreground flex items-center gap-2",children:["OpenAI Codex",c.authenticated&&e.jsx(g,{className:"w-4 h-4 text-green-500"})]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:c.loading?"Checking...":c.authenticated?c.email||"Connected":"Not connected"})]})]}),!c.authenticated&&!c.loading&&e.jsx("button",{onClick:O,className:"bg-gray-800 hover:bg-gray-900 dark:bg-gray-700 dark:hover:bg-gray-600 text-white text-sm font-medium py-2 px-4 rounded-lg transition-colors",children:"Login"})]})})]}),e.jsx("div",{className:"text-center text-sm text-muted-foreground pt-2",children:e.jsx("p",{children:"You can configure these later in Settings."})})]});default:return null}},U=()=>{switch(r){case 0:return x.trim()&&u.trim()&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(u);case 1:return!0;default:return!1}};return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"min-h-screen bg-background flex items-center justify-center p-4",children:e.jsxs("div",{className:"w-full max-w-2xl",children:[e.jsx("div",{className:"mb-8",children:e.jsx("div",{className:"flex items-center justify-between",children:v.map((t,s)=>e.jsxs(Y.Fragment,{children:[e.jsxs("div",{className:"flex flex-col items-center flex-1",children:[e.jsx("div",{className:`w-12 h-12 rounded-full flex items-center justify-center border-2 transition-colors duration-200 ${s<r?"bg-green-500 border-green-500 text-white":s===r?"bg-blue-600 border-blue-600 text-white":"bg-background border-border text-muted-foreground"}`,children:s<r?e.jsx(g,{className:"w-6 h-6"}):typeof t.icon=="function"?e.jsx(t.icon,{}):e.jsx(t.icon,{className:"w-6 h-6"})}),e.jsxs("div",{className:"mt-2 text-center",children:[e.jsx("p",{className:`text-sm font-medium ${s===r?"text-foreground":"text-muted-foreground"}`,children:t.title}),t.required&&e.jsx("span",{className:"text-xs text-red-500",children:"Required"})]})]}),s<v.length-1&&e.jsx("div",{className:`flex-1 h-0.5 mx-2 transition-colors duration-200 ${s<r?"bg-green-500":"bg-border"}`})]},s))})}),e.jsxs("div",{className:"bg-card rounded-lg shadow-lg border border-border p-8",children:[J(),k&&e.jsx("div",{className:"mt-6 p-4 bg-red-100 dark:bg-red-900/20 border border-red-300 dark:border-red-800 rounded-lg",children:e.jsx("p",{className:"text-sm text-red-700 dark:text-red-400",children:k})}),e.jsxs("div",{className:"flex items-center justify-between mt-8 pt-6 border-t border-border",children:[e.jsxs("button",{onClick:z,disabled:r===0||i,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-muted-foreground hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200",children:[e.jsx(X,{className:"w-4 h-4"}),"Previous"]}),e.jsx("div",{className:"flex items-center gap-3",children:r<v.length-1?e.jsx("button",{onClick:T,disabled:!U()||i,className:"flex items-center gap-2 px-6 py-3 bg-blue-600 hover:bg-blue-700 disabled:bg-blue-400 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors duration-200",children:i?e.jsxs(e.Fragment,{children:[e.jsx(G,{className:"w-4 h-4 animate-spin"}),"Saving..."]}):e.jsxs(e.Fragment,{children:["Next",e.jsx(Z,{className:"w-4 h-4"})]})}):e.jsx("button",{onClick:B,disabled:i,className:"flex items-center gap-2 px-6 py-3 bg-green-600 hover:bg-green-700 disabled:bg-green-400 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors duration-200",children:i?e.jsxs(e.Fragment,{children:[e.jsx(G,{className:"w-4 h-4 animate-spin"}),"Completing..."]}):e.jsxs(e.Fragment,{children:[e.jsx(g,{className:"w-4 h-4"}),"Complete Setup"]})})})]})]})]})}),n&&e.jsx(D,{isOpen:!!n,onClose:()=>f(null),provider:n,project:I,onComplete:R,isOnboarding:!0})]})};export{ce as default};
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./index-BBlwbHq_.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{b as r}from"./graph-Rxkx3sEa.js";var e=4;function a(o){return r(o,e)}export{a as c};
@@ -1 +0,0 @@
1
- import{f as o,p as i}from"./flowDb-956e92f1-BhdSHbdO.js";import{f as m,a as t}from"./styles-c10674c1-Bp-5OlRU.js";import{y as p}from"./index-BBlwbHq_.js";import"./graph-Rxkx3sEa.js";import"./layout-CkB7sSeq.js";import"./percentages-BXMCSKIN-BzXIakGM.js";import"./index-3862675e-BX3Fpn6V.js";import"./clone-xuHMqFoD.js";import"./edges-e0da2a9e-DDsXzXLJ.js";import"./createText-2e5e7dd3-DiPywQOa.js";import"./vendor-markdown-BXEi_H3G.js";import"./vendor-react-9mUTKBHH.js";import"./line-DC7MA9qY.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-BmO6nY0W.js";import"./vendor-syntax-DnmwQQJF.js";import"./AppContent-CRld2UWX.js";import"./index-ClfzLIqY.js";import"./vendor-icons-aNdOvTr_.js";import"./vendor-i18n-DCFGyhQR.js";import"./LoginModal-BwkvjfPR.js";import"./vendor-xterm-CZq1hqo1.js";import"./vendor-codemirror-D_s0aGBu.js";const $={parser:i,db:o,renderer:t,styles:m,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,p({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),t.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{$ as diagram};