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
|
@@ -39,6 +39,18 @@ function readInstalledLockHash(repoDir: string): string | null {
|
|
|
39
39
|
} catch { return null; }
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
function pathIsAbsent(path: string): boolean {
|
|
43
|
+
try { lstatSync(path); return false; }
|
|
44
|
+
catch (error) { return (error as NodeJS.ErrnoException).code === 'ENOENT'; }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function isRealDirectory(path: string): boolean {
|
|
48
|
+
try {
|
|
49
|
+
const stat = lstatSync(path);
|
|
50
|
+
return stat.isDirectory() && !stat.isSymbolicLink();
|
|
51
|
+
} catch { return false; }
|
|
52
|
+
}
|
|
53
|
+
|
|
42
54
|
/** Record the image's installed dependency lock once source verification ties it to the worker key. */
|
|
43
55
|
function rememberInstalledLockHash(repoDir: string, lockHash: string): void {
|
|
44
56
|
try {
|
|
@@ -261,7 +273,35 @@ export class WarmWorkerRuntime {
|
|
|
261
273
|
}, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
|
|
262
274
|
return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
|
|
263
275
|
}
|
|
264
|
-
|
|
276
|
+
try {
|
|
277
|
+
(this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true, force: true })))(this.options.scratchDir);
|
|
278
|
+
// A successful rm call is not proof of cleanup: a stub can be a no-op, and an
|
|
279
|
+
// attacker can replace the path with a symlink before the next mkdir.
|
|
280
|
+
if (!pathIsAbsent(this.options.scratchDir)) throw new Error('scratch path remains after removal');
|
|
281
|
+
} catch {
|
|
282
|
+
this.quarantined = true;
|
|
283
|
+
try { debug.log('pod.reuse', 'clean-failed', {
|
|
284
|
+
runId: command.runId, attemptId: command.attemptId, workerId: command.workerId,
|
|
285
|
+
// The worker outcome stays cleanup-failed for callers; this event reason identifies the scratch phase.
|
|
286
|
+
// Include only a path that lstat can still observe; a failed rm may also have removed it.
|
|
287
|
+
reason: 'scratch-removal-failed',
|
|
288
|
+
remainingPaths: pathIsAbsent(this.options.scratchDir) ? [] : [this.options.scratchDir],
|
|
289
|
+
}, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
|
|
290
|
+
return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
// Non-recursive mkdir refuses a path that was recreated (for example as a
|
|
294
|
+
// symlink) after the absence check. Validate the resulting path type as well.
|
|
295
|
+
mkdirSync(this.options.scratchDir);
|
|
296
|
+
if (!isRealDirectory(this.options.scratchDir)) throw new Error('scratch path is not a real directory');
|
|
297
|
+
} catch {
|
|
298
|
+
this.quarantined = true;
|
|
299
|
+
try { debug.log('pod.reuse', 'clean-failed', {
|
|
300
|
+
runId: command.runId, attemptId: command.attemptId, workerId: command.workerId,
|
|
301
|
+
reason: 'scratch-directory-unsafe', remainingPaths: [this.options.scratchDir],
|
|
302
|
+
}, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
|
|
303
|
+
return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
|
|
304
|
+
}
|
|
265
305
|
mkdirSync(artifactsRoot, { recursive: true });
|
|
266
306
|
mkdirSync(artifactsDir, { recursive: true, mode: 0o700 });
|
|
267
307
|
const startedAt = now();
|
|
@@ -304,8 +344,10 @@ export class WarmWorkerRuntime {
|
|
|
304
344
|
reason = 'execution-error';
|
|
305
345
|
break;
|
|
306
346
|
} finally {
|
|
307
|
-
try {
|
|
308
|
-
|
|
347
|
+
try {
|
|
348
|
+
(this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true, force: true })))(sandbox);
|
|
349
|
+
if (!pathIsAbsent(sandbox)) throw new Error('request sandbox remains after removal');
|
|
350
|
+
} catch { this.quarantined = true; reason = 'cleanup-failed'; }
|
|
309
351
|
}
|
|
310
352
|
if (now() >= command.deadlineAt) reason = 'execution-error';
|
|
311
353
|
if (reason !== 'complete') break;
|
|
@@ -22,7 +22,7 @@ import { isVerifiedOpenGatewayModel } from '../../llm/opengateway-models.js';
|
|
|
22
22
|
import { configuredOpenGatewayKeys } from '../../llm/provider-credentials.js';
|
|
23
23
|
import { collectPodLedgers, createPodLedgerFollower } from './pod-ledger-collect.js';
|
|
24
24
|
import { captureFailedPodJobs } from './pod-ledger-events.js';
|
|
25
|
-
import { collectPodArtifacts, podNoResultDiagnostic, POD_SALVAGE_BUNDLE_FILE_LIMIT, POD_SALVAGE_BUNDLE_TOTAL_LIMIT } from './pod-artifact-return.js';
|
|
25
|
+
import { collectPodArtifacts, podNoResultChildError, podNoResultDiagnostic, POD_SALVAGE_BUNDLE_FILE_LIMIT, POD_SALVAGE_BUNDLE_TOTAL_LIMIT } from './pod-artifact-return.js';
|
|
26
26
|
import { readPodRepairArtifact } from './pod-repair-commit.js';
|
|
27
27
|
import { isValidAccountName, resolveCodexAccount } from '../../oauth/codex-account.js';
|
|
28
28
|
import { createCodexAccessMirror } from '../../oauth/codex-access-mirror.js';
|
|
@@ -32,6 +32,7 @@ import { finishPodFragment, writePodFragment } from '../../harness/self-send-tar
|
|
|
32
32
|
import { mintRunId, normalizeRunId } from '../../harness/harness-space.js';
|
|
33
33
|
import { TA_LAND_ENV } from '../../task-agent/task-hand.js';
|
|
34
34
|
import { appendRunLedgerEntry, loadRunLedger, runLedgerDir, runLedgerPath, type RunLedgerEntry } from '../../self-implement/run-ledger.js';
|
|
35
|
+
import { childFirstLlmFact, childFirstLlmReportFact } from '../../llm/child-first-llm-observation.js';
|
|
35
36
|
import { recordRunStop } from '../../self-implement/run-stop.js';
|
|
36
37
|
import { gateFailureReceipt, gateFailureReceiptLines } from '../../self-implement/gate-failure-signature.js';
|
|
37
38
|
import { runSuffixKey } from '../../self-implement/salvage-branches.js';
|
|
@@ -148,6 +149,19 @@ import { findGitDir } from '../../git-fs/locate.js';
|
|
|
148
149
|
import { hostLeaseBaseDir } from '../../pod-lease/host-lease.js';
|
|
149
150
|
import { acquireLockAsync } from '../../storage/file-lock.js';
|
|
150
151
|
import { debug, redactSecretText } from '../../debug/log.js';
|
|
152
|
+
|
|
153
|
+
function readPodChildFirstLlmFact(runId: string, ledgerDir: string, report = false) {
|
|
154
|
+
try {
|
|
155
|
+
const entries = loadRunLedger(runId, ledgerDir) ?? [];
|
|
156
|
+
return report ? childFirstLlmReportFact(entries) : childFirstLlmFact(entries);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
debug.log('self-implement.pod', 'child-first-llm-ledger-unavailable', {
|
|
159
|
+
childRunId: runId,
|
|
160
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
161
|
+
}, { level: 'warn' });
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
151
165
|
import { enterJourneyNode, exitJourneyNode, passJourneyNode } from '../../self-dev/graph-journey-nodes.js';
|
|
152
166
|
import { routeJourneyEdge } from '../../self-dev/graph-journey-route.js';
|
|
153
167
|
import { selectLiveDetail } from '../../live/detail-switch.js';
|
|
@@ -174,7 +188,7 @@ import { ZAI_POD_EGRESS_LABEL, checkZaiPodSecret, countActiveZaiJobs, decideZaiP
|
|
|
174
188
|
import { ZAI_CODING_DEFAULT_MODEL, ZAI_OPENROUTER_FALLBACK_MODEL, zaiSettingsFromConfig, type ZaiCodingPlanSettings } from '../../llm/zai-coding-plan.js';
|
|
175
189
|
import { normalizePlanningFallbackReason, selectEnhanceLlm } from '../../prompt-enhance/enhance.js';
|
|
176
190
|
import { inferProviderFromModel } from '../../llm.js';
|
|
177
|
-
import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
|
|
191
|
+
import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podChildProviderFailureFact, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
|
|
178
192
|
import { kubectlTransientReason, retryKubectlTransient } from './kubectl-transient-retry.js';
|
|
179
193
|
import { OLD_DOOR_STAMP_ENV } from '../../self-dev/old-door.js';
|
|
180
194
|
import { resolveDefaultSourceHead, seedMirrorOnce, type MirrorSeedResult } from './pod-mirror-seed.js';
|
|
@@ -409,7 +423,8 @@ async function measureHostBudgetSnapshot(childLlm: PodBudgetChildLlm, env: NodeJ
|
|
|
409
423
|
const host = resolveHostId(env);
|
|
410
424
|
const measuredAt = Date.now();
|
|
411
425
|
const { readBudgetInputsLive, CODEX_PROVIDER, GROK_PROVIDER } = await import('../../self-implement/budget-gate.js');
|
|
412
|
-
const
|
|
426
|
+
const { budgetInputsWithLiveSupply } = await import('../../live-supply/budget-consumer.js');
|
|
427
|
+
const inputs = budgetInputsWithLiveSupply(await readBudgetInputsLive(inputDeps));
|
|
413
428
|
const { decision } = harnessLaunchBudgetDecision(inputs, { ...(childLlm.provider ? { childLlmProvider: childLlm.provider } : {}), ...(childLlm.model ? { childLlmModel: childLlm.model } : {}) });
|
|
414
429
|
const provider = decision.provider ?? childLlm.provider ?? 'chain';
|
|
415
430
|
const used = provider === GROK_PROVIDER
|
|
@@ -1002,9 +1017,11 @@ function podCodexAccountScript(accounts: readonly string[]): string {
|
|
|
1002
1017
|
return [
|
|
1003
1018
|
'mkdir -p "$HOME/.elanous" "$HOME/.codex"',
|
|
1004
1019
|
// Names travel as JSON data, never as shell syntax. Reconstruct the account-store keys that elanous resolves at runtime.
|
|
1005
|
-
`POD_CODEX_ACCOUNTS='${JSON.stringify(accounts)}' bun -e 'const fs=require("node:fs"),path=require("node:path");const names=JSON.parse(process.env.POD_CODEX_ACCOUNTS),home=process.env.HOME;const providers={};let version;for(let i=0;i<names.length;i++){const payload=JSON.parse(fs.readFileSync("/creds/codex-"+i+".json","utf8"));const row=JSON.parse(payload.elanousAuth);if(i===0)version=row.version;const entry=row.providers["openai-codex"];if(!entry)throw Error("missing
|
|
1020
|
+
`POD_CODEX_ACCOUNTS='${JSON.stringify(accounts)}' bun -e 'const fs=require("node:fs"),path=require("node:path");const names=JSON.parse(process.env.POD_CODEX_ACCOUNTS),home=process.env.HOME;const providers={},mirrorProviders={};let version;for(let i=0;i<names.length;i++){const payload=JSON.parse(fs.readFileSync("/creds/codex-"+i+".json","utf8"));const row=JSON.parse(payload.elanousAuth);if(i===0)version=row.version;const entry=row.providers["openai-codex"];if(!entry||!entry.tokens||typeof entry.tokens.accessToken!=="string"||!entry.tokens.accessToken||typeof entry.tokens.expiresAt!=="number"||!Number.isFinite(entry.tokens.expiresAt))throw Error("missing Codex access snapshot "+i);const accountKey=names[i]==="default"?"openai-codex":"openai-codex:"+names[i];const codexHome=path.join(home,".elanous/codex-accounts",String(i));fs.mkdirSync(codexHome,{recursive:true});fs.writeFileSync(path.join(codexHome,"auth.json"),payload.codexAuth,{mode:0o600});fs.chmodSync(path.join(codexHome,"auth.json"),0o600);providers[accountKey]={...entry,codexHome};mirrorProviders[accountKey]={authMode:"chatgpt",tokens:{accessToken:entry.tokens.accessToken,expiresAt:entry.tokens.expiresAt,refreshToken:"",refresh_token:""}}}if(!providers["openai-codex"])providers["openai-codex"]=providers["openai-codex:"+names[0]];if(!mirrorProviders["openai-codex"])mirrorProviders["openai-codex"]=mirrorProviders["openai-codex:"+names[0]];fs.writeFileSync(path.join(home,".elanous/auth.json"),JSON.stringify({version,providers}),{mode:0o600});fs.chmodSync(path.join(home,".elanous/auth.json"),0o600);const mirrorDir=path.join(home,".elanous/remote-parent-credentials/cli-mirror");fs.mkdirSync(mirrorDir,{recursive:true,mode:0o700});fs.chmodSync(mirrorDir,0o700);const mirrorPath=path.join(mirrorDir,"auth.json");fs.writeFileSync(mirrorPath,JSON.stringify({version,providers:mirrorProviders}),{mode:0o600});fs.chmodSync(mirrorPath,0o600);fs.copyFileSync(path.join(home,".elanous/codex-accounts/0/auth.json"),path.join(home,".codex/auth.json"));fs.chmodSync(path.join(home,".codex/auth.json"),0o600)' || exit 5`,
|
|
1006
1021
|
`export ELANOUS_CODEX_ACCOUNT='${accounts[0]!.replace(/'/g, `'\\''`)}'`,
|
|
1007
1022
|
'export ELANOUS_CODEX_ACCOUNT_HOME="$HOME/.elanous/codex-accounts/0" CODEX_HOME="$HOME/.elanous/codex-accounts/0"',
|
|
1023
|
+
'export ELANOUS_REMOTE_CODEX_ACCESS_ONLY=1',
|
|
1024
|
+
'export ELANOUS_REMOTE_CODEX_MIRROR_PATH="$HOME/.elanous/remote-parent-credentials/cli-mirror/auth.json"',
|
|
1008
1025
|
podQuotaPolicyExport(),
|
|
1009
1026
|
].join('\n');
|
|
1010
1027
|
}
|
|
@@ -1503,7 +1520,9 @@ if [ "$found" -eq 0 ]; then echo ELANOUS_RUN_LEDGER_NONE; fi`,
|
|
|
1503
1520
|
// ⭐ 런 계약(graph-run-contract.ts) — 이 칸이 «실제로» Pod 이고, 부모가 정한 계약도 Pod 다. 안의 그래프가 노드마다 대조한다.
|
|
1504
1521
|
{ name: ACTUAL_SUBSTRATE_ENV, value: 'pod' }, { name: RUN_CONTRACT_ENV, value: carryRunContract({ substrate: 'pod' }) },
|
|
1505
1522
|
...Object.entries(o.armEnv ?? {}).map(([name, value]) => ({ name, value })),
|
|
1506
|
-
|
|
1523
|
+
// Growth admission is host-validated control state, never a caller-provided Secret env.
|
|
1524
|
+
...o.passEnv.filter((key) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE')
|
|
1525
|
+
.map((key) => ({ name: key, valueFrom: { secretKeyRef: { name: `${o.name}-creds`, key: `env-${key}` } } })),
|
|
1507
1526
|
...(o.bedrock ? bedrockPodEnv(o.bedrock) : []),
|
|
1508
1527
|
...(o.zai || o.zaiFallback ? zaiPodEnv(o.zai ?? o.zaiFallback!) : []),
|
|
1509
1528
|
],
|
|
@@ -1618,6 +1637,22 @@ export function repairPodExitCode(input: { state: string; repairCommitOnly: bool
|
|
|
1618
1637
|
return input.disposition?.stage !== 'host-regate-failed' && input.disposition?.ok !== false ? 0 : 1;
|
|
1619
1638
|
}
|
|
1620
1639
|
|
|
1640
|
+
export function parsePodRepairExportEvidence(output: string): { exportExitCode: number | null; podExitCode: number | null; exported: boolean;
|
|
1641
|
+
reasonCode: 'none' | 'no-new-commit' | 'source-head-mismatch' | 'export-failed' } | null {
|
|
1642
|
+
const outcomes = [
|
|
1643
|
+
...[...output.matchAll(/^ELANOUS_POD_REPAIR_FAILED ([^\r\n]+)$/gm)].map((match) => ({ index: match.index!, failure: match[1]! })),
|
|
1644
|
+
...[...output.matchAll(/^ELANOUS_POD_REPAIR_COMMIT ([1-9]\d*) ([0-9a-f]{40}) ([0-9a-f]{40})$/gm)].map((match) => ({ index: match.index!, failure: null })),
|
|
1645
|
+
].sort((a, b) => a.index - b.index);
|
|
1646
|
+
const outcome = outcomes.at(-1);
|
|
1647
|
+
if (!outcome) return null;
|
|
1648
|
+
const podRc = [...output.matchAll(/__ELANOUS_POD_DONE__[^\r\n]*\brc=(\d+)/g)].at(-1)?.[1];
|
|
1649
|
+
const reasonCode = outcome.failure === null ? 'none' : outcome.failure === 'repair made no new commit' ? 'no-new-commit'
|
|
1650
|
+
: outcome.failure === 'source-head-mismatch' ? 'source-head-mismatch' : 'export-failed';
|
|
1651
|
+
const exported = outcome.failure === null;
|
|
1652
|
+
return { exportExitCode: exported ? 0 : reasonCode === 'source-head-mismatch' ? null : 1,
|
|
1653
|
+
podExitCode: podRc === undefined ? null : Number(podRc), exported, reasonCode };
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1621
1656
|
export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplementJobSpawn {
|
|
1622
1657
|
if (options.repairCommitOnly && (options.source?.kind !== 'pr' || options.source.number !== options.repairCommitOnly.pr || !/^[0-9a-f]{40}$/.test(options.repairCommitOnly.baseHead))) {
|
|
1623
1658
|
throw new Error('repair commit-only requires a matching PR source and exact head');
|
|
@@ -1635,6 +1670,46 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1635
1670
|
const resultMarkerOn = options.resultMarker ?? !options.kubectl;
|
|
1636
1671
|
const writeWarmLedger = options.siWarmLedger
|
|
1637
1672
|
?? ((entry: RunLedgerEntry) => appendRunLedgerEntry(entry, runLedgerDir(env.ELANOUS_STATE_DIR)));
|
|
1673
|
+
const recordFinalTaskFailure = (input: Parameters<SelfImplementJobSpawn>[0], result: SelfImplementJobDone,
|
|
1674
|
+
ledgerStartIndex: number): SelfImplementJobDone => {
|
|
1675
|
+
// Match createSelfImplementAdapter: a nonzero process exit is failed even if it also emitted an ok disposition.
|
|
1676
|
+
if (result.error?.code === 'aborted' || (result.exitCode === 0 && result.disposition?.ok !== false)) return result;
|
|
1677
|
+
const ledgerRunId = env.ELANOUS_RUN_ID ?? input.spaceId;
|
|
1678
|
+
const ledgerDir = runLedgerDir(env.ELANOUS_STATE_DIR);
|
|
1679
|
+
const job = podJobName(input.spaceId);
|
|
1680
|
+
try {
|
|
1681
|
+
const entries = loadRunLedger(ledgerRunId, ledgerDir) ?? [];
|
|
1682
|
+
const currentEntries = entries.slice(ledgerStartIndex);
|
|
1683
|
+
const childStart = currentEntries.slice().reverse().find((entry) => entry.event === 'pod-child-run' && entry.data?.job === job);
|
|
1684
|
+
const childRunId = typeof childStart?.data?.childRunId === 'string' ? childStart.data.childRunId : null;
|
|
1685
|
+
const attemptValue = childStart?.data?.attempt;
|
|
1686
|
+
const attempt = typeof attemptValue === 'number' && Number.isSafeInteger(attemptValue) && attemptValue > 0 ? attemptValue : 1;
|
|
1687
|
+
const evidence = childRunId ? currentEntries.slice().reverse().find((entry) => entry.event === 'pod-child-evidence'
|
|
1688
|
+
&& entry.data?.job === job && entry.data?.childRunId === childRunId) : undefined;
|
|
1689
|
+
const childResult = evidence?.data?.childResult && typeof evidence.data.childResult === 'object'
|
|
1690
|
+
? evidence.data.childResult as Record<string, unknown> : undefined;
|
|
1691
|
+
const rawError = typeof result.disposition?.error === 'string' && result.disposition.error.trim() ? result.disposition.error
|
|
1692
|
+
: typeof childResult?.error === 'string' && childResult.error.trim() ? childResult.error
|
|
1693
|
+
: result.error?.message ?? result.output;
|
|
1694
|
+
const podTermination = evidence?.data?.podTermination && typeof evidence.data.podTermination === 'object'
|
|
1695
|
+
? evidence.data.podTermination : null;
|
|
1696
|
+
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-task-failure', data: {
|
|
1697
|
+
spaceId: input.spaceId,
|
|
1698
|
+
taskId: input.taskId ?? null,
|
|
1699
|
+
job,
|
|
1700
|
+
attempt,
|
|
1701
|
+
childRunId,
|
|
1702
|
+
childStage: typeof result.disposition?.stage === 'string' ? result.disposition.stage
|
|
1703
|
+
: typeof childResult?.stage === 'string' ? childResult.stage : 'unknown',
|
|
1704
|
+
childError: redactSecretText(rawError).replace(/\s+/gu, ' ').trim().slice(0, 500) || 'unknown',
|
|
1705
|
+
podTermination,
|
|
1706
|
+
} }, ledgerDir);
|
|
1707
|
+
} catch (error) {
|
|
1708
|
+
debug.log('self-implement.pod', 'task-failure-write-failed', { job, childRunId: null,
|
|
1709
|
+
reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
1710
|
+
}
|
|
1711
|
+
return result;
|
|
1712
|
+
};
|
|
1638
1713
|
return (input) => {
|
|
1639
1714
|
if (options.repairCommitOnly && (input.autoMerge || input.openPr || input.base !== `pr-${options.repairCommitOnly.pr}`)) {
|
|
1640
1715
|
throw new Error('repair commit-only refuses auto merge, new PR, or a different base');
|
|
@@ -1642,6 +1717,19 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1642
1717
|
if (options.siWarmAttempt && !options.siWarmHostPostprocess) {
|
|
1643
1718
|
throw new Error('si-v1 warm execution requires cold-path host postprocess parity');
|
|
1644
1719
|
}
|
|
1720
|
+
const taskLedgerDir = runLedgerDir(env.ELANOUS_STATE_DIR);
|
|
1721
|
+
let taskLedgerStartIndex = Number.MAX_SAFE_INTEGER;
|
|
1722
|
+
try { taskLedgerStartIndex = (loadRunLedger(env.ELANOUS_RUN_ID ?? input.spaceId, taskLedgerDir) ?? []).length; }
|
|
1723
|
+
catch (error) { debug.log('self-implement.pod', 'task-failure-baseline-unavailable', {
|
|
1724
|
+
spaceId: input.spaceId, reason: error instanceof Error ? error.message : String(error),
|
|
1725
|
+
}, { level: 'warn' }); }
|
|
1726
|
+
const recordFailure = (result: SelfImplementJobDone) => recordFinalTaskFailure(input, result, taskLedgerStartIndex);
|
|
1727
|
+
const recordRejectedFailure = (error: unknown): never => {
|
|
1728
|
+
if (!input.signal?.aborted && !(error instanceof Error && error.name === 'AbortError')) {
|
|
1729
|
+
recordFailure({ exitCode: 1, output: '', error: { code: 'pod-promise-rejected', message: error instanceof Error ? error.message : String(error) } });
|
|
1730
|
+
}
|
|
1731
|
+
throw error;
|
|
1732
|
+
};
|
|
1645
1733
|
let siWarmEnabled = true;
|
|
1646
1734
|
const taskCard = env.ELANOUS_POD_TASK_CARD ?? env.ELANOUS_TASK_CARD_ID;
|
|
1647
1735
|
if (taskCard) {
|
|
@@ -1956,7 +2044,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1956
2044
|
return { exitCode: 1, output: log.slice(-4096), disposition: hostDisposition,
|
|
1957
2045
|
error: { code: 'si-warm-host-postprocess-failed', message } };
|
|
1958
2046
|
}
|
|
1959
|
-
})();
|
|
2047
|
+
})().then(recordFailure, recordRejectedFailure);
|
|
1960
2048
|
return { address: `self-impl:${input.spaceId}`, done };
|
|
1961
2049
|
}
|
|
1962
2050
|
const name = podJobName(input.spaceId);
|
|
@@ -2122,6 +2210,23 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2122
2210
|
const detail = unfit.map((u) => `${u.context} ${Math.round(u.allocatableMemoryBytes / 2 ** 30 * 10) / 10}GiB`).join(' · ');
|
|
2123
2211
|
return { exitCode: 1, output: '', error: { code: 'pod-pool-unfit', message: `모든 풀 멤버의 할당 가능 메모리가 이 Job 의 한도 ${memoryLimit} 보다 작다 — 영원히 배치될 수 없다(${detail}) · --pod-memory 를 낮추거나 다른 풀로` } };
|
|
2124
2212
|
};
|
|
2213
|
+
// PRLAND-OOM-RETRY-POOL-FIT: whether the NEXT memory limit can ever be placed decides the retry before
|
|
2214
|
+
// anything is written or deleted. Read-only — an all-unfit pool ends the run here, so no retry intent
|
|
2215
|
+
// is journaled, the OOM Job stays, and no second Job is applied. A fit member leaves the single retry intact.
|
|
2216
|
+
const retryPoolFit = async (nextLimit: string, from: string): Promise<SelfImplementJobDone | null> => {
|
|
2217
|
+
const pool = options.pool as { unfitMembers?: (b: number) => Promise<Array<{ context: string; allocatableMemoryBytes: number }>>; members?: readonly PodPoolMember[] } | undefined;
|
|
2218
|
+
if (!pool || typeof pool.unfitMembers !== 'function' || !Array.isArray(pool.members) || !pool.members.length) return null;
|
|
2219
|
+
const limitBytes = memoryQuantityBytes(nextLimit);
|
|
2220
|
+
if (limitBytes === null) return null;
|
|
2221
|
+
const unfit = await pool.unfitMembers(limitBytes);
|
|
2222
|
+
const unfitContextsForRetry = new Set(unfit.map((u) => u.context));
|
|
2223
|
+
const fit = pool.members.filter((m) => !unfitContextsForRetry.has(m.context)).map((m) => m.context);
|
|
2224
|
+
debug.log('self-implement.pod', 'oom-retry-pool-fit', { job: name, from, to: nextLimit, fit, unfit: unfit.map((u) => u.context) }, { level: fit.length ? 'info' : 'warn' });
|
|
2225
|
+
if (fit.length) return null;
|
|
2226
|
+
const detail = unfit.map((u) => `${u.context} ${Math.round(u.allocatableMemoryBytes / 2 ** 30 * 10) / 10}GiB`).join(' · ');
|
|
2227
|
+
const poolLimit = `${Math.round(Math.max(...unfit.map((u) => u.allocatableMemoryBytes)) / 2 ** 30 * 10) / 10}GiB`;
|
|
2228
|
+
return { exitCode: 1, output: '', error: { code: 'pod-pool-unfit', message: `Job ${name} 이 OOMKilled(137) 로 ${from} 에서 죽었고 다음 한도는 ${nextLimit} 이지만 어느 풀 멤버도 그 한도를 받을 수 없다 — 재시도 Job 을 만들 수 없다(필요 ${nextLimit} · 풀 한계 ${poolLimit} · ${detail}) · --pod-memory 를 낮추거나 다른 풀로` } };
|
|
2229
|
+
};
|
|
2125
2230
|
const acquireSlot = async (): Promise<PodPoolMember | null> => {
|
|
2126
2231
|
if (!options.pool) return null;
|
|
2127
2232
|
// Each actual acquisition is a separate observation, including the OOM retry in this
|
|
@@ -2184,8 +2289,9 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2184
2289
|
if (unfitDone) return unfitDone;
|
|
2185
2290
|
// HARNESS-FULL-GRAPH — Pod 입장(입장 관문 ⊕ 멤버 슬롯)은 그래프 노드 pool-admit 이다.
|
|
2186
2291
|
// 2판: decompose →(substrate=pod) pool-admit 간선은 «여기»(Pod 입장 직전 · 실제 단계 경계)에서 남긴다.
|
|
2187
|
-
|
|
2188
|
-
|
|
2292
|
+
const journeyRunId = parentRunId ?? childRunId;
|
|
2293
|
+
if (options.repairCommitOnly) routeJourneyEdge('dispatch', 'pr-source', { source: 'pr', substrate: 'pod' }, { runId: journeyRunId });
|
|
2294
|
+
else routeJourneyEdge('decompose', 'pod', { substrate: 'pod' }, { runId: journeyRunId });
|
|
2189
2295
|
enterJourneyNode('pool-admit', { provenance: 'self-implement-pod', data: { spaceId: input.spaceId } });
|
|
2190
2296
|
// ⛔ 감싸는 함수(async 래퍼)를 쓰지 않는다 — 마이크로태스크가 늘면 Job apply 순서가 밀린다(시험이 잡았다). 같은 자리 try/catch 로.
|
|
2191
2297
|
const podAdmitError = (error: unknown): void => {
|
|
@@ -2300,6 +2406,11 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2300
2406
|
collectPodArtifacts(full.stdout, { dir: join(effectiveInstanceRoot(), 'pod-artifacts'), job: name, log: record });
|
|
2301
2407
|
}
|
|
2302
2408
|
catch (error) { record('self-implement.pod', 'artifact-collect-incomplete', { job: name, reason: error instanceof Error ? error.message : String(error) }); }
|
|
2409
|
+
const repairExportEvidence = options.repairCommitOnly ? parsePodRepairExportEvidence(full.stdout) : null;
|
|
2410
|
+
if (repairExportEvidence) {
|
|
2411
|
+
try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-repair-export', data: { job: name, ...repairExportEvidence } }, ledgerDir); }
|
|
2412
|
+
catch (error) { record('self-implement.pod', 'repair-export-ledger-incomplete', { job: name, reason: error instanceof Error ? error.message : String(error) }); }
|
|
2413
|
+
}
|
|
2303
2414
|
for (const line of full.stdout.split(/\r?\n/)) {
|
|
2304
2415
|
const bundle = /^ELANOUS_POD_SALVAGE_BUNDLE (pod-salvage\/[a-zA-Z0-9._-]+\.bundle) ([0-9]+) ([0-9]+)(?: ([0-9a-f]{40,64}))?$/.exec(line);
|
|
2305
2416
|
if (bundle) {
|
|
@@ -2538,7 +2649,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2538
2649
|
}
|
|
2539
2650
|
}
|
|
2540
2651
|
// Grok 자격은 전용 Secret 키 하나로만 보낸다 — passEnv 의 API 키 중복 전달은 막는다.
|
|
2541
|
-
const passKeys = [...new Set([...(options.passEnv ?? []), ...(openrouterCredentialNeeded && openrouterKey ? ['OPENROUTER_API_KEY'] : []), ...(openGateway ? ['OPENGATEWAY_API_KEY'] : []), ...(anthropic ? ['ANTHROPIC_API_KEY'] : [])])].filter((key) => key !== 'ELANOUS_LIVE_DETAIL_UNTIL'
|
|
2652
|
+
const passKeys = [...new Set([...(options.passEnv ?? []), ...(openrouterCredentialNeeded && openrouterKey ? ['OPENROUTER_API_KEY'] : []), ...(openGateway ? ['OPENGATEWAY_API_KEY'] : []), ...(anthropic ? ['ANTHROPIC_API_KEY'] : [])])].filter((key) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE' && key !== 'ELANOUS_LIVE_DETAIL_UNTIL'
|
|
2542
2653
|
&& key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV
|
|
2543
2654
|
&& (!grok || !['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'].includes(key)));
|
|
2544
2655
|
const skillEnvs: Record<string, string> = options.skillEnv
|
|
@@ -2718,7 +2829,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2718
2829
|
const hostKey = (k: string): string | undefined => k === 'OPENROUTER_API_KEY' && openrouterCredentialNeeded ? openrouterKey : k === 'OPENGATEWAY_API_KEY' && openGateway ? openGatewayKey : k === 'ANTHROPIC_API_KEY' && anthropic ? anthropicKey : env[k] ?? (options.readKeyCache ?? defaultReadKeyCache)(k);
|
|
2719
2830
|
const hostFallbackNames = hostConfig.llm.fallbackChain;
|
|
2720
2831
|
const zaiOverage = zaiLaunchOverage ?? zaiSettingsFromConfig(hostConfig.llm).overage;
|
|
2721
|
-
const normalizedFallback = normalizeFallbackChain(hostFallbackNames);
|
|
2832
|
+
const normalizedFallback = normalizeFallbackChain(hostFallbackNames, hostConfig.llm.provider);
|
|
2722
2833
|
let fallbackSteps = normalizedFallback.chain;
|
|
2723
2834
|
let zaiFallbackSpec: ZaiPodSpec | undefined;
|
|
2724
2835
|
const codexChild = options.provider === undefined || options.provider === 'openai-codex';
|
|
@@ -2903,10 +3014,11 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2903
3014
|
...(credentialRelay ? [POD_CREDENTIAL_TOKEN_ENV] : []),
|
|
2904
3015
|
...(githubRelay ? [POD_GITHUB_CREDENTIAL_TOKEN_ENV] : []),
|
|
2905
3016
|
];
|
|
3017
|
+
const podGrowthScope = env.ELANOUS_GRAPH_GROWTH_SCOPE === 'harness' ? 'harness' : undefined;
|
|
2906
3018
|
const detail = selectLiveDetail(options.liveDetailFile ? { path: options.liveDetailFile } : {}).state;
|
|
2907
3019
|
const detailUntil = detail && (detail.scope === 'all' || detail.scope === parentRunId || detail.scope === launchRunId) && detail.until > Date.now()
|
|
2908
3020
|
? String(detail.until) : undefined;
|
|
2909
|
-
const armEnv = Object.fromEntries(Object.entries(options.armEnv ?? {}).filter(([key]) => key !== 'ELANOUS_LIVE_DETAIL_UNTIL' && !key.startsWith('ELANOUS_PROMPT_ENHANCE_') && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV && (!hostRefresh || !['GH_TOKEN', 'GITHUB_TOKEN', 'GH_CONFIG_DIR'].includes(key))));
|
|
3021
|
+
const armEnv = Object.fromEntries(Object.entries(options.armEnv ?? {}).filter(([key]) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE' && key !== 'ELANOUS_LIVE_DETAIL_UNTIL' && !key.startsWith('ELANOUS_PROMPT_ENHANCE_') && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV && (!hostRefresh || !['GH_TOKEN', 'GITHUB_TOKEN', 'GH_CONFIG_DIR'].includes(key))));
|
|
2910
3022
|
const seat = env.ELANOUS_HARNESS_SEAT;
|
|
2911
3023
|
const authorEnv = authorChoice ? {
|
|
2912
3024
|
...(authorChoice.modelSource !== 'default' || inferProviderFromModel(authorChoice.model) === 'openai-codex' ? {
|
|
@@ -2925,9 +3037,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2925
3037
|
const reviewDeferredToHost = input.autoMerge === true
|
|
2926
3038
|
&& resolvePodHostAcpReview(options.hostAcpReview, env, options.kubectl ? () => undefined : getUserConfig).enabled;
|
|
2927
3039
|
if (reviewDeferredToHost) debug.log('self-implement.pod', 'review-deferred-armed', { job: name, env: REVIEW_DEFERRED_TO_HOST_ENV, ...(reviewerPin ? { reviewerPinUnused: reviewerPin } : {}) });
|
|
2928
|
-
const jobArmEnv = grounding || credentialRelay || githubRelay || env.ELANOUS_DISPATCH_RECORDED === '1' || options.armEnv || detailUntil || seat || env.ELANOUS_POD_AUTHOR_ON_POD === '1' || reviewerPin || reviewDeferredToHost || budgetSnapshot
|
|
3040
|
+
const jobArmEnv = grounding || credentialRelay || githubRelay || podGrowthScope || env.ELANOUS_DISPATCH_RECORDED === '1' || options.armEnv || detailUntil || seat || env.ELANOUS_POD_AUTHOR_ON_POD === '1' || reviewerPin || reviewDeferredToHost || budgetSnapshot
|
|
2929
3041
|
? {
|
|
2930
3042
|
...armEnv,
|
|
3043
|
+
...(podGrowthScope ? { ELANOUS_GRAPH_GROWTH_SCOPE: podGrowthScope } : {}),
|
|
2931
3044
|
...(budgetSnapshot ? { [BUDGET_SNAPSHOT_ENV]: encodeBudgetSnapshot(budgetSnapshot) } : {}),
|
|
2932
3045
|
...authorEnv,
|
|
2933
3046
|
...(reviewerPin ? { [roleLlmEnvName('review')]: reviewerPin } : {}),
|
|
@@ -3413,6 +3526,32 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3413
3526
|
for (const row of usagePlan.rows) debug.log(row.category, row.event, row.data);
|
|
3414
3527
|
const parsed = parseSelfImplementJson(logs);
|
|
3415
3528
|
const terminal = parseSelfImplementJson(logs.trimEnd().split('\n').at(-1) ?? '');
|
|
3529
|
+
const terminalObservation = podChildTerminalResultObservation(logs);
|
|
3530
|
+
const providerSignature = {
|
|
3531
|
+
grokUnavailableCount: logs.match(/Grok unavailable:\s*run `grok login`/gu)?.length ?? 0,
|
|
3532
|
+
structuredProviderErrors: terminal?.providerErrors ?? parsed?.providerErrors ?? null,
|
|
3533
|
+
};
|
|
3534
|
+
const childResultObservation = {
|
|
3535
|
+
job: name,
|
|
3536
|
+
childRunId: liveChildRunId,
|
|
3537
|
+
jobState: state,
|
|
3538
|
+
containerExitCode: containerExitCode ?? null,
|
|
3539
|
+
ledgerCompleteness,
|
|
3540
|
+
terminalResultObserved: terminalObservation.observed,
|
|
3541
|
+
terminalStage: terminalObservation.stage,
|
|
3542
|
+
terminalOk: terminalObservation.ok,
|
|
3543
|
+
terminalOutcome: terminalObservation.outcome,
|
|
3544
|
+
terminalFailureClassification: terminalObservation.failureClassification,
|
|
3545
|
+
providerSignature,
|
|
3546
|
+
};
|
|
3547
|
+
debug.log('self-implement.pod', 'child-terminal-result-observed', childResultObservation);
|
|
3548
|
+
try {
|
|
3549
|
+
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-terminal-result-observation', data: childResultObservation }, ledgerDir);
|
|
3550
|
+
} catch (error) {
|
|
3551
|
+
debug.log('self-implement.pod', 'child-terminal-result-observation-write-failed', {
|
|
3552
|
+
job: name, childRunId: liveChildRunId, reason: error instanceof Error ? error.message : String(error),
|
|
3553
|
+
}, { level: 'warn' });
|
|
3554
|
+
}
|
|
3416
3555
|
const nextAccount = codexAccounts?.find((candidate) => candidate !== account);
|
|
3417
3556
|
if (state === 'failed' && containerExitCode === 7 && !input.signal?.aborted) {
|
|
3418
3557
|
debug.log('self-implement.pod', 'gh-login-failed', { job: name, attempt: ghLoginRetried ? 2 : 1, tokenExpiresInSec: ghTokenExpiresAt === null ? null : Math.floor((ghTokenExpiresAt - now()) / 1000) });
|
|
@@ -3548,7 +3687,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3548
3687
|
}
|
|
3549
3688
|
}
|
|
3550
3689
|
}
|
|
3551
|
-
|
|
3690
|
+
let childFailure = state === 'failed' && !oomKilled && failedReason !== 'DeadlineExceeded'
|
|
3552
3691
|
? lastPodChildFailure(logs) : null;
|
|
3553
3692
|
let childPrFailure: ReturnType<typeof podPrOpenFailure> = null;
|
|
3554
3693
|
if (childFailure) {
|
|
@@ -3573,6 +3712,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3573
3712
|
};
|
|
3574
3713
|
}
|
|
3575
3714
|
let noResultDiagnostic: string | null = null;
|
|
3715
|
+
let noResultLedgerText: string | null = null;
|
|
3576
3716
|
let noResultLedgerObservation: { available: boolean; bytes: number; rows: number; lastEvent: string | null } = {
|
|
3577
3717
|
available: false, bytes: 0, rows: 0, lastEvent: null,
|
|
3578
3718
|
};
|
|
@@ -3582,6 +3722,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3582
3722
|
if (noResultCandidate) {
|
|
3583
3723
|
try {
|
|
3584
3724
|
const ledgerText = readFileSync(runLedgerPath(liveChildRunId, ledgerDir), 'utf8');
|
|
3725
|
+
noResultLedgerText = ledgerText;
|
|
3585
3726
|
const ledgerRows = ledgerText.split('\n').filter(Boolean);
|
|
3586
3727
|
let lastEvent: string | null = null;
|
|
3587
3728
|
try {
|
|
@@ -3594,6 +3735,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3594
3735
|
catch { /* ledger not returned: do not invent a stage */ }
|
|
3595
3736
|
noResultDiagnostic ??= 'child terminal result missing; last ledger stage=unknown; round=unknown; mustFix=unknown';
|
|
3596
3737
|
}
|
|
3738
|
+
if (!childFailure && state === 'failed' && noResultCandidate && noResultLedgerText) {
|
|
3739
|
+
const childError = podNoResultChildError(noResultLedgerText);
|
|
3740
|
+
if (childError) childFailure = { stage: 'pr-open-failed', error: childError, rawError: childError };
|
|
3741
|
+
}
|
|
3597
3742
|
// POD-FAIL-EVIDENCE-CAPTURE: failed Pods are collected/deleted immediately after terminal handling.
|
|
3598
3743
|
// Preserve a bounded log tail for every non-OOM/non-deadline failure, including known child stages:
|
|
3599
3744
|
// the terminal result line can be followed by the useful stderr that explains the actual exit.
|
|
@@ -3673,6 +3818,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3673
3818
|
const noResultIncident = state === 'failed' && failedReason !== 'DeadlineExceeded' && !disposition;
|
|
3674
3819
|
if (reportDeficit || noResultIncident) {
|
|
3675
3820
|
const evidence = disposition?.childEvidence;
|
|
3821
|
+
const firstLlm = readPodChildFirstLlmFact(liveChildRunId, ledgerDir, true);
|
|
3676
3822
|
const diagnosticLines = [
|
|
3677
3823
|
...(Array.isArray(evidence?.podLogTail) ? evidence.podLogTail : []),
|
|
3678
3824
|
...(typeof evidence?.detail === 'string' ? evidence.detail.split('\n') : []),
|
|
@@ -3693,6 +3839,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3693
3839
|
reason: failedReason || containerReason || 'unknown',
|
|
3694
3840
|
terminationReason: evidence?.terminationReason ?? null,
|
|
3695
3841
|
providerErrors: disposition?.providerErrors ?? null,
|
|
3842
|
+
firstLlm: firstLlm ?? null,
|
|
3696
3843
|
oomKilled, podTermination: podTermination ?? null,
|
|
3697
3844
|
detailTail: evidence?.detailTail ?? null,
|
|
3698
3845
|
lastLines: diagnosticLines,
|
|
@@ -3751,6 +3898,9 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3751
3898
|
}
|
|
3752
3899
|
if (actual < (memoryGi(nextLimit) ?? actual)) {
|
|
3753
3900
|
const from = reattachedMemoryLimit ?? memoryLimit;
|
|
3901
|
+
// A retry nobody can place is not a retry: decide pool fitness for the next limit first.
|
|
3902
|
+
const retryUnfit = await retryPoolFit(nextLimit, from);
|
|
3903
|
+
if (retryUnfit) return retryUnfit;
|
|
3754
3904
|
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-oom-retry-intent', data: { attempt: 2, from, to: nextLimit, tier: nextTier, reason: 'OOMKilled', job: name, executionKey, fromChildRunId: liveChildRunId } }, ledgerDir);
|
|
3755
3905
|
debug.log('self-implement.pod', 'oom-retry', { from, to: nextLimit, tier: nextTier, reason: 'OOMKilled', job: name });
|
|
3756
3906
|
const deleted = kubectl(['-n', namespace, 'delete', 'job', name, '--ignore-not-found', '--wait=true']);
|
|
@@ -3798,6 +3948,13 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3798
3948
|
}
|
|
3799
3949
|
// The host still has the complete Pod log here. The CLI only retains a short stdout tail,
|
|
3800
3950
|
// so preserve the parsed child facts in the parent ledger before that tail is returned.
|
|
3951
|
+
// OBS-GAP-BATCH-1030 — 자식 LLM 실패의 공급자·HTTP status 를 부모 원장 행에 붙인다.
|
|
3952
|
+
// 줄이 공급자를 이름하지 않으면 이 Pod 의 자식 provider(Pod 옵션 ⊕ 위임 플래그)를 정규 id 로만 쓴다.
|
|
3953
|
+
// ⛔ 본문·자격증명은 담지 않는다 — 귀속은 두 스칼라뿐이다.
|
|
3954
|
+
const childProviderFailure = podChildProviderFailureFact(logs, {
|
|
3955
|
+
providerHint: options.provider ?? podChildProviderOf(podDelegatedChildLlm(jobArgs)?.provider),
|
|
3956
|
+
});
|
|
3957
|
+
const childFirstLlm = readPodChildFirstLlmFact(liveChildRunId, ledgerDir);
|
|
3801
3958
|
const childEvidenceRow = podChildEvidenceLedgerRow({
|
|
3802
3959
|
job: name,
|
|
3803
3960
|
childRunId: liveChildRunId,
|
|
@@ -3806,6 +3963,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3806
3963
|
noResultDiagnostic,
|
|
3807
3964
|
noResultLogEvidence,
|
|
3808
3965
|
podTermination,
|
|
3966
|
+
providerFailure: childProviderFailure,
|
|
3967
|
+
firstLlm: childFirstLlm,
|
|
3809
3968
|
});
|
|
3810
3969
|
if (childEvidenceRow) {
|
|
3811
3970
|
// Every terminal attempt writes a marker, including one with no parseable child facts.
|
|
@@ -3927,7 +4086,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3927
4086
|
} finally {
|
|
3928
4087
|
releaseAdmission?.();
|
|
3929
4088
|
}
|
|
3930
|
-
})();
|
|
4089
|
+
})().then(recordFailure, recordRejectedFailure);
|
|
3931
4090
|
return { address, done };
|
|
3932
4091
|
};
|
|
3933
4092
|
}
|
|
@@ -4095,6 +4254,43 @@ export function readPodNoResultLogTail(args: {
|
|
|
4095
4254
|
}
|
|
4096
4255
|
}
|
|
4097
4256
|
|
|
4257
|
+
/** Keep the terminal result row separate from provider-error text in the same child log. */
|
|
4258
|
+
function podChildTerminalResultObservation(logs: string): {
|
|
4259
|
+
observed: boolean;
|
|
4260
|
+
stage: string | null;
|
|
4261
|
+
ok: boolean | null;
|
|
4262
|
+
outcome: string | null;
|
|
4263
|
+
failureClassification: string | null;
|
|
4264
|
+
} {
|
|
4265
|
+
const lines = logs.split(/\r\n|\n|\r/u);
|
|
4266
|
+
for (let index = lines.length - 1; index >= 0; index--) {
|
|
4267
|
+
const line = lines[index]!.trim();
|
|
4268
|
+
if (!line.startsWith('{')) continue;
|
|
4269
|
+
let value: unknown;
|
|
4270
|
+
try { value = JSON.parse(line); } catch { continue; }
|
|
4271
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
|
|
4272
|
+
const row = value as Record<string, unknown>;
|
|
4273
|
+
const terminal = podTerminalRow(row);
|
|
4274
|
+
if (!terminal) continue;
|
|
4275
|
+
const nested = (row.kind === 'self' || row.kind === 'external')
|
|
4276
|
+
&& row.result && typeof row.result === 'object' && !Array.isArray(row.result)
|
|
4277
|
+
? row.result as Record<string, unknown> : row;
|
|
4278
|
+
const abandoned = nested.abandonedClassification && typeof nested.abandonedClassification === 'object'
|
|
4279
|
+
&& !Array.isArray(nested.abandonedClassification) ? nested.abandonedClassification as Record<string, unknown> : null;
|
|
4280
|
+
return {
|
|
4281
|
+
observed: true,
|
|
4282
|
+
stage: terminal.stage,
|
|
4283
|
+
ok: terminal.ok,
|
|
4284
|
+
outcome: typeof nested.outcome === 'string' ? nested.outcome
|
|
4285
|
+
: typeof nested.completionDisposition === 'string' ? nested.completionDisposition
|
|
4286
|
+
: typeof nested.terminationReason === 'string' ? nested.terminationReason : null,
|
|
4287
|
+
failureClassification: typeof nested.failureClassification === 'string' ? nested.failureClassification
|
|
4288
|
+
: typeof abandoned?.classification === 'string' ? abandoned.classification : null,
|
|
4289
|
+
};
|
|
4290
|
+
}
|
|
4291
|
+
return { observed: false, stage: null, ok: null, outcome: null, failureClassification: null };
|
|
4292
|
+
}
|
|
4293
|
+
|
|
4098
4294
|
/** 사람용 런 결과 한 줄 — 수확 브랜치가 있으면 «수확할 브랜치: …» 를 붙인다. */
|
|
4099
4295
|
export function podRunResultLine(logs: string, branches: readonly string[]): string {
|
|
4100
4296
|
const result = logs.split('\n').filter((line) => !line.startsWith('ELANOUS_MEM ')).join('\n').slice(-4000);
|
|
@@ -31,6 +31,7 @@ import { isAbandonedClassification, type AbandonedClassificationResult } from '.
|
|
|
31
31
|
import { createExecution, type Task, type TaskExecution } from '../types.js';
|
|
32
32
|
import type { DispatchContext, DispatchResult } from '../surface-registry.js';
|
|
33
33
|
import { nestedPodResult } from './pod-failure-reason.js';
|
|
34
|
+
import { isTddRecordTag, TDD_RECORD_TAGS, type TddRecordTag } from '../../self-implement/tdd-evidence-tags.js';
|
|
34
35
|
import { SCOPE_EXPANSION_CAP, SCOPE_STOP_REASONS, isProtectedScopePath, type ScopeStopReason } from '../../self-implement/scope-adjacency.js';
|
|
35
36
|
|
|
36
37
|
/** Result of one self-implement subprocess. */
|
|
@@ -145,6 +146,8 @@ export interface PodChildEvidence {
|
|
|
145
146
|
supervisorVerdict?: unknown;
|
|
146
147
|
goalCauseObserved?: true;
|
|
147
148
|
terminationReason?: unknown;
|
|
149
|
+
/** TDD report-deficit facts carried as named fields, independent of clipped detail text. */
|
|
150
|
+
tddEvidenceFailure?: { reason: 'tdd-evidence-missing'; round: number; missing: TddRecordTag[] };
|
|
148
151
|
accountAvailability?: Record<string, unknown>;
|
|
149
152
|
prFailure?: {
|
|
150
153
|
stage: 'pr-open-failed';
|
|
@@ -217,6 +220,20 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
217
220
|
if (o.ok !== false || typeof value !== 'string' || !value.trim()) return undefined;
|
|
218
221
|
return redactSecretText(value).slice(0, 4_000);
|
|
219
222
|
};
|
|
223
|
+
const rawTddEvidenceFailure = object(o.tddEvidenceFailure);
|
|
224
|
+
const rawTddMissing = rawTddEvidenceFailure?.missing;
|
|
225
|
+
const tddEvidenceFailure = o.ok === false && o.terminationReason === 'tdd-evidence-missing'
|
|
226
|
+
&& rawTddEvidenceFailure?.reason === 'tdd-evidence-missing'
|
|
227
|
+
&& typeof rawTddEvidenceFailure.round === 'number' && Number.isSafeInteger(rawTddEvidenceFailure.round) && rawTddEvidenceFailure.round >= 1
|
|
228
|
+
&& Array.isArray(rawTddMissing) && rawTddMissing.length > 0 && rawTddMissing.length <= TDD_RECORD_TAGS.length
|
|
229
|
+
&& rawTddMissing.every(isTddRecordTag)
|
|
230
|
+
&& new Set(rawTddMissing).size === rawTddMissing.length
|
|
231
|
+
? {
|
|
232
|
+
reason: 'tdd-evidence-missing' as const,
|
|
233
|
+
round: rawTddEvidenceFailure.round,
|
|
234
|
+
missing: rawTddMissing as TddRecordTag[],
|
|
235
|
+
}
|
|
236
|
+
: undefined;
|
|
220
237
|
const failureExitCode = o.ok === false && typeof o.exitCode === 'number'
|
|
221
238
|
&& Number.isInteger(o.exitCode) && o.exitCode >= 0 && o.exitCode <= 255 ? o.exitCode : undefined;
|
|
222
239
|
const outOfScopeEdits = scrubValue(o.outOfScopeEdits);
|
|
@@ -248,7 +265,10 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
248
265
|
...(abandoned ? { abandonedClassification: abandoned } : {}),
|
|
249
266
|
...(o.supervisorVerdict !== undefined ? { supervisorVerdict: scrubValue(o.supervisorVerdict) } : {}),
|
|
250
267
|
...(o.goalCauseObserved === true ? { goalCauseObserved: true } : {}),
|
|
251
|
-
...(o.terminationReason
|
|
268
|
+
...(o.terminationReason === 'tdd-evidence-missing'
|
|
269
|
+
? (tddEvidenceFailure ? { terminationReason: 'tdd-evidence-missing' } : {})
|
|
270
|
+
: o.terminationReason !== undefined ? { terminationReason: scrubValue(o.terminationReason) } : {}),
|
|
271
|
+
...(tddEvidenceFailure ? { tddEvidenceFailure } : {}),
|
|
252
272
|
...(accountAvailability ? { accountAvailability } : {}),
|
|
253
273
|
...(o.harvestable === true && typeof o.branch === 'string' && o.branch.trim() ? { harvestable: true } : {}),
|
|
254
274
|
...(typeof o.prNumber === 'number' && Number.isSafeInteger(o.prNumber) && o.prNumber > 0 ? { prNumber: o.prNumber } : {}),
|
|
@@ -294,6 +314,8 @@ export interface SelfImplementJobSpawn {
|
|
|
294
314
|
draft?: boolean;
|
|
295
315
|
/** Distinct-per-job harness-space id → own screen/log buffer. */
|
|
296
316
|
spaceId: string;
|
|
317
|
+
/** Orchestrator task identity, preserved with terminal Pod failure evidence. */
|
|
318
|
+
taskId?: string;
|
|
297
319
|
signal?: AbortSignal;
|
|
298
320
|
/** Optional TC-owned warm-worker command. The warm request is advisory; this feature Job remains authoritative. */
|
|
299
321
|
warmWorkerCommand?: WarmWorkerCommand;
|
|
@@ -394,6 +416,7 @@ export function createSelfImplementAdapter(opts: SelfImplementAdapterOptions) {
|
|
|
394
416
|
...(surface.openPr !== undefined ? { openPr: surface.openPr } : {}),
|
|
395
417
|
...(surface.draft !== undefined ? { draft: surface.draft } : {}),
|
|
396
418
|
spaceId,
|
|
419
|
+
taskId: task.id,
|
|
397
420
|
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
398
421
|
});
|
|
399
422
|
address = res.address;
|
|
@@ -606,8 +629,9 @@ export function reviewGateFields(o: Record<string, unknown>): Pick<SelfImplement
|
|
|
606
629
|
export function reportUnmappedDispositionFields(
|
|
607
630
|
raw: Record<string, unknown>,
|
|
608
631
|
mapped: SelfImplementDisposition,
|
|
632
|
+
knownRawFields: readonly string[] = [],
|
|
609
633
|
): readonly string[] {
|
|
610
|
-
const known = new Set(Object.keys(mapped));
|
|
634
|
+
const known = new Set([...Object.keys(mapped), ...knownRawFields]);
|
|
611
635
|
const unmapped = Object.keys(raw).filter((key) => !known.has(key) && raw[key] !== undefined);
|
|
612
636
|
if (unmapped.length > 0) {
|
|
613
637
|
try {
|
|
@@ -716,7 +740,7 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
|
|
|
716
740
|
&& ((o.review as { mustFix: unknown[] }).mustFix).every((item) => typeof item === 'string')
|
|
717
741
|
? { mustFix: (o.review as { mustFix: string[] }).mustFix } : {}),
|
|
718
742
|
};
|
|
719
|
-
reportUnmappedDispositionFields(o, mapped);
|
|
743
|
+
reportUnmappedDispositionFields(o, mapped, ['terminationReason', 'tddEvidenceFailure']);
|
|
720
744
|
return mapped;
|
|
721
745
|
} catch { /* not this line */ }
|
|
722
746
|
}
|