elanous 0.2.42 → 0.2.44
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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
- package/apps/pwa/out/_next/static/chunks/1306.967240ede9a0f757.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 1401.22dfe92640a2b1ac.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 1694.18debfd77562e56d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1850-522de4ee34957210.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2216.802962c04f40a26e.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2954.bbefc95d6b20e0d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
- package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4393.28fa5228d0eec217.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 4502.bdcc877abd437a05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 46.57c783fa4884714f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 4757.67c6d7473a038e78.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
- package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5052.7dbb12a55d4f18f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
- package/apps/pwa/out/_next/static/chunks/5439.3fec6dbce29ecb36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
- package/apps/pwa/out/_next/static/chunks/5790.5eb06a653ebd8571.js +34 -0
- package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
- package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
- package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
- package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 63699a35.17262e162bc514b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7010.1bbd17a7f2b3e376.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7679.32c40cdd14f20b4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 8442.2f09ca969d631615.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
- package/apps/pwa/out/_next/static/chunks/9398.1f56e3f17795f43f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
- package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-da787e8a10b8a82e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.js +1 -0
- package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/external-commands.yaml +5 -3
- package/catalog/meta/catalogVersion.yaml +2 -1
- package/catalog/signing/catalog-signing-public.pem +3 -0
- package/graphs/intake/intake-daily.yaml +16 -0
- package/graphs/intake/news-sources.yaml +1 -0
- package/graphs/intake/recipes.yaml +7 -0
- package/graphs/overlays/README.md +6 -0
- package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/release/release-loop.yaml +33 -17
- package/graphs/units/verbs/make-doc.yaml +1 -0
- package/package.json +6 -2
- package/plugins/demo-absorption-briefing/plugin.json +18 -0
- package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
- package/plugins/demo-browser-hand/plugin.json +13 -0
- package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
- package/plugins/demo-linear-secretary/plugin.json +15 -0
- package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
- package/plugins/demo-plugin-wizard/plugin.json +11 -0
- package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
- package/plugins/demo-research/plugin.json +16 -0
- package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
- package/plugins/demo-video-briefing/plugin.json +15 -0
- package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
- package/scripts/bench-metering-plan.ts +229 -0
- package/scripts/build-signed-catalog.ts +48 -0
- package/scripts/ci-typecheck-main-delta.sh +88 -0
- package/scripts/codex-fallback-live-probe.ts +1 -1
- package/scripts/demo/demo1104-parallel-host.ts +56 -0
- package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
- package/scripts/demo/demo1104-parallel.ts +72 -0
- package/scripts/demo/demo1104-stage.config.ts +21 -0
- package/scripts/demo/demo1104-stage.ts +316 -0
- package/scripts/goal-method-audit.ts +17 -1
- package/scripts/graph-units/land-enqueue.ts +90 -0
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/landing-heal/land-plan.ts +57 -0
- package/scripts/public-leak-baseline.txt +0 -1
- package/scripts/release-loop/auto-approve-node.ts +1 -1
- package/scripts/release-loop/docs-node.ts +4 -2
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- package/scripts/release-loop/gate-image-pin.ts +116 -2
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node.ts +395 -43
- package/scripts/release-loop/gate-progress-sim.ts +73 -0
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/notes-repair.ts +18 -1
- package/scripts/release-loop/preflight.ts +544 -10
- package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
- package/scripts/release-loop/resume-release.ts +9 -7
- package/scripts/release-loop/resume.ts +13 -4
- package/scripts/release-loop/unattended-release.ts +20 -9
- package/scripts/release-loop/warm-control-forward.ts +178 -0
- package/scripts/retro-cycle.ts +30 -8
- package/scripts/rhythm/daily.ts +39 -4
- package/scripts/rhythm/linear-progress-sync.ts +311 -0
- package/scripts/ux-sim.ts +7 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +35 -7
- package/src/acp/agent-manager.ts +1 -0
- package/src/acp/codex-app-server-agent.ts +33 -0
- package/src/acp/codex-app-server-client.ts +153 -16
- package/src/acp/core-turn-bridge.ts +17 -12
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -0
- package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
- package/src/agent-mission/claude-headless.ts +4 -1
- package/src/agent-mission/codex-exec.ts +105 -0
- package/src/agent-mission/driver.ts +192 -11
- package/src/agent-mission/grok-auth-status.ts +107 -0
- package/src/agent-mission/hand-hooks.ts +101 -0
- package/src/agent-mission/mission-cli.ts +56 -21
- package/src/agent-mission/mission-hand-reply.ts +118 -0
- package/src/agent-mission/mission-line.ts +180 -0
- package/src/agent-mission/mission-out.ts +256 -18
- package/src/agent-mission/tool-install.ts +122 -11
- package/src/agent-substrate/pr-reviewer.ts +147 -11
- package/src/agent-substrate/self-review-cli.ts +10 -2
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-fanout.ts +221 -0
- package/src/auto-research/research-turn.ts +362 -31
- package/src/autopilot/mission-codebase-gate.ts +7 -3
- package/src/autopilot/pr-manager.ts +31 -3
- package/src/boot/daemon-tools/self-implement.ts +3 -1
- package/src/boot/daemon-tools/web-search.ts +1 -2
- package/src/briefing/brief-items.ts +55 -11
- package/src/cli/agent-cli.ts +2 -1
- package/src/cli/catalog-cli.ts +31 -0
- package/src/cli/connector-cli.ts +16 -0
- package/src/cli/control-cli.ts +15 -6
- package/src/cli/doctor-fix.ts +2 -2
- package/src/cli/intake-source-cli.ts +44 -8
- package/src/cli/log-event-names.ts +8 -0
- package/src/cli/msg-cli.ts +32 -3
- package/src/cli/pr-cli.ts +21 -1
- package/src/cli/pr-land-heavy-remote.ts +44 -6
- package/src/cli/pr-land-overlap-evidence.ts +13 -1
- package/src/cli/pr-land-pod-shadow-job.ts +143 -5
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +44 -16
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +9 -0
- package/src/cli/setup-cli.ts +166 -6
- package/src/cli/setup-keys.ts +199 -0
- package/src/cli/task-plugin-wizard-host.ts +114 -0
- package/src/cli/tasks-cli.ts +54 -9
- package/src/cli/tui-test-cli.ts +190 -0
- package/src/config.ts +4 -2
- package/src/connectors/linear-daily-progress.ts +228 -0
- package/src/connectors/linear-projector.ts +34 -12
- package/src/connectors/linear.ts +151 -7
- package/src/control-plane/ledger.ts +42 -4
- package/src/control-plane/member-tokens.ts +25 -2
- package/src/control-plane/ports.ts +8 -3
- package/src/control-plane/server.ts +26 -5
- package/src/core-turn/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +43 -0
- package/src/core-turn/run-core-turn.ts +488 -51
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
- package/src/dashboard/classic-sidetab-mission.ts +169 -5
- package/src/dashboard/index.ts +387 -14
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
- package/src/dashboard/mission-cli-consumer.ts +20 -8
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/sidetab-runtime.ts +3 -1
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/visible-mission-diagnostics.ts +16 -0
- package/src/decisions/linear-progress-summary.ts +78 -0
- package/src/decisions/linear-progress-sync.ts +152 -0
- package/src/domains/outbound-alert.ts +49 -11
- package/src/domains/retro-cycle-observation.ts +43 -0
- package/src/domains/retro-cycle.ts +13 -2
- package/src/domains/retro-proposals.ts +92 -0
- package/src/domains/retro-report.ts +6 -1
- package/src/domains/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-cli.ts +24 -1
- package/src/graph-runner/graph-grow-llm.ts +3 -1
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/runner.ts +310 -46
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/harness/dispatch-backpressure.ts +54 -1
- package/src/harness/dispatch-shadow-compare.ts +74 -0
- package/src/harness/harness-cli-command.ts +15 -3
- package/src/harness/harness-pod-dispatch.ts +3 -0
- package/src/harness/skill-exec.ts +21 -9
- package/src/harness/skill-select.ts +1 -1
- package/src/hooks/error-report-cloud.ts +101 -0
- package/src/hooks/receiver.ts +29 -2
- package/src/index.ts +129 -12
- package/src/intake-plane/actions.ts +354 -0
- package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
- package/src/intake-plane/intake-sources.ts +78 -8
- package/src/intake-plane/items.ts +14 -4
- package/src/intake-plane/linear-mission-sync.ts +80 -0
- package/src/intake-plane/linear-secretary-runtime.ts +178 -0
- package/src/intake-plane/linear-wish.ts +227 -1
- package/src/life/life-cli.ts +168 -0
- package/src/life/life-kinds.ts +160 -0
- package/src/live-supply/budget-consumer.ts +78 -0
- package/src/live-supply/read.ts +3 -0
- package/src/live-supply/snapshot.ts +45 -0
- package/src/llm/child-first-llm-observation.ts +112 -0
- package/src/llm/provider-credentials.ts +68 -6
- package/src/llm/provider-failure-evidence.ts +44 -0
- package/src/llm.ts +172 -12
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/mcp/client.ts +7 -0
- package/src/mcp/proxy-runtime.ts +6 -1
- package/src/mcp/server.ts +54 -0
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +36 -2
- package/src/nexus/api/consult-requests.ts +18 -6
- package/src/nexus/api/discord-trigger-bot.ts +6 -6
- package/src/nexus/api/graphs-api.ts +4 -2
- package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
- package/src/nexus/api/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -0
- package/src/nexus/api/telegram-trigger-bot.ts +6 -6
- package/src/nexus/boot/register-mcp-clients.ts +114 -8
- package/src/nexus/index.ts +22 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/grokbot-adapter.ts +71 -0
- package/src/nexus/outbound/router.ts +121 -16
- package/src/nexus/setup-status.ts +9 -0
- package/src/nexus/state/state.ts +3 -0
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-owner-mirror.ts +81 -0
- package/src/oauth/codex.ts +17 -2
- package/src/oauth/fallback-chain.ts +47 -17
- package/src/onboarding/first-run-doctor.ts +8 -1
- package/src/onboarding/first-run.ts +126 -29
- package/src/onboarding/key-setup.ts +103 -0
- package/src/onboarding/menu-answer.ts +13 -0
- package/src/onboarding/secret-prompt.ts +37 -0
- package/src/plugins/install/plugin-install.ts +59 -0
- package/src/pr-tool/census.ts +130 -0
- package/src/preview/terminal.ts +22 -7
- package/src/prompt-enhance/enhance.ts +10 -0
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-write-provenance.ts +21 -3
- package/src/pty-shell/registry.ts +9 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/release-loop/proposal-auto-place.ts +83 -0
- package/src/research/axis-fanout.ts +79 -29
- package/src/research/lenses/second-order.ts +312 -0
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/dev-cli.ts +7 -2
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- package/src/self-dev/draft-sweep.ts +31 -10
- package/src/self-dev/draft-triage-rules.ts +60 -3
- package/src/self-dev/graph-front-nodes.ts +2 -1
- package/src/self-dev/graph-journey-route.ts +76 -21
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +1 -1
- package/src/self-dev/run-supervisor.ts +152 -2
- package/src/self-dev/shard-aggregate.ts +4 -0
- package/src/self-dev/shard-run.ts +36 -15
- package/src/self-implement/abandoned-classification.ts +12 -3
- package/src/self-implement/budget-gate.ts +7 -0
- package/src/self-implement/child-llm-preference.ts +10 -1
- package/src/self-implement/doctor-visit.ts +30 -8
- package/src/self-implement/elanous-tui-spawn.ts +3 -0
- package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
- package/src/self-implement/gate-artifacts.ts +2 -1
- package/src/self-implement/goal-author-cli.ts +4 -2
- package/src/self-implement/goal-author.ts +549 -10
- package/src/self-implement/graph-overlay-yaml.ts +181 -4
- package/src/self-implement/graph-overlay.ts +3 -1
- package/src/self-implement/graph-profile-yaml.ts +107 -0
- package/src/self-implement/graph-yaml.ts +94 -5
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +298 -26
- package/src/self-implement/run-chart.ts +6 -3
- package/src/self-implement/run-ledger.ts +51 -1
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/tdd-evidence-tags.ts +9 -0
- package/src/self-implement/test-scenario-request.ts +37 -6
- package/src/self-implement/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +6 -4
- package/src/session/session-fanout.ts +2 -0
- package/src/session/streaming/acp-stream-sink.ts +2 -1
- package/src/session/streaming/chunk-producer.ts +6 -0
- package/src/session/streaming/stream-compositor.ts +3 -2
- package/src/session-runtime/index.ts +74 -6
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/setup/llm-env-detect.ts +3 -0
- package/src/setup/service-key-catalog.ts +46 -0
- package/src/setup/service-keys.ts +241 -0
- package/src/sidetab-core/model.ts +205 -10
- package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
- package/src/sidetab-core/visible-agent-mission.ts +182 -48
- package/src/skills/tools/agent.ts +23 -4
- package/src/skills/tools/omni-search.ts +127 -27
- package/src/task-agent/parent-host.ts +29 -1
- package/src/task-agent/recall-inject.ts +98 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +46 -14
- package/src/task-orchestrator/dispatcher.ts +14 -1
- package/src/task-orchestrator/linear-capture-events.ts +55 -0
- package/src/task-orchestrator/store.ts +16 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
- package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
- package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
- package/src/task-orchestrator/types.ts +14 -0
- package/src/telegram.ts +14 -16
- package/src/terminal/coding-agent.ts +14 -5
- package/src/terminal/session-registry.ts +1 -1
- package/src/tool-hints/gate.ts +46 -14
- package/src/tool-hints/signals.ts +1 -1
- package/src/tool-hints/types.ts +2 -0
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/browser-hand-runtime.ts +391 -0
- package/src/tool-runtime/browser-runtime.ts +33 -19
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/types.ts +5 -0
- package/src/tui/entry.ts +51 -8
- package/src/tui/sidetab/attach.ts +252 -11
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui/sidetab/list.ts +3 -2
- package/src/tui-client/next-dashboard-runtime.ts +52 -0
- package/src/user-config.ts +34 -9
- package/src/user-intent/types.ts +4 -3
- package/src/ux-sim/browser-hand.ts +165 -0
- package/src/ux-sim/draft-inventory-builder.ts +199 -0
- package/src/ux-sim/fake-browser-page.ts +81 -0
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/graph-engine-sim.ts +47 -0
- package/src/ux-sim/linear-secretary.ts +208 -0
- package/src/ux-sim/mock-scenario-catalog.json +81 -26
- package/src/ux-sim/mock-scenario-catalog.ts +175 -5
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/release-sim-rig.ts +62 -18
- package/src/ux-sim/scenario.ts +70 -26
- package/src/ux-sim/service-key-setup.ts +113 -0
- package/src/ux-sim/term-slash-device.ts +74 -0
- package/src/ux-sim/turn-throw-sim.ts +31 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/index.ts +30 -9
- package/src/web-search/provider.ts +4 -1
- package/src/web-search/x-intent.ts +5 -0
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
- package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
- package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
|
@@ -7,15 +7,14 @@
|
|
|
7
7
|
// - server-originated request handling (server → client with id)
|
|
8
8
|
// - lifecycle (close · exit)
|
|
9
9
|
//
|
|
10
|
-
// Deliberately NOT wired into agent-manager yet — 3.B.2 is the arc
|
|
11
|
-
// that connects this client to `EmbodiedAgentSession` and flips the
|
|
12
|
-
// CodexApprovalAdapter from logOnly to real approval routing.
|
|
13
|
-
//
|
|
14
10
|
// The stream interface is abstract so tests can drive the client with
|
|
15
11
|
// synthetic Duplex streams. `spawnCodexAppServer()` is the production
|
|
16
|
-
// factory that shells out to `codex app-server
|
|
12
|
+
// factory that shells out to `codex app-server`; an explicit remoteSocketPath
|
|
13
|
+
// opts the ACP agent into the shadow side-tab socket without changing stdio defaults.
|
|
17
14
|
|
|
18
|
-
import { spawn as spawnChild, type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
15
|
+
import { spawn as spawnChild, type ChildProcess, type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
16
|
+
import { createConnection } from 'node:net';
|
|
17
|
+
import { PassThrough } from 'node:stream';
|
|
19
18
|
import { resolvePreferredCodexBinary } from './codex-auth.js';
|
|
20
19
|
import { createInterface, type Interface as ReadlineInterface } from 'node:readline';
|
|
21
20
|
import type { Readable, Writable } from 'node:stream';
|
|
@@ -444,6 +443,16 @@ export class CodexAppServerClient {
|
|
|
444
443
|
}
|
|
445
444
|
this.closed = true;
|
|
446
445
|
}
|
|
446
|
+
|
|
447
|
+
/** Reject only requests sent over a disconnected transport; the socket
|
|
448
|
+
* factory may reconnect, so the client itself remains usable. */
|
|
449
|
+
_markDisconnected(error: Error): void {
|
|
450
|
+
for (const entry of this.pending.values()) {
|
|
451
|
+
if (entry.timeoutHandle) clearTimeout(entry.timeoutHandle);
|
|
452
|
+
entry.reject(error);
|
|
453
|
+
}
|
|
454
|
+
this.pending.clear();
|
|
455
|
+
}
|
|
447
456
|
}
|
|
448
457
|
|
|
449
458
|
// ─── Factory · spawn real codex binary ──────────────────────────────
|
|
@@ -453,6 +462,8 @@ export interface SpawnCodexAppServerOpts {
|
|
|
453
462
|
codexBinary?: string;
|
|
454
463
|
/** Subcommand args · default `['app-server']`. */
|
|
455
464
|
codexArgs?: readonly string[];
|
|
465
|
+
/** Explicit opt-in endpoint for Codex remote side-tab mode. */
|
|
466
|
+
remoteSocketPath?: string;
|
|
456
467
|
/** Env vars merged onto current env · e.g. `CODEX_API_KEY`.
|
|
457
468
|
* ⛔⭐ 계약: 넘긴 값이 «이기고» 나머지 부모 env 는 «보존»된다. 그리고 이 병합은
|
|
458
469
|
* `process.env` 를 «안 바꾼다» — 계정별 쿼터 측정(`usage --account`)이 여기에 걸려 있다. */
|
|
@@ -470,6 +481,80 @@ export interface SpawnedCodexAppServer {
|
|
|
470
481
|
readonly child: ChildProcessWithoutNullStreams;
|
|
471
482
|
}
|
|
472
483
|
|
|
484
|
+
function createUnixSocketStreams(socketPath: string, onDisconnect: (error: Error) => void): {
|
|
485
|
+
stdin: PassThrough;
|
|
486
|
+
stdout: PassThrough;
|
|
487
|
+
} {
|
|
488
|
+
const stdin = new PassThrough();
|
|
489
|
+
const stdout = new PassThrough();
|
|
490
|
+
let closed = false;
|
|
491
|
+
let activeSocket: ReturnType<typeof createConnection> | undefined;
|
|
492
|
+
let activeSocketError: ((error: Error) => void) | undefined;
|
|
493
|
+
let activeSocketClose: (() => void) | undefined;
|
|
494
|
+
let reconnectTimer: ReturnType<typeof setTimeout> | undefined;
|
|
495
|
+
let connect: () => void = () => {};
|
|
496
|
+
const scheduleReconnect = (): void => {
|
|
497
|
+
if (closed || reconnectTimer) return;
|
|
498
|
+
reconnectTimer = setTimeout(() => {
|
|
499
|
+
reconnectTimer = undefined;
|
|
500
|
+
connect();
|
|
501
|
+
}, 100);
|
|
502
|
+
reconnectTimer.unref();
|
|
503
|
+
};
|
|
504
|
+
const retireSocket = (
|
|
505
|
+
socket: ReturnType<typeof createConnection>,
|
|
506
|
+
error: Error | undefined,
|
|
507
|
+
notifyClient: boolean,
|
|
508
|
+
): void => {
|
|
509
|
+
if (activeSocket !== socket) return;
|
|
510
|
+
activeSocket = undefined;
|
|
511
|
+
// A destroyed destination stays registered with PassThrough.pipe unless
|
|
512
|
+
// explicitly detached. Leaving it there makes the next request write to
|
|
513
|
+
// the dead socket as well as the replacement socket.
|
|
514
|
+
stdin.unpipe(socket);
|
|
515
|
+
socket.unpipe(stdout);
|
|
516
|
+
if (activeSocketError) socket.removeListener('error', activeSocketError);
|
|
517
|
+
if (activeSocketClose) socket.removeListener('close', activeSocketClose);
|
|
518
|
+
activeSocketError = undefined;
|
|
519
|
+
activeSocketClose = undefined;
|
|
520
|
+
socket.destroy();
|
|
521
|
+
if (notifyClient) onDisconnect(error ?? new Error('codex app-server socket disconnected'));
|
|
522
|
+
else scheduleReconnect(); // Initial late startup retries; reconnect after a live transport is deferred.
|
|
523
|
+
};
|
|
524
|
+
connect = (): void => {
|
|
525
|
+
if (closed) return;
|
|
526
|
+
const socket = createConnection(socketPath);
|
|
527
|
+
let didConnect = false;
|
|
528
|
+
activeSocket = socket;
|
|
529
|
+
const onSocketError = (error: Error): void => retireSocket(socket, error, didConnect);
|
|
530
|
+
const onSocketClose = (): void => retireSocket(socket, undefined, didConnect);
|
|
531
|
+
activeSocketError = onSocketError;
|
|
532
|
+
activeSocketClose = onSocketClose;
|
|
533
|
+
socket.on('error', onSocketError);
|
|
534
|
+
socket.once('close', onSocketClose);
|
|
535
|
+
socket.once('connect', () => {
|
|
536
|
+
if (closed || activeSocket !== socket) {
|
|
537
|
+
socket.destroy();
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
didConnect = true;
|
|
541
|
+
stdin.pipe(socket);
|
|
542
|
+
// Keep the client-facing readable open across reconnects.
|
|
543
|
+
socket.pipe(stdout, { end: false });
|
|
544
|
+
});
|
|
545
|
+
};
|
|
546
|
+
stdin.once('close', () => {
|
|
547
|
+
closed = true;
|
|
548
|
+
if (reconnectTimer) clearTimeout(reconnectTimer);
|
|
549
|
+
reconnectTimer = undefined;
|
|
550
|
+
if (activeSocket) retireSocket(activeSocket, undefined, false);
|
|
551
|
+
stdout.end();
|
|
552
|
+
});
|
|
553
|
+
connect();
|
|
554
|
+
return { stdin, stdout };
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
|
|
473
558
|
/** Build the argv for `codex app-server`, always FORCING codex's
|
|
474
559
|
* `code_mode_host` feature OFF.
|
|
475
560
|
*
|
|
@@ -493,11 +578,53 @@ export function buildCodexAppServerArgs(codexArgs?: readonly string[]): string[]
|
|
|
493
578
|
return args;
|
|
494
579
|
}
|
|
495
580
|
|
|
496
|
-
/**
|
|
497
|
-
*
|
|
498
|
-
*
|
|
499
|
-
|
|
500
|
-
|
|
581
|
+
/** Build both command lines for the opt-in Codex remote shadow surface.
|
|
582
|
+
* The default app-server factory remains stdio-backed; callers must
|
|
583
|
+
* explicitly select these arguments to expose a Unix-domain endpoint. */
|
|
584
|
+
export function buildCodexRemoteSideTabArgs(socketPath: string): {
|
|
585
|
+
appServerArgs: string[];
|
|
586
|
+
remoteTuiArgs: string[];
|
|
587
|
+
} {
|
|
588
|
+
if (!socketPath.trim()) throw new Error('socket path is required');
|
|
589
|
+
const endpoint = `unix://${socketPath}`;
|
|
590
|
+
return {
|
|
591
|
+
appServerArgs: ['app-server', '--listen', endpoint, '-c', 'features.code_mode_host=false'],
|
|
592
|
+
remoteTuiArgs: ['--remote', endpoint],
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/** Spawn options for the shadow mode; absent socketPath preserves stdio. */
|
|
597
|
+
export function buildCodexAppServerSpawnArgs(opts: {
|
|
598
|
+
codexArgs?: readonly string[];
|
|
599
|
+
remoteSocketPath?: string;
|
|
600
|
+
}): string[] {
|
|
601
|
+
const args = buildCodexAppServerArgs(opts.codexArgs);
|
|
602
|
+
if (!opts.remoteSocketPath) return args;
|
|
603
|
+
if (args.some((arg) => arg === '--listen' || arg.startsWith('--listen='))) {
|
|
604
|
+
throw new Error('remote socket path conflicts with codexArgs --listen');
|
|
605
|
+
}
|
|
606
|
+
const endpoint = `unix://${opts.remoteSocketPath}`;
|
|
607
|
+
return [...args.slice(0, -2), '--listen', endpoint, ...args.slice(-2)];
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
export function spawnCodexRemoteTui(opts: {
|
|
611
|
+
codexBinary: string;
|
|
612
|
+
socketPath: string;
|
|
613
|
+
cwd?: string;
|
|
614
|
+
env?: Record<string, string>;
|
|
615
|
+
spawnImpl?: typeof spawnChild;
|
|
616
|
+
}): ChildProcess {
|
|
617
|
+
const spawnFn = opts.spawnImpl ?? spawnChild;
|
|
618
|
+
return spawnFn(opts.codexBinary, buildCodexRemoteSideTabArgs(opts.socketPath).remoteTuiArgs, {
|
|
619
|
+
cwd: opts.cwd,
|
|
620
|
+
env: { ...process.env, ...(opts.env ?? {}) },
|
|
621
|
+
stdio: 'inherit',
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/** Spawn the `codex app-server` binary and wrap its stdio or explicit
|
|
626
|
+
* Unix-socket connection in a client. The ACP agent manager selects the
|
|
627
|
+
* socket form only when the Codex remote side-tab opt-in is configured. */
|
|
501
628
|
export function spawnCodexAppServer(
|
|
502
629
|
opts: SpawnCodexAppServerOpts = {},
|
|
503
630
|
): SpawnedCodexAppServer {
|
|
@@ -507,7 +634,10 @@ export function spawnCodexAppServer(
|
|
|
507
634
|
// models ("requires a newer version of Codex"). See
|
|
508
635
|
// resolvePreferredCodexBinary.
|
|
509
636
|
const binary = opts.codexBinary ?? resolvePreferredCodexBinary();
|
|
510
|
-
const args =
|
|
637
|
+
const args = buildCodexAppServerSpawnArgs({
|
|
638
|
+
codexArgs: opts.codexArgs,
|
|
639
|
+
remoteSocketPath: opts.remoteSocketPath,
|
|
640
|
+
});
|
|
511
641
|
// ⛔⭐ 테스트 심 — env 병합 «계약»(넘긴 값이 이기고 나머지 부모 env 는 보존)을 무는 유일한 방법이다.
|
|
512
642
|
// 계정별 쿼터 측정이 이 병합에 걸려 있고, 여기가 틀리면 「B 를 재려다 A 를 잰다」가 된다.
|
|
513
643
|
const spawnFn = opts.spawnImpl ?? spawnChild;
|
|
@@ -516,9 +646,16 @@ export function spawnCodexAppServer(
|
|
|
516
646
|
env: { ...process.env, ...(opts.env ?? {}) },
|
|
517
647
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
518
648
|
});
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
649
|
+
// Remote mode speaks over the Unix socket, leaving the app-server child's
|
|
650
|
+
// stdout disconnected. Drain it so a verbose child cannot fill the pipe.
|
|
651
|
+
if (opts.remoteSocketPath) child.stdout.resume();
|
|
652
|
+
let client: CodexAppServerClient | undefined;
|
|
653
|
+
const socketStreams = opts.remoteSocketPath
|
|
654
|
+
? createUnixSocketStreams(opts.remoteSocketPath, (error) => client?._markDisconnected(error))
|
|
655
|
+
: undefined;
|
|
656
|
+
client = new CodexAppServerClient({
|
|
657
|
+
stdin: socketStreams?.stdin ?? child.stdin,
|
|
658
|
+
stdout: socketStreams?.stdout ?? child.stdout,
|
|
522
659
|
stderr: child.stderr,
|
|
523
660
|
requestTimeoutMs: opts.requestTimeoutMs,
|
|
524
661
|
});
|
|
@@ -537,5 +674,5 @@ export function spawnCodexAppServer(
|
|
|
537
674
|
}
|
|
538
675
|
}
|
|
539
676
|
});
|
|
540
|
-
return { client
|
|
677
|
+
return { client: client!, child };
|
|
541
678
|
}
|
|
@@ -57,6 +57,8 @@ import { isFactQuestion } from './fact-question.js';
|
|
|
57
57
|
import { resolveSessionSurfaceProfile } from '../session-runtime/index.js';
|
|
58
58
|
import { classifyTuiChatIntent, formatTuiRouteLine, isSeatOpsDirective, type TuiChatRoute } from '../core-turn/short-question.js';
|
|
59
59
|
import { HARNESS_ROLE_ENV } from '../harness/harness-space.js';
|
|
60
|
+
import { RESEARCH_TOOL_ALLOWLIST, RESEARCH_TURN_MAX_TOOL_TURNS } from '../core-turn/research-policy.js';
|
|
61
|
+
import { isResearchAgentIntent } from '../tool-hints/signals.js';
|
|
60
62
|
import { createReasoningThoughtBuffer } from './reasoning-thought-buffer.js';
|
|
61
63
|
import {
|
|
62
64
|
REQUEST_SIZE_MAX_CHARS,
|
|
@@ -78,7 +80,7 @@ const QUICK_TOOLS: Record<QuickTuiRoute, readonly string[]> = {
|
|
|
78
80
|
'조회': ['decisions_pending', 'ops_seats', 'ops_status', 'release_status', 'logs_query', 'context_now', 'memory_recall', 'Read'],
|
|
79
81
|
'설정 변경': ['DashboardConfigGet', 'DashboardConfigSet', 'LlmListAvailableModels', 'prompt_getRuntimeConfig', 'prompt_setRuntimeConfig', 'view_getConfig', 'view_applyRuntimeConfig', 'view_saveConfig', 'memory_recall'],
|
|
80
82
|
// MsgList is a read-only ledger listing (never acks); MsgPost · MsgAck · RunShell · Bash stay out (TUI-QUICK-ROUTE-EXPLICIT-CMD).
|
|
81
|
-
'조사':
|
|
83
|
+
'조사': RESEARCH_TOOL_ALLOWLIST,
|
|
82
84
|
// ScheduleWakeup (H5) wakes this TUI in-process; schedule_manage is OS cron — both belong to «상시 일».
|
|
83
85
|
'상시 일': ['schedule_manage', 'schedule_list', 'schedule_create', 'schedule_update', 'ScheduleWakeup', 'session_manage', 'ops_status', 'memory_recall'],
|
|
84
86
|
};
|
|
@@ -329,6 +331,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
329
331
|
// (10-14 13:48 운영 TUI OP: route short-question·goalLoop ⊕ factQuestion → 소진 뒤 헛호출 7회).
|
|
330
332
|
const surfaceProfile = resolveSessionSurfaceProfile({ userText: turnCtx.userText });
|
|
331
333
|
const factShaped = isFactQuestion(turnCtx.userText);
|
|
334
|
+
const researchTurn = isResearchAgentIntent(turnCtx.userText);
|
|
332
335
|
// A quick research/turn lookup still keeps the fact budget. Only the
|
|
333
336
|
// multi-source research/agent route needs enough rounds to compare axes.
|
|
334
337
|
const factQuestion = factShaped && !armGoalLoop && surfaceProfile.id !== 'research/agent';
|
|
@@ -337,7 +340,12 @@ export function bridgeCoreTurnToAcp(
|
|
|
337
340
|
catch { /* observation cannot interrupt a turn */ }
|
|
338
341
|
}
|
|
339
342
|
const explicitMaxToolTurns = deps.resolveMaxToolTurns?.({ sessionId: turnCtx.sessionId });
|
|
340
|
-
const
|
|
343
|
+
const resolvedMaxToolTurns = explicitMaxToolTurns ?? (factQuestion
|
|
344
|
+
? getUserConfig().chat.factQuestion.maxToolTurns
|
|
345
|
+
: researchTurn ? RESEARCH_TURN_MAX_TOOL_TURNS : undefined);
|
|
346
|
+
const maxToolTurns = researchTurn && resolvedMaxToolTurns !== undefined
|
|
347
|
+
? Math.min(resolvedMaxToolTurns, RESEARCH_TURN_MAX_TOOL_TURNS)
|
|
348
|
+
: resolvedMaxToolTurns;
|
|
341
349
|
const withFactInstruction = (seed: LLMMessage[]): LLMMessage[] => factQuestion
|
|
342
350
|
? [{ role: 'system', content: FACT_QUESTION_INSTRUCTION }, ...seed]
|
|
343
351
|
: seed;
|
|
@@ -552,9 +560,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
552
560
|
onReplaceText: (full) => {
|
|
553
561
|
reasoningThoughts.flush();
|
|
554
562
|
streamedTextSum = full;
|
|
555
|
-
|
|
556
|
-
void turnCtx.push('');
|
|
557
|
-
void turnCtx.push(full);
|
|
563
|
+
void turnCtx.pushWithMeta(full, { elanous: { textOperation: 'replace' } });
|
|
558
564
|
},
|
|
559
565
|
// P2-bridge-ext — forward tool + usage events as ACP
|
|
560
566
|
// sessionUpdate notifications so extension-aware clients
|
|
@@ -725,14 +731,13 @@ export function bridgeCoreTurnToAcp(
|
|
|
725
731
|
}
|
|
726
732
|
} else if (originalFinalStreamed) {
|
|
727
733
|
void turnCtx.push(followupSuffix);
|
|
734
|
+
} else if (needsReSurface && needsFollowup) {
|
|
735
|
+
// A budget follow-up is an explicit replacement of the last assistant answer,
|
|
736
|
+
// not the legacy forced-synthesis boundary used by ordinary final answers.
|
|
737
|
+
void turnCtx.pushWithMeta(visibleFinalText!, { elanous: { textOperation: 'replace' } });
|
|
728
738
|
} else if (needsReSurface) {
|
|
729
|
-
//
|
|
730
|
-
//
|
|
731
|
-
// chat) reset their per-round buffer before receiving
|
|
732
|
-
// the substantive answer. The empty signal does nothing
|
|
733
|
-
// for clients that just append (web / iphone — they
|
|
734
|
-
// would only have the new finalAssistantText delta to
|
|
735
|
-
// work with anyway).
|
|
739
|
+
// Forced synthesis without a validation supplement retains the legacy clear+final
|
|
740
|
+
// boundary. Clients that treat an empty chunk as a round reset rely on this pair.
|
|
736
741
|
void turnCtx.push('');
|
|
737
742
|
void turnCtx.push(visibleFinalText!);
|
|
738
743
|
}
|
package/src/acp/event-router.ts
CHANGED
|
@@ -42,7 +42,7 @@ export interface AcpSessionUpdate {
|
|
|
42
42
|
title?: string;
|
|
43
43
|
toolCallId?: string;
|
|
44
44
|
status?: string;
|
|
45
|
-
_meta?: { reasoning?: unknown };
|
|
45
|
+
_meta?: { reasoning?: unknown; elanous?: { textOperation?: unknown } };
|
|
46
46
|
/** Plan event 가 ref 를 직접 들고 오는 경우 (현재 ACP spec 에 없으면
|
|
47
47
|
* router 가 turn-기반 fallback ref 사용). */
|
|
48
48
|
planId?: string;
|
|
@@ -100,6 +100,9 @@ interface SessionState {
|
|
|
100
100
|
* body.text 를 update 로 누적. */
|
|
101
101
|
activeAssistantBlockId: string | null;
|
|
102
102
|
activeAssistantText: string;
|
|
103
|
+
/** Last assistant block for this turn, retained across thought/tool delimiters
|
|
104
|
+
* so an authoritative synthesis can replace a provisional answer. */
|
|
105
|
+
replaceableAssistantBlockId: string | null;
|
|
103
106
|
/** Same shape for thought chunks. */
|
|
104
107
|
activeThoughtBlockId: string | null;
|
|
105
108
|
activeThoughtText: string;
|
|
@@ -112,6 +115,7 @@ function freshSessionState(): SessionState {
|
|
|
112
115
|
sysSeq: 0,
|
|
113
116
|
activeAssistantBlockId: null,
|
|
114
117
|
activeAssistantText: '',
|
|
118
|
+
replaceableAssistantBlockId: null,
|
|
115
119
|
activeThoughtBlockId: null,
|
|
116
120
|
activeThoughtText: '',
|
|
117
121
|
};
|
|
@@ -168,6 +172,7 @@ export function createAcpEventRouter(): AcpEventRouter {
|
|
|
168
172
|
flushActiveThought(state);
|
|
169
173
|
state.turnSeq += 1;
|
|
170
174
|
state.blockSeq = 0;
|
|
175
|
+
state.replaceableAssistantBlockId = null;
|
|
171
176
|
const id = makeUserTurnBlockId(sessionId, state.turnSeq, state.blockSeq);
|
|
172
177
|
const block: MessageBlock = {
|
|
173
178
|
id,
|
|
@@ -199,6 +204,19 @@ export function createAcpEventRouter(): AcpEventRouter {
|
|
|
199
204
|
case 'agent_message_chunk': {
|
|
200
205
|
const c = u.content;
|
|
201
206
|
if (c?.type !== 'text' || typeof c.text !== 'string') return;
|
|
207
|
+
const isReplace = u._meta?.elanous?.textOperation === 'replace';
|
|
208
|
+
const replaceTargetId = state.activeAssistantBlockId ?? state.replaceableAssistantBlockId;
|
|
209
|
+
if (isReplace && replaceTargetId !== null) {
|
|
210
|
+
flushActiveThought(state);
|
|
211
|
+
state.activeAssistantText = c.text;
|
|
212
|
+
const id = replaceTargetId;
|
|
213
|
+
stream.update(id, (cur) => ({
|
|
214
|
+
...cur,
|
|
215
|
+
body: { ...cur.body, text: c.text } as MessageBlock['body'],
|
|
216
|
+
}));
|
|
217
|
+
state.activeAssistantBlockId = id;
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
202
220
|
if (state.activeAssistantBlockId === null) {
|
|
203
221
|
// New assistant block — close any active thought first so
|
|
204
222
|
// append/update events stay temporally ordered for
|
|
@@ -211,6 +229,7 @@ export function createAcpEventRouter(): AcpEventRouter {
|
|
|
211
229
|
state.blockSeq,
|
|
212
230
|
);
|
|
213
231
|
state.activeAssistantBlockId = id;
|
|
232
|
+
state.replaceableAssistantBlockId = id;
|
|
214
233
|
state.activeAssistantText = c.text;
|
|
215
234
|
stream.push({
|
|
216
235
|
id,
|
package/src/acp/server.ts
CHANGED
|
@@ -1679,6 +1679,12 @@ function wireAcpConnection(
|
|
|
1679
1679
|
content: { type: 'text', text: chunk },
|
|
1680
1680
|
};
|
|
1681
1681
|
if (_meta) update._meta = _meta;
|
|
1682
|
+
const elanousMeta = _meta?.elanous;
|
|
1683
|
+
if (elanousMeta && typeof elanousMeta === 'object' && !Array.isArray(elanousMeta)
|
|
1684
|
+
&& (elanousMeta as Record<string, unknown>).textOperation === 'replace') {
|
|
1685
|
+
aggregatorAgentText = chunk;
|
|
1686
|
+
try { c5dProducer?.replaceText(chunk); } catch { /* fail-soft */ }
|
|
1687
|
+
}
|
|
1682
1688
|
await broadcast(
|
|
1683
1689
|
req.sessionId,
|
|
1684
1690
|
update as Parameters<typeof broadcast>[1],
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ToolRuntimeContext } from '../tool-runtime/types.js';
|
|
2
|
+
import type { BrowserHandArgs, BrowserHandDeps, BrowserHandResult } from '../tool-runtime/browser-hand-runtime.js';
|
|
3
|
+
|
|
4
|
+
export type BrowserHandRunner = (args: BrowserHandArgs, ctx?: ToolRuntimeContext, deps?: BrowserHandDeps) => Promise<BrowserHandResult>;
|
|
5
|
+
|
|
6
|
+
export interface HumanBrowserSelection {
|
|
7
|
+
/** Linear subtask chosen by the person for this browser roundtrip. */
|
|
8
|
+
linearSubtaskId: string;
|
|
9
|
+
/** Whether the person also chose page content to reflect in that subtask. */
|
|
10
|
+
includeThisToo?: boolean;
|
|
11
|
+
/** Optional text/tab the person explicitly selected to reflect in that subtask. */
|
|
12
|
+
selection?: { text?: string; tab?: string };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface BrowserRoundtripRequest extends Omit<BrowserHandArgs, 'linearSubtaskId' | 'selection' | 'includeThisToo'> {
|
|
16
|
+
includeThisToo?: boolean;
|
|
17
|
+
humanSelection?: HumanBrowserSelection;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface BrowserRoundtripResult {
|
|
21
|
+
scene: 'browser-roundtrip';
|
|
22
|
+
selectedSubtaskId: string | null;
|
|
23
|
+
sourceUrl: string;
|
|
24
|
+
result: BrowserHandResult;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Coordinates the demo's human-selected browser handoff through the production
|
|
29
|
+
* BrowserHand safety path. BrowserHand owns approval, host checks, one safe
|
|
30
|
+
* alternate-source attempt, capture, and the optional Linear reflection.
|
|
31
|
+
*/
|
|
32
|
+
export async function coordinateBrowserRoundtrip(
|
|
33
|
+
request: BrowserRoundtripRequest,
|
|
34
|
+
deps: BrowserHandDeps,
|
|
35
|
+
runBrowserHand: BrowserHandRunner,
|
|
36
|
+
ctx?: ToolRuntimeContext,
|
|
37
|
+
): Promise<BrowserRoundtripResult> {
|
|
38
|
+
const selection = request.humanSelection;
|
|
39
|
+
if (!selection) {
|
|
40
|
+
return {
|
|
41
|
+
scene: 'browser-roundtrip',
|
|
42
|
+
selectedSubtaskId: null,
|
|
43
|
+
sourceUrl: request.url,
|
|
44
|
+
result: {
|
|
45
|
+
ok: false,
|
|
46
|
+
reason: 'human-selection-required',
|
|
47
|
+
output: '사람이 Linear 서브태스크를 선택해야 브라우저 왕복을 시작합니다.',
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const selectedSubtaskId = selection.linearSubtaskId.trim();
|
|
53
|
+
if (!selectedSubtaskId) {
|
|
54
|
+
return {
|
|
55
|
+
scene: 'browser-roundtrip',
|
|
56
|
+
selectedSubtaskId: null,
|
|
57
|
+
sourceUrl: request.url,
|
|
58
|
+
result: {
|
|
59
|
+
ok: false,
|
|
60
|
+
reason: 'invalid-input',
|
|
61
|
+
output: 'Linear 서브태스크 UUID가 필요합니다.',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const args: BrowserHandArgs = {
|
|
66
|
+
url: request.url,
|
|
67
|
+
target: request.target,
|
|
68
|
+
armed: request.armed,
|
|
69
|
+
linearSubtaskId: selectedSubtaskId,
|
|
70
|
+
...(request.persona ? { persona: request.persona } : {}),
|
|
71
|
+
...(request.alternateUrl ? { alternateUrl: request.alternateUrl } : {}),
|
|
72
|
+
...(request.includeThisToo !== undefined
|
|
73
|
+
? { includeThisToo: request.includeThisToo }
|
|
74
|
+
: selection.includeThisToo !== undefined ? { includeThisToo: selection.includeThisToo } : {}),
|
|
75
|
+
// Empty selection objects mean that no page text/tab was chosen; only explicit content is forwarded.
|
|
76
|
+
...(selection.selection ? { selection: selection.selection } : {}),
|
|
77
|
+
};
|
|
78
|
+
const result = await runBrowserHand(args, ctx, deps);
|
|
79
|
+
return {
|
|
80
|
+
scene: 'browser-roundtrip',
|
|
81
|
+
selectedSubtaskId,
|
|
82
|
+
sourceUrl: result.repairNode?.detourUrl || request.url,
|
|
83
|
+
result,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -30,10 +30,11 @@ const string = (value: unknown): string | null => typeof value === 'string' ? va
|
|
|
30
30
|
const number = (value: unknown): number | null => typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
31
31
|
|
|
32
32
|
/** Run the non-interactive Claude CLI with a pipe, never passing the prompt as an argv value. */
|
|
33
|
-
export async function runClaudeHeadless({ cwd, prompt, env, spawn = nodeSpawn, timeoutMs = 1_800_000, maxTurns, onSpawn }: {
|
|
33
|
+
export async function runClaudeHeadless({ cwd, prompt, env, resumeSessionId, spawn = nodeSpawn, timeoutMs = 1_800_000, maxTurns, onSpawn }: {
|
|
34
34
|
cwd: string;
|
|
35
35
|
prompt: string;
|
|
36
36
|
env: NodeJS.ProcessEnv;
|
|
37
|
+
resumeSessionId?: string;
|
|
37
38
|
spawn?: Spawn;
|
|
38
39
|
timeoutMs?: number;
|
|
39
40
|
maxTurns?: number;
|
|
@@ -42,6 +43,7 @@ export async function runClaudeHeadless({ cwd, prompt, env, spawn = nodeSpawn, t
|
|
|
42
43
|
if (maxTurns !== undefined && (!Number.isSafeInteger(maxTurns) || maxTurns < 1)) {
|
|
43
44
|
throw new Error('Claude headless maxTurns must be a positive integer');
|
|
44
45
|
}
|
|
46
|
+
if (resumeSessionId !== undefined && !resumeSessionId.trim()) throw new Error('Claude resume session id must not be empty');
|
|
45
47
|
let child: ChildProcessWithoutNullStreams;
|
|
46
48
|
const base: ClaudeHeadlessResult = {
|
|
47
49
|
ok: false, reason: 'no-result', exitCode: null, result: null, subtype: null,
|
|
@@ -51,6 +53,7 @@ export async function runClaudeHeadless({ cwd, prompt, env, spawn = nodeSpawn, t
|
|
|
51
53
|
try {
|
|
52
54
|
child = spawn('claude', [
|
|
53
55
|
'-p', '--output-format', 'stream-json', '--verbose', '--dangerously-skip-permissions',
|
|
56
|
+
...(resumeSessionId === undefined ? [] : ['--resume', resumeSessionId]),
|
|
54
57
|
...(maxTurns === undefined ? [] : ['--max-turns', String(maxTurns)]),
|
|
55
58
|
], { cwd, env, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
56
59
|
} catch {
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { spawn as nodeSpawn, type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
2
|
+
|
|
3
|
+
export type CodexExecResult = {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
reason: 'success' | 'no-session' | 'no-result' | 'cli-error' | 'timeout' | 'spawn-error';
|
|
6
|
+
exitCode: number | null;
|
|
7
|
+
sessionId: string | null;
|
|
8
|
+
result: string | null;
|
|
9
|
+
numTurns: number;
|
|
10
|
+
malformedLines: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type Spawn = (command: string, args: string[], options: {
|
|
14
|
+
cwd: string;
|
|
15
|
+
env: NodeJS.ProcessEnv;
|
|
16
|
+
stdio: ['pipe', 'pipe', 'pipe'];
|
|
17
|
+
}) => ChildProcessWithoutNullStreams;
|
|
18
|
+
|
|
19
|
+
type JsonObject = Record<string, unknown>;
|
|
20
|
+
const object = (value: unknown): value is JsonObject => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
21
|
+
|
|
22
|
+
/** Run one non-interactive Codex exec turn, optionally resuming the exact thread from a prior turn. */
|
|
23
|
+
export async function runCodexExec({ cwd, prompt, env, resumeSessionId, spawn = nodeSpawn, timeoutMs = 1_800_000, onSpawn }: {
|
|
24
|
+
cwd: string;
|
|
25
|
+
prompt: string;
|
|
26
|
+
env: NodeJS.ProcessEnv;
|
|
27
|
+
resumeSessionId?: string;
|
|
28
|
+
spawn?: Spawn;
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
onSpawn?: (pid: number, kill: () => void) => void;
|
|
31
|
+
}): Promise<CodexExecResult> {
|
|
32
|
+
if (resumeSessionId !== undefined && !resumeSessionId.trim()) throw new Error('Codex resume session id must not be empty');
|
|
33
|
+
const args = resumeSessionId === undefined
|
|
34
|
+
? ['exec', '--json', '--approve-for-me', '-']
|
|
35
|
+
: ['exec', 'resume', '--json', '-c', 'sandbox_mode="workspace-write"', '-c', 'approval_policy="never"', resumeSessionId, '-'];
|
|
36
|
+
const base: CodexExecResult = {
|
|
37
|
+
ok: false, reason: 'no-result', exitCode: null, sessionId: null, result: null, numTurns: 0, malformedLines: 0,
|
|
38
|
+
};
|
|
39
|
+
let child: ChildProcessWithoutNullStreams;
|
|
40
|
+
try { child = spawn('codex', args, { cwd, env, stdio: ['pipe', 'pipe', 'pipe'] }); }
|
|
41
|
+
catch { return { ...base, reason: 'spawn-error' }; }
|
|
42
|
+
if (typeof child.pid === 'number' && child.pid > 0) onSpawn?.(child.pid, () => { try { child.kill(); } catch { /* Already exited. */ } });
|
|
43
|
+
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
const state = { ...base };
|
|
46
|
+
let pending = '';
|
|
47
|
+
let sawCompletedTurn = false;
|
|
48
|
+
let failedTurn = false;
|
|
49
|
+
let timedOut = false;
|
|
50
|
+
let spawnError = false;
|
|
51
|
+
let settled = false;
|
|
52
|
+
const parseLine = (line: string): void => {
|
|
53
|
+
if (!line.trim()) return;
|
|
54
|
+
let event: unknown;
|
|
55
|
+
try { event = JSON.parse(line); }
|
|
56
|
+
catch { state.malformedLines++; return; }
|
|
57
|
+
if (!object(event) || typeof event.type !== 'string') { state.malformedLines++; return; }
|
|
58
|
+
if (event.type === 'thread.started' && typeof event.thread_id === 'string') state.sessionId = event.thread_id;
|
|
59
|
+
else if (event.type === 'item.completed' && object(event.item) && event.item.type === 'agent_message' && typeof event.item.text === 'string') {
|
|
60
|
+
state.result = event.item.text;
|
|
61
|
+
} else if (event.type === 'turn.completed') {
|
|
62
|
+
sawCompletedTurn = true;
|
|
63
|
+
state.numTurns++;
|
|
64
|
+
} else if (event.type === 'turn.failed') failedTurn = true;
|
|
65
|
+
};
|
|
66
|
+
const finish = (exitCode: number | null): void => {
|
|
67
|
+
if (settled) return;
|
|
68
|
+
settled = true;
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
child.stdout.off('data', onData);
|
|
71
|
+
const finalLine = pending;
|
|
72
|
+
pending = '';
|
|
73
|
+
parseLine(finalLine);
|
|
74
|
+
state.exitCode = exitCode;
|
|
75
|
+
state.reason = timedOut ? 'timeout' : spawnError ? 'spawn-error'
|
|
76
|
+
: exitCode !== 0 || failedTurn ? 'cli-error'
|
|
77
|
+
: !sawCompletedTurn || !state.result ? 'no-result'
|
|
78
|
+
: !state.sessionId ? 'no-session' : 'success';
|
|
79
|
+
state.ok = state.reason === 'success';
|
|
80
|
+
resolve(state);
|
|
81
|
+
};
|
|
82
|
+
const timer = setTimeout(() => {
|
|
83
|
+
timedOut = true;
|
|
84
|
+
try { child.kill('SIGKILL'); } catch { /* Report timeout even when the process cannot be killed. */ }
|
|
85
|
+
finish(null);
|
|
86
|
+
}, timeoutMs);
|
|
87
|
+
child.stdout.setEncoding('utf8');
|
|
88
|
+
const onData = (chunk: string): void => {
|
|
89
|
+
if (settled) return;
|
|
90
|
+
pending += chunk;
|
|
91
|
+
let end: number;
|
|
92
|
+
while ((end = pending.indexOf('\n')) !== -1) {
|
|
93
|
+
parseLine(pending.slice(0, end));
|
|
94
|
+
pending = pending.slice(end + 1);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
child.stdout.on('data', onData);
|
|
98
|
+
child.stderr.resume();
|
|
99
|
+
child.on('error', () => { spawnError = true; finish(null); });
|
|
100
|
+
child.on('close', (code) => finish(code));
|
|
101
|
+
child.stdin.on('error', () => { /* A child that exits before reading stdin is classified on close. */ });
|
|
102
|
+
try { child.stdin.end(prompt); }
|
|
103
|
+
catch { spawnError = true; try { child.kill('SIGKILL'); } catch { /* Already exited. */ } finish(null); }
|
|
104
|
+
});
|
|
105
|
+
}
|