elanous 0.2.41 → 0.2.42
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/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 1063.2fb8a9dc55c731f2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 1262.e804feb8fd1acb8c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 1487.2f67b79444062da6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
- package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
- package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 2690.0521c738b7749931.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4702.4a4adc1f16d7c93b.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9541.eb8e2f8480c7feca.js → 3285.89ee2f298682f5e5.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 3347.f846266b5e5f3ede.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1661.0dd330f3d89f73f3.js → 3837.a210d7d0db8d8abd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
- package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{1115.434ae2ecb0ad986d.js → 5112.4b9f300124fab7b3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
- package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +226 -0
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2073.689dcb2680113d76.js → 6377.bc7df239edbff244.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 6632.0eac1c554f8f2ef3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2527-5c636a43c7cc5dde.js → 7279-c199ea83f34338fa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 73d2eb0e.4966ad55293c801a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 7411.9b4b8b747dc7b802.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 8262.ddc03e06b733f184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{8050-9b364bdef8f71927.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8673-bab689a55f7e13b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5937.c2df9e3447e1f667.js → 9249.976f1e69a9d80754.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1971-7efb628c471dc5a0.js → 9353-12bfff0c130104cf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7191.fdc955f7d96064a4.js → 9415.69e4a21c60c7d2db.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 9427.96aa912ddb5801e0.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6552.a3840aa7da35ad68.js → 9832.f4a98c878ecf2c0a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -24
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- 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 +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -24
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -24
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/heal/heal-loop.yaml +1 -0
- package/graphs/overlays/stop-heal-ladder.yaml +113 -0
- package/graphs/units/verbs/recipes.yaml +11 -11
- package/graphs/work/research-report.yaml +10 -2
- package/package.json +1 -1
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/lib/decompose-ab.ts +1 -0
- package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
- package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
- package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
- package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
- package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
- package/scripts/lib/tui-regress-checks.ts +33 -13
- package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +285 -46
- package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
- package/scripts/release-loop/gate-radius-live.ts +97 -13
- package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/resume-release.ts +83 -8
- package/scripts/ux-sim.ts +18 -1
- package/scripts/warm-pool-provider-config.ts +263 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/core-turn-bridge.ts +13 -0
- package/src/agent/registry.ts +2 -0
- package/src/agent/task-notification.ts +25 -5
- package/src/agent/types.ts +6 -0
- package/src/agent-mission/mission-cli.ts +24 -0
- package/src/agent-mission/mission-out.ts +595 -0
- package/src/agent-mission/tool-install.ts +88 -2
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +178 -13
- package/src/auto-research/research-turn.ts +123 -50
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
- package/src/cli/pr-land-heavy-remote.ts +32 -0
- package/src/cli/pr-land-overlap-evidence.ts +100 -1
- package/src/cli/pr-land-pod-shadow-job.ts +60 -0
- package/src/cli/release-checklist-read-cli.ts +20 -10
- package/src/cli/research-cli.ts +4 -5
- package/src/cli/tasks-cli.ts +7 -0
- package/src/compact/auto.ts +8 -1
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/run-core-turn.ts +311 -90
- package/src/core-turn/run-goal-loop.ts +18 -0
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +149 -15
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
- package/src/dashboard/mission-cli-consumer.ts +153 -0
- package/src/dashboard/seat-boot-preamble.ts +171 -1
- package/src/dashboard/side-basic-runtime.ts +54 -1
- package/src/dashboard/sidetab-runtime.ts +90 -1
- package/src/dashboard/skill-catalog-preamble.ts +101 -0
- package/src/dashboard/skill-detection-runtime.ts +55 -15
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
- package/src/dashboard/turn-preamble.ts +53 -15
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/graph-runner/graph-cli.ts +23 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/runner.ts +1 -1
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-stop.ts +155 -11
- package/src/index.ts +34 -5
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/llm.ts +166 -8
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +13 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/pr-tool/census.ts +3 -2
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/release-loop/checklist-target-path-hint.ts +13 -0
- package/src/release-loop/checklist.ts +9 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +121 -16
- package/src/research/bloom-exemplars.ts +3 -1
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/orchestrate.ts +12 -2
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +42 -4
- package/src/self-dev/run-types.ts +4 -0
- package/src/self-implement/doctor-visit.ts +88 -0
- package/src/self-implement/goal-author.ts +326 -3
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- package/src/self-implement/headless-elanous-driver.ts +31 -2
- package/src/self-implement/heal-intake.ts +112 -4
- package/src/self-implement/heal-triage.ts +20 -0
- package/src/self-implement/host-regate.ts +27 -4
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/orchestrator.ts +126 -11
- package/src/self-implement/regate-detail.ts +38 -1
- package/src/self-implement/rework-child-provider.ts +25 -0
- package/src/self-implement/run-chart.ts +119 -0
- package/src/self-implement/run-ledger.ts +112 -11
- package/src/self-implement/run-stop.ts +188 -4
- package/src/self-implement/stop-autoheal.ts +13 -0
- package/src/session/chat.ts +38 -4
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +19 -5
- package/src/sidetab-core/visible-agent-mission.ts +186 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +30 -2
- package/src/skills/tools/omni-search.ts +67 -5
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +165 -45
- package/src/tokens.ts +35 -2
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +1 -0
- package/src/tui/entry.ts +14 -4
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- package/src/ux-sim/mock-scenario-catalog.json +41 -0
- package/src/ux-sim/mock-scenario-catalog.ts +156 -0
- package/src/ux-sim/scenario.ts +116 -23
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/grok.ts +5 -9
- package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +0 -1
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
- package/apps/pwa/out/_next/static/chunks/53aeb4ee-51c92f8d683f5220.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
- package/apps/pwa/out/_next/static/chunks/5744.b9415e18ad623100.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
- package/apps/pwa/out/_next/static/chunks/9834.63ab2bbc3153172e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/addc2b32.8c4ff8f0aefe987d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
|
@@ -6,6 +6,7 @@ import { debug } from '../debug/log.js';
|
|
|
6
6
|
import { passJourneyNode } from '../self-dev/graph-journey-nodes.js';
|
|
7
7
|
import { getUserConfig } from '../user-config.js';
|
|
8
8
|
import { psProcessStartMs, START_TOLERANCE_MS } from '../harness/harness-stop.js';
|
|
9
|
+
import { appendRunLedgerEntry, runLedgerDir } from './run-ledger.js';
|
|
9
10
|
|
|
10
11
|
export type FailureSource = 'release-run' | 'harness-run' | 'loop-tick' | 'cron';
|
|
11
12
|
|
|
@@ -14,14 +15,19 @@ export interface FailureEvent {
|
|
|
14
15
|
kind: string;
|
|
15
16
|
ref: string;
|
|
16
17
|
summary: string;
|
|
18
|
+
goalText?: string;
|
|
19
|
+
goalId?: string;
|
|
20
|
+
goalFile?: string;
|
|
21
|
+
cellKey?: string;
|
|
17
22
|
at: string;
|
|
18
23
|
}
|
|
19
24
|
|
|
20
25
|
const FOLD_WINDOW_MS = 60 * 60 * 1_000;
|
|
21
26
|
const HEAL_GRAPH = join(import.meta.dir, '../../graphs/heal/heal-loop.yaml');
|
|
22
27
|
|
|
23
|
-
type HealLoopOptions = { runId: string; input: { failureEvent: FailureEvent }; deps: { root: string } };
|
|
28
|
+
type HealLoopOptions = { runId: string; input: { failureEvent: FailureEvent; runId?: string; goal?: string; goalId?: string; goalFile?: string }; deps: { root: string } };
|
|
24
29
|
type StartHealLoop = (file: string, options: HealLoopOptions) => Promise<unknown>;
|
|
30
|
+
export type HealRelaunch = (input: { runId: string; goalText: string; goalId?: string; goalFile?: string; cellKey: string; stateRoot: string }) => Promise<unknown>;
|
|
25
31
|
|
|
26
32
|
function healRunId(event: FailureEvent): string {
|
|
27
33
|
return `heal-${createHash('sha256').update(JSON.stringify([event.source, event.ref, event.at])).digest('hex')}`;
|
|
@@ -68,7 +74,8 @@ function liveHealRuns(root: string): Set<string> {
|
|
|
68
74
|
|
|
69
75
|
/** A test process must never start the real heal loop — it spawns external grounding (10-05 load 150 incident). */
|
|
70
76
|
export async function startHealLoop(file: string, options: HealLoopOptions, env: NodeJS.ProcessEnv = process.env,
|
|
71
|
-
run: StartHealLoop = async (graph, args) => (await import('../graph-runner/runner.js')).runGraph(graph, args)
|
|
77
|
+
run: StartHealLoop = async (graph, args) => (await import('../graph-runner/runner.js')).runGraph(graph, args),
|
|
78
|
+
relaunch: HealRelaunch = runReauthoredGoal): Promise<unknown> {
|
|
72
79
|
if (env.ELANOUS_POD_NAME) {
|
|
73
80
|
debug.log('heal.intake', 'skipped-in-pod', { ref: options.input.failureEvent.ref });
|
|
74
81
|
return undefined;
|
|
@@ -112,8 +119,40 @@ export async function startHealLoop(file: string, options: HealLoopOptions, env:
|
|
|
112
119
|
if (!selected) return undefined;
|
|
113
120
|
let started = false;
|
|
114
121
|
try {
|
|
115
|
-
const result = await run(file, { runId: selected.runId, input: { failureEvent: selected.event }, deps: { root } });
|
|
122
|
+
const result = await run(file, { runId: selected.runId, input: { failureEvent: selected.event, runId: selected.event.ref, goal: selected.event.goalText, goalId: selected.event.goalId, goalFile: selected.event.goalFile }, deps: { root } });
|
|
116
123
|
started = true;
|
|
124
|
+
const request = reauthorRequest(result);
|
|
125
|
+
if (request) {
|
|
126
|
+
const cellKey = selected.event.goalId || selected.event.goalFile || selected.event.cellKey
|
|
127
|
+
|| (selected.event.goalText?.trim() ? `goal:${createHash('sha256').update(selected.event.goalText.replace(/\s+/g, ' ').trim()).digest('hex')}` : `run:${selected.event.ref}`);
|
|
128
|
+
if (!claimReauthorAttempt(root, cellKey, selected.runId)) {
|
|
129
|
+
debug.log('heal.intake', 'reauthor-already-attempted', { runId: selected.runId, goalId: selected.event.goalId ?? null });
|
|
130
|
+
return { result, reauthor: 'already-attempted' };
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
debug.log('self-dev.supervisor', 'reauthor-relaunch-requested', { runId: selected.runId, goalId: selected.event.goalId ?? null });
|
|
134
|
+
const relaunched = await relaunch({ runId: selected.event.ref, goalText: request.revisedGoal,
|
|
135
|
+
...(selected.event.goalId ? { goalId: selected.event.goalId } : {}),
|
|
136
|
+
...(selected.event.goalFile ? { goalFile: selected.event.goalFile } : {}), cellKey, stateRoot: root });
|
|
137
|
+
if (relaunched && typeof relaunched === 'object' && 'ok' in relaunched && (relaunched as { ok?: unknown }).ok !== true) {
|
|
138
|
+
const value = relaunched as { stage?: unknown; node?: unknown; outcome?: unknown };
|
|
139
|
+
throw new Error(`needs-human: reauthored run failed (${String(value.stage ?? value.node ?? value.outcome ?? 'unknown')})`);
|
|
140
|
+
}
|
|
141
|
+
appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId: selected.event.ref, event: 'reauthor-relaunch-result',
|
|
142
|
+
data: { outcome: 'started', goalId: selected.event.goalId ?? null, requestRunId: selected.runId, result: summarizeRelaunch(relaunched) } }, runLedgerDir(root));
|
|
143
|
+
return { result, reauthor: 'relaunched', relaunched };
|
|
144
|
+
} catch (error) {
|
|
145
|
+
appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId: selected.event.ref, event: 'reauthor-relaunch-result',
|
|
146
|
+
data: { outcome: 'needs-human', reason: error instanceof Error ? error.message : String(error) } }, runLedgerDir(root));
|
|
147
|
+
return { result, reauthor: 'needs-human', reason: error instanceof Error ? error.message : String(error) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const replanFailure = reauthorFailure(result);
|
|
151
|
+
if (replanFailure) {
|
|
152
|
+
appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId: selected.event.ref, event: 'reauthor-relaunch-result',
|
|
153
|
+
data: { outcome: 'needs-human', reason: replanFailure, graphRunId: selected.runId } }, runLedgerDir(root));
|
|
154
|
+
return { result, reauthor: 'needs-human', reason: replanFailure };
|
|
155
|
+
}
|
|
117
156
|
return result;
|
|
118
157
|
} finally {
|
|
119
158
|
withInboxLock(inboxPath(root), () => {
|
|
@@ -125,12 +164,81 @@ export async function startHealLoop(file: string, options: HealLoopOptions, env:
|
|
|
125
164
|
}
|
|
126
165
|
});
|
|
127
166
|
// A completed run opens a slot; a pre-ledger failure waits for the next intake rather than retrying in a tight loop.
|
|
128
|
-
if (started) void Promise.resolve().then(() => startHealLoop(file, options, env, run)).catch(error => {
|
|
167
|
+
if (started) void Promise.resolve().then(() => startHealLoop(file, options, env, run, relaunch)).catch(error => {
|
|
129
168
|
debug.log('heal.intake', 'loop-start-failed', { runId: selected.runId, error: String(error) }, { level: 'error' });
|
|
130
169
|
});
|
|
131
170
|
}
|
|
132
171
|
}
|
|
133
172
|
|
|
173
|
+
function graphOutput(result: unknown, nodeId: string): Record<string, unknown> | undefined {
|
|
174
|
+
if (!result || typeof result !== 'object') return undefined;
|
|
175
|
+
const nodes = (result as { nodes?: unknown }).nodes;
|
|
176
|
+
if (!Array.isArray(nodes)) return undefined;
|
|
177
|
+
const node = nodes.find((item) => item && typeof item === 'object' && (item as { nodeId?: unknown }).nodeId === nodeId) as { output?: unknown } | undefined;
|
|
178
|
+
if (typeof node?.output === 'string') {
|
|
179
|
+
const text = node.output.trim().split(/\r?\n/).at(-1) ?? '';
|
|
180
|
+
try { return JSON.parse(text) as Record<string, unknown>; } catch { return undefined; }
|
|
181
|
+
}
|
|
182
|
+
return node?.output && typeof node.output === 'object' ? node.output as Record<string, unknown> : undefined;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function reauthorRequest(result: unknown): { revisedGoal: string } | undefined {
|
|
186
|
+
const output = graphOutput(result, 'replan');
|
|
187
|
+
return output?.outcome === 'ok' && output.reauthor === true && typeof output.revisedGoal === 'string' && output.revisedGoal.trim()
|
|
188
|
+
? { revisedGoal: output.revisedGoal } : undefined;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function reauthorFailure(result: unknown): string | undefined {
|
|
192
|
+
const output = graphOutput(result, 'replan');
|
|
193
|
+
return output?.outcome === 'fail' && output.needsHuman === true
|
|
194
|
+
? (typeof output.reason === 'string' ? output.reason : 'reauthor could not produce a safe revised goal') : undefined;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function claimReauthorAttempt(root: string, cellKey: string, runId: string): boolean {
|
|
198
|
+
const path = join(root, 'heal', 'reauthor-attempts', `${createHash('sha256').update(cellKey).digest('hex')}.json`);
|
|
199
|
+
return withInboxLock(path, () => {
|
|
200
|
+
if (existsSync(path)) return false;
|
|
201
|
+
writeFileSync(path, JSON.stringify({ cellKey, runId, claimedAt: new Date().toISOString() }), { flag: 'wx', mode: 0o600 });
|
|
202
|
+
return true;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function summarizeRelaunch(result: unknown): Record<string, unknown> {
|
|
207
|
+
if (!result || typeof result !== 'object') return { resultType: typeof result };
|
|
208
|
+
const value = result as Record<string, unknown>;
|
|
209
|
+
return Object.fromEntries(['ok', 'stage', 'node', 'runId', 'worktreePath', 'branch', 'detail'].flatMap((key) => key in value ? [[key, value[key]]] : []));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function runReauthoredGoal(input: Parameters<HealRelaunch>[0]): Promise<unknown> {
|
|
213
|
+
const [{ runSelfImplement, readQuotaExhausted }, { defaultSeams }, devCli, { reselectChildForRework }, { resolveGrokCredential }, { inspectCodexRotation }, ledger] = await Promise.all([
|
|
214
|
+
import('./orchestrator.js'), import('./seams.js'), import('../self-dev/dev-cli.js'), import('./rework-child-provider.js'),
|
|
215
|
+
import('../grok/credential.js'), import('../oauth/codex-account-store.js'), import('./run-ledger.js'),
|
|
216
|
+
]);
|
|
217
|
+
let childLlm = devCli.buildChildLlmSelection({});
|
|
218
|
+
if (childLlm?.provider === 'grok') {
|
|
219
|
+
const grokQuota = devCli.readGrokQuotaForLaunch();
|
|
220
|
+
const grokCredential = resolveGrokCredential() ? 'available' as const : 'unavailable' as const;
|
|
221
|
+
const rotation = inspectCodexRotation();
|
|
222
|
+
const quota = readQuotaExhausted(inspectCodexRotation, 'openai-codex');
|
|
223
|
+
const hasCodex = rotation.knownAccountCount > 0;
|
|
224
|
+
const alternate = hasCodex ? { provider: 'openai-codex', model: devCli.defaultChildLlmModel('openai-codex'), source: 'config' as const } : undefined;
|
|
225
|
+
const decision = reselectChildForRework({ current: childLlm, grokQuota, grokCredential, ...(alternate ? { alternate } : {}),
|
|
226
|
+
alternateCredential: hasCodex ? 'available' : 'unavailable', alternateQuotaExhausted: quota.exhausted });
|
|
227
|
+
if (decision.action === 'reselect') {
|
|
228
|
+
childLlm = decision.selection;
|
|
229
|
+
ledger.appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId: input.runId, event: 'rework-child-model-reselected',
|
|
230
|
+
data: { previousProvider: decision.previous.provider, previousModel: decision.previous.model, provider: childLlm.provider,
|
|
231
|
+
model: childLlm.model, reason: decision.reason, quota: grokQuota, grokCredential,
|
|
232
|
+
alternateQuotaExhausted: quota.exhausted ?? null } }, runLedgerDir(input.stateRoot));
|
|
233
|
+
}
|
|
234
|
+
else if (grokQuota === 'exhausted' || grokCredential === 'unavailable') throw new Error('needs-human: Grok unusable and no measured alternate provider');
|
|
235
|
+
}
|
|
236
|
+
const runId = `reauthor-${createHash('sha256').update(`${input.runId}\0${input.goalId ?? ''}`).digest('hex').slice(0, 20)}`;
|
|
237
|
+
return runSelfImplement({ feature: input.goalText, runId, ...(input.goalId ? { goalId: input.goalId } : {}),
|
|
238
|
+
...(input.goalFile ? { goalFile: input.goalFile } : {}), healCellKey: input.cellKey, ...(childLlm ? { childLlm } : {}),
|
|
239
|
+
completion: 'worktree-only', draft: true, maxReworkRounds: 0, seams: defaultSeams({ stateDir: input.stateRoot }) });
|
|
240
|
+
}
|
|
241
|
+
|
|
134
242
|
function inboxPath(root: string): string {
|
|
135
243
|
return join(root, 'heal', 'inbox.jsonl');
|
|
136
244
|
}
|
|
@@ -11,6 +11,7 @@ export type HealTriageOutcome =
|
|
|
11
11
|
| 'needs-deeper-observation'
|
|
12
12
|
| 'needs-grounding'
|
|
13
13
|
| 'rework-with-citations'
|
|
14
|
+
| 'reauthor-from-materialized'
|
|
14
15
|
| 'exhausted';
|
|
15
16
|
|
|
16
17
|
export interface HealCitation {
|
|
@@ -30,6 +31,12 @@ export interface HealFailureSignature {
|
|
|
30
31
|
readonly importerUnrunTests?: number;
|
|
31
32
|
readonly environmentClaim?: string;
|
|
32
33
|
readonly namedSource?: string;
|
|
34
|
+
/** Observations from the failed materialized run; no new collector is implied. */
|
|
35
|
+
readonly noProgressReason?: string;
|
|
36
|
+
readonly reportDeficit?: boolean;
|
|
37
|
+
readonly mustFix?: readonly string[];
|
|
38
|
+
readonly materializedPaths?: readonly string[];
|
|
39
|
+
readonly goalText?: string;
|
|
33
40
|
}
|
|
34
41
|
|
|
35
42
|
/** 게이트 사실로 채울 수 있는 칸. 없는 칸만 채운다. */
|
|
@@ -227,6 +234,19 @@ export function triageFailure(signature: HealFailureSignature, history?: HealTri
|
|
|
227
234
|
const importer = signature.importerUnrunTests ?? 0;
|
|
228
235
|
const claim = signature.environmentClaim?.trim() ?? '';
|
|
229
236
|
|
|
237
|
+
const mustFix = (signature.mustFix ?? []).map((item) => item.trim()).filter(Boolean);
|
|
238
|
+
const repeatedMustFix = mustFix.some((item, index) => mustFix.slice(0, index).includes(item));
|
|
239
|
+
if (signature.noProgressReason?.trim() || signature.reportDeficit || signature.materializedPaths?.length === 0
|
|
240
|
+
|| repeatedMustFix || (signature.errorText ?? '').includes('tdd-evidence-missing')) {
|
|
241
|
+
return { outcome: 'reauthor-from-materialized', evidence: [
|
|
242
|
+
...(signature.noProgressReason ? [`no-progress: ${signature.noProgressReason}`] : []),
|
|
243
|
+
...(signature.reportDeficit ? ['report-deficit'] : []),
|
|
244
|
+
...(signature.materializedPaths?.length === 0 ? ['actual target paths: 0'] : []),
|
|
245
|
+
...(repeatedMustFix ? ['same must-fix repeated'] : []),
|
|
246
|
+
...((signature.errorText ?? '').includes('tdd-evidence-missing') ? ['tdd-evidence-missing'] : []),
|
|
247
|
+
] };
|
|
248
|
+
}
|
|
249
|
+
|
|
230
250
|
if (claim && ENVIRONMENT_CLAIM.test(claim) && !visited(history, 'verify-evidence')) {
|
|
231
251
|
return {
|
|
232
252
|
outcome: 'environment-claimed',
|
|
@@ -12,7 +12,7 @@ import { detectTestInterference, failedNamesFromStreams, parseFailureCount, runB
|
|
|
12
12
|
import { MAX_INSPECTED_TEST_FILES, runTestInterferenceGate } from '../../scripts/ci-test-interference-gate.js';
|
|
13
13
|
import { pwaGraph, pwaReach } from '../../scripts/ci-pwa-build-gate.js';
|
|
14
14
|
import { changedPathPairs, changedTsFiles, readGitFile, requiredExportFieldsInChanges } from '../../scripts/ci-typecheck-changed.js';
|
|
15
|
-
import { classifyMergeFailure, clipRegateDetail, parseConflictFiles, type HostRegateFailure } from './regate-detail.js';
|
|
15
|
+
import { classifyMergeFailure, clipRegateDetail, parseConflictFiles, type HostRegateFailure, type HostRegatePrHeadFailureCondition, type HostRegatePrHeadSnapshot } from './regate-detail.js';
|
|
16
16
|
import { buildImporterTestIndex, isTestPath } from './importer-test-index.js';
|
|
17
17
|
import type { GateReceipt, GateReceiptIdentity } from './gate-receipt-registry.js';
|
|
18
18
|
|
|
@@ -386,9 +386,32 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
386
386
|
release = await (deps.acquire ?? acquireSlot)(input.repoRoot);
|
|
387
387
|
type PrView = { headRefOid?: string; baseRefName?: string; baseRefOid?: string; state?: string; isDraft?: boolean };
|
|
388
388
|
const readPr = (): PrView => JSON.parse(run('gh', ['pr', 'view', String(input.prNumber), '--json', 'headRefOid,baseRefName,baseRefOid,state,isDraft'], input.repoRoot));
|
|
389
|
-
const prHeadFailure = (seen: PrView): HostRegateResult =>
|
|
390
|
-
|
|
391
|
-
|
|
389
|
+
const prHeadFailure = (seen: PrView): HostRegateResult => {
|
|
390
|
+
const failedConditions: HostRegatePrHeadFailureCondition[] = [];
|
|
391
|
+
const validHead = typeof seen.headRefOid === 'string' && /^[0-9a-f]{40}$/i.test(seen.headRefOid);
|
|
392
|
+
if (!validHead) failedConditions.push('head-unavailable');
|
|
393
|
+
else if (seen.headRefOid !== input.headCommit) failedConditions.push('head-mismatch');
|
|
394
|
+
if (typeof seen.state !== 'string') failedConditions.push('state-unavailable');
|
|
395
|
+
else if (seen.state !== 'OPEN') failedConditions.push('state-not-open');
|
|
396
|
+
if (typeof seen.isDraft !== 'boolean') failedConditions.push('draft-status-unavailable');
|
|
397
|
+
else if (seen.isDraft && !input.allowDraft) failedConditions.push('pr-is-draft');
|
|
398
|
+
if (!seen.baseRefName) failedConditions.push('base-name-unavailable');
|
|
399
|
+
const validBaseOid = typeof seen.baseRefOid === 'string' && /^[0-9a-f]{40}$/i.test(seen.baseRefOid);
|
|
400
|
+
if (!validBaseOid) failedConditions.push('base-oid-invalid');
|
|
401
|
+
failedConditions.sort();
|
|
402
|
+
const state: HostRegatePrHeadSnapshot['state'] =
|
|
403
|
+
seen.state === 'OPEN' || seen.state === 'CLOSED' || seen.state === 'MERGED' ? seen.state : typeof seen.state === 'string' ? 'OTHER' : null;
|
|
404
|
+
const snapshot: HostRegatePrHeadSnapshot = {
|
|
405
|
+
headRefOid: validHead ? seen.headRefOid! : null,
|
|
406
|
+
state,
|
|
407
|
+
isDraft: typeof seen.isDraft === 'boolean' ? seen.isDraft : null,
|
|
408
|
+
baseRefName: !seen.baseRefName ? null : seen.baseRefName === 'main' ? 'main' : 'other',
|
|
409
|
+
baseRefOid: validBaseOid ? seen.baseRefOid! : null,
|
|
410
|
+
};
|
|
411
|
+
return result('unmeasured', 'pr-head',
|
|
412
|
+
`PR head preflight failed: ${failedConditions.join(', ') || 'unknown'} (state=${snapshot.state ?? 'unknown'} · isDraft=${String(snapshot.isDraft)} · base=${snapshot.baseRefName ?? 'unknown'}@${snapshot.baseRefOid ?? 'unknown'})`,
|
|
413
|
+
{ expectedHead: input.headCommit, actualHead: snapshot.headRefOid, failedConditions, prHeadSnapshot: snapshot });
|
|
414
|
+
};
|
|
392
415
|
let view: PrView;
|
|
393
416
|
try { view = readPr(); }
|
|
394
417
|
catch (e) { return result('unmeasured', 'pr-view', String(e)); }
|
|
@@ -18,6 +18,11 @@ export type TrainObservation = {
|
|
|
18
18
|
export type TrainGit = (args: readonly string[], repo: string) => { status: number | null; stdout: string; stderr: string };
|
|
19
19
|
export type TangledPair = { first: number; then: number; failures: number };
|
|
20
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Same PR-number axis as TrainDeferred.with and planTrain overlap deferrals: normalize each sibling
|
|
23
|
+
* pair ({5,7}={7,5}), count its conflict-resolution/regate failures, and return only pairs at or
|
|
24
|
+
* above threshold (default 2) — first = smaller number = lands first, then = re-synced later.
|
|
25
|
+
*/
|
|
21
26
|
export function tangledPairs(
|
|
22
27
|
failures: readonly { pr: number; with: number }[],
|
|
23
28
|
{ threshold = 2 }: { threshold?: number } = {},
|
|
@@ -106,11 +106,12 @@ export function formatAutoMergeSuccessMessage(input: {
|
|
|
106
106
|
import { GoalRunStore, insertGoalRunRecord, type GoalPriorRuns } from './goal-run-store.js';
|
|
107
107
|
import { writeGoalRunRecordFragment } from './goal-execution-records.js';
|
|
108
108
|
import { getUserConfig } from '../user-config.js';
|
|
109
|
-
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
110
|
-
import { classifyMergeHoldStop, classifyTerminalHarnessFailure, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
109
|
+
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, runLedgerDir, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
110
|
+
import { buildRunStopTerminalEvidence, classifyMergeHoldStop, classifyTerminalHarnessFailure, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
111
111
|
import { autohealFromStop, parseAutohealMode, pickAutohealAction, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
112
112
|
import { operationalAutohealActions } from './stop-autoheal-operational.js';
|
|
113
|
-
import { recordParentNeedsOwnerVisit } from './doctor-visit.js';
|
|
113
|
+
import { recordParentNeedsOwnerVisit, runDoctorHandoff } from './doctor-visit.js';
|
|
114
|
+
import { readRunChart, recordRunChartDecision, RUN_DOCTOR_HANDOFF_INPUT_PREFIX } from './run-chart.js';
|
|
114
115
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
115
116
|
import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
|
|
116
117
|
import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
@@ -356,6 +357,9 @@ import {
|
|
|
356
357
|
} from '../ask-user-question/tool.js';
|
|
357
358
|
import { acquireClarificationResolverLease, decideClarificationResolverInstall } from './clarification-resolver-lease.js';
|
|
358
359
|
import { inspectCodexRotation } from '../oauth/codex-account-store.js';
|
|
360
|
+
import { resolveGrokCredential } from '../grok/credential.js';
|
|
361
|
+
import { resolveChildLlmPreference } from './child-llm-preference.js';
|
|
362
|
+
import { reselectChildForRework } from './rework-child-provider.js';
|
|
359
363
|
import { resolveDefaultProvider } from '../llm.js';
|
|
360
364
|
import { createWidgetAskUserResolver } from '../expression/widget/adapters/ask-user-resolver.js';
|
|
361
365
|
import { createNodeReadlineHost } from '../expression/widget/readline-host.js';
|
|
@@ -1077,6 +1081,8 @@ export interface SelfImplementSeams {
|
|
|
1077
1081
|
emitContextEvent?: (input: SessionEventInput) => void;
|
|
1078
1082
|
/** Registers this run as an ephemeral loop-agent asset; failures are observed but never affect execution. */
|
|
1079
1083
|
registerLoopAgent?: (input: LoopAgentInput) => void;
|
|
1084
|
+
/** Executes a persisted run-doctor supervisor handoff; injectable to verify the parent delivery route. */
|
|
1085
|
+
runDoctorHandoff?: typeof runDoctorHandoff;
|
|
1080
1086
|
/** Wraps implementation and gate promises with their effective wall-clock timeout; tests observe the actual stage budgets. */
|
|
1081
1087
|
withStepTimeout?: <T>(promise: Promise<T>, ms: number, step: keyof StepTimeouts) => Promise<T>;
|
|
1082
1088
|
/** Samples the one-minute machine load at the end of a gate observation. */
|
|
@@ -2208,6 +2214,8 @@ export interface SelfImplementOptions {
|
|
|
2208
2214
|
runId?: string;
|
|
2209
2215
|
/** Authored goal document's stable identity, carried into self-implement observations when present. */
|
|
2210
2216
|
goalId?: string;
|
|
2217
|
+
/** Stable heal-cell identity propagated across supervisor reauthor retries. */
|
|
2218
|
+
healCellKey?: string;
|
|
2211
2219
|
/** Optional opaque ID for joining this request with correlated execution records. */
|
|
2212
2220
|
correlationId?: string;
|
|
2213
2221
|
/** Optional opaque ID for the parent correlation in a nested request. */
|
|
@@ -3580,6 +3588,9 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3580
3588
|
try {
|
|
3581
3589
|
const record = readRunStopRecord(stopEntry);
|
|
3582
3590
|
if (!record) return;
|
|
3591
|
+
const chartDir = runLedgerDir();
|
|
3592
|
+
const chartBefore = readRunChart(stopEntry.runId, 'macrophage', chartDir);
|
|
3593
|
+
const chartStopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
|
|
3583
3594
|
try { debug.log('harness.heal', 'symptom', { runId: stopEntry.runId, class: record.class, cause: record.cause, evidenceRef: record.evidenceRef }); } catch { /* observation is fail-soft */ }
|
|
3584
3595
|
const pick = pickAutohealAction(record.class);
|
|
3585
3596
|
try { debug.log('harness.heal', 'prescription', { runId: stopEntry.runId, class: record.class, action: pick.action, source: pick.source, ...(pick.overlayId ? { overlayId: pick.overlayId } : {}) }); } catch { /* observation is fail-soft */ }
|
|
@@ -3596,10 +3607,13 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3596
3607
|
...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
|
|
3597
3608
|
});
|
|
3598
3609
|
try { debug.log('harness.heal', 'outcome', { runId: stopEntry.runId, class: result.class, action: result.action, mode: result.mode, outcome: result.outcome, ...(result.reason ? { reason: result.reason } : {}), ...(result.detail ? { detail: result.detail } : {}) }); } catch { /* observation is fail-soft */ }
|
|
3610
|
+
recordRunChartDecision({ runId: stopEntry.runId, device: 'macrophage', stopKey: chartStopKey,
|
|
3611
|
+
observed: `${record.class}: ${record.cause}`, verdict: result.action, action: result.outcome,
|
|
3612
|
+
handoff: result.action === 'needs-owner' ? 'outer-supervisor' : null,
|
|
3613
|
+
why: result.reason ?? result.detail ?? record.cause, readStopKeys: chartBefore.map((cell) => cell.stopKey), dir: chartDir });
|
|
3599
3614
|
if (result.action === 'needs-owner') {
|
|
3600
3615
|
try {
|
|
3601
|
-
const
|
|
3602
|
-
const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey, evidence: result.reason ?? record.cause });
|
|
3616
|
+
const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey: chartStopKey, evidence: result.reason ?? record.cause });
|
|
3603
3617
|
if (visit.status === 'missing-ledger') {
|
|
3604
3618
|
debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: 'run-ledger-missing' });
|
|
3605
3619
|
}
|
|
@@ -3626,11 +3640,23 @@ async function dispatchTerminalHarnessHeal(input: {
|
|
|
3626
3640
|
if (runStopRecorded(runId)) return;
|
|
3627
3641
|
const stopClass = mergeHeld ? classifyMergeHoldStop(result.mergeReason) : classifyTerminalHarnessFailure({
|
|
3628
3642
|
stage: result.stage,
|
|
3643
|
+
cause: result.detail,
|
|
3629
3644
|
mergeReason: result.mergeReason,
|
|
3630
3645
|
abandonedClassification: result.abandonedClassification?.classification,
|
|
3631
3646
|
providerErrorCategory: result.providerErrors?.category,
|
|
3632
3647
|
supervisorVerdict: result.supervisorVerdict,
|
|
3633
3648
|
});
|
|
3649
|
+
let priorLedger: RunLedgerEntry[] = [];
|
|
3650
|
+
try { priorLedger = loadRunLedger(runId) ?? []; } catch { /* terminal observation must not change the run result */ }
|
|
3651
|
+
const terminalEvidence = buildRunStopTerminalEvidence({
|
|
3652
|
+
stage: result.stage,
|
|
3653
|
+
node: result.node,
|
|
3654
|
+
outcome: result.outcome,
|
|
3655
|
+
detail: result.detail,
|
|
3656
|
+
terminationReason: result.terminationReason,
|
|
3657
|
+
providerErrorCategory: result.providerErrors?.category,
|
|
3658
|
+
entries: priorLedger,
|
|
3659
|
+
});
|
|
3634
3660
|
let stopEntry: RunLedgerEntry | undefined;
|
|
3635
3661
|
try {
|
|
3636
3662
|
stopEntry = recordRunStop({
|
|
@@ -3639,9 +3665,11 @@ async function dispatchTerminalHarnessHeal(input: {
|
|
|
3639
3665
|
shardIdentity,
|
|
3640
3666
|
site: mergeHeld ? 'merge-hold' : `terminal-${result.stage}`,
|
|
3641
3667
|
class: stopClass,
|
|
3642
|
-
|
|
3668
|
+
// Never copy free-form provider/child text into the durable stop summary.
|
|
3669
|
+
cause: mergeHeld ? `merge held: ${result.mergeReason}` : `terminal failure: ${result.stage}; ${terminalEvidence.reasonCode}`,
|
|
3643
3670
|
evidenceRef: result.prUrl ?? `run-ledger:${runId}:${result.stage}`,
|
|
3644
3671
|
nextMove: `Existing heal ladder: ${stopClass}; failure disposition remains until its prescribed action resolves`,
|
|
3672
|
+
terminalEvidence,
|
|
3645
3673
|
}, seams.writeRunLedger ?? appendRunLedgerEntry);
|
|
3646
3674
|
} catch { /* stop observation cannot change the run outcome */ }
|
|
3647
3675
|
if (stopEntry) await autohealRecordedStop(stopEntry, seams);
|
|
@@ -4661,6 +4689,10 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4661
4689
|
summary: reworkCap
|
|
4662
4690
|
? reworkCapFailureSummary(opts.feature, reworkCap)
|
|
4663
4691
|
: opts.feature.split(/\r?\n/, 1)[0]?.trim() || `Harness run ${runId} failed`,
|
|
4692
|
+
goalText: opts.feature,
|
|
4693
|
+
...(opts.goalId ? { goalId: opts.goalId } : {}),
|
|
4694
|
+
...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
|
|
4695
|
+
...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}),
|
|
4664
4696
|
at: new Date().toISOString(),
|
|
4665
4697
|
});
|
|
4666
4698
|
}
|
|
@@ -6112,6 +6144,7 @@ async function runSelfImplementInner(
|
|
|
6112
6144
|
};
|
|
6113
6145
|
let preservationBase = wt.resolvedBase;
|
|
6114
6146
|
const runProviderName = opts.childLlm?.provider ?? (s.currentProviderName?.() ?? currentProviderName());
|
|
6147
|
+
let activeChildLlm = opts.childLlm;
|
|
6115
6148
|
let cachedQuotaExhaustionAssessment: QuotaExhaustionAssessment | undefined;
|
|
6116
6149
|
const quotaExhaustionAssessmentForRun = (): QuotaExhaustionAssessment => {
|
|
6117
6150
|
cachedQuotaExhaustionAssessment ??= readQuotaExhausted(s.inspectCodexRotation, runProviderName);
|
|
@@ -7240,7 +7273,38 @@ async function runSelfImplementInner(
|
|
|
7240
7273
|
if (fabricObservation) observe('rework-budget-fabric-shadow', fabricObservation);
|
|
7241
7274
|
}
|
|
7242
7275
|
} catch (error) {
|
|
7243
|
-
if (judgmentStarted)
|
|
7276
|
+
if (judgmentStarted) {
|
|
7277
|
+
const failureKind = classifyReviewProviderFailure(safeErrorDescription(error));
|
|
7278
|
+
if (failureKind === 'credentials-unavailable') {
|
|
7279
|
+
const blockedStage = isReviewRework(reworkKind) ? 'review-blocked' : 'gate-failed';
|
|
7280
|
+
const reason = 'rework skipped: provider credentials unavailable';
|
|
7281
|
+
observe('rework-skipped-provider-unavailable', { round, kind: reworkKind, reason: failureKind }, { level: 'warn' });
|
|
7282
|
+
finalizeSupervisorDeliveries('rework-provider-credentials-unavailable');
|
|
7283
|
+
if (blockedStage === 'review-blocked') recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
|
|
7284
|
+
const pr = await preserveBlockedArtifacts({
|
|
7285
|
+
stage: blockedStage,
|
|
7286
|
+
reason,
|
|
7287
|
+
gate,
|
|
7288
|
+
failureKind,
|
|
7289
|
+
salvageStatusExpected: false,
|
|
7290
|
+
});
|
|
7291
|
+
const common = {
|
|
7292
|
+
ok: false as const,
|
|
7293
|
+
node: 'rework' as const,
|
|
7294
|
+
...resolveRunOutcome({ termination: 'abandoned' }),
|
|
7295
|
+
sessionId,
|
|
7296
|
+
worktreePath: wt.path,
|
|
7297
|
+
branch: wt.branch,
|
|
7298
|
+
gate,
|
|
7299
|
+
...(review ? { review } : {}),
|
|
7300
|
+
quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
|
|
7301
|
+
};
|
|
7302
|
+
return blockedStage === 'review-blocked'
|
|
7303
|
+
? { ...common, ...reviewBlockedResult(pr), detail: reason }
|
|
7304
|
+
: { ...common, stage: 'gate-failed' as const, ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
|
|
7305
|
+
}
|
|
7306
|
+
throw error;
|
|
7307
|
+
}
|
|
7244
7308
|
consecutiveUnresolvedBudget = 0;
|
|
7245
7309
|
}
|
|
7246
7310
|
} else if (round > 0) {
|
|
@@ -7513,6 +7577,29 @@ async function runSelfImplementInner(
|
|
|
7513
7577
|
let supervisorInputClosed = false;
|
|
7514
7578
|
const closeSupervisorInput = (): void => { supervisorInputClosed = true; };
|
|
7515
7579
|
try {
|
|
7580
|
+
if (round > 0 && activeChildLlm?.provider === 'grok') {
|
|
7581
|
+
const { readGrokQuotaForLaunch, defaultChildLlmModel } = await import('../self-dev/dev-cli.js');
|
|
7582
|
+
const grokQuota = readGrokQuotaForLaunch();
|
|
7583
|
+
const grokCredential = resolveGrokCredential() ? 'available' as const : 'unavailable' as const;
|
|
7584
|
+
let codexRotation: ReturnType<typeof inspectCodexRotation> | undefined;
|
|
7585
|
+
try { codexRotation = (s.inspectCodexRotation ?? inspectCodexRotation)(); } catch { codexRotation = undefined; }
|
|
7586
|
+
const preference = resolveChildLlmPreference(getUserConfig());
|
|
7587
|
+
const alternateSlot = preference.chain.find((slot) => slot.provider === 'openai-codex' && slot.provider !== activeChildLlm!.provider);
|
|
7588
|
+
const hasCodexCredential = (codexRotation?.knownAccountCount ?? 0) > 0;
|
|
7589
|
+
const codexQuota = readQuotaExhausted(s.inspectCodexRotation, 'openai-codex');
|
|
7590
|
+
const alternate = hasCodexCredential ? {
|
|
7591
|
+
provider: 'openai-codex', model: alternateSlot?.model ?? defaultChildLlmModel('openai-codex'), source: 'config' as const,
|
|
7592
|
+
} : undefined;
|
|
7593
|
+
const decision = reselectChildForRework({ current: activeChildLlm, grokQuota, grokCredential,
|
|
7594
|
+
...(alternate ? { alternate } : {}), alternateCredential: hasCodexCredential ? 'available' : 'unavailable',
|
|
7595
|
+
alternateQuotaExhausted: codexQuota.exhausted });
|
|
7596
|
+
if (decision.action === 'reselect') {
|
|
7597
|
+
activeChildLlm = decision.selection;
|
|
7598
|
+
observe('rework-child-model-reselected', { round, previousProvider: decision.previous.provider, previousModel: decision.previous.model,
|
|
7599
|
+
provider: activeChildLlm.provider, model: activeChildLlm.model, reason: decision.reason, quota: grokQuota,
|
|
7600
|
+
grokCredential, alternateQuotaExhausted: codexQuota.exhausted ?? null });
|
|
7601
|
+
}
|
|
7602
|
+
}
|
|
7516
7603
|
implementPromise = s.implement({
|
|
7517
7604
|
sessionId, cwd: wt.path, feature, runId, shardIdentity, signal: implementAbortController.signal,
|
|
7518
7605
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
@@ -7525,6 +7612,31 @@ async function runSelfImplementInner(
|
|
|
7525
7612
|
updateDelivery?.('not-delivered', 'empty-supervisor-input');
|
|
7526
7613
|
return;
|
|
7527
7614
|
}
|
|
7615
|
+
if (normalized.startsWith(RUN_DOCTOR_HANDOFF_INPUT_PREFIX)) {
|
|
7616
|
+
const runIdMatch = /(?:^|\s)runId=([^\s]+)/u.exec(normalized);
|
|
7617
|
+
const stopKeyMatch = /(?:^|\s)stopKey=([^\s]+)/u.exec(normalized);
|
|
7618
|
+
if (!runIdMatch?.[1] || runIdMatch[1] !== runId || !stopKeyMatch?.[1]) {
|
|
7619
|
+
updateDelivery?.('not-delivered', 'invalid-run-doctor-handoff');
|
|
7620
|
+
return;
|
|
7621
|
+
}
|
|
7622
|
+
void (s.runDoctorHandoff ?? runDoctorHandoff)({ runId, stopKey: stopKeyMatch[1], dir: runLedgerDir(elanousStateRoot() || undefined),
|
|
7623
|
+
dispatch: (action, handoff) => {
|
|
7624
|
+
if (action !== 'reauthor-from-materialized') return { outcome: 'needs-human', detail: `prescription executor not wired: ${action}` };
|
|
7625
|
+
const accepted = recordFailureEvent({ source: 'harness-run', kind: 'run-supervisor-wait-streak', ref: runId,
|
|
7626
|
+
summary: `[implement aborted] run-supervisor wait streak ${String(handoff.waitCount ?? 'unknown')} · doctor reauthor handoff`,
|
|
7627
|
+
goalText: feature, ...(opts.goalId ? { goalId: opts.goalId } : {}), ...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
|
|
7628
|
+
...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}), at: new Date().toISOString() });
|
|
7629
|
+
return { outcome: accepted.folded ? 'heal-event-already-present' : 'heal-graph-requested',
|
|
7630
|
+
detail: accepted.folded ? 'same-run heal event already recorded' : 'PR1 heal intake accepted the materialized reauthor action' };
|
|
7631
|
+
},
|
|
7632
|
+
}).then((result) => {
|
|
7633
|
+
updateDelivery?.(result.status === 'acted' || result.status === 'already-acted' ? 'delivered' : 'not-delivered',
|
|
7634
|
+
result.status === 'needs-human' ? result.outcome : result.status === 'missing-handoff' ? 'run-chart-handoff-missing' : undefined);
|
|
7635
|
+
}).catch((error: unknown) => {
|
|
7636
|
+
updateDelivery?.('not-delivered', error instanceof Error ? error.message.slice(0, 120) : String(error).slice(0, 120));
|
|
7637
|
+
});
|
|
7638
|
+
return;
|
|
7639
|
+
}
|
|
7528
7640
|
if (supervisorInputClosed) {
|
|
7529
7641
|
recordUndeliveredSupervisorInput(normalized, 'late-supervisor-input');
|
|
7530
7642
|
updateDelivery?.('not-delivered', 'late-supervisor-input');
|
|
@@ -7540,7 +7652,7 @@ async function runSelfImplementInner(
|
|
|
7540
7652
|
supervisorDeliveryUpdates.push({ text: normalized, update: updateDelivery });
|
|
7541
7653
|
},
|
|
7542
7654
|
...(escalateTier !== 'none' ? { escalateTier } : {}),
|
|
7543
|
-
...(
|
|
7655
|
+
...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
|
|
7544
7656
|
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7545
7657
|
});
|
|
7546
7658
|
} catch (error) {
|
|
@@ -7615,7 +7727,7 @@ async function runSelfImplementInner(
|
|
|
7615
7727
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7616
7728
|
onSurfaceProgress: line => progress('implementing', line.trimEnd()),
|
|
7617
7729
|
roundContext: { round: retryRound, effectiveMax, previousRoundFailure: retryNote },
|
|
7618
|
-
...(
|
|
7730
|
+
...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
|
|
7619
7731
|
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7620
7732
|
}), T.implement, 'implement');
|
|
7621
7733
|
} catch (error) {
|
|
@@ -7716,7 +7828,7 @@ async function runSelfImplementInner(
|
|
|
7716
7828
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7717
7829
|
onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
|
|
7718
7830
|
roundContext: { round: tddRetryRound, effectiveMax, previousRoundFailure: tddRetryNote },
|
|
7719
|
-
...(
|
|
7831
|
+
...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
|
|
7720
7832
|
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7721
7833
|
}), T.implement, 'implement');
|
|
7722
7834
|
} catch (error) {
|
|
@@ -7911,7 +8023,10 @@ async function runSelfImplementInner(
|
|
|
7911
8023
|
}, { compact: { stringMax: Math.max(MAX_HARVESTED_EVIDENCE_CHARS, harvestObs.harvestedEvidence?.length ?? 0) } });
|
|
7912
8024
|
if (impl.ok) completionDisposition = finishedChildCommitMissing || finishedChildCommitted ? undefined : impl.completionDisposition;
|
|
7913
8025
|
const effectiveDisposition = impl.ok ? completionDisposition : impl.completionDisposition;
|
|
7914
|
-
|
|
8026
|
+
let materializedPaths: readonly string[] | undefined;
|
|
8027
|
+
try { materializedPaths = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff is not path evidence */ }
|
|
8028
|
+
observe('implemented', { ok: impl.ok, round, ...(materializedPaths ? { materializedPaths: [...materializedPaths] } : {}),
|
|
8029
|
+
...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
|
|
7915
8030
|
progress('implemented', impl.ok ? (round === 0 ? '구현 완료' : `rework ${round} 완료`) : impl.completionDisposition ? '변경 없이 완료 검증' : '구현 실패(worktree 보존)');
|
|
7916
8031
|
if (!impl.ok) {
|
|
7917
8032
|
finalizeSupervisorDeliveries('next-round-implement-not-ok');
|
|
@@ -38,6 +38,21 @@ export function parseConflictFiles(text: string): string[] {
|
|
|
38
38
|
|
|
39
39
|
export type MergeFailureKind = 'base-modified' | 'head-moved' | 'conflict' | 'branch-policy' | 'other';
|
|
40
40
|
|
|
41
|
+
export const HOST_REGATE_PR_HEAD_FAILURE_CONDITIONS = [
|
|
42
|
+
'head-unavailable', 'head-mismatch', 'state-unavailable', 'state-not-open',
|
|
43
|
+
'draft-status-unavailable', 'pr-is-draft', 'base-name-unavailable', 'base-oid-invalid',
|
|
44
|
+
] as const;
|
|
45
|
+
export type HostRegatePrHeadFailureCondition = typeof HOST_REGATE_PR_HEAD_FAILURE_CONDITIONS[number];
|
|
46
|
+
|
|
47
|
+
export interface HostRegatePrHeadSnapshot {
|
|
48
|
+
headRefOid: string | null;
|
|
49
|
+
state: 'OPEN' | 'CLOSED' | 'MERGED' | 'OTHER' | null;
|
|
50
|
+
isDraft: boolean | null;
|
|
51
|
+
/** The only raw ref retained is the conventional base; all other non-empty values collapse to `other`. */
|
|
52
|
+
baseRefName: 'main' | 'other' | null;
|
|
53
|
+
baseRefOid: string | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
41
56
|
/** Classify a `gh pr merge` failure so a reader can tell a race from a conflict from a policy block without the raw text. */
|
|
42
57
|
export function classifyMergeFailure(detail: string, expectedHead?: string, actualHead?: string | null): MergeFailureKind {
|
|
43
58
|
if (/base branch was modified/i.test(detail)) return 'base-modified';
|
|
@@ -48,12 +63,16 @@ export function classifyMergeFailure(detail: string, expectedHead?: string, actu
|
|
|
48
63
|
return 'other';
|
|
49
64
|
}
|
|
50
65
|
|
|
51
|
-
/** One host-regate failure. The optional facts are filled for
|
|
66
|
+
/** One host-regate failure. The optional facts are filled for PR-head, merge-conflict and merge steps. */
|
|
52
67
|
export interface HostRegateFailure {
|
|
53
68
|
step: string;
|
|
54
69
|
detail: string;
|
|
55
70
|
expectedHead?: string;
|
|
56
71
|
actualHead?: string | null;
|
|
72
|
+
/** Discrete clauses that failed the initial PR-head readiness check. */
|
|
73
|
+
failedConditions?: HostRegatePrHeadFailureCondition[];
|
|
74
|
+
/** Bounded structured facts from the same `gh pr view` used for the check. */
|
|
75
|
+
prHeadSnapshot?: HostRegatePrHeadSnapshot;
|
|
57
76
|
conflictFiles?: string[];
|
|
58
77
|
/** Number omitted from conflictFiles when the ledger's 200-path bound is reached. */
|
|
59
78
|
conflictFilesOmitted?: number;
|
|
@@ -66,12 +85,30 @@ export function regateFailureFacts(failure: unknown): Omit<HostRegateFailure, 's
|
|
|
66
85
|
const f = failure as Record<string, unknown>;
|
|
67
86
|
const sha = (value: unknown): value is string => typeof value === 'string' && /^[0-9a-f]{40}$/i.test(value);
|
|
68
87
|
const kinds: readonly MergeFailureKind[] = ['base-modified', 'head-moved', 'conflict', 'branch-policy', 'other'];
|
|
88
|
+
const headConditions: readonly HostRegatePrHeadFailureCondition[] = HOST_REGATE_PR_HEAD_FAILURE_CONDITIONS;
|
|
69
89
|
const conflictFiles = Array.isArray(f.conflictFiles) ? f.conflictFiles.filter((p): p is string => typeof p === 'string') : undefined;
|
|
70
90
|
const priorOmitted = Number.isSafeInteger(f.conflictFilesOmitted) && (f.conflictFilesOmitted as number) > 0 ? f.conflictFilesOmitted as number : 0;
|
|
71
91
|
const conflictFilesOmitted = Math.max(0, (conflictFiles?.length ?? 0) - 200) + priorOmitted;
|
|
92
|
+
const failedConditions = Array.isArray(f.failedConditions)
|
|
93
|
+
? [...new Set(f.failedConditions.filter((condition): condition is HostRegatePrHeadFailureCondition => typeof condition === 'string' && headConditions.includes(condition as HostRegatePrHeadFailureCondition)))].sort()
|
|
94
|
+
: undefined;
|
|
95
|
+
const snapshot = f.prHeadSnapshot && typeof f.prHeadSnapshot === 'object' ? f.prHeadSnapshot as Record<string, unknown> : undefined;
|
|
96
|
+
const states = ['OPEN', 'CLOSED', 'MERGED', 'OTHER'] as const;
|
|
97
|
+
const prHeadSnapshot = snapshot
|
|
98
|
+
&& (sha(snapshot.headRefOid) || snapshot.headRefOid === null)
|
|
99
|
+
&& ((typeof snapshot.state === 'string' && states.includes(snapshot.state as typeof states[number])) || snapshot.state === null)
|
|
100
|
+
&& (typeof snapshot.isDraft === 'boolean' || snapshot.isDraft === null)
|
|
101
|
+
&& ((snapshot.baseRefName === 'main' || snapshot.baseRefName === 'other') || snapshot.baseRefName === null)
|
|
102
|
+
&& (sha(snapshot.baseRefOid) || snapshot.baseRefOid === null)
|
|
103
|
+
? { headRefOid: snapshot.headRefOid as string | null, state: snapshot.state as HostRegatePrHeadSnapshot['state'],
|
|
104
|
+
isDraft: snapshot.isDraft as boolean | null, baseRefName: snapshot.baseRefName as HostRegatePrHeadSnapshot['baseRefName'],
|
|
105
|
+
baseRefOid: snapshot.baseRefOid as string | null }
|
|
106
|
+
: undefined;
|
|
72
107
|
return {
|
|
73
108
|
...(sha(f.expectedHead) ? { expectedHead: f.expectedHead } : {}),
|
|
74
109
|
...(sha(f.actualHead) || f.actualHead === null ? { actualHead: f.actualHead as string | null } : {}),
|
|
110
|
+
...(failedConditions?.length ? { failedConditions } : {}),
|
|
111
|
+
...(prHeadSnapshot ? { prHeadSnapshot } : {}),
|
|
75
112
|
...(conflictFiles ? { conflictFiles: conflictFiles.slice(0, 200) } : {}),
|
|
76
113
|
...(conflictFilesOmitted > 0 ? { conflictFilesOmitted } : {}),
|
|
77
114
|
...(typeof f.mergeFailureKind === 'string' && kinds.includes(f.mergeFailureKind as MergeFailureKind) ? { mergeFailureKind: f.mergeFailureKind as MergeFailureKind } : {}),
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ChildLlmSelection } from '../agent/run-context.js';
|
|
2
|
+
|
|
3
|
+
export type ProviderAvailability = 'available' | 'unavailable' | 'unknown';
|
|
4
|
+
export type ReworkChildProviderDecision =
|
|
5
|
+
| { action: 'keep'; selection: ChildLlmSelection; reason: 'not-grok' | 'quota-unknown' | 'quota-usable' | 'no-alternate' }
|
|
6
|
+
| { action: 'reselect'; selection: ChildLlmSelection; previous: ChildLlmSelection; reason: 'grok-quota-exhausted' | 'grok-credential-missing' };
|
|
7
|
+
|
|
8
|
+
/** Re-evaluate Grok immediately before a supervisor rework relaunch; unknown quota is never treated as exhaustion. */
|
|
9
|
+
export function reselectChildForRework(input: {
|
|
10
|
+
current: ChildLlmSelection;
|
|
11
|
+
grokQuota: 'usable' | 'exhausted' | 'unknown';
|
|
12
|
+
grokCredential: ProviderAvailability;
|
|
13
|
+
alternate?: ChildLlmSelection;
|
|
14
|
+
alternateCredential: ProviderAvailability;
|
|
15
|
+
alternateQuotaExhausted?: boolean;
|
|
16
|
+
}): ReworkChildProviderDecision {
|
|
17
|
+
if (input.current.provider !== 'grok') return { action: 'keep', selection: input.current, reason: 'not-grok' };
|
|
18
|
+
const reason = input.grokQuota === 'exhausted' ? 'grok-quota-exhausted'
|
|
19
|
+
: input.grokCredential === 'unavailable' ? 'grok-credential-missing' : undefined;
|
|
20
|
+
if (!reason) return { action: 'keep', selection: input.current, reason: input.grokQuota === 'unknown' ? 'quota-unknown' : 'quota-usable' };
|
|
21
|
+
if (!input.alternate || input.alternateCredential !== 'available' || input.alternateQuotaExhausted === true) {
|
|
22
|
+
return { action: 'keep', selection: input.current, reason: 'no-alternate' };
|
|
23
|
+
}
|
|
24
|
+
return { action: 'reselect', selection: input.alternate, previous: input.current, reason };
|
|
25
|
+
}
|