farming-code 2.2.29 → 2.2.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.
- package/README.md +25 -66
- package/README.zh_cn.md +15 -66
- package/THIRD_PARTY_NOTICES.md +7 -0
- package/backend/acp/{client-services.js → client-services.cjs} +132 -134
- package/backend/acp/packaged-claude-acp.cjs +37 -0
- package/backend/acp/packaged-codex-acp.cjs +37 -0
- package/backend/acp/patch-decisions.cjs +182 -0
- package/backend/acp/permission-security.cjs +131 -0
- package/backend/{acp-checkpoint-store.js → acp-checkpoint-store.cjs} +90 -59
- package/backend/{acp-runtime.js → acp-runtime.cjs} +1219 -1125
- package/backend/acp-session-state.cjs +622 -0
- package/backend/acp-transcript.cjs +525 -0
- package/backend/agent-env.cjs +257 -0
- package/backend/agent-extension-discovery.cjs +452 -0
- package/backend/agent-extension-inventory.cjs +116 -0
- package/backend/agent-json-stream.cjs +283 -0
- package/backend/agent-lifecycle-journal.cjs +185 -0
- package/backend/{agent-manager.js → agent-manager.cjs} +3116 -4275
- package/backend/agent-order-transaction.cjs +85 -0
- package/backend/agent-order.cjs +159 -0
- package/backend/agent-provider-session.cjs +98 -0
- package/backend/agent-runtime-binding.cjs +179 -0
- package/backend/agent-session-history.cjs +1022 -0
- package/backend/agent-session-inventory.cjs +291 -0
- package/backend/async-cache.cjs +104 -0
- package/backend/atomic-json-store.cjs +67 -0
- package/backend/auth.cjs +261 -0
- package/backend/authoritative-inventory-cache.cjs +383 -0
- package/backend/business-health.cjs +68 -0
- package/backend/chat-runtime.cjs +50 -0
- package/backend/claude-settings.cjs +132 -0
- package/backend/cli-agents.cjs +435 -0
- package/backend/codex-context-window.cjs +196 -0
- package/backend/codex-models.cjs +228 -0
- package/backend/codex-session-archive.cjs +82 -0
- package/backend/codex-session-history.cjs +590 -0
- package/backend/{codex-terminal-profile.js → codex-terminal-profile.cjs} +149 -155
- package/backend/codex-transcript-sanitizer.cjs +130 -0
- package/backend/codex-transcript.cjs +2107 -0
- package/backend/command-runner-child.cjs +105 -0
- package/backend/config-manager.cjs +1263 -0
- package/backend/control-api.cjs +439 -0
- package/backend/data/LICENSE.cua +21 -0
- package/backend/executable-discovery.cjs +204 -0
- package/backend/farming-agent-bootstrap.cjs +81 -0
- package/backend/farming-agent-bootstrap.zh_cn.md +6 -2
- package/backend/{farming-app-cli.js → farming-app-cli.cjs} +441 -493
- package/backend/farming-cli.cjs +414 -0
- package/backend/farming-net-pass.cjs +319 -0
- package/backend/farming-net-registry.cjs +123 -0
- package/backend/farming-net-server.cjs +309 -0
- package/backend/farming-session-store.cjs +651 -0
- package/backend/git-worktree-info.cjs +181 -0
- package/backend/haiku-token.cjs +828 -0
- package/backend/index-html.cjs +96 -0
- package/backend/input-parts.cjs +68 -0
- package/backend/input-routing.cjs +40 -0
- package/backend/{local-session-engine.js → local-session-engine.cjs} +276 -282
- package/backend/main-agent-skills.cjs +309 -0
- package/backend/main-page-session.cjs +132 -0
- package/backend/native-pty-controller-generation.cjs +139 -0
- package/backend/{native-pty-host-client.js → native-pty-host-client.cjs} +338 -346
- package/backend/native-pty-host-identity.cjs +125 -0
- package/backend/native-pty-host-path.cjs +68 -0
- package/backend/{native-pty-host.js → native-pty-host.cjs} +480 -569
- package/backend/native-session-engine.cjs +296 -0
- package/backend/network.cjs +57 -0
- package/backend/npm-update-helper.cjs +399 -0
- package/backend/packaged-node-pty.cjs +120 -0
- package/backend/preview-session-manager.cjs +89 -0
- package/backend/provider-adapters.cjs +492 -0
- package/backend/provider-home-configuration.cjs +211 -0
- package/backend/provider-session-id.cjs +79 -0
- package/backend/provider-session-service.cjs +333 -0
- package/backend/qr-share-tickets.cjs +119 -0
- package/backend/resource-broadcast-protocol.cjs +50 -0
- package/backend/review-diff-router.cjs +202 -0
- package/backend/review-diff-service.cjs +1267 -0
- package/backend/review-session-router.cjs +93 -0
- package/backend/review-session-service.cjs +470 -0
- package/backend/review-session-store.cjs +161 -0
- package/backend/review-state-router.cjs +132 -0
- package/backend/review-state-store.cjs +299 -0
- package/backend/run-history-store.cjs +97 -0
- package/backend/runtime-dependency-manager.cjs +893 -0
- package/backend/runtime-executable-invocation.cjs +37 -0
- package/backend/runtime-observation.cjs +96 -0
- package/backend/server-process-identity.cjs +70 -0
- package/backend/server.cjs +3356 -0
- package/backend/session-engine-bridge.cjs +144 -0
- package/backend/session-engine-router.cjs +105 -0
- package/backend/session-engine.cjs +64 -0
- package/backend/session-stream-protocol.cjs +181 -0
- package/backend/shell-busy-integration.cjs +442 -0
- package/backend/slash-command-discovery.cjs +423 -0
- package/backend/storage-layout.cjs +263 -0
- package/backend/system-monitor.cjs +96 -0
- package/backend/terminal-attach-checkpoint.cjs +73 -0
- package/backend/terminal-exit-quiescence.cjs +57 -0
- package/backend/{terminal-reducer-flow-control.js → terminal-reducer-flow-control.cjs} +45 -22
- package/backend/terminal-runtime-cleanup.cjs +99 -0
- package/backend/{terminal-screen-state.js → terminal-screen-state.cjs} +100 -108
- package/backend/{terminal-screen-worker-pool.js → terminal-screen-worker-pool.cjs} +89 -79
- package/backend/{terminal-screen-worker-thread.js → terminal-screen-worker-thread.cjs} +64 -65
- package/backend/terminal-screen-worker.cjs +352 -0
- package/backend/terminal-state-serialization.cjs +147 -0
- package/backend/{terminal-status.js → terminal-status.cjs} +137 -187
- package/backend/theme-manager.cjs +185 -0
- package/backend/update-service.cjs +675 -0
- package/backend/usage-forecast.cjs +95 -0
- package/backend/{usage-history-client.js → usage-history-client.cjs} +144 -94
- package/backend/usage-history-smoke.cjs +85 -0
- package/backend/usage-history-worker.cjs +60 -0
- package/backend/{usage-monitor.js → usage-monitor.cjs} +363 -390
- package/backend/workspace-directory.cjs +239 -0
- package/backend/workspace-discovery.cjs +271 -0
- package/backend/{workspace-file-router.js → workspace-file-router.cjs} +213 -282
- package/backend/{workspace-file-service.js → workspace-file-service.cjs} +1139 -1318
- package/backend/workspace-root-registry.cjs +192 -0
- package/bin/farming +1 -1
- package/config/farming.deploy.env.example +1 -1
- package/config/farming.install.env.example +1 -1
- package/dist/acp/codex-acp-1.1.4.mjs +405 -8
- package/dist/assets/App-BCkdpWB6.css +1 -0
- package/dist/assets/App-CRjKpaGp.js +697 -0
- package/dist/assets/CodeSelect-Ci8sKZPU.js +1 -0
- package/dist/assets/CodeSelect-T2eNzrOc.css +1 -0
- package/dist/assets/{FileEditorMarkdownPreview-Cs9cLv8a.js → FileEditorMarkdownPreview-V06QHlAg.js} +55 -55
- package/dist/assets/FileEditorPane-BX-Wjg9U.js +2 -0
- package/dist/assets/IconGlyphs-YhV7tqd4.js +1 -0
- package/dist/assets/ProjectFilesSection-BDT2_r0o.js +12 -0
- package/dist/assets/ReviewPage-BqAs5sG1.js +3 -0
- package/dist/assets/code-dark-B7eM_9G9.css +1 -0
- package/dist/assets/{cssMode-Bdg5RpcJ.js → cssMode-ADdAlxTO.js} +1 -1
- package/dist/assets/{editor.api2-D74ufkbr.js → editor.api2-BFLAr0YF.js} +162 -162
- package/dist/assets/file-icons-BpeqWkIB.js +1 -0
- package/dist/assets/{freemarker2-DfMDJfnE.js → freemarker2-C90q5jrp.js} +1 -1
- package/dist/assets/{handlebars-BEdPtzMT.js → handlebars-BwUQcEDq.js} +1 -1
- package/dist/assets/{html-B1fPb1QD.js → html-1s3uPKfh.js} +1 -1
- package/dist/assets/{htmlMode-CY2ZjHxH.js → htmlMode-xtKD99de.js} +1 -1
- package/dist/assets/{index-CQNaZc3l.js → index-C8MchCem.js} +3 -3
- package/dist/assets/{javascript-BV2OsWA0.js → javascript-Ph7ijyny.js} +1 -1
- package/dist/assets/{jsonMode-zd07aeuX.js → jsonMode-D-jGAnFH.js} +1 -1
- package/dist/assets/linkComputer-CbGyI_qx.js +1 -0
- package/dist/assets/{liquid-BParI24X.js → liquid-0IamE_cI.js} +1 -1
- package/dist/assets/{lspLanguageFeatures-BzredkoV.js → lspLanguageFeatures-BxnQunWF.js} +1 -1
- package/dist/assets/main-CLKXa6hf.css +1 -0
- package/dist/assets/{mdx-vGzUJN98.js → mdx-DdNmfivn.js} +1 -1
- package/dist/assets/{monaco.contribution-BmaeBQEc.js → monaco.contribution-B43jsUs1.js} +2 -2
- package/dist/assets/{python-CUwdLgsI.js → python-IAt4X5TS.js} +1 -1
- package/dist/assets/{razor-BScebUxU.js → razor-DRkFYW0S.js} +1 -1
- package/dist/assets/review-C8-oPKXk.css +1 -0
- package/dist/assets/{tsMode-DzUAibXK.js → tsMode-_d_4U2gf.js} +1 -1
- package/dist/assets/{typescript-D9EOeM7N.js → typescript-C7zcMq9l.js} +1 -1
- package/dist/assets/{workers-DAiomYZM.js → workers-D0nOyJzf.js} +1 -1
- package/dist/assets/workspace-editor-model-DND_Y-Bj.js +1 -0
- package/dist/assets/workspace-editor-monaco-BPWhgcIB.js +4 -0
- package/dist/assets/workspace-editor-monaco-N641qPjX.js +1 -0
- package/dist/assets/workspace-view-state-k1bTlJ_Z.js +13 -0
- package/dist/assets/{xml-wWl1dhkQ.js → xml-BR-HvxT8.js} +1 -1
- package/dist/assets/{yaml-Dc2WDaOZ.js → yaml-YtFQwh4q.js} +1 -1
- package/dist/index.html +2 -1
- package/extensions/browser/backend/agent-browser-runtime.cjs +1040 -0
- package/extensions/browser/backend/agent-capability.cjs +85 -0
- package/extensions/browser/backend/browser-mcp-server.cjs +655 -0
- package/extensions/browser/backend/browser-resource-manager.cjs +1486 -0
- package/extensions/browser/backend/browser-resource-store.cjs +228 -0
- package/extensions/browser/backend/browser-router.cjs +203 -0
- package/extensions/browser/backend/executable-discovery.cjs +248 -0
- package/extensions/browser/backend/farming-browser-client.cjs +116 -0
- package/extensions/browser/backend/index.cjs +32 -0
- package/extensions/browser/backend/managed-chromium-installer.cjs +833 -0
- package/extensions/browser/bin/farming-browser +16 -7
- package/extensions/computer/backend/agent-capability.cjs +72 -0
- package/extensions/computer/backend/computer-constants.cjs +59 -0
- package/extensions/computer/backend/computer-mcp-server.cjs +182 -0
- package/extensions/computer/backend/computer-resource-manager.cjs +1219 -0
- package/extensions/computer/backend/computer-resource-store.cjs +190 -0
- package/extensions/computer/backend/computer-router.cjs +257 -0
- package/extensions/computer/backend/cua-tools.json +3067 -0
- package/extensions/computer/backend/farming-computer-client.cjs +84 -0
- package/extensions/computer/backend/index.cjs +35 -0
- package/extensions/computer/backend/isolated-browser-provider.cjs +157 -0
- package/extensions/computer/bin/farming-computer +131 -0
- package/frontend/farming-net/app.js +255 -262
- package/frontend/ghostty-loader.js +24 -20
- package/frontend/reading-anchor.js +210 -193
- package/frontend/runtime-paths.js +24 -26
- package/frontend/session-bridge.js +90 -111
- package/frontend/session-modal-bridge.js +184 -302
- package/frontend/skin-bridge.js +20 -23
- package/frontend/skins/crt/app.js +7686 -7901
- package/frontend/skins/crt/effects.js +7 -6
- package/frontend/skins/crt/index.html +6 -6
- package/frontend/skins/crt/styles/markdown.css +4 -4
- package/frontend/terminal-bridge.js +174 -181
- package/frontend/terminal-replay.js +320 -345
- package/frontend/theme-loader.js +55 -71
- package/index.html +1 -0
- package/package.json +64 -37
- package/shared/backend-connection-status.js +38 -69
- package/shared/browser-protocol.js +235 -110
- package/shared/websocket-liveness.js +40 -0
- package/backend/acp/packaged-claude-acp.js +0 -13
- package/backend/acp/packaged-codex-acp.js +0 -13
- package/backend/acp/patch-decisions.js +0 -153
- package/backend/acp/permission-security.js +0 -108
- package/backend/acp-session-state.js +0 -644
- package/backend/acp-transcript.js +0 -512
- package/backend/agent-env.js +0 -250
- package/backend/agent-json-stream.js +0 -268
- package/backend/agent-lifecycle-journal.js +0 -133
- package/backend/agent-memory-report.js +0 -583
- package/backend/agent-order.js +0 -166
- package/backend/agent-provider-session.js +0 -76
- package/backend/agent-runtime-binding.js +0 -174
- package/backend/agent-session-history.js +0 -953
- package/backend/async-cache.js +0 -94
- package/backend/atomic-json-store.js +0 -37
- package/backend/auth.js +0 -251
- package/backend/bundle-update-helper.js +0 -113
- package/backend/chat-runtime.js +0 -28
- package/backend/claude-settings.js +0 -121
- package/backend/cli-agents.js +0 -486
- package/backend/codex-context-window.js +0 -189
- package/backend/codex-models.js +0 -226
- package/backend/codex-rollout-follower.js +0 -326
- package/backend/codex-session-archive.js +0 -65
- package/backend/codex-session-history.js +0 -647
- package/backend/codex-transcript-sanitizer.js +0 -115
- package/backend/codex-transcript.js +0 -2564
- package/backend/command-runner-child.js +0 -67
- package/backend/config-manager.js +0 -1133
- package/backend/control-api.js +0 -455
- package/backend/executable-discovery.js +0 -216
- package/backend/farming-agent-bootstrap.js +0 -49
- package/backend/farming-cli.js +0 -457
- package/backend/farming-net-pass.js +0 -285
- package/backend/farming-net-registry.js +0 -112
- package/backend/farming-net-server.js +0 -298
- package/backend/farming-session-store.js +0 -677
- package/backend/git-worktree-info.js +0 -181
- package/backend/haiku-token.js +0 -772
- package/backend/index-html.js +0 -62
- package/backend/input-parts.js +0 -54
- package/backend/input-routing.js +0 -24
- package/backend/json-cli-runtime.js +0 -275
- package/backend/main-agent-skills.js +0 -305
- package/backend/main-page-session.js +0 -122
- package/backend/native-pty-controller-generation.js +0 -106
- package/backend/native-pty-host-identity.js +0 -86
- package/backend/native-pty-host-path.js +0 -42
- package/backend/native-session-engine.js +0 -268
- package/backend/network.js +0 -23
- package/backend/npm-update-helper.js +0 -374
- package/backend/packaged-node-pty.js +0 -99
- package/backend/preview-session-manager.js +0 -68
- package/backend/provider-adapters.js +0 -399
- package/backend/provider-session-id.js +0 -47
- package/backend/provider-session-service.js +0 -345
- package/backend/qr-share-tickets.js +0 -100
- package/backend/review-diff-router.js +0 -180
- package/backend/review-diff-service.js +0 -1270
- package/backend/review-session-router.js +0 -74
- package/backend/review-session-service.js +0 -446
- package/backend/review-session-store.js +0 -151
- package/backend/review-state-router.js +0 -116
- package/backend/review-state-store.js +0 -286
- package/backend/run-history-store.js +0 -67
- package/backend/runtime-dependency-manager.js +0 -759
- package/backend/runtime-executable-invocation.js +0 -20
- package/backend/runtime-observation.js +0 -81
- package/backend/server-process-identity.js +0 -47
- package/backend/server.js +0 -3267
- package/backend/session-engine-bridge.js +0 -129
- package/backend/session-engine-router.js +0 -66
- package/backend/session-engine.js +0 -39
- package/backend/session-stream-protocol.js +0 -185
- package/backend/shell-busy-integration.js +0 -472
- package/backend/slash-command-discovery.js +0 -433
- package/backend/storage-layout.js +0 -190
- package/backend/system-monitor.js +0 -77
- package/backend/terminal-attach-checkpoint.js +0 -74
- package/backend/terminal-exit-quiescence.js +0 -39
- package/backend/terminal-runtime-cleanup.js +0 -80
- package/backend/terminal-screen-worker.js +0 -337
- package/backend/terminal-state-serialization.js +0 -127
- package/backend/theme-manager.js +0 -163
- package/backend/update-service.js +0 -1545
- package/backend/usage-forecast.js +0 -86
- package/backend/usage-history-scanner.ts +0 -2718
- package/backend/usage-history-smoke.js +0 -64
- package/backend/usage-history-worker.js +0 -34
- package/backend/workspace-directory.js +0 -232
- package/backend/workspace-discovery.js +0 -311
- package/backend/workspace-root-registry.js +0 -166
- package/dist/assets/App-BKNUILuL.css +0 -1
- package/dist/assets/App-Ex2oVVXO.js +0 -693
- package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
- package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
- package/dist/assets/ProjectFilesSection-Cf2BEcAN.js +0 -12
- package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
- package/dist/assets/code-dark-BEZTQwYZ.css +0 -1
- package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
- package/dist/assets/main-DK9Sy7-c.css +0 -1
- package/dist/assets/review-BcnwQtJv.css +0 -1
- package/dist/assets/workspace-editor-model-CSGCl21x.js +0 -1
- package/dist/assets/workspace-editor-monaco-CJNwbpCy.js +0 -4
- package/dist/assets/workspace-editor-monaco-CO9w8YV0.js +0 -1
- package/dist/assets/workspace-view-state-BjKPYp0E.js +0 -7
- package/extensions/browser/backend/agent-browser-runtime.js +0 -1041
- package/extensions/browser/backend/agent-capability.js +0 -55
- package/extensions/browser/backend/browser-mcp-server.js +0 -621
- package/extensions/browser/backend/browser-resource-manager.js +0 -1309
- package/extensions/browser/backend/browser-resource-store.js +0 -190
- package/extensions/browser/backend/browser-router.js +0 -133
- package/extensions/browser/backend/executable-discovery.js +0 -224
- package/extensions/browser/backend/farming-browser-client.js +0 -83
- package/extensions/browser/backend/index.js +0 -7
- package/extensions/browser/frontend/BrowserSidebarPortals.tsx +0 -360
- package/extensions/browser/frontend/BrowserViewer.tsx +0 -500
- package/extensions/browser/frontend/browser-resource-state.ts +0 -60
- package/extensions/browser/frontend/browser.css +0 -567
- package/extensions/browser/frontend/types.ts +0 -31
- package/extensions/browser/frontend/useBrowserResources.ts +0 -158
- package/frontend/vendor/ghostty-web/index.d.ts +0 -1842
- package/shared/backend-connection-status.d.ts +0 -37
- package/shared/browser-protocol.d.ts +0 -5
- /package/dist/assets/{api-w2x5QfxB.js → api-ByCV9MEr.js} +0 -0
- /package/dist/assets/{core-vPkV8P_m.js → core-Czwdx12k.js} +0 -0
- /package/dist/assets/{fsharp-DNZNZyEE.js → fsharp-BjPpkoJe.js} +0 -0
- /package/dist/assets/{go-_kPJjNc_.js → go-BkIDmSUP.js} +0 -0
- /package/dist/assets/{graphql-4HCNVt5g.js → graphql-CCJTpqi1.js} +0 -0
- /package/dist/assets/{hcl-C87ymY0o.js → hcl-s4z8lUFg.js} +0 -0
- /package/dist/assets/{ini-BYrrGNTc.js → ini-CyUW1I7Z.js} +0 -0
- /package/dist/assets/{java-B211rJbk.js → java-CFCcGRiM.js} +0 -0
- /package/dist/assets/{julia-DVPsRtBm.js → julia-DQyH_EYb.js} +0 -0
- /package/dist/assets/{kotlin-BYyNerjp.js → kotlin-B8hA5O51.js} +0 -0
- /package/dist/assets/{less-EC9UblGE.js → less-DaVdaas0.js} +0 -0
- /package/dist/assets/{lexon-B1yuUdqW.js → lexon-DLBhPd3y.js} +0 -0
- /package/dist/assets/{lua-Bo6GFzxT.js → lua-gB1c_cif.js} +0 -0
- /package/dist/assets/{m3-C-Y9cBVI.js → m3-C2T3z3gB.js} +0 -0
- /package/dist/assets/{markdown-BHu-wLbe.js → markdown-CKq-Euj1.js} +0 -0
- /package/dist/assets/{mips-Dkds26rX.js → mips-Bcs5qIDX.js} +0 -0
- /package/dist/assets/{msdax-PU4g-8_g.js → msdax-CBP48FHF.js} +0 -0
- /package/dist/assets/{mysql-fPpuGpS7.js → mysql-c7tiPcFj.js} +0 -0
- /package/dist/assets/{objective-c-Wy1e5JUf.js → objective-c-D4BZkeEV.js} +0 -0
- /package/dist/assets/{pascal-BIXwvrqU.js → pascal-CJDZg0MN.js} +0 -0
- /package/dist/assets/{pascaligo-DwR0AtL_.js → pascaligo-Bygi8Ynl.js} +0 -0
- /package/dist/assets/{perl-CGHAl8my.js → perl-aS8bkf7E.js} +0 -0
- /package/dist/assets/{pgsql-B91M73E2.js → pgsql-CzNAYFYl.js} +0 -0
- /package/dist/assets/{php-C70ttrCx.js → php-DOtoEFTT.js} +0 -0
- /package/dist/assets/{pla-BNrXaRh0.js → pla-DugRnao1.js} +0 -0
- /package/dist/assets/{postiats-Dv2IAZR9.js → postiats-DsXwusKh.js} +0 -0
- /package/dist/assets/{powerquery-CkY5Wq7J.js → powerquery-DL3o72oD.js} +0 -0
- /package/dist/assets/{powershell-uGIYLU3C.js → powershell-C1qHekys.js} +0 -0
- /package/dist/assets/{protobuf-CavfmJu-.js → protobuf-DHgsc-cH.js} +0 -0
- /package/dist/assets/{pug-Drqnyitx.js → pug-FZXlE_Iu.js} +0 -0
- /package/dist/assets/{qrcode-7uGsTEmi.js → qrcode-DJDTdjL7.js} +0 -0
- /package/dist/assets/{qsharp-C7yF-Dti.js → qsharp-bLyhI3DT.js} +0 -0
- /package/dist/assets/{r-HXLGP0_-.js → r-DjFGXbAa.js} +0 -0
- /package/dist/assets/{redis-C4y6mf2p.js → redis-DSoZ_V6u.js} +0 -0
- /package/dist/assets/{redshift-DdQrFPrv.js → redshift-CzkdCsrg.js} +0 -0
- /package/dist/assets/{restructuredtext-CBrf2PNj.js → restructuredtext-B_XPrGCQ.js} +0 -0
- /package/dist/assets/{ruby-CVtMoX2B.js → ruby-Cry2RneJ.js} +0 -0
- /package/dist/assets/{rust-Ckq4sbMP.js → rust-CWzdbFq1.js} +0 -0
- /package/dist/assets/{sb-er66OpE3.js → sb-DmofU59h.js} +0 -0
- /package/dist/assets/{scala-BdWZz-hH.js → scala-BUC2l-vN.js} +0 -0
- /package/dist/assets/{scheme-kTV_s2kP.js → scheme-CNIB_72f.js} +0 -0
- /package/dist/assets/{scss-Bymy2VJQ.js → scss-DcL4-NbX.js} +0 -0
- /package/dist/assets/{shell-bwEP1LQ1.js → shell-CgAGvSSA.js} +0 -0
- /package/dist/assets/{solidity-DCddeBgL.js → solidity-DSkt6O_P.js} +0 -0
- /package/dist/assets/{sophia-BMN3AQig.js → sophia--5ytcjDN.js} +0 -0
- /package/dist/assets/{sparql-CSXOLjzi.js → sparql-C1Srr7cD.js} +0 -0
- /package/dist/assets/{sql-COg8ewmK.js → sql-2k_O5fj7.js} +0 -0
- /package/dist/assets/{st-CIaZtBS_.js → st-DCCCPqfz.js} +0 -0
- /package/dist/assets/{swift-DXiOhUHu.js → swift-Dd8mAfOt.js} +0 -0
- /package/dist/assets/{systemverilog-BTDE6Dr2.js → systemverilog-B0-aZYXu.js} +0 -0
- /package/dist/assets/{tcl-B0zy9NvV.js → tcl-CZAZwPVX.js} +0 -0
- /package/dist/assets/{twig-D594l4Z1.js → twig-D-Ag0tdS.js} +0 -0
- /package/dist/assets/{typespec-XKVjaPqo.js → typespec-B7kTFp0Z.js} +0 -0
- /package/dist/assets/{useWorkspaceMenuKeyboard-Bpy_s69Z.js → useWorkspaceMenuKeyboard-uYZpDxhU.js} +0 -0
- /package/dist/assets/{vb-B2wYoKRV.js → vb-20w1JPum.js} +0 -0
- /package/dist/assets/{wgsl-D0Yf2LbK.js → wgsl-CLJfqFt0.js} +0 -0
- /package/dist/assets/{workspace-working-copy-C3FSR3N6.js → workspace-working-copy-Cfz07cOd.js} +0 -0
|
@@ -23366,6 +23366,9 @@ function createAgentTextThoughtChunk(text, messageId, meta3) {
|
|
|
23366
23366
|
var LEGACY_SET_SESSION_MODEL_METHOD = "session/set_model";
|
|
23367
23367
|
var GOAL_CONTROL_METHOD = "_codex/session/goal_control";
|
|
23368
23368
|
var STEER_METHOD = "_codex/session/steer";
|
|
23369
|
+
var SUBAGENT_STATE_VERSION = 1;
|
|
23370
|
+
var MAX_SUBAGENT_THREADS = 128;
|
|
23371
|
+
var SUBAGENT_READ_CONCURRENCY = 8;
|
|
23369
23372
|
function isExtMethodRequest(request) {
|
|
23370
23373
|
return request.method === "authentication/status" || request.method === "authentication/logout" || request.method === LEGACY_SET_SESSION_MODEL_METHOD || request.method === GOAL_CONTROL_METHOD || request.method === STEER_METHOD;
|
|
23371
23374
|
}
|
|
@@ -26124,6 +26127,54 @@ var CodexAcpClient = class {
|
|
|
26124
26127
|
const response = await this.codexClient.threadGoalGet({ threadId: sessionId });
|
|
26125
26128
|
return response?.goal ?? null;
|
|
26126
26129
|
}
|
|
26130
|
+
onClientTransportEvent(callback) {
|
|
26131
|
+
this.codexClient.onClientTransportEvent(callback);
|
|
26132
|
+
}
|
|
26133
|
+
async listSubagentThreads(rootThreadId) {
|
|
26134
|
+
const threads = [];
|
|
26135
|
+
let cursor = null;
|
|
26136
|
+
do {
|
|
26137
|
+
const response = await this.codexClient.threadList({
|
|
26138
|
+
cursor,
|
|
26139
|
+
limit: Math.min(100, MAX_SUBAGENT_THREADS - threads.length),
|
|
26140
|
+
sortKey: "created_at",
|
|
26141
|
+
sortDirection: "asc",
|
|
26142
|
+
useStateDbOnly: true,
|
|
26143
|
+
ancestorThreadId: rootThreadId
|
|
26144
|
+
});
|
|
26145
|
+
threads.push(...response.data.slice(0, MAX_SUBAGENT_THREADS - threads.length));
|
|
26146
|
+
cursor = threads.length < MAX_SUBAGENT_THREADS ? response.nextCursor ?? null : null;
|
|
26147
|
+
} while (cursor);
|
|
26148
|
+
let nextIndex = 0;
|
|
26149
|
+
const resolved = new Array(threads.length);
|
|
26150
|
+
const worker = async () => {
|
|
26151
|
+
while (nextIndex < threads.length) {
|
|
26152
|
+
const index = nextIndex++;
|
|
26153
|
+
const thread = threads[index];
|
|
26154
|
+
const runtimeStatus = thread?.status?.type;
|
|
26155
|
+
if (runtimeStatus === "active" || runtimeStatus === "systemError") {
|
|
26156
|
+
resolved[index] = thread;
|
|
26157
|
+
continue;
|
|
26158
|
+
}
|
|
26159
|
+
try {
|
|
26160
|
+
const response = await this.codexClient.threadRead({
|
|
26161
|
+
threadId: thread.id,
|
|
26162
|
+
includeTurns: true
|
|
26163
|
+
});
|
|
26164
|
+
resolved[index] = response.thread;
|
|
26165
|
+
} catch {
|
|
26166
|
+
resolved[index] = thread;
|
|
26167
|
+
}
|
|
26168
|
+
}
|
|
26169
|
+
};
|
|
26170
|
+
await Promise.all(
|
|
26171
|
+
Array.from(
|
|
26172
|
+
{ length: Math.min(SUBAGENT_READ_CONCURRENCY, threads.length) },
|
|
26173
|
+
() => worker()
|
|
26174
|
+
)
|
|
26175
|
+
);
|
|
26176
|
+
return resolved.filter(Boolean);
|
|
26177
|
+
}
|
|
26127
26178
|
async setGoal(sessionId, objective, onTurnStarted) {
|
|
26128
26179
|
return await this.codexClient.runGoalSet({
|
|
26129
26180
|
threadId: sessionId,
|
|
@@ -27372,6 +27423,53 @@ function imageBlocks(images) {
|
|
|
27372
27423
|
return path6 ? [{ type: "text", text: `[@image](${path6})` }] : [];
|
|
27373
27424
|
});
|
|
27374
27425
|
}
|
|
27426
|
+
var MAX_HISTORY_IMAGE_BYTES = 5 * 1024 * 1024;
|
|
27427
|
+
var HISTORY_IMAGE_MIME_BY_EXT = /* @__PURE__ */ new Map([
|
|
27428
|
+
[".gif", "image/gif"],
|
|
27429
|
+
[".jpeg", "image/jpeg"],
|
|
27430
|
+
[".jpg", "image/jpeg"],
|
|
27431
|
+
[".png", "image/png"],
|
|
27432
|
+
[".svg", "image/svg+xml"],
|
|
27433
|
+
[".webp", "image/webp"]
|
|
27434
|
+
]);
|
|
27435
|
+
function historyImageBlockFromDataUrl(value) {
|
|
27436
|
+
const match = String(value ?? "").match(/^data:(image\/(?:gif|jpe?g|png|svg\+xml|webp));base64,([a-z0-9+/=]+)$/i);
|
|
27437
|
+
if (!match || Math.ceil(match[2].length * 3 / 4) > MAX_HISTORY_IMAGE_BYTES) {
|
|
27438
|
+
return null;
|
|
27439
|
+
}
|
|
27440
|
+
return {
|
|
27441
|
+
type: "image",
|
|
27442
|
+
mimeType: match[1].toLowerCase(),
|
|
27443
|
+
data: match[2]
|
|
27444
|
+
};
|
|
27445
|
+
}
|
|
27446
|
+
async function historyImageBlockFromLocalPath(value) {
|
|
27447
|
+
let filePath = String(value ?? "");
|
|
27448
|
+
if (filePath.startsWith("file://")) {
|
|
27449
|
+
try {
|
|
27450
|
+
filePath = fileURLToPath(filePath);
|
|
27451
|
+
} catch {
|
|
27452
|
+
return null;
|
|
27453
|
+
}
|
|
27454
|
+
}
|
|
27455
|
+
const mimeType = HISTORY_IMAGE_MIME_BY_EXT.get(path5.extname(filePath).toLowerCase());
|
|
27456
|
+
if (!mimeType) {
|
|
27457
|
+
return null;
|
|
27458
|
+
}
|
|
27459
|
+
try {
|
|
27460
|
+
const data = await readFile2(filePath);
|
|
27461
|
+
if (data.length === 0 || data.length > MAX_HISTORY_IMAGE_BYTES) {
|
|
27462
|
+
return null;
|
|
27463
|
+
}
|
|
27464
|
+
return {
|
|
27465
|
+
type: "image",
|
|
27466
|
+
mimeType,
|
|
27467
|
+
data: Buffer2.from(data).toString("base64")
|
|
27468
|
+
};
|
|
27469
|
+
} catch {
|
|
27470
|
+
return null;
|
|
27471
|
+
}
|
|
27472
|
+
}
|
|
27375
27473
|
function contentBlocksFromResponseContent(content) {
|
|
27376
27474
|
if (!Array.isArray(content)) {
|
|
27377
27475
|
return [];
|
|
@@ -28171,6 +28269,13 @@ var CodexAcpServer = class _CodexAcpServer {
|
|
|
28171
28269
|
closingSessions;
|
|
28172
28270
|
sessionGenerations;
|
|
28173
28271
|
sessionOpenGenerations;
|
|
28272
|
+
subagentSnapshots;
|
|
28273
|
+
subagentRootByThreadId;
|
|
28274
|
+
subagentRefreshTokens;
|
|
28275
|
+
subagentPublishQueues;
|
|
28276
|
+
subagentPublishDirty;
|
|
28277
|
+
subagentRecoveryTimers;
|
|
28278
|
+
subagentRecoveryAttempts;
|
|
28174
28279
|
constructor(connection, codexAcpClient, defaultAuthRequest, getExitCode, getRecentStderr) {
|
|
28175
28280
|
this.sessions = /* @__PURE__ */ new Map();
|
|
28176
28281
|
this.pendingMcpStartupSessions = /* @__PURE__ */ new Map();
|
|
@@ -28179,6 +28284,13 @@ var CodexAcpServer = class _CodexAcpServer {
|
|
|
28179
28284
|
this.closingSessions = /* @__PURE__ */ new Map();
|
|
28180
28285
|
this.sessionGenerations = /* @__PURE__ */ new Map();
|
|
28181
28286
|
this.sessionOpenGenerations = /* @__PURE__ */ new Map();
|
|
28287
|
+
this.subagentSnapshots = /* @__PURE__ */ new Map();
|
|
28288
|
+
this.subagentRootByThreadId = /* @__PURE__ */ new Map();
|
|
28289
|
+
this.subagentRefreshTokens = /* @__PURE__ */ new Map();
|
|
28290
|
+
this.subagentPublishQueues = /* @__PURE__ */ new Map();
|
|
28291
|
+
this.subagentPublishDirty = /* @__PURE__ */ new Set();
|
|
28292
|
+
this.subagentRecoveryTimers = /* @__PURE__ */ new Map();
|
|
28293
|
+
this.subagentRecoveryAttempts = /* @__PURE__ */ new Map();
|
|
28182
28294
|
this.connection = connection;
|
|
28183
28295
|
this.codexAcpClient = codexAcpClient;
|
|
28184
28296
|
this.defaultAuthRequest = defaultAuthRequest ?? null;
|
|
@@ -28194,6 +28306,9 @@ var CodexAcpServer = class _CodexAcpServer {
|
|
|
28194
28306
|
(operation) => this.runWithProcessCheck(operation),
|
|
28195
28307
|
() => this.refreshSessionsAuthState(null)
|
|
28196
28308
|
);
|
|
28309
|
+
this.codexAcpClient.onClientTransportEvent((event) => {
|
|
28310
|
+
this.handleSubagentTransportEvent(event);
|
|
28311
|
+
});
|
|
28197
28312
|
}
|
|
28198
28313
|
async initialize(_params) {
|
|
28199
28314
|
logger.log("Initialize request received");
|
|
@@ -28234,7 +28349,8 @@ var CodexAcpServer = class _CodexAcpServer {
|
|
|
28234
28349
|
},
|
|
28235
28350
|
_meta: {
|
|
28236
28351
|
codex: {
|
|
28237
|
-
steer: { method: STEER_METHOD, version: 1 }
|
|
28352
|
+
steer: { method: STEER_METHOD, version: 1 },
|
|
28353
|
+
subagents: { version: SUBAGENT_STATE_VERSION }
|
|
28238
28354
|
}
|
|
28239
28355
|
}
|
|
28240
28356
|
},
|
|
@@ -28513,6 +28629,7 @@ You have been logged out. Please try again.`);
|
|
|
28513
28629
|
thread
|
|
28514
28630
|
} = await this.getOrCreateSessionWithHistory(params);
|
|
28515
28631
|
await this.streamThreadHistory(sessionId, thread);
|
|
28632
|
+
this.refreshSubagentSnapshotAsync(sessionId);
|
|
28516
28633
|
logger.log("Session loaded", {
|
|
28517
28634
|
sessionId,
|
|
28518
28635
|
modelId: modelState.currentModelId,
|
|
@@ -28548,6 +28665,7 @@ You have been logged out. Please try again.`);
|
|
|
28548
28665
|
modelId: modelState.currentModelId,
|
|
28549
28666
|
availableModelCount: modelState.availableModels.length
|
|
28550
28667
|
});
|
|
28668
|
+
this.refreshSubagentSnapshotAsync(sessionId);
|
|
28551
28669
|
return {
|
|
28552
28670
|
models: modelState,
|
|
28553
28671
|
modes: modeState,
|
|
@@ -28589,6 +28707,7 @@ You have been logged out. Please try again.`);
|
|
|
28589
28707
|
await activePrompt.completion;
|
|
28590
28708
|
}
|
|
28591
28709
|
await this.runWithProcessCheck(() => this.codexAcpClient.closeSession(params.sessionId));
|
|
28710
|
+
this.clearSubagentSnapshot(params.sessionId);
|
|
28592
28711
|
logger.log("Session closed", { sessionId: params.sessionId });
|
|
28593
28712
|
} finally {
|
|
28594
28713
|
if (this.getSessionGeneration(params.sessionId) === closeGeneration) {
|
|
@@ -28601,6 +28720,256 @@ You have been logged out. Please try again.`);
|
|
|
28601
28720
|
}
|
|
28602
28721
|
return {};
|
|
28603
28722
|
}
|
|
28723
|
+
clearSubagentSnapshot(rootThreadId) {
|
|
28724
|
+
const snapshot = this.subagentSnapshots.get(rootThreadId);
|
|
28725
|
+
for (const threadId of snapshot?.agents.keys() ?? []) {
|
|
28726
|
+
if (this.subagentRootByThreadId.get(threadId) === rootThreadId) {
|
|
28727
|
+
this.subagentRootByThreadId.delete(threadId);
|
|
28728
|
+
}
|
|
28729
|
+
}
|
|
28730
|
+
this.subagentSnapshots.delete(rootThreadId);
|
|
28731
|
+
this.subagentRefreshTokens.delete(rootThreadId);
|
|
28732
|
+
this.subagentPublishQueues.delete(rootThreadId);
|
|
28733
|
+
this.subagentPublishDirty.delete(rootThreadId);
|
|
28734
|
+
const recoveryTimer = this.subagentRecoveryTimers.get(rootThreadId);
|
|
28735
|
+
if (recoveryTimer) clearTimeout(recoveryTimer);
|
|
28736
|
+
this.subagentRecoveryTimers.delete(rootThreadId);
|
|
28737
|
+
this.subagentRecoveryAttempts.delete(rootThreadId);
|
|
28738
|
+
}
|
|
28739
|
+
rootThreadIdForSubagent(threadId) {
|
|
28740
|
+
if (this.sessions.has(threadId)) return threadId;
|
|
28741
|
+
return this.subagentRootByThreadId.get(threadId) ?? null;
|
|
28742
|
+
}
|
|
28743
|
+
subagentStatusFromThread(thread) {
|
|
28744
|
+
const runtimeStatus = thread?.status?.type;
|
|
28745
|
+
if (runtimeStatus === "active") return "running";
|
|
28746
|
+
if (runtimeStatus === "systemError") return "errored";
|
|
28747
|
+
const lastTurn = Array.isArray(thread?.turns) ? thread.turns.at(-1) : null;
|
|
28748
|
+
switch (lastTurn?.status) {
|
|
28749
|
+
case "completed":
|
|
28750
|
+
return "completed";
|
|
28751
|
+
case "interrupted":
|
|
28752
|
+
return "interrupted";
|
|
28753
|
+
case "failed":
|
|
28754
|
+
return "errored";
|
|
28755
|
+
case "inProgress":
|
|
28756
|
+
return "running";
|
|
28757
|
+
default:
|
|
28758
|
+
return "pendingInit";
|
|
28759
|
+
}
|
|
28760
|
+
}
|
|
28761
|
+
subagentSnapshotEntry(thread) {
|
|
28762
|
+
return {
|
|
28763
|
+
threadId: String(thread.id),
|
|
28764
|
+
parentThreadId: typeof thread.parentThreadId === "string" ? thread.parentThreadId : null,
|
|
28765
|
+
name: typeof thread.agentNickname === "string" && thread.agentNickname.trim()
|
|
28766
|
+
? thread.agentNickname.trim()
|
|
28767
|
+
: typeof thread.agentRole === "string" && thread.agentRole.trim()
|
|
28768
|
+
? thread.agentRole.trim()
|
|
28769
|
+
: "",
|
|
28770
|
+
status: this.subagentStatusFromThread(thread)
|
|
28771
|
+
};
|
|
28772
|
+
}
|
|
28773
|
+
refreshSubagentSnapshotAsync(rootThreadId) {
|
|
28774
|
+
const refreshToken = this.subagentRefreshTokens.get(rootThreadId) ?? 0;
|
|
28775
|
+
void this.runWithProcessCheck(() => this.codexAcpClient.listSubagentThreads(rootThreadId)).then((threads) => {
|
|
28776
|
+
if (!this.sessions.has(rootThreadId)) return;
|
|
28777
|
+
if ((this.subagentRefreshTokens.get(rootThreadId) ?? 0) !== refreshToken) {
|
|
28778
|
+
this.refreshSubagentSnapshotAsync(rootThreadId);
|
|
28779
|
+
return;
|
|
28780
|
+
}
|
|
28781
|
+
const previous = this.subagentSnapshots.get(rootThreadId);
|
|
28782
|
+
const agents = new Map(
|
|
28783
|
+
threads.map((thread) => {
|
|
28784
|
+
const entry = this.subagentSnapshotEntry(thread);
|
|
28785
|
+
return [entry.threadId, entry];
|
|
28786
|
+
})
|
|
28787
|
+
);
|
|
28788
|
+
for (const threadId of previous?.agents.keys() ?? []) {
|
|
28789
|
+
if (!agents.has(threadId) && this.subagentRootByThreadId.get(threadId) === rootThreadId) {
|
|
28790
|
+
this.subagentRootByThreadId.delete(threadId);
|
|
28791
|
+
}
|
|
28792
|
+
}
|
|
28793
|
+
for (const threadId of agents.keys()) {
|
|
28794
|
+
this.subagentRootByThreadId.set(threadId, rootThreadId);
|
|
28795
|
+
}
|
|
28796
|
+
const snapshot = {
|
|
28797
|
+
revision: (previous?.revision ?? 0) + 1,
|
|
28798
|
+
agents
|
|
28799
|
+
};
|
|
28800
|
+
this.subagentSnapshots.set(rootThreadId, snapshot);
|
|
28801
|
+
this.publishSubagentUpdate(rootThreadId, "snapshot", [...agents.values()], snapshot.revision);
|
|
28802
|
+
}).catch((error51) => {
|
|
28803
|
+
logger.error(`Failed to reconcile Codex subagents for session ${rootThreadId}`, error51);
|
|
28804
|
+
});
|
|
28805
|
+
}
|
|
28806
|
+
publishSubagentUpdate(rootThreadId, kind, agents, revision) {
|
|
28807
|
+
if (!this.sessions.has(rootThreadId)) return;
|
|
28808
|
+
const run = async () => {
|
|
28809
|
+
const dirty = this.subagentPublishDirty.has(rootThreadId);
|
|
28810
|
+
const current = this.subagentSnapshots.get(rootThreadId);
|
|
28811
|
+
const updateKind = dirty ? "snapshot" : kind;
|
|
28812
|
+
const updateAgents = dirty && current ? [...current.agents.values()] : agents;
|
|
28813
|
+
const updateRevision = dirty && current ? current.revision : revision;
|
|
28814
|
+
const session = new ACPSessionConnection(this.connection, rootThreadId);
|
|
28815
|
+
await session.update({
|
|
28816
|
+
sessionUpdate: "session_info_update",
|
|
28817
|
+
_meta: {
|
|
28818
|
+
codex: {
|
|
28819
|
+
subagents: {
|
|
28820
|
+
version: SUBAGENT_STATE_VERSION,
|
|
28821
|
+
rootThreadId,
|
|
28822
|
+
revision: updateRevision,
|
|
28823
|
+
kind: updateKind,
|
|
28824
|
+
agents: updateAgents
|
|
28825
|
+
}
|
|
28826
|
+
}
|
|
28827
|
+
}
|
|
28828
|
+
});
|
|
28829
|
+
this.subagentPublishDirty.delete(rootThreadId);
|
|
28830
|
+
this.subagentRecoveryAttempts.delete(rootThreadId);
|
|
28831
|
+
const recoveryTimer = this.subagentRecoveryTimers.get(rootThreadId);
|
|
28832
|
+
if (recoveryTimer) clearTimeout(recoveryTimer);
|
|
28833
|
+
this.subagentRecoveryTimers.delete(rootThreadId);
|
|
28834
|
+
};
|
|
28835
|
+
const previous = this.subagentPublishQueues.get(rootThreadId);
|
|
28836
|
+
const next = (previous ? previous.then(run, run) : run()).catch((error51) => {
|
|
28837
|
+
logger.error(`Failed to publish Codex subagent state for session ${rootThreadId}`, error51);
|
|
28838
|
+
this.subagentPublishDirty.add(rootThreadId);
|
|
28839
|
+
this.scheduleSubagentRecovery(rootThreadId);
|
|
28840
|
+
});
|
|
28841
|
+
this.subagentPublishQueues.set(rootThreadId, next);
|
|
28842
|
+
void next.finally(() => {
|
|
28843
|
+
if (this.subagentPublishQueues.get(rootThreadId) === next) {
|
|
28844
|
+
this.subagentPublishQueues.delete(rootThreadId);
|
|
28845
|
+
}
|
|
28846
|
+
});
|
|
28847
|
+
}
|
|
28848
|
+
scheduleSubagentRecovery(rootThreadId) {
|
|
28849
|
+
if (!this.sessions.has(rootThreadId) || this.subagentRecoveryTimers.has(rootThreadId)) return;
|
|
28850
|
+
const attempt = this.subagentRecoveryAttempts.get(rootThreadId) ?? 0;
|
|
28851
|
+
if (attempt >= 3) return;
|
|
28852
|
+
const delays = [100, 500, 1e3];
|
|
28853
|
+
const timer = setTimeout(() => {
|
|
28854
|
+
this.subagentRecoveryTimers.delete(rootThreadId);
|
|
28855
|
+
if (!this.sessions.has(rootThreadId)) {
|
|
28856
|
+
this.subagentPublishDirty.delete(rootThreadId);
|
|
28857
|
+
this.subagentRecoveryAttempts.delete(rootThreadId);
|
|
28858
|
+
return;
|
|
28859
|
+
}
|
|
28860
|
+
if (!this.subagentPublishDirty.has(rootThreadId)) return;
|
|
28861
|
+
this.subagentRecoveryAttempts.set(rootThreadId, attempt + 1);
|
|
28862
|
+
const current = this.subagentSnapshots.get(rootThreadId);
|
|
28863
|
+
if (!current) return;
|
|
28864
|
+
this.publishSubagentUpdate(
|
|
28865
|
+
rootThreadId,
|
|
28866
|
+
"snapshot",
|
|
28867
|
+
[...current.agents.values()],
|
|
28868
|
+
current.revision
|
|
28869
|
+
);
|
|
28870
|
+
}, delays[attempt]);
|
|
28871
|
+
this.subagentRecoveryTimers.set(rootThreadId, timer);
|
|
28872
|
+
}
|
|
28873
|
+
updateSubagent(rootThreadId, entry) {
|
|
28874
|
+
if (!rootThreadId || !entry?.threadId || !this.sessions.has(rootThreadId)) return;
|
|
28875
|
+
const previous = this.subagentSnapshots.get(rootThreadId) ?? {
|
|
28876
|
+
revision: 0,
|
|
28877
|
+
agents: /* @__PURE__ */ new Map()
|
|
28878
|
+
};
|
|
28879
|
+
const existing = previous.agents.get(entry.threadId);
|
|
28880
|
+
const nextEntry = {
|
|
28881
|
+
threadId: entry.threadId,
|
|
28882
|
+
parentThreadId: entry.parentThreadId ?? existing?.parentThreadId ?? null,
|
|
28883
|
+
name: entry.name ?? existing?.name ?? "",
|
|
28884
|
+
status: entry.status ?? existing?.status ?? "pendingInit"
|
|
28885
|
+
};
|
|
28886
|
+
if (
|
|
28887
|
+
existing
|
|
28888
|
+
&& existing.parentThreadId === nextEntry.parentThreadId
|
|
28889
|
+
&& existing.name === nextEntry.name
|
|
28890
|
+
&& existing.status === nextEntry.status
|
|
28891
|
+
) {
|
|
28892
|
+
return;
|
|
28893
|
+
}
|
|
28894
|
+
const next = {
|
|
28895
|
+
revision: previous.revision + 1,
|
|
28896
|
+
agents: new Map(previous.agents)
|
|
28897
|
+
};
|
|
28898
|
+
next.agents.set(nextEntry.threadId, nextEntry);
|
|
28899
|
+
this.subagentSnapshots.set(rootThreadId, next);
|
|
28900
|
+
this.subagentRootByThreadId.set(nextEntry.threadId, rootThreadId);
|
|
28901
|
+
this.subagentRefreshTokens.set(
|
|
28902
|
+
rootThreadId,
|
|
28903
|
+
(this.subagentRefreshTokens.get(rootThreadId) ?? 0) + 1
|
|
28904
|
+
);
|
|
28905
|
+
this.publishSubagentUpdate(rootThreadId, "delta", [nextEntry], next.revision);
|
|
28906
|
+
}
|
|
28907
|
+
handleSubagentTransportEvent(event) {
|
|
28908
|
+
if (event?.eventType !== "notification") return;
|
|
28909
|
+
const params = event.params ?? {};
|
|
28910
|
+
const method = event.method;
|
|
28911
|
+
if (method === "thread/started") {
|
|
28912
|
+
const thread = params.thread;
|
|
28913
|
+
const parentThreadId = thread?.parentThreadId;
|
|
28914
|
+
const rootThreadId = typeof parentThreadId === "string"
|
|
28915
|
+
? this.rootThreadIdForSubagent(parentThreadId)
|
|
28916
|
+
: null;
|
|
28917
|
+
if (rootThreadId && thread?.id) {
|
|
28918
|
+
this.updateSubagent(rootThreadId, this.subagentSnapshotEntry(thread));
|
|
28919
|
+
}
|
|
28920
|
+
return;
|
|
28921
|
+
}
|
|
28922
|
+
if (
|
|
28923
|
+
(method === "item/started" || method === "item/completed")
|
|
28924
|
+
&& params.item?.type === "subAgentActivity"
|
|
28925
|
+
) {
|
|
28926
|
+
const parentThreadId = typeof params.threadId === "string" ? params.threadId : "";
|
|
28927
|
+
const rootThreadId = this.rootThreadIdForSubagent(parentThreadId);
|
|
28928
|
+
const childThreadId = params.item.threadId;
|
|
28929
|
+
if (rootThreadId && typeof childThreadId === "string") {
|
|
28930
|
+
this.updateSubagent(rootThreadId, {
|
|
28931
|
+
threadId: childThreadId,
|
|
28932
|
+
parentThreadId,
|
|
28933
|
+
status: "pendingInit"
|
|
28934
|
+
});
|
|
28935
|
+
}
|
|
28936
|
+
return;
|
|
28937
|
+
}
|
|
28938
|
+
const threadId = typeof params.threadId === "string" ? params.threadId : "";
|
|
28939
|
+
const rootThreadId = this.rootThreadIdForSubagent(threadId);
|
|
28940
|
+
if (!rootThreadId || rootThreadId === threadId) return;
|
|
28941
|
+
if (method === "turn/started") {
|
|
28942
|
+
this.updateSubagent(rootThreadId, { threadId, status: "running" });
|
|
28943
|
+
return;
|
|
28944
|
+
}
|
|
28945
|
+
if (method === "turn/completed") {
|
|
28946
|
+
const status = params.turn?.status;
|
|
28947
|
+
this.updateSubagent(rootThreadId, {
|
|
28948
|
+
threadId,
|
|
28949
|
+
status: status === "completed"
|
|
28950
|
+
? "completed"
|
|
28951
|
+
: status === "interrupted"
|
|
28952
|
+
? "interrupted"
|
|
28953
|
+
: status === "failed"
|
|
28954
|
+
? "errored"
|
|
28955
|
+
: "running"
|
|
28956
|
+
});
|
|
28957
|
+
return;
|
|
28958
|
+
}
|
|
28959
|
+
if (method === "thread/status/changed") {
|
|
28960
|
+
const status = params.status?.type;
|
|
28961
|
+
if (status === "active" || status === "systemError") {
|
|
28962
|
+
this.updateSubagent(rootThreadId, {
|
|
28963
|
+
threadId,
|
|
28964
|
+
status: status === "active" ? "running" : "errored"
|
|
28965
|
+
});
|
|
28966
|
+
}
|
|
28967
|
+
return;
|
|
28968
|
+
}
|
|
28969
|
+
if (method === "thread/closed") {
|
|
28970
|
+
this.updateSubagent(rootThreadId, { threadId, status: "shutdown" });
|
|
28971
|
+
}
|
|
28972
|
+
}
|
|
28604
28973
|
async deleteSession(params) {
|
|
28605
28974
|
logger.log("Deleting session...", { sessionId: params.sessionId });
|
|
28606
28975
|
const sessionId = params.sessionId;
|
|
@@ -29004,8 +29373,25 @@ You have been logged out. Please try again.`);
|
|
|
29004
29373
|
);
|
|
29005
29374
|
const threadUpdates = [];
|
|
29006
29375
|
for (const turn of thread.turns) {
|
|
29376
|
+
let seenUserMessage = false;
|
|
29007
29377
|
for (const item of turn.items) {
|
|
29008
|
-
|
|
29378
|
+
let updates2 = await this.createHistoryUpdates(item, sessionState);
|
|
29379
|
+
if (item.type === "userMessage") {
|
|
29380
|
+
if (seenUserMessage) {
|
|
29381
|
+
updates2 = updates2.map((update) => ({
|
|
29382
|
+
...update,
|
|
29383
|
+
_meta: {
|
|
29384
|
+
...update._meta,
|
|
29385
|
+
codex: {
|
|
29386
|
+
...update._meta?.codex,
|
|
29387
|
+
steer: true,
|
|
29388
|
+
turnId: turn.id
|
|
29389
|
+
}
|
|
29390
|
+
}
|
|
29391
|
+
}));
|
|
29392
|
+
}
|
|
29393
|
+
seenUserMessage = true;
|
|
29394
|
+
}
|
|
29009
29395
|
threadUpdates.push(...updates2);
|
|
29010
29396
|
}
|
|
29011
29397
|
}
|
|
@@ -29107,11 +29493,11 @@ You have been logged out. Please try again.`);
|
|
|
29107
29493
|
return [this.createPlanUpdate(item)];
|
|
29108
29494
|
}
|
|
29109
29495
|
}
|
|
29110
|
-
createUserMessageUpdates(item) {
|
|
29496
|
+
async createUserMessageUpdates(item) {
|
|
29111
29497
|
const updates = [];
|
|
29112
29498
|
const messageId = item.id;
|
|
29113
29499
|
for (const input of item.content) {
|
|
29114
|
-
const blocks = this.userInputToContentBlocks(input);
|
|
29500
|
+
const blocks = await this.userInputToContentBlocks(input);
|
|
29115
29501
|
for (const block of blocks) {
|
|
29116
29502
|
updates.push(createUserMessageChunk(block, messageId));
|
|
29117
29503
|
}
|
|
@@ -29155,15 +29541,26 @@ ${item.text}`
|
|
|
29155
29541
|
}
|
|
29156
29542
|
};
|
|
29157
29543
|
}
|
|
29158
|
-
userInputToContentBlocks(input) {
|
|
29544
|
+
async userInputToContentBlocks(input) {
|
|
29159
29545
|
switch (input.type) {
|
|
29160
29546
|
case "text":
|
|
29161
29547
|
return input.text.length > 0 ? [{ type: "text", text: input.text }] : [];
|
|
29162
|
-
case "image":
|
|
29163
|
-
|
|
29548
|
+
case "image": {
|
|
29549
|
+
const image = historyImageBlockFromDataUrl(input.url);
|
|
29550
|
+
return image ? [image] : [{
|
|
29551
|
+
type: "resource_link",
|
|
29552
|
+
uri: input.url,
|
|
29553
|
+
name: "image"
|
|
29554
|
+
}];
|
|
29555
|
+
}
|
|
29164
29556
|
case "localImage": {
|
|
29165
29557
|
const uri = input.path.startsWith("file://") ? input.path : `file://${input.path}`;
|
|
29166
|
-
|
|
29558
|
+
const image = await historyImageBlockFromLocalPath(input.path);
|
|
29559
|
+
return image ? [image] : [{
|
|
29560
|
+
type: "resource_link",
|
|
29561
|
+
uri,
|
|
29562
|
+
name: path5.basename(input.path) || "image"
|
|
29563
|
+
}];
|
|
29167
29564
|
}
|
|
29168
29565
|
case "skill":
|
|
29169
29566
|
return [{ type: "text", text: `skill:${input.name} (${input.path})` }];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.farming-browser-section{color:#343a34;min-width:0;margin-top:2px;margin-left:14px}.code-agent-resource-action-slot{display:contents}.code-agent-row:has(.code-agent-resource-action-slot:not(:empty)) .code-agent-row-actions{width:93px}.code-agent-resource-slot:empty{display:none}.code-agent-resource-slot .farming-browser-section{margin-top:0;margin-left:14px}.code-settings-browser-row .code-settings-row-copy small{text-overflow:clip;white-space:normal;overflow:visible}.code-settings-browser-unavailable{color:#747b72;white-space:nowrap;font-size:12px;line-height:18px}.farming-browser-section>header{min-height:var(--code-files-header-height,25px);color:#5f675e;letter-spacing:0;text-transform:uppercase;background:#f6f7f3;align-items:center;gap:8px;padding:2px 6px 1px 0;font-size:13px;font-weight:500;display:flex}.farming-browser-section-toggle{min-width:0;min-height:22px;color:inherit;cursor:pointer;font:inherit;letter-spacing:inherit;text-align:left;text-transform:inherit;background:0 0;border:0;border-radius:4px;flex:0 auto;align-items:center;gap:5px;padding:0 4px 0 2px;display:inline-flex}.farming-browser-section-toggle:hover,.farming-browser-section-toggle:focus-visible{color:#30372f;outline:0}.farming-browser-section-chevron{color:#6b7368;flex:0 0 14px;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.farming-browser-section-chevron svg,.farming-browser-new svg,.farming-browser-row-actions svg{fill:currentColor;width:14px;height:14px;display:block}.farming-browser-section-toggle small{color:#8a9188;font-size:11px;font-weight:450}.farming-browser-new,.farming-browser-row-actions button{color:#6b7368;cursor:pointer;background:0 0;border:0;border-radius:4px;flex:0 0 22px;justify-content:center;align-items:center;width:22px;height:22px;padding:0;display:inline-flex}.farming-browser-new:hover,.farming-browser-new:focus-visible,.farming-browser-row-actions button:hover,.farming-browser-row-actions button:focus-visible{color:#30372f;background:#1f23280d;outline:0}.farming-browser-new:disabled,.farming-browser-row-actions button:disabled{cursor:default;opacity:.38}.farming-browser-list{min-width:0}.farming-browser-row{--farming-browser-row-action-surface:#f6f7f3;color:#535a52;cursor:default;border-radius:5px;grid-template-columns:16px minmax(0,1fr);align-items:center;gap:7px;min-width:0;min-height:32px;margin:0 4px 0 0;padding:3px 4px 3px 5px;font-size:13px;line-height:16px;display:grid;position:relative}.farming-browser-row:hover,.farming-browser-row.active{--farming-browser-row-action-surface:#e8e9e6;color:#30372f;background:#1f23280e}.farming-browser-row:focus-visible{outline-offset:-2px;outline:2px solid #52638747}.farming-browser-resource-icon{color:#7a8178;place-items:center;width:16px;height:16px;display:inline-grid}.farming-browser-resource-icon svg{width:16px;height:16px}.farming-browser-resource-icon.running{color:#1f9d55}.farming-browser-resource-icon.failed{color:#c53d3d}.farming-browser-resource-icon.starting,.farming-browser-resource-icon.stopping{color:#ba7d12}.farming-browser-row-copy{gap:0;min-width:0;display:grid}.farming-browser-row-name,.farming-browser-row-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.farming-browser-row-name{color:inherit;font-size:13px;font-weight:450}.farming-browser-row-detail{color:#81887f;font-size:11px;line-height:14px}.farming-browser-row-copy input{box-sizing:border-box;color:#343a34;width:100%;min-width:0;height:22px;font:inherit;background:#fff;border:1px solid #5263874d;border-radius:4px;outline:0;padding:0 5px}.farming-browser-row-actions{z-index:1;box-sizing:border-box;background:linear-gradient(90deg, transparent 0, var(--farming-browser-row-action-surface) 21px, var(--farming-browser-row-action-surface) 100%);opacity:0;pointer-events:none;justify-content:flex-end;align-items:center;width:87px;height:28px;padding-left:21px;transition:opacity .12s;display:inline-flex;position:absolute;top:50%;right:4px;transform:translateY(-50%)}.farming-browser-row:hover .farming-browser-row-actions,.farming-browser-row:focus-within .farming-browser-row-actions{opacity:1;pointer-events:auto}.farming-browser-empty{color:#7a8178;cursor:pointer;min-height:28px;font:inherit;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:6px;margin:0 4px 2px 0;padding:3px 7px;font-size:12px;display:inline-flex}.farming-browser-empty svg{fill:currentColor;width:13px;height:13px}.farming-browser-empty:hover,.farming-browser-empty:focus-visible{color:#4e564d;background:#1f23280d;outline:0}.farming-browser-viewer{color:#343a34;background:#fff;grid-template-rows:auto minmax(0,1fr) auto;width:100%;height:100%;min-height:0;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif;display:grid}.farming-browser-toolbar{background:#fff;border-bottom:1px solid #24292f14;align-items:center;gap:2px;min-height:38px;padding:4px 6px;display:flex}.farming-browser-toolbar button,.farming-browser-placeholder button{color:#5f675e;cursor:pointer;min-height:28px;font:inherit;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:12px;font-weight:500;display:inline-flex}.farming-browser-toolbar button:hover:not(:disabled),.farming-browser-toolbar button:focus-visible,.farming-browser-placeholder button:hover,.farming-browser-placeholder button:focus-visible{color:#30372f;background:#1f23280f;outline:0}.farming-browser-toolbar button:disabled{cursor:default;opacity:.38}.farming-browser-toolbar button svg,.farming-browser-placeholder button svg{fill:currentColor;width:14px;height:14px}.farming-browser-toolbar-icon{flex:0 0 28px;width:28px;padding:0!important}.farming-browser-toolbar .farming-browser-agent-return{color:#454d44}.farming-browser-toolbar-separator{background:#24292f1a;flex:0 0 1px;width:1px;height:18px;margin:0 4px 0 2px}.farming-browser-toolbar form{flex:auto;min-width:90px;margin-left:3px;display:flex;position:relative}.farming-browser-toolbar input{box-sizing:border-box;color:#343a34;width:100%;min-width:0;height:28px;font:inherit;background:#f1f3ef;border:1px solid #0000;border-radius:7px;outline:0;padding:0 25px 0 10px;font-size:12px}.farming-browser-toolbar input:focus{background:#fff;border-color:#5263875c}.farming-browser-connection{background:#9aa198;border-radius:999px;flex:0 0 7px;width:7px;height:7px;margin-top:-3.5px;position:absolute;top:50%;right:9px}.farming-browser-connection.connected{background:#2da44e}.farming-browser-connection.navigating{background:#d29922}.farming-browser-viewport{background:#fff;justify-content:center;align-items:center;min-height:0;display:flex;position:relative;overflow:hidden}.farming-browser-viewport canvas{cursor:default;background:#fff;outline:none;max-width:100%;max-height:100%;display:block}.farming-browser-more-wrap{flex:none;position:relative}.farming-browser-more-menu{z-index:30;background:#fff;border:1px solid #d8dbd2;border-radius:8px;width:168px;padding:5px;position:absolute;top:calc(100% + 5px);right:0;box-shadow:0 14px 36px #1f232829}.farming-browser-more-menu button{justify-content:flex-start;width:100%;min-height:30px;padding:0 9px}.farming-browser-text-input-proxy{opacity:.01;pointer-events:none;resize:none;border:0;width:1px;height:1px;padding:0;font-size:16px;position:absolute;bottom:0;left:50%}.farming-browser-placeholder{color:#747b72;text-align:center;justify-items:center;gap:7px;max-width:420px;padding:24px;display:grid}.farming-browser-placeholder strong{color:#4e564d;font-size:14px;font-weight:600}.farming-browser-placeholder p{margin:0;font-size:13px;line-height:19px}.farming-browser-placeholder button{background:#f6f7f3;border:1px solid #5263872e;margin-top:3px}.farming-browser-viewer-error{color:#b4232d;background:#cf222e14;padding:6px 10px;font-size:12px;line-height:16px}.farming-browser-activity-preview{z-index:18;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffffff5;border:1px solid #d8dcd4;border-radius:10px;width:240px;position:absolute;top:54px;right:22px;overflow:hidden;box-shadow:0 6px 20px #1f231e24}.farming-browser-activity-preview>header{color:#424941;align-items:center;gap:7px;height:30px;padding:0 7px 0 9px;display:flex}.farming-browser-activity-preview>header strong{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;font-weight:500;line-height:1;overflow:hidden}.farming-browser-activity-preview>header button{color:#737a72;cursor:pointer;background:0 0;border:0;border-radius:5px;width:22px;height:22px;padding:0;font:400 18px/20px system-ui,sans-serif}.farming-browser-activity-preview>header button:hover,.farming-browser-activity-preview>header button:focus-visible{color:#252a25;background:#eef0eb;outline:none}.farming-browser-activity-dot{background:#2da44e;border-radius:50%;flex:none;width:7px;height:7px;box-shadow:0 0 0 2px #2da44e1f}.farming-browser-activity-frame{aspect-ratio:16/9;color:#737a72;cursor:pointer;background:#f1f3ef;border:0;border-top:1px solid #e2e5df;place-items:center;width:100%;padding:0;display:grid;overflow:hidden}.farming-browser-activity-frame img{object-fit:contain;background:#fff;width:100%;height:100%;display:block}.farming-browser-activity-frame span{padding:12px;font-size:11px}body.code-mode[data-appearance=dark] .farming-browser-section,body.code-mode[data-appearance=dark] .farming-browser-row{color:#c9d1d9}body.code-mode[data-appearance=dark] .farming-browser-row{--farming-browser-row-action-surface:#0d1117}body.code-mode[data-appearance=dark] .farming-browser-section>header{color:#9da7b1;background:#0d1117}body.code-mode[data-appearance=dark] .farming-browser-section-toggle:hover,body.code-mode[data-appearance=dark] .farming-browser-section-toggle:focus-visible,body.code-mode[data-appearance=dark] .farming-browser-new:hover,body.code-mode[data-appearance=dark] .farming-browser-new:focus-visible,body.code-mode[data-appearance=dark] .farming-browser-row-actions button:hover,body.code-mode[data-appearance=dark] .farming-browser-row-actions button:focus-visible{color:#f0f6fc}body.code-mode[data-appearance=dark] .farming-browser-row:hover,body.code-mode[data-appearance=dark] .farming-browser-row.active{--farming-browser-row-action-surface:#1d2227}body.code-mode[data-appearance=dark] .farming-browser-row:hover,body.code-mode[data-appearance=dark] .farming-browser-row.active,body.code-mode[data-appearance=dark] .farming-browser-empty:hover,body.code-mode[data-appearance=dark] .farming-browser-empty:focus-visible{background:#b1bac41a}body.code-mode[data-appearance=dark] .farming-browser-row-detail,body.code-mode[data-appearance=dark] .farming-browser-empty,body.code-mode[data-appearance=dark] .farming-browser-resource-icon{color:#8b949e}body.code-mode[data-appearance=dark] .farming-browser-resource-icon.running{color:#3fb950}body.code-mode[data-appearance=dark] .farming-browser-resource-icon.failed{color:#ff7b72}body.code-mode[data-appearance=dark] .farming-browser-resource-icon.starting,body.code-mode[data-appearance=dark] .farming-browser-resource-icon.stopping{color:#d29922}body.code-mode[data-appearance=dark] .farming-browser-row-copy input,body.code-mode[data-appearance=dark] .farming-browser-toolbar input{color:#e6edf3;background:#161b22;border-color:#30363d}body.code-mode[data-appearance=dark] .farming-browser-viewer{color:#c9d1d9;background:#0d1117}body.code-mode[data-appearance=dark] .farming-browser-toolbar{background:#0d1117;border-color:#21262d}body.code-mode[data-appearance=dark] .farming-browser-toolbar-separator{background:#30363d}body.code-mode[data-appearance=dark] .farming-browser-toolbar button,body.code-mode[data-appearance=dark] .farming-browser-placeholder button{color:#9da7b1}body.code-mode[data-appearance=dark] .farming-browser-toolbar button:hover:not(:disabled),body.code-mode[data-appearance=dark] .farming-browser-toolbar button:focus-visible,body.code-mode[data-appearance=dark] .farming-browser-placeholder button:hover,body.code-mode[data-appearance=dark] .farming-browser-placeholder button:focus-visible{color:#f0f6fc;background:#21262d}body.code-mode[data-appearance=dark] .farming-browser-viewport{background:#010409}body.code-mode[data-appearance=dark] .farming-browser-more-menu{background:#161b22;border-color:#30363d}body.code-mode[data-appearance=dark] .farming-browser-placeholder{color:#8b949e}body.code-mode[data-appearance=dark] .farming-browser-placeholder strong{color:#c9d1d9}body.code-mode[data-appearance=dark] .farming-browser-placeholder button{background:#161b22;border-color:#30363d}.code-mode[data-appearance=dark] .farming-browser-activity-preview{background:#1f211ff5;border-color:#3a3f3a;box-shadow:0 8px 24px #00000059}.code-mode[data-appearance=dark] .farming-browser-activity-preview>header{color:#d7dcd5}.code-mode[data-appearance=dark] .farming-browser-activity-preview>header button{color:#9da59c}.code-mode[data-appearance=dark] .farming-browser-activity-preview>header button:hover,.code-mode[data-appearance=dark] .farming-browser-activity-preview>header button:focus-visible{color:#f0f2ef;background:#343834}.code-mode[data-appearance=dark] .farming-browser-activity-frame{color:#9da59c;background:#242724;border-top-color:#3a3f3a}@media (width<=700px){.farming-browser-activity-preview{display:none}.farming-browser-toolbar{padding-inline:5px}.farming-browser-toolbar form{margin-left:1px}}.farming-computer-section{min-width:0;margin:4px 8px 4px 14px}.farming-computer-section>header{align-items:center;min-width:0;display:flex}.farming-computer-section>header button{color:var(--code-text-muted);background:0 0;border:0;height:28px}.farming-computer-section-toggle{text-align:left;flex:1;align-items:center;gap:5px;min-width:0;display:flex}.farming-computer-section-toggle svg,.farming-computer-section>header button:last-child svg{fill:currentColor;width:14px;height:14px}.farming-computer-section-toggle small{margin-left:auto;font-size:11px;font-weight:400}.farming-computer-row{--farming-computer-row-action-surface:var(--code-bg,#f6f7f3);min-width:0;height:42px;color:var(--code-text);border-radius:8px;align-items:center;gap:7px;padding:4px 5px 4px 8px;display:flex;position:relative}.farming-computer-row:hover,.farming-computer-row.active{--farming-computer-row-action-surface:color-mix(in srgb, var(--code-bg,#f6f7f3) 94%, var(--code-text,#343a34) 6%);background:var(--code-hover)}.farming-computer-resource-icon{width:16px;height:16px;color:var(--code-text-muted);flex:0 0 16px;place-items:center;display:inline-grid}.farming-computer-resource-icon svg{width:16px;height:16px}.farming-computer-resource-icon.running{color:#1f9d55}.farming-computer-resource-icon.failed{color:#c53d3d}.farming-computer-resource-icon.starting,.farming-computer-resource-icon.stopping{color:#ba7d12}.farming-computer-copy{flex-direction:column;flex:1;min-width:0;display:flex}.farming-computer-name,.farming-computer-detail{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.farming-computer-name{font-size:13px}.farming-computer-detail{color:var(--code-text-muted);font-size:11px}.farming-computer-detail.error{color:#c53d3d}.farming-computer-copy input{width:100%;min-width:0}.farming-computer-actions{z-index:1;box-sizing:border-box;background:linear-gradient(90deg, transparent 0, var(--farming-computer-row-action-surface) 21px, var(--farming-computer-row-action-surface) 100%);opacity:0;pointer-events:none;justify-content:flex-end;align-items:center;width:61px;height:28px;padding-left:21px;transition:opacity .12s;display:inline-flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.farming-computer-row:hover .farming-computer-actions,.farming-computer-row:focus-within .farming-computer-actions{opacity:1;pointer-events:auto}.farming-computer-actions button,.farming-computer-empty{color:var(--code-text-muted);background:0 0;border:0}.farming-computer-actions button{width:24px;height:24px}.farming-computer-more-wrap{display:inline-flex;position:relative}.farming-computer-more-menu{z-index:3;border:1px solid var(--code-border);background:var(--code-bg);border-radius:6px;gap:2px;width:max-content;min-width:116px;padding:4px;display:grid;position:absolute;top:calc(100% + 4px);right:0;box-shadow:0 8px 18px #1f232829}.farming-computer-more-menu button{width:auto;min-width:0;color:var(--code-text);font:inherit;text-align:left;padding:0 8px;font-size:12px}.farming-computer-more-menu button:hover,.farming-computer-more-menu button:focus-visible{background:var(--code-hover)}.farming-computer-more-menu button.danger{color:#c53d3d}.farming-computer-actions svg,.farming-computer-empty svg{fill:currentColor;width:13px;height:13px}body.code-mode[data-appearance=dark] .farming-computer-row{--farming-computer-row-action-surface:var(--code-dark-bg-soft)}body.code-mode[data-appearance=dark] .farming-computer-row:hover,body.code-mode[data-appearance=dark] .farming-computer-row.active{--farming-computer-row-action-surface:var(--code-dark-bg-hover)}body.code-mode[data-appearance=dark] .farming-computer-resource-icon{color:#8b949e}body.code-mode[data-appearance=dark] .farming-computer-resource-icon.running{color:#3fb950}body.code-mode[data-appearance=dark] .farming-computer-resource-icon.failed{color:#ff7b72}body.code-mode[data-appearance=dark] .farming-computer-resource-icon.starting,body.code-mode[data-appearance=dark] .farming-computer-resource-icon.stopping{color:#d29922}body.code-mode[data-appearance=dark] .farming-computer-detail.error,body.code-mode[data-appearance=dark] .farming-computer-more-menu button.danger{color:#ff7b72}.farming-computer-empty{text-align:left;align-items:center;gap:7px;width:100%;height:32px;padding:0 8px;display:flex}.farming-computer-viewer{background:var(--code-bg);flex-direction:column;width:100%;min-width:0;height:100%;min-height:0;display:flex}.farming-computer-toolbar{border-bottom:1px solid var(--code-border);align-items:center;gap:8px;min-height:42px;padding:0 10px;display:flex}.farming-computer-toolbar button{color:var(--code-text-muted);background:0 0;border:0;border-radius:6px;min-height:28px}.farming-computer-toolbar button:hover{background:var(--code-hover);color:var(--code-text)}.farming-computer-toolbar svg{fill:currentColor;width:16px;height:16px}.farming-computer-toolbar-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.farming-computer-control-status{min-width:0;color:var(--code-text-muted);text-overflow:ellipsis;white-space:nowrap;margin-left:auto;font-size:12px;overflow:hidden}.farming-computer-control-button{padding:0 10px}.farming-computer-viewport{flex:1;min-height:0;position:relative}.farming-computer-viewport iframe{background:#111;border:0;width:100%;height:100%}.farming-computer-empty-state{height:100%;color:var(--code-text-muted);text-align:center;place-content:center;gap:12px;display:grid}.farming-computer-empty-state button{justify-self:center}.farming-computer-error{background:color-mix(in srgb, var(--code-bg) 92%, #c34747);color:var(--code-text);border:1px solid #c34747;border-radius:8px;padding:8px 10px;position:absolute;inset:auto 12px 12px}
|