upfynai-code 3.0.3 → 3.1.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 (243) hide show
  1. package/README.md +66 -91
  2. package/bin/cli.js +191 -0
  3. package/{client/dist → dist/client}/api-docs.html +838 -838
  4. package/{client/dist/assets/AppContent-Bvg0CPCO.js → dist/client/assets/AppContent-BofJquUs.js} +43 -43
  5. package/dist/client/assets/BrowserPanel-CSvD4jOX.js +2 -0
  6. package/dist/client/assets/CanvasFullScreen-onRfarpc.js +1 -0
  7. package/dist/client/assets/CanvasWorkspace-DvGKdL-k.js +259 -0
  8. package/dist/client/assets/DashboardPanel-DqAHbXDO.js +1 -0
  9. package/dist/client/assets/FileTree-BE0h-9M9.js +1 -0
  10. package/{client/dist/assets/GitPanel-RtyZUIWS.js → dist/client/assets/GitPanel-DdeJ0bp5.js} +2 -2
  11. package/{client/dist/assets/LoginModal-BWep8a6g.js → dist/client/assets/LoginModal-BP0pCTrH.js} +3 -3
  12. package/{client/dist/assets/MarkdownPreview-DHmk3qzu.js → dist/client/assets/MarkdownPreview-CESjI261.js} +1 -1
  13. package/dist/client/assets/MermaidBlock-D0rfEhrT.js +2 -0
  14. package/dist/client/assets/Onboarding-B2zQy-_6.js +1 -0
  15. package/dist/client/assets/SetupForm-Be7-WBe-.js +1 -0
  16. package/dist/client/assets/WorkflowsPanel-CusLbVJ6.js +1 -0
  17. package/{client/dist/assets/index-C5ptjuTl.js → dist/client/assets/index-BQy15irW.js} +25 -25
  18. package/dist/client/assets/index-CS0fDqEC.js +1 -0
  19. package/dist/client/assets/index-DYLSCCCp.css +1 -0
  20. package/dist/client/assets/vendor-canvas-QWTduIvM.js +23 -0
  21. package/{client/dist/assets/vendor-codemirror-CbtmxxaB.js → dist/client/assets/vendor-codemirror-D2ALgpaX.js} +1 -1
  22. package/{client/dist/assets/vendor-icons-BaD0x9SL.js → dist/client/assets/vendor-icons-kix3Gb31.js} +178 -138
  23. package/{client/dist/assets/vendor-mermaid-CH7SGc99.js → dist/client/assets/vendor-mermaid-CS3J4_Bz.js} +329 -326
  24. package/{client/dist/assets/vendor-syntax-DuHI9Ok6.js → dist/client/assets/vendor-syntax-LS_Nt30I.js} +1 -1
  25. package/{client/dist → dist/client}/clear-cache.html +85 -85
  26. package/dist/client/favicon.png +0 -0
  27. package/dist/client/favicon.svg +15 -0
  28. package/{client/dist → dist/client}/index.html +17 -17
  29. package/{client/dist → dist/client}/manifest.json +15 -15
  30. package/{client/dist → dist/client}/mcp-docs.html +108 -108
  31. package/{client/dist → dist/client}/offline.html +84 -84
  32. package/{client/dist → dist/client}/sw.js +82 -82
  33. package/package.json +55 -104
  34. package/scripts/postinstall.js +9 -0
  35. package/scripts/prepublish.js +77 -0
  36. package/src/animation.js +228 -0
  37. package/src/auth.js +142 -0
  38. package/src/config.js +40 -0
  39. package/src/connect.js +416 -0
  40. package/src/launch.js +81 -0
  41. package/src/mcp.js +57 -0
  42. package/src/permissions.js +140 -0
  43. package/src/persistent-shell.js +261 -0
  44. package/src/server.js +54 -0
  45. package/client/dist/assets/CanvasFullScreen-BdiJ35aq.js +0 -1
  46. package/client/dist/assets/CanvasWorkspace-Bk9R9_e0.js +0 -163
  47. package/client/dist/assets/DashboardPanel-CblJfTGi.js +0 -1
  48. package/client/dist/assets/FileTree-BDUnBheV.js +0 -1
  49. package/client/dist/assets/MermaidBlock-BuBc_G-F.js +0 -2
  50. package/client/dist/assets/Onboarding-Drnlt75a.js +0 -1
  51. package/client/dist/assets/SetupForm-CtCKitZG.js +0 -1
  52. package/client/dist/assets/WorkflowsPanel-B2mIXDvD.js +0 -1
  53. package/client/dist/assets/index-BFuqS0tY.css +0 -1
  54. package/client/dist/assets/vendor-canvas-D39yWul6.js +0 -49
  55. package/client/dist/favicon.png +0 -0
  56. package/client/dist/favicon.svg +0 -5
  57. package/commands/upfynai-connect.md +0 -59
  58. package/commands/upfynai-disconnect.md +0 -31
  59. package/commands/upfynai-doctor.md +0 -99
  60. package/commands/upfynai-export.md +0 -49
  61. package/commands/upfynai-local.md +0 -82
  62. package/commands/upfynai-status.md +0 -75
  63. package/commands/upfynai-stop.md +0 -49
  64. package/commands/upfynai-uninstall.md +0 -58
  65. package/commands/upfynai.md +0 -69
  66. package/scripts/build-client.js +0 -17
  67. package/scripts/fix-node-pty.js +0 -67
  68. package/scripts/install-commands.js +0 -78
  69. package/server/agent-loop.js +0 -242
  70. package/server/auto-compact.js +0 -99
  71. package/server/claude-sdk.js +0 -797
  72. package/server/cli-ui.js +0 -798
  73. package/server/cli.js +0 -751
  74. package/server/constants/config.js +0 -31
  75. package/server/cursor-cli.js +0 -270
  76. package/server/database/auth.db +0 -0
  77. package/server/database/db.js +0 -1451
  78. package/server/database/init.sql +0 -70
  79. package/server/index.js +0 -3814
  80. package/server/load-env.js +0 -26
  81. package/server/mcp-server.js +0 -621
  82. package/server/middleware/auth.js +0 -181
  83. package/server/middleware/relayHelpers.js +0 -44
  84. package/server/middleware/sandboxRouter.js +0 -174
  85. package/server/openai-codex.js +0 -403
  86. package/server/openrouter.js +0 -137
  87. package/server/projects.js +0 -1807
  88. package/server/provider-factory.js +0 -174
  89. package/server/relay-client.js +0 -390
  90. package/server/routes/agent.js +0 -1234
  91. package/server/routes/auth.js +0 -559
  92. package/server/routes/canvas.js +0 -53
  93. package/server/routes/cli-auth.js +0 -263
  94. package/server/routes/codex.js +0 -396
  95. package/server/routes/commands.js +0 -707
  96. package/server/routes/composio.js +0 -176
  97. package/server/routes/cursor.js +0 -770
  98. package/server/routes/dashboard.js +0 -295
  99. package/server/routes/git.js +0 -1208
  100. package/server/routes/keys.js +0 -34
  101. package/server/routes/mcp-utils.js +0 -48
  102. package/server/routes/mcp.js +0 -661
  103. package/server/routes/payments.js +0 -227
  104. package/server/routes/projects.js +0 -655
  105. package/server/routes/sessions.js +0 -146
  106. package/server/routes/settings.js +0 -261
  107. package/server/routes/taskmaster.js +0 -1928
  108. package/server/routes/user.js +0 -106
  109. package/server/routes/vapi-chat.js +0 -624
  110. package/server/routes/voice.js +0 -235
  111. package/server/routes/webhooks.js +0 -166
  112. package/server/routes/workflows.js +0 -312
  113. package/server/sandbox.js +0 -120
  114. package/server/services/composio.js +0 -204
  115. package/server/services/sessionRegistry.js +0 -139
  116. package/server/services/whisperService.js +0 -84
  117. package/server/services/workflowScheduler.js +0 -211
  118. package/server/tests/relay-flow.test.js +0 -570
  119. package/server/tests/sessions.test.js +0 -259
  120. package/server/utils/commandParser.js +0 -303
  121. package/server/utils/email.js +0 -66
  122. package/server/utils/gitConfig.js +0 -24
  123. package/server/utils/mcp-detector.js +0 -198
  124. package/server/utils/taskmaster-websocket.js +0 -129
  125. package/shared/integrationCatalog.d.ts +0 -12
  126. package/shared/integrationCatalog.js +0 -172
  127. package/shared/modelConstants.js +0 -96
  128. /package/{shared → dist}/agents/claude.js +0 -0
  129. /package/{shared → dist}/agents/codex.js +0 -0
  130. /package/{shared → dist}/agents/cursor.js +0 -0
  131. /package/{shared → dist}/agents/detect.js +0 -0
  132. /package/{shared → dist}/agents/exec.js +0 -0
  133. /package/{shared → dist}/agents/files.js +0 -0
  134. /package/{shared → dist}/agents/git.js +0 -0
  135. /package/{shared → dist}/agents/gitagent.js +0 -0
  136. /package/{shared → dist}/agents/index.js +0 -0
  137. /package/{shared → dist}/agents/shell.js +0 -0
  138. /package/{shared → dist}/agents/utils.js +0 -0
  139. /package/{client/dist → dist/client}/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  140. /package/{client/dist → dist/client}/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  141. /package/{client/dist → dist/client}/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  142. /package/{client/dist → dist/client}/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  143. /package/{client/dist → dist/client}/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  144. /package/{client/dist → dist/client}/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  145. /package/{client/dist → dist/client}/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  146. /package/{client/dist → dist/client}/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  147. /package/{client/dist → dist/client}/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  148. /package/{client/dist → dist/client}/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  149. /package/{client/dist → dist/client}/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  150. /package/{client/dist → dist/client}/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  151. /package/{client/dist → dist/client}/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  152. /package/{client/dist → dist/client}/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  153. /package/{client/dist → dist/client}/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  154. /package/{client/dist → dist/client}/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  155. /package/{client/dist → dist/client}/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  156. /package/{client/dist → dist/client}/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  157. /package/{client/dist → dist/client}/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  158. /package/{client/dist → dist/client}/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  159. /package/{client/dist → dist/client}/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  160. /package/{client/dist → dist/client}/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  161. /package/{client/dist → dist/client}/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  162. /package/{client/dist → dist/client}/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  163. /package/{client/dist → dist/client}/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  164. /package/{client/dist → dist/client}/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  165. /package/{client/dist → dist/client}/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  166. /package/{client/dist → dist/client}/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  167. /package/{client/dist → dist/client}/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  168. /package/{client/dist → dist/client}/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  169. /package/{client/dist → dist/client}/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  170. /package/{client/dist → dist/client}/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  171. /package/{client/dist → dist/client}/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  172. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  173. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  174. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  175. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  176. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  177. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  178. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  179. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  180. /package/{client/dist → dist/client}/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  181. /package/{client/dist → dist/client}/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  182. /package/{client/dist → dist/client}/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  183. /package/{client/dist → dist/client}/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  184. /package/{client/dist → dist/client}/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  185. /package/{client/dist → dist/client}/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  186. /package/{client/dist → dist/client}/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  187. /package/{client/dist → dist/client}/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  188. /package/{client/dist → dist/client}/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  189. /package/{client/dist → dist/client}/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  190. /package/{client/dist → dist/client}/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  191. /package/{client/dist → dist/client}/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  192. /package/{client/dist → dist/client}/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  193. /package/{client/dist → dist/client}/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  194. /package/{client/dist → dist/client}/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  195. /package/{client/dist → dist/client}/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  196. /package/{client/dist → dist/client}/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  197. /package/{client/dist → dist/client}/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  198. /package/{client/dist → dist/client}/assets/PreviewPanel-CqCa92Tf.js +0 -0
  199. /package/{client/dist → dist/client}/assets/pdf-CE_K4jFx.js +0 -0
  200. /package/{client/dist → dist/client}/assets/vendor-canvas-BZV40eAE.css +0 -0
  201. /package/{client/dist → dist/client}/assets/vendor-diff-DNQpbhrT.js +0 -0
  202. /package/{client/dist → dist/client}/assets/vendor-i18n-DCFGyhQR.js +0 -0
  203. /package/{client/dist → dist/client}/assets/vendor-markdown-CimbIo6Y.js +0 -0
  204. /package/{client/dist → dist/client}/assets/vendor-react-96lCPsRK.js +0 -0
  205. /package/{client/dist → dist/client}/assets/vendor-xterm-CZq1hqo1.js +0 -0
  206. /package/{client/dist → dist/client}/assets/vendor-xterm-qxJ8_QYu.css +0 -0
  207. /package/{client/dist → dist/client}/convert-icons.md +0 -0
  208. /package/{client/dist → dist/client}/generate-icons.js +0 -0
  209. /package/{client/dist → dist/client}/icons/claude-ai-icon.svg +0 -0
  210. /package/{client/dist → dist/client}/icons/codex-white.svg +0 -0
  211. /package/{client/dist → dist/client}/icons/codex.svg +0 -0
  212. /package/{client/dist → dist/client}/icons/cursor-white.svg +0 -0
  213. /package/{client/dist → dist/client}/icons/cursor.svg +0 -0
  214. /package/{client/dist → dist/client}/icons/icon-128x128.png +0 -0
  215. /package/{client/dist → dist/client}/icons/icon-128x128.svg +0 -0
  216. /package/{client/dist → dist/client}/icons/icon-144x144.png +0 -0
  217. /package/{client/dist → dist/client}/icons/icon-144x144.svg +0 -0
  218. /package/{client/dist → dist/client}/icons/icon-152x152.png +0 -0
  219. /package/{client/dist → dist/client}/icons/icon-152x152.svg +0 -0
  220. /package/{client/dist → dist/client}/icons/icon-192x192.png +0 -0
  221. /package/{client/dist → dist/client}/icons/icon-192x192.svg +0 -0
  222. /package/{client/dist → dist/client}/icons/icon-384x384.png +0 -0
  223. /package/{client/dist → dist/client}/icons/icon-384x384.svg +0 -0
  224. /package/{client/dist → dist/client}/icons/icon-512x512.png +0 -0
  225. /package/{client/dist → dist/client}/icons/icon-512x512.svg +0 -0
  226. /package/{client/dist → dist/client}/icons/icon-72x72.png +0 -0
  227. /package/{client/dist → dist/client}/icons/icon-72x72.svg +0 -0
  228. /package/{client/dist → dist/client}/icons/icon-96x96.png +0 -0
  229. /package/{client/dist → dist/client}/icons/icon-96x96.svg +0 -0
  230. /package/{client/dist → dist/client}/icons/icon-template.svg +0 -0
  231. /package/{client/dist → dist/client}/logo-128.png +0 -0
  232. /package/{client/dist → dist/client}/logo-256.png +0 -0
  233. /package/{client/dist → dist/client}/logo-32.png +0 -0
  234. /package/{client/dist → dist/client}/logo-512.png +0 -0
  235. /package/{client/dist → dist/client}/logo-64.png +0 -0
  236. /package/{client/dist → dist/client}/logo.svg +0 -0
  237. /package/{client/dist → dist/client}/screenshots/cli-selection.png +0 -0
  238. /package/{client/dist → dist/client}/screenshots/desktop-main.png +0 -0
  239. /package/{client/dist → dist/client}/screenshots/mobile-chat.png +0 -0
  240. /package/{client/dist → dist/client}/screenshots/tools-modal.png +0 -0
  241. /package/{shared → dist}/gitagent/index.js +0 -0
  242. /package/{shared → dist}/gitagent/parser.js +0 -0
  243. /package/{shared → dist}/gitagent/prompt-builder.js +0 -0
@@ -1,84 +1,84 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
- <title>Upfyn-Code — Offline</title>
7
- <meta name="theme-color" content="#0a0f1e" />
8
- <style>
9
- * { margin: 0; padding: 0; box-sizing: border-box; }
10
- body {
11
- background: #0a0f1e;
12
- color: #e2e8f0;
13
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
- min-height: 100vh;
15
- display: flex;
16
- align-items: center;
17
- justify-content: center;
18
- padding: 2rem;
19
- }
20
- .container {
21
- text-align: center;
22
- max-width: 400px;
23
- }
24
- .icon {
25
- width: 64px;
26
- height: 64px;
27
- margin: 0 auto 1.5rem;
28
- background: #0d1117;
29
- border-radius: 16px;
30
- display: flex;
31
- align-items: center;
32
- justify-content: center;
33
- border: 1px solid rgba(59, 130, 246, 0.2);
34
- box-shadow: 0 4px 24px rgba(59, 130, 246, 0.15);
35
- }
36
- .icon svg {
37
- width: 32px;
38
- height: 32px;
39
- color: #3b82f6;
40
- }
41
- h1 {
42
- font-size: 1.5rem;
43
- font-weight: 700;
44
- margin-bottom: 0.75rem;
45
- }
46
- p {
47
- color: #94a3b8;
48
- font-size: 0.9rem;
49
- line-height: 1.5;
50
- margin-bottom: 1.5rem;
51
- }
52
- .retry-btn {
53
- display: inline-block;
54
- padding: 12px 32px;
55
- background: #3b82f6;
56
- color: #fff;
57
- border: none;
58
- border-radius: 10px;
59
- font-size: 0.95rem;
60
- font-weight: 600;
61
- cursor: pointer;
62
- transition: background 0.2s;
63
- }
64
- .retry-btn:hover {
65
- background: #2563eb;
66
- }
67
- .retry-btn:active {
68
- transform: scale(0.97);
69
- }
70
- </style>
71
- </head>
72
- <body>
73
- <div class="container">
74
- <div class="icon">
75
- <svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
76
- <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636a9 9 0 010 12.728M5.636 18.364a9 9 0 010-12.728m2.828 9.9a5 5 0 010-7.072m7.072 0a5 5 0 010 7.072M13 12a1 1 0 11-2 0 1 1 0 012 0z" />
77
- </svg>
78
- </div>
79
- <h1>You're offline</h1>
80
- <p>Check your internet connection and try again. Upfyn-Code needs a network connection to work.</p>
81
- <button class="retry-btn" onclick="location.reload()">Retry</button>
82
- </div>
83
- </body>
84
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
+ <title>UpfynAI — Offline</title>
7
+ <meta name="theme-color" content="#0a0f1e" />
8
+ <style>
9
+ * { margin: 0; padding: 0; box-sizing: border-box; }
10
+ body {
11
+ background: #0a0f1e;
12
+ color: #e2e8f0;
13
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
+ min-height: 100vh;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ padding: 2rem;
19
+ }
20
+ .container {
21
+ text-align: center;
22
+ max-width: 400px;
23
+ }
24
+ .icon {
25
+ width: 64px;
26
+ height: 64px;
27
+ margin: 0 auto 1.5rem;
28
+ background: #0d1117;
29
+ border-radius: 16px;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ border: 1px solid rgba(59, 130, 246, 0.2);
34
+ box-shadow: 0 4px 24px rgba(59, 130, 246, 0.15);
35
+ }
36
+ .icon svg {
37
+ width: 32px;
38
+ height: 32px;
39
+ color: #3b82f6;
40
+ }
41
+ h1 {
42
+ font-size: 1.5rem;
43
+ font-weight: 700;
44
+ margin-bottom: 0.75rem;
45
+ }
46
+ p {
47
+ color: #94a3b8;
48
+ font-size: 0.9rem;
49
+ line-height: 1.5;
50
+ margin-bottom: 1.5rem;
51
+ }
52
+ .retry-btn {
53
+ display: inline-block;
54
+ padding: 12px 32px;
55
+ background: #3b82f6;
56
+ color: #fff;
57
+ border: none;
58
+ border-radius: 10px;
59
+ font-size: 0.95rem;
60
+ font-weight: 600;
61
+ cursor: pointer;
62
+ transition: background 0.2s;
63
+ }
64
+ .retry-btn:hover {
65
+ background: #2563eb;
66
+ }
67
+ .retry-btn:active {
68
+ transform: scale(0.97);
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div class="container">
74
+ <div class="icon">
75
+ <svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
76
+ <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636a9 9 0 010 12.728M5.636 18.364a9 9 0 010-12.728m2.828 9.9a5 5 0 010-7.072m7.072 0a5 5 0 010 7.072M13 12a1 1 0 11-2 0 1 1 0 012 0z" />
77
+ </svg>
78
+ </div>
79
+ <h1>You're offline</h1>
80
+ <p>Check your internet connection and try again. UpfynAI needs a network connection to work.</p>
81
+ <button class="retry-btn" onclick="location.reload()">Retry</button>
82
+ </div>
83
+ </body>
84
+ </html>
@@ -1,82 +1,82 @@
1
- // Service Worker for Upfyn-Code
2
- // v4 — proper caching: cache-first for static assets, network-first for navigation
3
-
4
- const CACHE_NAME = 'upfyn-v4';
5
- const PRECACHE_ASSETS = [
6
- '/offline.html',
7
- '/favicon.svg',
8
- '/favicon.png',
9
- '/manifest.json',
10
- ];
11
-
12
- self.addEventListener('install', (event) => {
13
- event.waitUntil(
14
- caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE_ASSETS))
15
- );
16
- self.skipWaiting();
17
- });
18
-
19
- self.addEventListener('activate', (event) => {
20
- event.waitUntil(
21
- caches.keys().then((names) =>
22
- Promise.all(
23
- names
24
- .filter((n) => n !== CACHE_NAME)
25
- .map((n) => caches.delete(n))
26
- )
27
- )
28
- );
29
- self.clients.claim();
30
- });
31
-
32
- self.addEventListener('fetch', (event) => {
33
- const { request } = event;
34
- const url = new URL(request.url);
35
-
36
- // API calls and WebSocket: pass through, no caching
37
- if (
38
- url.pathname.startsWith('/api/') ||
39
- url.pathname.startsWith('/ws') ||
40
- url.pathname.startsWith('/shell') ||
41
- url.pathname.startsWith('/mcp')
42
- ) {
43
- return;
44
- }
45
-
46
- // Static assets (JS, CSS, images, fonts): cache-first
47
- if (
48
- request.destination === 'script' ||
49
- request.destination === 'style' ||
50
- request.destination === 'image' ||
51
- request.destination === 'font' ||
52
- url.pathname.startsWith('/icons/') ||
53
- url.pathname.startsWith('/assets/')
54
- ) {
55
- event.respondWith(
56
- caches.match(request).then((cached) => {
57
- if (cached) return cached;
58
- return fetch(request).then((response) => {
59
- if (response.ok) {
60
- const clone = response.clone();
61
- caches.open(CACHE_NAME).then((cache) => cache.put(request, clone));
62
- }
63
- return response;
64
- }).catch(() => caches.match(request));
65
- })
66
- );
67
- return;
68
- }
69
-
70
- // Navigation requests (HTML): network-first, offline fallback
71
- if (request.mode === 'navigate') {
72
- event.respondWith(
73
- fetch(request).catch(() => caches.match('/offline.html'))
74
- );
75
- return;
76
- }
77
-
78
- // Everything else: network with cache fallback
79
- event.respondWith(
80
- fetch(request).catch(() => caches.match(request))
81
- );
82
- });
1
+ // Service Worker for UpfynAI
2
+ // v4 — proper caching: cache-first for static assets, network-first for navigation
3
+
4
+ const CACHE_NAME = 'upfyn-v4';
5
+ const PRECACHE_ASSETS = [
6
+ '/offline.html',
7
+ '/favicon.svg',
8
+ '/favicon.png',
9
+ '/manifest.json',
10
+ ];
11
+
12
+ self.addEventListener('install', (event) => {
13
+ event.waitUntil(
14
+ caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE_ASSETS))
15
+ );
16
+ self.skipWaiting();
17
+ });
18
+
19
+ self.addEventListener('activate', (event) => {
20
+ event.waitUntil(
21
+ caches.keys().then((names) =>
22
+ Promise.all(
23
+ names
24
+ .filter((n) => n !== CACHE_NAME)
25
+ .map((n) => caches.delete(n))
26
+ )
27
+ )
28
+ );
29
+ self.clients.claim();
30
+ });
31
+
32
+ self.addEventListener('fetch', (event) => {
33
+ const { request } = event;
34
+ const url = new URL(request.url);
35
+
36
+ // API calls and WebSocket: pass through, no caching
37
+ if (
38
+ url.pathname.startsWith('/api/') ||
39
+ url.pathname.startsWith('/ws') ||
40
+ url.pathname.startsWith('/shell') ||
41
+ url.pathname.startsWith('/mcp')
42
+ ) {
43
+ return;
44
+ }
45
+
46
+ // Static assets (JS, CSS, images, fonts): cache-first
47
+ if (
48
+ request.destination === 'script' ||
49
+ request.destination === 'style' ||
50
+ request.destination === 'image' ||
51
+ request.destination === 'font' ||
52
+ url.pathname.startsWith('/icons/') ||
53
+ url.pathname.startsWith('/assets/')
54
+ ) {
55
+ event.respondWith(
56
+ caches.match(request).then((cached) => {
57
+ if (cached) return cached;
58
+ return fetch(request).then((response) => {
59
+ if (response.ok) {
60
+ const clone = response.clone();
61
+ caches.open(CACHE_NAME).then((cache) => cache.put(request, clone));
62
+ }
63
+ return response;
64
+ }).catch(() => caches.match(request));
65
+ })
66
+ );
67
+ return;
68
+ }
69
+
70
+ // Navigation requests (HTML): network-first, offline fallback
71
+ if (request.mode === 'navigate') {
72
+ event.respondWith(
73
+ fetch(request).catch(() => caches.match('/offline.html'))
74
+ );
75
+ return;
76
+ }
77
+
78
+ // Everything else: network with cache fallback
79
+ event.respondWith(
80
+ fetch(request).catch(() => caches.match(request))
81
+ );
82
+ });
package/package.json CHANGED
@@ -1,136 +1,87 @@
1
1
  {
2
2
  "name": "upfynai-code",
3
- "version": "3.0.3",
4
- "description": "Visual AI coding interface for Claude Code, Cursor & Codex. Canvas whiteboard, multi-agent chat, terminal, git, voice assistant. Self-host locally or connect to cli.upfyn.com for remote access.",
3
+ "version": "3.1.0",
4
+ "description": "Unified AI coding interface access AI chat, terminal, file explorer, git, and visual canvas from any browser. Connect your local machine and code from anywhere.",
5
5
  "type": "module",
6
- "main": "server/index.js",
7
6
  "bin": {
8
- "upfynai-code": "server/cli.js",
9
- "uc": "server/cli.js"
7
+ "uc": "./bin/cli.js",
8
+ "upfynai-code": "./bin/cli.js"
10
9
  },
11
10
  "files": [
12
- "server/",
13
- "shared/",
14
- "client/dist/",
11
+ "bin/",
12
+ "src/",
13
+ "dist/",
15
14
  "scripts/",
16
- "commands/",
17
- "README.md"
15
+ "README.md",
16
+ "LICENSE"
18
17
  ],
19
18
  "scripts": {
20
- "start": "node server/index.js",
21
- "build": "node scripts/build-client.js",
22
- "test": "node --test --test-force-exit server/tests/sessions.test.js server/tests/relay-flow.test.js",
23
- "typecheck": "npx tsc --noEmit -p client/tsconfig.json",
24
- "postinstall": "node scripts/fix-node-pty.js || true && node scripts/install-commands.js"
19
+ "start": "node bin/cli.js",
20
+ "postinstall": "node scripts/postinstall.js",
21
+ "prepublishOnly": "node scripts/prepublish.js"
25
22
  },
26
23
  "keywords": [
24
+ "upfyn",
25
+ "upfynai-code",
27
26
  "ai",
27
+ "coding",
28
+ "cli",
29
+ "terminal",
30
+ "remote-development",
31
+ "code-editor",
32
+ "ai-assistant",
28
33
  "ai-coding",
29
- "claude-code",
30
- "cursor",
31
- "codex",
32
- "coding-assistant",
34
+ "developer-tools",
35
+ "devtools",
36
+ "browser-ide",
37
+ "remote-access",
38
+ "websocket",
39
+ "git",
40
+ "file-explorer",
33
41
  "canvas",
34
42
  "whiteboard",
35
- "visual-coding",
36
- "terminal",
37
- "git",
38
43
  "mcp",
39
- "relay",
40
- "byok",
41
- "voice-assistant",
42
- "upfynai",
43
- "thinqmesh"
44
+ "model-context-protocol",
45
+ "desktop",
46
+ "tauri",
47
+ "swarm",
48
+ "ai-canvas",
49
+ "visual-programming"
44
50
  ],
45
- "author": "Thinqmesh Technologies <hello@thinqmesh.com>",
51
+ "author": {
52
+ "name": "Thinqmesh Technologies",
53
+ "url": "https://cli.upfyn.com"
54
+ },
46
55
  "license": "GPL-3.0",
47
- "homepage": "https://thinqmesh.com",
56
+ "homepage": "https://cli.upfyn.com",
48
57
  "repository": {
49
58
  "type": "git",
50
- "url": "git+https://github.com/AnitChaudhry/UpfynAI-Code.git"
59
+ "url": "git+https://github.com/AnitChaudhry/UpfynAI-Code.git",
60
+ "directory": "packages/cli"
51
61
  },
52
62
  "bugs": {
53
63
  "url": "https://github.com/AnitChaudhry/UpfynAI-Code/issues"
54
64
  },
55
65
  "dependencies": {
56
66
  "@anthropic-ai/claude-agent-sdk": "^0.1.71",
57
- "@anthropic-ai/sdk": "^0.78.0",
58
- "@iarna/toml": "^2.2.5",
59
- "@modelcontextprotocol/sdk": "^1.26.0",
60
- "@openai/codex-sdk": "^0.101.0",
61
- "bcryptjs": "^3.0.3",
62
- "chokidar": "^4.0.3",
63
- "cookie-parser": "^1.4.7",
64
- "cors": "^2.8.5",
65
- "cross-spawn": "^7.0.3",
66
- "edge-tts-universal": "^1.3.3",
67
- "express": "^4.18.2",
68
- "form-data": "^4.0.5",
69
- "gray-matter": "^4.0.3",
67
+ "chalk": "^5.3.0",
68
+ "commander": "^12.1.0",
69
+ "express": "^4.21.0",
70
+ "http-proxy-middleware": "^3.0.0",
70
71
  "js-yaml": "^4.1.0",
71
- "jsonwebtoken": "^9.0.2",
72
- "mime-types": "^3.0.1",
73
- "multer": "^2.0.2",
74
- "ws": "^8.14.2",
75
- "zod": "^3.25.76"
72
+ "open": "^10.1.0",
73
+ "prompts": "^2.4.2",
74
+ "ws": "^8.18.0"
76
75
  },
77
76
  "optionalDependencies": {
78
- "libsql": "^0.5.22",
79
77
  "node-pty": "^1.1.0-beta34"
80
78
  },
81
- "devDependencies": {
82
- "@codemirror/lang-css": "^6.3.1",
83
- "@codemirror/lang-html": "^6.4.9",
84
- "@codemirror/lang-javascript": "^6.2.4",
85
- "@codemirror/lang-json": "^6.0.1",
86
- "@codemirror/lang-markdown": "^6.3.3",
87
- "@codemirror/lang-python": "^6.2.1",
88
- "@codemirror/merge": "^6.11.1",
89
- "@codemirror/theme-one-dark": "^6.1.2",
90
- "@replit/codemirror-minimap": "^0.5.2",
91
- "@tailwindcss/typography": "^0.5.16",
92
- "@types/node": "^22.19.7",
93
- "@types/react": "^18.2.43",
94
- "@types/react-dom": "^18.2.17",
95
- "@uiw/react-codemirror": "^4.23.13",
96
- "@vapi-ai/web": "^2.5.2",
97
- "@vitejs/plugin-react": "^4.5.2",
98
- "@xterm/addon-clipboard": "^0.1.0",
99
- "@xterm/addon-fit": "^0.10.0",
100
- "@xterm/addon-web-links": "^0.11.0",
101
- "@xterm/addon-webgl": "^0.18.0",
102
- "@xterm/xterm": "^5.5.0",
103
- "@xyflow/react": "^12.10.1",
104
- "autoprefixer": "^10.4.16",
105
- "class-variance-authority": "^0.7.1",
106
- "clsx": "^2.1.1",
107
- "dagre": "^0.8.5",
108
- "elkjs": "^0.11.0",
109
- "fuse.js": "^7.0.0",
110
- "i18next": "^25.7.4",
111
- "i18next-browser-languagedetector": "^8.2.0",
112
- "katex": "^0.16.25",
113
- "lightningcss": "^1.31.1",
114
- "lucide-react": "^0.515.0",
115
- "mermaid": "^11.12.3",
116
- "pdfjs-dist": "^5.4.624",
117
- "postcss": "^8.4.32",
118
- "react": "^18.2.0",
119
- "react-diff-viewer-continued": "^4.1.2",
120
- "react-dom": "^18.2.0",
121
- "react-dropzone": "^14.2.3",
122
- "react-i18next": "^16.5.3",
123
- "react-markdown": "^10.1.0",
124
- "react-router-dom": "^6.8.1",
125
- "react-syntax-highlighter": "^15.6.1",
126
- "rehype-katex": "^7.0.1",
127
- "rehype-raw": "^7.0.0",
128
- "remark-gfm": "^4.0.0",
129
- "remark-math": "^6.0.0",
130
- "tailwind-merge": "^3.3.1",
131
- "tailwindcss": "^3.4.0",
132
- "typescript": "^5.9.3",
133
- "vite": "~6.3.5",
134
- "zustand": "^5.0.11"
135
- }
79
+ "engines": {
80
+ "node": ">=18.0.0"
81
+ },
82
+ "os": [
83
+ "darwin",
84
+ "linux",
85
+ "win32"
86
+ ]
136
87
  }
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { playInstallAnimation } from '../src/animation.js';
3
+
4
+ try {
5
+ await playInstallAnimation();
6
+ } catch {
7
+ // Silently fail — animation is cosmetic, don't break installs
8
+ console.log('\n ✓ upfynai-code installed. Run `uc --help` to get started.\n');
9
+ }
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Prepublish script — copies shared agents into dist/ for npm distribution.
4
+ *
5
+ * In the monorepo, connect.js imports from ../../shared/agents/.
6
+ * For npm, we copy those files into dist/agents/ and connect.js
7
+ * resolves them at runtime.
8
+ */
9
+ import { cpSync, mkdirSync, rmSync, existsSync } from 'fs';
10
+ import { join, dirname } from 'path';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ const cliRoot = join(__dirname, '..');
15
+ const distAgents = join(cliRoot, 'dist', 'agents');
16
+ const sharedAgents = join(cliRoot, '..', 'shared', 'agents');
17
+
18
+ // Clean
19
+ if (existsSync(distAgents)) rmSync(distAgents, { recursive: true });
20
+ mkdirSync(distAgents, { recursive: true });
21
+
22
+ // Copy all agent files
23
+ const files = [
24
+ 'index.js', 'utils.js',
25
+ 'claude.js', 'codex.js', 'cursor.js',
26
+ 'shell.js', 'files.js', 'git.js', 'exec.js', 'detect.js',
27
+ 'gitagent.js',
28
+ ];
29
+
30
+ let copied = 0;
31
+ for (const file of files) {
32
+ const src = join(sharedAgents, file);
33
+ const dest = join(distAgents, file);
34
+ if (existsSync(src)) {
35
+ cpSync(src, dest);
36
+ copied++;
37
+ } else {
38
+ console.warn(` [WARN] Missing: ${file}`);
39
+ }
40
+ }
41
+
42
+ // Copy gitagent module (parser + prompt-builder) — needed by gitagent agent
43
+ const sharedGitagent = join(cliRoot, '..', 'shared', 'gitagent');
44
+ const distGitagent = join(cliRoot, 'dist', 'gitagent');
45
+ if (existsSync(distGitagent)) rmSync(distGitagent, { recursive: true });
46
+ mkdirSync(distGitagent, { recursive: true });
47
+
48
+ const gitagentFiles = ['index.js', 'parser.js', 'prompt-builder.js'];
49
+ for (const file of gitagentFiles) {
50
+ const src = join(sharedGitagent, file);
51
+ const dest = join(distGitagent, file);
52
+ if (existsSync(src)) {
53
+ cpSync(src, dest);
54
+ copied++;
55
+ }
56
+ }
57
+
58
+ console.log(` [prepublish] Copied ${copied} agent files to dist/`);
59
+
60
+ // ─── Copy built client dist for local-server static serving ──────────────
61
+ const clientSrc = join(cliRoot, '..', '..', 'backend', 'client', 'dist');
62
+ const clientDest = join(cliRoot, 'dist', 'client');
63
+
64
+ if (existsSync(clientSrc)) {
65
+ if (existsSync(clientDest)) rmSync(clientDest, { recursive: true });
66
+ cpSync(clientSrc, clientDest, { recursive: true });
67
+ console.log(` [prepublish] Copied client dist to dist/client/`);
68
+ } else {
69
+ console.warn(` [WARN] Client dist not found at ${clientSrc} — run 'npm run build' in backend/client first`);
70
+ }
71
+
72
+ // ─── Note: local-server bundling ─────────────────────────────────────────
73
+ // For npm global installs, local-server needs to be bundled with esbuild
74
+ // into dist/local-server.js (with node-pty as external).
75
+ // Run: npx esbuild packages/local-server/index.js --bundle --platform=node --outfile=packages/cli/dist/local-server.js --external:node-pty
76
+ // This is handled by the CI/CD pipeline before npm publish.
77
+ console.log(` [prepublish] Done.`);