@vibe80/vibe80 0.1.1

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 (123) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +52 -0
  3. package/bin/vibe80.js +176 -0
  4. package/client/dist/assets/DiffPanel-C_IGzKI5.js +1 -0
  5. package/client/dist/assets/ExplorerPanel-BtlyAT00.js +11 -0
  6. package/client/dist/assets/LogsPanel-BW79JWzR.js +1 -0
  7. package/client/dist/assets/SettingsPanel-b9B7ygP_.js +1 -0
  8. package/client/dist/assets/TerminalPanel-C3fc1HbK.js +1 -0
  9. package/client/dist/assets/browser-e3WgtMs-.js +8 -0
  10. package/client/dist/assets/index-CgqGyssr.css +32 -0
  11. package/client/dist/assets/index-DnwKjoj7.js +706 -0
  12. package/client/dist/assets/vibe80_dark-D7OVPKcU.svg +51 -0
  13. package/client/dist/assets/vibe80_light-BJK37ybI.svg +50 -0
  14. package/client/dist/favicon.ico +0 -0
  15. package/client/dist/favicon.png +0 -0
  16. package/client/dist/favicon.svg +35 -0
  17. package/client/dist/index.html +14 -0
  18. package/client/index.html +16 -0
  19. package/client/package.json +34 -0
  20. package/client/public/favicon.ico +0 -0
  21. package/client/public/favicon.png +0 -0
  22. package/client/public/favicon.svg +35 -0
  23. package/client/public/pwa-192x192.png +0 -0
  24. package/client/public/pwa-512x512.png +0 -0
  25. package/client/src/App.jsx +3131 -0
  26. package/client/src/assets/logo_small.png +0 -0
  27. package/client/src/assets/vibe80_dark.svg +51 -0
  28. package/client/src/assets/vibe80_light.svg +50 -0
  29. package/client/src/components/Chat/ChatComposer.jsx +228 -0
  30. package/client/src/components/Chat/ChatMessages.jsx +811 -0
  31. package/client/src/components/Chat/ChatToolbar.jsx +109 -0
  32. package/client/src/components/Chat/useChatComposer.js +462 -0
  33. package/client/src/components/Diff/DiffPanel.jsx +129 -0
  34. package/client/src/components/Explorer/ExplorerPanel.jsx +449 -0
  35. package/client/src/components/Logs/LogsPanel.jsx +80 -0
  36. package/client/src/components/SessionGate/SessionGate.jsx +874 -0
  37. package/client/src/components/Settings/SettingsPanel.jsx +212 -0
  38. package/client/src/components/Terminal/TerminalPanel.jsx +39 -0
  39. package/client/src/components/Topbar/Topbar.jsx +101 -0
  40. package/client/src/components/WorktreeTabs.css +419 -0
  41. package/client/src/components/WorktreeTabs.jsx +604 -0
  42. package/client/src/hooks/useAttachments.jsx +125 -0
  43. package/client/src/hooks/useBacklog.js +254 -0
  44. package/client/src/hooks/useChatClear.js +90 -0
  45. package/client/src/hooks/useChatCollapse.js +42 -0
  46. package/client/src/hooks/useChatCommands.js +294 -0
  47. package/client/src/hooks/useChatExport.js +144 -0
  48. package/client/src/hooks/useChatMessagesState.js +69 -0
  49. package/client/src/hooks/useChatSend.js +158 -0
  50. package/client/src/hooks/useChatSocket.js +1239 -0
  51. package/client/src/hooks/useDiffNavigation.js +19 -0
  52. package/client/src/hooks/useExplorerActions.js +1184 -0
  53. package/client/src/hooks/useGitIdentity.js +114 -0
  54. package/client/src/hooks/useLayoutMode.js +31 -0
  55. package/client/src/hooks/useLocalPreferences.js +131 -0
  56. package/client/src/hooks/useMessageSync.js +30 -0
  57. package/client/src/hooks/useNotifications.js +132 -0
  58. package/client/src/hooks/usePaneNavigation.js +67 -0
  59. package/client/src/hooks/usePanelState.js +13 -0
  60. package/client/src/hooks/useProviderSelection.js +70 -0
  61. package/client/src/hooks/useRepoBranchesModels.js +218 -0
  62. package/client/src/hooks/useRepoStatus.js +350 -0
  63. package/client/src/hooks/useRpcLogActions.js +19 -0
  64. package/client/src/hooks/useRpcLogView.js +58 -0
  65. package/client/src/hooks/useSessionHandoff.js +97 -0
  66. package/client/src/hooks/useSessionLifecycle.js +287 -0
  67. package/client/src/hooks/useSessionReset.js +63 -0
  68. package/client/src/hooks/useSessionResync.js +77 -0
  69. package/client/src/hooks/useTerminalSession.js +328 -0
  70. package/client/src/hooks/useToolbarExport.js +27 -0
  71. package/client/src/hooks/useTurnInterrupt.js +43 -0
  72. package/client/src/hooks/useVibe80Forms.js +128 -0
  73. package/client/src/hooks/useWorkspaceAuth.js +932 -0
  74. package/client/src/hooks/useWorktreeCloseConfirm.js +46 -0
  75. package/client/src/hooks/useWorktrees.js +396 -0
  76. package/client/src/i18n.jsx +87 -0
  77. package/client/src/index.css +5147 -0
  78. package/client/src/locales/en.json +37 -0
  79. package/client/src/locales/fr.json +321 -0
  80. package/client/src/main.jsx +16 -0
  81. package/client/vite.config.js +62 -0
  82. package/docs/api/asyncapi.json +1511 -0
  83. package/docs/api/openapi.json +3242 -0
  84. package/git_hooks/prepare-commit-msg +35 -0
  85. package/package.json +36 -0
  86. package/server/package.json +29 -0
  87. package/server/scripts/rotate-workspace-secret.js +101 -0
  88. package/server/src/claudeClient.js +454 -0
  89. package/server/src/clientEvents.js +594 -0
  90. package/server/src/clientFactory.js +164 -0
  91. package/server/src/codexClient.js +468 -0
  92. package/server/src/config.js +27 -0
  93. package/server/src/helpers.js +138 -0
  94. package/server/src/index.js +1641 -0
  95. package/server/src/middleware/auth.js +93 -0
  96. package/server/src/middleware/debug.js +89 -0
  97. package/server/src/middleware/errorTypes.js +60 -0
  98. package/server/src/providerLogger.js +60 -0
  99. package/server/src/routes/files.js +114 -0
  100. package/server/src/routes/git.js +183 -0
  101. package/server/src/routes/health.js +13 -0
  102. package/server/src/routes/sessions.js +407 -0
  103. package/server/src/routes/workspaces.js +296 -0
  104. package/server/src/routes/worktrees.js +993 -0
  105. package/server/src/runAs.js +458 -0
  106. package/server/src/runtimeStore.js +32 -0
  107. package/server/src/services/auth.js +157 -0
  108. package/server/src/services/claudeThreadDirectory.js +33 -0
  109. package/server/src/services/session.js +918 -0
  110. package/server/src/services/workspace.js +858 -0
  111. package/server/src/storage/index.js +17 -0
  112. package/server/src/storage/redis.js +412 -0
  113. package/server/src/storage/sqlite.js +649 -0
  114. package/server/src/worktreeManager.js +717 -0
  115. package/server/tests/README.md +13 -0
  116. package/server/tests/factories/workspaceFactory.js +13 -0
  117. package/server/tests/fixtures/workspaceCredentials.json +4 -0
  118. package/server/tests/integration/routes/workspaces-routes.test.js +626 -0
  119. package/server/tests/setup/env.js +9 -0
  120. package/server/tests/unit/helpers.test.js +95 -0
  121. package/server/tests/unit/services/auth.test.js +181 -0
  122. package/server/tests/unit/services/workspace.test.js +115 -0
  123. package/server/vitest.config.js +23 -0
@@ -0,0 +1,138 @@
1
+ import crypto from "crypto";
2
+ import path from "path";
3
+ import dockerNames from "docker-names";
4
+
5
+ export const generateId = (prefix) =>
6
+ `${prefix}${crypto.randomBytes(12).toString("hex")}`;
7
+
8
+ export const generateSessionName = () => dockerNames.getRandomName();
9
+
10
+ export const hashRefreshToken = (token) =>
11
+ crypto.createHash("sha256").update(token).digest("hex");
12
+
13
+ export const generateRefreshToken = () =>
14
+ crypto.randomBytes(32).toString("hex");
15
+
16
+ export const createMessageId = () =>
17
+ typeof crypto.randomUUID === "function"
18
+ ? crypto.randomUUID()
19
+ : crypto.randomBytes(16).toString("hex");
20
+
21
+ export const createDebugId = () =>
22
+ typeof crypto.randomUUID === "function"
23
+ ? crypto.randomUUID()
24
+ : crypto.randomBytes(8).toString("hex");
25
+
26
+ export const parseCommandArgs = (input = "") => {
27
+ if (!input) {
28
+ return [];
29
+ }
30
+ const matches = input.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) || [];
31
+ return matches.map((item) =>
32
+ item.startsWith("\"") && item.endsWith("\"")
33
+ ? item.slice(1, -1)
34
+ : item.startsWith("'") && item.endsWith("'")
35
+ ? item.slice(1, -1)
36
+ : item
37
+ );
38
+ };
39
+
40
+ export const sanitizeFilename = (originalName) =>
41
+ path.basename(originalName || "attachment");
42
+
43
+ export const getSessionTmpDir = (sessionDir) => path.join(sessionDir, "tmp");
44
+
45
+ export const toIsoDateTime = (value) => {
46
+ if (value == null || value === "") {
47
+ return null;
48
+ }
49
+ let date = null;
50
+ if (value instanceof Date) {
51
+ date = value;
52
+ } else if (typeof value === "number" && Number.isFinite(value)) {
53
+ date = new Date(value);
54
+ } else if (typeof value === "string") {
55
+ const parsed = new Date(value);
56
+ if (Number.isFinite(parsed.getTime())) {
57
+ date = parsed;
58
+ }
59
+ }
60
+ if (!date || !Number.isFinite(date.getTime())) {
61
+ return null;
62
+ }
63
+ return date.toISOString();
64
+ };
65
+
66
+ export const formatDebugPayload = (payload, maxBody = 2000) => {
67
+ if (payload == null) return null;
68
+ if (Buffer.isBuffer(payload)) {
69
+ const text = payload.toString("utf8");
70
+ if (text.length > maxBody) {
71
+ return `${text.slice(0, maxBody)}…(truncated)`;
72
+ }
73
+ return text;
74
+ }
75
+ if (typeof payload === "string") {
76
+ if (payload.length > maxBody) {
77
+ return `${payload.slice(0, maxBody)}…(truncated)`;
78
+ }
79
+ return payload;
80
+ }
81
+ if (typeof payload === "object") {
82
+ try {
83
+ const json = JSON.stringify(payload);
84
+ if (json.length > maxBody) {
85
+ return `${json.slice(0, maxBody)}…(truncated)`;
86
+ }
87
+ return json;
88
+ } catch {
89
+ return "[Unserializable object]";
90
+ }
91
+ }
92
+ return String(payload);
93
+ };
94
+
95
+ export const classifySessionCreationError = (error) => {
96
+ const rawMessage = (error?.message || "").trim();
97
+ const message = rawMessage.toLowerCase();
98
+ if (
99
+ message.includes("authentication failed") ||
100
+ message.includes("invalid username or password") ||
101
+ message.includes("http basic: access denied") ||
102
+ message.includes("could not read username") ||
103
+ message.includes("fatal: authentication")
104
+ ) {
105
+ return {
106
+ status: 403,
107
+ error: `Echec d'authentification Git.${rawMessage ? ` ${rawMessage}` : ""}`,
108
+ };
109
+ }
110
+ if (message.includes("permission denied (publickey)") || message.includes("publickey")) {
111
+ return {
112
+ status: 403,
113
+ error: `Echec d'authentification SSH (cle).${rawMessage ? ` ${rawMessage}` : ""}`,
114
+ };
115
+ }
116
+ if (message.includes("repository not found") || message.includes("not found")) {
117
+ return {
118
+ status: 404,
119
+ error: `Depot Git introuvable.${rawMessage ? ` ${rawMessage}` : ""}`,
120
+ };
121
+ }
122
+ if (message.includes("could not resolve host") || message.includes("name or service not known")) {
123
+ return {
124
+ status: 400,
125
+ error: `Hote Git introuvable.${rawMessage ? ` ${rawMessage}` : ""}`,
126
+ };
127
+ }
128
+ if (message.includes("connection timed out") || message.includes("operation timed out")) {
129
+ return {
130
+ status: 504,
131
+ error: `Connexion au depot Git expiree.${rawMessage ? ` ${rawMessage}` : ""}`,
132
+ };
133
+ }
134
+ return {
135
+ status: 500,
136
+ error: rawMessage || "Failed to create session.",
137
+ };
138
+ };