farming-code 2.2.30 → 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/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} +1220 -1112
- 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.js → update-service.cjs} +258 -248
- 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/dist/acp/codex-acp-1.1.4.mjs +18 -1
- 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-D-zetSol.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 +1 -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/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 -634
- 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-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 -986
- package/backend/async-cache.js +0 -94
- package/backend/atomic-json-store.js +0 -37
- package/backend/auth.js +0 -251
- 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-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 -2362
- package/backend/command-runner-child.js +0 -67
- package/backend/config-manager.js +0 -1117
- 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 -403
- 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 -80
- 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 -288
- 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 -3225
- 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 -205
- 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/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-Z1N7T0eM.js +0 -695
- package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
- package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
- package/dist/assets/ProjectFilesSection-K3GHuQ4U.js +0 -12
- package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
- package/dist/assets/code-dark-kLsQLvpf.css +0 -1
- package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
- package/dist/assets/main-DUTz-Rd2.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 -1331
- package/extensions/browser/backend/browser-resource-store.js +0 -190
- package/extensions/browser/backend/browser-router.js +0 -141
- package/extensions/browser/backend/executable-discovery.js +0 -238
- package/extensions/browser/backend/farming-browser-client.js +0 -83
- package/extensions/browser/backend/index.js +0 -7
- package/extensions/browser/backend/managed-chromium-installer.js +0 -593
- 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 -38
- package/extensions/browser/frontend/useBrowserResources.ts +0 -166
- 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
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Generated by scripts/build-backend-runtime.ts. Do not edit.
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var terminal_state_serialization_exports = {};
|
|
21
|
+
__export(terminal_state_serialization_exports, {
|
|
22
|
+
MAX_REPLAY_EVENT_BYTES: () => MAX_REPLAY_EVENT_BYTES,
|
|
23
|
+
MAX_SERIALIZED_TERMINAL_STATE_BYTES: () => MAX_SERIALIZED_TERMINAL_STATE_BYTES,
|
|
24
|
+
TERMINAL_STATE_VERSION: () => TERMINAL_STATE_VERSION,
|
|
25
|
+
deserializeTerminalState: () => deserializeTerminalState,
|
|
26
|
+
normalizeTerminalStateEntry: () => normalizeTerminalStateEntry,
|
|
27
|
+
serializeTerminalState: () => serializeTerminalState,
|
|
28
|
+
terminalReplayText: () => terminalReplayText
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(terminal_state_serialization_exports);
|
|
31
|
+
const TERMINAL_STATE_VERSION = 1;
|
|
32
|
+
const MAX_SERIALIZED_TERMINAL_STATE_BYTES = 32 * 1024 * 1024;
|
|
33
|
+
const MAX_REPLAY_EVENT_BYTES = 8 * 1024 * 1024;
|
|
34
|
+
function recordValue(value) {
|
|
35
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
36
|
+
}
|
|
37
|
+
function finitePositiveInteger(value, fallback) {
|
|
38
|
+
const parsed = Math.floor(Number(value));
|
|
39
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
40
|
+
}
|
|
41
|
+
function normalizeReplayEvent(replayEvent) {
|
|
42
|
+
const source = recordValue(replayEvent);
|
|
43
|
+
const events = Array.isArray(source.events) ? source.events : [];
|
|
44
|
+
if (events.length !== 1) {
|
|
45
|
+
throw new Error("Serialized terminal state requires exactly one replay event");
|
|
46
|
+
}
|
|
47
|
+
const event = recordValue(events[0]);
|
|
48
|
+
const data = typeof event.data === "string" ? event.data : "";
|
|
49
|
+
if (Buffer.byteLength(data, "utf8") > MAX_REPLAY_EVENT_BYTES) {
|
|
50
|
+
throw new Error("Serialized terminal replay event exceeds the size limit");
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
events: [{
|
|
54
|
+
data,
|
|
55
|
+
cols: finitePositiveInteger(event.cols, 80),
|
|
56
|
+
rows: finitePositiveInteger(event.rows, 30)
|
|
57
|
+
}]
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function normalizeTerminalStateEntry(entry) {
|
|
61
|
+
if (!entry || typeof entry !== "object") {
|
|
62
|
+
throw new Error("Serialized terminal state entry must be an object");
|
|
63
|
+
}
|
|
64
|
+
const source = entry;
|
|
65
|
+
const id = typeof source.id === "string" ? source.id.trim() : "";
|
|
66
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$/.test(id)) {
|
|
67
|
+
throw new Error("Serialized terminal state has an invalid session id");
|
|
68
|
+
}
|
|
69
|
+
const metadata = recordValue(source.metadata);
|
|
70
|
+
const processDetails = recordValue(source.processDetails);
|
|
71
|
+
const processLaunchConfig = recordValue(source.processLaunchConfig);
|
|
72
|
+
return {
|
|
73
|
+
id,
|
|
74
|
+
metadata: {
|
|
75
|
+
...metadata,
|
|
76
|
+
agentId: id
|
|
77
|
+
},
|
|
78
|
+
processDetails: {
|
|
79
|
+
cwd: typeof processDetails.cwd === "string" ? processDetails.cwd : "",
|
|
80
|
+
title: typeof processDetails.title === "string" ? processDetails.title : ""
|
|
81
|
+
},
|
|
82
|
+
processLaunchConfig: {
|
|
83
|
+
command: typeof processLaunchConfig.command === "string" ? processLaunchConfig.command : "",
|
|
84
|
+
args: Array.isArray(processLaunchConfig.args) ? processLaunchConfig.args.filter((arg) => typeof arg === "string") : [],
|
|
85
|
+
category: typeof processLaunchConfig.category === "string" ? processLaunchConfig.category : ""
|
|
86
|
+
},
|
|
87
|
+
replayEvent: normalizeReplayEvent(source.replayEvent),
|
|
88
|
+
timestamp: Number.isFinite(Number(source.timestamp)) ? Math.max(0, Math.floor(Number(source.timestamp))) : Date.now()
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function serializeTerminalState(entries) {
|
|
92
|
+
const state = (Array.isArray(entries) ? entries : []).map(normalizeTerminalStateEntry);
|
|
93
|
+
const ids = /* @__PURE__ */ new Set();
|
|
94
|
+
for (const entry of state) {
|
|
95
|
+
if (ids.has(entry.id)) {
|
|
96
|
+
throw new Error(`Serialized terminal state contains duplicate session id ${entry.id}`);
|
|
97
|
+
}
|
|
98
|
+
ids.add(entry.id);
|
|
99
|
+
}
|
|
100
|
+
const serialized = JSON.stringify({
|
|
101
|
+
version: TERMINAL_STATE_VERSION,
|
|
102
|
+
state
|
|
103
|
+
});
|
|
104
|
+
if (Buffer.byteLength(serialized, "utf8") > MAX_SERIALIZED_TERMINAL_STATE_BYTES) {
|
|
105
|
+
throw new Error("Serialized terminal state exceeds the size limit");
|
|
106
|
+
}
|
|
107
|
+
return serialized;
|
|
108
|
+
}
|
|
109
|
+
function deserializeTerminalState(serialized) {
|
|
110
|
+
if (typeof serialized !== "string" || !serialized) return [];
|
|
111
|
+
if (Buffer.byteLength(serialized, "utf8") > MAX_SERIALIZED_TERMINAL_STATE_BYTES) {
|
|
112
|
+
throw new Error("Serialized terminal state exceeds the size limit");
|
|
113
|
+
}
|
|
114
|
+
let parsed;
|
|
115
|
+
try {
|
|
116
|
+
parsed = JSON.parse(serialized);
|
|
117
|
+
} catch {
|
|
118
|
+
throw new Error("Serialized terminal state is not valid JSON");
|
|
119
|
+
}
|
|
120
|
+
const envelope = recordValue(parsed);
|
|
121
|
+
if (envelope.version !== TERMINAL_STATE_VERSION || !Array.isArray(envelope.state)) {
|
|
122
|
+
throw new Error("Serialized terminal state has an unsupported format or version");
|
|
123
|
+
}
|
|
124
|
+
const state = envelope.state.map(normalizeTerminalStateEntry);
|
|
125
|
+
const ids = /* @__PURE__ */ new Set();
|
|
126
|
+
for (const entry of state) {
|
|
127
|
+
if (ids.has(entry.id)) {
|
|
128
|
+
throw new Error(`Serialized terminal state contains duplicate session id ${entry.id}`);
|
|
129
|
+
}
|
|
130
|
+
ids.add(entry.id);
|
|
131
|
+
}
|
|
132
|
+
return state;
|
|
133
|
+
}
|
|
134
|
+
function terminalReplayText(entry) {
|
|
135
|
+
const normalized = normalizeTerminalStateEntry(entry);
|
|
136
|
+
return normalized.replayEvent.events[0].data;
|
|
137
|
+
}
|
|
138
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
139
|
+
0 && (module.exports = {
|
|
140
|
+
MAX_REPLAY_EVENT_BYTES,
|
|
141
|
+
MAX_SERIALIZED_TERMINAL_STATE_BYTES,
|
|
142
|
+
TERMINAL_STATE_VERSION,
|
|
143
|
+
deserializeTerminalState,
|
|
144
|
+
normalizeTerminalStateEntry,
|
|
145
|
+
serializeTerminalState,
|
|
146
|
+
terminalReplayText
|
|
147
|
+
});
|
|
@@ -1,83 +1,86 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
// Generated by scripts/build-backend-runtime.ts. Do not edit.
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var terminal_status_exports = {};
|
|
21
|
+
__export(terminal_status_exports, {
|
|
22
|
+
deriveTerminalStatus: () => deriveTerminalStatus,
|
|
23
|
+
terminalInputReady: () => terminalInputReady,
|
|
24
|
+
terminalTextLooksIdleShellPrompt: () => terminalTextLooksIdleShellPrompt
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(terminal_status_exports);
|
|
27
|
+
const SHELL_COMMANDS = /* @__PURE__ */ new Set(["bash", "zsh", "sh", "fish"]);
|
|
28
|
+
const DIRECT_PROCESS_AGENTS = /* @__PURE__ */ new Set([
|
|
29
|
+
"opencode",
|
|
30
|
+
"qoder",
|
|
31
|
+
"qodercli",
|
|
32
|
+
"qwen",
|
|
33
|
+
"aider",
|
|
34
|
+
"github-copilot-cli",
|
|
35
|
+
"amazon-q"
|
|
10
36
|
]);
|
|
11
|
-
|
|
12
37
|
function executableName(command) {
|
|
13
|
-
const executable = String(command ||
|
|
14
|
-
|
|
15
|
-
.split(/\s+/)
|
|
16
|
-
.find(token => token && token !== 'env' && !/^[A-Za-z_][A-Za-z0-9_]*=/.test(token));
|
|
17
|
-
return (executable || '').split(/[\\/]/).pop() || '';
|
|
38
|
+
const executable = String(command || "").trim().split(/\s+/).find((token) => token && token !== "env" && !/^[A-Za-z_][A-Za-z0-9_]*=/.test(token));
|
|
39
|
+
return (executable || "").split(/[\\/]/).pop() || "";
|
|
18
40
|
}
|
|
19
|
-
|
|
20
41
|
function normalizedText(value) {
|
|
21
|
-
return stripTerminalControlSequences(value).replace(/\s+/g,
|
|
42
|
+
return stripTerminalControlSequences(value).replace(/\s+/g, " ").trim().toLowerCase();
|
|
22
43
|
}
|
|
23
|
-
|
|
24
44
|
function terminalLines(value) {
|
|
25
|
-
return stripTerminalControlSequences(value)
|
|
26
|
-
.replace(/\r/g, '')
|
|
27
|
-
.split('\n')
|
|
28
|
-
.map((line) => line.replace(/\s+/g, ' ').trim().toLowerCase())
|
|
29
|
-
.filter(Boolean);
|
|
45
|
+
return stripTerminalControlSequences(value).replace(/\r/g, "").split("\n").map((line) => line.replace(/\s+/g, " ").trim().toLowerCase()).filter(Boolean);
|
|
30
46
|
}
|
|
31
|
-
|
|
32
47
|
function stripTerminalControlSequences(value) {
|
|
33
|
-
return String(value ||
|
|
34
|
-
.replace(/\x1b\][^\x07]*(?:\x07|\x1b\\)/g, '')
|
|
35
|
-
.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, '');
|
|
48
|
+
return String(value || "").replace(/\x1b\][^\x07]*(?:\x07|\x1b\\)/g, "").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "");
|
|
36
49
|
}
|
|
37
|
-
|
|
38
50
|
function terminalStatusCommand(value) {
|
|
39
|
-
return stripTerminalControlSequences(value)
|
|
40
|
-
.replace(/[\x00-\x1f\x7f]/g, ' ')
|
|
41
|
-
.replace(/\s+/g, ' ')
|
|
42
|
-
.trim();
|
|
51
|
+
return stripTerminalControlSequences(value).replace(/[\x00-\x1f\x7f]/g, " ").replace(/\s+/g, " ").trim();
|
|
43
52
|
}
|
|
44
|
-
|
|
45
53
|
function finiteNumber(value) {
|
|
46
|
-
return typeof value ===
|
|
54
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
47
55
|
}
|
|
48
|
-
|
|
49
56
|
function lastMatchIndex(text, pattern) {
|
|
50
57
|
const matches = Array.from(text.matchAll(pattern));
|
|
51
|
-
const lastMatch = matches.length > 0 ? matches[matches.length - 1] :
|
|
52
|
-
return lastMatch && typeof lastMatch.index ===
|
|
58
|
+
const lastMatch = matches.length > 0 ? matches[matches.length - 1] : void 0;
|
|
59
|
+
return lastMatch && typeof lastMatch.index === "number" ? lastMatch.index : -1;
|
|
53
60
|
}
|
|
54
|
-
|
|
55
61
|
function lastIndexOfAny(text, needles) {
|
|
56
62
|
return needles.reduce((last, needle) => Math.max(last, text.lastIndexOf(needle)), -1);
|
|
57
63
|
}
|
|
58
|
-
|
|
59
64
|
function lastLineIndexMatching(text, predicate) {
|
|
60
65
|
let offset = 0;
|
|
61
66
|
let lastIndex = -1;
|
|
62
|
-
for (const line of text.split(
|
|
67
|
+
for (const line of text.split("\n")) {
|
|
63
68
|
if (predicate(line)) lastIndex = offset;
|
|
64
69
|
offset += line.length + 1;
|
|
65
70
|
}
|
|
66
71
|
return lastIndex;
|
|
67
72
|
}
|
|
68
|
-
|
|
69
73
|
function lastCodexIdleFooterIndex(text) {
|
|
70
74
|
return lastMatchIndex(text, /(?:^|\n)\s*(?:gpt|codex)[^\n]*(?:·|•)\s*(?:~|\/)[^\n]*$/gim);
|
|
71
75
|
}
|
|
72
|
-
|
|
73
76
|
function codexActiveIndex(text) {
|
|
74
77
|
const activeTextIndex = lastIndexOfAny(text, [
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
"pursuing goal",
|
|
79
|
+
"reconnecting",
|
|
80
|
+
"/stop to close",
|
|
81
|
+
"background terminal running",
|
|
82
|
+
"messages to be submitted after next tool call",
|
|
83
|
+
"stream disconnected before completion"
|
|
81
84
|
]);
|
|
82
85
|
const workingIndex = lastMatchIndex(
|
|
83
86
|
text,
|
|
@@ -85,182 +88,142 @@ function codexActiveIndex(text) {
|
|
|
85
88
|
);
|
|
86
89
|
return Math.max(activeTextIndex, workingIndex);
|
|
87
90
|
}
|
|
88
|
-
|
|
89
91
|
function codexBlockedIndex(text) {
|
|
90
92
|
return lastIndexOfAny(text, [
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
"goal blocked",
|
|
94
|
+
"input exceeds the context window",
|
|
95
|
+
"please adjust your input and try again"
|
|
94
96
|
]);
|
|
95
97
|
}
|
|
96
|
-
|
|
97
98
|
function lineShowsInterrupt(line) {
|
|
98
99
|
return /\b(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt\b/i.test(line);
|
|
99
100
|
}
|
|
100
|
-
|
|
101
101
|
function lineShowsClaudeStatusRow(line, excludeBareWorking = false) {
|
|
102
102
|
const normalized = line.trim().toLowerCase();
|
|
103
103
|
const match = normalized.match(
|
|
104
104
|
/^([*✳✱✲✶✻✽✢])?\s*([\p{L}\p{M}][\p{L}\p{M}'’-]*)(?:\.{3}|…)?\s*\(([^)]*)\)\s*$/u
|
|
105
105
|
);
|
|
106
106
|
if (!match || !lineShowsInterrupt(match[3])) return false;
|
|
107
|
-
if (excludeBareWorking && !match[1] && match[2] ===
|
|
108
|
-
|
|
107
|
+
if (excludeBareWorking && !match[1] && match[2] === "working") return false;
|
|
109
108
|
const interruptOnly = /^(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt$/i.test(match[3].trim());
|
|
110
109
|
const hasElapsedTime = /\b\d+(?:\.\d+)?\s*(?:ms|s|m|h)\b/i.test(match[3]);
|
|
111
110
|
return interruptOnly || hasElapsedTime;
|
|
112
111
|
}
|
|
113
|
-
|
|
114
112
|
function lineShowsClaudeActivity(line) {
|
|
115
113
|
const normalized = line.trim().toLowerCase();
|
|
116
114
|
if (/^(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt$/.test(normalized)) return true;
|
|
117
115
|
return lineShowsClaudeStatusRow(normalized);
|
|
118
116
|
}
|
|
119
|
-
|
|
120
117
|
function lineShowsClaudeKindEvidence(line) {
|
|
121
118
|
const normalized = line.trim().toLowerCase();
|
|
122
119
|
if (/^(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt$/.test(normalized)) return true;
|
|
123
120
|
return lineShowsClaudeStatusRow(normalized, true);
|
|
124
121
|
}
|
|
125
|
-
|
|
126
122
|
function terminalLineLooksLikeIdleShellPrompt(line) {
|
|
127
123
|
return /^(?:\s*[│┃]\s*(?:[^$%#\n]+?\s+)?[$%#]|\s*(?:\([^)]+\)\s+)?(?:[\w.-]+@[\w.-]+:)?[~/][\w./~:+-]*\s*[$%#]|\s*[$%#])\s*$/u.test(line);
|
|
128
124
|
}
|
|
129
|
-
|
|
130
125
|
function latestTerminalKindFromText(title, previewText) {
|
|
131
|
-
const text = stripTerminalControlSequences(previewText).replace(/\r/g,
|
|
126
|
+
const text = stripTerminalControlSequences(previewText).replace(/\r/g, "").toLowerCase();
|
|
132
127
|
const candidates = [];
|
|
133
128
|
const codexIndex = Math.max(lastCodexIdleFooterIndex(text), codexActiveIndex(text));
|
|
134
|
-
if (codexIndex >= 0) candidates.push({ kind:
|
|
135
|
-
|
|
129
|
+
if (codexIndex >= 0) candidates.push({ kind: "codex", index: codexIndex });
|
|
136
130
|
const claudeIndex = lastLineIndexMatching(text, lineShowsClaudeKindEvidence);
|
|
137
|
-
if (claudeIndex >= 0) candidates.push({ kind:
|
|
138
|
-
|
|
131
|
+
if (claudeIndex >= 0) candidates.push({ kind: "claude", index: claudeIndex });
|
|
139
132
|
const shellIndex = lastLineIndexMatching(text, terminalLineLooksLikeIdleShellPrompt);
|
|
140
|
-
if (shellIndex >= 0) candidates.push({ kind:
|
|
141
|
-
|
|
133
|
+
if (shellIndex >= 0) candidates.push({ kind: "shell", index: shellIndex });
|
|
142
134
|
const latest = candidates.sort((left, right) => right.index - left.index)[0];
|
|
143
135
|
if (latest) return latest.kind;
|
|
144
|
-
|
|
145
136
|
const normalizedTitle = normalizedText(title);
|
|
146
|
-
if (/\bclaude\s+code\b/.test(normalizedTitle)) return
|
|
147
|
-
if (/\bcodex\b/.test(normalizedTitle)) return
|
|
137
|
+
if (/\bclaude\s+code\b/.test(normalizedTitle)) return "claude";
|
|
138
|
+
if (/\bcodex\b/.test(normalizedTitle)) return "codex";
|
|
148
139
|
return null;
|
|
149
140
|
}
|
|
150
|
-
|
|
151
141
|
function inferKindFromText(title, previewText, command) {
|
|
152
142
|
const commandName = executableName(command).toLowerCase();
|
|
153
|
-
if (DIRECT_PROCESS_AGENTS.has(commandName)) return
|
|
154
|
-
if (commandName && !SHELL_COMMANDS.has(commandName) && commandName !==
|
|
143
|
+
if (DIRECT_PROCESS_AGENTS.has(commandName)) return "process";
|
|
144
|
+
if (commandName && !SHELL_COMMANDS.has(commandName) && commandName !== "codex" && commandName !== "claude") return "process";
|
|
155
145
|
const terminalKind = latestTerminalKindFromText(title, previewText);
|
|
156
146
|
if (terminalKind) return terminalKind;
|
|
157
|
-
if (commandName ===
|
|
158
|
-
if (commandName ===
|
|
159
|
-
if (SHELL_COMMANDS.has(commandName)) return
|
|
160
|
-
return commandName ?
|
|
147
|
+
if (commandName === "claude") return "claude";
|
|
148
|
+
if (commandName === "codex") return "codex";
|
|
149
|
+
if (SHELL_COMMANDS.has(commandName)) return "shell";
|
|
150
|
+
return commandName ? "process" : "unknown";
|
|
161
151
|
}
|
|
162
|
-
|
|
163
152
|
function terminalTextLooksIdleShellPrompt(previewText) {
|
|
164
|
-
const lines = stripTerminalControlSequences(previewText)
|
|
165
|
-
.replace(/\r/g, '')
|
|
166
|
-
.split('\n')
|
|
167
|
-
.map(line => line.trimEnd())
|
|
168
|
-
.filter(Boolean);
|
|
153
|
+
const lines = stripTerminalControlSequences(previewText).replace(/\r/g, "").split("\n").map((line) => line.trimEnd()).filter(Boolean);
|
|
169
154
|
if (lines.length === 0) return false;
|
|
170
|
-
|
|
171
155
|
return terminalLineLooksLikeIdleShellPrompt(lines[lines.length - 1]);
|
|
172
156
|
}
|
|
173
|
-
|
|
174
157
|
function terminalTitleShowsCodexActivity(title) {
|
|
175
|
-
return /^[\s]*[\u2800-\u28ff]/u.test(String(title ||
|
|
158
|
+
return /^[\s]*[\u2800-\u28ff]/u.test(String(title || ""));
|
|
176
159
|
}
|
|
177
|
-
|
|
178
160
|
function inferCodexActivity(title, previewText) {
|
|
179
|
-
if (terminalTitleShowsCodexActivity(title)) return
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!text.trim()) return 'unknown';
|
|
183
|
-
|
|
161
|
+
if (terminalTitleShowsCodexActivity(title)) return "busy";
|
|
162
|
+
const text = stripTerminalControlSequences(previewText).replace(/\r/g, "").toLowerCase();
|
|
163
|
+
if (!text.trim()) return "unknown";
|
|
184
164
|
const idleIndex = lastCodexIdleFooterIndex(text);
|
|
185
165
|
const blockedIndex = codexBlockedIndex(text);
|
|
186
166
|
const activeIndex = codexActiveIndex(text);
|
|
187
167
|
const inactiveIndex = Math.max(idleIndex, blockedIndex);
|
|
188
|
-
if (activeIndex >= 0) return inactiveIndex > activeIndex ?
|
|
189
|
-
if (inactiveIndex >= 0) return
|
|
190
|
-
return
|
|
168
|
+
if (activeIndex >= 0) return inactiveIndex > activeIndex ? "idle" : "busy";
|
|
169
|
+
if (inactiveIndex >= 0) return "idle";
|
|
170
|
+
return "unknown";
|
|
191
171
|
}
|
|
192
|
-
|
|
193
172
|
function inferClaudeActivity(previewText) {
|
|
194
173
|
const lines = terminalLines(previewText);
|
|
195
|
-
if (lines.length === 0) return
|
|
196
|
-
return lines.some(lineShowsClaudeActivity) ?
|
|
174
|
+
if (lines.length === 0) return "unknown";
|
|
175
|
+
return lines.some(lineShowsClaudeActivity) ? "busy" : "idle";
|
|
197
176
|
}
|
|
198
|
-
|
|
199
177
|
function inferOpenCodeActivity(previewText) {
|
|
200
178
|
const lines = terminalLines(previewText);
|
|
201
|
-
if (lines.length === 0) return
|
|
179
|
+
if (lines.length === 0) return "unknown";
|
|
202
180
|
const tail = lines.slice(-8);
|
|
203
181
|
let footerIndex = -1;
|
|
204
182
|
for (let index = 0; index < tail.length; index += 1) {
|
|
205
183
|
if (/(?:•|·)\s*opencode\s+\d+(?:\.\d+){1,2}\b/.test(tail[index])) footerIndex = index;
|
|
206
184
|
}
|
|
207
|
-
if (footerIndex < 0) return
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
&& /\b(?:esc|escape|ctrl\+c|ctrl-c)(?:\s+(?:again\s+)?to)?\s+interrupt\b/.test(line)
|
|
212
|
-
);
|
|
213
|
-
const activeFooter = activeProgress(tail[footerIndex])
|
|
214
|
-
|| (footerIndex > 0 && activeProgress(tail[footerIndex - 1]));
|
|
215
|
-
return activeFooter ? 'busy' : 'idle';
|
|
185
|
+
if (footerIndex < 0) return "idle";
|
|
186
|
+
const activeProgress = (line) => /^(?:[│┃]\s*)?[■⬝⭝]{3,}/u.test(line) && /\b(?:esc|escape|ctrl\+c|ctrl-c)(?:\s+(?:again\s+)?to)?\s+interrupt\b/.test(line);
|
|
187
|
+
const activeFooter = activeProgress(tail[footerIndex]) || footerIndex > 0 && activeProgress(tail[footerIndex - 1]);
|
|
188
|
+
return activeFooter ? "busy" : "idle";
|
|
216
189
|
}
|
|
217
|
-
|
|
218
190
|
function inferQoderLikeActivity(title, previewText, commandName) {
|
|
219
191
|
const normalizedTitle = stripTerminalControlSequences(title).trim();
|
|
220
|
-
if (commandName ===
|
|
221
|
-
if (/^✋/u.test(normalizedTitle)) return
|
|
192
|
+
if (commandName === "qoder" || commandName === "qodercli") {
|
|
193
|
+
if (/^✋/u.test(normalizedTitle)) return "idle";
|
|
222
194
|
}
|
|
223
|
-
|
|
224
195
|
const lines = terminalLines(previewText);
|
|
225
196
|
const tail = lines.slice(-8);
|
|
226
197
|
const active = tail.some((line, index) => {
|
|
227
198
|
if (!/^[\u2800-\u28ff]/u.test(line)) return false;
|
|
228
|
-
const loadingWindow = tail.slice(index, index + 3).join(
|
|
229
|
-
return /\besc\b/.test(loadingWindow)
|
|
230
|
-
&& /\b\d+(?:\.\d+)?\s*(?:ms|s|m|h)\b/.test(loadingWindow);
|
|
199
|
+
const loadingWindow = tail.slice(index, index + 3).join(" ");
|
|
200
|
+
return /\besc\b/.test(loadingWindow) && /\b\d+(?:\.\d+)?\s*(?:ms|s|m|h)\b/.test(loadingWindow);
|
|
231
201
|
});
|
|
232
|
-
if (active) return
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (
|
|
236
|
-
if (/^◇/u.test(normalizedTitle)) return 'idle';
|
|
202
|
+
if (active) return "busy";
|
|
203
|
+
if (commandName === "qoder" || commandName === "qodercli") {
|
|
204
|
+
if (/^[✦⏲]/u.test(normalizedTitle)) return "busy";
|
|
205
|
+
if (/^◇/u.test(normalizedTitle)) return "idle";
|
|
237
206
|
}
|
|
238
|
-
return lines.length > 0 || normalizedTitle ?
|
|
207
|
+
return lines.length > 0 || normalizedTitle ? "idle" : "unknown";
|
|
239
208
|
}
|
|
240
|
-
|
|
241
209
|
function inferGenericActivity(previewText, terminalBusy) {
|
|
242
|
-
if (terminalBusy === true) return
|
|
243
|
-
if (terminalBusy === false) return
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
return 'unknown';
|
|
210
|
+
if (terminalBusy === true) return "busy";
|
|
211
|
+
if (terminalBusy === false) return "idle";
|
|
212
|
+
if (terminalTextLooksIdleShellPrompt(previewText)) return "idle";
|
|
213
|
+
return "unknown";
|
|
247
214
|
}
|
|
248
|
-
|
|
249
215
|
function nestedProcessCommandFromTitle(title) {
|
|
250
216
|
const normalizedTitle = stripTerminalControlSequences(title).trim();
|
|
251
|
-
if (/^oc\s*\|/i.test(normalizedTitle)) return
|
|
252
|
-
if (/^[◇✋✦⏲]/u.test(normalizedTitle)) return
|
|
253
|
-
if (/^qwen\b/i.test(normalizedTitle)) return
|
|
254
|
-
return
|
|
217
|
+
if (/^oc\s*\|/i.test(normalizedTitle)) return "opencode";
|
|
218
|
+
if (/^[◇✋✦⏲]/u.test(normalizedTitle)) return "qodercli";
|
|
219
|
+
if (/^qwen\b/i.test(normalizedTitle)) return "qwen";
|
|
220
|
+
return "";
|
|
255
221
|
}
|
|
256
|
-
|
|
257
222
|
function deriveTerminalStatus(options = {}) {
|
|
258
|
-
const title = typeof options.title ===
|
|
259
|
-
const previewText = typeof options.previewText ===
|
|
260
|
-
const terminalBusy = typeof options.terminalBusy ===
|
|
261
|
-
const hasShellStatus = options.shellLastEvent ===
|
|
262
|
-
|| options.shellLastEvent === 'finish'
|
|
263
|
-
|| typeof options.shellLastExitCode === 'number';
|
|
223
|
+
const title = typeof options.title === "string" ? options.title : "";
|
|
224
|
+
const previewText = typeof options.previewText === "string" ? options.previewText : "";
|
|
225
|
+
const terminalBusy = typeof options.terminalBusy === "boolean" ? options.terminalBusy : null;
|
|
226
|
+
const hasShellStatus = options.shellLastEvent === "start" || options.shellLastEvent === "finish" || typeof options.shellLastExitCode === "number";
|
|
264
227
|
const commandName = executableName(options.command).toLowerCase();
|
|
265
228
|
const runningCommandName = executableName(options.shellCommand).toLowerCase();
|
|
266
229
|
const launchedFromShell = SHELL_COMMANDS.has(commandName);
|
|
@@ -268,59 +231,48 @@ function deriveTerminalStatus(options = {}) {
|
|
|
268
231
|
let kind;
|
|
269
232
|
if (launchedFromShell && runningCommandName) {
|
|
270
233
|
activityCommandName = runningCommandName;
|
|
271
|
-
if (runningCommandName ===
|
|
272
|
-
else if (runningCommandName ===
|
|
273
|
-
else if (DIRECT_PROCESS_AGENTS.has(runningCommandName)) kind =
|
|
274
|
-
else kind =
|
|
234
|
+
if (runningCommandName === "codex") kind = "codex";
|
|
235
|
+
else if (runningCommandName === "claude") kind = "claude";
|
|
236
|
+
else if (DIRECT_PROCESS_AGENTS.has(runningCommandName)) kind = "process";
|
|
237
|
+
else kind = "shell";
|
|
275
238
|
} else {
|
|
276
|
-
const nestedProcessCommand = launchedFromShell && !terminalTextLooksIdleShellPrompt(previewText)
|
|
277
|
-
? nestedProcessCommandFromTitle(title)
|
|
278
|
-
: '';
|
|
239
|
+
const nestedProcessCommand = launchedFromShell && !terminalTextLooksIdleShellPrompt(previewText) ? nestedProcessCommandFromTitle(title) : "";
|
|
279
240
|
if (nestedProcessCommand) {
|
|
280
241
|
activityCommandName = nestedProcessCommand;
|
|
281
|
-
kind =
|
|
242
|
+
kind = "process";
|
|
282
243
|
} else {
|
|
283
244
|
kind = inferKindFromText(title, previewText, options.command);
|
|
284
245
|
}
|
|
285
246
|
}
|
|
286
|
-
const shellActivity = kind ===
|
|
287
|
-
const hasPromptIdleFallback = options.status !==
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
let activity = 'unknown';
|
|
292
|
-
if (options.status === 'exited') {
|
|
293
|
-
activity = 'exited';
|
|
247
|
+
const shellActivity = kind === "shell";
|
|
248
|
+
const hasPromptIdleFallback = options.status !== "exited" && shellActivity && terminalBusy === true && terminalTextLooksIdleShellPrompt(previewText);
|
|
249
|
+
let activity = "unknown";
|
|
250
|
+
if (options.status === "exited") {
|
|
251
|
+
activity = "exited";
|
|
294
252
|
} else if (hasPromptIdleFallback) {
|
|
295
|
-
activity =
|
|
253
|
+
activity = "idle";
|
|
254
|
+
} else if (kind === "codex") {
|
|
255
|
+
const inferredCodexActivity = inferCodexActivity(title, previewText);
|
|
256
|
+
activity = inferredCodexActivity === "unknown" && terminalBusy !== null ? terminalBusy ? "busy" : "idle" : inferredCodexActivity;
|
|
296
257
|
} else if (!SHELL_COMMANDS.has(commandName) && terminalBusy !== null) {
|
|
297
|
-
activity = terminalBusy ?
|
|
298
|
-
} else if (kind ===
|
|
299
|
-
activity = inferCodexActivity(title, previewText);
|
|
300
|
-
} else if (kind === 'claude') {
|
|
258
|
+
activity = terminalBusy ? "busy" : "idle";
|
|
259
|
+
} else if (kind === "claude") {
|
|
301
260
|
activity = inferClaudeActivity(previewText);
|
|
302
|
-
} else if (activityCommandName ===
|
|
261
|
+
} else if (activityCommandName === "opencode") {
|
|
303
262
|
activity = inferOpenCodeActivity(previewText);
|
|
304
|
-
} else if (activityCommandName ===
|
|
305
|
-
|| activityCommandName === 'qodercli'
|
|
306
|
-
|| activityCommandName === 'qwen') {
|
|
263
|
+
} else if (activityCommandName === "qoder" || activityCommandName === "qodercli" || activityCommandName === "qwen") {
|
|
307
264
|
activity = inferQoderLikeActivity(title, previewText, activityCommandName);
|
|
308
265
|
} else {
|
|
309
266
|
activity = inferGenericActivity(previewText, terminalBusy);
|
|
310
267
|
}
|
|
311
|
-
|
|
312
268
|
const status = {
|
|
313
269
|
kind,
|
|
314
270
|
activity,
|
|
315
|
-
busy: activity ===
|
|
316
|
-
cwd: typeof options.cwd ===
|
|
271
|
+
busy: activity === "busy",
|
|
272
|
+
cwd: typeof options.cwd === "string" ? options.cwd : "",
|
|
317
273
|
title,
|
|
318
|
-
lastExitCode: typeof options.shellLastExitCode ===
|
|
319
|
-
source: hasPromptIdleFallback
|
|
320
|
-
? 'shell-prompt-fallback'
|
|
321
|
-
: (shellActivity && hasShellStatus
|
|
322
|
-
? 'shell-status-marker'
|
|
323
|
-
: (shellActivity && terminalBusy !== null ? 'shell-busy-marker' : 'terminal-text')),
|
|
274
|
+
lastExitCode: typeof options.shellLastExitCode === "number" ? options.shellLastExitCode : null,
|
|
275
|
+
source: hasPromptIdleFallback ? "shell-prompt-fallback" : shellActivity && hasShellStatus ? "shell-status-marker" : shellActivity && terminalBusy !== null ? "shell-busy-marker" : "terminal-text"
|
|
324
276
|
};
|
|
325
277
|
const runningCommand = terminalStatusCommand(options.shellCommand);
|
|
326
278
|
const lastCommand = terminalStatusCommand(options.shellLastCommand);
|
|
@@ -348,28 +300,26 @@ function deriveTerminalStatus(options = {}) {
|
|
|
348
300
|
}
|
|
349
301
|
return status;
|
|
350
302
|
}
|
|
351
|
-
|
|
352
303
|
function terminalInputReady(options = {}) {
|
|
353
304
|
const status = deriveTerminalStatus(options);
|
|
354
|
-
if (status.activity !==
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
const text = stripTerminalControlSequences(previewText).replace(/\r/g, '').toLowerCase();
|
|
305
|
+
if (status.activity !== "idle") return false;
|
|
306
|
+
const previewText = typeof options.previewText === "string" ? options.previewText : "";
|
|
307
|
+
if (status.kind === "codex") {
|
|
308
|
+
const text = stripTerminalControlSequences(previewText).replace(/\r/g, "").toLowerCase();
|
|
359
309
|
return lastCodexIdleFooterIndex(text) >= 0 || codexBlockedIndex(text) >= 0;
|
|
360
310
|
}
|
|
361
|
-
if (status.kind ===
|
|
362
|
-
const text = stripTerminalControlSequences(previewText).replace(/\r/g,
|
|
311
|
+
if (status.kind === "claude") {
|
|
312
|
+
const text = stripTerminalControlSequences(previewText).replace(/\r/g, "");
|
|
363
313
|
return /(?:^|\n)\s*❯(?:\s|$)/u.test(text);
|
|
364
314
|
}
|
|
365
|
-
if (status.kind ===
|
|
315
|
+
if (status.kind === "shell") {
|
|
366
316
|
return options.terminalBusy === false || terminalTextLooksIdleShellPrompt(previewText);
|
|
367
317
|
}
|
|
368
318
|
return Boolean(stripTerminalControlSequences(previewText).trim());
|
|
369
319
|
}
|
|
370
|
-
|
|
371
|
-
module.exports = {
|
|
320
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
321
|
+
0 && (module.exports = {
|
|
372
322
|
deriveTerminalStatus,
|
|
373
323
|
terminalInputReady,
|
|
374
|
-
terminalTextLooksIdleShellPrompt
|
|
375
|
-
};
|
|
324
|
+
terminalTextLooksIdleShellPrompt
|
|
325
|
+
});
|