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.
Files changed (38) hide show
  1. package/README.md +25 -66
  2. package/README.zh_cn.md +15 -66
  3. package/backend/acp-runtime.js +1 -15
  4. package/backend/acp-session-state.js +78 -88
  5. package/backend/agent-session-history.js +45 -12
  6. package/backend/codex-session-history.js +1 -1
  7. package/backend/codex-transcript.js +0 -202
  8. package/backend/config-manager.js +3 -19
  9. package/backend/farming-app-cli.js +1 -1
  10. package/backend/farming-cli.js +3 -57
  11. package/backend/index-html.js +21 -3
  12. package/backend/main-agent-skills.js +1 -18
  13. package/backend/server.js +6 -48
  14. package/backend/storage-layout.js +15 -0
  15. package/backend/update-service.js +55 -935
  16. package/config/farming.deploy.env.example +1 -1
  17. package/config/farming.install.env.example +1 -1
  18. package/dist/acp/codex-acp-1.1.4.mjs +387 -7
  19. package/dist/assets/App-Z1N7T0eM.js +695 -0
  20. package/dist/assets/{ProjectFilesSection-Cf2BEcAN.js → ProjectFilesSection-K3GHuQ4U.js} +2 -2
  21. package/dist/assets/code-dark-kLsQLvpf.css +1 -0
  22. package/dist/assets/{index-CQNaZc3l.js → index-D-zetSol.js} +2 -2
  23. package/dist/assets/main-DUTz-Rd2.css +1 -0
  24. package/dist/index.html +2 -1
  25. package/extensions/browser/backend/browser-resource-manager.js +27 -5
  26. package/extensions/browser/backend/browser-router.js +8 -0
  27. package/extensions/browser/backend/executable-discovery.js +26 -12
  28. package/extensions/browser/backend/managed-chromium-installer.js +593 -0
  29. package/extensions/browser/frontend/types.ts +8 -1
  30. package/extensions/browser/frontend/useBrowserResources.ts +8 -0
  31. package/index.html +1 -0
  32. package/package.json +1 -1
  33. package/backend/agent-memory-report.js +0 -583
  34. package/backend/bundle-update-helper.js +0 -113
  35. package/backend/codex-rollout-follower.js +0 -326
  36. package/dist/assets/App-Ex2oVVXO.js +0 -693
  37. package/dist/assets/code-dark-BEZTQwYZ.css +0 -1
  38. 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-CQNaZc3l.js"></script>
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 ? () => [] : () => discoverBrowserExecutables(options));
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 agent-browser and a Chromium-based browser, or configure a loopback external CDP endpoint')),
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: settings?.browserSource === 'external-cdp' ? 'external-cdp' : 'system',
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 agent-browser and a Chromium-based browser, or configure a loopback external CDP endpoint',
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 agent-browser and a Chromium-based browser, or configure a loopback external CDP endpoint',
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
- if (platform === 'darwin') return uniqueExecutables(macBrowserCandidates());
113
- if (platform === 'linux') return uniqueExecutables(linuxBrowserCandidates());
114
- if (platform === 'win32') return uniqueExecutables(windowsBrowserCandidates(env));
115
- return [];
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
- if (platform === 'darwin') return discoverMacBrowser();
160
- if (platform === 'linux') return discoverLinuxBrowser();
161
- if (platform === 'win32') return discoverWindowsBrowser(env);
162
- return null;
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
- if (platform === 'darwin') return discoverMacBrowser();
181
- if (platform === 'linux') return discoverLinuxBrowser();
182
- if (platform === 'win32') return discoverWindowsBrowser(env);
183
- return null;
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 = {}) {