@yorha2b-lab/autodev 5.6.3 → 5.7.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.
@@ -0,0 +1,110 @@
1
+ const fs = require('fs')
2
+ const path = require('path')
3
+
4
+ let globalBrowser = null
5
+
6
+ module.exports = ({ yorha, dialog }) => {
7
+
8
+ const { pod042 } = yorha
9
+
10
+ const isHttpURL = str => {
11
+ try {
12
+ const url = new URL(str)
13
+ return ['http:', 'https:'].includes(url.protocol)
14
+ } catch {
15
+ return false
16
+ }
17
+ }
18
+
19
+ const derivePageNameFromUrl = rawUrl => {
20
+ const parsed = new URL(rawUrl)
21
+ let routePath = parsed.hash ? parsed.hash.replace(/^#/, '') : parsed.pathname
22
+ routePath = routePath.split('?')[0].replace(/^\/+|\/+$/g, '')
23
+ if (!routePath) return 'Home'
24
+ const parts = routePath.split(/[/\-_]/).filter(Boolean)
25
+ return parts.at(-1) ?? 'capturedPage'
26
+ }
27
+
28
+ return {
29
+ archeology: async targetUrl => {
30
+
31
+ if (!isHttpURL(targetUrl)) {
32
+ return
33
+ }
34
+
35
+ pod042.report(dialog.pod042.startScout, 'green')
36
+
37
+ const puppeteer = require('puppeteer')
38
+ const screenshotDir = path.join(process.cwd(), 'bunker', 'screenShot')
39
+ const sessionDir = path.join(process.cwd(), 'bunker', '.chrome_session')
40
+
41
+ let isBrowserAlive = false
42
+ if (globalBrowser) {
43
+ try {
44
+ await globalBrowser.pages()
45
+ isBrowserAlive = true
46
+ } catch (e) {
47
+ globalBrowser = null
48
+ }
49
+ }
50
+
51
+ if (!isBrowserAlive) {
52
+
53
+ ['SingletonLock', 'SingletonSocket', 'SingletonCookie'].forEach(file => {
54
+ try { fs.unlinkSync(path.join(sessionDir, file)) } catch (e) { }
55
+ })
56
+
57
+ globalBrowser = await puppeteer.launch({
58
+ headless: false,
59
+ handleSIGINT: false,
60
+ defaultViewport: null,
61
+ userDataDir: sessionDir,
62
+ args: ['--start-maximized']
63
+ })
64
+ }
65
+
66
+ const pages = await globalBrowser.pages()
67
+ const page = pages.length > 0 ? pages[0] : await globalBrowser.newPage()
68
+
69
+ try {
70
+ await page.exposeFunction('nodeTakeScreenshot', async () => {
71
+ const currentUrl = await page.url()
72
+ const pageName = derivePageNameFromUrl(currentUrl)
73
+ const savePath = path.join(screenshotDir, `${pageName}.png`)
74
+ await page.screenshot({ path: savePath, fullPage: true })
75
+ pod042.report(dialog.pod042.capturedPage(pageName), 'green')
76
+ })
77
+
78
+ await page.evaluateOnNewDocument(() => {
79
+ if (window.__hasBunkerListener__) return
80
+ window.__hasBunkerListener__ = true
81
+ window.addEventListener('contextmenu', (e) => {
82
+ e.preventDefault()
83
+ if (window.nodeTakeScreenshot) {
84
+ window.nodeTakeScreenshot()
85
+ }
86
+ const toast = document.createElement('div')
87
+ toast.innerText = dialog.pod042.capturedToast
88
+ toast.style.cssText = `
89
+ position: fixed; top: 20px; right: 20px; z-index: 999999;
90
+ background: rgba(0, 0, 0, 0.85); color: #00ffcc;
91
+ border: 1px solid #00ffcc; padding: 12px 24px;
92
+ font-size: 15px; font-family: monospace; border-radius: 4px;
93
+ box-shadow: 0 0 15px rgba(0, 255, 204, 0.5);
94
+ pointer-events: none; transition: opacity 0.4s ease;
95
+ `
96
+ document.body.appendChild(toast)
97
+ setTimeout(() => {
98
+ toast.style.opacity = '0'
99
+ setTimeout(() => toast.remove(), 400)
100
+ }, 1200)
101
+ })
102
+ })
103
+ } catch (error) { }
104
+
105
+ await page.goto(targetUrl)
106
+ pod042.report(dialog.pod042.scoutReady, 'green')
107
+ return globalBrowser
108
+ }
109
+ }
110
+ }
package/src/labs/tower.js CHANGED
@@ -54,8 +54,8 @@ module.exports = ({ utils, yorha, dialog, handlers }) => {
54
54
  }
55
55
 
56
56
  pod153.report(dialog.pod153.capturedRuntimeSignal(fileName))
57
- // 💡 直接调用 api-handler 物理更新 resource.js
58
- await handlers.api.handle(null, { fileName, data: json })
57
+ // 💡 直接调用 response-handler 物理更新 resource.js
58
+ await handlers.response.handle(null, { fileName, data: json })
59
59
  hackedRegistry.set(fileName, fingerprint)
60
60
  } catch (e) {
61
61
  // 非 JSON 信号,保持静默
@@ -12,6 +12,12 @@ const getConfig = () => {
12
12
  return config
13
13
  }
14
14
 
15
+ const findRoute = (routes, filePath) => {
16
+ const relative = path.relative(path.resolve('bunker'), path.resolve(filePath))
17
+ const root = relative.split(path.sep)[0]
18
+ return routes.find(route => root === route.watch)
19
+ }
20
+
15
21
  const getExistingMenus = (dir = 'src/pages') => {
16
22
  const pagesDir = path.join(process.cwd(), dir)
17
23
  if (!fs.existsSync(pagesDir)) return []
@@ -36,6 +42,7 @@ const copyTemplateDir = (template, templateSubDir, targetSubDir) => {
36
42
 
37
43
  module.exports = {
38
44
  getConfig,
45
+ findRoute,
39
46
  copyTemplateDir,
40
47
  getExistingMenus,
41
48
  }