@straiffi/archon 1.0.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 (124) hide show
  1. package/README.md +224 -0
  2. package/dist/cli.js +216 -0
  3. package/dist/client/assets/index-8_-boBBA.css +2 -0
  4. package/dist/client/assets/index-s_jjeqha.js +176 -0
  5. package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  6. package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  7. package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  8. package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  9. package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  10. package/dist/client/favicon.svg +62 -0
  11. package/dist/client/icons.svg +24 -0
  12. package/dist/client/index.html +14 -0
  13. package/dist/server/db.js +764 -0
  14. package/dist/server/db.js.map +1 -0
  15. package/dist/server/index.js +5134 -0
  16. package/dist/server/index.js.map +1 -0
  17. package/dist/server/lib/agent.js +1302 -0
  18. package/dist/server/lib/agent.js.map +1 -0
  19. package/dist/server/lib/buildChains.js +2 -0
  20. package/dist/server/lib/buildChains.js.map +1 -0
  21. package/dist/server/lib/buildFlow.js +59 -0
  22. package/dist/server/lib/buildFlow.js.map +1 -0
  23. package/dist/server/lib/buildSequences.js +599 -0
  24. package/dist/server/lib/buildSequences.js.map +1 -0
  25. package/dist/server/lib/bundleActivity.js +95 -0
  26. package/dist/server/lib/bundleActivity.js.map +1 -0
  27. package/dist/server/lib/bundlePullRequests.js +126 -0
  28. package/dist/server/lib/bundlePullRequests.js.map +1 -0
  29. package/dist/server/lib/chatMessages.js +60 -0
  30. package/dist/server/lib/chatMessages.js.map +1 -0
  31. package/dist/server/lib/chatTargets.js +123 -0
  32. package/dist/server/lib/chatTargets.js.map +1 -0
  33. package/dist/server/lib/chatTicketProposals.js +180 -0
  34. package/dist/server/lib/chatTicketProposals.js.map +1 -0
  35. package/dist/server/lib/chats.js +279 -0
  36. package/dist/server/lib/chats.js.map +1 -0
  37. package/dist/server/lib/config.js +3 -0
  38. package/dist/server/lib/config.js.map +1 -0
  39. package/dist/server/lib/cors.js +30 -0
  40. package/dist/server/lib/cors.js.map +1 -0
  41. package/dist/server/lib/directoryPicker.js +174 -0
  42. package/dist/server/lib/directoryPicker.js.map +1 -0
  43. package/dist/server/lib/git.js +1284 -0
  44. package/dist/server/lib/git.js.map +1 -0
  45. package/dist/server/lib/integrations/github.js +511 -0
  46. package/dist/server/lib/integrations/github.js.map +1 -0
  47. package/dist/server/lib/integrations/index.js +162 -0
  48. package/dist/server/lib/integrations/index.js.map +1 -0
  49. package/dist/server/lib/integrations/jira.js +283 -0
  50. package/dist/server/lib/integrations/jira.js.map +1 -0
  51. package/dist/server/lib/integrations/planning.js +27 -0
  52. package/dist/server/lib/integrations/planning.js.map +1 -0
  53. package/dist/server/lib/integrations/types.js +2 -0
  54. package/dist/server/lib/integrations/types.js.map +1 -0
  55. package/dist/server/lib/lightweightPrompt.js +88 -0
  56. package/dist/server/lib/lightweightPrompt.js.map +1 -0
  57. package/dist/server/lib/models.js +219 -0
  58. package/dist/server/lib/models.js.map +1 -0
  59. package/dist/server/lib/preview.js +377 -0
  60. package/dist/server/lib/preview.js.map +1 -0
  61. package/dist/server/lib/previewProxy.js +659 -0
  62. package/dist/server/lib/previewProxy.js.map +1 -0
  63. package/dist/server/lib/projectAutoConfig.js +682 -0
  64. package/dist/server/lib/projectAutoConfig.js.map +1 -0
  65. package/dist/server/lib/projectFileSuggestions.js +133 -0
  66. package/dist/server/lib/projectFileSuggestions.js.map +1 -0
  67. package/dist/server/lib/projectMemory.js +1519 -0
  68. package/dist/server/lib/projectMemory.js.map +1 -0
  69. package/dist/server/lib/projectMemoryPrompt.js +390 -0
  70. package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
  71. package/dist/server/lib/projectMemoryScan.js +681 -0
  72. package/dist/server/lib/projectMemoryScan.js.map +1 -0
  73. package/dist/server/lib/projectMemorySuggestions.js +166 -0
  74. package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
  75. package/dist/server/lib/projectMemoryTransfer.js +958 -0
  76. package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
  77. package/dist/server/lib/projects.js +569 -0
  78. package/dist/server/lib/projects.js.map +1 -0
  79. package/dist/server/lib/promptSkills.js +28 -0
  80. package/dist/server/lib/promptSkills.js.map +1 -0
  81. package/dist/server/lib/queue.js +15 -0
  82. package/dist/server/lib/queue.js.map +1 -0
  83. package/dist/server/lib/reviewFindings.js +390 -0
  84. package/dist/server/lib/reviewFindings.js.map +1 -0
  85. package/dist/server/lib/run.js +416 -0
  86. package/dist/server/lib/run.js.map +1 -0
  87. package/dist/server/lib/runtimePaths.js +93 -0
  88. package/dist/server/lib/runtimePaths.js.map +1 -0
  89. package/dist/server/lib/shell.js +27 -0
  90. package/dist/server/lib/shell.js.map +1 -0
  91. package/dist/server/lib/skills.js +124 -0
  92. package/dist/server/lib/skills.js.map +1 -0
  93. package/dist/server/lib/startDev.js +18 -0
  94. package/dist/server/lib/startDev.js.map +1 -0
  95. package/dist/server/lib/staticClient.js +80 -0
  96. package/dist/server/lib/staticClient.js.map +1 -0
  97. package/dist/server/lib/terminal.js +366 -0
  98. package/dist/server/lib/terminal.js.map +1 -0
  99. package/dist/server/lib/ticketDependencies.js +174 -0
  100. package/dist/server/lib/ticketDependencies.js.map +1 -0
  101. package/dist/server/lib/ticketMessages.js +65 -0
  102. package/dist/server/lib/ticketMessages.js.map +1 -0
  103. package/dist/server/lib/ticketOpenQuestions.js +128 -0
  104. package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
  105. package/dist/server/lib/ticketUndo.js +549 -0
  106. package/dist/server/lib/ticketUndo.js.map +1 -0
  107. package/dist/server/lib/tickets.js +981 -0
  108. package/dist/server/lib/tickets.js.map +1 -0
  109. package/dist/server/lib/types.js +2 -0
  110. package/dist/server/lib/types.js.map +1 -0
  111. package/dist/server/package.json +3 -0
  112. package/dist/server/workers/build.js +229 -0
  113. package/dist/server/workers/build.js.map +1 -0
  114. package/dist/server/workers/chat.js +190 -0
  115. package/dist/server/workers/chat.js.map +1 -0
  116. package/dist/server/workers/followUp.js +204 -0
  117. package/dist/server/workers/followUp.js.map +1 -0
  118. package/dist/server/workers/plan.js +1130 -0
  119. package/dist/server/workers/plan.js.map +1 -0
  120. package/dist/server/workers/planFollowUp.js +360 -0
  121. package/dist/server/workers/planFollowUp.js.map +1 -0
  122. package/dist/server/workers/review.js +167 -0
  123. package/dist/server/workers/review.js.map +1 -0
  124. package/package.json +40 -0
@@ -0,0 +1,659 @@
1
+ import { createServer } from 'http';
2
+ import http from 'http';
3
+ import https from 'https';
4
+ import { buildPreviewProxyTargetUrl } from './preview.js';
5
+ const PREVIEW_PROXY_BIND_HOST = '127.0.0.1';
6
+ const PREVIEW_PROXY_PUBLIC_HOST = 'localhost';
7
+ const PREVIEW_SELECTION_HELPER_PATH = '/_archon/preview-selection-helper.js';
8
+ const PREVIEW_PROXY_ISOLATION_HEADER_NAME = 'origin-agent-cluster';
9
+ const PREVIEW_PROXY_ISOLATION_HEADER_VALUE = '?1';
10
+ const previewProxyServers = new Map();
11
+ const PREVIEW_SELECTION_HELPER_SCRIPT = String.raw `(() => {
12
+ const MESSAGE_SOURCE = 'archon-preview-selection'
13
+ const PARENT_SOURCE = 'archon-preview-selection-parent'
14
+ const OVERLAY_ID = '__archon_preview_selection_overlay__'
15
+ const CURSOR_STYLE_ID = '__archon_preview_selection_cursor__'
16
+ const OVERLAY_HOVER_STYLES = {
17
+ border: '2px solid rgba(14, 165, 233, 0.95)',
18
+ boxShadow: '0 0 0 1px rgba(125, 211, 252, 0.55), 0 0 0 9999px rgba(15, 23, 42, 0.12)',
19
+ background: 'rgba(14, 165, 233, 0.12)',
20
+ }
21
+ const OVERLAY_SELECTED_STYLES = {
22
+ border: '2px solid rgba(168, 85, 247, 0.95)',
23
+ boxShadow: '0 0 0 1px rgba(216, 180, 254, 0.58), 0 0 0 9999px rgba(15, 23, 42, 0.16)',
24
+ background: 'rgba(168, 85, 247, 0.14)',
25
+ }
26
+ let selectionEnabled = false
27
+ let activeElement = null
28
+ let selectionLocked = false
29
+
30
+ const ensureCursorStyle = () => {
31
+ let styleElement = document.getElementById(CURSOR_STYLE_ID)
32
+ if (styleElement) {
33
+ return styleElement
34
+ }
35
+
36
+ styleElement = document.createElement('style')
37
+ styleElement.id = CURSOR_STYLE_ID
38
+ styleElement.textContent = 'html, body, body *, body *::before, body *::after { cursor: default !important; }'
39
+ document.head.appendChild(styleElement)
40
+ return styleElement
41
+ }
42
+
43
+ const setForcedCursorEnabled = enabled => {
44
+ const styleElement = ensureCursorStyle()
45
+ styleElement.disabled = !enabled
46
+ }
47
+
48
+ const ensureOverlay = () => {
49
+ let overlay = document.getElementById(OVERLAY_ID)
50
+ if (overlay) {
51
+ return overlay
52
+ }
53
+
54
+ overlay = document.createElement('div')
55
+ overlay.id = OVERLAY_ID
56
+ overlay.setAttribute('aria-hidden', 'true')
57
+ overlay.style.position = 'fixed'
58
+ overlay.style.pointerEvents = 'none'
59
+ overlay.style.zIndex = '2147483647'
60
+ overlay.style.borderRadius = '8px'
61
+ overlay.style.display = 'none'
62
+ overlay.style.transition = 'border-color 120ms ease, box-shadow 120ms ease, background-color 120ms ease'
63
+ document.documentElement.appendChild(overlay)
64
+ return overlay
65
+ }
66
+
67
+ const applyOverlayStyles = isSelected => {
68
+ const overlay = ensureOverlay()
69
+ const styles = isSelected ? OVERLAY_SELECTED_STYLES : OVERLAY_HOVER_STYLES
70
+
71
+ overlay.style.border = styles.border
72
+ overlay.style.boxShadow = styles.boxShadow
73
+ overlay.style.background = styles.background
74
+ }
75
+
76
+ const hideOverlay = () => {
77
+ const overlay = ensureOverlay()
78
+ overlay.style.display = 'none'
79
+ }
80
+
81
+ const normalizeSnippet = value => {
82
+ if (typeof value !== 'string') {
83
+ return null
84
+ }
85
+
86
+ const normalized = value.replace(/\s+/g, ' ').trim()
87
+ return normalized.length > 0 ? normalized.slice(0, 140) : null
88
+ }
89
+
90
+ const getTextSnippet = element => {
91
+ return normalizeSnippet(element.getAttribute('aria-label') || element.innerText || element.textContent || '')
92
+ }
93
+
94
+ const getElementLabel = element => {
95
+ const tagName = element.tagName.toLowerCase()
96
+ const role = normalizeSnippet(element.getAttribute('role') || '')
97
+ const textSnippet = getTextSnippet(element)
98
+ const parts = [tagName]
99
+
100
+ if (role) {
101
+ parts.push('[role=' + role + ']')
102
+ }
103
+
104
+ if (textSnippet) {
105
+ parts.push('"' + textSnippet + '"')
106
+ }
107
+
108
+ return parts.join(' ')
109
+ }
110
+
111
+ const getSelectorSegment = element => {
112
+ const tagName = element.tagName.toLowerCase()
113
+ if (element.id) {
114
+ return tagName + '#' + element.id
115
+ }
116
+
117
+ const classNames = typeof element.className === 'string'
118
+ ? element.className.split(/\s+/).filter(Boolean).slice(0, 2)
119
+ : []
120
+ if (classNames.length > 0) {
121
+ return tagName + '.' + classNames.join('.')
122
+ }
123
+
124
+ const parent = element.parentElement
125
+ if (!parent) {
126
+ return tagName
127
+ }
128
+
129
+ const siblings = Array.from(parent.children).filter(candidate => candidate.tagName === element.tagName)
130
+ if (siblings.length <= 1) {
131
+ return tagName
132
+ }
133
+
134
+ return tagName + ':nth-of-type(' + (siblings.indexOf(element) + 1) + ')'
135
+ }
136
+
137
+ const getSelectorHint = element => {
138
+ const segments = []
139
+ let current = element
140
+
141
+ while (current && current.nodeType === Node.ELEMENT_NODE && segments.length < 5) {
142
+ segments.unshift(getSelectorSegment(current))
143
+
144
+ if (current.id) {
145
+ break
146
+ }
147
+
148
+ current = current.parentElement
149
+ }
150
+
151
+ return segments.join(' > ')
152
+ }
153
+
154
+ const updateOverlay = element => {
155
+ if (!(element instanceof Element) || !element.isConnected) {
156
+ hideOverlay()
157
+ return
158
+ }
159
+
160
+ const rect = element.getBoundingClientRect()
161
+ const overlay = ensureOverlay()
162
+ applyOverlayStyles(selectionLocked)
163
+
164
+ overlay.style.display = rect.width > 0 || rect.height > 0 ? 'block' : 'none'
165
+ overlay.style.left = rect.left + 'px'
166
+ overlay.style.top = rect.top + 'px'
167
+ overlay.style.width = rect.width + 'px'
168
+ overlay.style.height = rect.height + 'px'
169
+ }
170
+
171
+ const clearSelection = () => {
172
+ activeElement = null
173
+ selectionLocked = false
174
+ hideOverlay()
175
+ }
176
+
177
+ const resolveTargetElement = target => {
178
+ if (!(target instanceof Element)) {
179
+ return null
180
+ }
181
+
182
+ const overlay = document.getElementById(OVERLAY_ID)
183
+ if (overlay && overlay.contains(target)) {
184
+ return null
185
+ }
186
+
187
+ return target
188
+ }
189
+
190
+ const postSelection = element => {
191
+ const rect = element.getBoundingClientRect()
192
+ window.parent.postMessage({
193
+ source: MESSAGE_SOURCE,
194
+ type: 'element-selected',
195
+ payload: {
196
+ bounds: {
197
+ left: rect.left,
198
+ top: rect.top,
199
+ width: rect.width,
200
+ height: rect.height,
201
+ },
202
+ elementLabel: getElementLabel(element),
203
+ href: element.getAttribute('href'),
204
+ pagePath: location.pathname + location.search + location.hash,
205
+ pageUrl: location.href,
206
+ selectorHint: getSelectorHint(element),
207
+ src: element.getAttribute('src'),
208
+ textSnippet: getTextSnippet(element),
209
+ viewport: {
210
+ width: window.innerWidth,
211
+ height: window.innerHeight,
212
+ },
213
+ },
214
+ }, '*')
215
+ }
216
+
217
+ document.addEventListener('mousemove', event => {
218
+ if (!selectionEnabled || selectionLocked) {
219
+ return
220
+ }
221
+
222
+ const nextElement = resolveTargetElement(event.target)
223
+ if (!nextElement) {
224
+ return
225
+ }
226
+
227
+ activeElement = nextElement
228
+ updateOverlay(nextElement)
229
+ }, true)
230
+
231
+ document.addEventListener('click', event => {
232
+ if (!selectionEnabled || selectionLocked) {
233
+ return
234
+ }
235
+
236
+ const nextElement = resolveTargetElement(event.target)
237
+ if (!nextElement) {
238
+ return
239
+ }
240
+
241
+ event.preventDefault()
242
+ event.stopPropagation()
243
+ if (typeof event.stopImmediatePropagation === 'function') {
244
+ event.stopImmediatePropagation()
245
+ }
246
+
247
+ activeElement = nextElement
248
+ selectionLocked = true
249
+ updateOverlay(nextElement)
250
+ postSelection(nextElement)
251
+ }, true)
252
+
253
+ window.addEventListener('scroll', () => {
254
+ if (!selectionEnabled || !activeElement) {
255
+ return
256
+ }
257
+
258
+ updateOverlay(activeElement)
259
+ }, true)
260
+
261
+ window.addEventListener('resize', () => {
262
+ if (!selectionEnabled || !activeElement) {
263
+ return
264
+ }
265
+
266
+ updateOverlay(activeElement)
267
+ })
268
+
269
+ window.addEventListener('message', event => {
270
+ const data = event.data
271
+ if (!data || typeof data !== 'object' || data.source !== PARENT_SOURCE) {
272
+ return
273
+ }
274
+
275
+ if (data.type === 'set-enabled') {
276
+ selectionEnabled = Boolean(data.enabled)
277
+ setForcedCursorEnabled(selectionEnabled)
278
+ if (!selectionEnabled) {
279
+ clearSelection()
280
+ } else if (activeElement) {
281
+ updateOverlay(activeElement)
282
+ }
283
+ return
284
+ }
285
+
286
+ if (data.type === 'clear-selection') {
287
+ clearSelection()
288
+ }
289
+ })
290
+ })()`;
291
+ export const buildPreviewProxyRequestHeaders = (headers, target) => {
292
+ const nextHeaders = { ...headers };
293
+ nextHeaders.host = target.host;
294
+ nextHeaders['accept-encoding'] = 'identity';
295
+ if (typeof headers.origin === 'string') {
296
+ nextHeaders.origin = target.origin;
297
+ }
298
+ if (typeof headers.referer === 'string') {
299
+ nextHeaders.referer = target.origin;
300
+ }
301
+ return nextHeaders;
302
+ };
303
+ const isIgnorablePreviewSocketError = (error) => {
304
+ return error.code === 'EPIPE' || error.code === 'ECONNRESET';
305
+ };
306
+ const canWriteToPreviewSocket = (socket) => {
307
+ return !socket.destroyed && socket.writable !== false && socket.writableEnded !== true;
308
+ };
309
+ const trackPreviewSocket = (sockets, socket) => {
310
+ sockets.add(socket);
311
+ const cleanup = () => {
312
+ sockets.delete(socket);
313
+ };
314
+ socket.on('close', cleanup);
315
+ socket.on('error', cleanup);
316
+ };
317
+ const destroyTrackedSockets = (sockets) => {
318
+ for (const socket of sockets) {
319
+ try {
320
+ socket.destroy();
321
+ }
322
+ catch {
323
+ }
324
+ }
325
+ sockets.clear();
326
+ };
327
+ const trackPreviewRequest = (requests, request) => {
328
+ requests.add(request);
329
+ const cleanup = () => {
330
+ requests.delete(request);
331
+ };
332
+ request.on('close', cleanup);
333
+ request.on('error', cleanup);
334
+ };
335
+ const destroyTrackedRequests = (requests) => {
336
+ for (const request of requests) {
337
+ try {
338
+ request.destroy();
339
+ }
340
+ catch {
341
+ }
342
+ }
343
+ requests.clear();
344
+ };
345
+ const destroyPreviewSocket = (socket) => {
346
+ if (socket.destroyed) {
347
+ return;
348
+ }
349
+ socket.destroy();
350
+ };
351
+ const endPreviewSocket = (socket) => {
352
+ if (socket.destroyed || socket.writableEnded === true) {
353
+ return;
354
+ }
355
+ socket.end();
356
+ };
357
+ const writePreviewSocket = (socket, chunk) => {
358
+ if (!canWriteToPreviewSocket(socket)) {
359
+ return;
360
+ }
361
+ socket.write(chunk);
362
+ };
363
+ export const bridgePreviewProxySockets = ({ clientSocket, headerLines, head, statusLine, upstreamHead, upstreamSocket, }) => {
364
+ clientSocket.on('close', () => {
365
+ destroyPreviewSocket(upstreamSocket);
366
+ });
367
+ upstreamSocket.on('close', () => {
368
+ destroyPreviewSocket(clientSocket);
369
+ });
370
+ clientSocket.on('end', () => {
371
+ endPreviewSocket(upstreamSocket);
372
+ });
373
+ upstreamSocket.on('end', () => {
374
+ endPreviewSocket(clientSocket);
375
+ });
376
+ clientSocket.on('error', error => {
377
+ if (!isIgnorablePreviewSocketError(error)) {
378
+ destroyPreviewSocket(upstreamSocket);
379
+ return;
380
+ }
381
+ destroyPreviewSocket(upstreamSocket);
382
+ });
383
+ upstreamSocket.on('error', error => {
384
+ if (!isIgnorablePreviewSocketError(error)) {
385
+ destroyPreviewSocket(clientSocket);
386
+ return;
387
+ }
388
+ destroyPreviewSocket(clientSocket);
389
+ });
390
+ writePreviewSocket(clientSocket, `${statusLine}\r\n${headerLines.join('\r\n')}\r\n\r\n`);
391
+ if (upstreamHead.length > 0 && !upstreamSocket.destroyed) {
392
+ upstreamSocket.unshift(upstreamHead);
393
+ }
394
+ if (head.length > 0) {
395
+ writePreviewSocket(upstreamSocket, head);
396
+ }
397
+ ;
398
+ upstreamSocket.pipe(clientSocket);
399
+ clientSocket.pipe(upstreamSocket);
400
+ };
401
+ export const injectPreviewSelectionHelper = (html) => {
402
+ if (html.includes(PREVIEW_SELECTION_HELPER_PATH)) {
403
+ return html;
404
+ }
405
+ const scriptTag = `<script src="${PREVIEW_SELECTION_HELPER_PATH}"></script>`;
406
+ if (/<\/body>/i.test(html)) {
407
+ return html.replace(/<\/body>/i, `${scriptTag}</body>`);
408
+ }
409
+ if (/<\/head>/i.test(html)) {
410
+ return html.replace(/<\/head>/i, `${scriptTag}</head>`);
411
+ }
412
+ return `${html}${scriptTag}`;
413
+ };
414
+ const isHtmlPreviewProxyResponse = (headers) => {
415
+ const contentType = headers['content-type'];
416
+ if (typeof contentType !== 'string') {
417
+ return false;
418
+ }
419
+ return contentType.includes('text/html') || contentType.includes('application/xhtml+xml');
420
+ };
421
+ const shouldInjectPreviewSelectionHelper = (headers) => {
422
+ if (!isHtmlPreviewProxyResponse(headers)) {
423
+ return false;
424
+ }
425
+ const contentEncoding = headers['content-encoding'];
426
+ if (Array.isArray(contentEncoding)) {
427
+ return contentEncoding.every(value => value === 'identity');
428
+ }
429
+ return contentEncoding === undefined || contentEncoding === 'identity';
430
+ };
431
+ const servePreviewSelectionHelperScript = (res) => {
432
+ res.statusCode = 200;
433
+ res.setHeader('cache-control', 'no-store');
434
+ res.setHeader('content-type', 'application/javascript; charset=utf-8');
435
+ res.end(PREVIEW_SELECTION_HELPER_SCRIPT);
436
+ };
437
+ const rewritePreviewProxyLocation = (value, target, proxyOrigin) => {
438
+ try {
439
+ const resolved = new URL(value, target);
440
+ if (resolved.origin !== target.origin) {
441
+ return value;
442
+ }
443
+ const rewritten = `${resolved.pathname}${resolved.search}${resolved.hash}`;
444
+ if (/^(?:https?:)?\/\//i.test(value)) {
445
+ return `${proxyOrigin}${rewritten}`;
446
+ }
447
+ return rewritten;
448
+ }
449
+ catch {
450
+ return value;
451
+ }
452
+ };
453
+ const shouldSkipPreviewProxyResponseHeader = (headerName) => {
454
+ return headerName === 'content-security-policy' || headerName === 'x-frame-options';
455
+ };
456
+ const applyPreviewProxyResponseHeaders = (res, upstreamHeaders, target, proxyOrigin) => {
457
+ for (const [headerName, headerValue] of Object.entries(upstreamHeaders)) {
458
+ if (headerValue === undefined || shouldSkipPreviewProxyResponseHeader(headerName)) {
459
+ continue;
460
+ }
461
+ if (headerName === 'location' && typeof headerValue === 'string') {
462
+ res.setHeader(headerName, rewritePreviewProxyLocation(headerValue, target, proxyOrigin));
463
+ continue;
464
+ }
465
+ res.setHeader(headerName, headerValue);
466
+ }
467
+ res.setHeader(PREVIEW_PROXY_ISOLATION_HEADER_NAME, PREVIEW_PROXY_ISOLATION_HEADER_VALUE);
468
+ };
469
+ const writePreviewProxyError = (res, error) => {
470
+ const message = error instanceof Error ? error.message : 'Preview proxy failed';
471
+ res.statusCode = 502;
472
+ res.setHeader('content-type', 'application/json; charset=utf-8');
473
+ res.end(JSON.stringify({ error: message }));
474
+ };
475
+ const writePreviewProxyInactive = (res) => {
476
+ res.statusCode = 503;
477
+ res.setHeader('cache-control', 'no-store');
478
+ res.setHeader('content-type', 'application/json; charset=utf-8');
479
+ res.end(JSON.stringify({ error: 'Preview is not running' }));
480
+ };
481
+ const getPreviewProxyUpstreamUrl = (record, requestPath, search) => {
482
+ if (!record.targetUrl) {
483
+ return null;
484
+ }
485
+ return buildPreviewProxyTargetUrl(record.targetUrl, requestPath, search);
486
+ };
487
+ const handlePreviewProxyRequest = (record, req, res) => {
488
+ const requestUrl = new URL(req.url ?? '/', record.origin);
489
+ if (requestUrl.pathname === PREVIEW_SELECTION_HELPER_PATH) {
490
+ servePreviewSelectionHelperScript(res);
491
+ return;
492
+ }
493
+ const upstreamUrl = getPreviewProxyUpstreamUrl(record, requestUrl.pathname || '/', requestUrl.search);
494
+ if (!upstreamUrl) {
495
+ writePreviewProxyInactive(res);
496
+ return;
497
+ }
498
+ const transport = upstreamUrl.protocol === 'https:' ? https : http;
499
+ const upstreamRequest = transport.request(upstreamUrl, {
500
+ method: req.method,
501
+ headers: buildPreviewProxyRequestHeaders(req.headers, upstreamUrl),
502
+ }, upstreamResponse => {
503
+ res.statusCode = upstreamResponse.statusCode ?? 502;
504
+ applyPreviewProxyResponseHeaders(res, upstreamResponse.headers, upstreamUrl, record.origin);
505
+ if (!shouldInjectPreviewSelectionHelper(upstreamResponse.headers)) {
506
+ upstreamResponse.pipe(res);
507
+ return;
508
+ }
509
+ const chunks = [];
510
+ upstreamResponse.on('data', chunk => {
511
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
512
+ });
513
+ upstreamResponse.on('end', () => {
514
+ const injectedHtml = injectPreviewSelectionHelper(Buffer.concat(chunks).toString('utf8'));
515
+ const body = Buffer.from(injectedHtml, 'utf8');
516
+ res.removeHeader('content-encoding');
517
+ res.removeHeader('content-length');
518
+ res.removeHeader('transfer-encoding');
519
+ res.setHeader('content-length', body.byteLength);
520
+ res.end(body);
521
+ });
522
+ upstreamResponse.on('error', error => {
523
+ if (res.headersSent) {
524
+ res.end();
525
+ return;
526
+ }
527
+ writePreviewProxyError(res, error);
528
+ });
529
+ });
530
+ trackPreviewRequest(record.activeUpstreamRequests, upstreamRequest);
531
+ upstreamRequest.on('socket', socket => {
532
+ trackPreviewSocket(record.activeUpstreamSockets, socket);
533
+ });
534
+ upstreamRequest.on('error', error => {
535
+ if (res.headersSent) {
536
+ res.end();
537
+ return;
538
+ }
539
+ writePreviewProxyError(res, error);
540
+ });
541
+ req.pipe(upstreamRequest);
542
+ };
543
+ const handlePreviewProxyUpgrade = (record, req, socket, head) => {
544
+ const requestUrl = new URL(req.url ?? '/', record.origin);
545
+ const upstreamUrl = getPreviewProxyUpstreamUrl(record, requestUrl.pathname || '/', requestUrl.search);
546
+ if (!upstreamUrl) {
547
+ socket.end('HTTP/1.1 503 Service Unavailable\r\nConnection: close\r\n\r\n');
548
+ return;
549
+ }
550
+ const transport = upstreamUrl.protocol === 'https:' ? https : http;
551
+ const upstreamRequest = transport.request(upstreamUrl, {
552
+ method: req.method,
553
+ headers: buildPreviewProxyRequestHeaders(req.headers, upstreamUrl),
554
+ });
555
+ trackPreviewRequest(record.activeUpstreamRequests, upstreamRequest);
556
+ upstreamRequest.on('socket', upstreamSocket => {
557
+ trackPreviewSocket(record.activeUpstreamSockets, upstreamSocket);
558
+ });
559
+ upstreamRequest.on('upgrade', (upstreamResponse, upstreamSocket, upstreamHead) => {
560
+ const statusLine = `HTTP/1.1 ${upstreamResponse.statusCode ?? 101} ${upstreamResponse.statusMessage ?? 'Switching Protocols'}`;
561
+ const headerLines = Object.entries(upstreamResponse.headers)
562
+ .filter(([, value]) => value !== undefined)
563
+ .map(([name, value]) => {
564
+ if (name === 'location' && typeof value === 'string') {
565
+ return `${name}: ${rewritePreviewProxyLocation(value, upstreamUrl, record.origin)}`;
566
+ }
567
+ return `${name}: ${Array.isArray(value) ? value.join(', ') : value}`;
568
+ });
569
+ bridgePreviewProxySockets({
570
+ clientSocket: socket,
571
+ headerLines,
572
+ head,
573
+ statusLine,
574
+ upstreamHead,
575
+ upstreamSocket: upstreamSocket,
576
+ });
577
+ });
578
+ upstreamRequest.on('error', () => {
579
+ socket.destroy();
580
+ });
581
+ upstreamRequest.end();
582
+ };
583
+ export const deactivatePreviewProxyForProject = (projectId) => {
584
+ if (!projectId) {
585
+ return;
586
+ }
587
+ const record = previewProxyServers.get(projectId);
588
+ if (!record) {
589
+ return;
590
+ }
591
+ record.targetUrl = null;
592
+ destroyTrackedRequests(record.activeUpstreamRequests);
593
+ destroyTrackedSockets(record.activeUpstreamSockets);
594
+ destroyTrackedSockets(record.activeClientSockets);
595
+ };
596
+ export const ensurePreviewProxyForProject = async (projectId, targetUrl) => {
597
+ const existing = previewProxyServers.get(projectId);
598
+ if (existing) {
599
+ existing.targetUrl = targetUrl;
600
+ return existing.origin;
601
+ }
602
+ const server = createServer();
603
+ const record = {
604
+ origin: '',
605
+ server,
606
+ targetUrl,
607
+ activeClientSockets: new Set(),
608
+ activeUpstreamRequests: new Set(),
609
+ activeUpstreamSockets: new Set(),
610
+ };
611
+ server.on('connection', socket => {
612
+ trackPreviewSocket(record.activeClientSockets, socket);
613
+ });
614
+ server.on('request', (req, res) => {
615
+ handlePreviewProxyRequest(record, req, res);
616
+ });
617
+ server.on('upgrade', (req, socket, head) => {
618
+ handlePreviewProxyUpgrade(record, req, socket, head);
619
+ });
620
+ await new Promise((resolve, reject) => {
621
+ server.once('error', reject);
622
+ server.listen(0, PREVIEW_PROXY_BIND_HOST, () => {
623
+ server.off('error', reject);
624
+ resolve();
625
+ });
626
+ });
627
+ const address = server.address();
628
+ if (!address || typeof address === 'string') {
629
+ server.close();
630
+ throw new Error('Preview proxy failed to bind a loopback port');
631
+ }
632
+ record.origin = `http://${PREVIEW_PROXY_PUBLIC_HOST}:${address.port}`;
633
+ previewProxyServers.set(projectId, record);
634
+ return record.origin;
635
+ };
636
+ export const clearPreviewProxyForProject = async (projectId) => {
637
+ if (!projectId) {
638
+ return;
639
+ }
640
+ const record = previewProxyServers.get(projectId);
641
+ if (!record) {
642
+ return;
643
+ }
644
+ previewProxyServers.delete(projectId);
645
+ deactivatePreviewProxyForProject(projectId);
646
+ await new Promise((resolve, reject) => {
647
+ record.server.close(error => {
648
+ if (error) {
649
+ reject(error);
650
+ return;
651
+ }
652
+ resolve();
653
+ });
654
+ });
655
+ };
656
+ export const clearAllPreviewProxies = async () => {
657
+ await Promise.all([...previewProxyServers.keys()].map(projectId => clearPreviewProxyForProject(projectId)));
658
+ };
659
+ //# sourceMappingURL=previewProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"previewProxy.js","sourceRoot":"","sources":["../../../server/lib/previewProxy.ts"],"names":[],"mappings":"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"}