farming-code 2.2.29 → 2.2.30
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.
- package/README.md +25 -66
- package/README.zh_cn.md +15 -66
- package/backend/acp-runtime.js +1 -15
- package/backend/acp-session-state.js +78 -88
- package/backend/agent-session-history.js +45 -12
- package/backend/codex-session-history.js +1 -1
- package/backend/codex-transcript.js +0 -202
- package/backend/config-manager.js +3 -19
- package/backend/farming-app-cli.js +1 -1
- package/backend/farming-cli.js +3 -57
- package/backend/index-html.js +21 -3
- package/backend/main-agent-skills.js +1 -18
- package/backend/server.js +6 -48
- package/backend/storage-layout.js +15 -0
- package/backend/update-service.js +55 -935
- package/config/farming.deploy.env.example +1 -1
- package/config/farming.install.env.example +1 -1
- package/dist/acp/codex-acp-1.1.4.mjs +387 -7
- package/dist/assets/App-Z1N7T0eM.js +695 -0
- package/dist/assets/{ProjectFilesSection-Cf2BEcAN.js → ProjectFilesSection-K3GHuQ4U.js} +2 -2
- package/dist/assets/code-dark-kLsQLvpf.css +1 -0
- package/dist/assets/{index-CQNaZc3l.js → index-D-zetSol.js} +2 -2
- package/dist/assets/main-DUTz-Rd2.css +1 -0
- package/dist/index.html +2 -1
- package/extensions/browser/backend/browser-resource-manager.js +27 -5
- package/extensions/browser/backend/browser-router.js +8 -0
- package/extensions/browser/backend/executable-discovery.js +26 -12
- package/extensions/browser/backend/managed-chromium-installer.js +593 -0
- package/extensions/browser/frontend/types.ts +8 -1
- package/extensions/browser/frontend/useBrowserResources.ts +8 -0
- package/index.html +1 -0
- package/package.json +1 -1
- package/backend/agent-memory-report.js +0 -583
- package/backend/bundle-update-helper.js +0 -113
- package/backend/codex-rollout-follower.js +0 -326
- package/dist/assets/App-Ex2oVVXO.js +0 -693
- package/dist/assets/code-dark-BEZTQwYZ.css +0 -1
- package/dist/assets/main-DK9Sy7-c.css +0 -1
package/dist/index.html
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')
|
|
28
28
|
: preference
|
|
29
29
|
root.dataset.appearance = appearance
|
|
30
|
+
document.querySelector('meta[name="color-scheme"]')?.setAttribute('content', appearance)
|
|
30
31
|
document.querySelector('meta[name="theme-color"]')?.setAttribute(
|
|
31
32
|
'content',
|
|
32
33
|
appearance === 'dark' ? '#181818' : '#ffffff',
|
|
@@ -44,7 +45,7 @@
|
|
|
44
45
|
<link rel="apple-touch-icon" sizes="180x180" href="/farming/farming-2/app-icon-v2-180.png" />
|
|
45
46
|
<link rel="manifest" href="/farming/farming-2/site.webmanifest" />
|
|
46
47
|
<title>Farming 2</title>
|
|
47
|
-
<script type="module" crossorigin src="/farming/assets/index-
|
|
48
|
+
<script type="module" crossorigin src="/farming/assets/index-D-zetSol.js"></script>
|
|
48
49
|
<link rel="modulepreload" crossorigin href="/farming/assets/chunk-DECur_0Z.js">
|
|
49
50
|
<link rel="modulepreload" crossorigin href="/farming/assets/preload-helper-mJowh_hw.js">
|
|
50
51
|
<link rel="modulepreload" crossorigin href="/farming/assets/jsx-runtime-BthL93pI.js">
|
|
@@ -13,6 +13,7 @@ const {
|
|
|
13
13
|
discoverBrowserExecutables,
|
|
14
14
|
discoverBrowserRuntime,
|
|
15
15
|
} = require('./executable-discovery');
|
|
16
|
+
const { ManagedChromiumInstaller } = require('./managed-chromium-installer');
|
|
16
17
|
|
|
17
18
|
const MAX_VIEWER_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
18
19
|
const VIEWER_RESIZE_SETTLE_MS = 80;
|
|
@@ -144,13 +145,23 @@ class BrowserResourceManager extends EventEmitter {
|
|
|
144
145
|
super();
|
|
145
146
|
this.configDir = options.configDir;
|
|
146
147
|
this.store = options.store || new BrowserResourceStore(options.configDir);
|
|
148
|
+
this.chromiumInstaller = options.chromiumInstaller || new ManagedChromiumInstaller({
|
|
149
|
+
...options,
|
|
150
|
+
configDir: this.configDir,
|
|
151
|
+
});
|
|
147
152
|
this.discoverExecutable = options.discoverExecutable || (selection => discoverBrowserRuntime({
|
|
148
153
|
...options,
|
|
149
154
|
...selection,
|
|
150
155
|
configDir: this.configDir,
|
|
156
|
+
managedBrowserPath: this.chromiumInstaller.browserOption()?.path || '',
|
|
151
157
|
}));
|
|
152
158
|
this.discoverBrowserOptions = options.discoverBrowserOptions
|
|
153
|
-
|| (options.discoverExecutable
|
|
159
|
+
|| (options.discoverExecutable
|
|
160
|
+
? () => []
|
|
161
|
+
: () => discoverBrowserExecutables({
|
|
162
|
+
...options,
|
|
163
|
+
managedBrowserPath: this.chromiumInstaller.browserOption()?.path || '',
|
|
164
|
+
}));
|
|
154
165
|
this.getBrowserSettings = typeof options.getBrowserSettings === 'function'
|
|
155
166
|
? options.getBrowserSettings
|
|
156
167
|
: () => ({ browserSource: 'system', browserExecutablePath: '', browserExternalCdpUrl: '' });
|
|
@@ -303,17 +314,19 @@ class BrowserResourceManager extends EventEmitter {
|
|
|
303
314
|
browser: runnable ? { kind: executable.kind, path: executable.path } : null,
|
|
304
315
|
selection,
|
|
305
316
|
options: this.browserOptions.map(option => ({ kind: option.kind, path: option.path })),
|
|
317
|
+
installation: this.chromiumInstaller.status(),
|
|
306
318
|
message: !enabled
|
|
307
319
|
? 'Browser extension is disabled'
|
|
308
320
|
: (executable?.error || (runnable
|
|
309
321
|
? ''
|
|
310
|
-
: 'Install
|
|
322
|
+
: 'Install Farming-managed Chromium, choose a system Chromium browser, or configure a loopback external CDP endpoint')),
|
|
311
323
|
};
|
|
312
324
|
}
|
|
313
325
|
|
|
314
326
|
browserSelection(settings = this.getBrowserSettings()) {
|
|
327
|
+
const source = settings?.browserSource;
|
|
315
328
|
return {
|
|
316
|
-
source:
|
|
329
|
+
source: ['external-cdp', 'managed'].includes(source) ? source : 'system',
|
|
317
330
|
executablePath: String(settings?.browserExecutablePath || ''),
|
|
318
331
|
externalCdpUrl: String(settings?.browserExternalCdpUrl || 'http://127.0.0.1:9222'),
|
|
319
332
|
};
|
|
@@ -338,6 +351,15 @@ class BrowserResourceManager extends EventEmitter {
|
|
|
338
351
|
return this.runtimeCapability;
|
|
339
352
|
}
|
|
340
353
|
|
|
354
|
+
async installManagedChromium() {
|
|
355
|
+
if (this.disposed) {
|
|
356
|
+
throw browserError('Browser manager is stopping', 503, 'BROWSER_MANAGER_STOPPING');
|
|
357
|
+
}
|
|
358
|
+
await this.chromiumInstaller.install();
|
|
359
|
+
await this.refreshCapability();
|
|
360
|
+
return this.capability();
|
|
361
|
+
}
|
|
362
|
+
|
|
341
363
|
list() {
|
|
342
364
|
this.requireEnabled();
|
|
343
365
|
return this.store.list().map(resource => publicResource(resource, this.store.revision));
|
|
@@ -412,7 +434,7 @@ class BrowserResourceManager extends EventEmitter {
|
|
|
412
434
|
const failed = this.store.update(id, {
|
|
413
435
|
status: 'failed',
|
|
414
436
|
error: executable?.error
|
|
415
|
-
|| 'Install
|
|
437
|
+
|| 'Install Farming-managed Chromium, choose a system Chromium browser, or configure a loopback external CDP endpoint',
|
|
416
438
|
});
|
|
417
439
|
this.emitResource(failed);
|
|
418
440
|
throw browserError(failed.error, 503, 'BROWSER_EXECUTABLE_NOT_FOUND');
|
|
@@ -1012,7 +1034,7 @@ class BrowserResourceManager extends EventEmitter {
|
|
|
1012
1034
|
const executable = this.runtimeCapability;
|
|
1013
1035
|
if (!executable || executable.error) {
|
|
1014
1036
|
throw browserError(
|
|
1015
|
-
executable?.error || 'Install
|
|
1037
|
+
executable?.error || 'Install Farming-managed Chromium, choose a system Chromium browser, or configure a loopback external CDP endpoint',
|
|
1016
1038
|
503,
|
|
1017
1039
|
'BROWSER_EXECUTABLE_NOT_FOUND',
|
|
1018
1040
|
);
|
|
@@ -20,6 +20,14 @@ function createBrowserRouter(manager, workspaceRootRegistry) {
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
+
router.post('/install', async (_req, res) => {
|
|
24
|
+
try {
|
|
25
|
+
res.json(await manager.installManagedChromium());
|
|
26
|
+
} catch (error) {
|
|
27
|
+
sendError(res, error);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
23
31
|
router.get('/', (_req, res) => {
|
|
24
32
|
try {
|
|
25
33
|
res.json(manager.snapshot());
|
|
@@ -109,10 +109,15 @@ function discoverWindowsBrowser(env) {
|
|
|
109
109
|
function discoverBrowserExecutables(options = {}) {
|
|
110
110
|
const env = options.env || process.env;
|
|
111
111
|
const platform = options.platform || process.platform;
|
|
112
|
-
|
|
113
|
-
if (platform === '
|
|
114
|
-
if (platform === '
|
|
115
|
-
|
|
112
|
+
let candidates = [];
|
|
113
|
+
if (platform === 'darwin') candidates = macBrowserCandidates();
|
|
114
|
+
if (platform === 'linux') candidates = linuxBrowserCandidates();
|
|
115
|
+
if (platform === 'win32') candidates = windowsBrowserCandidates(env);
|
|
116
|
+
const managed = executable(options.managedBrowserPath, 'managed-chromium');
|
|
117
|
+
return [
|
|
118
|
+
...uniqueExecutables(candidates),
|
|
119
|
+
...(managed ? [managed] : []),
|
|
120
|
+
];
|
|
116
121
|
}
|
|
117
122
|
|
|
118
123
|
function normalizeExternalCdpUrl(value) {
|
|
@@ -146,6 +151,13 @@ function discoverBrowserExecutable(options = {}) {
|
|
|
146
151
|
error: 'External CDP must be a loopback http(s) or ws(s) endpoint without credentials or query parameters',
|
|
147
152
|
};
|
|
148
153
|
}
|
|
154
|
+
if (source === 'managed') {
|
|
155
|
+
return executable(options.managedBrowserPath, 'managed-chromium') || {
|
|
156
|
+
kind: 'managed-chromium',
|
|
157
|
+
path: String(options.managedBrowserPath || ''),
|
|
158
|
+
error: 'Install or update the Farming-managed Chromium for this agent-browser version',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
149
161
|
if (source === 'system') {
|
|
150
162
|
const configuredPath = String(options.executablePath || '').trim();
|
|
151
163
|
if (configuredPath) {
|
|
@@ -156,10 +168,11 @@ function discoverBrowserExecutable(options = {}) {
|
|
|
156
168
|
error: 'The selected Chromium browser is no longer available',
|
|
157
169
|
};
|
|
158
170
|
}
|
|
159
|
-
|
|
160
|
-
if (platform === '
|
|
161
|
-
if (platform === '
|
|
162
|
-
|
|
171
|
+
let systemBrowser = null;
|
|
172
|
+
if (platform === 'darwin') systemBrowser = discoverMacBrowser();
|
|
173
|
+
if (platform === 'linux') systemBrowser = discoverLinuxBrowser();
|
|
174
|
+
if (platform === 'win32') systemBrowser = discoverWindowsBrowser(env);
|
|
175
|
+
return systemBrowser || executable(options.managedBrowserPath, 'managed-chromium');
|
|
163
176
|
}
|
|
164
177
|
const externalCdpInput = String(options.externalCdpUrl || env.FARMING_BROWSER_CDP_URL || '').trim();
|
|
165
178
|
if (externalCdpInput) {
|
|
@@ -177,10 +190,11 @@ function discoverBrowserExecutable(options = {}) {
|
|
|
177
190
|
if (configured) {
|
|
178
191
|
return executable(path.resolve(configured), 'custom');
|
|
179
192
|
}
|
|
180
|
-
|
|
181
|
-
if (platform === '
|
|
182
|
-
if (platform === '
|
|
183
|
-
|
|
193
|
+
let systemBrowser = null;
|
|
194
|
+
if (platform === 'darwin') systemBrowser = discoverMacBrowser();
|
|
195
|
+
if (platform === 'linux') systemBrowser = discoverLinuxBrowser();
|
|
196
|
+
if (platform === 'win32') systemBrowser = discoverWindowsBrowser(env);
|
|
197
|
+
return systemBrowser || executable(options.managedBrowserPath, 'managed-chromium');
|
|
184
198
|
}
|
|
185
199
|
|
|
186
200
|
async function discoverBrowserRuntime(options = {}) {
|