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
|
@@ -3,7 +3,7 @@ import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
|
3
3
|
import { gunzipSync } from 'node:zlib';
|
|
4
4
|
import { basename, dirname, join } from 'node:path';
|
|
5
5
|
import { findGitDir } from '../git-fs/locate.js';
|
|
6
|
-
import { debug } from '../debug/log.js';
|
|
6
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
7
7
|
import { PR_LABELS, PR_LABEL_NAMES } from '../github/pr-labels.js';
|
|
8
8
|
import { appendRunLedgerEntry, listRunLedgers, loadRunLedger, runLedgerDir, type RunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
9
9
|
import { queryRunningRuns } from '../self-implement/running-runs.js';
|
|
@@ -161,9 +161,42 @@ const GH_MAX_BUFFER = 64 * 1024 * 1024;
|
|
|
161
161
|
* several times larger than this projection, so the listing asks gh to project each page down to these fields. */
|
|
162
162
|
const OPEN_DRAFT_FIELDS = '[.[] | {number, title, headRefName: .head.ref, createdAt: .created_at, body, labels: [.labels[] | {name}], draft}]';
|
|
163
163
|
|
|
164
|
+
interface GhFailureEvidence {
|
|
165
|
+
args: readonly string[];
|
|
166
|
+
status: number | null;
|
|
167
|
+
signal: NodeJS.Signals | null;
|
|
168
|
+
errorCode?: string;
|
|
169
|
+
stderr: string;
|
|
170
|
+
capturedStderrBytes: number;
|
|
171
|
+
stdoutBytes: number;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class GhCommandError extends Error {
|
|
175
|
+
constructor(message: string, readonly evidence: GhFailureEvidence) {
|
|
176
|
+
super(message);
|
|
177
|
+
this.name = 'GhCommandError';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function executionSha(): string | undefined {
|
|
182
|
+
const sha = process.env.ELANOUS_EXECUTION_SHA?.trim();
|
|
183
|
+
return sha && /^[a-f0-9]{40}$/i.test(sha) ? sha : undefined;
|
|
184
|
+
}
|
|
185
|
+
|
|
164
186
|
function gh(args: string[]): string {
|
|
165
|
-
const
|
|
166
|
-
|
|
187
|
+
const cwd = findGitDir(process.cwd())?.root ?? process.cwd();
|
|
188
|
+
const result = spawnSync('gh', args, { cwd, encoding: 'utf8', timeout: 60_000, maxBuffer: GH_MAX_BUFFER });
|
|
189
|
+
if (result.status !== 0) {
|
|
190
|
+
const spawnError = result.error as NodeJS.ErrnoException | undefined;
|
|
191
|
+
const stderr = result.stderr ?? '';
|
|
192
|
+
const reason = (stderr || spawnError?.message || `gh exited ${result.status}`).trim().slice(0, 200);
|
|
193
|
+
throw new GhCommandError(reason, {
|
|
194
|
+
args: [...args], status: result.status, signal: result.signal,
|
|
195
|
+
...(spawnError?.code ? { errorCode: spawnError.code } : {}),
|
|
196
|
+
stderr: redactSecretText(stderr).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 4_000), capturedStderrBytes: Buffer.byteLength(stderr),
|
|
197
|
+
stdoutBytes: Buffer.byteLength(result.stdout ?? ''),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
167
200
|
return result.stdout.trim();
|
|
168
201
|
}
|
|
169
202
|
function ghPr(row: { number: number; title: string; headRefName: string; headRefOid?: string; isDraft?: boolean; createdAt: string; body: string; labels: Array<{ name: string }>; comments?: Array<{ body: string }>; state?: string }): ResiduePr {
|
|
@@ -233,8 +266,9 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
|
|
|
233
266
|
},
|
|
234
267
|
listOpenDrafts: (repository) => {
|
|
235
268
|
const rows: ResiduePr[] = [];
|
|
269
|
+
let page = 0;
|
|
236
270
|
try {
|
|
237
|
-
for (
|
|
271
|
+
for (page = 1; page <= 100; page++) {
|
|
238
272
|
const result = JSON.parse(gh(['api', `repos/${repository}/pulls?state=open&per_page=100&page=${page}`, '--jq', OPEN_DRAFT_FIELDS])) as Array<{
|
|
239
273
|
number: number; title: string; headRefName: string; createdAt: string; body: string;
|
|
240
274
|
labels: Array<{ name: string }>; draft: boolean;
|
|
@@ -246,7 +280,32 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
|
|
|
246
280
|
throw new Error('Open PR inventory exceeded pagination limit');
|
|
247
281
|
} catch (error) {
|
|
248
282
|
// «못 셌음»: a failed (or truncated) listing is unmeasurable — it must never surface as a counted zero.
|
|
249
|
-
|
|
283
|
+
const ghEvidence = error instanceof GhCommandError ? error.evidence : undefined;
|
|
284
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
285
|
+
const isEnobufs = ghEvidence?.errorCode === 'ENOBUFS' || /ENOBUFS/.test(reason);
|
|
286
|
+
const runSha = executionSha();
|
|
287
|
+
const responseBytes = !ghEvidence
|
|
288
|
+
? { status: 'unmeasured', complete: false,
|
|
289
|
+
reason: /pagination limit/.test(reason) ? 'pagination limit reached; aggregate page response bytes were not retained'
|
|
290
|
+
: 'the failed inventory response byte count was not retained' }
|
|
291
|
+
: isEnobufs || ghEvidence.errorCode || ghEvidence.status === null || ghEvidence.signal !== null
|
|
292
|
+
? { status: 'unmeasured', capturedBytes: ghEvidence.stdoutBytes, complete: false,
|
|
293
|
+
reason: isEnobufs ? 'spawnSync ENOBUFS truncates child output before the complete REST response length is known'
|
|
294
|
+
: ghEvidence.signal ? `child process was terminated by ${ghEvidence.signal}`
|
|
295
|
+
: ghEvidence.status === null ? 'child exit status is unavailable, so response completeness is unknown'
|
|
296
|
+
: 'the child process ended with an error before response completeness could be established' }
|
|
297
|
+
: { status: 'measured', bytes: ghEvidence.stdoutBytes, complete: true };
|
|
298
|
+
debug.log('draft.residue', 'list-open-drafts-unobserved', {
|
|
299
|
+
repository, reason: redactSecretText(reason), requestedPage: page <= 100 ? page : null,
|
|
300
|
+
paginationLimitExceeded: page > 100, request: ghEvidence?.args ?? null,
|
|
301
|
+
exitStatus: ghEvidence?.status ?? null, signal: ghEvidence?.signal ?? null,
|
|
302
|
+
errorCode: ghEvidence?.errorCode ?? null,
|
|
303
|
+
stderr: ghEvidence?.stderr ?? null, capturedStderrBytes: ghEvidence?.capturedStderrBytes ?? null,
|
|
304
|
+
responseBytes,
|
|
305
|
+
executionSha: runSha ? { status: 'measured', value: runSha } : {
|
|
306
|
+
status: 'unmeasured', reason: 'ELANOUS_EXECUTION_SHA is absent or invalid for this process invocation',
|
|
307
|
+
},
|
|
308
|
+
});
|
|
250
309
|
return undefined;
|
|
251
310
|
}
|
|
252
311
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CLAIM_IDLE_HOURS, PR_LABELS, STALLED_DRAFT_HOURS } from '../github/pr-labels.js';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
-
import { assessDraftTriage, decideDraft, draftClaimComment, draftClaimState, draftReleaseComment, laterMergedTwins, sameGoalPr, PROTECTED_LABELS, type DraftTriageAssessment, type DraftTriagePr, type DraftTriageReviewState } from './draft-triage-rules.js';
|
|
3
|
+
import { assessDraftTriage, decideDraft, draftClaimComment, draftClaimState, draftIntentHoldReason, draftIntentHoldRejection, draftReleaseComment, harvestDeferredMarker, laterMergedTwins, parseDraftIntentHold, sameGoalPr, PROTECTED_LABELS, type DraftTriageAssessment, type DraftTriagePr, type DraftTriageReviewState } from './draft-triage-rules.js';
|
|
4
4
|
import { cellIdFromBody } from '../pr-tool/census.js';
|
|
5
5
|
import { RELEASE_PATH_LABEL } from './release-path-guard.js';
|
|
6
6
|
import { cardPrNumber, draftTaskOwner, type TaskCard } from '../task-agent/task-hand.js';
|
|
@@ -659,12 +659,14 @@ export function resolveDraftSweepCloseCap(input: { flag?: unknown; config?: unkn
|
|
|
659
659
|
export async function supersedeDraftsOnMerge(input: {
|
|
660
660
|
repository: string;
|
|
661
661
|
merged: SweepMergedPr & { createdAt: string; mergedAt: string };
|
|
662
|
+
now?: Date;
|
|
662
663
|
/** `pr land` and HQ train invoke only the explicit same-cell successor path. */
|
|
663
664
|
onlyExplicitSameCell?: boolean;
|
|
664
665
|
adapters: Pick<DraftSweepAdapters, 'listDrafts' | 'listLiveBranches' | 'getRunStatus' | 'setLabels' | 'closeDraft'>
|
|
665
666
|
& Pick<Partial<DraftSweepAdapters>, 'getLatestFileChanges' | 'getPrFiles' | 'commentDraft' | 'listIssueComments'>;
|
|
666
667
|
}): Promise<{ closed: number[]; kept: number[] }> {
|
|
667
668
|
const { repository, merged, adapters } = input;
|
|
669
|
+
const now = input.now ?? new Date();
|
|
668
670
|
const closed: number[] = [];
|
|
669
671
|
const kept: number[] = [];
|
|
670
672
|
let drafts: SweepDraft[] = [];
|
|
@@ -691,6 +693,7 @@ export async function supersedeDraftsOnMerge(input: {
|
|
|
691
693
|
const old = drafts.find((draft) => draft.number === explicitOld);
|
|
692
694
|
if (old && cellIdFromBody(old.body ?? '') === mergedCell
|
|
693
695
|
&& Date.parse(old.createdAt) < Date.parse(merged.mergedAt)
|
|
696
|
+
&& !parseDraftIntentHold(old.body, now)
|
|
694
697
|
&& !old.labels.some((label) => PROTECTED_LABELS.has(label))
|
|
695
698
|
&& PR_LABELS.filter((label) => label.axis === 'state' && old.labels.includes(label.name)).length <= 1) {
|
|
696
699
|
const marker = `<!-- elanous:same-cell-superseded #${old.number} -> #${merged.number} -->`;
|
|
@@ -745,7 +748,7 @@ export async function supersedeDraftsOnMerge(input: {
|
|
|
745
748
|
kept.push(draft.number);
|
|
746
749
|
continue;
|
|
747
750
|
}
|
|
748
|
-
const decision = decideDraft({ draft, runStatus: statuses.get(draft.number),
|
|
751
|
+
const decision = decideDraft({ draft, now, runStatus: statuses.get(draft.number),
|
|
749
752
|
mergedTwins: [landed], liveBranches, ageHours: NaN });
|
|
750
753
|
if (decision.action !== 'close' || !decision.reason.startsWith(`superseded-by #${merged.number}`)
|
|
751
754
|
|| PR_LABELS.filter((entry) => entry.axis === 'state' && draft.labels.includes(entry.name)).length > 1
|
|
@@ -1345,6 +1348,16 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1345
1348
|
...(claimWriteFailed ? { error: claimWriteError, ...(claimPartialApplied ? { partialApplied: true } : {}) } : {}) });
|
|
1346
1349
|
continue;
|
|
1347
1350
|
}
|
|
1351
|
+
// DRAFT-ZERO's failed-run harvest evidence remains the strongest explicit hold; this intent marker
|
|
1352
|
+
// must not rewrite its reason or mask the harvest classification.
|
|
1353
|
+
if (runStatus === 'failed' && harvestDeferredMarker(draft.body)) {
|
|
1354
|
+
record({ number: draft.number, action: 'keep', reason: 'harvest-deferred', applied: false });
|
|
1355
|
+
continue;
|
|
1356
|
+
}
|
|
1357
|
+
const intentHoldRejection = draftIntentHoldRejection(draft.body, now);
|
|
1358
|
+
if (intentHoldRejection) {
|
|
1359
|
+
try { debug.log('self-dev.draft-sweep', 'intent-hold-rejected', { pr: draft.number, reason: intentHoldRejection }); } catch { /* fail-soft */ }
|
|
1360
|
+
}
|
|
1348
1361
|
if (draft.labels.includes(releaseHoldLabel ?? '') || draft.labels.includes(RELEASE_PATH_LABEL)
|
|
1349
1362
|
|| (!contradiction && draft.labels.includes(keepLabel ?? ''))) {
|
|
1350
1363
|
const held = draft.labels.includes(keepLabel ?? '') ? keepLabel
|
|
@@ -1352,6 +1365,19 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1352
1365
|
record({ number: draft.number, action: 'keep', reason: `label:${held}`, applied: false });
|
|
1353
1366
|
continue;
|
|
1354
1367
|
}
|
|
1368
|
+
// Outside-harness drafts keep their established jurisdiction reason, even when they carry a valid marker.
|
|
1369
|
+
if (!contradiction && !states.length && !draft.branch.startsWith('self-impl/')) {
|
|
1370
|
+
record({ number: draft.number, action: 'keep', reason: 'outside-harness', applied: false });
|
|
1371
|
+
continue;
|
|
1372
|
+
}
|
|
1373
|
+
const intentHold = parseDraftIntentHold(draft.body, now);
|
|
1374
|
+
if (intentHold) {
|
|
1375
|
+
const reason = draftIntentHoldReason(intentHold);
|
|
1376
|
+
record({ number: draft.number, action: 'keep', reason, applied: false });
|
|
1377
|
+
try { debug.log('self-dev.draft-sweep', 'intent-hold-kept', { pr: draft.number, owner: intentHold.owner,
|
|
1378
|
+
reason: intentHold.reason, expiresAt: intentHold.expiresAt }); } catch { /* fail-soft */ }
|
|
1379
|
+
continue;
|
|
1380
|
+
}
|
|
1355
1381
|
const claimState = contradiction ? 'unclaimed' : draftClaimState(draft, now);
|
|
1356
1382
|
const isClaimed = claimState !== 'unclaimed';
|
|
1357
1383
|
const ageHours = (now.getTime() - Date.parse(draft.createdAt)) / 3_600_000;
|
|
@@ -1368,7 +1394,7 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1368
1394
|
const cellNewer = contradiction || lineageNewer ? undefined : newerSameCellDraft(draft, drafts);
|
|
1369
1395
|
const duplicateNewer = lineageNewer ?? cellNewer;
|
|
1370
1396
|
if (duplicateNewer) {
|
|
1371
|
-
const base = decideDraft({ draft, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
1397
|
+
const base = decideDraft({ draft, now, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
1372
1398
|
finalRunResult, ageHours: runStatus ? ageHours : idleHours });
|
|
1373
1399
|
if (!base.reason.startsWith('label:') && !base.reason.startsWith('superseded-by #') && !base.reason.startsWith('duplicate-of-open #')) {
|
|
1374
1400
|
const runLive = isLiveDraftRun(runStatus, draft.branch, liveBranches);
|
|
@@ -1457,7 +1483,7 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1457
1483
|
}
|
|
1458
1484
|
// An unobserved claim may still have a merged twin: liveness/holds retain their priority,
|
|
1459
1485
|
// but a superseded draft must not be hidden by the six-hour claim window.
|
|
1460
|
-
const mergedDecision = isClaimed ? decideDraft({ draft, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
1486
|
+
const mergedDecision = isClaimed ? decideDraft({ draft, now, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
1461
1487
|
finalRunResult, ageHours: idleHours }) : undefined;
|
|
1462
1488
|
const supersededClaim = mergedDecision?.reason.startsWith('superseded-by #') === true
|
|
1463
1489
|
|| mergedDecision?.reason.startsWith('duplicate-of-open #') === true;
|
|
@@ -1509,12 +1535,7 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1509
1535
|
}
|
|
1510
1536
|
continue;
|
|
1511
1537
|
}
|
|
1512
|
-
|
|
1513
|
-
if (!contradiction && !states.length && !draft.branch.startsWith('self-impl/')) {
|
|
1514
|
-
record({ number: draft.number, action: 'keep', reason: 'outside-harness', applied: false });
|
|
1515
|
-
continue;
|
|
1516
|
-
}
|
|
1517
|
-
let decision = supersededClaim ? mergedDecision! : decideDraft({ draft, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
1538
|
+
let decision = supersededClaim ? mergedDecision! : decideDraft({ draft, now, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
1518
1539
|
finalRunResult, ageHours: runStatus ? ageHours : idleHours });
|
|
1519
1540
|
const fallback = decision.reason === 'unobserved' || decision.reason === 'stale-unobserved'
|
|
1520
1541
|
|| decision.reason === 'recent' || decision.reason.startsWith('recent (') || decision.reason.startsWith('stale-ended-run');
|
|
@@ -23,12 +23,64 @@ export function draftClaimRecordLive(at: string, now: Date): boolean {
|
|
|
23
23
|
return Number.isFinite(updated) && (now.getTime() - updated) / 3_600_000 < CLAIM_IDLE_HOURS;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
export interface DraftIntentHold {
|
|
27
|
+
readonly owner: string;
|
|
28
|
+
readonly reason: string;
|
|
29
|
+
readonly expiresAt: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function inspectDraftIntentHold(body: string | undefined, now = new Date()): { hold?: DraftIntentHold; rejection?: string } {
|
|
33
|
+
if (!body || !body.includes('<!-- elanous:draft-intent-hold')) return {};
|
|
34
|
+
if (!Number.isFinite(now.getTime())) return { rejection: 'invalid-sweep-time' };
|
|
35
|
+
const matches = [...body.matchAll(/<!-- elanous:draft-intent-hold ([\s\S]*?) -->/g)];
|
|
36
|
+
const markerStarts = body.match(/<!-- elanous:draft-intent-hold\b/g) ?? [];
|
|
37
|
+
if (matches.length !== 1 || markerStarts.length !== 1) return { rejection: 'marker-count-or-termination' };
|
|
38
|
+
const raw = matches[0]![1]!;
|
|
39
|
+
let value: unknown;
|
|
40
|
+
try { value = JSON.parse(raw); } catch { return { rejection: 'invalid-json' }; }
|
|
41
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return { rejection: 'invalid-shape' };
|
|
42
|
+
const row = value as Record<string, unknown>;
|
|
43
|
+
if (Object.keys(row).length !== 3 || !Object.hasOwn(row, 'owner') || !Object.hasOwn(row, 'reason') || !Object.hasOwn(row, 'expiresAt')) {
|
|
44
|
+
return { rejection: 'invalid-fields' };
|
|
45
|
+
}
|
|
46
|
+
const { owner, reason, expiresAt } = row;
|
|
47
|
+
if (typeof owner !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(owner)
|
|
48
|
+
|| typeof reason !== 'string' || !reason.trim() || reason !== reason.trim() || reason.length > 240
|
|
49
|
+
|| /[\r\n;=]/.test(reason) || reason.includes('-->')
|
|
50
|
+
|| typeof expiresAt !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(expiresAt)) {
|
|
51
|
+
return { rejection: 'invalid-fields' };
|
|
52
|
+
}
|
|
53
|
+
// Compare against the one writer-defined field order. JSON.stringify(parsedObject) alone preserves
|
|
54
|
+
// incoming key order and would silently accept alternate serializations or duplicate keys.
|
|
55
|
+
if (JSON.stringify({ owner, reason, expiresAt }) !== raw) return { rejection: 'noncanonical-json' };
|
|
56
|
+
const expiry = Date.parse(expiresAt);
|
|
57
|
+
if (!Number.isFinite(expiry) || new Date(expiry).toISOString() !== expiresAt) return { rejection: 'invalid-expiry' };
|
|
58
|
+
if (expiry <= now.getTime()) return { rejection: 'expired' };
|
|
59
|
+
return { hold: { owner, reason: reason.trim(), expiresAt } };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Only one canonical, complete, unexpired body marker is a hold; malformed or ambiguous markers fail open to normal triage. */
|
|
63
|
+
export function parseDraftIntentHold(body: string | undefined, now = new Date()): DraftIntentHold | undefined {
|
|
64
|
+
return inspectDraftIntentHold(body, now).hold;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Diagnostic for a present but rejected hold marker; absence is not an error. */
|
|
68
|
+
export function draftIntentHoldRejection(body: string | undefined, now = new Date()): string | undefined {
|
|
69
|
+
return inspectDraftIntentHold(body, now).rejection;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function draftIntentHoldReason(hold: DraftIntentHold): string {
|
|
73
|
+
return `intent-hold owner=${hold.owner}; reason=${hold.reason}; expiresAt=${hold.expiresAt}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
26
76
|
export interface DraftTriagePr {
|
|
27
77
|
number: number;
|
|
28
78
|
title?: string;
|
|
29
79
|
branch: string;
|
|
30
80
|
labels?: readonly string[];
|
|
31
81
|
body?: string;
|
|
82
|
+
/** Last PR update (push, label, comment); absence is not an expiry timestamp. */
|
|
83
|
+
updatedAt?: string;
|
|
32
84
|
mergeCommitMessage?: string;
|
|
33
85
|
landingVerifiedComments?: readonly string[];
|
|
34
86
|
createdAt?: string;
|
|
@@ -109,7 +161,8 @@ export function assessDraftTriage(input: DraftTriageAssessmentInput): DraftTriag
|
|
|
109
161
|
const clock = now.getTime();
|
|
110
162
|
const ageHours = Number.isFinite(latestCommit) && Number.isFinite(clock) ? (clock - latestCommit) / 3_600_000 : NaN;
|
|
111
163
|
const protectedLabel = (draft.labels ?? []).find((name) => CLOSE_PROTECTED_LABELS.has(name));
|
|
112
|
-
const
|
|
164
|
+
const intentHold = parseDraftIntentHold(draft.body, now);
|
|
165
|
+
const protectedState = Boolean(protectedLabel || intentHold);
|
|
113
166
|
const running = input.runStatus === 'running' || input.runStatus === 'probable-running'
|
|
114
167
|
|| (draft.labels ?? []).includes('elanous:running');
|
|
115
168
|
const cellComplete = input.cellStatus === 'green' || input.cellStatus === 'done';
|
|
@@ -146,7 +199,8 @@ export function assessDraftTriage(input: DraftTriageAssessmentInput): DraftTriag
|
|
|
146
199
|
: { state: 'unknown', evidence: '현재 adapter는 같은 칸 병합 PR과 이 초안의 대체 관계를 증명하지 않음; follow-up 필요' },
|
|
147
200
|
'newer-same-card': { state: input.newerSameCellSameCard === undefined ? 'unknown' : input.newerSameCellSameCard ? 'yes' : 'no', evidence: `${input.newerSameCellSameCard === undefined ? '같은 칸·카드 새 draft 관계 미관측' : `same-cell-same-card-newer=${input.newerSameCellSameCard}`}; 관측 표지이며 대체 증거가 아님` },
|
|
148
201
|
'idle-48h': { state: Number.isFinite(ageHours) ? (idle48h ? 'yes' : 'no') : 'unknown', evidence: Number.isFinite(ageHours) ? `head age=${ageHours.toFixed(1)}h` : 'head commit 시각 미관측' },
|
|
149
|
-
protected: { state: protectedState ? 'yes' : 'no', evidence: protectedLabel ? `보호 표지=${protectedLabel}`
|
|
202
|
+
protected: { state: protectedState ? 'yes' : 'no', evidence: protectedLabel ? `보호 표지=${protectedLabel}`
|
|
203
|
+
: intentHold ? draftIntentHoldReason(intentHold) : '보호 표지 없음' },
|
|
150
204
|
'recent-commit': { state: Number.isFinite(latestCommit) ? (recentCommit ? 'yes' : 'no') : 'unknown', evidence: Number.isFinite(latestCommit) ? `last commit=${draft.latestCommitAt}; cutoff=09:30 KST` : 'head commit 시각 미관측' },
|
|
151
205
|
running: { state: running ? 'yes' : runNotRunning ? 'no' : 'unknown', evidence: running ? `run=${input.runStatus ?? 'elanous:running'}` : runNotRunning ? `종결 run=${input.runStatus}` : `run 상태 미관측${input.runStatus ? ` (${input.runStatus})` : ''}` },
|
|
152
206
|
'owner-confirmed': { state: input.ownerConfirmed === undefined ? 'unknown' : input.ownerConfirmed ? 'yes' : 'no', evidence: input.ownerConfirmed === undefined ? '소유자 출처 미관측' : input.ownerConfirmed ? '고유 카드 또는 활성 claim owner 확인' : '고유 소유자 없음' },
|
|
@@ -161,6 +215,7 @@ export function assessDraftTriage(input: DraftTriageAssessmentInput): DraftTriag
|
|
|
161
215
|
|
|
162
216
|
export interface DraftTriageInput {
|
|
163
217
|
draft: DraftTriagePr;
|
|
218
|
+
now?: Date;
|
|
164
219
|
runStatus: string | undefined;
|
|
165
220
|
mergedTwins: readonly DraftTriagePr[];
|
|
166
221
|
openDrafts?: readonly DraftTriagePr[];
|
|
@@ -251,10 +306,12 @@ export function harvestDeferredMarker(body: string | undefined): boolean {
|
|
|
251
306
|
&& rows.length > 0 && rows.every((value) => value === HARVEST_DEFERRED_MARKER_VALUE);
|
|
252
307
|
}
|
|
253
308
|
|
|
254
|
-
export function decideDraft({ draft, runStatus, mergedTwins, openDrafts, ageHours, liveBranches, finalRunResult }: DraftTriageInput): DraftDecision {
|
|
309
|
+
export function decideDraft({ draft, runStatus, mergedTwins, openDrafts, ageHours, liveBranches, finalRunResult, now = new Date() }: DraftTriageInput): DraftDecision {
|
|
255
310
|
// DRAFT-ZERO — a verified harvest-deferred marker is the strongest hold: it outranks protected labels
|
|
256
311
|
// and every close rule, so a failed run's harvestable draft survives the sweep for harvest.
|
|
257
312
|
if (runStatus === 'failed' && harvestDeferredMarker(draft.body)) return { action: 'keep', reason: 'harvest-deferred' };
|
|
313
|
+
const intentHold = parseDraftIntentHold(draft.body, now);
|
|
314
|
+
if (intentHold) return { action: 'keep', reason: draftIntentHoldReason(intentHold) };
|
|
258
315
|
const held = draft.labels?.find((label) => PROTECTED_LABELS.has(label));
|
|
259
316
|
if (held) return { action: 'keep', reason: `label:${held}` };
|
|
260
317
|
if (runStatus !== 'self-implement.result final' && draft.branch && liveBranches.has(draft.branch)
|
|
@@ -220,7 +220,8 @@ export function observeFrontNodeExit(exit: FrontNodeExit, data: FrontNodeExitDat
|
|
|
220
220
|
const graphRoute: JourneyRoute = { ...route, to: budget.to };
|
|
221
221
|
const taken = data.taken ?? budget.to ?? exit.outcome;
|
|
222
222
|
const reason = [budget.budgetReason, data.reason].filter((part): part is string => part !== undefined).join(' · ');
|
|
223
|
-
recordJourneyEdge(graphRoute, taken, reason.length > 0 ? reason : undefined
|
|
223
|
+
recordJourneyEdge(graphRoute, taken, reason.length > 0 ? reason : undefined,
|
|
224
|
+
data.runId === undefined ? {} : { runId: data.runId });
|
|
224
225
|
recorded = graphRoute;
|
|
225
226
|
const payload = {
|
|
226
227
|
graphId: 'self-implement',
|
|
@@ -4,6 +4,8 @@ import { applyGraphOverlays, defaultOverlaysDir, loadGraphOverlays, selectOverla
|
|
|
4
4
|
import { L1_PROTECTED_ROUTE_NODES, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
5
5
|
import { evaluateOverlayCondition } from '../self-implement/graph-overlay-condition.js';
|
|
6
6
|
import { journeyJoinFields } from './graph-journey-nodes.js';
|
|
7
|
+
import { defaultProfilesDir, loadGraphProfiles, selectGraphProfiles, type GraphProfileSpec } from '../self-implement/graph-profile-yaml.js';
|
|
8
|
+
import { appendRunLedgerEntry, runLedgerDir } from '../self-implement/run-ledger.js';
|
|
7
9
|
|
|
8
10
|
/** ⭐ HARNESS-FULL-GRAPH 2판 — 「다음 노드」를 코드가 아니라 «그래프»가 정한다.
|
|
9
11
|
*
|
|
@@ -29,11 +31,14 @@ export interface JourneyRoute {
|
|
|
29
31
|
readonly skippedNode?: string;
|
|
30
32
|
readonly skipCondition?: string;
|
|
31
33
|
readonly skippedNodes?: readonly { readonly node: string; readonly condition: string }[];
|
|
34
|
+
readonly profileIds?: readonly string[];
|
|
35
|
+
readonly profileRejections?: readonly string[];
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
/** ⛔ 캐시하지 않는다 — 여러 런을 처리하는 프로세스(데몬·대기열 tick)가 다음 발사에서 오버레이 변경을 봐야 한다.
|
|
35
39
|
* 여정 판정은 발사당 몇 번뿐이라 디렉터리 한 번 읽기가 싸다. */
|
|
36
40
|
let overlaysForTesting: readonly GraphOverlaySpec[] | undefined;
|
|
41
|
+
let profilesForTesting: readonly GraphProfileSpec[] | undefined;
|
|
37
42
|
function launchOverlays(): readonly GraphOverlaySpec[] {
|
|
38
43
|
if (overlaysForTesting !== undefined) return overlaysForTesting;
|
|
39
44
|
try { return loadGraphOverlays(defaultOverlaysDir()).overlays; }
|
|
@@ -45,21 +50,50 @@ export function setJourneyOverlaysForTesting(overlays: readonly GraphOverlaySpec
|
|
|
45
50
|
overlaysForTesting = overlays;
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
/** Test seam for a stable profile set; undefined reads the profile directory beside the graph sources. */
|
|
54
|
+
export function setJourneyProfilesForTesting(profiles: readonly GraphProfileSpec[] | undefined): void {
|
|
55
|
+
profilesForTesting = profiles;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function launchProfiles(): { readonly profiles: readonly GraphProfileSpec[]; readonly errors: readonly string[] } {
|
|
59
|
+
if (profilesForTesting !== undefined) return { profiles: profilesForTesting, errors: [] };
|
|
60
|
+
const loaded = loadGraphProfiles(defaultProfilesDir());
|
|
61
|
+
return { profiles: loaded.profiles, errors: loaded.errors.map((issue) => `${issue.path}: ${issue.message}`) };
|
|
62
|
+
}
|
|
63
|
+
|
|
48
64
|
/** 상태 값으로 고른 «이 런의 여정 선언» — 기준 YAML ⊕ 조건이 맞는 launch 오버레이. */
|
|
49
65
|
export function journeySpec(
|
|
50
66
|
state: Readonly<Record<string, unknown>>,
|
|
51
67
|
base: GraphTemplateSpec | undefined = GRAPH_SPECS['self-implement'],
|
|
52
68
|
overlays: readonly GraphOverlaySpec[] = launchOverlays(),
|
|
53
|
-
|
|
54
|
-
|
|
69
|
+
profiles: readonly GraphProfileSpec[] = launchProfiles().profiles,
|
|
70
|
+
profileLoadErrors: readonly string[] = [],
|
|
71
|
+
): { readonly spec: GraphTemplateSpec | undefined; readonly applied: readonly string[]; readonly profileIds: readonly string[]; readonly profileRejections: readonly string[] } {
|
|
72
|
+
if (base === undefined) return { spec: undefined, applied: [], profileIds: [], profileRejections: [] };
|
|
55
73
|
try {
|
|
56
|
-
const
|
|
57
|
-
|
|
74
|
+
const selection = selectGraphProfiles(profiles, state);
|
|
75
|
+
const profileIds = selection.applied.map((profile) => profile.profileId);
|
|
76
|
+
const profileOverlayIds = new Set(selection.applied.flatMap((profile) => profile.overlays));
|
|
77
|
+
const overlayRejections = [...profileOverlayIds].flatMap((id) => {
|
|
78
|
+
const overlay = overlays.find((candidate) => candidate.overlayId === id);
|
|
79
|
+
if (!overlay) return [`profile overlay not found: ${id}`];
|
|
80
|
+
if (overlay.target !== base.graphId) return [`profile overlay target mismatch: ${id} (${overlay.target})`];
|
|
81
|
+
if (overlay.stage !== 'launch') return [`profile overlay wrong stage: ${id} (${overlay.stage})`];
|
|
82
|
+
return [];
|
|
83
|
+
});
|
|
84
|
+
const profileRejections = [...profileLoadErrors, ...selection.errors, ...overlayRejections];
|
|
85
|
+
if (profileRejections.length > 0) return { spec: base, applied: [], profileIds: [], profileRejections };
|
|
86
|
+
const { applied: candidates } = selectOverlays(overlays, { graphId: base.graphId, stage: 'launch', state: selection.state });
|
|
87
|
+
const ownedState = Object.assign({}, ...selection.applied.map((profile) => profile.state));
|
|
88
|
+
const applied = candidates.filter((overlay) => !profileOverlayIds.has(overlay.overlayId)
|
|
89
|
+
|| evaluateOverlayCondition(overlay.appliesWhen, ownedState).kind === 'applies');
|
|
90
|
+
if (applied.length === 0) return { spec: base, applied: [], profileIds, profileRejections: [] };
|
|
58
91
|
const result = applyGraphOverlays(base, applied);
|
|
59
92
|
// ⛔ 거절된 오버레이는 길을 바꾸지 않는다 — 기준 선언으로 간다.
|
|
60
|
-
return result.ok ? { spec: result.template, applied: result.overlayIds
|
|
93
|
+
return result.ok ? { spec: result.template, applied: result.overlayIds, profileIds, profileRejections: [] }
|
|
94
|
+
: { spec: base, applied: [], profileIds: [], profileRejections: result.rejections.map((item) => `${item.kind}: ${item.overlayId}`) };
|
|
61
95
|
} catch {
|
|
62
|
-
return { spec: base, applied: [] };
|
|
96
|
+
return { spec: base, applied: [], profileIds: [], profileRejections: ['profile selection failed'] };
|
|
63
97
|
}
|
|
64
98
|
}
|
|
65
99
|
|
|
@@ -69,10 +103,11 @@ export function readJourneyEdge(
|
|
|
69
103
|
from: string,
|
|
70
104
|
label: string,
|
|
71
105
|
state: Readonly<Record<string, unknown>> = {},
|
|
72
|
-
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[] } = {},
|
|
106
|
+
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[]; readonly profiles?: readonly GraphProfileSpec[] } = {},
|
|
73
107
|
): JourneyRoute {
|
|
74
|
-
const
|
|
75
|
-
|
|
108
|
+
const profileSet = deps.profiles === undefined ? launchProfiles() : { profiles: deps.profiles, errors: [] as readonly string[] };
|
|
109
|
+
const { spec, applied, profileIds, profileRejections } = journeySpec(state, deps.base ?? GRAPH_SPECS['self-implement'], deps.overlays ?? launchOverlays(), profileSet.profiles, profileSet.errors);
|
|
110
|
+
let route: JourneyRoute = { from, on: null, label, to: null, source: 'code-default', overlays: applied, profileIds, profileRejections };
|
|
76
111
|
const outgoing = (spec?.edges ?? []).filter(edge => edge.from === from);
|
|
77
112
|
const protectedFrom = L1_PROTECTED_ROUTE_NODES.has(from) || spec?.nodes.some(node => node.nodeId === from && node.kind === 'gate') ||
|
|
78
113
|
spec?.terminalNodes.includes(from);
|
|
@@ -80,14 +115,14 @@ export function readJourneyEdge(
|
|
|
80
115
|
const matching = conditions.filter(({ verdict }) => verdict.kind === 'applies').map(({ edge }) => edge);
|
|
81
116
|
const unobservedConditions = conditions.filter(({ verdict }) => verdict.kind === 'key-absent').map(({ edge }) => edge.when!);
|
|
82
117
|
if (matching.length === 1 && unobservedConditions.length === 0 && matching[0]!.to !== undefined) {
|
|
83
|
-
route = { from, on: null, label, to: matching[0]!.to!, source: 'graph', overlays: applied,
|
|
118
|
+
route = { ...route, from, on: null, label, to: matching[0]!.to!, source: 'graph', overlays: applied,
|
|
84
119
|
via: 'when', condition: matching[0]!.when };
|
|
85
120
|
} else {
|
|
86
121
|
const mapped = outgoing.find(edge => edge.when === undefined && edge.map !== undefined && Object.hasOwn(edge.map, label));
|
|
87
122
|
const defaultEdge = mapped ?? outgoing.find(edge => edge.when === undefined && edge.to !== undefined);
|
|
88
|
-
if (defaultEdge?.map !== undefined) route = { from, on: defaultEdge.on ?? null, label,
|
|
123
|
+
if (defaultEdge?.map !== undefined) route = { ...route, from, on: defaultEdge.on ?? null, label,
|
|
89
124
|
to: defaultEdge.map[label]!, source: 'graph', overlays: applied, via: 'outcome' };
|
|
90
|
-
else if (defaultEdge?.to !== undefined) route = { from, on: null, label,
|
|
125
|
+
else if (defaultEdge?.to !== undefined) route = { ...route, from, on: null, label,
|
|
91
126
|
to: defaultEdge.to, source: 'graph', overlays: applied, via: 'outcome' };
|
|
92
127
|
if (matching.length > 1) route = { ...route, ambiguousConditions: matching.map(edge => edge.when!) };
|
|
93
128
|
if (unobservedConditions.length > 0) route = { ...route, unobservedConditions };
|
|
@@ -129,31 +164,51 @@ export interface JourneyEdgeFields {
|
|
|
129
164
|
readonly [key: string]: unknown;
|
|
130
165
|
}
|
|
131
166
|
|
|
167
|
+
function recordGraphPathEvent(event: string, data: Record<string, unknown>, runId?: string): void {
|
|
168
|
+
try { debug.log('graph.path', event, data); } catch { /* fail-soft */ }
|
|
169
|
+
if (!runId) return;
|
|
170
|
+
try { appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId, event: 'graph.path', data: { event, ...data } }, runLedgerDir()); }
|
|
171
|
+
catch { /* path observation must not change execution */ }
|
|
172
|
+
}
|
|
173
|
+
|
|
132
174
|
/** 실제로 탄 간선을 남긴다 — `taken` 은 실제 다음 노드(그래프 답과 다르면 `honored: false` · 그 이유를 `reason` 에). */
|
|
133
175
|
export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: string, data: JourneyEdgeFields = {}): void {
|
|
134
176
|
try {
|
|
177
|
+
const runId = typeof data.runId === 'string' ? data.runId : undefined;
|
|
178
|
+
for (const rejection of route.profileRejections ?? []) recordGraphPathEvent('profile-rejected', {
|
|
179
|
+
graphId: 'self-implement', reason: rejection, profileIds: route.profileIds ?? [],
|
|
180
|
+
...(runId === undefined ? {} : { runId }), ...journeyJoinFields(),
|
|
181
|
+
}, runId);
|
|
135
182
|
if (route.ambiguousConditions?.length) debug.log('self-implement', 'edge-ambiguous', {
|
|
136
183
|
graphId: 'self-implement', from: route.from, conditions: route.ambiguousConditions,
|
|
137
184
|
fallback: taken, ...journeyJoinFields(),
|
|
138
185
|
});
|
|
186
|
+
if (route.ambiguousConditions?.length) recordGraphPathEvent('edge-ambiguous', {
|
|
187
|
+
graphId: 'self-implement', from: route.from, conditions: route.ambiguousConditions,
|
|
188
|
+
fallback: taken, profileIds: route.profileIds ?? [], ...(runId === undefined ? {} : { runId }), ...journeyJoinFields(),
|
|
189
|
+
}, runId);
|
|
139
190
|
if (route.unobservedConditions?.length) debug.log('self-implement', 'edge-unobserved', {
|
|
140
191
|
graphId: 'self-implement', from: route.from, conditions: route.unobservedConditions,
|
|
141
192
|
fallback: taken, ...journeyJoinFields(),
|
|
142
193
|
});
|
|
143
|
-
if (route.to === taken) for (const skipped of route.skippedNodes ?? [])
|
|
144
|
-
graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
145
|
-
|
|
146
|
-
|
|
194
|
+
if (route.to === taken) for (const skipped of route.skippedNodes ?? []) {
|
|
195
|
+
const skippedData = { graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
196
|
+
profileIds: route.profileIds ?? [], ...(runId === undefined ? {} : { runId }), ...journeyJoinFields() };
|
|
197
|
+
debug.log('self-implement', 'node-skipped', skippedData);
|
|
198
|
+
recordGraphPathEvent('node-skipped', skippedData, runId);
|
|
199
|
+
}
|
|
147
200
|
// Evidence never overrides an edge field: the later spread wins. Explicit repair join keys win over ambient context.
|
|
148
201
|
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
|
|
149
|
-
runId, card, pr, head, moveId, ...evidence } = data ?? {};
|
|
150
|
-
|
|
202
|
+
runId: _reservedRunId, card, pr, head, moveId, ...evidence } = data ?? {};
|
|
203
|
+
const edgeData = {
|
|
151
204
|
...evidence, graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
152
205
|
...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
|
|
153
206
|
...(runId === undefined ? {} : { runId }), ...(card === undefined ? {} : { card }),
|
|
154
207
|
...(pr === undefined ? {} : { pr }), ...(head === undefined ? {} : { head }),
|
|
155
208
|
...(moveId === undefined ? {} : { moveId }),
|
|
156
|
-
}
|
|
209
|
+
};
|
|
210
|
+
debug.log('self-implement', 'graph-edge-taken', edgeData);
|
|
211
|
+
recordGraphPathEvent('edge-taken', edgeData, runId);
|
|
157
212
|
} catch { /* 관측은 fail-soft */ }
|
|
158
213
|
}
|
|
159
214
|
|
|
@@ -162,10 +217,10 @@ export function routeJourneyEdge(
|
|
|
162
217
|
from: string,
|
|
163
218
|
label: string,
|
|
164
219
|
state: Readonly<Record<string, unknown>> = {},
|
|
165
|
-
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[] } = {},
|
|
220
|
+
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[]; readonly profiles?: readonly GraphProfileSpec[]; readonly runId?: string } = {},
|
|
166
221
|
): JourneyRoute {
|
|
167
222
|
const route = readJourneyEdge(from, label, state, deps);
|
|
168
|
-
recordJourneyEdge(route, route.to ?? label);
|
|
223
|
+
recordJourneyEdge(route, route.to ?? label, undefined, deps.runId === undefined ? {} : { runId: deps.runId });
|
|
169
224
|
return route;
|
|
170
225
|
}
|
|
171
226
|
|
|
@@ -340,6 +340,64 @@ export interface LaunchPreflightInput {
|
|
|
340
340
|
/** AUTO-TARGET: blocker name for a NOT-GROUNDED goal whose only target paths were machine-suggested (a scope card). */
|
|
341
341
|
export const NOT_GROUNDED_SCOPE_CARD_BLOCKER = '(NOT-GROUNDED 범위 카드)';
|
|
342
342
|
|
|
343
|
+
/** CARD-TARGET-PATHS 가 읽기 전용으로 제공하는 같은-경로 카드 맥락. */
|
|
344
|
+
export interface SiblingContextCard {
|
|
345
|
+
readonly cardId: string;
|
|
346
|
+
readonly runId?: string;
|
|
347
|
+
readonly overlapPaths: readonly string[];
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function siblingContextPaths(result: LaunchPreflightResult, warning: LaunchPreflightBlocker): readonly string[] {
|
|
351
|
+
return warning.overlapPaths?.map(({ path }) => path)
|
|
352
|
+
?? result.paths.filter((path) => warning.detail.includes(path));
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function siblingContextAxis(
|
|
356
|
+
label: string,
|
|
357
|
+
status: PreflightAxisStatus,
|
|
358
|
+
entries: readonly string[],
|
|
359
|
+
): string {
|
|
360
|
+
if (status.state === 'unknown') return `[sibling-context] ${label}: 못 쟀다 (${status.reason})`;
|
|
361
|
+
if (entries.length === 0) return `[sibling-context] ${label}: 없음`;
|
|
362
|
+
const partial = status.state === 'truncated' ? ` · 부분 측정(상한 ${status.limit})` : '';
|
|
363
|
+
return `[sibling-context] ${label}: ${entries.join(' · ')}${partial}`;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** 같은 대상 경로의 비차단 형제 관측을 골 문서 머리에 넣을 정확히 세 줄로 렌더한다. */
|
|
367
|
+
export function renderSiblingContextLines(
|
|
368
|
+
result: LaunchPreflightResult,
|
|
369
|
+
cards: readonly SiblingContextCard[] = [],
|
|
370
|
+
): readonly [string, string, string] {
|
|
371
|
+
const liveRuns = result.warnings
|
|
372
|
+
.filter((warning) => warning.kind === 'live-run')
|
|
373
|
+
.map((warning) => {
|
|
374
|
+
const paths = siblingContextPaths(result, warning);
|
|
375
|
+
const cardIds = cards
|
|
376
|
+
.filter((card) => card.runId === warning.name && card.overlapPaths.some((path) => paths.includes(path)))
|
|
377
|
+
.map((card) => card.cardId);
|
|
378
|
+
return [warning.name, ...cardIds.map((cardId) => `카드 ${cardId}`), ...paths].join(' · ');
|
|
379
|
+
});
|
|
380
|
+
const openPrs = result.warnings
|
|
381
|
+
.filter((warning) => warning.kind === 'open-pr' || warning.kind === 'sibling-pr')
|
|
382
|
+
.map((warning) => {
|
|
383
|
+
const draft = /\bdraft\b|초안/u.test(warning.detail) ? ' (draft)' : '';
|
|
384
|
+
const paths = siblingContextPaths(result, warning);
|
|
385
|
+
return `${warning.name}${draft}${paths.length > 0 ? ` · ${paths.join(', ')}` : ''}`;
|
|
386
|
+
});
|
|
387
|
+
const recentLanded = result.warnings
|
|
388
|
+
.filter((warning) => warning.kind === 'recent-change' && result.paths.includes(warning.name))
|
|
389
|
+
.map((warning) => {
|
|
390
|
+
const count = /최근 \d+일 안에 (\d+)건 변경됨/u.exec(warning.detail)?.[1];
|
|
391
|
+
return `sha·PR 미상 · ${warning.name}${count === undefined ? '' : ` ${count}건`}`;
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
return [
|
|
395
|
+
siblingContextAxis('같은 경로 도는 런', result.liveRuns, liveRuns),
|
|
396
|
+
siblingContextAxis('같은 경로 열린 PR', result.openPrs, openPrs),
|
|
397
|
+
siblingContextAxis(`같은 경로 최근 ${result.recentChangeWindowDays}일 착지`, result.recentChanges, recentLanded),
|
|
398
|
+
];
|
|
399
|
+
}
|
|
400
|
+
|
|
343
401
|
export function evaluateLaunchPreflight(input: LaunchPreflightInput): LaunchPreflightResult {
|
|
344
402
|
const paths = [...new Set(input.paths.filter((path) => path.trim().length > 0))];
|
|
345
403
|
const blockers: LaunchPreflightBlocker[] = [];
|
|
@@ -1185,7 +1185,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1185
1185
|
const taskId = [...spaceIdByTask.entries()].find(([, id]) => id === input.spaceId)?.[0];
|
|
1186
1186
|
const goal = taskId ? taskByGoal.get(taskId) : undefined;
|
|
1187
1187
|
if (cancelling) throw new Error('orchestration cancelled by signal');
|
|
1188
|
-
const started = baseSpawn({ ...input, feature: dependencyOutputFeature(input.spaceId, input.feature) });
|
|
1188
|
+
const started = baseSpawn({ ...input, ...(taskId ? { taskId } : {}), feature: dependencyOutputFeature(input.spaceId, input.feature) });
|
|
1189
1189
|
if (goal && taskId) {
|
|
1190
1190
|
try { opts.onTaskLaunched?.(goal, taskId, priorByResumeKey.get(resumeKey(goal.feature))?.taskId); }
|
|
1191
1191
|
catch { /* observation must not interrupt execution */ }
|