@ours.network/fleet 1.2.0-nightly.30 → 1.2.0-nightly.32

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 (160) hide show
  1. package/dist/build-info.json +4 -4
  2. package/dist/cli.js +48 -16
  3. package/dist/minimal-setup.d.ts +2 -0
  4. package/dist/minimal-setup.js +43 -0
  5. package/dist/web/available-port.d.ts +2 -0
  6. package/dist/web/available-port.js +23 -0
  7. package/dist/web/runtime.js +17 -2
  8. package/dist/web/service.d.ts +5 -0
  9. package/dist/web/service.js +8 -0
  10. package/dist/web-app/assets/FleetApp-D58F4xje.css +1 -0
  11. package/dist/web-app/assets/FleetApp-Gjz3h8uS.js +302 -0
  12. package/dist/web-app/assets/FleetApp-Gjz3h8uS.js.map +1 -0
  13. package/dist/web-app/assets/abnfDiagram-VCTEODGH-t4h5V8Cs.js +2 -0
  14. package/dist/web-app/assets/abnfDiagram-VCTEODGH-t4h5V8Cs.js.map +1 -0
  15. package/dist/web-app/assets/arc-DbufDTF6.js +2 -0
  16. package/dist/web-app/assets/arc-DbufDTF6.js.map +1 -0
  17. package/dist/web-app/assets/architectureDiagram-5GKGNRK7-D6K8jMN5.js +37 -0
  18. package/dist/web-app/assets/architectureDiagram-5GKGNRK7-D6K8jMN5.js.map +1 -0
  19. package/dist/web-app/assets/blockDiagram-I7D4REHJ-CWvkET2x.js +130 -0
  20. package/dist/web-app/assets/blockDiagram-I7D4REHJ-CWvkET2x.js.map +1 -0
  21. package/dist/web-app/assets/browser-B7y08DsC.js +9 -0
  22. package/dist/web-app/assets/browser-B7y08DsC.js.map +1 -0
  23. package/dist/web-app/assets/c4Diagram-7LVT6UL2-RNWA7VnD.js +39 -0
  24. package/dist/web-app/assets/c4Diagram-7LVT6UL2-RNWA7VnD.js.map +1 -0
  25. package/dist/web-app/assets/channel-BF3U9sI8.js +2 -0
  26. package/dist/web-app/assets/channel-BF3U9sI8.js.map +1 -0
  27. package/dist/web-app/assets/chunk-2Q5K7J3B-pdEuY4vj.js +2 -0
  28. package/dist/web-app/assets/chunk-2Q5K7J3B-pdEuY4vj.js.map +1 -0
  29. package/dist/web-app/assets/chunk-5VM5RSS4-DuAUtdUC.js +16 -0
  30. package/dist/web-app/assets/chunk-5VM5RSS4-DuAUtdUC.js.map +1 -0
  31. package/dist/web-app/assets/chunk-F27PBJKO-6kpb80Xt.js +2 -0
  32. package/dist/web-app/assets/chunk-F27PBJKO-6kpb80Xt.js.map +1 -0
  33. package/dist/web-app/assets/chunk-IMKFNOWR-DWC84P6A.js +232 -0
  34. package/dist/web-app/assets/chunk-IMKFNOWR-DWC84P6A.js.map +1 -0
  35. package/dist/web-app/assets/chunk-JWPE2WC7-FHO-M3vi.js +2 -0
  36. package/dist/web-app/assets/chunk-JWPE2WC7-FHO-M3vi.js.map +1 -0
  37. package/dist/web-app/assets/chunk-POPQ4Y6H-CjnlKvmR.js +2 -0
  38. package/dist/web-app/assets/chunk-POPQ4Y6H-CjnlKvmR.js.map +1 -0
  39. package/dist/web-app/assets/chunk-SVP7TREG-WHYWJ6xq.js +89 -0
  40. package/dist/web-app/assets/chunk-SVP7TREG-WHYWJ6xq.js.map +1 -0
  41. package/dist/web-app/assets/chunk-TICWLB2K-POupMpyL.js +207 -0
  42. package/dist/web-app/assets/chunk-TICWLB2K-POupMpyL.js.map +1 -0
  43. package/dist/web-app/assets/chunk-XXDRQBXY-Cw5HHqH-.js +2 -0
  44. package/dist/web-app/assets/chunk-XXDRQBXY-Cw5HHqH-.js.map +1 -0
  45. package/dist/web-app/assets/classDiagram-ZZMXUADV-1hdMzIme.js +2 -0
  46. package/dist/web-app/assets/classDiagram-ZZMXUADV-1hdMzIme.js.map +1 -0
  47. package/dist/web-app/assets/classDiagram-v2-VYDZK3BY-1hdMzIme.js +2 -0
  48. package/dist/web-app/assets/classDiagram-v2-VYDZK3BY-1hdMzIme.js.map +1 -0
  49. package/dist/web-app/assets/cose-bilkent-JH36ORCC-Cp6Hjine.js +2 -0
  50. package/dist/web-app/assets/cose-bilkent-JH36ORCC-Cp6Hjine.js.map +1 -0
  51. package/dist/web-app/assets/cynefin-OW5HDTMX-DI-DeNUk.js +179 -0
  52. package/dist/web-app/assets/cynefin-OW5HDTMX-DI-DeNUk.js.map +1 -0
  53. package/dist/web-app/assets/cynefinDiagram-5FMLGOSQ-todBCANI.js +63 -0
  54. package/dist/web-app/assets/cynefinDiagram-5FMLGOSQ-todBCANI.js.map +1 -0
  55. package/dist/web-app/assets/cytoscape.esm-CtNdOvlO.js +332 -0
  56. package/dist/web-app/assets/cytoscape.esm-CtNdOvlO.js.map +1 -0
  57. package/dist/web-app/assets/dagre-GXQ25YYZ-BvIVo7eh.js +5 -0
  58. package/dist/web-app/assets/dagre-GXQ25YYZ-BvIVo7eh.js.map +1 -0
  59. package/dist/web-app/assets/defaultLocale-DX6XiGOO.js +2 -0
  60. package/dist/web-app/assets/defaultLocale-DX6XiGOO.js.map +1 -0
  61. package/dist/web-app/assets/diagram-S7CK7UJ4-k9vDGlB5.js +31 -0
  62. package/dist/web-app/assets/diagram-S7CK7UJ4-k9vDGlB5.js.map +1 -0
  63. package/dist/web-app/assets/diagram-UQ7AKVKN-Bv7BT1dE.js +42 -0
  64. package/dist/web-app/assets/diagram-UQ7AKVKN-Bv7BT1dE.js.map +1 -0
  65. package/dist/web-app/assets/diagram-VSXAHHWV-m9I9AumX.js +4 -0
  66. package/dist/web-app/assets/diagram-VSXAHHWV-m9I9AumX.js.map +1 -0
  67. package/dist/web-app/assets/diagram-VX7I27RA-4VJ2qozS.js +25 -0
  68. package/dist/web-app/assets/diagram-VX7I27RA-4VJ2qozS.js.map +1 -0
  69. package/dist/web-app/assets/diagram-Z3DM3KII-CvH8JIEd.js +25 -0
  70. package/dist/web-app/assets/diagram-Z3DM3KII-CvH8JIEd.js.map +1 -0
  71. package/dist/web-app/assets/ebnfDiagram-PWID7BFC-DAGs23hd.js +2 -0
  72. package/dist/web-app/assets/ebnfDiagram-PWID7BFC-DAGs23hd.js.map +1 -0
  73. package/dist/web-app/assets/erDiagram-RLTQ6QDP-CEMyWKIa.js +100 -0
  74. package/dist/web-app/assets/erDiagram-RLTQ6QDP-CEMyWKIa.js.map +1 -0
  75. package/dist/web-app/assets/flowDiagram-HODETNUW-BnraxJTV.js +169 -0
  76. package/dist/web-app/assets/flowDiagram-HODETNUW-BnraxJTV.js.map +1 -0
  77. package/dist/web-app/assets/ganttDiagram-EL5Y4UJY-V6d4ICW0.js +293 -0
  78. package/dist/web-app/assets/ganttDiagram-EL5Y4UJY-V6d4ICW0.js.map +1 -0
  79. package/dist/web-app/assets/gitGraphDiagram-WWUBYQGX-Bj_gqcba.js +107 -0
  80. package/dist/web-app/assets/gitGraphDiagram-WWUBYQGX-Bj_gqcba.js.map +1 -0
  81. package/dist/web-app/assets/index-C4BdeFB9.css +1 -0
  82. package/dist/web-app/assets/index-i9rKiqYX.js +430 -0
  83. package/dist/web-app/assets/index-i9rKiqYX.js.map +1 -0
  84. package/dist/web-app/assets/infoDiagram-27XIBGKW-Dfm89NLl.js +3 -0
  85. package/dist/web-app/assets/infoDiagram-27XIBGKW-Dfm89NLl.js.map +1 -0
  86. package/dist/web-app/assets/init-Gi6I4Gst.js +2 -0
  87. package/dist/web-app/assets/init-Gi6I4Gst.js.map +1 -0
  88. package/dist/web-app/assets/ishikawaDiagram-5VMMS53U-D-ISiJTS.js +71 -0
  89. package/dist/web-app/assets/ishikawaDiagram-5VMMS53U-D-ISiJTS.js.map +1 -0
  90. package/dist/web-app/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  91. package/dist/web-app/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  92. package/dist/web-app/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  93. package/dist/web-app/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  94. package/dist/web-app/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  95. package/dist/web-app/assets/journeyDiagram-3NMN7TZE-TTySrzws.js +140 -0
  96. package/dist/web-app/assets/journeyDiagram-3NMN7TZE-TTySrzws.js.map +1 -0
  97. package/dist/web-app/assets/kanban-definition-UXKFOSKX-BxntsBft.js +90 -0
  98. package/dist/web-app/assets/kanban-definition-UXKFOSKX-BxntsBft.js.map +1 -0
  99. package/dist/web-app/assets/katex-HP8lGamR.js +258 -0
  100. package/dist/web-app/assets/katex-HP8lGamR.js.map +1 -0
  101. package/dist/web-app/assets/layout-0sZak8Ho.js +2 -0
  102. package/dist/web-app/assets/layout-0sZak8Ho.js.map +1 -0
  103. package/dist/web-app/assets/linear-D4xk4kUi.js +2 -0
  104. package/dist/web-app/assets/linear-D4xk4kUi.js.map +1 -0
  105. package/dist/web-app/assets/mermaid.core-CNKolAgz.js +313 -0
  106. package/dist/web-app/assets/mermaid.core-CNKolAgz.js.map +1 -0
  107. package/dist/web-app/assets/mindmap-definition-YA3MSWOX-DLJijY_l.js +97 -0
  108. package/dist/web-app/assets/mindmap-definition-YA3MSWOX-DLJijY_l.js.map +1 -0
  109. package/dist/web-app/assets/ordinal-Cboi1Yqb.js +2 -0
  110. package/dist/web-app/assets/ordinal-Cboi1Yqb.js.map +1 -0
  111. package/dist/web-app/assets/pegDiagram-XKGWAZYB-xjrh9rBd.js +2 -0
  112. package/dist/web-app/assets/pegDiagram-XKGWAZYB-xjrh9rBd.js.map +1 -0
  113. package/dist/web-app/assets/pieDiagram-E7YTZNPT-CHE8ZMXN.js +40 -0
  114. package/dist/web-app/assets/pieDiagram-E7YTZNPT-CHE8ZMXN.js.map +1 -0
  115. package/dist/web-app/assets/quadrantDiagram-AXDQQJYC-CDlEe9sg.js +8 -0
  116. package/dist/web-app/assets/quadrantDiagram-AXDQQJYC-CDlEe9sg.js.map +1 -0
  117. package/dist/web-app/assets/railroadDiagram-O6MQD6OU-Dv7lFZ_v.js +2 -0
  118. package/dist/web-app/assets/railroadDiagram-O6MQD6OU-Dv7lFZ_v.js.map +1 -0
  119. package/dist/web-app/assets/requirementDiagram-BXWQKSXE-BetEel-k.js +85 -0
  120. package/dist/web-app/assets/requirementDiagram-BXWQKSXE-BetEel-k.js.map +1 -0
  121. package/dist/web-app/assets/sankeyDiagram-P5KCCOFB-DCQgLfvK.js +41 -0
  122. package/dist/web-app/assets/sankeyDiagram-P5KCCOFB-DCQgLfvK.js.map +1 -0
  123. package/dist/web-app/assets/sequenceDiagram-WJ2MYXX4-CsGOoqu_.js +163 -0
  124. package/dist/web-app/assets/sequenceDiagram-WJ2MYXX4-CsGOoqu_.js.map +1 -0
  125. package/dist/web-app/assets/sizeCapture-INFHLROL-CLQRMiEc.js +2 -0
  126. package/dist/web-app/assets/sizeCapture-INFHLROL-CLQRMiEc.js.map +1 -0
  127. package/dist/web-app/assets/stateDiagram-D77RDMKH-D2MRdC5Q.js +2 -0
  128. package/dist/web-app/assets/stateDiagram-D77RDMKH-D2MRdC5Q.js.map +1 -0
  129. package/dist/web-app/assets/stateDiagram-v2-MP3YSRHH-CToAT5fD.js +2 -0
  130. package/dist/web-app/assets/stateDiagram-v2-MP3YSRHH-CToAT5fD.js.map +1 -0
  131. package/dist/web-app/assets/swimlanes-42K2YHIH-BGjHfR8x.js +2 -0
  132. package/dist/web-app/assets/swimlanes-42K2YHIH-BGjHfR8x.js.map +1 -0
  133. package/dist/web-app/assets/swimlanesDiagram-VR7AAH4N-bLHg88Vk.js +9 -0
  134. package/dist/web-app/assets/swimlanesDiagram-VR7AAH4N-bLHg88Vk.js.map +1 -0
  135. package/dist/web-app/assets/timeline-definition-24CTP7MA-DhGtHQ0p.js +121 -0
  136. package/dist/web-app/assets/timeline-definition-24CTP7MA-DhGtHQ0p.js.map +1 -0
  137. package/dist/web-app/assets/vennDiagram-4TSXK5OY-Dv5irf00.js +35 -0
  138. package/dist/web-app/assets/vennDiagram-4TSXK5OY-Dv5irf00.js.map +1 -0
  139. package/dist/web-app/assets/wardleyDiagram-VM6X3IG4-JGiUTj5x.js +79 -0
  140. package/dist/web-app/assets/wardleyDiagram-VM6X3IG4-JGiUTj5x.js.map +1 -0
  141. package/dist/web-app/assets/xychartDiagram-S5SC5T6Z-Dw5ev7_Q.js +8 -0
  142. package/dist/web-app/assets/xychartDiagram-S5SC5T6Z-Dw5ev7_Q.js.map +1 -0
  143. package/dist/web-app/fleet-index.html +19 -0
  144. package/dist/web-app/fleet.webmanifest +37 -0
  145. package/dist/web-app/icons/apple-touch-icon.png +0 -0
  146. package/dist/web-app/icons/favicon-16.png +0 -0
  147. package/dist/web-app/icons/favicon-32.png +0 -0
  148. package/dist/web-app/icons/icon-192-maskable.png +0 -0
  149. package/dist/web-app/icons/icon-192.png +0 -0
  150. package/dist/web-app/icons/icon-512-maskable.png +0 -0
  151. package/dist/web-app/icons/icon-512.png +0 -0
  152. package/dist/web-app/index.html +19 -0
  153. package/dist/web-app/manifest.webmanifest +17 -0
  154. package/dist/web-app/sw.js +221 -0
  155. package/dist/web-app/version.json +1 -0
  156. package/dist/web-app/workspace-install.sh +148 -0
  157. package/dist/web-app/workspace-tunnel.sh +40 -0
  158. package/dist/workspace-enrollment.d.ts +3 -0
  159. package/dist/workspace-enrollment.js +18 -1
  160. package/package.json +2 -2
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "1.2.0-nightly.30",
3
- "buildId": "a2babf441212",
4
- "commit": "3cd486a81e62d5bd2c345c0d73cb443aee02dee1",
2
+ "version": "1.2.0-nightly.32",
3
+ "buildId": "199550205158",
4
+ "commit": "22c8e5fe504d1ac013dfcce0269a46a9ca6a66b6",
5
5
  "dirty": true,
6
- "builtAt": "2026-10-01T21:40:11.246Z",
6
+ "builtAt": "2026-10-02T08:03:30.874Z",
7
7
  "capabilities": [
8
8
  "workspace.enroll.preserve-profile-v1",
9
9
  "cowork.http-management-v1",
package/dist/cli.js CHANGED
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import { ensureMinimalSetup } from './minimal-setup.js';
3
+ import { configureWorkspacePort } from './workspace-enrollment.js';
4
+ import { availableWebPort } from './web/available-port.js';
2
5
  import QRCode from 'qrcode';
3
6
  import { readWorkspacePayload, enrollWorkspace } from './workspace-enrollment.js';
4
7
  import { waitForRoleDaemon } from './startup-readiness.js';
@@ -6,7 +9,7 @@ import { SupervisorOursTools } from './application/supervisor-ours-tools.js';
6
9
  import { runTempSupervisor, TEMP_RECYCLE_EXIT } from './temp-supervisor-recovery.js';
7
10
  import { spawn as spawnChild } from 'node:child_process';
8
11
  import { randomUUID } from 'node:crypto';
9
- import { existsSync, mkdirSync, readFileSync, statSync } from 'node:fs';
12
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync, rmSync } from 'node:fs';
10
13
  import { realpathSync } from 'node:fs';
11
14
  import { join as joinPath, resolve as resolvePath } from 'node:path';
12
15
  import { createInterface } from 'node:readline';
@@ -16,7 +19,7 @@ import { INIT_COMPLETION_GUIDANCE } from './init-guidance.js';
16
19
  import { migrateLegacyStarterPresets, migratePackagedRoleDefaults } from './preset-migration.js';
17
20
  import { executeInitAnswers, executeInitWizard, isInteractiveTerminal, publishSetup, readInitSettings, TerminalPrompter, } from './init-wizard.js';
18
21
  import { analyzeInstalls, buildInfo, buildLabel, discoverInstalls, runningLabel, } from './provenance.js';
19
- import { agentDir, agentsRoot, tmpRoot, logsRoot, deriveXdgRuntimeDir, defaultConfigPath } from './paths.js';
22
+ import { agentDir, agentsRoot, tmpRoot, logsRoot, deriveXdgRuntimeDir, defaultConfigPath, stateRoot } from './paths.js';
20
23
  import { findRole, loadConfig, ROLE_NAME_RE } from './config.js';
21
24
  import { formatDuration } from './duration.js';
22
25
  import { redactSensitive, resolvedPlan, resolvedRolePlan } from './resolved-plan.js';
@@ -1529,23 +1532,43 @@ webCommand.command('open').description('securely open or re-pair a browser with
1529
1532
  die(e);
1530
1533
  }
1531
1534
  });
1532
- cOpt(program.command('workspace-enroll').description('enroll this host using a private account setup file'))
1533
- .requiredOption('--file <path>', 'owned private payload file')
1534
- .option('--preserve-profile', 'retain the existing human profile without creating or rewriting it')
1535
- .option('--migrate-app-origin', 'explicitly migrate the same workspace to its new account origin after verified signed proof')
1536
- .action(async (opts) => {
1535
+ async function workspaceEnrollmentCommand(opts, setupTunnel = false) {
1537
1536
  try {
1538
- const result = await enrollWorkspace(readWorkspacePayload(opts.file), opts.configuration, { migrateAppOrigin: opts.migrateAppOrigin, preserveProfile: opts.preserveProfile });
1537
+ const payload = readWorkspacePayload(opts.file);
1538
+ if (setupTunnel)
1539
+ await ensureMinimalSetup(opts.configuration ?? defaultConfigPath());
1540
+ const result = await enrollWorkspace(payload, opts.configuration, { migrateAppOrigin: opts.migrateAppOrigin, preserveProfile: setupTunnel || opts.preserveProfile });
1539
1541
  if (!existsSync(new WebAccessStore().path))
1540
1542
  configureWebAccess({ pairing: true });
1541
- const manager = new WebServiceManager();
1542
- await manager.install(binPath, 49271, opts.configuration, { bind: '127.0.0.1', publicOrigin: result.origin });
1543
+ const manager = new WebServiceManager(), previous = manager.readMetadata();
1544
+ if (previous)
1545
+ await manager.stop();
1546
+ const selectedPort = await availableWebPort(previous?.port ?? 49271);
1547
+ mkdirSync(joinPath(stateRoot(), 'web'), { recursive: true, mode: 0o700 });
1548
+ writeFileSync(joinPath(stateRoot(), 'web', 'port-selection.json'), JSON.stringify({ expiresAt: Date.now() + 60000 }) + '\n', { mode: 0o600 });
1549
+ await manager.install(binPath, selectedPort, opts.configuration, { bind: '127.0.0.1', publicOrigin: result.origin });
1543
1550
  await manager.restart();
1544
- const controlDeadline = Date.now() + 20000;
1545
- while (!existsSync(webControlPath())) {
1546
- if (Date.now() >= controlDeadline)
1547
- throw Error('Fleet backend did not become ready within 20 seconds. Run ours-fleet web status; on Linux inspect journalctl --user -u ours-fleet-web.service -n 25 --no-pager. Resolve the startup error before running ours-fleet link-device');
1548
- await new Promise(resolve => setTimeout(resolve, 200));
1551
+ const waitForControl = async () => {
1552
+ const controlDeadline = Date.now() + 20000;
1553
+ while (!existsSync(webControlPath())) {
1554
+ if (Date.now() >= controlDeadline)
1555
+ throw Error('Fleet backend did not become ready within 20 seconds. Run ours-fleet web status; on Linux inspect journalctl --user -u ours-fleet-web.service -n 25 --no-pager. Resolve the startup error before running ours-fleet link-device');
1556
+ await new Promise(resolve => setTimeout(resolve, 200));
1557
+ }
1558
+ };
1559
+ await waitForControl();
1560
+ const bound = JSON.parse(readFileSync(joinPath(stateRoot(), 'web', 'workspace-port.json'), 'utf8'));
1561
+ if (!Number.isInteger(bound.port) || bound.port < 1 || bound.port > 65535)
1562
+ throw Error('Invalid workspace listener port');
1563
+ if (bound.port !== selectedPort) {
1564
+ await manager.retainBoundPort(binPath, bound.port, opts.configuration, { bind: '127.0.0.1', publicOrigin: result.origin });
1565
+ await waitForControl();
1566
+ }
1567
+ await configureWorkspacePort(payload, result.hostWorkspaceId, result.rootCid, bound.port);
1568
+ rmSync(joinPath(stateRoot(), 'web', 'port-selection.json'), { force: true });
1569
+ if (setupTunnel) {
1570
+ process.stdout.write('Tunnel setup submitted. Check verified binding and tunnel health in the App, then run ours-fleet link-device and paste its private code. Configure Fleet agents and models in the App after linking.\n');
1571
+ return;
1549
1572
  }
1550
1573
  const link = await requestWebControl('link-device');
1551
1574
  const code = Buffer.from(JSON.stringify(link)).toString('base64url');
@@ -1556,7 +1579,16 @@ cOpt(program.command('workspace-enroll').description('enroll this host using a p
1556
1579
  catch (error) {
1557
1580
  die(error);
1558
1581
  }
1559
- });
1582
+ }
1583
+ cOpt(program.command('workspace-enroll').description('enroll this host using a private account setup file'))
1584
+ .requiredOption('--file <path>', 'owned private payload file')
1585
+ .option('--preserve-profile', 'retain the existing human profile without creating or rewriting it')
1586
+ .option('--migrate-app-origin', 'explicitly migrate the same workspace to its new account origin after verified signed proof')
1587
+ .action(async (opts) => workspaceEnrollmentCommand(opts));
1588
+ cOpt(program.command('setup-tunnel').description('connect an installed host using scoped expiring App credentials; preserves identities and agent configuration'))
1589
+ .requiredOption('--file <path>', 'owned private App payload file (chmod 600)')
1590
+ .option('--migrate-app-origin', 'explicitly migrate the same workspace to its new account origin after verified signed proof')
1591
+ .action(async (opts) => workspaceEnrollmentCommand(opts, true));
1560
1592
  program.command('link-device').description('create a single-use workspace device connection code (expires in five minutes)')
1561
1593
  .action(async () => {
1562
1594
  try {
@@ -0,0 +1,2 @@
1
+ /** Prepare only the web configuration; App onboarding chooses agents and brains later. */
2
+ export declare function ensureMinimalSetup(configuration: string): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import { existsSync, linkSync, mkdirSync, mkdtempSync, renameSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ import { withFileLock } from './atomic-file.js';
4
+ import { loadConfig, splitRootFor } from './config.js';
5
+ import { preflightInitPaths } from './init-wizard.js';
6
+ /** Prepare only the web configuration; App onboarding chooses agents and brains later. */
7
+ export async function ensureMinimalSetup(configuration) {
8
+ const initial = preflightInitPaths(configuration);
9
+ await withFileLock(join(initial.parent, `.${basename(initial.splitRoot)}.init.lock`), async () => {
10
+ const selected = preflightInitPaths(configuration);
11
+ if (selected.manifestExisted) {
12
+ loadConfig(selected.configPath, { yamlMode: 'strict' });
13
+ return;
14
+ }
15
+ if (selected.rootExisted)
16
+ throw new Error('Fleet split configuration exists without its manifest; retain it and recover the existing setup before setting up a tunnel');
17
+ const stage = mkdtempSync(join(selected.parent, '.fleet-web-setup-'));
18
+ const manifest = join(stage, 'fleet.yaml');
19
+ const root = splitRootFor(manifest);
20
+ let publishedRoot = false;
21
+ try {
22
+ mkdirSync(join(root, 'agents'), { recursive: true, mode: 0o700 });
23
+ writeFileSync(manifest, 'api_version: ours.network/fleet/v2\n', { mode: 0o600, flag: 'wx' });
24
+ loadConfig(manifest, { yamlMode: 'strict' });
25
+ if (existsSync(selected.splitRoot) || existsSync(selected.configPath))
26
+ throw new Error('Fleet setup targets changed; refusing replacement');
27
+ renameSync(root, selected.splitRoot);
28
+ publishedRoot = true;
29
+ // Same-filesystem link publishes without replacing an unexpected manifest.
30
+ linkSync(manifest, selected.configPath);
31
+ unlinkSync(manifest);
32
+ loadConfig(selected.configPath, { yamlMode: 'strict' });
33
+ }
34
+ catch (cause) {
35
+ if (publishedRoot)
36
+ throw new Error('Minimal Fleet setup stopped after publishing its empty split directory; existing files were retained for recovery', { cause });
37
+ throw cause;
38
+ }
39
+ finally {
40
+ rmSync(stage, { recursive: true, force: true });
41
+ }
42
+ });
43
+ }
@@ -0,0 +1,2 @@
1
+ /** Bind the preferred loopback port; only EADDRINUSE permits an OS-selected replacement. */
2
+ export declare function availableWebPort(preferred: number): Promise<number>;
@@ -0,0 +1,23 @@
1
+ import { createServer } from 'node:net';
2
+ /** Bind the preferred loopback port; only EADDRINUSE permits an OS-selected replacement. */
3
+ export async function availableWebPort(preferred) {
4
+ const server = createServer();
5
+ const listen = (port) => new Promise((resolve, reject) => {
6
+ server.once('error', reject);
7
+ server.listen(port, '127.0.0.1', () => { server.removeListener('error', reject); resolve(); });
8
+ });
9
+ try {
10
+ await listen(preferred);
11
+ }
12
+ catch (error) {
13
+ if (error.code !== 'EADDRINUSE')
14
+ throw error;
15
+ await listen(0);
16
+ }
17
+ const address = server.address();
18
+ if (!address || typeof address === 'string')
19
+ throw Error('No loopback port selected');
20
+ const port = address.port;
21
+ await new Promise((resolve, reject) => server.close(error => error ? reject(error) : resolve()));
22
+ return port;
23
+ }
@@ -1,3 +1,4 @@
1
+ import { replaceFileAtomically } from '../atomic-file.js';
1
2
  import { validateAccountOrigin } from '../account-origin.js';
2
3
  import { startWorkspaceTunnel } from './workspace-tunnel.js';
3
4
  import { createPrefixGateway } from './prefix-gateway.js';
@@ -61,7 +62,7 @@ function cachedConfigProvider(configPath) {
61
62
  }
62
63
  export async function startWebConsole(options) {
63
64
  const notificationConfig = producerConfig();
64
- const requestedPort = options.port ?? 49_271;
65
+ let requestedPort = options.port ?? 49_271;
65
66
  if (!Number.isInteger(requestedPort) || requestedPort < 0 || requestedPort > 65_535)
66
67
  throw new FleetError('invalid_request', 'port must be between 0 and 65535');
67
68
  const webDir = options.webStateDir ?? resolve(stateRoot(), 'web');
@@ -234,7 +235,21 @@ export async function startWebConsole(options) {
234
235
  const basePath = provider.pathname.replace(/\/$/, '');
235
236
  const services = ['daemon', 'cowork', 'messenger'].map(name => ({ prefix: '/' + name, origin: provider.origin, upstreamPrefix: basePath + '/' + name, stripBrowserContext: true, headers: { 'X-Ours-Api-Token': credential, ...(name === 'messenger' ? { Origin: provider.origin, 'X-Ours-Messenger-CSRF': '1' } : name === 'cowork' ? { Origin: provider.origin } : {}) } }));
236
237
  gateway = createPrefixGateway({ auth: server.auth, fleetOrigin: address, services });
237
- await new Promise((resolve, reject) => { gateway.server.once('error', reject); gateway.server.listen(requestedPort, bind, () => { gateway.server.off('error', reject); resolve(); }); });
238
+ const listen = (port) => new Promise((resolve, reject) => { gateway.server.once('error', reject); gateway.server.listen(port, bind, () => { gateway.server.off('error', reject); resolve(); }); });
239
+ try {
240
+ await listen(requestedPort);
241
+ }
242
+ catch (error) {
243
+ const selection = resolve(webDir, 'port-selection.json');
244
+ if (error.code !== 'EADDRINUSE' || !existsSync(selection) || JSON.parse(readPrivateFile(selection, 4096).toString()).expiresAt <= Date.now())
245
+ throw error;
246
+ await listen(0);
247
+ }
248
+ const bound = gateway.server.address();
249
+ if (!bound || typeof bound === 'string')
250
+ throw Error('Workspace listener did not bind');
251
+ requestedPort = bound.port;
252
+ replaceFileAtomically(resolve(webDir, 'workspace-port.json'), JSON.stringify({ port: requestedPort }) + '\n', 0o600);
238
253
  }
239
254
  catch (error) {
240
255
  await gateway?.close().catch(() => { });
@@ -37,6 +37,11 @@ export declare class WebServiceManager {
37
37
  bind?: string;
38
38
  publicOrigin?: string;
39
39
  }): Promise<string[]>;
40
+ /** Persist an enrollment bind fallback, reloading launchd's cached definition. */
41
+ retainBoundPort(script: string, port: number, configuration?: string, web?: {
42
+ bind?: string;
43
+ publicOrigin?: string;
44
+ }): Promise<void>;
40
45
  start(): Promise<void>;
41
46
  stop(): Promise<void>;
42
47
  restart(): Promise<void>;
@@ -66,6 +66,14 @@ export class WebServiceManager {
66
66
  }
67
67
  return [`installed ${this.definitionPath}`, 'launchd service starts at login'];
68
68
  }
69
+ /** Persist an enrollment bind fallback, reloading launchd's cached definition. */
70
+ async retainBoundPort(script, port, configuration, web = {}) {
71
+ await this.install(script, port, configuration, web);
72
+ if (this.platform === 'darwin') {
73
+ await this.stop();
74
+ await this.start();
75
+ }
76
+ }
69
77
  async start() {
70
78
  this.requireInstalled();
71
79
  if (this.platform === 'linux') {
@@ -0,0 +1 @@
1
+ .fleet-acp{height:100%;min-height:0;min-width:0;display:flex;flex-direction:column;background:var(--acp-color-bg-primary);color:var(--acp-color-text-primary);font-size:15px}.fleet-acp-header{display:flex;align-items:center;gap:12px;padding:14px 18px;border-bottom:1px solid var(--acp-color-border)}.fleet-acp-header>div{flex:1;min-width:0;overflow-wrap:anywhere}.fleet-acp-header small{display:block;margin-top:4px;color:var(--acp-color-text-secondary)}.fleet-acp-scroll{flex:1;overflow:auto;min-height:0;overscroll-behavior:contain}.fleet-acp-thread{max-width:820px;margin:auto;padding:24px 24px 16px;min-width:0}.fleet-acp-message>small{display:block;margin-bottom:8px;color:var(--acp-color-text-secondary);font-size:12px}.fleet-acp-message [class*=title],.fleet-acp-message [class*=Title]{white-space:normal!important;overflow-wrap:anywhere}.fleet-acp-message [class*=header]{min-width:0}.fleet-acp-empty{text-align:center;padding:48px 0;color:var(--acp-color-text-secondary)}.fleet-acp-empty h2{font-size:24px;color:var(--acp-color-text-primary)}.fleet-acp-composer{width:100%;max-width:868px;align-self:center;padding:8px 24px 20px;box-sizing:border-box}.fleet-acp-state{display:flex;gap:8px;align-items:center;min-height:32px;color:var(--acp-color-text-secondary);font-size:13px}.fleet-acp-state>button{margin-left:auto}.fleet-acp .fleet-request,.fleet-acp [role=alert]{overflow-wrap:anywhere;min-width:0;max-width:100%}.fleet-acp .fleet-request p,.fleet-acp .fleet-request strong{white-space:pre-wrap;overflow-wrap:anywhere}.fleet-acp .fleet-request{padding:14px;border:1px solid var(--acp-color-border);border-radius:12px;margin:12px 0}.fleet-acp .fleet-request button{margin:4px}@media(max-width:600px){.fleet-acp-header{padding:10px;gap:8px}.fleet-acp-header button{font-size:12px}.fleet-acp-thread{padding:20px 14px 10px}.fleet-acp-composer{padding:8px 10px 12px}.fleet-acp-header strong{font-size:14px}}.fleet-chat-slot:not(.signal-stage){flex:1;min-height:0;overflow:hidden}.fleet-acp{--acp-color-bg-primary:var(--surface);--acp-color-bg-secondary:var(--surface-soft,var(--surface));--acp-color-text-primary:var(--text);--acp-color-accent:var(--accent);--acp-color-border:var(--line)}.fleet-acp .fleet-agent-request{min-width:0;overflow-wrap:anywhere;padding:14px;border:1px solid var(--acp-color-border);border-radius:12px;margin:12px 0}.fleet-acp .fleet-agent-request p{white-space:pre-wrap;overflow-wrap:anywhere}.fleet-acp .fleet-agent-request .fleet-actions{flex-wrap:wrap}.fleet-acp-header strong{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fleet-acp-header button{flex-shrink:0}.fleet-acp{--acp-color-text-secondary:var(--text-2)}.fleet-acp-header{padding:6px 12px;gap:8px;min-height:56px;box-sizing:border-box}.fleet-acp-header small{margin-top:2px;font-size:12px}.fleet-acp-header .icon-btn{border:0;background:transparent;box-shadow:none}.fleet-acp-message.user>small{color:var(--text);font-weight:600;margin-bottom:4px}.fleet-acp-input .fleet-acp-send{width:44px;height:44px;min-width:44px;padding:0;border-radius:50%;display:grid;place-items:center;flex-shrink:0}.fleet-acp-state{min-height:26px;font-size:12px}.fleet-acp-composer{padding-top:4px;padding-bottom:max(10px,env(safe-area-inset-bottom))}@media(max-width:600px){.fleet-acp-header{padding:4px 6px;gap:4px}.fleet-acp-header strong{font-size:14px}.fleet-acp-thread{padding:14px 12px 8px}.fleet-acp-composer{padding-left:10px;padding-right:10px}.fleet-acp-message>small{font-size:11px;margin-bottom:5px}}.fleet-acp{position:relative;isolation:isolate;--fleet-glass:color-mix(in srgb,var(--surface) 68%,transparent);--fleet-glass-rim:color-mix(in srgb,var(--text) 12%,transparent)}.fleet-acp-scroll{position:absolute;inset:0;scroll-padding-top:var(--fleet-acp-top,80px);scroll-padding-bottom:var(--fleet-acp-bottom,110px)}.fleet-acp-thread{padding-top:calc(var(--fleet-acp-top,80px) + env(safe-area-inset-top));padding-bottom:var(--fleet-acp-bottom,110px)}.fleet-acp-header{position:absolute;z-index:2;top:max(8px,env(safe-area-inset-top));left:12px;right:12px;padding:4px 8px;min-height:52px;border:0;border-radius:28px;background:var(--fleet-glass);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);box-shadow:0 4px 20px #00000012,inset 0 1px 0 var(--fleet-glass-rim),inset 0 0 0 .5px var(--fleet-glass-rim)}.fleet-acp-composer{position:absolute;z-index:2;bottom:max(8px,env(safe-area-inset-bottom));left:50%;transform:translate(-50%);width:calc(100% - 24px);max-width:820px;padding:0;background:transparent}.fleet-acp-state{width:fit-content;max-width:100%;padding:2px 10px;margin:0 0 4px 6px;border-radius:14px;background:var(--fleet-glass);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);font-size:12px;min-height:22px;box-sizing:border-box}.fleet-acp-header:before{content:"";position:absolute;inset:-12px -12px -10px;z-index:-1;pointer-events:none;background:linear-gradient(var(--surface),transparent);opacity:.3;mask-image:linear-gradient(#000,transparent)}.fleet-acp .icon-btn:active,.fleet-acp-send:active{opacity:.8}@media(prefers-reduced-transparency:reduce),(prefers-contrast:more){.fleet-acp{--fleet-glass:var(--surface)}.fleet-acp-header,.fleet-acp-state{backdrop-filter:none;-webkit-backdrop-filter:none}.fleet-acp-header:before{display:none}}@media(prefers-reduced-motion:reduce){.fleet-acp *{scroll-behavior:auto!important;transition:none!important;animation:none!important}}.fleet-command-suggestions{position:absolute;bottom:100%;left:0;right:0;max-height:min(260px,40dvh);overflow-y:auto;margin-bottom:8px;padding:6px;border:1px solid var(--acp-color-border);border-radius:14px;background:var(--acp-color-bg-secondary);box-shadow:0 8px 32px #0003}.fleet-command-suggestions button{display:flex;align-items:center;gap:12px;width:100%;min-height:44px;text-align:left;padding:8px 12px;border:0;border-radius:8px;background:transparent;color:inherit;cursor:pointer}.fleet-command-suggestions button[aria-selected=true]{background:var(--acp-color-bg-tertiary,#ffffff14)}.fleet-command-suggestions small{color:var(--acp-color-text-secondary)}.fleet-command-suggestions p{padding:8px 12px;margin:0;font-size:13px}.fleet-task-notice{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:16px 18px;margin:16px 0 24px;border:1px solid var(--acp-color-border);border-radius:16px;background:var(--acp-color-bg-secondary)}.fleet-task-notice small{color:var(--acp-color-text-secondary)}.fleet-task-notice strong{overflow-wrap:anywhere}.fleet-task-notice a{display:inline-flex;align-items:center;min-height:44px;color:inherit;text-underline-offset:4px}.fleet-voice-panel{position:absolute;bottom:calc(100% + 8px);left:0;right:0;max-height:45dvh;overflow:auto;padding:14px;border:1px solid var(--line);border-radius:20px;background:var(--surface);box-shadow:0 8px 32px #0002;display:grid;gap:10px}.fleet-voice-panel audio{width:100%;max-height:44px}.fleet-voice-panel .fleet-actions{display:flex;flex-wrap:wrap;gap:8px}.fleet-voice-panel p{margin:0;overflow-wrap:anywhere}.fleet-voice-transcript{white-space:pre-wrap;max-height:120px;overflow:auto}.fleet-live-voice{display:flex;flex-direction:column;align-items:center;text-align:center;padding:24px 12px;gap:16px}.fleet-live-voice h4,.fleet-live-voice p{margin:0}.fleet-live-voice>svg{color:var(--text-2)}.fleet-acp-input .vr-mic{width:44px;height:44px;min-width:44px;border-radius:50%;flex-shrink:0}.fleet-acp-input .voice-rec-overlay{border-radius:28px;padding:8px 12px;gap:8px;min-height:44px}.fleet-acp-input .vr-trash,.fleet-acp-input .vr-stop{min-height:44px;min-width:44px}.fleet-voice-panel .attach-preview{padding:0;display:flex;flex-wrap:wrap;gap:10px}.fleet-voice-panel .attach-audio{flex-basis:100%;max-width:none;width:100%}.fleet-voice-panel .filecard-meta{flex:1;min-width:0}.fleet-voice-panel button{min-height:44px}.fleet-acp-input .vr-hint{font-size:11px}.fleet-acp-scroll{inset:var(--fleet-acp-top,68px) 0 var(--fleet-acp-bottom,80px);scroll-padding:12px 0}.fleet-acp-thread{padding:12px 20px;max-width:820px}.fleet-acp-header{left:10px;right:10px;min-height:48px;border-radius:20px;background:color-mix(in srgb,var(--surface) 92%,transparent);box-shadow:inset 0 0 0 .5px var(--fleet-glass-rim)}.fleet-acp-header:before{display:none}.fleet-acp-header strong{font-size:14px;font-weight:600}.fleet-acp-header small{font-size:11px;margin-top:1px}.fleet-acp-composer{width:calc(100% - 20px);bottom:max(8px,env(safe-area-inset-bottom))}.fleet-acp-input .fleet-live-voice-trigger{background:transparent;border:0;box-shadow:none;color:var(--text-2)}.fleet-acp-input .vr-mic{color:var(--text-2)}.fleet-acp-state[data-idle=true]{position:absolute;width:1px;height:1px;min-height:0;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.fleet-voice-panel{position:static;order:-1;flex:0 0 100%;max-height:none;overflow:visible;padding:0 0 5px;margin:0 0 1px;border:0;border-bottom:1px solid var(--line);border-radius:0;background:transparent;box-shadow:none;gap:4px;box-sizing:border-box}.fleet-voice-panel .attach-preview-compact{display:grid;grid-template-columns:44px minmax(40px,1fr) auto 44px;gap:4px;align-items:center;padding:0;margin:0;background:transparent;border:0;border-radius:0;box-shadow:none;min-height:44px}.attach-preview-compact>audio{display:none}.attach-preview-compact .icon-btn{height:44px;width:44px;padding:0;border:0;background:transparent;box-shadow:none}.voice-preview-timeline{min-width:0;position:relative;height:44px;display:flex;align-items:center}.voice-preview-timeline input{width:100%;height:44px;margin:0;padding:0;accent-color:var(--text-2);cursor:pointer}.voice-preview-timeline span{position:absolute;right:0;bottom:-1px;pointer-events:none;font-size:12px;line-height:14px;font-variant-numeric:tabular-nums;color:var(--text-2);background:var(--surface)}.fleet-voice-panel .voice-preview-add{height:44px;min-width:72px;padding:0 8px;border:0;border-radius:12px;background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--text);font:inherit;font-size:13px;font-weight:600;white-space:nowrap;box-shadow:none}.fleet-voice-panel .voice-preview-add:disabled{opacity:.6}.voice-preview-error{grid-column:1/-1}.fleet-voice-panel p{font-size:12px;padding:4px 8px}@media(max-width:600px){.fleet-acp-thread{padding:10px 14px}.fleet-acp-header{padding:2px 4px}.fleet-acp-input .voice-rec-overlay{border-radius:24px}}.fleet-attachment-previews{display:flex;gap:8px;overflow-x:auto;list-style:none;margin:0;padding:8px 0;max-width:100%}.fleet-attachment-previews li{display:flex;align-items:center;gap:8px;border:1px solid var(--border);border-radius:12px;padding:6px;min-width:0;flex:0 0 200px}.fleet-attachment-previews img{width:44px;height:44px;object-fit:cover;border-radius:6px}.fleet-attachment-previews span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px}.fleet-attachment-previews small{display:block;opacity:.65}.fleet-acp-older{display:block;margin:0 auto 16px;min-height:44px;padding:8px 16px;border:1px solid var(--acp-color-border);border-radius:22px;background:transparent;color:var(--acp-color-text-secondary);font:inherit;font-size:13px;cursor:pointer}.fleet-acp-older:disabled{cursor:default;opacity:.7}.fleet-acp .jump-latest{bottom:calc(var(--fleet-acp-bottom,80px) + 8px);min-height:44px;white-space:nowrap}.fleet-acp-scroll:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}:root,[data-acp-theme=dark]{--acp-color-bg-primary: #0d1117;--acp-color-bg-secondary: #161b22;--acp-color-bg-tertiary: #1c2128;--acp-color-bg-hover: #252b33;--acp-color-bg-glass: rgba(22, 27, 34, .86);--acp-color-bg-input: #0d1117;--acp-color-bg-code: #0d1117;--acp-color-bg-overlay: rgba(0, 0, 0, .55);--acp-color-bg-selected: rgba(97, 175, 239, .12);--acp-color-bg-danger: rgba(248, 81, 73, .12);--acp-color-text-primary: #e6edf3;--acp-color-text-secondary: #8b949e;--acp-color-text-muted: #6e7681;--acp-color-text-inverse: #0d1117;--acp-color-text-danger: #f85149;--acp-color-border: rgba(255, 255, 255, .13);--acp-color-border-subtle: rgba(255, 255, 255, .07);--acp-color-border-accent: rgba(97, 175, 239, .3);--acp-color-accent: #61afef;--acp-color-accent-hover: #75bdf3;--acp-color-accent-muted: rgba(97, 175, 239, .12);--acp-color-accent-text: #82c7ff;--acp-color-success: #3fb950;--acp-color-success-muted: rgba(63, 185, 80, .12);--acp-color-success-bg: rgba(63, 185, 80, .08);--acp-color-warning: #d29922;--acp-color-warning-muted: rgba(210, 153, 34, .12);--acp-color-error: #f85149;--acp-color-error-muted: rgba(248, 81, 73, .12);--acp-color-error-bg: rgba(248, 81, 73, .08);--acp-color-info: #58a6ff;--acp-color-info-muted: rgba(88, 166, 255, .12);--acp-color-user-bubble: #161b22;--acp-color-user-text: #e6edf3;--acp-color-agent-bubble: transparent;--acp-color-agent-text: #e6edf3;--acp-color-knob: #ffffff;--acp-color-knob-shadow: 0 1px 3px rgba(0, 0, 0, .25);--acp-shadow-xs: 0 1px 2px rgba(0, 0, 0, .5);--acp-shadow-sm: 0 2px 8px rgba(0, 0, 0, .45), 0 0 0 1px rgba(255, 255, 255, .05);--acp-shadow-md: 0 8px 24px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .06);--acp-shadow-lg: 0 16px 48px rgba(0, 0, 0, .65), 0 0 0 1px rgba(255, 255, 255, .07);--acp-radius-xs: 4px;--acp-radius-sm: 6px;--acp-radius-md: 10px;--acp-radius-lg: 14px;--acp-radius-xl: 20px;--acp-font-sans: "Geist", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--acp-font-mono: "Geist Mono", "JetBrains Mono", "Fira Code", "Cascadia Code", "Consolas", monospace;--acp-duration-fast: .12s;--acp-duration-normal: .2s;--acp-duration-slow: .35s;--acp-ease-out: cubic-bezier(.16, 1, .3, 1);--acp-ease-in-out: cubic-bezier(.4, 0, .2, 1);--acp-ease-spring: cubic-bezier(.34, 1.56, .64, 1);color-scheme:dark}[data-acp-theme=light]{--acp-color-bg-primary: #ffffff;--acp-color-bg-secondary: #f6f8fa;--acp-color-bg-tertiary: #eaeef2;--acp-color-bg-hover: #dde3e8;--acp-color-bg-glass: rgba(255, 255, 255, .84);--acp-color-bg-input: #ffffff;--acp-color-bg-code: #f6f8fa;--acp-color-bg-overlay: rgba(0, 0, 0, .25);--acp-color-bg-selected: rgba(37, 99, 235, .08);--acp-color-bg-danger: rgba(207, 34, 46, .08);--acp-color-text-primary: #1f2328;--acp-color-text-secondary: #656d76;--acp-color-text-muted: #8b949e;--acp-color-text-inverse: #ffffff;--acp-color-text-danger: #cf222e;--acp-color-border: rgba(0, 0, 0, .12);--acp-color-border-subtle: rgba(0, 0, 0, .07);--acp-color-border-accent: rgba(37, 99, 235, .25);--acp-color-accent: #2563eb;--acp-color-accent-hover: #1d4ed8;--acp-color-accent-muted: rgba(37, 99, 235, .08);--acp-color-accent-text: #1d4ed8;--acp-color-success: #1a7f37;--acp-color-success-muted: rgba(26, 127, 55, .08);--acp-color-success-bg: rgba(26, 127, 55, .06);--acp-color-warning: #9a6700;--acp-color-warning-muted: rgba(154, 103, 0, .08);--acp-color-error: #cf222e;--acp-color-error-muted: rgba(207, 34, 46, .08);--acp-color-error-bg: rgba(207, 34, 46, .06);--acp-color-info: #2563eb;--acp-color-info-muted: rgba(37, 99, 235, .08);--acp-color-user-bubble: #2563eb;--acp-color-user-text: #ffffff;--acp-color-agent-bubble: #f0f0f0;--acp-color-agent-text: #1f2328;--acp-color-knob: #ffffff;--acp-color-knob-shadow: 0 1px 3px rgba(0, 0, 0, .15);--acp-shadow-xs: 0 1px 2px rgba(0, 0, 0, .04);--acp-shadow-sm: 0 2px 8px rgba(0, 0, 0, .06), 0 0 0 1px rgba(0, 0, 0, .03);--acp-shadow-md: 0 8px 24px rgba(0, 0, 0, .08), 0 0 0 1px rgba(0, 0, 0, .04);--acp-shadow-lg: 0 16px 48px rgba(0, 0, 0, .1), 0 0 0 1px rgba(0, 0, 0, .05);--acp-radius-xs: 4px;--acp-radius-sm: 6px;--acp-radius-md: 10px;--acp-radius-lg: 14px;--acp-radius-xl: 20px;--acp-font-sans: "Geist", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--acp-font-mono: "Geist Mono", "JetBrains Mono", "Fira Code", "Cascadia Code", "Consolas", monospace;--acp-duration-fast: .12s;--acp-duration-normal: .2s;--acp-duration-slow: .35s;--acp-ease-out: cubic-bezier(.16, 1, .3, 1);--acp-ease-in-out: cubic-bezier(.4, 0, .2, 1);--acp-ease-spring: cubic-bezier(.34, 1.56, .64, 1);color-scheme:light}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--acp-color-text-muted);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--acp-color-text-secondary)}::selection{background:var(--acp-color-accent-muted);color:var(--acp-color-text-primary)}:focus-visible{outline:2px solid var(--acp-color-accent);outline-offset:2px;border-radius:var(--acp-radius-xs)}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}._acp-loading_1tulc_1{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:18px;color:var(--acp-color-text-secondary);background:var(--acp-color-bg-primary);font-size:14px;font-weight:500}._acp-loading__spinner_1tulc_13{width:36px;height:36px;border:3px solid var(--acp-color-border-subtle);border-top-color:var(--acp-color-accent);border-radius:50%;animation:_acp-spin_1tulc_1 .7s linear infinite}@keyframes _acp-spin_1tulc_1{to{transform:rotate(360deg)}}._acp-workbench_64hok_1{display:grid;grid-template-columns:260px 1fr;grid-template-rows:1fr;height:100vh;background:var(--acp-color-bg-primary);color:var(--acp-color-text-primary);font-family:var(--acp-font-sans);overflow:hidden}._acp-workbench--has-panel_64hok_11{grid-template-columns:260px 1fr 360px}._acp-workbench__sidebar_64hok_14{background:var(--acp-color-bg-glass);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-right:1px solid var(--acp-color-border-subtle);display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--acp-shadow-sm)}._acp-workbench__main_64hok_24{display:flex;flex-direction:column;overflow:hidden;min-width:0}._acp-workbench__panel_64hok_30{background:var(--acp-color-bg-glass);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-left:1px solid var(--acp-color-border-subtle);overflow:hidden;box-shadow:var(--acp-shadow-sm)}._acp-project-opener_1fx86_1{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-tertiary);border:1px solid var(--acp-color-border-subtle);margin:0 10px 10px;transition:border-color var(--acp-duration-fast) var(--acp-ease-out)}._acp-project-opener_1fx86_1:focus-within{border-color:var(--acp-color-accent)}._acp-project-opener__icon_1fx86_15{flex-shrink:0;font-size:14px;opacity:.6}._acp-project-opener__path_1fx86_20{flex:1;font-size:12px;color:var(--acp-color-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;padding:3px 6px;border-radius:var(--acp-radius-xs);-webkit-user-select:none;user-select:none;transition:background var(--acp-duration-fast) var(--acp-ease-out)}._acp-project-opener__path_1fx86_20:hover{background:var(--acp-color-bg-hover)}._acp-project-opener__path_1fx86_20:focus-visible{outline:2px solid var(--acp-color-accent);outline-offset:1px}._acp-project-opener__input_1fx86_40{flex:1;font-size:12px;padding:3px 8px;border:1px solid var(--acp-color-accent);border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-input);color:var(--acp-color-text-primary);outline:none;font-family:var(--acp-font-mono);min-width:0}._acp-project-opener__input_1fx86_40::placeholder{color:var(--acp-color-text-muted)}._acp-project-opener__browse_1fx86_55{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--acp-radius-sm);background:transparent;color:var(--acp-color-text-secondary);font-size:16px;cursor:pointer;font-weight:600;transition:background var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out)}._acp-project-opener__browse_1fx86_55:hover{background:var(--acp-color-bg-hover);color:var(--acp-color-text-primary)}._acp-project-opener__dropdown_1fx86_75{position:relative;flex:1;min-width:0}._acp-project-opener__chevron_1fx86_80{margin-left:4px;font-size:8px;opacity:.5}._acp-project-opener__menu_1fx86_85{position:absolute;top:100%;left:0;right:0;margin-top:4px;border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-primary);border:1px solid var(--acp-color-border);box-shadow:var(--acp-shadow-md);z-index:100;overflow:hidden}._acp-project-opener__menu-item_1fx86_98{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:background var(--acp-duration-fast) var(--acp-ease-out);-webkit-user-select:none;user-select:none}._acp-project-opener__menu-item_1fx86_98:hover{background:var(--acp-color-bg-hover)}._acp-project-opener__menu-item--active_1fx86_109{background:var(--acp-color-bg-selected)}._acp-project-opener__menu-item-label_1fx86_112{font-size:13px;color:var(--acp-color-text-primary);font-weight:500}._acp-project-opener__menu-item-path_1fx86_117{margin-left:8px;font-size:11px;color:var(--acp-color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}._acp-project-opener__menu-item-remove_1fx86_126{flex-shrink:0;margin-left:8px;width:20px;height:20px;border:none;border-radius:var(--acp-radius-xs);background:transparent;color:var(--acp-color-text-muted);font-size:10px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out)}._acp-project-opener__menu-item-remove_1fx86_126:hover{background:var(--acp-color-bg-danger);color:var(--acp-color-text-danger)}._acp-project-opener__menu-divider_1fx86_146{height:1px;margin:4px 8px;background:var(--acp-color-border-subtle)}._acp-session-list_pt51t_1{display:flex;flex-direction:column;height:100%;padding:10px}._acp-session-list__header_pt51t_7{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;margin-bottom:8px}._acp-session-list__title_pt51t_14{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--acp-color-text-muted)}._acp-session-list__new-btn_pt51t_21{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-tertiary);color:var(--acp-color-text-secondary);font-size:16px;cursor:pointer;transition:background var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out),border-color var(--acp-duration-fast) var(--acp-ease-out)}._acp-session-list__new-btn_pt51t_21:hover{background:var(--acp-color-accent);color:var(--acp-color-text-inverse);border-color:var(--acp-color-accent)}._acp-session-list__items_pt51t_40{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:1px}._acp-session-list__empty-state_pt51t_47{padding:16px;text-align:center;color:var(--acp-color-text-muted);font-size:13px}._acp-session-item_pt51t_54{display:flex;align-items:center;padding:9px 12px;border-radius:var(--acp-radius-sm);cursor:pointer;border:none;background:transparent;color:var(--acp-color-text-primary);text-align:left;width:100%;font-size:13px;gap:10px;transition:background var(--acp-duration-fast) var(--acp-ease-out)}._acp-session-item_pt51t_54:hover{background:var(--acp-color-bg-hover)}._acp-session-item_pt51t_54:hover ._acp-session-item__delete_pt51t_72{opacity:1}._acp-session-item--active_pt51t_75{background:var(--acp-color-bg-tertiary)}._acp-session-item__icon_pt51t_78{flex-shrink:0;font-size:14px;opacity:.7}._acp-session-item__content_pt51t_83{flex:1;min-width:0}._acp-session-item__title_pt51t_87{font-size:13px;font-weight:500;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._acp-session-item__meta_pt51t_95{font-size:11px;color:var(--acp-color-text-muted);margin-top:2px}._acp-session-item__delete_pt51t_72{opacity:0;flex-shrink:0;background:none;border:none;color:var(--acp-color-text-muted);cursor:pointer;padding:4px;border-radius:var(--acp-radius-xs);font-size:12px;transition:opacity var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out)}._acp-session-item__delete_pt51t_72:hover{color:var(--acp-color-error)}._acp-agent-info_pt51t_116{padding:10px 14px;border-top:1px solid var(--acp-color-border-subtle);font-size:12px;color:var(--acp-color-text-secondary)}._acp-agent-info__name_pt51t_122{font-weight:600;color:var(--acp-color-text-primary)}._acp-session-load-more_pt51t_127{display:flex;align-items:center;justify-content:center;padding:8px 0;margin-top:4px}._acp-session-load-more__btn_pt51t_134{background:var(--acp-color-bg-tertiary);border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-sm);color:var(--acp-color-text-secondary);font-size:12px;padding:6px 16px;cursor:pointer;transition:background var(--acp-duration-fast),color var(--acp-duration-fast),border-color var(--acp-duration-fast)}._acp-session-load-more__btn_pt51t_134:hover{background:var(--acp-color-bg-hover);color:var(--acp-color-text-primary);border-color:var(--acp-color-border)}._acp-session-agent-header_pt51t_150{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--acp-color-text-muted)}._acp-session-agent-header__name_pt51t_161{display:flex;align-items:center;gap:6px}._acp-session-agent-header__dot_pt51t_166{width:6px;height:6px;border-radius:50%}._acp-session-agent-header__dot--connected_pt51t_171{background:var(--acp-color-success)}._acp-session-agent-header__dot--connecting_pt51t_174{background:var(--acp-color-warning)}._acp-session-agent-header__dot--disconnected_pt51t_177{background:var(--acp-color-text-muted)}._acp-session-agent-header__dot--error_pt51t_180{background:var(--acp-color-error)}._acp-session-agent-header__add_pt51t_183{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-xs);background:transparent;color:var(--acp-color-text-muted);font-size:14px;cursor:pointer;transition:color var(--acp-duration-fast),background var(--acp-duration-fast),border-color var(--acp-duration-fast)}._acp-session-agent-header__add_pt51t_183:hover{color:var(--acp-color-text-primary);background:var(--acp-color-bg-hover);border-color:var(--acp-color-border)}._acp-markdown_dbfga_1 p{margin-bottom:10px}._acp-markdown_dbfga_1 p:last-child{margin-bottom:0}._acp-markdown_dbfga_1 ul,._acp-markdown_dbfga_1 ol{padding-left:1.5em;margin-bottom:10px}._acp-markdown_dbfga_1 ul li,._acp-markdown_dbfga_1 ol li{margin-bottom:4px}._acp-markdown_dbfga_1 ul li:last-child,._acp-markdown_dbfga_1 ol li:last-child{margin-bottom:0}._acp-markdown_dbfga_1 pre{font-family:var(--acp-font-mono);font-size:13px;line-height:1.6}._acp-markdown_dbfga_1 code{font-family:var(--acp-font-mono);font-size:.9em;letter-spacing:-.01em}._acp-markdown_dbfga_1 :not(pre)>code{background:var(--acp-color-bg-tertiary);color:var(--acp-color-text-primary);padding:2px 6px;border-radius:var(--acp-radius-xs);border:1px solid var(--acp-color-border-subtle)}._acp-markdown_dbfga_1 h1,._acp-markdown_dbfga_1 h2,._acp-markdown_dbfga_1 h3,._acp-markdown_dbfga_1 h4,._acp-markdown_dbfga_1 h5,._acp-markdown_dbfga_1 h6{margin-top:24px;margin-bottom:12px;font-weight:600;line-height:1.3;color:var(--acp-color-text-primary)}._acp-markdown_dbfga_1 h1:first-child,._acp-markdown_dbfga_1 h2:first-child,._acp-markdown_dbfga_1 h3:first-child,._acp-markdown_dbfga_1 h4:first-child,._acp-markdown_dbfga_1 h5:first-child,._acp-markdown_dbfga_1 h6:first-child{margin-top:0}._acp-markdown_dbfga_1 h1{font-size:1.5em}._acp-markdown_dbfga_1 h2{font-size:1.3em}._acp-markdown_dbfga_1 h3{font-size:1.15em}._acp-markdown_dbfga_1 h4{font-size:1em}._acp-markdown_dbfga_1 blockquote{margin:12px 0;padding:8px 14px;border-left:3px solid var(--acp-color-accent);background:var(--acp-color-bg-tertiary);border-radius:0 var(--acp-radius-sm) var(--acp-radius-sm) 0;color:var(--acp-color-text-secondary)}._acp-markdown_dbfga_1 a{color:var(--acp-color-accent);text-decoration:none}._acp-markdown_dbfga_1 a:hover{text-decoration:underline}._acp-markdown_dbfga_1 table{width:100%;border-collapse:collapse;font-size:13px}._acp-markdown_dbfga_1 th,._acp-markdown_dbfga_1 td{padding:8px 12px;border-right:1px solid var(--acp-color-border);border-bottom:1px solid var(--acp-color-border);text-align:left}._acp-markdown_dbfga_1 th:last-child,._acp-markdown_dbfga_1 td:last-child{border-right:none}._acp-markdown_dbfga_1 th{background:var(--acp-color-bg-tertiary);font-weight:600}._acp-markdown_dbfga_1 tr:last-child td{border-bottom:none}._acp-markdown_dbfga_1 hr{margin:20px 0;border:none;border-top:1px solid var(--acp-color-border-subtle)}._acp-markdown_dbfga_1 img{max-width:100%;border-radius:var(--acp-radius-sm)}._acp-markdown-table_dbfga_105,._acp-markdown-code-block_dbfga_112{margin:12px 0;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-sm);overflow:hidden}._acp-markdown-code-block_dbfga_112 pre{margin:0;padding:14px;overflow-x:auto;background:var(--acp-color-bg-primary);font-family:var(--acp-font-mono);font-size:13px;line-height:1.6}._acp-markdown-code-block_dbfga_112 pre code{padding:0;background:transparent;font-size:inherit;letter-spacing:0}._acp-markdown-code-header_dbfga_134{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;font-size:12px;font-family:var(--acp-font-mono);color:var(--acp-color-text-muted);background:var(--acp-color-bg-tertiary);border-bottom:1px solid var(--acp-color-border-subtle);text-transform:uppercase;letter-spacing:.03em}._acp-diff-view_1cavl_1{height:100%;display:flex;flex-direction:column;overflow:hidden;background:var(--acp-color-bg-primary)}._acp-diff-view__header_1cavl_8{padding:10px 16px;border-bottom:1px solid var(--acp-color-border-subtle);font-size:14px;font-weight:600;letter-spacing:-.01em}._acp-diff-view__empty-state_1cavl_15{flex:1;display:flex;align-items:center;justify-content:center;color:var(--acp-color-text-muted);font-size:13px}._acp-diff-view__content_1cavl_23{flex:1;overflow-y:auto;padding:14px;font-family:var(--acp-font-mono);font-size:13px;line-height:1.6}._acp-diff-view__file_1cavl_31{margin-bottom:16px;border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-md);overflow:hidden}._acp-diff-view__filename_1cavl_37{padding:8px 14px;background:var(--acp-color-bg-secondary);font-weight:600;font-size:12px;color:var(--acp-color-text-secondary);border-bottom:1px solid var(--acp-color-border-subtle)}._acp-diff-view__old_1cavl_45{color:var(--acp-color-error);background:var(--acp-color-error-muted);padding:2px 14px;white-space:pre-wrap}._acp-diff-view__new_1cavl_51{color:var(--acp-color-success);background:var(--acp-color-success-muted);padding:2px 14px;white-space:pre-wrap}._acp-terminal-view_xbaol_1{height:100%;display:flex;flex-direction:column;background:var(--acp-color-bg-code);color:var(--acp-color-text-primary);font-family:var(--acp-font-mono)}._acp-terminal-view__header_xbaol_9{padding:10px 16px;border-bottom:1px solid var(--acp-color-border-subtle);font-size:12px;font-weight:600;color:var(--acp-color-text-muted);text-transform:uppercase;letter-spacing:.04em;display:flex;align-items:center;gap:8px}._acp-terminal-view__count_xbaol_21{background:var(--acp-color-bg-hover);color:var(--acp-color-text-muted);font-size:10px;padding:1px 6px;border-radius:var(--acp-radius-sm)}._acp-terminal-view__empty_xbaol_28{flex:1;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--acp-color-text-muted);padding:24px}._acp-terminal-view__list_xbaol_37{flex:1;overflow-y:auto}._acp-terminal-view__item_xbaol_41{border-bottom:1px solid var(--acp-color-border-subtle)}._acp-terminal-view__item--running_xbaol_44 ._acp-terminal-view__item--running__item-header_xbaol_44{background:var(--acp-color-bg-hover)}._acp-terminal-view__item-header_xbaol_47{width:100%;display:flex;align-items:center;gap:8px;padding:8px 16px;background:none;border:none;cursor:pointer;font-family:inherit;font-size:12px;color:var(--acp-color-text-primary);text-align:left}._acp-terminal-view__item-header_xbaol_47:hover{background:var(--acp-color-bg-hover)}._acp-terminal-view__item-status_xbaol_64{flex-shrink:0;width:20px;display:flex;align-items:center;justify-content:center}._acp-terminal-view__status-dot_xbaol_71{width:6px;height:6px;border-radius:50%;background:var(--acp-color-accent);animation:_terminalPulse_xbaol_1 1.5s ease-in-out infinite}._acp-terminal-view__exit-badge_xbaol_78{font-size:10px;padding:1px 4px;border-radius:3px;background:var(--acp-color-bg-hover);color:var(--acp-color-text-muted);font-weight:600}._acp-terminal-view__exit-badge--success_xbaol_86{color:var(--acp-color-success);background:var(--acp-color-success-bg)}._acp-terminal-view__exit-badge--error_xbaol_90{color:var(--acp-color-error);background:var(--acp-color-error-bg)}._acp-terminal-view__item-command_xbaol_94{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._acp-terminal-view__item-label_xbaol_100{font-weight:600;color:var(--acp-color-text-muted);margin-right:6px}._acp-terminal-view__chevron_xbaol_105{flex-shrink:0;font-size:8px;color:var(--acp-color-text-muted)}._acp-terminal-view__item-output_xbaol_110{margin:0;padding:12px 16px 8px 44px;font-size:13px;line-height:1.65;white-space:pre-wrap;background:var(--acp-color-bg-primary);color:var(--acp-color-text-secondary)}._acp-terminal-view__truncated-note_xbaol_119{display:block;margin-top:8px;font-size:11px;color:var(--acp-color-text-muted);font-style:italic}@keyframes _terminalPulse_xbaol_1{0%,to{opacity:1}50%{opacity:.4}}._acp-tool-call_u9a95_1{border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-md);margin:8px 0;overflow:hidden;font-size:13px;transition:box-shadow var(--acp-duration-fast) var(--acp-ease-out),border-color var(--acp-duration-fast) var(--acp-ease-out);color:var(--acp-color-text-secondary)}._acp-tool-call_u9a95_1:hover{border-color:var(--acp-color-border);box-shadow:var(--acp-shadow-xs)}._acp-tool-call__header_u9a95_14{display:flex;align-items:center;gap:10px;padding:10px 14px;background:none;cursor:pointer;border:none;width:100%;text-align:left;color:var(--acp-color-text-secondary);font-size:13px;font-family:var(--acp-font-sans)}._acp-tool-call__status_u9a95_28{width:8px;height:8px;border-radius:50%;flex-shrink:0}._acp-tool-call__status--pending_u9a95_34{background:var(--acp-color-text-muted);box-shadow:none}._acp-tool-call__status--in-progress_u9a95_38{background:var(--acp-color-warning);animation:_acp-pulse_u9a95_1 1.5s infinite}._acp-tool-call__status--completed_u9a95_42{background:var(--acp-color-success)}._acp-tool-call__status--failed_u9a95_45{background:var(--acp-color-error)}._acp-tool-call__kind_u9a95_48{flex-shrink:0;font-size:10px;opacity:.7}._acp-tool-call__name_u9a95_53{flex:1;font-weight:600;font-size:12px;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._acp-tool-call__chevron_u9a95_62{color:var(--acp-color-text-muted);font-size:10px;transition:transform var(--acp-duration-fast) var(--acp-ease-out)}._acp-tool-call__chevron--open_u9a95_67{transform:rotate(90deg)}._acp-tool-call__body_u9a95_70{padding:12px 14px;border-top:1px solid var(--acp-color-border-subtle);max-height:300px;overflow-y:auto}._acp-tool-call__content-text_u9a95_76{white-space:pre-wrap}._acp-tool-call__locations_u9a95_79{display:flex;flex-wrap:wrap;gap:4px;padding:8px 14px;border-top:1px solid var(--acp-color-border-subtle);background:var(--acp-color-bg-primary)}._acp-tool-call__location_u9a95_79{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-tertiary);border:1px solid var(--acp-color-border-subtle);cursor:pointer;font-size:11px;font-family:var(--acp-font-mono);color:var(--acp-color-text-secondary);transition:background var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out),border-color var(--acp-duration-fast) var(--acp-ease-out)}._acp-tool-call__location_u9a95_79:hover{background:var(--acp-color-bg-hover);color:var(--acp-color-text-primary);border-color:var(--acp-color-accent)}._acp-tool-call__location_u9a95_79:focus-visible{outline:2px solid var(--acp-color-accent);outline-offset:1px}._acp-tool-call__location-icon_u9a95_110{font-size:11px;flex-shrink:0}._acp-tool-call__location-path_u9a95_114{white-space:nowrap}._acp-tool-call__location-line_u9a95_117{color:var(--acp-color-accent);font-weight:600}@keyframes _acp-pulse_u9a95_1{0%,to{opacity:1}50%{opacity:.35}}._acp-thought-view_1hsnd_1{margin:4px 0;overflow:hidden;font-size:11px}._acp-thought-view__header_1hsnd_6{display:flex;align-items:center;gap:6px;padding:6px 10px;background:none;cursor:pointer;border:none;width:100%;text-align:left;color:var(--acp-color-text-secondary);font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}._acp-thought-view__label_1hsnd_22{font-weight:600}._acp-thought-view__chevron_1hsnd_25{color:var(--acp-color-text-muted);font-size:9px;transition:transform var(--acp-duration-fast) var(--acp-ease-spring);flex-shrink:0}._acp-thought-view__chevron--open_1hsnd_31{transform:rotate(90deg)}._acp-thought-view__spinner_1hsnd_34{width:12px;height:12px;border:1.5px solid var(--acp-color-border-subtle);border-top-color:var(--acp-color-accent);border-radius:50%;animation:_acp-thought-spin_1hsnd_1 .7s linear infinite}._acp-thought-view__body_1hsnd_42{padding:8px 10px;max-height:300px;overflow-y:auto;color:var(--acp-color-text-secondary);line-height:1.5;font-size:12px}._acp-thought-view__body_1hsnd_42 p{margin-bottom:4px}._acp-thought-view__body_1hsnd_42 p:last-child{margin-bottom:0}._acp-thought-view__body_1hsnd_42 pre{font-size:11px;line-height:1.45;margin:4px 0;font-family:var(--acp-font-mono)}._acp-thought-view__body_1hsnd_42 code{font-family:var(--acp-font-mono);font-size:.9em}._acp-thought-view__body_1hsnd_42 :not(pre)>code{background:var(--acp-color-bg-tertiary);padding:1px 4px;border-radius:var(--acp-radius-xs);border:1px solid var(--acp-color-border-subtle)}._acp-thought-view__empty_1hsnd_72{color:var(--acp-color-text-muted);font-style:italic}@keyframes _acp-thought-spin_1hsnd_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._acp-plan-view_pjklh_1{border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-md);margin:8px 0;overflow:hidden;font-size:13px;transition:box-shadow var(--acp-duration-fast) var(--acp-ease-out),border-color var(--acp-duration-fast) var(--acp-ease-out)}._acp-plan-view_pjklh_1:hover{border-color:var(--acp-color-border);box-shadow:var(--acp-shadow-xs)}._acp-plan-view--streaming_pjklh_13{border-left-color:var(--acp-color-success)}._acp-plan-view__header_pjklh_16{display:flex;align-items:center;gap:8px;padding:10px 14px;background:none;cursor:pointer;border:none;width:100%;text-align:left;color:var(--acp-color-text-secondary);font-size:12px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}._acp-plan-view__chevron_pjklh_32{color:var(--acp-color-text-muted);font-size:10px;transition:transform var(--acp-duration-fast) var(--acp-ease-spring);flex-shrink:0}._acp-plan-view__chevron--open_pjklh_38{transform:rotate(90deg)}._acp-plan-view__label_pjklh_41{font-weight:600}._acp-plan-view__progress_pjklh_44{color:var(--acp-color-text-muted);font-size:11px;margin-left:auto;font-family:var(--acp-font-mono)}._acp-plan-view__spinner_pjklh_50{width:14px;height:14px;border:2px solid var(--acp-color-border-subtle);border-top-color:var(--acp-color-accent);border-radius:50%;animation:_acp-plan-spin_pjklh_1 .7s linear infinite}._acp-plan-view__body_pjklh_58{border-top:1px solid var(--acp-color-border-subtle);padding:8px 0;max-height:360px;overflow-y:auto}._acp-plan-list_pjklh_65{list-style:none;padding:0 14px;margin:0}._acp-plan-item_pjklh_71{display:flex;align-items:flex-start;gap:10px;padding:7px 6px;color:var(--acp-color-text-secondary);line-height:1.5;position:relative}._acp-plan-item_pjklh_71:after{content:"";position:absolute;left:7.5px;top:26px;bottom:0;width:1px;background:var(--acp-color-border-subtle)}._acp-plan-item_pjklh_71:last-child:after{display:none}._acp-plan-item--high_pjklh_92{color:var(--acp-color-text-primary);font-weight:500}._acp-plan-item--medium_pjklh_96{color:var(--acp-color-text-primary)}._acp-plan-item--low_pjklh_99{color:var(--acp-color-text-secondary)}._acp-plan-item-status_pjklh_103{flex-shrink:0;width:16px;text-align:center;font-size:12px;line-height:1.7}._acp-plan-item-status--pending_pjklh_110{color:var(--acp-color-text-muted)}._acp-plan-item-status--in-progress_pjklh_113{color:var(--acp-color-accent);animation:_acp-plan-pulse_pjklh_1 1.5s ease-in-out infinite}._acp-plan-item-status--completed_pjklh_117{color:var(--acp-color-success)}._acp-plan-item-content_pjklh_121{flex:1}._acp-plan-item-content--done_pjklh_124{text-decoration:line-through;opacity:.5}@keyframes _acp-plan-spin_pjklh_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes _acp-plan-pulse_pjklh_1{0%,to{opacity:1}50%{opacity:.35}}._acp-chat-view_1fe8h_1{display:flex;flex-direction:column;height:100%;overflow:hidden;background:var(--acp-color-bg-primary)}._acp-chat-header_1fe8h_9{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;border-bottom:1px solid var(--acp-color-border-subtle);background:var(--acp-color-bg-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);min-height:48px}._acp-chat-header__title_1fe8h_20{font-size:13px;font-weight:600;letter-spacing:-.01em;color:var(--acp-color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._acp-message-list_1fe8h_30{flex:1;overflow-y:auto;padding:24px 20px 32px;display:flex;flex-direction:column;gap:36px}._acp-round_1fe8h_39{display:flex;flex-direction:column;gap:24px}._acp-message-bubble_1fe8h_45{display:flex;width:100%;animation:_acp-message-in_1fe8h_1 .25s var(--acp-ease-out)}._acp-message-bubble--agent_1fe8h_50 ._acp-message-bubble__content_1fe8h_50{padding:0}._acp-message-bubble__content_1fe8h_50{flex:1;min-width:0;font-size:14px;word-wrap:break-word}._acp-message-bubble__resource_1fe8h_59{display:inline-flex;align-items:center;gap:6px;background:var(--acp-color-bg-tertiary);border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-sm);padding:6px 12px;margin:8px 0;font-size:12px;transition:background .15s var(--acp-ease-out)}._acp-message-bubble__resource_1fe8h_59:hover{background:var(--acp-color-bg-hover)}._acp-message-bubble__resource-name_1fe8h_74{font-family:var(--acp-font-mono);font-size:12px;color:var(--acp-color-text-secondary)}._acp-message-bubble__resource-text_1fe8h_79{margin-top:4px;font-size:12px}._acp-message-bubble__stop-reason_1fe8h_83{font-size:11px;color:var(--acp-color-text-muted);margin-top:8px}._acp-message-bubble__image_1fe8h_88{max-width:100%;max-height:400px;border-radius:var(--acp-radius-sm);margin:8px 0;display:block}@keyframes _acp-message-in_1fe8h_1{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}._acp-streaming-indicator_1fe8h_106{display:flex;align-items:center;gap:8px;padding:4px 0;color:var(--acp-color-text-muted);font-size:12px;font-weight:500;letter-spacing:.02em;text-transform:uppercase}._acp-streaming-indicator__dots_1fe8h_117{display:flex;gap:3px}._acp-streaming-indicator__dot_1fe8h_117{width:4px;height:4px;border-radius:50%;background:var(--acp-color-accent);animation:_acp-dot-bounce_1fe8h_1 1.4s infinite var(--acp-ease-in-out) both}._acp-streaming-indicator__dot_1fe8h_117:nth-child(1){animation-delay:-.32s}._acp-streaming-indicator__dot_1fe8h_117:nth-child(2){animation-delay:-.16s}@keyframes _acp-dot-bounce_1fe8h_1{0%,80%,to{transform:scale(.3);opacity:.3}40%{transform:scale(1);opacity:1}}._acp-plan-wrapper_1fe8h_145{margin:0 20px}._acp-chat-footer_1fe8h_149{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 20px 20px;background:var(--acp-color-bg-glass)}._acp-chat-empty_1fe8h_158{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--acp-color-text-muted);font-size:14px;font-weight:500;letter-spacing:-.01em;opacity:.7}._acp-user-message_4a1s0_1{display:flex;flex-direction:column;align-items:flex-end;width:100%;position:relative}._acp-user-message_4a1s0_1:hover ._acp-user-message__actions_4a1s0_8{opacity:1}._acp-user-message__actions_4a1s0_8{display:flex;justify-content:flex-end;gap:4px;position:absolute;top:100%;left:0;right:0;padding-top:4px;opacity:0;transition:opacity var(--acp-duration-fast) var(--acp-ease-out)}._acp-user-message__action-btn_4a1s0_25{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:var(--acp-color-bg-glass);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-xs);color:var(--acp-color-text-secondary);cursor:pointer;font-size:13px;padding:0}._acp-user-message__action-btn_4a1s0_25:hover{color:var(--acp-color-text-primary);background:var(--acp-color-bg-hover)}._acp-user-message__action-btn--copied_4a1s0_45{color:var(--acp-color-success)}._acp-user-message__bubble_4a1s0_49{background:var(--acp-color-user-bubble);color:var(--acp-color-user-text);border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-md);padding:12px 18px;max-width:85%;font-size:14px;word-wrap:break-word}._acp-user-message__attachments_4a1s0_60{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--acp-color-border-subtle)}._acp-user-message__attachment_4a1s0_60{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--acp-color-text-secondary);background:var(--acp-color-bg-tertiary);border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-sm);padding:4px 10px}._acp-user-message__attachment--image_4a1s0_80{padding:4px;max-width:200px}._acp-user-message__attachment--image_4a1s0_80 img{max-width:100%;max-height:40px;border-radius:var(--acp-radius-xs);display:block}._acp-user-message__stop-reason_4a1s0_91{font-size:11px;color:var(--acp-color-text-muted);margin-top:8px;text-align:right;width:100%}._acp-command-palette_1abam_1{position:relative;display:inline-flex}._acp-command-palette__trigger_1abam_6{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-input);color:var(--acp-color-text-secondary);font-size:14px;font-weight:600;cursor:pointer;transition:border-color var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out),box-shadow var(--acp-duration-fast) var(--acp-ease-out)}._acp-command-palette__trigger_1abam_6:hover{border-color:var(--acp-color-accent);color:var(--acp-color-accent);box-shadow:0 0 0 3px var(--acp-color-accent-muted)}._acp-command-palette__trigger_1abam_6:disabled{opacity:.35;cursor:not-allowed;color:var(--acp-color-text-muted)}._acp-command-palette__popover_1abam_32{position:absolute;bottom:calc(100% + 6px);left:0;width:340px;max-height:380px;display:flex;flex-direction:column;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-md);background:var(--acp-color-bg-primary);box-shadow:var(--acp-shadow-lg);z-index:100;overflow:hidden}._acp-command-palette__popover--inline_1abam_47{position:static;width:100%;max-height:240px;box-shadow:var(--acp-shadow-md)}._acp-command-palette__search_1abam_54{padding:10px 12px;border-bottom:1px solid var(--acp-color-border-subtle)}._acp-command-palette__search_1abam_54 input{width:100%;padding:7px 10px;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-input);color:var(--acp-color-text-primary);font-size:13px;font-family:var(--acp-font-sans);outline:none;transition:border-color var(--acp-duration-fast) var(--acp-ease-out)}._acp-command-palette__search_1abam_54 input::placeholder{color:var(--acp-color-text-muted)}._acp-command-palette__search_1abam_54 input:focus{border-color:var(--acp-color-accent);box-shadow:0 0 0 3px var(--acp-color-accent-muted)}._acp-command-palette__list_1abam_78{flex:1;overflow-y:auto;padding:4px}._acp-command-palette__empty_1abam_84{padding:20px;text-align:center;color:var(--acp-color-text-muted);font-size:13px}._acp-command-palette__item_1abam_91{display:flex;align-items:flex-start;gap:10px;width:100%;padding:9px 12px;border:none;border-radius:var(--acp-radius-sm);background:transparent;color:var(--acp-color-text-primary);font-size:13px;font-family:var(--acp-font-sans);text-align:left;cursor:pointer;transition:background var(--acp-duration-fast) var(--acp-ease-out)}._acp-command-palette__item_1abam_91:hover,._acp-command-palette__item--active_1abam_107{background:var(--acp-color-bg-hover)}._acp-command-palette__item-icon_1abam_111{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px;border-radius:var(--acp-radius-xs);background:var(--acp-color-accent-muted);color:var(--acp-color-accent);font-size:12px;font-weight:700;font-family:var(--acp-font-mono);margin-top:1px}._acp-command-palette__item-body_1abam_127{flex:1;min-width:0}._acp-command-palette__item-name_1abam_132{font-weight:600;font-size:13px;letter-spacing:-.01em;color:var(--acp-color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._acp-command-palette__item-desc_1abam_142{margin-top:2px;font-size:12px;color:var(--acp-color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._acp-command-palette__item-hint_1abam_151{margin-top:1px;font-size:11px;color:var(--acp-color-text-muted);font-family:var(--acp-font-mono)}._acp-chat-composer_5qtly_1{border-top:1px solid var(--acp-color-border-subtle);padding:14px 20px;background:var(--acp-color-bg-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);position:relative}._acp-chat-composer__form_5qtly_9{display:flex;flex-direction:column;gap:8px;position:relative}._acp-chat-composer__body_5qtly_15{display:flex;flex-direction:column;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-md);background:var(--acp-color-bg-input);overflow:hidden;transition:border-color var(--acp-duration-fast) var(--acp-ease-out),box-shadow var(--acp-duration-fast) var(--acp-ease-out)}._acp-chat-composer__body_5qtly_15:focus-within{border-color:var(--acp-color-accent);box-shadow:0 0 0 3px var(--acp-color-accent-muted)}._acp-chat-composer__input_5qtly_28{flex:1;resize:none;border:none;padding:10px 14px;background:transparent;color:var(--acp-color-text-primary);font-family:var(--acp-font-sans);font-size:14px;line-height:1.5;min-height:42px;max-height:200px;outline:none}._acp-chat-composer__input_5qtly_28::placeholder{color:var(--acp-color-text-muted)}._acp-chat-composer__input_5qtly_28:disabled{opacity:.5;cursor:not-allowed}._acp-chat-composer__fileList_5qtly_49{display:flex;flex-wrap:wrap;gap:6px;padding:10px 14px 0}._acp-chat-composer__fileChip_5qtly_55{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-sm);padding:2px 4px 2px 6px;background:var(--acp-color-bg-glass);font-size:12px;color:var(--acp-color-text-secondary);max-width:200px}._acp-chat-composer__fileThumb_5qtly_67{width:24px;height:24px;border-radius:2px;object-fit:cover;flex-shrink:0}._acp-chat-composer__fileName_5qtly_74{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._acp-chat-composer__fileSize_5qtly_81{color:var(--acp-color-text-muted);flex-shrink:0}._acp-chat-composer__fileRemove_5qtly_85{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;border-radius:3px;background:transparent;color:var(--acp-color-text-muted);cursor:pointer;flex-shrink:0;font-size:12px;line-height:1;padding:0;transition:color var(--acp-duration-fast) var(--acp-ease-out),background var(--acp-duration-fast) var(--acp-ease-out)}._acp-chat-composer__fileRemove_5qtly_85:hover{color:var(--acp-color-error);background:var(--acp-color-error-muted)}._acp-chat-composer__actions_5qtly_106{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px}._acp-chat-composer__attachBtn_5qtly_113{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-md);background:transparent;color:var(--acp-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:16px;padding:0;transition:border-color var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out),background var(--acp-duration-fast) var(--acp-ease-out)}._acp-chat-composer__attachBtn_5qtly_113:hover{border-color:var(--acp-color-accent);color:var(--acp-color-accent);background:var(--acp-color-accent-muted)}._acp-chat-composer__attachBtn_5qtly_113:disabled{opacity:.35;cursor:not-allowed}._acp-chat-composer__send_5qtly_138{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:var(--acp-radius-md);background:var(--acp-color-accent);color:var(--acp-color-text-inverse);cursor:pointer;flex-shrink:0;font-size:16px;transition:background var(--acp-duration-fast) var(--acp-ease-out),transform var(--acp-duration-fast) var(--acp-ease-out)}._acp-chat-composer__send_5qtly_138:hover{background:var(--acp-color-accent-hover);transform:scale(1.05)}._acp-chat-composer__send_5qtly_138:active{transform:scale(.97)}._acp-chat-composer__send_5qtly_138:disabled{opacity:.35;cursor:not-allowed;transform:none}._acp-chat-composer__cancel_5qtly_165{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-md);background:transparent;color:var(--acp-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:12px;transition:border-color var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out)}._acp-chat-composer__cancel_5qtly_165:hover{border-color:var(--acp-color-error);color:var(--acp-color-error);background:var(--acp-color-error-muted)}._acp-composer-palette_5qtly_186{position:absolute;bottom:calc(100% - 14px);left:20px;right:20px;z-index:100}._acp-usage-bar_1m64v_1{display:flex;align-items:center;gap:8px;padding:4px 10px;font-size:11px;font-family:var(--acp-font-mono);color:var(--acp-color-text-muted);white-space:nowrap}._acp-usage-bar__wrap_1m64v_11{position:relative;width:80px;height:3px;background:var(--acp-color-border-subtle);border-radius:2px;overflow:hidden;flex-shrink:0}._acp-usage-bar__fill_1m64v_20{height:100%;border-radius:2px;transition:width .4s var(--acp-ease-out),background .4s var(--acp-ease-out);background:var(--acp-color-text-muted);position:relative}._acp-usage-bar__fill_1m64v_20:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.15));border-radius:2px}._acp-usage-bar__fillLow_1m64v_34{background:var(--acp-color-success)}._acp-usage-bar__fillMedium_1m64v_37{background:var(--acp-color-warning)}._acp-usage-bar__fillHigh_1m64v_40{background:var(--acp-color-error)}._acp-usage-bar__text_1m64v_43{flex-shrink:0;font-weight:500}._acp-usage-bar__cost_1m64v_47{flex-shrink:0;color:var(--acp-color-text-secondary)}._acp-session-config-panel_1h52p_1{display:flex;align-items:center;gap:6px}._acp-session-config-item_1h52p_7{display:flex;align-items:center;gap:6px;position:relative}._acp-session-config-label_1h52p_14{font-size:12px;font-weight:500;color:var(--acp-color-text-secondary);white-space:nowrap;letter-spacing:-.01em}._acp-session-config-select_1h52p_22{padding:5px 8px;border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-sm);background:var(--acp-color-bg-input);color:var(--acp-color-text-primary);font-size:12px;font-weight:500;cursor:pointer;outline:none;min-width:100px;transition:border-color var(--acp-duration-fast) var(--acp-ease-out)}._acp-session-config-select_1h52p_22:focus{border-color:var(--acp-color-accent);box-shadow:0 0 0 3px var(--acp-color-accent-muted)}._acp-session-config-select_1h52p_22:hover{border-color:var(--acp-color-text-muted)}._acp-session-config-toggle_1h52p_43{display:flex;align-items:center}._acp-session-config-switch_1h52p_48{position:relative;width:34px;height:20px;border:none;border-radius:10px;background:var(--acp-color-border);cursor:pointer;padding:0;transition:background var(--acp-duration-fast) var(--acp-ease-out);outline:none}._acp-session-config-switch_1h52p_48:focus-visible{box-shadow:0 0 0 3px var(--acp-color-accent-muted)}._acp-session-config-switch--on_1h52p_63{background:var(--acp-color-accent)}._acp-session-config-switch-knob_1h52p_67{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--acp-color-knob);box-shadow:var(--acp-color-knob-shadow);transition:transform var(--acp-duration-fast) var(--acp-ease-spring)}._acp-session-config-switch--on_1h52p_63 ._acp-session-config-switch-knob_1h52p_67{transform:translate(14px)}._acp-session-config-description_1h52p_82{font-size:11px;color:var(--acp-color-text-muted);position:absolute;top:100%;left:0;margin-top:2px;white-space:nowrap}._acp-permission-dialog-overlay_aygh8_1{position:fixed;inset:0;background:var(--acp-color-bg-overlay);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;animation:_acp-overlay-in_aygh8_1 .15s var(--acp-ease-out)}._acp-permission-dialog_aygh8_1{background:var(--acp-color-bg-primary);border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-xl);padding:28px;max-width:480px;width:90%;box-shadow:var(--acp-shadow-lg);animation:_acp-dialog-in_aygh8_1 .25s var(--acp-ease-spring)}._acp-permission-dialog__title_aygh8_24{font-size:17px;font-weight:600;margin-bottom:8px;letter-spacing:-.02em}._acp-permission-dialog__desc_aygh8_30{font-size:13px;color:var(--acp-color-text-secondary);margin-bottom:18px;line-height:1.6}._acp-permission-dialog__tool_aygh8_36{padding:14px;background:var(--acp-color-bg-secondary);border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-md);margin-bottom:18px}._acp-permission-dialog__tool-name_aygh8_43{font-family:var(--acp-font-mono);font-size:13px;font-weight:600;color:var(--acp-color-accent)}._acp-permission-dialog__tool-args_aygh8_49{font-family:var(--acp-font-mono);font-size:12px;color:var(--acp-color-text-secondary);margin-top:6px;white-space:pre-wrap;max-height:150px;overflow-y:auto;line-height:1.6}._acp-permission-dialog__actions_aygh8_59{display:flex;gap:10px;justify-content:flex-end}._acp-permission-dialog__btn_aygh8_64{padding:9px 20px;border-radius:var(--acp-radius-sm);font-size:13px;font-weight:600;cursor:pointer;border:none;letter-spacing:-.01em;transition:background var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out),transform var(--acp-duration-fast) var(--acp-ease-out)}._acp-permission-dialog__btn_aygh8_64:active{transform:scale(.97)}._acp-permission-dialog__btn--deny_aygh8_77{background:transparent;border:1px solid var(--acp-color-border);color:var(--acp-color-text-primary)}._acp-permission-dialog__btn--deny_aygh8_77:hover{background:var(--acp-color-error-muted);color:var(--acp-color-error);border-color:var(--acp-color-error)}._acp-permission-dialog__btn--allow_aygh8_87{background:var(--acp-color-accent);color:var(--acp-color-text-inverse)}._acp-permission-dialog__btn--allow_aygh8_87:hover{background:var(--acp-color-accent-hover)}@keyframes _acp-overlay-in_aygh8_1{0%{opacity:0}to{opacity:1}}@keyframes _acp-dialog-in_aygh8_1{0%{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}._acp-login-dialog-overlay_ienj6_1{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:var(--acp-color-bg-overlay);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);animation:_acp-overlay-in_ienj6_1 .15s var(--acp-ease-out)}._acp-login-dialog_ienj6_1{background:var(--acp-color-bg-primary);border:1px solid var(--acp-color-border);border-radius:var(--acp-radius-xl);box-shadow:var(--acp-shadow-lg);padding:28px;max-width:440px;width:90%;animation:_acp-dialog-in_ienj6_1 .25s var(--acp-ease-spring)}._acp-login-dialog-title_ienj6_25{font-size:17px;font-weight:600;margin-bottom:8px;letter-spacing:-.02em}._acp-login-dialog-desc_ienj6_32{font-size:13px;color:var(--acp-color-text-secondary);margin-bottom:18px;line-height:1.6}._acp-login-dialog-error_ienj6_39{font-size:12px;color:var(--acp-color-error);margin-bottom:12px;padding:8px 12px;background:var(--acp-color-error-muted);border-radius:var(--acp-radius-sm)}._acp-login-dialog-methods_ienj6_48{display:flex;flex-direction:column;gap:8px;margin-bottom:18px}._acp-login-dialog-method_ienj6_48{background:var(--acp-color-bg-secondary);border:1px solid var(--acp-color-border-subtle);border-radius:var(--acp-radius-md);padding:14px 16px;cursor:pointer;display:flex;flex-direction:column;gap:4px;transition:background var(--acp-duration-fast) var(--acp-ease-out),border-color var(--acp-duration-fast) var(--acp-ease-out),transform var(--acp-duration-fast) var(--acp-ease-out)}._acp-login-dialog-method_ienj6_48:hover:not(:disabled){background:var(--acp-color-bg-hover);border-color:var(--acp-color-accent)}._acp-login-dialog-method_ienj6_48:active:not(:disabled){transform:scale(.98)}._acp-login-dialog-method_ienj6_48:disabled{cursor:not-allowed;opacity:.6}._acp-login-dialog-method-name_ienj6_78{font-size:14px;font-weight:600;color:var(--acp-color-text-primary)}._acp-login-dialog-method-desc_ienj6_84{font-size:12px;color:var(--acp-color-text-secondary);line-height:1.5}._acp-login-dialog-actions_ienj6_90{display:flex;justify-content:flex-end}._acp-login-dialog-cancel-btn_ienj6_95{padding:9px 20px;border-radius:var(--acp-radius-sm);font-size:13px;font-weight:600;cursor:pointer;background:transparent;border:1px solid var(--acp-color-border);color:var(--acp-color-text-primary);transition:background var(--acp-duration-fast) var(--acp-ease-out),color var(--acp-duration-fast) var(--acp-ease-out),transform var(--acp-duration-fast) var(--acp-ease-out)}._acp-login-dialog-cancel-btn_ienj6_95:hover:not(:disabled){background:var(--acp-color-bg-hover)}._acp-login-dialog-cancel-btn_ienj6_95:active:not(:disabled){transform:scale(.97)}._acp-login-dialog-cancel-btn_ienj6_95:disabled{cursor:not-allowed;opacity:.6}@keyframes _acp-overlay-in_ienj6_1{0%{opacity:0}to{opacity:1}}@keyframes _acp-dialog-in_ienj6_1{0%{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}._acp-connection-status_1avmz_1{display:flex;align-items:center;gap:12px;padding:4px 12px;font-size:12px;font-weight:500;color:var(--acp-color-text-secondary)}._acp-connection-status__item_1avmz_10{display:flex;align-items:center;gap:5px}._acp-connection-status__dot_1avmz_15{width:7px;height:7px;border-radius:50%;flex-shrink:0}._acp-connection-status__dot--connected_1avmz_21{background:var(--acp-color-success);box-shadow:0 0 6px var(--acp-color-success)}._acp-connection-status__dot--connecting_1avmz_25{background:var(--acp-color-warning);box-shadow:0 0 6px var(--acp-color-warning);animation:_acp-pulse_1avmz_1 1.5s infinite}._acp-connection-status__dot--disconnected_1avmz_30{background:var(--acp-color-text-muted)}._acp-connection-status__dot--error_1avmz_33{background:var(--acp-color-error);box-shadow:0 0 6px var(--acp-color-error)}@keyframes _acp-pulse_1avmz_1{0%,to{opacity:1}50%{opacity:.35}}.nav-paint-diagnostic{flex:none;padding:8px 12px;background:var(--surface);color:var(--text);border-block:1px solid var(--line);font:13px/1.4 var(--font)}.nav-paint-diagnostic p{margin:4px 0;font-size:12px}.nav-paint-reference{appearance:none;-webkit-appearance:none;padding:0;border:0;background:transparent;min-height:44px;display:flex;align-items:center;gap:12px;color:var(--text-2);font:500 .8rem/1.2 var(--font)}.nav-paint-options{display:flex;flex-wrap:wrap;gap:4px}.nav-paint-options button{appearance:none;-webkit-appearance:none;font:inherit;color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:8px;min-height:44px;padding:4px 8px;cursor:pointer}.nav-paint-options button[aria-pressed=true]{border-color:var(--accent)}.nav-paint-options button:focus-visible{outline:2px solid var(--accent)}.fleet-app[data-nav-paint=plain] .fleet-nav button:not(.fleet-brand){appearance:none;-webkit-appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:4px;border:0;background:transparent;box-shadow:none;text-shadow:none;filter:none;backdrop-filter:none;-webkit-backdrop-filter:none;transform:none;transition:none;animation:none;opacity:1;will-change:auto}.fleet-app[data-nav-paint=plain] .fleet-nav .primary{background:var(--accent)}.fleet-app[data-nav-paint=isolated] .fleet-nav{isolation:isolate;contain:paint;transform:translateZ(0);backface-visibility:hidden}.fleet-app[data-nav-paint=no-glass],.fleet-app[data-nav-paint=no-glass] *,.fleet-app[data-nav-paint=no-glass] *:before,.fleet-app[data-nav-paint=no-glass] *:after{backdrop-filter:none!important;-webkit-backdrop-filter:none!important}