@tencent-ai/agent-sdk 0.3.266-next.f68bfb7.202609270017 → 0.3.267
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/cli/CHANGELOG.md +32 -0
- package/cli/dist/codebuddy-broker.js +5 -5
- package/cli/dist/codebuddy-headless.js +44 -42
- package/cli/dist/codebuddy-lite-wb.mjs +101 -99
- package/cli/dist/lazy-lite-wb/6754.e0703738.mjs +1 -0
- package/cli/dist/lazy-lite-wb/manifest.json +1 -1
- package/cli/dist/web-ui/assets/{CanvasPaneStandaloneView-SU_Ea1z6.js → CanvasPaneStandaloneView-CggsVv2O.js} +1 -1
- package/cli/dist/web-ui/assets/{CanvasView-DK25_bGU.js → CanvasView-vQJKX3e6.js} +1 -1
- package/cli/dist/web-ui/assets/{ChangesView-CaCnbWjG.js → ChangesView-Cnun4F2M.js} +1 -1
- package/cli/dist/web-ui/assets/{DocsView-D2aoGiPk.js → DocsView-DjyoHZNR.js} +1 -1
- package/cli/dist/web-ui/assets/{EditorView-zwHeTGS2.js → EditorView-DwFxRAcs.js} +1 -1
- package/cli/dist/web-ui/assets/{KeybindingsView-ubDgeKe0.js → KeybindingsView-Bxrl4-4d.js} +1 -1
- package/cli/dist/web-ui/assets/{LogsView-CwCFft0q.js → LogsView-C_ukcrVW.js} +1 -1
- package/cli/dist/web-ui/assets/{MetricsView-B3sPR-JR.js → MetricsView-CNYFP6Pz.js} +1 -1
- package/cli/dist/web-ui/assets/{PluginsView-Dnkv5TkH.js → PluginsView-D2FQLLBN.js} +1 -1
- package/cli/dist/web-ui/assets/{RemoteControlView-CxubE-be.js → RemoteControlView-CIRk8oa3.js} +1 -1
- package/cli/dist/web-ui/assets/{SettingsView-CMh9iL8l.js → SettingsView-PfLX7aHy.js} +1 -1
- package/cli/dist/web-ui/assets/{SplitContainer-DNbFOhhW.js → SplitContainer-Dyc3pxec.js} +1 -1
- package/cli/dist/web-ui/assets/{StatsView-D0zFxR-_.js → StatsView-BXNd4GQD.js} +1 -1
- package/cli/dist/web-ui/assets/{TasksView-Bym2uAhK.js → TasksView-YkBVy3Jz.js} +1 -1
- package/cli/dist/web-ui/assets/{TerminalPaneView-_PPuwSZa.js → TerminalPaneView-B_N6i1P9.js} +1 -1
- package/cli/dist/web-ui/assets/{TracesView-nTJumJi9.js → TracesView-DLmdce0C.js} +1 -1
- package/cli/dist/web-ui/assets/{WorkersView-DquW8hUK.js → WorkersView-CDk26XFs.js} +1 -1
- package/cli/dist/web-ui/assets/{abnfDiagram-O67JEVCF-wfSei231.js → abnfDiagram-O67JEVCF-Dm4vwNip.js} +1 -1
- package/cli/dist/web-ui/assets/architecture-7GRP2DOG-yUiTqiyU.js +1 -0
- package/cli/dist/web-ui/assets/{architectureDiagram-NJMV4G6O-DkhUq2aO.js → architectureDiagram-NJMV4G6O-CDJJt2Qg.js} +1 -1
- package/cli/dist/web-ui/assets/{blockDiagram-BEXU5L5S-CYrK_n-d.js → blockDiagram-BEXU5L5S-HLobr25a.js} +1 -1
- package/cli/dist/web-ui/assets/{c4Diagram-YGBWAQC7-CenufeKv.js → c4Diagram-YGBWAQC7-DT18468o.js} +1 -1
- package/cli/dist/web-ui/assets/channel-t7L9tY9V.js +1 -0
- package/cli/dist/web-ui/assets/{chunk-3FUC2YCW-C14WV4gd.js → chunk-3FUC2YCW-BsgE7XEr.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-5DYCD2WN-DJyTK2vl.js → chunk-5DYCD2WN-FvZQrKyS.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-742MDFTN-BxNxAoMy.js → chunk-742MDFTN-BlN76mZP.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-7INBJB4K-HVOczD0y.js → chunk-7INBJB4K-B13RKg2g.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-7M6MHVWA-D5kt4v5M.js → chunk-7M6MHVWA-B3YQ3POG.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-7PRAP22T-0HbmiO6Q.js → chunk-7PRAP22T-CisPWG5V.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-GTNCS2PH-CrwmqOi6.js → chunk-GTNCS2PH-afhuYhsN.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-GWA4HPMP-BvHcJwxT.js → chunk-GWA4HPMP-D9Qo1YbW.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-MBY4JIJT-Cn-zAxM8.js → chunk-MBY4JIJT-BQCj0PIU.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-NETBCI7D-XxVPg81v.js → chunk-NETBCI7D-CXJJ_OgG.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-O7XYJQB3-dWjDZ6uk.js → chunk-O7XYJQB3-DpUq3nhW.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-UA2S7LBM-DvFjzJCt.js → chunk-UA2S7LBM-CIyA4mZf.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-WEXAMYUT-Bzf3kj0N.js → chunk-WEXAMYUT-DHcLpJO_.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-Z7XXMR3K-BY9TNOTY.js → chunk-Z7XXMR3K-Cwaqz-s8.js} +1 -1
- package/cli/dist/web-ui/assets/{chunk-ZIGJFQKS-CG2O0Shm.js → chunk-ZIGJFQKS-CK0Fq42a.js} +1 -1
- package/cli/dist/web-ui/assets/{classDiagram-v2-NBCMYWYE-BgLsOWuy.js → classDiagram-v2-NBCMYWYE-BtZNUtHB.js} +1 -1
- package/cli/dist/web-ui/assets/{cssMode-CBijbskC.js → cssMode-DUWXLF1d.js} +1 -1
- package/cli/dist/web-ui/assets/{cynefin-OW5HDTMX-CwiQE3LN.js → cynefin-OW5HDTMX-_uaBlSmg.js} +1 -1
- package/cli/dist/web-ui/assets/{cynefinDiagram-VND7K2PF-qwG0HRVE.js → cynefinDiagram-VND7K2PF-DoUm9SJL.js} +1 -1
- package/cli/dist/web-ui/assets/{dagre-6A5THRUB-CzUaZVF6.js → dagre-6A5THRUB-CragC02n.js} +1 -1
- package/cli/dist/web-ui/assets/{diagram-22UHCM2B-BhyjMLu2.js → diagram-22UHCM2B-_eEK8nP0.js} +1 -1
- package/cli/dist/web-ui/assets/{diagram-3UASUU5V-ChX6zX3b.js → diagram-3UASUU5V-DVtxcVMS.js} +1 -1
- package/cli/dist/web-ui/assets/{diagram-ATOU4E4O-zTliEttv.js → diagram-ATOU4E4O-BDfdUXrt.js} +1 -1
- package/cli/dist/web-ui/assets/{diagram-CDSNMT55-BvaB9AP2.js → diagram-CDSNMT55-D7i3H3_2.js} +1 -1
- package/cli/dist/web-ui/assets/{diagram-MLGK6HIB-cvo1hRv9.js → diagram-MLGK6HIB-De4w4TLS.js} +1 -1
- package/cli/dist/web-ui/assets/{diagram-MPIPVDR6-TY8jjJI1.js → diagram-MPIPVDR6-C9osrJbJ.js} +1 -1
- package/cli/dist/web-ui/assets/{ebnfDiagram-ZINNZB2B-DSzsZbJd.js → ebnfDiagram-ZINNZB2B-DjxcOXwC.js} +1 -1
- package/cli/dist/web-ui/assets/{editor.main-CeZ_fAX8.js → editor.main-CPRtusPI.js} +2 -2
- package/cli/dist/web-ui/assets/{elk-276RUBZZ-Vt8TGKZO.js → elk-276RUBZZ-CFAFIU0F.js} +1 -1
- package/cli/dist/web-ui/assets/{erDiagram-OPXOYQCR-D55fOKpf.js → erDiagram-OPXOYQCR-BLBHQoU6.js} +1 -1
- package/cli/dist/web-ui/assets/eventmodeling-NTZA5JFV-DS3XP8WY.js +1 -0
- package/cli/dist/web-ui/assets/flowDiagram-KWPJA3E3-Dvx6R_--.js +1 -0
- package/cli/dist/web-ui/assets/{ganttDiagram-FUAMR5RP-MFDM7YM1.js → ganttDiagram-FUAMR5RP-f8CoJfd3.js} +1 -1
- package/cli/dist/web-ui/assets/{gitGraph-4MIJSDKK-WywtnaP2.js → gitGraph-4MIJSDKK-Cc3FLXIb.js} +1 -1
- package/cli/dist/web-ui/assets/{gitGraphDiagram-X574FWY7-BHjhK4Em.js → gitGraphDiagram-X574FWY7-_Qjq6own.js} +1 -1
- package/cli/dist/web-ui/assets/{htmlMode-DxhL4Yop.js → htmlMode-DQLUkm_G.js} +1 -1
- package/cli/dist/web-ui/assets/index-D_qw1pgW.css +1 -0
- package/cli/dist/web-ui/assets/{index-C2r6zBjS.js → index-pGuNko_S.js} +78 -76
- package/cli/dist/web-ui/assets/{info-A6RAGUB7-CWIG4o6O.js → info-A6RAGUB7-DGIWyeWQ.js} +1 -1
- package/cli/dist/web-ui/assets/{infoDiagram-VRGFBTTK-B77SjMS4.js → infoDiagram-VRGFBTTK-BlwbTxtS.js} +1 -1
- package/cli/dist/web-ui/assets/{ishikawaDiagram-OU5B5YK6-Bo3KZmB1.js → ishikawaDiagram-OU5B5YK6-Dkw0_46m.js} +1 -1
- package/cli/dist/web-ui/assets/{journeyDiagram-ZHPQQLJL-P5qQJKBf.js → journeyDiagram-ZHPQQLJL-Cl1eV1OW.js} +1 -1
- package/cli/dist/web-ui/assets/{jsonMode-Buftx9e-.js → jsonMode-CPpoXVhR.js} +1 -1
- package/cli/dist/web-ui/assets/{kanban-definition-PNTS6WVX-CV0kV0mO.js → kanban-definition-PNTS6WVX-CyIdmJbm.js} +1 -1
- package/cli/dist/web-ui/assets/{line-DO3xUTsZ.js → line-1D19ZQ_y.js} +1 -1
- package/cli/dist/web-ui/assets/{mermaid-parser.core-CAEE4w19.js → mermaid-parser.core-9XC_0gdx.js} +3 -3
- package/cli/dist/web-ui/assets/{mermaid.core-6XqBRFX0.js → mermaid.core-BCBYHaML.js} +4 -4
- package/cli/dist/web-ui/assets/{mindmap-definition-NLK3R4M7-eQbt8Mtr.js → mindmap-definition-NLK3R4M7-nMk4OUTC.js} +1 -1
- package/cli/dist/web-ui/assets/{packet-AYTQ26CC-Dpl1mwIo.js → packet-AYTQ26CC-BuL6w8cv.js} +1 -1
- package/cli/dist/web-ui/assets/{pegDiagram-GJSIUBJH-COxJ2__b.js → pegDiagram-GJSIUBJH-Cv8w3nCn.js} +1 -1
- package/cli/dist/web-ui/assets/{pie-WAS4IAKB-B7zprsu8.js → pie-WAS4IAKB-DXJN1JJF.js} +1 -1
- package/cli/dist/web-ui/assets/{pieDiagram-5QR66LMP-C_vvigGf.js → pieDiagram-5QR66LMP-qinRBF2E.js} +1 -1
- package/cli/dist/web-ui/assets/{quadrantDiagram-O4NWA36T-DukGgu1U.js → quadrantDiagram-O4NWA36T-BLynFZJP.js} +1 -1
- package/cli/dist/web-ui/assets/{radar-RG4KPBEZ-nBETXp9T.js → radar-RG4KPBEZ-Ca0t2cXr.js} +1 -1
- package/cli/dist/web-ui/assets/{railroad-74A4TZTK-DtZtfy2Y.js → railroad-74A4TZTK-BUsZk3y9.js} +1 -1
- package/cli/dist/web-ui/assets/railroad-abnf-HS5TGJTU-CGmnp5Cx.js +1 -0
- package/cli/dist/web-ui/assets/railroad-ebnf-LZEXJU2U-mG-WSEKI.js +1 -0
- package/cli/dist/web-ui/assets/railroad-peg-WCYAUIDC-bwgLPIz0.js +1 -0
- package/cli/dist/web-ui/assets/{railroadDiagram-XR7U4H2S-dUKhkqjZ.js → railroadDiagram-XR7U4H2S-BtjJ6nty.js} +1 -1
- package/cli/dist/web-ui/assets/{requirementDiagram-PLB6GJNP-Ba05gKbE.js → requirementDiagram-PLB6GJNP-BkWCMFMX.js} +1 -1
- package/cli/dist/web-ui/assets/{sankeyDiagram-IPEJSGJF-faTItzz4.js → sankeyDiagram-IPEJSGJF-DEsbJkUr.js} +1 -1
- package/cli/dist/web-ui/assets/{sequenceDiagram-PO4LG4MO-Cj_EMsbm.js → sequenceDiagram-PO4LG4MO-Cv3NkVSq.js} +1 -1
- package/cli/dist/web-ui/assets/{stateDiagram-v2-GCMORJYK-CyWg6xdW.js → stateDiagram-v2-GCMORJYK-G4M_wBmL.js} +1 -1
- package/cli/dist/web-ui/assets/{swimlanes-2SLR337P-Dgwvv6Tl.js → swimlanes-2SLR337P-DYVzxoQG.js} +1 -1
- package/cli/dist/web-ui/assets/swimlanesDiagram-TC7HE7FX-BqawKSa3.js +8 -0
- package/cli/dist/web-ui/assets/{timeline-definition-EJHVYXUP-DlGSaNP5.js → timeline-definition-EJHVYXUP-DsmpKLKV.js} +1 -1
- package/cli/dist/web-ui/assets/{treeView-Q6P3EWNA-BZnwik9H.js → treeView-Q6P3EWNA-B3kjIptl.js} +1 -1
- package/cli/dist/web-ui/assets/{treemap-WGGIJYW6-qAytDlDd.js → treemap-WGGIJYW6-CKu36ebo.js} +1 -1
- package/cli/dist/web-ui/assets/{tsMode-CplwZyPJ.js → tsMode-3tskkrdb.js} +1 -1
- package/cli/dist/web-ui/assets/{usecaseDiagram-POWQR4AR-BlSEPKlN.js → usecaseDiagram-POWQR4AR-BRU3OrL8.js} +1 -1
- package/cli/dist/web-ui/assets/{vennDiagram-UO4OBE2U-Dj_bjuVm.js → vennDiagram-UO4OBE2U-CoBrGGTu.js} +1 -1
- package/cli/dist/web-ui/assets/{wardley-WFR3VGLG-zmiPvYH6.js → wardley-WFR3VGLG-BzCibkAO.js} +1 -1
- package/cli/dist/web-ui/assets/{wardleyDiagram-VNRHLVJA-D_YoCHRm.js → wardleyDiagram-VNRHLVJA-BNfhGNgv.js} +1 -1
- package/cli/dist/web-ui/assets/{xychartDiagram-PMCCYNJV-OLHEoUWW.js → xychartDiagram-PMCCYNJV-B6ljD8lZ.js} +1 -1
- package/cli/dist/web-ui/index.html +2 -2
- package/cli/dist/web-ui/sw.js +1 -1
- package/cli/dist-server/1790.codebuddy.js +1 -1
- package/cli/dist-server/{9902.codebuddy.js → 2446.codebuddy.js} +34 -34
- package/cli/dist-server/376.codebuddy.js +2 -2
- package/cli/dist-server/4099.codebuddy.js +1 -1
- package/cli/dist-server/4218.codebuddy.js +1 -1
- package/cli/dist-server/codebuddy.js +24 -22
- package/cli/dist-server/types/node/agent/agent-manager.d.ts +10 -0
- package/cli/dist-server/types/node/agent-view/job-reclaim-gate.d.ts +8 -0
- package/cli/dist-server/types/node/multitask/index.d.ts +1 -1
- package/cli/dist-server/types/node/multitask/session-flags.d.ts +10 -1
- package/cli/dist-server/types/node/tools/cron-create-tool.d.ts +13 -8
- package/cli/dist-server/types/vendor/cbc-core/node/agent/agent-protocol.d.ts +7 -0
- package/cli/dist-server/types/vendor/cbc-core/node/agent/agent-service.d.ts +14 -0
- package/cli/dist-server/types/vendor/cbc-core/node/session/interruption-service.d.ts +8 -0
- package/cli/dist-server/types/vendor/cbc-core/node/session/session-protocol.d.ts +1 -0
- package/cli/dist-server/types/vendor/cbc-core/node/utils/command-message-utils.d.ts +20 -0
- package/cli/package.json +2 -3
- package/cli/product.cloudhosted.json +2 -2
- package/cli/product.internal.json +2 -2
- package/cli/product.ioa.json +2 -2
- package/cli/product.json +2 -2
- package/cli/product.selfhosted.json +2 -2
- package/package.json +2 -3
- package/cli/dist/lazy-lite-wb/6754.bfd5538f.mjs +0 -1
- package/cli/dist/web-ui/assets/architecture-7GRP2DOG-B-3nTR7V.js +0 -1
- package/cli/dist/web-ui/assets/channel-DuCsHllC.js +0 -1
- package/cli/dist/web-ui/assets/eventmodeling-NTZA5JFV-CM0LdDMQ.js +0 -1
- package/cli/dist/web-ui/assets/flowDiagram-KWPJA3E3-DcyjpKWX.js +0 -1
- package/cli/dist/web-ui/assets/index-DGxwLQuF.css +0 -1
- package/cli/dist/web-ui/assets/railroad-abnf-HS5TGJTU-DzrAuzXZ.js +0 -1
- package/cli/dist/web-ui/assets/railroad-ebnf-LZEXJU2U-CHza-jr6.js +0 -1
- package/cli/dist/web-ui/assets/railroad-peg-WCYAUIDC-CQp3dShd.js +0 -1
- package/cli/dist/web-ui/assets/swimlanesDiagram-TC7HE7FX-C6e5aqJh.js +0 -8
package/cli/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,38 @@ CodeBuddy Code 的所有重要更新都会记录在这里。
|
|
|
7
7
|
|
|
8
8
|
## [未发布]
|
|
9
9
|
|
|
10
|
+
## [2.159.0] - 2026-09-28
|
|
11
|
+
|
|
12
|
+
### 🎉 新功能
|
|
13
|
+
|
|
14
|
+
- **技能清单按目录分组展示**:Skill 工具的 `<available_skills>` 现按技能所在目录分组(每个目录一行 `skills under folder`),条目精简为「名称: 描述」,不再暴露技能文件路径;单条描述默认字符上限由 150 提升至 200;总预算不足时优先压缩描述,必要时从末尾省略条目并在末尾提示 `Omitted skills: N.`。
|
|
15
|
+
|
|
16
|
+
### 🔧 功能改进
|
|
17
|
+
|
|
18
|
+
- **ACP 自动重试与 meta 提示**:ACP 网络自动重试时在 `agentPhase` 上带 `retry.reason=network`,接入方可直接识别重试原因;`session/prompt` 支持 `isMeta`,模型可见但不作为用户消息展示、广播或回放。
|
|
19
|
+
- **智能体头像更灵动且状态更清晰**:所有头像保持原本鲜明配色;闲置状态以舒缓动作呈现,活动中与等待关注状态通过更快的动作节奏和既有绿色/黄色状态点区分,不添加外圈光晕,也不降低透明度或饱和度,同时继续尊重系统的「减少动态效果」设置。
|
|
20
|
+
- **新建与组队头像更易区分**:普通头像扩展到 15 款;新建智能体优先选择当前使用较少的款式并持久化,房间和频道内再对冲突头像做稳定错位分配。
|
|
21
|
+
- **关联模型路由完善**:完善 GPT、Gemini 的 `lite` / `reasoning` 映射,并在提供新一代轻量模型的产品配置中优化 DeepSeek V4 系列路由;为缺少映射的 Hy4 IOA 与默认模型补充安全兜底,同时保持其他国产模型现有路由不变。
|
|
22
|
+
- **Skill 工具描述预算固定为 8000**:`<available_skills>` 列表整体(目录分组行 + 条目 + 省略行)的字符预算固定为 8000,不再读取 `CODEBUDDY_SKILL_TOOL_CHAR_BUDGET` / `SLASH_COMMAND_TOOL_CHAR_BUDGET` 环境变量覆盖,保证任何宿主环境下列表体上限一致、超出即按 per-entry cap → 均分 → names-only → 尾部省略逐级收敛。
|
|
23
|
+
|
|
24
|
+
### 🐛 问题修复
|
|
25
|
+
|
|
26
|
+
- **Web UI 智能体配置切换不持久**:修复 Web UI 智能体模型与权限模式切换不持久的问题:配置按智能体写入状态存储并经 ACP 应用,打开模型下拉和刷新页面不再回退用户默认;权限模式直接更新 live Session 并保留覆盖值;新建智能体继承当前用户/工作区有效配置,旧智能体从主 Run 的持久启动参数自动补齐配置;嵌入智能体的目录 chip 显示真实固定 cwd。
|
|
27
|
+
- **并发编辑同一文件时会话卡死**:修复同一轮对话中并发编辑同一个文件时,会话可能长时间停在「修改中」、CPU 占满单核且无法停止的问题。文件快照备份不再与并发写入相互干扰;备份期间文件被外部改动时会记录告警,便于排查回退内容异常。
|
|
28
|
+
- **文件回退可能拿不到修改前内容**:此前快照备份写入失败会被忽略、修改照常进行,回退只能得到修改后的版本。现在备份建不出来会直接拦下本次修改并给出明确原因,文件保持原样。路径指向目录或特殊文件时会直接给出准确的路径错误,不再误报成备份故障;目录和特殊文件也不会在备份目录留下空文件。
|
|
29
|
+
- **PTC / Code Mode 下 `/rewind` 无法回滚文件**:这些模式下的文件编辑现在会正确创建历史快照,`/rewind` 面板不再对有实际改动的检查点误报「No code changes」,会列出改动文件并显示准确的 +N/-M 行数变更,且能通过「Restore code」把文件还原到编辑前的状态。常规模式行为不变。
|
|
30
|
+
- **Auto mode 权限判定**:修复强制推理模型在 Auto mode 下无法完成权限判定的问题,以及非交互 Auto mode 下安全操作被错误拒绝的问题。
|
|
31
|
+
- **Web UI 流式渲染闪动与跳动**:修复工具执行结束时结果区瞬间消失导致消息流上跳、思考过程完成时丢失用户已展开的阅读状态、含数学公式的正文被误判成表格而拆断等问题;长回答改为按已完成段落增量渲染,正文以稳定速率匀速流出并在末尾显示光标,不再成段跳出。
|
|
32
|
+
- **ESC 取消需要按两次**:修复 Web UI 中按 ESC 取消当前轮次需要按两次才停止的问题。
|
|
33
|
+
- **从非命令行入口注册系统服务**:修复从非命令行入口注册系统服务会写入无法启动的配置,以及把测试运行器等无效入口写入系统服务后反复启动失败的问题。
|
|
34
|
+
- **Web UI 右侧面板与本机文件链接**:修复切回智能体对话时可能同时出现两个右侧面板、在内嵌对话点击本机文件链接导致黑屏的问题;`file://` Markdown 链接统一在父页面右侧工作台打开,SVG 默认使用与图片一致的预览模式。
|
|
35
|
+
- **进程内 Agent Harness 使用 sandbox-cli**:修复 broker 因读取不到 CLI 的进程级当前会话而拒绝 Bash 文件访问的问题。broker 现在按实际执行中的 shell 调用校验会话与工具调用,并恢复该轮的异步上下文;shell snapshot 的进程退出清理也不再访问已释放的 Agent 运行时。
|
|
36
|
+
- **未显式选择模型时可能自动跑在预览模型上**:此前该场景按智能体声明列表的顺序取首个可用模型,而声明列表头部是模型选择器用的档位占位(默认位/快速/均衡/极致),当前环境没有对应模型时会被逐个跳过,于是自动落到列表里第一个真实模型。现在改为优先使用产品标记的默认位,没有则按当前环境下发的模型列表顺序取首个可用;智能体自身声明了具体模型时行为不变。
|
|
37
|
+
- **启动后首次拉取远端配置被拒**:修复首次拉取远端配置时 User-Agent 缺少产品品牌名、被服务端校验拒绝返回 400 的问题。此前产品配置尚未就绪时客户端标识会回退成安装包名,导致首屏那次配置请求失败;磁盘缓存未命中时会直接得到空配置,可用模型列表随之退化。现在首次请求与后续请求的 User-Agent 保持一致。
|
|
38
|
+
- **多截图对话提交立即失败(#132615)**:修复带多张截图(约 10 MB 以上)的对话提交后立即失败、报 `Request body larger than maxBodyLength limit` 的问题:此前 CLI 本地这一跳会在 10 MiB 就自行拒收,与其自身 100 MB 的接收上限不一致,重试也必然复现。内容体积确实超出服务端上限时,现在会自动移除过大的图片或截断较早的对话后继续作答,并由 AI 说明被省略了什么;无法自动恢复时才提示实际体积和处理建议,不再抛出内部传输错误信息。
|
|
39
|
+
- **长会话追踪数据内存占用**:限制长时间会话的追踪数据内存占用,降低服务进程因追踪数据持续增长而异常退出的风险。
|
|
40
|
+
- **macOS 后台服务启动失败重试频率**:限制 macOS 后台服务启动失败时的重试频率,避免失效的 CLI 路径持续拉起进程并快速写满错误日志。
|
|
41
|
+
|
|
10
42
|
## [2.158.0] - 2026-09-24
|
|
11
43
|
|
|
12
44
|
### 🎉 新功能
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
(()=>{"use strict";var e={
|
|
2
|
-
`)),i.on("data",e=>{if((o+=e.toString()).length>8192)return void a({ok:!1,error:"control response too large",code:"ETOOLARGE"});let t=o.indexOf("\n");if(!(t<0))try{let e=JSON.parse(o.slice(0,t));if(!e||"boolean"!=typeof e.ok)return void a({ok:!1,error:"malformed response",code:"EBADREQ"});if(void 0!==e.protocolVersion&&1!==e.protocolVersion)return void a({ok:!1,error:"unsupported broker protocol version",code:"EBADREQ"});a(e)}catch{a({ok:!1,error:"malformed response",code:"EBADREQ"})}}),i.on("close",()=>a({ok:!1,error:"broker closed the connection",code:"ENOJOB"})),i.on("error",e=>a({ok:!1,error:e.message,code:"ENOJOB"}))})}async function G(e,t){return!!e.attachSocket&&!!Number.isInteger(e.pid)&&!!e.pid&&!(e.pid<=0)&&e.workerGeneration===e.pid&&!!e.sessionId&&!!e.createdAt&&(await U(e.attachSocket,{op:"request-reclaim",...t?{reason:t}:{},pid:e.pid,workerGeneration:e.workerGeneration,sessionId:e.sessionId,createdAt:e.createdAt,idleSince:e.idleSince,firstTerminalAt:e.firstTerminalAt})).ok}let M=require("node:process"),q=require("node:util");var Y=r(760);let W=require("node:url"),H=(e,t)=>e.at(-1)===t?e:H([...e,t],Y.resolve(t,".."));var K=r(421);let Q=require("node:events"),V=require("node:fs/promises"),z=async(e,t,r)=>await X(e,r)?[eo(e),t.map(e=>ei(e)),{...r,shell:!0}]:[e,t,r],X=async(e,{shell:t,cwd:r,env:i=M.env})=>"win32"===M.platform&&!t&&!await Z(e,r,i),Z=async(e,t,{Path:r="",PATH:i=r})=>er.some(t=>e.toLowerCase().endsWith(t))||(ee[`${e}\0${t}\0${i}`]??=await et(e,t,i)),ee={},et=async(e,t,r)=>{let i=r.split(Y.delimiter).filter(Boolean).map(e=>e.replace(/^"(.*)"$/,"$1"));try{await Promise.all(er.flatMap(r=>[t,...i].map(t=>`${Y.resolve(t,e)}${r}`)).map(async e=>{try{await (0,V.stat)(e)}catch{return}throw 0}))}catch{return!0}return!1},er=[".exe",".com"],ei=e=>eo(eo(`"${e.replaceAll(/(\\*)"/g,'$1$1\\"').replace(/(\\*)$/,"$1$1")}"`)),eo=e=>e.replaceAll(/([()\][%!^"`<>&|;, *?])/g,"^$1"),en=async(e,{input:t},r)=>{let i=await e;void 0!==t&&i.stdin.end(t);let o=(0,Q.once)(i,"close");try{return await Promise.race([o,...i.stdio.filter(Boolean).map(e=>ea(e))]),es(r,eu(i)),ep(r)}catch(e){throw await Promise.allSettled([o]),ec(e,i,r)}},ea=async e=>{for await(let[t]of(0,Q.on)(e,"error"))if(!["ERR_STREAM_PREMATURE_CLOSE","EPIPE"].includes(t?.code))throw t},es=({command:e},{exitCode:t,signalName:r})=>{if(void 0!==r)throw new ed(`Command was terminated with ${r}: ${e}`);if(void 0!==t)throw new ed(`Command failed with exit code ${t}: ${e}`)},ec=(e,t,r)=>Object.assign(el(e,r),eu(t),ep(r)),el=(e,{command:t})=>e instanceof ed?e:new ed(`Command failed: ${t}`,{cause:e});class ed extends Error{name="SubprocessError"}let eu=({exitCode:e,signalCode:t})=>({...e<1?{}:{exitCode:e},...null===t?{}:{signalName:t}}),ep=({state:{stdout:e,stderr:t,output:r},command:i,start:o})=>({stdout:
|
|
3
|
-
for await (const line of spawn(...)) { ... }`);t.isIterating=!0;try{let{[r]:t}=await e.nodeChildProcess;if(!t)return;let i="";for await(let e of t.iterator({destroyOnReturn:!1})){let t=`${i}${e}`.split(/\r?\n/);i=t.pop(),yield*t}i&&(yield i)}finally{await e}},ev=async function*(...e){try{let t=[];for(;e.length>0;){t=e.map((e,r)=>t[r]??eD(e));let[{value:r,done:i},o]=await Promise.race(t.map((e,t)=>Promise.all([e,t]))),[n]=e.splice(o,1);t.splice(o,1),i||(e.push(n),yield r)}}finally{await Promise.all(e.map(e=>e.return()))}},eD=async e=>{try{return await e.next()}catch(t){await e.throw(t)}};function eE(e,t,r,i){let o,[n=[],a={}]=Array.isArray(t)?[t,r]:[[],t],s=(o=[e,...n],{start:M.hrtime.bigint(),command:o.map(e=>{let t;return t=(0,q.stripVTControlCharacters)(e),/[^\w./-]/.test(t)?`'${t.replaceAll("'","'\\''")}'`:t}).join(" "),state:{stdout:"",stderr:"",output:""}}),c=(({stdin:e,stdout:t,stderr:r,stdio:i=[e,t,r],env:o,preferLocal:n,cwd:a=".",...s})=>{let c=a instanceof URL?(0,W.fileURLToPath)(a):Y.resolve(a),l=o?{...M.env,...o}:void 0,d=i[0]?.string;return{...s,input:d,stdio:void 0===d?i:["pipe",...i.slice(1)],env:n?(({Path:e="",PATH:t=e,...r},i)=>{let o=t.split(Y.delimiter),n=H([],Y.resolve(i)).map(e=>Y.join(e,"node_modules/.bin")).filter(e=>!o.includes(e));return{...r,PATH:[...n,t].filter(Boolean).join(Y.delimiter)}})(l??M.env,c):l,cwd:c}})(a),l=ef(e,n,c,s),d=en(l,c,s);Object.assign(d,{nodeChildProcess:l});let u=eS(d=i?eb([i,d]):d,s,"stdout"),p=eS(d,s,"stderr");return Object.assign(d,{nodeChildProcess:l,stdout:u,stderr:p,[Symbol.asyncIterator]:()=>ev(u,p),pipe:(e,t,r)=>eE(e,t,r,d)})}function eT(e){let t=function(e){if(e&&/^\d+$/.test(e))try{let t=Number(BigInt(e)/10000n-11644473600000n);return Number.isFinite(t)?t:void 0}catch{return}}(e.procStartFt);if(void 0!==t)return t;let r=e.procStart?Date.parse(e.procStart):NaN;return Number.isFinite(r)?r:void 0}function eO(e){let t=e.lastIndexOf(")");if(t<0)return;let r=e.slice(t+1).trim().split(/\s+/)[19];return/^\d+$/.test(r||"")?r:void 0}async function eI(){if(n)return n;a??=Promise.all([(0,f.readFile)("/proc/stat","utf8"),(0,f.readFile)("/proc/self/auxv")]).then(([e,t])=>{let r=function(e){let t=/^btime\s+(\d+)$/m.exec(e);if(!t)return;let r=Number(t[1]);return Number.isSafeInteger(r)?1e3*r:void 0}(e),i=function(e,t="ia32"===process.arch||"arm"===process.arch?4:8,r=(0,y.endianness)()){let i=2*t;if(4!==t&&8!==t||e.length<i)return;let o=i=>8===t?"LE"===r?e.readBigUInt64LE(i):e.readBigUInt64BE(i):BigInt("LE"===r?e.readUInt32LE(i):e.readUInt32BE(i));for(let r=0;r+i<=e.length;r+=i){let e=o(r);if(0n===e)break;if(e===BigInt(17)){let e=Number(o(r+t));return Number.isSafeInteger(e)&&e>0?e:void 0}}}(t);return void 0!==r&&void 0!==i?{bootTimeMs:r,ticksPerSecond:i}:void 0}).catch(()=>void 0);let e=await a;return a=void 0,e&&(n=e),e}function eA(e=process.platform){let t=Date.now()-1e3*process.uptime(),r="linux"===e?function(e){try{return eO((0,p.readFileSync)(`/proc/${e}/stat`,"utf8"))}catch{return}}(process.pid):void 0;return{procStart:new Date(t).toISOString(),..."win32"===e?{procStartFt:((BigInt(Math.round(t))+11644473600000n)*10000n).toString()}:{},...r?{procStartTicks:r}:{}}}async function eN(e,t=e=>(0,f.readFile)(e,"utf8"),r=eI){try{let i=eO(await t(`/proc/${e}/stat`));if(!i)return;let o=await r();if(!o)return;let n=o.bootTimeMs+1e3*Number(i)/o.ticksPerSecond;return{procStartTicks:i,...Number.isFinite(n)?{procStart:new Date(n).toISOString()}:{}}}catch{return}}function e_(e){try{return process.kill(e,0),!0}catch(e){return e?.code!=="ESRCH"}}async function eR(e,t=process.platform){if(Number.isSafeInteger(e)&&!(e<=0))try{if("linux"===t)return eN(e);if("win32"===t){let t=`$target = Get-CimInstance Win32_Process -Filter "ProcessId = ${e}" -ErrorAction Stop; if ($null -eq $target) { exit 3 }; $started = $target.CreationDate.ToUniversalTime(); [Console]::Out.Write($started.ToString('o') + '|' + $started.ToFileTimeUtc().ToString())`,r=await eE("powershell.exe",["-NoProfile","-NonInteractive","-Command",t],{timeout:5e3,env:{...process.env,NODE_OPTIONS:""}}),[i,o]=String(r.stdout||"").trim().split("|");if(!Number.isFinite(Date.parse(i))||!/^\d+$/.test(o||""))return;return{procStart:i,procStartFt:o}}let r={...process.env,NODE_OPTIONS:"",LC_ALL:"C",LANG:"C"},i=await eE("ps",["-o","lstart=","-p",String(e)],{timeout:5e3,env:r}),o=String(i.stdout||"").trim();if(Number.isFinite(Date.parse(o)))return{procStart:o};let n=await eE("ps",["-o","etime=","-p",String(e)],{timeout:5e3,env:r}),a=function(e){let t=String(e||"").trim();if(!t)return;let r=0,i=t,o=t.indexOf("-");if(o>=0&&(r=Number(t.slice(0,o)),i=t.slice(o+1),!Number.isFinite(r)||r<0))return;let n=i.split(":").map(e=>Number(e));if(!(n.length<2||n.length>3||n.some(e=>!Number.isFinite(e)||e<0)))return(86400*r+(2===n.length?60*n[0]+n[1]:3600*n[0]+60*n[1]+n[2]))*1e3}(String(n.stdout||""));if(void 0===a)return;return{procStart:new Date(Date.now()-a).toISOString()}}catch{return}}function ex(e){if(!e||"object"!=typeof e)return{};let t="string"==typeof e.procStart?e.procStart:"string"==typeof e.processStart?e.processStart:void 0,r="string"==typeof e.procStartFt?e.procStartFt:"number"==typeof e.procStartFt&&Number.isFinite(e.procStartFt)?e.procStartFt.toFixed(0):void 0,i="string"==typeof e.procStartTicks?e.procStartTicks:"number"==typeof e.procStartTicks&&Number.isFinite(e.procStartTicks)?e.procStartTicks.toFixed(0):void 0;return{...t?{procStart:t}:{},...r?{procStartFt:r}:{},...i?{procStartTicks:i}:{}}}function eJ(e){return!!(e?.procStart||e?.procStartFt||e?.procStartTicks)}function eP(e){return{procStart:e?.procStart,procStartFt:e?.procStartFt,procStartTicks:e?.procStartTicks}}async function ej(e,t,r=eB,i={}){if(void 0===e||!Number.isSafeInteger(e)||e<=0||!r(e))return!1;let o=ex(t);if(!eJ(o))return!0;let n=e===process.pid?(i.currentIdentity??eA)():await (i.queryIdentity??eR)(e);return!!r(e)&&(!(n&&eJ(n))||"different"!==function(e,t){if(e.procStartTicks&&t.procStartTicks&&e.procStartTicks!==t.procStartTicks)return"different";let r=eT(e),i=eT(t);return void 0!==r&&void 0!==i?2e3>=Math.abs(i-r)?"same":"different":"unknown"}(o,n))}function eB(e){try{return process.kill(e,0),!0}catch(e){return e?.code!=="ESRCH"}}let e$={procStart:null,procStartFt:null,procStartTicks:null},eC="session ended — press enter to restart it",eF=new Set(["done","failed","stopped"]);function eL(e){return!e.name&&""===(e.intent??"").trim()&&!e.worktreePath&&!e.exec&&"working"===e.state&&"blocked"===e.tempo}function eU(e){let t=eF.has(e.state)?e.idleSince??e.firstTerminalAt??e.updatedAt:e.idleSince;if(!t)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}function eG(e,t=Date.now(),r=36e5){if(!e.attachedAt)return!1;let i=Date.parse(e.attachedAt);return Number.isFinite(i)&&t-i<r}function eM(e,t,r,i=!1){var o;if(e.exec||e.workerLaunchToken||"active"===(o=e).tempo||"blocked"===o.tempo||"blocked"===o.state||!(eF.has(e.state)||"idle"===e.tempo)||e.pid===process.pid||eG(e,r)&&void 0!==e.pid&&t.isProcessRunning(e.pid)||e.sessionId&&t.isSessionInUse?.(e.sessionId))return!1;let n=eU(e);return void 0!==n&&r-n>=(i?6e4:6e5)}function eq(e,t){return t.sessionId===e.sessionId&&t.createdAt===e.createdAt&&t.pid===e.pid&&t.workerGeneration===e.workerGeneration}async function eY(e,t){await e.setBrokerEndpoint(t,void 0).catch(()=>{})}function eW(e,t){return eF.has(e.state)?{pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$}:{state:"done",tempo:"idle",detail:e.detail&&"resuming…"!==e.detail?e.detail:"parked — press enter to continue",firstTerminalAt:e.firstTerminalAt??t,idleSince:e.idleSince??t,pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$}}async function eH(e,t,r=!1){let i=await e.store.read(t.id).catch(()=>void 0);if(e.signal?.aborted||!i||!eq(t.state,i)||!eM(i,e,(e.now??Date.now)(),r)||!await (e.reclaimWorker?e.reclaimWorker(i):G(i,r?"memory-pressure":void 0)).catch(()=>!1)||e.signal?.aborted)return;let o=new Date((e.now??Date.now)()).toISOString();await e.store.patchIf(t.id,eW(i,o),t=>!e.signal?.aborted&&eq(i,t)&&void 0!==t.pid&&!e.isProcessRunning(t.pid)&&eM(t,e,(e.now??Date.now)(),r)).catch(()=>!1)&&await eY(e.store,t.id)}async function eK(e){let t=e.now??Date.now,r=[],i=[],o=e.records??await e.store.list().catch(()=>[]),n=(t,r,i)=>{var o,n;let a,s;return!e.signal?.aborted&&eq(t,r)&&(o=t,n=r,a=ex(o),s=ex(n),!a.procStart&&!a.procStartFt&&!a.procStartTicks||a.procStart===s.procStart&&a.procStartFt===s.procStartFt&&a.procStartTicks===s.procStartTicks)&&!r.workerLaunchToken&&void 0!==r.pid&&i&&!e.isSessionInUse?.(r.sessionId)},a=!0===e.reclaimLiveIdle&&e.memoryBudget?.().pressured===!0,s=!1;for(let c of a?[...o].sort((e,t)=>(eU(e.state)??1/0)-(eU(t.state)??1/0)):o){if(e.signal?.aborted)break;let o=c.state,l=o.workerLaunchOwnerPid;if(o.workerLaunchToken&&Number.isSafeInteger(l)&&l>0&&!e_(l)){let t=o;if(!await e.store.patchIf(c.id,{workerLaunchToken:void 0,workerLaunchOwnerPid:void 0},r=>!e.signal?.aborted&&eq(t,r)&&r.workerLaunchToken===t.workerLaunchToken&&r.workerLaunchOwnerPid===l&&!e_(l)).catch(()=>!1))continue;let r=await e.store.read(c.id).catch(()=>void 0);if(!r||!eq(t,r))continue;o=r}if(!("number"==typeof o.pid&&o.pid>0)){o.attachedAt&&await e.store.patchIf(c.id,{attachedAt:null},t=>!e.signal?.aborted&&t.attachedAt===o.attachedAt&&t.sessionId===o.sessionId&&t.createdAt===o.createdAt&&void 0===t.pid).catch(()=>!1);let i=o.idleSince?Date.parse(o.idleSince):NaN;!eF.has(o.state)&&Number.isFinite(i)&&t()-i>=864e5&&await e.store.patchIf(c.id,{state:"done",tempo:"idle",detail:eC,firstTerminalAt:o.firstTerminalAt??new Date(t()).toISOString()},t=>!e.signal?.aborted&&void 0===t.pid&&t.state===o.state&&t.sessionId===o.sessionId&&t.createdAt===o.createdAt).catch(()=>!1)&&r.push(c.id);continue}let d=e.isJobProcessAlive?await e.isJobProcessAlive(o.pid,ex(o)):await ej(o.pid,ex(o),e.isProcessRunning),u=!d;if(!d&&o.exec){let a=o.firstTerminalAt?Date.parse(o.firstTerminalAt):void 0;if(void 0!==a&&Number.isFinite(a)&&t()-a>=3e5){await e.store.removeIf(c.id,e=>n(o,e,u)&&!!e.exec&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&i.push(c.id);continue}!eF.has(o.state)&&await e.store.patchIf(c.id,{state:"done",tempo:"idle",detail:"command exited — output in logs",firstTerminalAt:o.firstTerminalAt??new Date(t()).toISOString()},e=>n(o,e,u)&&!!e.exec&&!eF.has(e.state)&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&r.push(c.id);continue}if(!d&&eL(o)){let r=t()-Date.parse(o.createdAt);if(Number.isFinite(r)&&r>=3e5){await e.store.removeIf(c.id,e=>n(o,e,u)&&eL(e)).catch(()=>!1)&&i.push(c.id);continue}}let p=a&&!s;if(!0===e.reclaimLiveIdle&&d&&eM(o,e,t(),p)){let r=!eM(o,e,t());r&&(s=!0),await eH(e,{id:c.id,state:o},r);continue}if(!d){if(eF.has(o.state)){await e.store.patchIf(c.id,{pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$},e=>n(o,e,u)&&eF.has(e.state)&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&await eY(e.store,c.id);continue}if(void 0!==o.workerReclaimGeneration&&o.workerReclaimGeneration===o.workerGeneration){let r=new Date(t()).toISOString();await e.store.patchIf(c.id,eW(o,r),e=>n(o,e,u)&&!eF.has(e.state)&&void 0!==e.workerReclaimGeneration&&e.workerReclaimGeneration===e.workerGeneration&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&await eY(e.store,c.id);continue}await e.store.patchIf(c.id,{state:"failed",tempo:"idle",detail:eC,firstTerminalAt:o.firstTerminalAt??new Date(t()).toISOString(),pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$},e=>n(o,e,u)&&!eF.has(e.state)&&e.firstTerminalAt===o.firstTerminalAt&&(void 0===e.workerReclaimGeneration||e.workerReclaimGeneration!==e.workerGeneration)).catch(()=>!1)&&(r.push(c.id),await eY(e.store,c.id))}}return{settled:r,removed:i}}async function eQ(e){var t,r;let i,{pty:o,socketPath:n}=e,a=e.cols,s=e.rows,c=!1,l=!1,d=new Set,u=e=>{e.syncTimer&&(clearTimeout(e.syncTimer),e.syncTimer=void 0)},p=(e,t)=>{i?.socket===e&&(u(i),i=void 0,e.destroyed||(t&&e.write(`\r
|
|
1
|
+
(()=>{"use strict";var e={780(e,t,r){let i,o,n,a;(0,r(188).install)();let s=require("path");var c=r.n(s);let l=new Set(["TRACEPARENT","TRACESTATE","BAGGAGE","CODEBUDDY_CONVERSATION_REQUEST_ID","CODEBUDDY_CONVERSATION_MESSAGE_ID","CODEBUDDY_ROOT_REQUEST_ID","CODEBUDDY_TOOL_CALL_ID","CODEBUDDY_SANDBOX_BROKER_TOOL_CALL_ID","CODEBUDDY_SANDBOX_BROKER_TRACE_ID"]);function d(e,t=process.platform){for(let r of Object.keys(e)){let i="win32"===t?r.toUpperCase():r;l.has(i)&&delete e[r]}}let u=require("crypto"),p=require("fs");var f=r.n(p);let h=require("fs/promises"),w=require("net"),m=require("module"),y=require("os");var b=r.n(y);let g=Symbol.for("codebuddy.ai/agent-harness/embedded-node-pty-loader");function k(e){let t="function"==typeof e?.spawn?e:e?.default;if("object"!=typeof t||null===t||"function"!=typeof t.spawn)throw Error("Loaded node-pty runtime does not export spawn()");return t}async function S(){let e=function(){let e=globalThis[g];if(void 0!==e){if("function"!=typeof e)throw Error("Embedded node-pty loader is invalid");return e}}();return void 0===e?void 0:k(await e())}async function v(){let e=await S();if(void 0!==e)return e;let t=k(await import("@lydell/node-pty"));return"win32"===process.platform?{...t,spawn(...e){let r=t.spawn(...e),i=r.kill.bind(r),o=!1;return r.kill=e=>{if(!o){o=!0;try{i(e)}catch(e){throw o=!1,e}}},r.onExit(()=>{queueMicrotask(()=>{try{r.kill()}catch(e){console.warn("[node-pty] Windows exit cleanup failed",e)}})}),r}}:t}let D=()=>"win32"===b().platform(),E=!1,T=async()=>{if(D()&&18309>function(e=y.release()){let t=Number(e.split(".")[2]||0);return Number.isFinite(t)?t:0}())return null;try{let e=await S();if(void 0!==e)return{module:e,name:"bun-native-pty"}}catch(e){return null}if(D())try{let e=await v();if(!function(){let e=`@lydell/node-pty-${process.platform}-${process.arch}`,t=(0,m.createRequire)(__filename),r=null;try{r=t.resolve(`${e}/lib/index.js`)}catch{try{r=t.resolve(e)}catch{r=null}}if(!r)return!1;let i=c().join(c().dirname(r),"worker","conoutSocketWorker.js");try{return f().existsSync(i)}catch{return!1}}())return E||(E=!0,console.warn("[pty-runtime] @lydell/node-pty-"+process.platform+"-"+process.arch+"/lib/worker/conoutSocketWorker.js is missing on disk; falling back to child_process for shell execution. This usually means the package install is corrupted — try reinstalling.")),null;return{module:e,name:"lydell-node-pty"}}catch(e){return null}if("u">typeof Bun)return{module:{spawn(e,t,r){let i=null,o=[],n=Bun.spawn([e,...t],{cwd:r?.cwd,env:r?.env,terminal:{cols:r?.cols||80,rows:r?.rows||24,name:r?.name||"xterm-256color",data(e,t){let r=t.toString();i?i(r):o.push(r)}}});return{get pid(){return n.pid},onData(e){for(let t of(i=e,o))e(t);o.length=0},onExit(e){n.exited.then(t=>e({exitCode:t??0}))},write(e){n.terminal?.write(e)},resize(e,t){n.terminal?.resize(e,t)},kill(e){n.kill(e)}}}},name:"bun-native-pty"};if(function(){if("linux"!==b().platform())return!1;try{if(f().readdirSync("/lib").some(e=>e.startsWith("ld-musl-")))return!0}catch{}return!1}())return null;try{return{module:await v(),name:"lydell-node-pty"}}catch(e){return null}};Symbol("JobStore"),Symbol("JobStateReporter"),Symbol("JobTerminalBroker"),Symbol("JobInboxConsumer"),Symbol("JobAdoptConsumer"),Symbol("JobOrphanWatchdog");let O="CODEBUDDY_JOB_ID",I="CODEBUDDY_JOB_GENERATION",A="CODEBUDDY_JOB_LAUNCH_TOKEN",N="CODEBUDDY_JOB_BROKER",_="CODEBUDDY_JOB_CONTROL_SOCKET",R="state.json",x="broker.json",J="stateOrder",P="pins.json",j="pending-reply.json",B="Background sessions need a PTY, which is unavailable on this platform",$=[O,A,I,_,N,"CODEBUDDY_JOB_INNER_ENTRY","CODEBUDDY_JOB_RECLAIM_TOKEN"],C=!1,F=!1;function L(e){return e?.trim()||void 0}function U(e,t){return new Promise(r=>{let i=(0,w.createConnection)(e),o="",n=!1,a=e=>{n||(n=!0,clearTimeout(s),i.destroy(),r(e))},s=setTimeout(()=>{a({ok:!1,error:"control request timed out",code:"ENOJOB"})},5e3);s.unref?.(),i.on("connect",()=>i.write(`${JSON.stringify({protocolVersion:1,...t})}
|
|
2
|
+
`)),i.on("data",e=>{if((o+=e.toString()).length>8192)return void a({ok:!1,error:"control response too large",code:"ETOOLARGE"});let t=o.indexOf("\n");if(!(t<0))try{let e=JSON.parse(o.slice(0,t));if(!e||"boolean"!=typeof e.ok)return void a({ok:!1,error:"malformed response",code:"EBADREQ"});if(void 0!==e.protocolVersion&&1!==e.protocolVersion)return void a({ok:!1,error:"unsupported broker protocol version",code:"EBADREQ"});a(e)}catch{a({ok:!1,error:"malformed response",code:"EBADREQ"})}}),i.on("close",()=>a({ok:!1,error:"broker closed the connection",code:"ENOJOB"})),i.on("error",e=>a({ok:!1,error:e.message,code:"ENOJOB"}))})}async function G(e,t){return!!e.attachSocket&&!!Number.isInteger(e.pid)&&!!e.pid&&!(e.pid<=0)&&e.workerGeneration===e.pid&&!!e.sessionId&&!!e.createdAt&&(await U(e.attachSocket,{op:"request-reclaim",...t?{reason:t}:{},pid:e.pid,workerGeneration:e.workerGeneration,sessionId:e.sessionId,createdAt:e.createdAt,idleSince:e.idleSince,firstTerminalAt:e.firstTerminalAt})).ok}let M=require("node:process"),q=require("node:util");var Y=r(760);let W=require("node:url"),H=(e,t)=>e.at(-1)===t?e:H([...e,t],Y.resolve(t,".."));var K=r(421);let Q=require("node:events"),V=require("node:fs/promises"),z=async(e,t,r)=>await X(e,r)?[eo(e),t.map(e=>ei(e)),{...r,shell:!0}]:[e,t,r],X=async(e,{shell:t,cwd:r,env:i=M.env})=>"win32"===M.platform&&!t&&!await Z(e,r,i),Z=async(e,t,{Path:r="",PATH:i=r})=>er.some(t=>e.toLowerCase().endsWith(t))||(ee[`${e}\0${t}\0${i}`]??=await et(e,t,i)),ee={},et=async(e,t,r)=>{let i=r.split(Y.delimiter).filter(Boolean).map(e=>e.replace(/^"(.*)"$/,"$1"));try{await Promise.all(er.flatMap(r=>[t,...i].map(t=>`${Y.resolve(t,e)}${r}`)).map(async e=>{try{await (0,V.stat)(e)}catch{return}throw 0}))}catch{return!0}return!1},er=[".exe",".com"],ei=e=>eo(eo(`"${e.replaceAll(/(\\*)"/g,'$1$1\\"').replace(/(\\*)$/,"$1$1")}"`)),eo=e=>e.replaceAll(/([()\][%!^"`<>&|;, *?])/g,"^$1"),en=async(e,{input:t},r)=>{let i=await e;void 0!==t&&i.stdin.end(t);let o=(0,Q.once)(i,"close");try{return await Promise.race([o,...i.stdio.filter(Boolean).map(e=>ea(e))]),es(r,eu(i)),ep(r)}catch(e){throw await Promise.allSettled([o]),ec(e,i,r)}},ea=async e=>{for await(let[t]of(0,Q.on)(e,"error"))if(!["ERR_STREAM_PREMATURE_CLOSE","EPIPE"].includes(t?.code))throw t},es=({command:e},{exitCode:t,signalName:r})=>{if(void 0!==r)throw new ed(`Command was terminated with ${r}: ${e}`);if(void 0!==t)throw new ed(`Command failed with exit code ${t}: ${e}`)},ec=(e,t,r)=>Object.assign(el(e,r),eu(t),ep(r)),el=(e,{command:t})=>e instanceof ed?e:new ed(`Command failed: ${t}`,{cause:e});class ed extends Error{name="SubprocessError"}let eu=({exitCode:e,signalCode:t})=>({...e<1?{}:{exitCode:e},...null===t?{}:{signalName:t}}),ep=({state:{stdout:e,stderr:t,output:r},command:i,start:o})=>({stdout:ef(e),stderr:ef(t),output:ef(r),command:i,durationMs:Number(M.hrtime.bigint()-o)/1e6}),ef=e=>"\n"===e.at(-1)?e.slice(0,"\r"===e.at(-2)?-2:-1):e,eh=async(e,t,r,i)=>{try{[e,t]=["node","node.exe"].includes(e.toLowerCase())?[M.execPath,[...M.execArgv.filter(e=>!e.startsWith("--inspect")),...t]]:[e,t],[e,t,r]=await z(e,t,r),[e,t,r]=ew(e,t,r);let o=(0,K.spawn)(e,t,r);return em(o.stdout,i,"stdout"),em(o.stderr,i,"stderr"),o.once("error",()=>{}),await (0,Q.once)(o,"spawn"),o}catch(e){throw ec(e,{},i)}},ew=(e,t,r)=>r.shell&&t.length>0?[[e,...t].join(" "),[],r]:[e,t,r],em=(e,{state:t},r)=>{e&&(e.setEncoding("utf8"),t.isIterating||(t.isIterating=!1,e.on("data",e=>{t[r]+=e,t.output+=e})))},ey=require("node:stream/promises"),eb=async e=>{let[[t,r]]=await Promise.all([Promise.allSettled(e),eg(e)]);if(r.reason)throw r.reason.pipedFrom=t.reason??t.value,r.reason;if(t.reason)throw t.reason;return{...r.value,pipedFrom:t.value}},eg=async e=>{try{let[{stdout:t},{stdin:r}]=await Promise.all(e.map(({nodeChildProcess:e})=>e));if(null===r)throw Error('The "stdin" option must be set on the first "spawn()" call in the pipeline.');if(null===t)throw Error('The "stdout" option must be set on the last "spawn()" call in the pipeline.');(0,ey.pipeline)(t,r).catch(()=>{})}catch(t){throw await Promise.allSettled(e.map(({nodeChildProcess:e})=>ek(e))),t}},ek=async e=>{let{stdin:t}=await e;t.end()},eS=async function*(e,{state:t},r){if(!1===t.isIterating)throw Error(`The subprocess must be iterated right away, for example:
|
|
3
|
+
for await (const line of spawn(...)) { ... }`);t.isIterating=!0;try{let{[r]:t}=await e.nodeChildProcess;if(!t)return;let i="";for await(let e of t.iterator({destroyOnReturn:!1})){let t=`${i}${e}`.split(/\r?\n/);i=t.pop(),yield*t}i&&(yield i)}finally{await e}},ev=async function*(...e){try{let t=[];for(;e.length>0;){t=e.map((e,r)=>t[r]??eD(e));let[{value:r,done:i},o]=await Promise.race(t.map((e,t)=>Promise.all([e,t]))),[n]=e.splice(o,1);t.splice(o,1),i||(e.push(n),yield r)}}finally{await Promise.all(e.map(e=>e.return()))}},eD=async e=>{try{return await e.next()}catch(t){await e.throw(t)}};function eE(e,t,r,i){let o,[n=[],a={}]=Array.isArray(t)?[t,r]:[[],t],s=(o=[e,...n],{start:M.hrtime.bigint(),command:o.map(e=>{let t;return t=(0,q.stripVTControlCharacters)(e),/[^\w./-]/.test(t)?`'${t.replaceAll("'","'\\''")}'`:t}).join(" "),state:{stdout:"",stderr:"",output:""}}),c=(({stdin:e,stdout:t,stderr:r,stdio:i=[e,t,r],env:o,preferLocal:n,cwd:a=".",...s})=>{let c=a instanceof URL?(0,W.fileURLToPath)(a):Y.resolve(a),l=o?{...M.env,...o}:void 0,d=i[0]?.string;return{...s,input:d,stdio:void 0===d?i:["pipe",...i.slice(1)],env:n?(({Path:e="",PATH:t=e,...r},i)=>{let o=t.split(Y.delimiter),n=H([],Y.resolve(i)).map(e=>Y.join(e,"node_modules/.bin")).filter(e=>!o.includes(e));return{...r,PATH:[...n,t].filter(Boolean).join(Y.delimiter)}})(l??M.env,c):l,cwd:c}})(a),l=eh(e,n,c,s),d=en(l,c,s);Object.assign(d,{nodeChildProcess:l});let u=eS(d=i?eb([i,d]):d,s,"stdout"),p=eS(d,s,"stderr");return Object.assign(d,{nodeChildProcess:l,stdout:u,stderr:p,[Symbol.asyncIterator]:()=>ev(u,p),pipe:(e,t,r)=>eE(e,t,r,d)})}function eT(e){let t=function(e){if(e&&/^\d+$/.test(e))try{let t=Number(BigInt(e)/10000n-11644473600000n);return Number.isFinite(t)?t:void 0}catch{return}}(e.procStartFt);if(void 0!==t)return t;let r=e.procStart?Date.parse(e.procStart):NaN;return Number.isFinite(r)?r:void 0}function eO(e){let t=e.lastIndexOf(")");if(t<0)return;let r=e.slice(t+1).trim().split(/\s+/)[19];return/^\d+$/.test(r||"")?r:void 0}async function eI(){if(n)return n;a??=Promise.all([(0,h.readFile)("/proc/stat","utf8"),(0,h.readFile)("/proc/self/auxv")]).then(([e,t])=>{let r=function(e){let t=/^btime\s+(\d+)$/m.exec(e);if(!t)return;let r=Number(t[1]);return Number.isSafeInteger(r)?1e3*r:void 0}(e),i=function(e,t="ia32"===process.arch||"arm"===process.arch?4:8,r=(0,y.endianness)()){let i=2*t;if(4!==t&&8!==t||e.length<i)return;let o=i=>8===t?"LE"===r?e.readBigUInt64LE(i):e.readBigUInt64BE(i):BigInt("LE"===r?e.readUInt32LE(i):e.readUInt32BE(i));for(let r=0;r+i<=e.length;r+=i){let e=o(r);if(0n===e)break;if(e===BigInt(17)){let e=Number(o(r+t));return Number.isSafeInteger(e)&&e>0?e:void 0}}}(t);return void 0!==r&&void 0!==i?{bootTimeMs:r,ticksPerSecond:i}:void 0}).catch(()=>void 0);let e=await a;return a=void 0,e&&(n=e),e}function eA(e=process.platform){let t=Date.now()-1e3*process.uptime(),r="linux"===e?function(e){try{return eO((0,p.readFileSync)(`/proc/${e}/stat`,"utf8"))}catch{return}}(process.pid):void 0;return{procStart:new Date(t).toISOString(),..."win32"===e?{procStartFt:((BigInt(Math.round(t))+11644473600000n)*10000n).toString()}:{},...r?{procStartTicks:r}:{}}}async function eN(e,t=e=>(0,h.readFile)(e,"utf8"),r=eI){try{let i=eO(await t(`/proc/${e}/stat`));if(!i)return;let o=await r();if(!o)return;let n=o.bootTimeMs+1e3*Number(i)/o.ticksPerSecond;return{procStartTicks:i,...Number.isFinite(n)?{procStart:new Date(n).toISOString()}:{}}}catch{return}}function e_(e){try{return process.kill(e,0),!0}catch(e){return e?.code!=="ESRCH"}}async function eR(e,t=process.platform){if(Number.isSafeInteger(e)&&!(e<=0))try{if("linux"===t)return eN(e);if("win32"===t){let t=`$target = Get-CimInstance Win32_Process -Filter "ProcessId = ${e}" -ErrorAction Stop; if ($null -eq $target) { exit 3 }; $started = $target.CreationDate.ToUniversalTime(); [Console]::Out.Write($started.ToString('o') + '|' + $started.ToFileTimeUtc().ToString())`,r=await eE("powershell.exe",["-NoProfile","-NonInteractive","-Command",t],{timeout:5e3,env:{...process.env,NODE_OPTIONS:""}}),[i,o]=String(r.stdout||"").trim().split("|");if(!Number.isFinite(Date.parse(i))||!/^\d+$/.test(o||""))return;return{procStart:i,procStartFt:o}}let r={...process.env,NODE_OPTIONS:"",LC_ALL:"C",LANG:"C"},i=await eE("ps",["-o","lstart=","-p",String(e)],{timeout:5e3,env:r}),o=String(i.stdout||"").trim();if(Number.isFinite(Date.parse(o)))return{procStart:o};let n=await eE("ps",["-o","etime=","-p",String(e)],{timeout:5e3,env:r}),a=function(e){let t=String(e||"").trim();if(!t)return;let r=0,i=t,o=t.indexOf("-");if(o>=0&&(r=Number(t.slice(0,o)),i=t.slice(o+1),!Number.isFinite(r)||r<0))return;let n=i.split(":").map(e=>Number(e));if(!(n.length<2||n.length>3||n.some(e=>!Number.isFinite(e)||e<0)))return(86400*r+(2===n.length?60*n[0]+n[1]:3600*n[0]+60*n[1]+n[2]))*1e3}(String(n.stdout||""));if(void 0===a)return;return{procStart:new Date(Date.now()-a).toISOString()}}catch{return}}function ex(e){if(!e||"object"!=typeof e)return{};let t="string"==typeof e.procStart?e.procStart:"string"==typeof e.processStart?e.processStart:void 0,r="string"==typeof e.procStartFt?e.procStartFt:"number"==typeof e.procStartFt&&Number.isFinite(e.procStartFt)?e.procStartFt.toFixed(0):void 0,i="string"==typeof e.procStartTicks?e.procStartTicks:"number"==typeof e.procStartTicks&&Number.isFinite(e.procStartTicks)?e.procStartTicks.toFixed(0):void 0;return{...t?{procStart:t}:{},...r?{procStartFt:r}:{},...i?{procStartTicks:i}:{}}}function eJ(e){return!!(e?.procStart||e?.procStartFt||e?.procStartTicks)}function eP(e){return{procStart:e?.procStart,procStartFt:e?.procStartFt,procStartTicks:e?.procStartTicks}}async function ej(e,t,r=eB,i={}){if(void 0===e||!Number.isSafeInteger(e)||e<=0||!r(e))return!1;let o=ex(t);if(!eJ(o))return!0;let n=e===process.pid?(i.currentIdentity??eA)():await (i.queryIdentity??eR)(e);return!!r(e)&&(!(n&&eJ(n))||"different"!==function(e,t){if(e.procStartTicks&&t.procStartTicks&&e.procStartTicks!==t.procStartTicks)return"different";let r=eT(e),i=eT(t);return void 0!==r&&void 0!==i?2e3>=Math.abs(i-r)?"same":"different":"unknown"}(o,n))}function eB(e){try{return process.kill(e,0),!0}catch(e){return e?.code!=="ESRCH"}}let e$={procStart:null,procStartFt:null,procStartTicks:null},eC="session ended — press enter to restart it",eF=new Set(["done","failed","stopped"]);function eL(e){return!e.name&&""===(e.intent??"").trim()&&!e.worktreePath&&!e.exec&&"working"===e.state&&"blocked"===e.tempo}function eU(e){let t=eF.has(e.state)?e.idleSince??e.firstTerminalAt??e.updatedAt:e.idleSince;if(!t)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}function eG(e,t=Date.now(),r=36e5){if(!e.attachedAt)return!1;let i=Date.parse(e.attachedAt);return Number.isFinite(i)&&t-i<r}function eM(e,t,r,i=!1){var o;if(e.exec||e.workerLaunchToken||"active"===(o=e).tempo||"blocked"===o.tempo||"blocked"===o.state||!(eF.has(e.state)||"idle"===e.tempo)||e.pid===process.pid||eG(e,r)&&void 0!==e.pid&&t.isProcessRunning(e.pid)||e.sessionId&&t.isSessionInUse?.(e.sessionId))return!1;let n=eU(e);return void 0!==n&&r-n>=(i?6e4:6e5)}function eq(e,t){return t.sessionId===e.sessionId&&t.createdAt===e.createdAt&&t.pid===e.pid&&t.workerGeneration===e.workerGeneration}async function eY(e,t){await e.setBrokerEndpoint(t,void 0).catch(()=>{})}function eW(e,t){return eF.has(e.state)?{pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$}:{state:"done",tempo:"idle",detail:e.detail&&"resuming…"!==e.detail?e.detail:"parked — press enter to continue",firstTerminalAt:e.firstTerminalAt??t,idleSince:e.idleSince??t,pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$}}async function eH(e,t,r=!1){let i=await e.store.read(t.id).catch(()=>void 0);if(e.signal?.aborted||!i||!eq(t.state,i)||!eM(i,e,(e.now??Date.now)(),r)||!await (e.reclaimWorker?e.reclaimWorker(i):G(i,r?"memory-pressure":void 0)).catch(()=>!1)||e.signal?.aborted)return;let o=new Date((e.now??Date.now)()).toISOString();await e.store.patchIf(t.id,eW(i,o),t=>!e.signal?.aborted&&eq(i,t)&&void 0!==t.pid&&!e.isProcessRunning(t.pid)&&eM(t,e,(e.now??Date.now)(),r)).catch(()=>!1)&&await eY(e.store,t.id)}async function eK(e){let t=e.now??Date.now,r=[],i=[],o=e.records??await e.store.list().catch(()=>[]),n=(t,r,i)=>{var o,n;let a,s;return!e.signal?.aborted&&eq(t,r)&&(o=t,n=r,a=ex(o),s=ex(n),!a.procStart&&!a.procStartFt&&!a.procStartTicks||a.procStart===s.procStart&&a.procStartFt===s.procStartFt&&a.procStartTicks===s.procStartTicks)&&!r.workerLaunchToken&&void 0!==r.pid&&i&&!e.isSessionInUse?.(r.sessionId)},a=!0===e.reclaimLiveIdle&&e.memoryBudget?.().pressured===!0,s=!1;for(let c of a?[...o].sort((e,t)=>(eU(e.state)??1/0)-(eU(t.state)??1/0)):o){if(e.signal?.aborted)break;let o=c.state,l=o.workerLaunchOwnerPid;if(o.workerLaunchToken&&Number.isSafeInteger(l)&&l>0&&!e_(l)){let t=o;if(!await e.store.patchIf(c.id,{workerLaunchToken:void 0,workerLaunchOwnerPid:void 0},r=>!e.signal?.aborted&&eq(t,r)&&r.workerLaunchToken===t.workerLaunchToken&&r.workerLaunchOwnerPid===l&&!e_(l)).catch(()=>!1))continue;let r=await e.store.read(c.id).catch(()=>void 0);if(!r||!eq(t,r))continue;o=r}if(!("number"==typeof o.pid&&o.pid>0)){o.attachedAt&&await e.store.patchIf(c.id,{attachedAt:null},t=>!e.signal?.aborted&&t.attachedAt===o.attachedAt&&t.sessionId===o.sessionId&&t.createdAt===o.createdAt&&void 0===t.pid).catch(()=>!1);let i=o.idleSince?Date.parse(o.idleSince):NaN;!eF.has(o.state)&&Number.isFinite(i)&&t()-i>=864e5&&await e.store.patchIf(c.id,{state:"done",tempo:"idle",detail:eC,firstTerminalAt:o.firstTerminalAt??new Date(t()).toISOString()},t=>!e.signal?.aborted&&void 0===t.pid&&t.state===o.state&&t.sessionId===o.sessionId&&t.createdAt===o.createdAt).catch(()=>!1)&&r.push(c.id);continue}let d=e.isJobProcessAlive?await e.isJobProcessAlive(o.pid,ex(o)):await ej(o.pid,ex(o),e.isProcessRunning),u=!d;if(!d&&o.exec){let a=o.firstTerminalAt?Date.parse(o.firstTerminalAt):void 0;if(void 0!==a&&Number.isFinite(a)&&t()-a>=3e5){await e.store.removeIf(c.id,e=>n(o,e,u)&&!!e.exec&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&i.push(c.id);continue}!eF.has(o.state)&&await e.store.patchIf(c.id,{state:"done",tempo:"idle",detail:"command exited — output in logs",firstTerminalAt:o.firstTerminalAt??new Date(t()).toISOString()},e=>n(o,e,u)&&!!e.exec&&!eF.has(e.state)&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&r.push(c.id);continue}if(!d&&eL(o)){let r=t()-Date.parse(o.createdAt);if(Number.isFinite(r)&&r>=3e5){await e.store.removeIf(c.id,e=>n(o,e,u)&&eL(e)).catch(()=>!1)&&i.push(c.id);continue}}let p=a&&!s;if(!0===e.reclaimLiveIdle&&d&&eM(o,e,t(),p)){let r=!eM(o,e,t());r&&(s=!0),await eH(e,{id:c.id,state:o},r);continue}if(!d){if(eF.has(o.state)){await e.store.patchIf(c.id,{pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$},e=>n(o,e,u)&&eF.has(e.state)&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&await eY(e.store,c.id);continue}if(void 0!==o.workerReclaimGeneration&&o.workerReclaimGeneration===o.workerGeneration){let r=new Date(t()).toISOString();await e.store.patchIf(c.id,eW(o,r),e=>n(o,e,u)&&!eF.has(e.state)&&void 0!==e.workerReclaimGeneration&&e.workerReclaimGeneration===e.workerGeneration&&e.firstTerminalAt===o.firstTerminalAt).catch(()=>!1)&&await eY(e.store,c.id);continue}await e.store.patchIf(c.id,{state:"failed",tempo:"idle",detail:eC,firstTerminalAt:o.firstTerminalAt??new Date(t()).toISOString(),pid:void 0,attachSocket:void 0,workerReclaimGeneration:void 0,...e$},e=>n(o,e,u)&&!eF.has(e.state)&&e.firstTerminalAt===o.firstTerminalAt&&(void 0===e.workerReclaimGeneration||e.workerReclaimGeneration!==e.workerGeneration)).catch(()=>!1)&&(r.push(c.id),await eY(e.store,c.id))}}return{settled:r,removed:i}}async function eQ(e){var t,r;let i,{pty:o,socketPath:n}=e,a=e.cols,s=e.rows,c=!1,l=!1,d=new Set,u=e=>{e.syncTimer&&(clearTimeout(e.syncTimer),e.syncTimer=void 0)},p=(e,t)=>{i?.socket===e&&(u(i),i=void 0,e.destroyed||(t&&e.write(`\r
|
|
4
4
|
\x1b[2m${t}\x1b[0m\r
|
|
5
|
-
`),e.end()))},
|
|
6
|
-
`)}function eZ(e,t,r){if(ez(t,r))try{e.resize(t,r)}catch{}}async function e0(e){"win32"!==process.platform&&await (0,f.unlink)(e).catch(()=>{})}async function e1(e){let t=`${process.pid}.${(0,u.randomUUID)()}.owner`,r=`${e}.${t}`;await (0,f.mkdir)(r,{mode:448});try{await (0,f.writeFile)((0,s.join)(r,t),String(process.pid),{flag:"wx",mode:384});let i=Date.now()+2e3;for(;;){try{return await (0,f.rename)(r,e),async()=>{await (0,f.unlink)((0,s.join)(e,t)),await e2(e)}}catch(e){if(!["EEXIST","ENOTEMPTY","ENOTDIR","EISDIR","EPERM","EACCES"].includes(e.code??""))throw e}if(await e3(e),Date.now()>=i)throw Error(`Timed out acquiring job lock: ${e}`);await new Promise(e=>setTimeout(e,25))}}finally{await (0,f.unlink)((0,s.join)(r,t)).catch(e=>{if("ENOENT"!==e.code)throw e}),await e2(r)}}async function e2(e){try{await (0,f.rmdir)(e)}catch(e){if(!["ENOENT","ENOTEMPTY","EEXIST"].includes(e.code??""))throw e}}async function e3(e){let t;try{t=await (0,f.readdir)(e)}catch(e){if(["ENOENT","ENOTDIR"].includes(e.code??""))return;throw e}for(let r of t){let t=/^(\d+)\.[0-9a-f-]{36}\.owner$/.exec(r);if(!t)return;let i=Number(t[1]);if(!Number.isSafeInteger(i)||i<=0||e_(i))return;let o=(0,s.join)(e,r);try{if(await (0,f.readFile)(o,"utf8")!==String(i)||e_(i))return;await (0,f.unlink)(o)}catch(e){if("ENOENT"!==e.code)throw e}}await e2(e)}async function e4(e){let t=await e1(e+".guard"),r=!1,i=`${e}.${process.pid}.${(0,u.randomUUID)()}.candidate`;try{await (0,f.writeFile)(i,String(process.pid),{flag:"wx",mode:384});let o=Date.now()+2e3;for(;;){try{await (0,f.link)(i,e),r=!0;break}catch(e){if("EEXIST"!==e.code)throw e}try{let t=await (0,f.readFile)(e,"utf8"),r=Number(t);if(t.trim()&&Number.isSafeInteger(r)&&r>0&&!e_(r)){await (0,f.unlink)(e);continue}}catch(e){if("ENOENT"===e.code)continue;throw e}if(Date.now()>=o)throw Error("Timed out acquiring job lock: "+e);await new Promise(e=>setTimeout(e,25))}return async()=>{try{await (0,f.unlink)(e)}finally{await t()}}}finally{try{await (0,f.unlink)(i).catch(e=>{if("ENOENT"!==e.code)throw e})}finally{r||await t()}}}function e8(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}let e6=["pinned","sortOrder","stateSortOrder","group"],e5=/^[A-Za-z0-9_-]{1,64}$/,e7=".locks";class e9{homeDir;constructor(e=()=>process.env.CODEBUDDY_CONFIG_DIR?.trim()?process.env.CODEBUDDY_CONFIG_DIR:(0,s.join)((0,y.homedir)(),".codebuddy")){this.homeDir=e}writeQueues=new Map;lastReapAt=0;inboxSeq=0;getJobsDir(){return(0,s.join)(this.homeDir(),"jobs")}static INBOX_PROCESSING_DIR=".processing";getJobDir(e){if(!e5.test(e))throw Error("Invalid job id");return(0,s.join)(this.getJobsDir(),e)}async create(e){let t=e.sessionId.slice(0,8),r=new Date().toISOString(),i={state:"working",detail:e.detail??"starting…",tempo:"active",output:null,children:null,intent:e.intent,initialPrompt:e.initialPrompt,name:e.name,nameSource:e.nameSource,sessionId:e.sessionId,shortId:t,cwd:e.cwd,createdAt:r,updatedAt:r,firstTerminalAt:null,pid:e.pid,logPath:e.logPath,respawnArgs:e.respawnArgs,exec:e.exec,bgIsolation:e.bgIsolation,inPlaceWorker:e.inPlaceWorker,foregroundHeld:e.foregroundHeld};return await this.withJobLock(t,async()=>{await this.ensureJobDir(t),await (0,f.mkdir)((0,s.join)(this.getJobDir(t),"tmp"),{recursive:!0,mode:448}),await this.writeStateAtomic(t,i)}),t}async read(e){if(!e5.test(e))return;let t=await this.readFileSafe((0,s.join)(this.getJobDir(e),R));if(void 0===t)return;let r=this.parseState(t);if(r)return this.overlayBrokerEndpoint(e,r)}async patch(e,t){this.maybeReapDeadJobs(),await this.queuePatch(e,t)}async patchQuiet(e,t){await this.queuePatch(e,t)}async patchIf(e,t,r){return this.queuePatch(e,t,r)}queuePatch(e,t,r){let i=(this.writeQueues.get(e)??Promise.resolve()).then(()=>this.doPatch(e,t,r)),o=i.then(()=>void 0,()=>void 0);return this.writeQueues.set(e,o),o.then(()=>{this.writeQueues.get(e)===o&&this.writeQueues.delete(e)}),i}maybeReapDeadJobs(){let e=Date.now();e-this.lastReapAt<6e4||(this.lastReapAt=e,eK({store:this,isProcessRunning:e8}).catch(()=>{}))}async list(){let e,t=this.getJobsDir();try{e=await (0,f.readdir)(t)}catch{return[]}let r=await this.readPins();return(await Promise.all(e.filter(e=>e!==P&&e!==e7&&e5.test(e)).map(async e=>{let t=await this.read(e);if(!t)return;let[i,o,n]=await Promise.all([this.readNumberSidecar(e,"order"),this.readNumberSidecar(e,J),this.readTextSidecar(e,"group")]);return{id:e,state:t,display:{pinned:r.has(e),sortOrder:i,stateSortOrder:o,group:n}}}))).filter(e=>void 0!==e)}async remove(e){await this.withJobLock(e,async()=>{await this.setPinned(e,!1),await (0,f.rm)(this.getJobDir(e),{recursive:!0,force:!0})})}async removeIf(e,t){return this.withJobLock(e,async()=>{let r=await this.readStateForMutation(e);return!!r&&!!t(await this.overlayBrokerEndpoint(e,r))&&(await this.setPinned(e,!1),await (0,f.rm)(this.getJobDir(e),{recursive:!0,force:!0}),!0)})}async readPins(){let e=await this.readFileSafe((0,s.join)(this.getJobsDir(),P));if(void 0===e)return new Set;try{let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>"string"==typeof e)):new Set}catch{return new Set}}async setPinned(e,t){await this.withLock(`${P}.lock`,async()=>{let r=await this.readFileForMutation((0,s.join)(this.getJobsDir(),P)),i=[];try{i=void 0===r?[]:JSON.parse(r)}catch{i=void 0}let o=Array.isArray(i)&&i.every(e=>"string"==typeof e);o||void 0===r||await (0,f.writeFile)((0,s.join)(this.getJobsDir(),`${P}.${(0,u.randomUUID)()}.corrupt`),r,{flag:"wx",mode:384});let n=new Set(Array.isArray(i)?i.filter(e=>"string"==typeof e):[]);if(t)n.add(e);else if(!n.delete(e)&&o)return;await this.writeAtomic((0,s.join)(this.getJobsDir(),P),JSON.stringify([...n],null,2))})}async setOrder(e,t,r){let i=(0,s.join)(this.getJobDir(e),"state"===t?J:"order");void 0===r?await this.unlinkSafe(i):(await this.ensureJobDir(e),await this.writeAtomic(i,String(r)))}async setGroup(e,t){let r=(0,s.join)(this.getJobDir(e),"group");void 0===t||""===t.trim()?await this.unlinkSafe(r):(await this.ensureJobDir(e),await this.writeAtomic(r,t.trim()))}async enqueueReply(e,t){await this.withJobLock(e,async()=>{let r=(0,s.join)(this.getJobDir(e),"inbox");await (0,f.mkdir)(r,{recursive:!0,mode:448});let i={...t,at:Date.now()},o=`${i.at}-${process.pid}-${this.inboxSeq++}.json`;await this.writeAtomic((0,s.join)(r,o),JSON.stringify(i,null,2));let n=await this.readStateForMutation(e);if(n?.workerReclaimGeneration!==void 0&&n.workerReclaimGeneration===n.workerGeneration){let t=(0,s.join)(this.homeDir(),"agent-home","wake");await (0,f.mkdir)(t,{recursive:!0,mode:448}),await this.writeAtomic((0,s.join)(t,Date.now()+"-"+(0,u.randomUUID)()+".json"),JSON.stringify({jobId:e}))}})}async commitReclaim(e,t){return this.withJobLock(e,async()=>{let r=await this.readStateForMutation(e);if(!r||r.sessionId!==t.sessionId||r.createdAt!==t.createdAt||r.pid!==t.pid||r.workerGeneration!==t.workerGeneration||r.idleSince!==t.idleSince||"idle"!==r.tempo||r.workerLaunchToken||r.attachedAt||r.foregroundHeld||r.inPlaceWorker||r.exec)return!1;for(let t of["inbox","colleague-inbox"])if((await (0,f.readdir)((0,s.join)(this.getJobDir(e),t)).catch(e=>{if("ENOENT"===e.code)return[];throw e})).filter(e=>e.endsWith(".json")).length)return!1;return await this.readFileForMutation((0,s.join)(this.getJobDir(e),j))===void 0&&(await this.writeStateAtomic(e,{...r,workerReclaimGeneration:r.workerGeneration}),!0)})}inboxProcessingDir(e){return(0,s.join)(this.getJobDir(e),"inbox",e9.INBOX_PROCESSING_DIR)}async inspectInbox(e){let t=(0,s.join)(this.getJobDir(e),"inbox"),r=this.inboxProcessingDir(e),i=async e=>{try{return(await (0,f.readdir)(e)).filter(e=>e.endsWith(".json"))}catch(e){if("ENOENT"===e.code)return[];throw e}},[o,n]=await Promise.all([i(t),i(r)]),a=[...o,...n].map(e=>this.inboxSortKey(e)).filter(e=>e>0).sort((e,t)=>e-t)[0];return{queued:o.length,processing:n.length,...void 0===a?{}:{oldestAt:a}}}async drainInbox(e){let t=(0,s.join)(this.getJobDir(e),"inbox"),r=this.inboxProcessingDir(e),i=await this.withJobLock(e,async()=>{let e=(await (0,f.readdir)(r).catch(()=>[])).filter(e=>e.endsWith(".json")),i=(await (0,f.readdir)(t).catch(()=>[])).filter(e=>e.endsWith(".json")).sort((e,t)=>this.inboxSortKey(e)-this.inboxSortKey(t)).slice(0,Math.max(0,64-e.length)),o=[];for(let n of(i.length>0&&await (0,f.mkdir)(r,{recursive:!0,mode:448}).catch(()=>void 0),[...e,...i])){let e=(0,s.join)(r,n);if(i.includes(n))try{await (0,f.rename)((0,s.join)(t,n),e)}catch{continue}let a=await this.readFileForMutation(e);if(void 0===a){await this.unlinkSafe(e);continue}o.push({path:e,raw:a})}return o}),o=[];for(let e of i)try{let t=JSON.parse(e.raw);"string"==typeof t?.text?o.push(t):(console.warn(`[JobStore] drainInbox dropped non-text reply in ${e.path}`),await this.unlinkSafe(e.path))}catch{console.warn(`[JobStore] drainInbox dropped bad JSON in ${e.path}`),await this.unlinkSafe(e.path)}return o}async ackInbox(e){let t=this.inboxProcessingDir(e),r=`${t}.acked-${(0,u.randomUUID)()}`;await this.withJobLock(e,async()=>{try{await (0,f.rename)(t,r)}catch(e){if("ENOENT"===e.code)return;throw e}}),await (0,f.rm)(r,{recursive:!0,force:!0}).catch(()=>void 0)}async releaseInbox(e){let t=(0,s.join)(this.getJobDir(e),"inbox"),r=this.inboxProcessingDir(e);await this.withJobLock(e,async()=>{for(let e of(await (0,f.readdir)(r).catch(()=>[])).filter(e=>e.endsWith(".json")))await (0,f.rename)((0,s.join)(r,e),(0,s.join)(t,e)).catch(()=>void 0)})}async savePendingReply(e,t){return!t.bash&&(await this.withJobLock(e,async()=>{await this.ensureJobDir(e);let r={...t,at:Date.now()};await this.writeAtomic((0,s.join)(this.getJobDir(e),j),JSON.stringify(r,null,2))}),!0)}async readPendingReply(e){let t=(0,s.join)(this.getJobDir(e),j),r=await this.readFileSafe(t);if(void 0!==r)try{let e=JSON.parse(r);return"string"==typeof e?.text?e:void 0}catch{return}}async takePendingReply(e,t){return this.withJobLock(e,async()=>{let r,i=(0,s.join)(this.getJobDir(e),j),o=await this.readFileForMutation(i);if(void 0!==o){try{r=JSON.parse(o)}catch{return}if("string"==typeof r?.text&&(!t||r.at===t.at&&r.text===t.text&&r.bash===t.bash))return await (0,f.unlink)(i),r}})}async setBrokerEndpoint(e,t,r){await this.withJobLock(e,async()=>{if(r){let t=await this.readBrokerEndpoint(e);if(!t||t.pid!==r.pid||t.attachSocket!==r.attachSocket)return}let i=(0,s.join)(this.getJobDir(e),x);void 0===t?await this.unlinkSafe(i):await this.readStateForMutation(e)&&await this.writeAtomic(i,JSON.stringify(t,null,2))})}async readBrokerEndpoint(e){let t=await this.readFileSafe((0,s.join)(this.getJobDir(e),x));if(void 0!==t)try{let e=JSON.parse(t);if("number"==typeof e?.pid&&"string"==typeof e?.attachSocket)return{pid:e.pid,attachSocket:e.attachSocket,...eP(ex(e))}}catch{}}async doPatch(e,t,r){return this.withJobLock(e,async()=>{let i=await this.readStateForMutation(e);if(!i||r&&!r(await this.overlayBrokerEndpoint(e,i)))return!1;let o={...i,...t,updatedAt:new Date().toISOString()};return await this.writeStateAtomic(e,o),!0})}withJobLock(e,t){return e5.test(e)?this.withLock(`${e}.state.lock`,t):Promise.reject(Error("Invalid job id"))}async withLock(e,t){await this.ensureJobsDir();let r=(0,s.join)(this.getJobsDir(),e7);await (0,f.mkdir)(r,{recursive:!0,mode:448});let i=(0,s.join)(r,e),o=await e4(i);try{return await t()}finally{await o()}}async readFileForMutation(e){try{return await (0,f.readFile)(e,"utf8")}catch(e){if("ENOENT"===e.code)return;throw e}}async readStateForMutation(e){let t=await this.readFileForMutation((0,s.join)(this.getJobDir(e),R));if(void 0===t)return;let r=this.parseState(t);if(!r)throw Error(`Invalid job state: ${e}`);return r}async overlayBrokerEndpoint(e,t){let r=await this.readBrokerEndpoint(e);if(!r||void 0!==t.workerGeneration&&t.workerGeneration!==r.pid)return{...t};let i=ex(r);return await ej(r.pid,i)?{...t,pid:r.pid,attachSocket:r.attachSocket,...eP(i)}:(await this.unlinkSafe((0,s.join)(this.getJobDir(e),x)),{...t})}async writeStateAtomic(e,t){let r={...t};for(let e of e6)delete r[e];await this.writeAtomic((0,s.join)(this.getJobDir(e),R),JSON.stringify(r,null,2))}async writeAtomic(e,t){let r=`${e}.${process.pid}.${(0,u.randomUUID)()}.tmp`;try{await (0,f.writeFile)(r,t,{mode:384,flag:"wx"}),await (0,f.rename)(r,e)}catch(e){throw await this.unlinkSafe(r),e}}async ensureJobsDir(){let e=this.getJobsDir();await (0,f.mkdir)(e,{recursive:!0,mode:448});try{await (0,f.chmod)(e,448)}catch{}}async ensureJobDir(e){await this.ensureJobsDir(),await (0,f.mkdir)(this.getJobDir(e),{recursive:!0,mode:448})}async readFileSafe(e){try{return await (0,f.readFile)(e,"utf8")}catch{return}}async unlinkSafe(e){try{await (0,f.unlink)(e)}catch{}}parseState(e){let t;try{t=JSON.parse(e)}catch{return}if("object"!=typeof t||null===t)return;let r=t;for(let e of["state","sessionId","cwd","createdAt","updatedAt"])if("string"!=typeof r[e]||""===r[e])return;return{...r,detail:"string"==typeof r.detail?r.detail:"",tempo:r.tempo??"idle",intent:"string"==typeof r.intent?r.intent:"",shortId:"string"==typeof r.shortId?r.shortId:r.sessionId.slice(0,8)}}async readNumberSidecar(e,t){let r=await this.readTextSidecar(e,t);if(void 0===r)return;let i=Number(r);return Number.isFinite(i)?i:void 0}async readTextSidecar(e,t){let r=await this.readFileSafe((0,s.join)(this.getJobDir(e),t));if(void 0===r)return;let i=r.trim();return""===i?void 0:i}inboxSortKey(e){let t=Number(e.split("-")[0]);return Number.isFinite(t)?t:0}}let te=process.env.CODEBUDDY_JOB_INNER_ENTRY;if(delete process.env.CODEBUDDY_JOB_INNER_ENTRY,!function(e=process.env){C||(C=!0,i=L(e[O]),o=L(e[A]),Number.isInteger(Number(L(e[I]))),L(e[_]),L(e.CODEBUDDY_JOB_RECLAIM_TOKEN),F=!!L(e[N]),function(e){for(let t of $)delete e[t]}(e))}(),d(process.env),!te||!i||!F)throw Error("Lightweight broker requires an explicit inner entry and job identity");let tt=Date.now(),tr={setContext(e){},info(e){process.stdout.write(e+"\n")},warn(e){process.stderr.write(e+"\n")}};new eV({store:new e9,logger:tr,entry:(0,s.resolve)(te),buildRespawnArgs:(e,t)=>[e,...t]}).run().catch(e=>{tr.warn(String(e)),process.exitCode=1}).finally(()=>{"1"===process.env.CODEBUDDY_STARTUP_PROFILE&&tr.info(JSON.stringify({phase:"job_broker_exit",elapsedMs:Date.now()-tt,rss:process.memoryUsage().rss}))})},421(e){e.exports=require("node:child_process")},24(e){e.exports=require("node:fs")},995(e){e.exports=require("node:module")},760(e){e.exports=require("node:path")},338(e,t,r){e=r.nmd(e);let{spawn:i}=r(421),{openSync:o,closeSync:n}=r(24),a=r(760),s=Symbol.for("codebuddy.daemon-supervisor"),c="CODEBUDDY_INTERNAL_DAEMON_CHANNEL",l="--internal-daemon-supervisor";function d(){let e=process.versions.bun&&/^(\/\$bunfs\/|[A-Za-z]:[\\/]~BUN[\\/])/.test(process.argv[1]||"")?[l]:[a.resolve(__dirname,"../bin/daemon-supervisor.cjs")],t=i(process.execPath,e,{detached:!0,windowsHide:!0,stdio:["ignore","ignore","ignore","ipc"]});return t.on("error",e=>{t.supervisorError=e}),t.unref(),t.channel?.unref?.(),globalThis[s]=t,t}let u=0;function p(){if(!process.send)throw Error("Daemon supervisor requires an inherited IPC channel");let e=new Set,t=()=>{process.connected||0!==e.size||process.exit(0)},r=a=>{let s=!1;a.on("message",l=>{let d;if(l?.type!=="start-daemon")return;let{id:u,command:p,args:h,options:f}=l,w=e=>{a.connected&&a.send({type:"daemon-started",id:u,...e},()=>{})};if(s)return void w({error:"Daemon already handed off by this process"});if(!Array.isArray(h)||!h.includes("--serve")||f?.env?.CODEBUDDY_SESSION_KIND!=="daemon")return void w({error:"Supervisor only starts daemon workers"});try{d=void 0===f.logPath?void 0:o(f.logPath,"a");let n=i(p,h,{cwd:f.cwd,env:{...f.env,[c]:"1"},detached:!0,windowsHide:!0,stdio:["ignore",d??"ignore",d??"ignore","ipc"]});s=!0,e.add(n),r(n),n.once("spawn",()=>w({pid:n.pid})),n.once("error",r=>{s=!1,e.delete(n),w({error:r.message}),t()}),n.once("exit",()=>{e.delete(n),t()})}catch(e){w({error:e.message})}finally{void 0!==d&&n(d)}})};r(process),process.on("disconnect",t)}e.exports={prepare:function(e=process.platform){if("win32"!==e)return;if(globalThis[s])return globalThis[s];if(process.env[c]&&(delete process.env[c],process.send&&process.connected))return globalThis[s]=process,process.channel?.unref?.(),process;let t=process.argv.slice(2);if("daemon"===t[0]&&["start","restart","install"].includes(t[1]))return d()},start:d,spawnDaemon:function(e,t,r){let i=globalThis[s];if(!i?.connected||i.supervisorError)return Promise.reject(i?.supervisorError||Error("Daemon supervisor unavailable; start it with codebuddy daemon start"));let o=++u;return new Promise((n,a)=>{let s=setInterval(()=>{},6e4),c=(e,t)=>{clearInterval(s),i.off("message",d),i.off("disconnect",l),i.channel?.unref?.(),e?a(e):n(t)},l=()=>c(Error("Daemon supervisor disconnected during startup")),d=e=>{e?.type==="daemon-started"&&e.id===o&&c(e.error?Error(e.error):void 0,{pid:e.pid})};i.on("message",d),i.once("disconnect",l),i.channel?.ref?.();try{i.send({type:"start-daemon",id:o,command:e,args:t,options:r},e=>{e&&c(e)})}catch(e){c(e)}})},run:p,FLAG:l},r.c[r.s]===e&&p()},188(e,t,r){let{loadBinding:i}=r(624),o=Symbol.for("codebuddy.no-orphans"),n="--no-orphans",a="CODEBUDDY_DISABLE_CHILD_PROCESS_CONTAINMENT";function s(e=process.env){let t=e[a];if(void 0===t||["","0","false"].includes(t))return!1;if(["1","true"].includes(t))return!0;throw Error(`${a} must be 0, 1, true, false, or unset`)}e.exports={install:function({platform:e=process.platform,environment:t=process.env,args:a=process.argv.slice(2),state:c=globalThis,loadBinding:l=i,warn:d=e=>process.emitWarning(e)}={}){if(void 0!==c[o])return c[o];if("win32"!==e)return c[o]=!1;let u=a.indexOf("--");if(!a.slice(0,u<0?a.length:u).includes(n)&&s(t))return c[o]=!1;r(338).prepare();try{return l().ensureKillOnCloseJob(),c[o]=!0}catch(e){return c[o]=!1,d(`Windows no-orphans cleanup unavailable: ${e.message}`),!1}},isEnabled:function(){return"win32"===process.platform&&!0===globalThis[o]},isDisabled:s,DISABLE_ENV:a,NO_ORPHANS_FLAG:n}},624(e,t,r){let i,o=r(760),{createRequire:n}=r(995);e.exports={loadBinding:function(){if("win32"!==process.platform)throw Error("Windows Job binding requires win32");if(!i)if(globalThis.__CODEBUDDY_WINDOWS_JOB_NATIVE__)i=globalThis.__CODEBUDDY_WINDOWS_JOB_NATIVE__();else{let e=o.resolve(__dirname,"../bin/native",`win32-${process.arch}`,"job-object.node");i=n(__filename)(e)}return i}}}},t={};function r(i){var o=t[i];if(void 0!==o)return o.exports;var n=t[i]={id:i,loaded:!1,exports:{}};return e[i](n,n.exports,r),n.loaded=!0,n.exports}r.c=t,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.rv=()=>"1.7.6",r.ruid="bundler=rspack@1.7.6",r(r.s=278)})();
|
|
5
|
+
`),e.end()))},f=(0,w.createServer)(t=>{d.add(t),t.on("close",()=>d.delete(t)),t.on("error",()=>{});let r=Buffer.alloc(0),n=d=>{let f;if((r=Buffer.concat([r,d])).length>8192){eX(t,{ok:!1,error:"request too large",code:"ETOOLARGE"}),t.end();return}let h=r.indexOf(10);if(h<0)return;t.off("data",n);let w=r.subarray(0,h).toString("utf8"),m=r.subarray(h+1);try{f=JSON.parse(w)}catch{eX(t,{ok:!1,error:"malformed request",code:"EBADREQ"}),t.end();return}if(!f||"object"!=typeof f){eX(t,{ok:!1,error:"malformed request",code:"EBADREQ"}),t.end();return}if(void 0!==f.protocolVersion&&1!==f.protocolVersion){eX(t,{ok:!1,error:"unsupported broker protocol version",code:"EBADREQ"}),t.end();return}switch(f.op){case"ping":eX(t,{ok:!0}),t.end();return;case"reclaim":eX(t,{ok:!1,error:"inner reclaim handshake required",code:"ENOTREADY"}),t.end();return;case"request-reclaim":if(c||l||i||!e.canReclaim){eX(t,{ok:!1,error:"broker is in use or stopping",code:"ENOTREADY"}),t.end();return}l=!0,Promise.resolve().then(()=>e.canReclaim(f)).then(e=>{!e||c||i?eX(t,{ok:!1,error:"job is not reclaimable",code:"ENOTREADY"}):(c=!0,eX(t,{ok:!0}))}).catch(()=>{eX(t,{ok:!1,error:"reclaim check failed",code:"ENOTREADY"})}).finally(()=>{l=!1,t.end()});return;case"detach":i&&(p(i.socket),e.onAttacherDisconnect?.()),eX(t,{ok:!0}),t.end();return;case"resize":i&&ez(f.cols,f.rows)&&(i.cols=f.cols,i.rows=f.rows,a=f.cols,s=f.rows,eZ(o,f.cols,f.rows)),eX(t,{ok:!0}),t.end();return;case"attach":{if(c||l){eX(t,{ok:!1,error:"broker is stopping",code:"ENOTREADY"}),t.end();return}let r=ez(f.cols,f.rows),n=r?f.cols:a,d=r?f.rows:s;i&&p(i.socket,"Session opened in another window — this view was detached"),i={socket:t,cols:n,rows:d,forwarding:!1},e.onAttachEstablished?.(),eX(t,{ok:!0}),t.write("\x1b[2J\x1b[3J\x1b[H");let h=i;if(h.syncTimer=setTimeout(()=>{h.syncTimer=void 0,i!==h||t.destroyed||(h.forwarding=!0,((e,t)=>{if(e!==a||t!==s){a=e,s=t,eZ(o,e,t);return}eZ(o,Math.max(2,e-1),t),setTimeout(()=>eZ(o,e,t),30).unref?.()})(h.cols,h.rows))},60),h.syncTimer.unref?.(),m.length>0)try{o.write(m.toString("utf8"))}catch{}t.on("data",e=>{try{o.write(e.toString("utf8"))}catch{}}),t.on("close",()=>{u(h),i===h&&(i=void 0,e.onAttacherDisconnect?.())});return}default:eX(t,{ok:!1,error:"unknown operation",code:"EBADREQ"}),t.end()}};t.on("data",n)});return await e0(n),await (t=f,r=n,new Promise((e,i)=>{let o=e=>i(e);t.once("error",o),t.listen(r,()=>{t.off("error",o),e()})})),"win32"!==process.platform&&await (0,h.chmod)(n,384).catch(()=>{}),o.onData(e=>{i&&i.forwarding&&!i.socket.destroyed&&i.socket.write(e)}),{hasAttacher:()=>void 0!==i&&!i.socket.destroyed,beginStop:()=>{c=!0},detach:()=>{i&&p(i.socket)},close:async()=>{var e;for(let e of(c=!0,i&&!i.socket.destroyed&&(u(i),i.socket.end()),i=void 0,d))e.destroy();await (e=f,new Promise(t=>e.close(()=>t()))),await e0(n)}}}class eV{dependencies;innerReclaimToken=(0,u.randomUUID)();refusalLog=(function(e=3e5){let t=new Map;return{take(r){let i=Date.now();for(let[e,r]of t)i-r.lastLoggedAt>36e5&&t.delete(e);let o=t.get(r);if(!o)return t.set(r,{lastLoggedAt:i,suppressed:0}),0;if(i-o.lastLoggedAt<e)return void o.suppressed++;let n=o.suppressed;return o.lastLoggedAt=i,o.suppressed=0,n}}})();constructor(e){this.dependencies=e}get store(){return this.dependencies.store}get logger(){return this.dependencies.logger}get startupProfiler(){return this.dependencies.startupProfiler}async run(){let e,t=i??process.env[O]?.trim(),r=this.dependencies.entry??process.argv[1];if(!t||!r)throw Error("Job broker requires a job id and a CLI entry path");this.logger.setContext(`JobBroker-${t}`);let n=e=>e.pid===process.pid&&e.workerGeneration===process.pid;this.startupProfiler?.markStart("job_pty_load","Job PTY load");let a=await T();if(this.startupProfiler?.markEnd("job_pty_load"),!a)throw await this.store.patchIf(t,{state:"failed",tempo:"idle",detail:B,firstTerminalAt:new Date().toISOString()},n).catch(()=>{}),Error(B);this.startupProfiler?.markStart("job_worker_claim","Job worker claim"),await this.claimWorker(t,o),this.startupProfiler?.markEnd("job_worker_claim");let c=function(e,t=process.pid){return"win32"===process.platform?`\\\\.\\pipe\\codebuddy-job-${e}-${t}`:(0,s.join)((0,y.tmpdir)(),`codebuddy-job-${process.getuid?.()??"user"}-${e}-${t}.sock`)}(t,process.pid);this.startupProfiler?.markStart("job_inner_spawn","Job inner spawn");let l=this.spawnInner(a,r,c,t);this.startupProfiler?.markEnd("job_inner_spawn",{pid:l.pty.pid});let d=l.pty,u=new Promise(e=>{d.onExit(t=>e(t.exitCode))}),f=!1,w=await eQ({pty:d,socketPath:c,cols:l.cols,rows:l.rows,canReclaim:async e=>{let r=e=>{let r=this.refusalLog.take(`${t}:${e}`);return void 0!==r&&this.logger.info(`[broker] reclaim refused job=${t} reason=${e}`+(r>0?` repeated=${r}`:"")),!1};if(!f||b)return r("broker-not-ready");if(await this.store.readPendingReply(t))return r("pending-reply");for(let e of["inbox","colleague-inbox"])if((await (0,h.readdir)((0,s.join)(this.store.getJobDir(t),e)).catch(e=>{if("ENOENT"===e.code)return[];throw e})).filter(e=>e.endsWith(".json")).length>0)return r(`unread-${e}`);let i=function(e,t,r,i=Date.now(),o=function(){let e,t,r="function"==typeof process.availableMemory?process.availableMemory():(0,y.freemem)(),i="function"==typeof process.constrainedMemory?process.constrainedMemory():0,o=i>0?Math.min((0,y.totalmem)(),i):(0,y.totalmem)();return e=Number.isFinite(r)&&r>=0&&Number.isFinite(o)&&o>0,t=Math.max(0x20000000,.05*o),{availableBytes:r,totalBytes:o,pressured:e&&r<t}}().pressured){if(!t)return"no-state";if(e.pid!==r||e.workerGeneration!==r)return"request-generation-mismatch";if(t.pid!==r||t.workerGeneration!==r)return"state-generation-mismatch";if(!e.sessionId||e.sessionId!==t.sessionId)return"session-mismatch";if(e.createdAt!==t.createdAt)return"createdAt-mismatch";if(e.idleSince!==t.idleSince)return"idleSince-mismatch";if(e.firstTerminalAt!==t.firstTerminalAt)return"firstTerminalAt-mismatch";if(t.exec)return"exec";if(t.foregroundHeld)return"foreground-held";if(t.inPlaceWorker)return"in-place-worker";if(eG(t,i))return"attached";if(t.workerLaunchToken)return"launch-token";if("blocked"===t.state)return"blocked";if("idle"!==t.tempo)return`tempo-${t.tempo}`;let n=eU(t);return void 0===n?"no-idle-clock":i-n>=("memory-pressure"===e.reason&&o?6e4:6e5)?"ok":"within-grace"}(e,await this.store.read(t),process.pid);if("ok"!==i)return r(i);let o=await U(c+".inner",{...e,token:this.innerReclaimToken});return o.ok||r(`inner-${o.code??"unknown"}`)},onAttacherDisconnect:()=>{(async()=>{let e=()=>this.store.patchIf(t,{attachedAt:null},n);try{if(await e())return;await new Promise(e=>setTimeout(e,50)),await e()||this.logger.warn?.(`[broker] attachedAt clear lost race for job=${t}`)}catch(e){this.logger.warn?.(`[broker] attachedAt clear failed for job=${t}: ${String(e)}`)}})().catch(()=>{})},onAttachEstablished:()=>{this.store.patchIf(t,{attachedAt:new Date().toISOString()},n).catch(()=>{})}});try{await this.store.setBrokerEndpoint(t,{pid:process.pid,attachSocket:c,...eP(eA())})}catch(e){this.logger.warn?.(`[broker] setBrokerEndpoint failed for job=${t}: ${String(e)}`)}let m=()=>{if("win32"!==process.platform)try{(0,p.unlinkSync)(c)}catch{}};process.on("exit",m);let b=!1,g=()=>{if(!b){b=!0,w.beginStop(),m();try{d.kill("SIGTERM")}catch{}e=setTimeout(()=>{try{d.kill("SIGKILL")}catch{}},5e3),e.unref?.()}};process.on("SIGINT",g),process.on("SIGTERM",g),process.on("SIGHUP",g),f=!0,this.startupProfiler?.markEvent("job_broker_ready","Job broker ready"),this.startupProfiler||"1"!==process.env.CODEBUDDY_STARTUP_PROFILE||this.logger.info(JSON.stringify({phase:"job_broker_ready",elapsedMs:Math.round(1e3*process.uptime()),rss:process.memoryUsage().rss})),this.startupProfiler?.isEnabled()&&this.logger.info(this.startupProfiler.formatReport({showAll:!0}));let k=await u;e&&(clearTimeout(e),e=void 0),process.off("SIGINT",g),process.off("SIGTERM",g),process.off("SIGHUP",g),await w.close(),m(),await this.store.setBrokerEndpoint(t,void 0,{pid:process.pid,attachSocket:c,...eP(eA())}).catch(()=>{}),process.exitCode=k}async claimWorker(e,t){let r=Date.now()+1e4;do{if(await this.store.patchIf(e,{pid:process.pid,workerGeneration:process.pid,workerReclaimGeneration:void 0,...eP(eA()),...t?{state:"working",tempo:"active",detail:"resuming…",firstTerminalAt:null}:{}},e=>{var r,i,o;return r=e,i=process.pid,o=t,r.workerLaunchToken?!!o&&r.workerLaunchToken===o:o?r.pid===i&&r.workerGeneration===i:void 0===r.pid&&void 0===r.workerGeneration||r.pid===i&&(void 0===r.workerGeneration||r.workerGeneration===i)}))return;let r=await this.store.read(e);if(t||!r||r.workerLaunchToken)break;await new Promise(e=>setTimeout(e,100))}while(Date.now()<r);throw Error("Job broker launch was superseded")}spawnInner(e,t,r,i){let o={...process.env};d(o),delete o[N],delete o.SERVER__PORT,delete o.SERVER__HOST,delete o.CODEBUDDY_GATEWAY_AUTH,o[O]=i,o[I]=String(process.pid),o[_]=r,o.CODEBUDDY_JOB_RECLAIM_TOKEN=this.innerReclaimToken,delete o.CODEBUDDY_ATTACH_ORIGIN,o.NODE_OPTIONS="";let n=process.env.TERM&&"dumb"!==process.env.TERM?process.env.TERM:"xterm-256color";return o.TERM=n,delete o.NO_COLOR,o.COLORTERM||(o.COLORTERM="truecolor"),{pty:e.module.spawn(process.execPath,this.dependencies.buildRespawnArgs(t,process.argv.slice(2)),{name:n,cols:120,rows:40,cwd:process.cwd(),env:o}),cols:120,rows:40}}}function ez(e,t){return"number"==typeof e&&"number"==typeof t&&e>0&&t>0}function eX(e,t){e.destroyed||e.write(`${JSON.stringify({protocolVersion:1,...t})}
|
|
6
|
+
`)}function eZ(e,t,r){if(ez(t,r))try{e.resize(t,r)}catch{}}async function e0(e){"win32"!==process.platform&&await (0,h.unlink)(e).catch(()=>{})}async function e1(e){let t=`${process.pid}.${(0,u.randomUUID)()}.owner`,r=`${e}.${t}`;await (0,h.mkdir)(r,{mode:448});try{await (0,h.writeFile)((0,s.join)(r,t),String(process.pid),{flag:"wx",mode:384});let i=Date.now()+2e3;for(;;){try{return await (0,h.rename)(r,e),async()=>{await (0,h.unlink)((0,s.join)(e,t)),await e2(e)}}catch(e){if(!["EEXIST","ENOTEMPTY","ENOTDIR","EISDIR","EPERM","EACCES"].includes(e.code??""))throw e}if(await e3(e),Date.now()>=i)throw Error(`Timed out acquiring job lock: ${e}`);await new Promise(e=>setTimeout(e,25))}}finally{await (0,h.unlink)((0,s.join)(r,t)).catch(e=>{if("ENOENT"!==e.code)throw e}),await e2(r)}}async function e2(e){try{await (0,h.rmdir)(e)}catch(e){if(!["ENOENT","ENOTEMPTY","EEXIST"].includes(e.code??""))throw e}}async function e3(e){let t;try{t=await (0,h.readdir)(e)}catch(e){if(["ENOENT","ENOTDIR"].includes(e.code??""))return;throw e}for(let r of t){let t=/^(\d+)\.[0-9a-f-]{36}\.owner$/.exec(r);if(!t)return;let i=Number(t[1]);if(!Number.isSafeInteger(i)||i<=0||e_(i))return;let o=(0,s.join)(e,r);try{if(await (0,h.readFile)(o,"utf8")!==String(i)||e_(i))return;await (0,h.unlink)(o)}catch(e){if("ENOENT"!==e.code)throw e}}await e2(e)}async function e4(e){let t=await e1(e+".guard"),r=!1,i=`${e}.${process.pid}.${(0,u.randomUUID)()}.candidate`;try{await (0,h.writeFile)(i,String(process.pid),{flag:"wx",mode:384});let o=Date.now()+2e3;for(;;){try{await (0,h.link)(i,e),r=!0;break}catch(e){if("EEXIST"!==e.code)throw e}try{let t=await (0,h.readFile)(e,"utf8"),r=Number(t);if(t.trim()&&Number.isSafeInteger(r)&&r>0&&!e_(r)){await (0,h.unlink)(e);continue}}catch(e){if("ENOENT"===e.code)continue;throw e}if(Date.now()>=o)throw Error("Timed out acquiring job lock: "+e);await new Promise(e=>setTimeout(e,25))}return async()=>{try{await (0,h.unlink)(e)}finally{await t()}}}finally{try{await (0,h.unlink)(i).catch(e=>{if("ENOENT"!==e.code)throw e})}finally{r||await t()}}}function e8(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}let e6=["pinned","sortOrder","stateSortOrder","group"],e5=/^[A-Za-z0-9_-]{1,64}$/,e7=".locks";class e9{homeDir;constructor(e=()=>process.env.CODEBUDDY_CONFIG_DIR?.trim()?process.env.CODEBUDDY_CONFIG_DIR:(0,s.join)((0,y.homedir)(),".codebuddy")){this.homeDir=e}writeQueues=new Map;lastReapAt=0;inboxSeq=0;getJobsDir(){return(0,s.join)(this.homeDir(),"jobs")}static INBOX_PROCESSING_DIR=".processing";getJobDir(e){if(!e5.test(e))throw Error("Invalid job id");return(0,s.join)(this.getJobsDir(),e)}async create(e){let t=e.sessionId.slice(0,8),r=new Date().toISOString(),i={state:"working",detail:e.detail??"starting…",tempo:"active",output:null,children:null,intent:e.intent,initialPrompt:e.initialPrompt,name:e.name,nameSource:e.nameSource,sessionId:e.sessionId,shortId:t,cwd:e.cwd,createdAt:r,updatedAt:r,firstTerminalAt:null,pid:e.pid,logPath:e.logPath,respawnArgs:e.respawnArgs,exec:e.exec,bgIsolation:e.bgIsolation,inPlaceWorker:e.inPlaceWorker,foregroundHeld:e.foregroundHeld};return await this.withJobLock(t,async()=>{await this.ensureJobDir(t),await (0,h.mkdir)((0,s.join)(this.getJobDir(t),"tmp"),{recursive:!0,mode:448}),await this.writeStateAtomic(t,i)}),t}async read(e){if(!e5.test(e))return;let t=await this.readFileSafe((0,s.join)(this.getJobDir(e),R));if(void 0===t)return;let r=this.parseState(t);if(r)return this.overlayBrokerEndpoint(e,r)}async patch(e,t){this.maybeReapDeadJobs(),await this.queuePatch(e,t)}async patchQuiet(e,t){await this.queuePatch(e,t)}async patchIf(e,t,r){return this.queuePatch(e,t,r)}queuePatch(e,t,r){let i=(this.writeQueues.get(e)??Promise.resolve()).then(()=>this.doPatch(e,t,r)),o=i.then(()=>void 0,()=>void 0);return this.writeQueues.set(e,o),o.then(()=>{this.writeQueues.get(e)===o&&this.writeQueues.delete(e)}),i}maybeReapDeadJobs(){let e=Date.now();e-this.lastReapAt<6e4||(this.lastReapAt=e,eK({store:this,isProcessRunning:e8}).catch(()=>{}))}async list(){let e,t=this.getJobsDir();try{e=await (0,h.readdir)(t)}catch{return[]}let r=await this.readPins();return(await Promise.all(e.filter(e=>e!==P&&e!==e7&&e5.test(e)).map(async e=>{let t=await this.read(e);if(!t)return;let[i,o,n]=await Promise.all([this.readNumberSidecar(e,"order"),this.readNumberSidecar(e,J),this.readTextSidecar(e,"group")]);return{id:e,state:t,display:{pinned:r.has(e),sortOrder:i,stateSortOrder:o,group:n}}}))).filter(e=>void 0!==e)}async remove(e){await this.withJobLock(e,async()=>{await this.setPinned(e,!1),await (0,h.rm)(this.getJobDir(e),{recursive:!0,force:!0})})}async removeIf(e,t){return this.withJobLock(e,async()=>{let r=await this.readStateForMutation(e);return!!r&&!!t(await this.overlayBrokerEndpoint(e,r))&&(await this.setPinned(e,!1),await (0,h.rm)(this.getJobDir(e),{recursive:!0,force:!0}),!0)})}async readPins(){let e=await this.readFileSafe((0,s.join)(this.getJobsDir(),P));if(void 0===e)return new Set;try{let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>"string"==typeof e)):new Set}catch{return new Set}}async setPinned(e,t){await this.withLock(`${P}.lock`,async()=>{let r=await this.readFileForMutation((0,s.join)(this.getJobsDir(),P)),i=[];try{i=void 0===r?[]:JSON.parse(r)}catch{i=void 0}let o=Array.isArray(i)&&i.every(e=>"string"==typeof e);o||void 0===r||await (0,h.writeFile)((0,s.join)(this.getJobsDir(),`${P}.${(0,u.randomUUID)()}.corrupt`),r,{flag:"wx",mode:384});let n=new Set(Array.isArray(i)?i.filter(e=>"string"==typeof e):[]);if(t)n.add(e);else if(!n.delete(e)&&o)return;await this.writeAtomic((0,s.join)(this.getJobsDir(),P),JSON.stringify([...n],null,2))})}async setOrder(e,t,r){let i=(0,s.join)(this.getJobDir(e),"state"===t?J:"order");void 0===r?await this.unlinkSafe(i):(await this.ensureJobDir(e),await this.writeAtomic(i,String(r)))}async setGroup(e,t){let r=(0,s.join)(this.getJobDir(e),"group");void 0===t||""===t.trim()?await this.unlinkSafe(r):(await this.ensureJobDir(e),await this.writeAtomic(r,t.trim()))}async enqueueReply(e,t){await this.withJobLock(e,async()=>{let r=(0,s.join)(this.getJobDir(e),"inbox");await (0,h.mkdir)(r,{recursive:!0,mode:448});let i={...t,at:Date.now()},o=`${i.at}-${process.pid}-${this.inboxSeq++}.json`;await this.writeAtomic((0,s.join)(r,o),JSON.stringify(i,null,2));let n=await this.readStateForMutation(e);if(n?.workerReclaimGeneration!==void 0&&n.workerReclaimGeneration===n.workerGeneration){let t=(0,s.join)(this.homeDir(),"agent-home","wake");await (0,h.mkdir)(t,{recursive:!0,mode:448}),await this.writeAtomic((0,s.join)(t,Date.now()+"-"+(0,u.randomUUID)()+".json"),JSON.stringify({jobId:e}))}})}async commitReclaim(e,t){return this.withJobLock(e,async()=>{let r=await this.readStateForMutation(e);if(!r||r.sessionId!==t.sessionId||r.createdAt!==t.createdAt||r.pid!==t.pid||r.workerGeneration!==t.workerGeneration||r.idleSince!==t.idleSince||"idle"!==r.tempo||r.workerLaunchToken||r.attachedAt||r.foregroundHeld||r.inPlaceWorker||r.exec)return!1;for(let t of["inbox","colleague-inbox"])if((await (0,h.readdir)((0,s.join)(this.getJobDir(e),t)).catch(e=>{if("ENOENT"===e.code)return[];throw e})).filter(e=>e.endsWith(".json")).length)return!1;return await this.readFileForMutation((0,s.join)(this.getJobDir(e),j))===void 0&&(await this.writeStateAtomic(e,{...r,workerReclaimGeneration:r.workerGeneration}),!0)})}inboxProcessingDir(e){return(0,s.join)(this.getJobDir(e),"inbox",e9.INBOX_PROCESSING_DIR)}async inspectInbox(e){let t=(0,s.join)(this.getJobDir(e),"inbox"),r=this.inboxProcessingDir(e),i=async e=>{try{return(await (0,h.readdir)(e)).filter(e=>e.endsWith(".json"))}catch(e){if("ENOENT"===e.code)return[];throw e}},[o,n]=await Promise.all([i(t),i(r)]),a=[...o,...n].map(e=>this.inboxSortKey(e)).filter(e=>e>0).sort((e,t)=>e-t)[0];return{queued:o.length,processing:n.length,...void 0===a?{}:{oldestAt:a}}}async drainInbox(e){let t=(0,s.join)(this.getJobDir(e),"inbox"),r=this.inboxProcessingDir(e),i=await this.withJobLock(e,async()=>{let e=(await (0,h.readdir)(r).catch(()=>[])).filter(e=>e.endsWith(".json")),i=(await (0,h.readdir)(t).catch(()=>[])).filter(e=>e.endsWith(".json")).sort((e,t)=>this.inboxSortKey(e)-this.inboxSortKey(t)).slice(0,Math.max(0,64-e.length)),o=[];for(let n of(i.length>0&&await (0,h.mkdir)(r,{recursive:!0,mode:448}).catch(()=>void 0),[...e,...i])){let e=(0,s.join)(r,n);if(i.includes(n))try{await (0,h.rename)((0,s.join)(t,n),e)}catch{continue}let a=await this.readFileForMutation(e);if(void 0===a){await this.unlinkSafe(e);continue}o.push({path:e,raw:a})}return o}),o=[];for(let e of i)try{let t=JSON.parse(e.raw);"string"==typeof t?.text?o.push(t):(console.warn(`[JobStore] drainInbox dropped non-text reply in ${e.path}`),await this.unlinkSafe(e.path))}catch{console.warn(`[JobStore] drainInbox dropped bad JSON in ${e.path}`),await this.unlinkSafe(e.path)}return o}async ackInbox(e){let t=this.inboxProcessingDir(e),r=`${t}.acked-${(0,u.randomUUID)()}`;await this.withJobLock(e,async()=>{try{await (0,h.rename)(t,r)}catch(e){if("ENOENT"===e.code)return;throw e}}),await (0,h.rm)(r,{recursive:!0,force:!0}).catch(()=>void 0)}async releaseInbox(e){let t=(0,s.join)(this.getJobDir(e),"inbox"),r=this.inboxProcessingDir(e);await this.withJobLock(e,async()=>{for(let e of(await (0,h.readdir)(r).catch(()=>[])).filter(e=>e.endsWith(".json")))await (0,h.rename)((0,s.join)(r,e),(0,s.join)(t,e)).catch(()=>void 0)})}async savePendingReply(e,t){return!t.bash&&(await this.withJobLock(e,async()=>{await this.ensureJobDir(e);let r={...t,at:Date.now()};await this.writeAtomic((0,s.join)(this.getJobDir(e),j),JSON.stringify(r,null,2))}),!0)}async readPendingReply(e){let t=(0,s.join)(this.getJobDir(e),j),r=await this.readFileSafe(t);if(void 0!==r)try{let e=JSON.parse(r);return"string"==typeof e?.text?e:void 0}catch{return}}async takePendingReply(e,t){return this.withJobLock(e,async()=>{let r,i=(0,s.join)(this.getJobDir(e),j),o=await this.readFileForMutation(i);if(void 0!==o){try{r=JSON.parse(o)}catch{return}if("string"==typeof r?.text&&(!t||r.at===t.at&&r.text===t.text&&r.bash===t.bash))return await (0,h.unlink)(i),r}})}async setBrokerEndpoint(e,t,r){await this.withJobLock(e,async()=>{if(r){let t=await this.readBrokerEndpoint(e);if(!t||t.pid!==r.pid||t.attachSocket!==r.attachSocket)return}let i=(0,s.join)(this.getJobDir(e),x);void 0===t?await this.unlinkSafe(i):await this.readStateForMutation(e)&&await this.writeAtomic(i,JSON.stringify(t,null,2))})}async readBrokerEndpoint(e){let t=await this.readFileSafe((0,s.join)(this.getJobDir(e),x));if(void 0!==t)try{let e=JSON.parse(t);if("number"==typeof e?.pid&&"string"==typeof e?.attachSocket)return{pid:e.pid,attachSocket:e.attachSocket,...eP(ex(e))}}catch{}}async doPatch(e,t,r){return this.withJobLock(e,async()=>{let i=await this.readStateForMutation(e);if(!i||r&&!r(await this.overlayBrokerEndpoint(e,i)))return!1;let o={...i,...t,updatedAt:new Date().toISOString()};return await this.writeStateAtomic(e,o),!0})}withJobLock(e,t){return e5.test(e)?this.withLock(`${e}.state.lock`,t):Promise.reject(Error("Invalid job id"))}async withLock(e,t){await this.ensureJobsDir();let r=(0,s.join)(this.getJobsDir(),e7);await (0,h.mkdir)(r,{recursive:!0,mode:448});let i=(0,s.join)(r,e),o=await e4(i);try{return await t()}finally{await o()}}async readFileForMutation(e){try{return await (0,h.readFile)(e,"utf8")}catch(e){if("ENOENT"===e.code)return;throw e}}async readStateForMutation(e){let t=await this.readFileForMutation((0,s.join)(this.getJobDir(e),R));if(void 0===t)return;let r=this.parseState(t);if(!r)throw Error(`Invalid job state: ${e}`);return r}async overlayBrokerEndpoint(e,t){let r=await this.readBrokerEndpoint(e);if(!r||void 0!==t.workerGeneration&&t.workerGeneration!==r.pid)return{...t};let i=ex(r);return await ej(r.pid,i)?{...t,pid:r.pid,attachSocket:r.attachSocket,...eP(i)}:(await this.unlinkSafe((0,s.join)(this.getJobDir(e),x)),{...t})}async writeStateAtomic(e,t){let r={...t};for(let e of e6)delete r[e];await this.writeAtomic((0,s.join)(this.getJobDir(e),R),JSON.stringify(r,null,2))}async writeAtomic(e,t){let r=`${e}.${process.pid}.${(0,u.randomUUID)()}.tmp`;try{await (0,h.writeFile)(r,t,{mode:384,flag:"wx"}),await (0,h.rename)(r,e)}catch(e){throw await this.unlinkSafe(r),e}}async ensureJobsDir(){let e=this.getJobsDir();await (0,h.mkdir)(e,{recursive:!0,mode:448});try{await (0,h.chmod)(e,448)}catch{}}async ensureJobDir(e){await this.ensureJobsDir(),await (0,h.mkdir)(this.getJobDir(e),{recursive:!0,mode:448})}async readFileSafe(e){try{return await (0,h.readFile)(e,"utf8")}catch{return}}async unlinkSafe(e){try{await (0,h.unlink)(e)}catch{}}parseState(e){let t;try{t=JSON.parse(e)}catch{return}if("object"!=typeof t||null===t)return;let r=t;for(let e of["state","sessionId","cwd","createdAt","updatedAt"])if("string"!=typeof r[e]||""===r[e])return;return{...r,detail:"string"==typeof r.detail?r.detail:"",tempo:r.tempo??"idle",intent:"string"==typeof r.intent?r.intent:"",shortId:"string"==typeof r.shortId?r.shortId:r.sessionId.slice(0,8)}}async readNumberSidecar(e,t){let r=await this.readTextSidecar(e,t);if(void 0===r)return;let i=Number(r);return Number.isFinite(i)?i:void 0}async readTextSidecar(e,t){let r=await this.readFileSafe((0,s.join)(this.getJobDir(e),t));if(void 0===r)return;let i=r.trim();return""===i?void 0:i}inboxSortKey(e){let t=Number(e.split("-")[0]);return Number.isFinite(t)?t:0}}let te=process.env.CODEBUDDY_JOB_INNER_ENTRY;if(delete process.env.CODEBUDDY_JOB_INNER_ENTRY,!function(e=process.env){C||(C=!0,i=L(e[O]),o=L(e[A]),Number.isInteger(Number(L(e[I]))),L(e[_]),L(e.CODEBUDDY_JOB_RECLAIM_TOKEN),F=!!L(e[N]),function(e){for(let t of $)delete e[t]}(e))}(),d(process.env),!te||!i||!F)throw Error("Lightweight broker requires an explicit inner entry and job identity");let tt=Date.now(),tr={setContext(e){},info(e){process.stdout.write(e+"\n")},warn(e){process.stderr.write(e+"\n")}};new eV({store:new e9,logger:tr,entry:(0,s.resolve)(te),buildRespawnArgs:(e,t)=>[e,...t]}).run().catch(e=>{tr.warn(String(e)),process.exitCode=1}).finally(()=>{"1"===process.env.CODEBUDDY_STARTUP_PROFILE&&tr.info(JSON.stringify({phase:"job_broker_exit",elapsedMs:Date.now()-tt,rss:process.memoryUsage().rss}))})},421(e){e.exports=require("node:child_process")},24(e){e.exports=require("node:fs")},995(e){e.exports=require("node:module")},760(e){e.exports=require("node:path")},338(e,t,r){e=r.nmd(e);let{spawn:i}=r(421),{openSync:o,closeSync:n}=r(24),a=r(760),s=Symbol.for("codebuddy.daemon-supervisor"),c="CODEBUDDY_INTERNAL_DAEMON_CHANNEL",l="--internal-daemon-supervisor";function d(){let e=process.versions.bun&&/^(\/\$bunfs\/|[A-Za-z]:[\\/]~BUN[\\/])/.test(process.argv[1]||"")?[l]:[a.resolve(__dirname,"../bin/daemon-supervisor.cjs")],t=i(process.execPath,e,{detached:!0,windowsHide:!0,stdio:["ignore","ignore","ignore","ipc"]});return t.on("error",e=>{t.supervisorError=e}),t.unref(),t.channel?.unref?.(),globalThis[s]=t,t}let u=0;function p(){if(!process.send)throw Error("Daemon supervisor requires an inherited IPC channel");let e=new Set,t=()=>{process.connected||0!==e.size||process.exit(0)},r=a=>{let s=!1;a.on("message",l=>{let d;if(l?.type!=="start-daemon")return;let{id:u,command:p,args:f,options:h}=l,w=e=>{a.connected&&a.send({type:"daemon-started",id:u,...e},()=>{})};if(s)return void w({error:"Daemon already handed off by this process"});if(!Array.isArray(f)||!f.includes("--serve")||h?.env?.CODEBUDDY_SESSION_KIND!=="daemon")return void w({error:"Supervisor only starts daemon workers"});try{d=void 0===h.logPath?void 0:o(h.logPath,"a");let n=i(p,f,{cwd:h.cwd,env:{...h.env,[c]:"1"},detached:!0,windowsHide:!0,stdio:["ignore",d??"ignore",d??"ignore","ipc"]});s=!0,e.add(n),r(n),n.once("spawn",()=>w({pid:n.pid})),n.once("error",r=>{s=!1,e.delete(n),w({error:r.message}),t()}),n.once("exit",()=>{e.delete(n),t()})}catch(e){w({error:e.message})}finally{void 0!==d&&n(d)}})};r(process),process.on("disconnect",t)}e.exports={prepare:function(e=process.platform){if("win32"!==e)return;if(globalThis[s])return globalThis[s];if(process.env[c]&&(delete process.env[c],process.send&&process.connected))return globalThis[s]=process,process.channel?.unref?.(),process;let t=process.argv.slice(2);if("daemon"===t[0]&&["start","restart","install"].includes(t[1]))return d()},start:d,spawnDaemon:function(e,t,r){let i=globalThis[s];if(!i?.connected||i.supervisorError)return Promise.reject(i?.supervisorError||Error("Daemon supervisor unavailable; start it with codebuddy daemon start"));let o=++u;return new Promise((n,a)=>{let s=setInterval(()=>{},6e4),c=(e,t)=>{clearInterval(s),i.off("message",d),i.off("disconnect",l),i.channel?.unref?.(),e?a(e):n(t)},l=()=>c(Error("Daemon supervisor disconnected during startup")),d=e=>{e?.type==="daemon-started"&&e.id===o&&c(e.error?Error(e.error):void 0,{pid:e.pid})};i.on("message",d),i.once("disconnect",l),i.channel?.ref?.();try{i.send({type:"start-daemon",id:o,command:e,args:t,options:r},e=>{e&&c(e)})}catch(e){c(e)}})},run:p,FLAG:l},r.c[r.s]===e&&p()},188(e,t,r){let{loadBinding:i}=r(624),o=Symbol.for("codebuddy.no-orphans"),n="--no-orphans",a="CODEBUDDY_DISABLE_CHILD_PROCESS_CONTAINMENT";function s(e=process.env){let t=e[a];if(void 0===t||["","0","false"].includes(t))return!1;if(["1","true"].includes(t))return!0;throw Error(`${a} must be 0, 1, true, false, or unset`)}e.exports={install:function({platform:e=process.platform,environment:t=process.env,args:a=process.argv.slice(2),state:c=globalThis,loadBinding:l=i,warn:d=e=>process.emitWarning(e)}={}){if(void 0!==c[o])return c[o];if("win32"!==e)return c[o]=!1;let u=a.indexOf("--");if(!a.slice(0,u<0?a.length:u).includes(n)&&s(t))return c[o]=!1;r(338).prepare();try{return l().ensureKillOnCloseJob(),c[o]=!0}catch(e){return c[o]=!1,d(`Windows no-orphans cleanup unavailable: ${e.message}`),!1}},isEnabled:function(){return"win32"===process.platform&&!0===globalThis[o]},isDisabled:s,DISABLE_ENV:a,NO_ORPHANS_FLAG:n}},624(e,t,r){let i,o=r(760),{createRequire:n}=r(995);e.exports={loadBinding:function(){if("win32"!==process.platform)throw Error("Windows Job binding requires win32");if(!i)if(globalThis.__CODEBUDDY_WINDOWS_JOB_NATIVE__)i=globalThis.__CODEBUDDY_WINDOWS_JOB_NATIVE__();else{let e=o.resolve(__dirname,"../bin/native",`win32-${process.arch}`,"job-object.node");i=n(__filename)(e)}return i}}}},t={};function r(i){var o=t[i];if(void 0!==o)return o.exports;var n=t[i]={id:i,loaded:!1,exports:{}};return e[i](n,n.exports,r),n.loaded=!0,n.exports}r.c=t,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.rv=()=>"1.7.6",r.ruid="bundler=rspack@1.7.6",r(r.s=780)})();
|