elanous 0.2.22 → 0.2.24
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/NOTICE +7 -0
- package/README.md +32 -22
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{119fc678.6f591cdb84ca5791.js → 0673cc54.8e2ef1c23e49e190.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{a9f2b54d-40c16bd0efdb04b8.js → 0a09e062-34f747a17d8d8c2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{f8626309.a4e5d362b1d55e59.js → 0e3acd34.d42b2ef87fdf4234.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7175-350f4ce2873bc038.js → 1325-dc3f3c21eb181cb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.8e6c5f6e744fcd9f.js → 1505.5826671109111e75.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 1669-da843ed73aa301f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +36 -0
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/2528.0af5c0e1fad88df6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7899.597af4a9996c907f.js → 2721.bc9a8f36bd85c07a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +149 -0
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +309 -0
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d70879db.c66c56a95a91efc6.js → 4c5e95ce.83e9b16add6fcd8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6158.566c890adc06a459.js → 5313.1697309c532b9856.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{79b78388.663188133449d707.js → 53746282.1be36038d1abd949.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5578.ac963634373b28c6.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5967-c0a80f8ffe5d4050.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 5974.360f8441eb0ac1ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +74 -0
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6571-926ddf024a6ad5df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +64 -0
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9832.2ab2e818013574c7.js → 6702.ebbd165d5e4a4a14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 740.90b31555290236a9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{9070.067c106528ec1ae6.js → 7518.49161e8f5814abdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +27 -0
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +115 -0
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7905.b230b9d06cb4ad5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8194.484f51e273d9abd2.js → 8264.00e434fbd02e9311.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{088d8e8a.8069543d082bec12.js → 83cfc5c8.349535543c1548b6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{1948.5f35b39eef222a94.js → 8438.ee7f0df3b3f6fcb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4588.ad3364cb7fb97ada.js → 8532.a86e99acf9b761cb.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/8569.b853a8daa8f31d12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8925-2abfb48af477fb7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{88729267.9c6c000157c83f2f.js → 89849432.9eaa2f4c9c010965.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +90 -0
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +41 -0
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +287 -0
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3522-1de1319d028ac89c.js → 9502-32c5dc22e8f120f5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{7630.2b9a68659053ff4e.js → 9976.8f28864317639fe6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-24282bf9f90031a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-c0ab229673a8b0eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1d809a87139dd024.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b92caddb5c715f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/b4e12462-5fab4a813a63dadd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → ce383d63.d2ede338788ed18e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-5c169757551134ed.js → framework-b2763b10dc6b3836.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +1 -0
- package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +1 -0
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.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 +24 -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 +24 -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/models/anthropic/claude-haiku-5-5.yaml +32 -0
- package/catalog/models/anthropic/claude-opus-5-5.yaml +5 -0
- package/catalog/models/anthropic/claude-sonnet-5-5.yaml +31 -0
- package/catalog/models/anthropic/claude-sonnet-5.yaml +8 -2
- package/catalog/models/openai/gpt-6-astra.yaml +6 -0
- package/catalog/models/openai/gpt-6-luna.yaml +6 -0
- package/catalog/models/openai/gpt-6-sol.yaml +6 -0
- package/catalog/models/openrouter/deepseek-v4-pro-0813.yaml +39 -0
- package/catalog/models/openrouter/deepseek-v4.1-flash.yaml +38 -0
- package/catalog/models/openrouter/glm-5.3-flash.yaml +35 -0
- package/catalog/providers/openrouter.yaml +2 -0
- package/graphs/implement-loop.yaml +31 -0
- package/graphs/log-horizon/log-horizon-watch.yaml +25 -0
- package/graphs/log-horizon/recipes.yaml +3 -0
- package/graphs/ops/harness-gc.yaml +17 -0
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/overlays/README.md +1 -1
- package/graphs/overlays/stop-heal-ladder.yaml +105 -0
- package/graphs/release/recipes.yaml +1 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/release-rehearsal/recipes.yaml +12 -0
- package/graphs/release-rehearsal/release-rehearsal.yaml +17 -0
- package/package.json +4 -1
- package/scripts/add-api-key.sh +1 -1
- package/scripts/bench-report.ts +82 -3
- package/scripts/ci-typecheck-changed.ts +80 -14
- package/scripts/fleet/bedrock-pod-secret.ts +122 -0
- package/scripts/fleet/node-setup-linux.sh +97 -0
- package/scripts/fleet/node-setup.sh +11 -0
- package/scripts/fleet/zai-pod-secret.ts +86 -0
- package/scripts/hq/hq-fence-wrapper.sh +148 -0
- package/scripts/land-global-checks.ts +3 -0
- package/scripts/lib/typecheck-ratchet.ts +51 -0
- package/scripts/measure-log-diet-2.ts +213 -0
- package/scripts/measure-tsc-affected-roots.ts +289 -0
- package/scripts/openai-relay-server.ts +5 -1
- package/scripts/release-loop/docs-node.ts +258 -43
- package/scripts/release-loop/gate-executor.ts +28 -0
- package/scripts/release-loop/gate-method.ts +59 -0
- package/scripts/release-loop/gate-node.ts +335 -33
- package/scripts/release-loop/gate-wall.ts +208 -0
- package/scripts/release-loop/known-issues-node.ts +53 -8
- package/scripts/release-loop/publish-at.ts +14 -0
- package/scripts/release-loop/publish-node.ts +17 -2
- package/scripts/release-loop/resume-release.ts +40 -4
- package/scripts/release-loop/resume.ts +94 -0
- package/scripts/release-loop/shard-plan.ts +3 -11
- package/scripts/release-loop/tui-node-checks.ts +22 -0
- package/scripts/release-loop/unattended-release.ts +29 -7
- package/scripts/rhythm/daily.ts +51 -2
- package/scripts/rhythm/weekly.ts +3 -2
- package/scripts/tsc-baseline-cache.ts +147 -0
- package/scripts/tsc-main-safety-net.ts +189 -0
- package/scripts/usage-rollup.ts +64 -8
- package/src/acp/codex-plugins.ts +48 -6
- package/src/agent/monad-agent-turn.ts +67 -5
- package/src/agent/run-context.ts +20 -0
- package/src/agent/tool-profile.ts +28 -2
- package/src/agent-mission/acp-judge.ts +8 -2
- package/src/agent-mission/capabilities-cli.ts +16 -1
- package/src/agent-mission/driver.ts +19 -4
- package/src/agent-mission/pr-review-watch.ts +6 -2
- package/src/agent-mission/resource-ladder.ts +8 -3
- package/src/agent-mission/review-loop.ts +41 -7
- package/src/agent-substrate/acp-implementer.ts +139 -0
- package/src/agent-substrate/acp-reviewer.ts +17 -8
- package/src/agent-substrate/pr-reviewer.ts +191 -28
- package/src/agent-substrate/review-intent.ts +6 -4
- package/src/agent-substrate/self-review-cli.ts +155 -21
- package/src/agent-substrate/shard-boundary-intent.ts +92 -26
- package/src/ask-user-question/pending-questions.ts +8 -2
- package/src/autopilot/build/llm-conflict-merge.ts +216 -12
- package/src/autopilot/codebase-grounding.ts +44 -0
- package/src/autopilot/llm-control-brain.ts +13 -1
- package/src/autopilot/mission-codebase-gate.ts +8 -77
- package/src/autopilot/mission-critique.ts +18 -5
- package/src/autopilot/mission-feasibility-negotiate.ts +11 -10
- package/src/autopilot/mission-trace.ts +12 -1
- package/src/autopilot/pr-manager.ts +12 -3
- package/src/autopilot/system-lookback-run.ts +16 -10
- package/src/bench/bench.ts +183 -0
- package/src/boot/acp-server.ts +4 -7
- package/src/boot/acp-socket-path.ts +7 -0
- package/src/briefing/brief-items.ts +21 -13
- package/src/budget/fetchers/grok.ts +15 -5
- package/src/budget/llm-cost.ts +37 -5
- package/src/budget/types.ts +8 -2
- package/src/budget/unified-usage.ts +88 -6
- package/src/chat/index.ts +12 -3
- package/src/cli/agent-cli.ts +20 -0
- package/src/cli/bench-cli.ts +34 -0
- package/src/cli/brief-cli.ts +27 -21
- package/src/cli/cli-user-error.ts +9 -2
- package/src/cli/guardian-cli.ts +26 -1
- package/src/cli/image-cli.ts +101 -0
- package/src/cli/log-event-names.ts +7 -0
- package/src/cli/logs-cli.ts +1 -0
- package/src/cli/mcp-login.ts +111 -37
- package/src/cli/plugin-cli.ts +21 -1
- package/src/cli/pod-cli.ts +26 -0
- package/src/cli/pr-cli.ts +90 -5
- package/src/cli/pr-land-overlap-evidence.ts +279 -0
- package/src/cli/release-cli.ts +63 -12
- package/src/cli/rfc-status.ts +52 -2
- package/src/cli/self-update.ts +277 -10
- package/src/cli/skills-cli.ts +12 -3
- package/src/cli/tasks-cli.ts +241 -30
- package/src/cli/usage-cli.ts +91 -8
- package/src/context-bus/context-first.ts +51 -2
- package/src/context-bus/context-now-surfaces.ts +13 -2
- package/src/context-bus/long-term-memory.ts +3 -1
- package/src/context-bus/nightly-condense.ts +3 -2
- package/src/core-turn/run-goal-loop.ts +87 -2
- package/src/dashboard/ad-run-setup-bindings.ts +279 -0
- package/src/dashboard/chat-fold.ts +20 -0
- package/src/dashboard/first-screen-band.ts +151 -1
- package/src/dashboard/index.ts +45 -281
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
- package/src/dashboard/stale-install-check.ts +24 -2
- package/src/dashboard/turn-stream-formatter.ts +25 -0
- package/src/debug/log-diet.ts +190 -0
- package/src/debug/log.ts +70 -17
- package/src/display/coordinator.ts +25 -2
- package/src/domains/coo-admin-tool.ts +27 -0
- package/src/domains/cron-match.ts +1 -0
- package/src/domains/outbound-alert.ts +17 -6
- package/src/domains/release-tool.ts +158 -10
- package/src/domains/schedule-registry.ts +10 -7
- package/src/domains/schedule-runner.ts +1 -0
- package/src/elanous-config-dir.ts +2 -2
- package/src/elanous-daemon.ts +3 -3
- package/src/error-report/report.ts +21 -4
- package/src/execution-loop/launch-gate.ts +1 -1
- package/src/expression/i18n/messages.en.ts +5 -0
- package/src/expression/i18n/messages.ja.ts +5 -0
- package/src/expression/i18n/messages.ko.ts +5 -0
- package/src/expression/i18n/messages.zh.ts +5 -0
- package/src/expression/i18n/types.ts +8 -0
- package/src/github/pr-labels.ts +2 -0
- package/src/graph-runner/graph-cli.ts +42 -1
- package/src/graph-runner/runner.ts +218 -8
- package/src/grok/usage.ts +23 -2
- package/src/grounding/ref-index.ts +253 -0
- package/src/harness/dispatch-backpressure.ts +267 -0
- package/src/harness/harness-clean.ts +199 -78
- package/src/harness/harness-cli-command.ts +229 -35
- package/src/harness/harness-gc.ts +331 -0
- package/src/harness/harness-seams.ts +2 -20
- package/src/harness/harness-stop.ts +4 -2
- package/src/harness/harness-substrate-default.ts +214 -8
- package/src/harness/launch-registry.ts +6 -0
- package/src/harness/nested-elanous-policy.ts +4 -2
- package/src/harness/worktree-branch-prefix.ts +9 -0
- package/src/hq/fence-wrapper.ts +7 -0
- package/src/hq/fence.ts +187 -0
- package/src/hq/hq.ts +33 -2
- package/src/hq/lease.ts +13 -0
- package/src/hq/seats.ts +133 -21
- package/src/images/image-ledger.ts +179 -0
- package/src/index.ts +250 -69
- package/src/instance/child-scope.ts +32 -1
- package/src/instance/dev-project.ts +133 -0
- package/src/instance/resolve.ts +24 -0
- package/src/instance/spawn-elanous.ts +45 -0
- package/src/intake-plane/collect-github.ts +19 -1
- package/src/intake-plane/digest.ts +45 -20
- package/src/intake-plane/lens.ts +36 -8
- package/src/intake-plane/ref-prefetch.ts +110 -0
- package/src/intelligence-map/model-alias.ts +6 -0
- package/src/intelligence-map/model-catalog.ts +113 -0
- package/src/knowledge/kgs/pack.ts +5 -2
- package/src/knowledge/kgs/sqlite-store.ts +15 -0
- package/src/knowledge/tools/knowledge-query.ts +20 -2
- package/src/knowledge/write.ts +234 -2
- package/src/llm/bedrock-eventstream.ts +215 -0
- package/src/llm/bedrock-provider.ts +248 -0
- package/src/llm/bedrock.ts +491 -0
- package/src/llm/openrouter-byok-cost.ts +96 -0
- package/src/llm/openrouter-deepseek.ts +151 -0
- package/src/llm/openrouter-upstream-pins.config.ts +25 -0
- package/src/llm/provider-credentials.ts +3 -1
- package/src/llm/zai-coding-plan.ts +700 -0
- package/src/llm.ts +383 -41
- package/src/loops/budget.ts +150 -0
- package/src/loops/checker.ts +148 -9
- package/src/loops/orchestrator/resync-shadow.ts +34 -7
- package/src/loops/orchestrator/seat-share.ts +6 -49
- package/src/loops/orchestrator/traffic.ts +5 -81
- package/src/market/signed-index.ts +42 -0
- package/src/maturity/feature-maturity.ts +2 -2
- package/src/mcp/mcp-oauth.ts +136 -17
- package/src/model-tier/llm-tier-map.ts +52 -4
- package/src/models/prompts.ts +23 -1
- package/src/mss/logging/horizon-watch.ts +168 -0
- package/src/mss/logging/log-store.ts +262 -26
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/consult-requests.ts +7 -10
- package/src/nexus/api/discord-trigger-bot.ts +6 -3
- package/src/nexus/api/error-reports.ts +30 -8
- package/src/nexus/api/http-server.ts +8 -0
- package/src/nexus/api/loop-resources.ts +42 -0
- package/src/nexus/api/missions.ts +73 -2
- package/src/nexus/api/ops-api.ts +18 -0
- package/src/nexus/api/outbound-report.ts +8 -3
- package/src/nexus/api/telegram-trigger-bot.ts +6 -3
- package/src/nexus/index.ts +17 -75
- package/src/nexus/outbound/format.ts +2 -0
- package/src/nexus/outbound/router.ts +198 -13
- package/src/nexus/tools-kind.ts +78 -0
- package/src/oauth/codex-account-rotation.ts +55 -20
- package/src/oauth/codex-account-store.ts +451 -23
- package/src/oauth/fallback-chain.ts +75 -15
- package/src/onboarding/first-run.ts +37 -18
- package/src/onboarding/web-first.ts +20 -2
- package/src/onboarding.ts +2 -1
- package/src/ops/machine-heartbeat.ts +185 -0
- package/src/ops/overview-cache.ts +175 -0
- package/src/ops/overview.ts +8 -0
- package/src/plugins/adapters/claude-package.ts +4 -12
- package/src/plugins/core/capability-policy.ts +141 -0
- package/src/plugins/core/host.ts +21 -8
- package/src/plugins/core/manifest.ts +19 -2
- package/src/plugins/core/trust-store.ts +15 -0
- package/src/plugins/core/types.ts +12 -0
- package/src/plugins/install/market-fetch.ts +68 -16
- package/src/plugins/install/plugin-install.ts +187 -16
- package/src/plugins/maker/plugin-maker.ts +25 -20
- package/src/plugins/maker/wizard-generate.ts +16 -2
- package/src/policy/llm-policy.ts +14 -1
- package/src/process/pid-liveness.ts +1 -1
- package/src/prompt-cache/openai.ts +13 -6
- package/src/prompt-cache/openrouter.ts +94 -0
- package/src/prompt-cache/types.ts +5 -0
- package/src/prompt-enhance/enhance.ts +69 -5
- package/src/prompt-library/family-prompt-coverage.ts +1 -0
- package/src/prompt-library/universal-preamble.ts +2 -2
- package/src/registry/discovery/openrouter-live-resolve.ts +122 -0
- package/src/registry/loader.ts +6 -1
- package/src/release-loop/checklist.ts +24 -9
- package/src/release-loop/feature-store.ts +3 -0
- package/src/release-loop/gate-shards.ts +48 -4
- package/src/release-loop/landed-to-green.ts +81 -0
- package/src/release-loop/light-rc.ts +11 -1
- package/src/release-loop/merged-pr-checklist.ts +10 -0
- package/src/release-loop/placement.ts +107 -23
- package/src/release-loop/rehearsal.ts +317 -0
- package/src/release-loop/release-schedule.ts +13 -1
- package/src/release-loop/rubric-types.ts +1 -0
- package/src/release-loop/rubric.ts +2 -2
- package/src/requirements/requirement-ledger.ts +536 -0
- package/src/retro/daily.ts +26 -12
- package/src/seat-loop/seat-loop.ts +66 -11
- package/src/seat-loop/traffic-signal.ts +44 -0
- package/src/self-dev/ask-launch-flow.ts +2 -2
- package/src/self-dev/dev-cli.ts +109 -11
- package/src/self-dev/dev-pipeline.ts +11 -8
- package/src/self-dev/draft-residue.ts +475 -0
- package/src/self-dev/draft-sweep.ts +254 -10
- package/src/self-dev/draft-triage-rules.ts +27 -1
- package/src/self-dev/graph-journey-route.ts +6 -0
- package/src/self-dev/launch-preflight-text.ts +549 -0
- package/src/self-dev/launch-preflight.ts +10 -545
- package/src/self-dev/orchestrate-cli.ts +82 -5
- package/src/self-dev/orchestrate-summary-line.ts +13 -0
- package/src/self-dev/orchestrate.ts +49 -141
- package/src/self-dev/review-provider-fallback.ts +115 -19
- package/src/self-dev/run-store.ts +1 -3
- package/src/self-dev/run-supervisor.ts +190 -36
- package/src/self-dev/run-types.ts +191 -0
- package/src/self-dev/shard-aggregate.ts +61 -13
- package/src/self-dev/shard-plan.ts +5 -1
- package/src/self-dev/shard-run.ts +23 -5
- package/src/self-dev/supervisor-verdict-edges.ts +3 -4
- package/src/self-implement/blocked-draft-policy.ts +3 -19
- package/src/self-implement/budget-gate.ts +53 -13
- package/src/self-implement/child-context-composition.ts +139 -0
- package/src/self-implement/child-llm-preference.ts +13 -5
- package/src/self-implement/claude-acp-implement.ts +67 -0
- package/src/self-implement/draft-on-stop-mode.ts +18 -0
- package/src/self-implement/flex-signals.ts +59 -0
- package/src/self-implement/follow-up-goals.ts +114 -38
- package/src/self-implement/frozen-merges.ts +8 -3
- package/src/self-implement/gate-baseline-reap.ts +157 -0
- package/src/self-implement/gate-baseline.ts +78 -16
- package/src/self-implement/gate-cli.ts +12 -2
- package/src/self-implement/gate-remote.ts +17 -6
- package/src/self-implement/goal-author-decompose.ts +10 -2
- package/src/self-implement/goal-author.ts +48 -13
- package/src/self-implement/goal-digest.ts +19 -0
- package/src/self-implement/graph-overlay-condition.ts +32 -0
- package/src/self-implement/graph-overlay-yaml.ts +41 -7
- package/src/self-implement/graph-templates.ts +33 -1
- package/src/self-implement/graph-yaml.ts +56 -0
- package/src/self-implement/headless-elanous-driver.ts +11 -9
- package/src/self-implement/heal-intake.ts +5 -1
- package/src/self-implement/host-regate.ts +120 -29
- package/src/self-implement/l8-merge-queue.ts +67 -5
- package/src/self-implement/merge-train.ts +131 -0
- package/src/self-implement/off-diff-evidence.ts +9 -0
- package/src/self-implement/orchestrator.ts +271 -25
- package/src/self-implement/review-finding-recurrence.ts +28 -0
- package/src/self-implement/rework-policy.ts +2 -1
- package/src/self-implement/round-summary-card.ts +63 -0
- package/src/self-implement/run-ledger.ts +4 -3
- package/src/self-implement/run-step-projection.ts +147 -0
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +75 -5
- package/src/self-implement/seams.ts +83 -4
- package/src/self-implement/self-implement-cli.ts +12 -5
- package/src/self-implement/stop-autoheal.ts +69 -2
- package/src/self-implement/train-gate-remote.ts +158 -0
- package/src/session-runtime/index.ts +10 -1
- package/src/session-runtime/retry-api.ts +11 -1
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/skills/gift-install.ts +119 -0
- package/src/skills/runner.ts +59 -2
- package/src/skills/skill-feedback.ts +31 -1
- package/src/skills/skill-tier.ts +1 -0
- package/src/smart-wizard/capability-index.ts +231 -0
- package/src/smart-wizard/rung.ts +74 -0
- package/src/steward/launch.ts +22 -10
- package/src/steward/triage-budget.ts +62 -0
- package/src/steward/triage.ts +87 -24
- package/src/storage/file-lock.ts +8 -1
- package/src/task-agent/actions.ts +66 -5
- package/src/task-agent/card-evidence.ts +59 -13
- package/src/task-agent/completion-evidence.ts +5 -0
- package/src/task-agent/cover.ts +101 -3
- package/src/task-agent/judge.ts +20 -3
- package/src/task-agent/land-order-ledger.ts +95 -0
- package/src/task-agent/land-worktree.ts +201 -0
- package/src/task-agent/live-move-history.ts +219 -0
- package/src/task-agent/live-moves.ts +451 -34
- package/src/task-agent/parent-host.ts +117 -8
- package/src/task-agent/rejudge-on-head.ts +352 -0
- package/src/task-agent/review-prior-fix.ts +146 -0
- package/src/task-agent/review-result-capture.ts +218 -0
- package/src/task-agent/run-adopt.ts +136 -0
- package/src/task-agent/shadow.ts +154 -14
- package/src/task-agent/task-hand.ts +186 -14
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +38 -5
- package/src/task-orchestrator/surfaces/pod-bedrock-child.ts +74 -0
- package/src/task-orchestrator/surfaces/pod-child-default.ts +50 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +42 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +94 -7
- package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +110 -17
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +32 -3
- package/src/task-orchestrator/surfaces/pod-pool.ts +86 -18
- package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +463 -50
- package/src/task-orchestrator/surfaces/self-implement.ts +25 -3
- package/src/telegram-service.ts +5 -1
- package/src/telegram.ts +17 -4
- package/src/time/format.ts +13 -4
- package/src/tool-runtime/goal-author-runtime.ts +1 -0
- package/src/tool-runtime/self-cognition-catalog.ts +23 -0
- package/src/tool-runtime/self-cognition-runtimes.ts +2 -24
- package/src/typecheck-ratchet.ts +1 -0
- package/src/user-config.ts +180 -32
- package/src/ux-sim/slash-menu-frames.ts +168 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-terminal/preview-tap-registry.ts +5 -2
- package/src/workflow-runtime/triggers/registry.ts +59 -0
- package/src/workflow-runtime/triggers/scheduler.ts +1 -0
- package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
- package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +0 -309
- package/apps/pwa/out/_next/static/chunks/1307-08b716476f1d50af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +0 -122
- package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +0 -79
- package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +0 -27
- package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/211-9c9090c59e2c5907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +0 -36
- package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2489-d238d3e2eb5b2bf5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +0 -77
- package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +0 -90
- package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +0 -1
- package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +0 -8
- package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +0 -287
- package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +0 -41
- package/apps/pwa/out/_next/static/chunks/726.83532d69452ee24b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/935.4ddaa99fc1d1126c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +0 -23
- package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d85c43f46f58716b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-4e645600579ae952.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-87edbfd19117823b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-cbaf66b1e1804adf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-9f5610caaa06178c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-ec8f3575e339de74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-2a19c5cd3b562580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b6a09cde2e07521a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-f7eae1518ca0c353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8462d6a543cbb2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-786fb4504d0f2fa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-75209f14597dcb8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-bf30affe3a85af7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-76cf838050a8d681.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7ec8e289b4c14df6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-8c8ac17d52be2a79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d359ab048d63a9d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-b8b345c880bf78d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f151cc10ad026940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bf495a1e284f4e00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-69cb93d1a2e57e0e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-72ec543928d67c3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f6231284-45726550aba08fca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +0 -1
- package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +0 -1
- /package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_ssgManifest.js +0 -0
|
@@ -16,6 +16,9 @@ export interface GateShardAttempt {
|
|
|
16
16
|
baselineExitCode: number | null;
|
|
17
17
|
currentSignal?: string | null;
|
|
18
18
|
baselineSignal?: string | null;
|
|
19
|
+
/** LIGHT-RC-MEASURE — the shard files that exist in the baseline tree, i.e. what the baseline side actually ran.
|
|
20
|
+
* Absent = every shard file (the old shape). Empty = the baseline side was not run and contributes zero cases. */
|
|
21
|
+
baselineFiles?: readonly string[];
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
export interface GateShardAggregate {
|
|
@@ -25,7 +28,7 @@ export interface GateShardAggregate {
|
|
|
25
28
|
report?: GateBaselineReport;
|
|
26
29
|
}
|
|
27
30
|
|
|
28
|
-
interface JUnitCase { file: string; name: string; failure?: string }
|
|
31
|
+
interface JUnitCase { file: string; name: string; failure?: string; skipped?: true }
|
|
29
32
|
|
|
30
33
|
const decode = (text: string): string => text.replace(/&(#x[0-9a-f]+|#\d+|amp|lt|gt|quot|apos);/gi, (entity, key: string) => {
|
|
31
34
|
if (key[0] === '#') {
|
|
@@ -128,6 +131,7 @@ function readJUnit(xml: string, files: readonly string[]): JUnitCase[] | undefin
|
|
|
128
131
|
const cases: JUnitCase[] = [];
|
|
129
132
|
const counts = new Map<string, number>();
|
|
130
133
|
const executed = new Set<string>();
|
|
134
|
+
const occurrences = new Map<string, number>();
|
|
131
135
|
let failures = 0;
|
|
132
136
|
let errors = 0;
|
|
133
137
|
const matchesCount = (value: string | undefined, actual: number) => value === undefined
|
|
@@ -149,12 +153,20 @@ function readJUnit(xml: string, files: readonly string[]): JUnitCase[] | undefin
|
|
|
149
153
|
if (!caseFile || !expected.has(caseFile) || !leaf || (file && file !== caseFile)) return undefined;
|
|
150
154
|
total.tests++;
|
|
151
155
|
counts.set(caseFile, (counts.get(caseFile) ?? 0) + 1);
|
|
152
|
-
|
|
156
|
+
// A skipped case is neither a pass nor a failure; it no longer voids the shard (LIGHT-RC-MEASURE ②).
|
|
157
|
+
const skipped = child.children.some((c) => c.name === 'skipped');
|
|
153
158
|
const classname = child.attrs.classname;
|
|
154
|
-
const
|
|
159
|
+
const declaredName = classname && classname !== caseFile ? `${classname} > ${leaf}` : leaf;
|
|
160
|
+
// Bun emits one name for every `test.each` row and for same-named cases in one describe; such repeats are
|
|
161
|
+
// told apart by their order in the file (#2, #3 …) on both sides instead of voiding the shard (LIGHT-RC-MEASURE).
|
|
162
|
+
const declaredIdentity = `${caseFile}\u0000${declaredName}`;
|
|
163
|
+
const ordinal = (occurrences.get(declaredIdentity) ?? 0) + 1;
|
|
164
|
+
occurrences.set(declaredIdentity, ordinal);
|
|
165
|
+
const name = ordinal === 1 ? declaredName : `${declaredName} #${ordinal}`;
|
|
155
166
|
const identity = `${caseFile}\u0000${name}`;
|
|
156
167
|
if (executed.has(identity)) return undefined;
|
|
157
168
|
executed.add(identity);
|
|
169
|
+
if (skipped) { cases.push({ file: caseFile, name, skipped: true }); continue; }
|
|
158
170
|
const failure = child.children.find((c) => c.name === 'failure' || c.name === 'error');
|
|
159
171
|
if (failure?.name === 'failure') { failures++; total.failures++; }
|
|
160
172
|
else if (failure) { errors++; total.errors++; }
|
|
@@ -179,6 +191,30 @@ function readJUnit(xml: string, files: readonly string[]): JUnitCase[] | undefin
|
|
|
179
191
|
return cases;
|
|
180
192
|
}
|
|
181
193
|
|
|
194
|
+
const SKIPPED_PASSED_AT_BASE = 'skipped now · passed at base — a skip must not hide a regression (LIGHT-RC-MEASURE ②)';
|
|
195
|
+
|
|
196
|
+
/** Cases that passed at the baseline but were skipped now are counted as `unknown` failures — never green. */
|
|
197
|
+
function withSkippedRegressions(report: GateBaselineReport | undefined, skipped: readonly JUnitCase[], baselineStatus: GateBaselineReport['baselineStatus']): GateBaselineReport {
|
|
198
|
+
const base: GateBaselineReport = report ?? {
|
|
199
|
+
introduced: 0, preexisting: 0, unknown: 0, preconditionUnmet: 0, missingAtBase: 0, timedOut: 0, timeoutPassedAtBase: 0,
|
|
200
|
+
flakyRerun: 0, rerunNotRun: 0, mayVaryNonTimeout: 0, rerunAttempted: 0, rerunRecovered: 0,
|
|
201
|
+
timeoutVariabilityCounts: { mayVary: 0, same: 0, unknown: 0 }, worktreeFailuresParsed: true,
|
|
202
|
+
failures: [], files: [], baselineStatus, log: 'shard baseline JUnit complete',
|
|
203
|
+
};
|
|
204
|
+
// An unknown failure means the child is not exonerated: `childResponsibility: 'none'` only holds when every remaining
|
|
205
|
+
// failure is flaky/preexisting (decideGateChildResponsibility), which an added unknown breaks.
|
|
206
|
+
const { childResponsibility: _dropped, ...rest } = base;
|
|
207
|
+
const added = skipped.map(({ file, name }) => ({
|
|
208
|
+
name: `${file} > ${name}`, file, diagnostic: SKIPPED_PASSED_AT_BASE, attribution: 'unknown' as const, baselinePresence: 'present' as const,
|
|
209
|
+
}));
|
|
210
|
+
return {
|
|
211
|
+
...rest,
|
|
212
|
+
unknown: base.unknown + added.length,
|
|
213
|
+
failures: [...base.failures, ...added],
|
|
214
|
+
files: [...new Set([...base.files, ...added.map((failure) => failure.file)])],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
182
218
|
function asGateLog(cases: readonly JUnitCase[]): string {
|
|
183
219
|
return cases.map(({ file, name, failure }) => `${file}:\n${failure === undefined ? `(pass) ${name}` : `${failure}\n(fail) ${name}`}`).join('\n');
|
|
184
220
|
}
|
|
@@ -196,35 +232,47 @@ export function aggregateGateTestShards(shards: readonly GateTestShard[], attemp
|
|
|
196
232
|
const retryShardIds: string[] = [];
|
|
197
233
|
const current: JUnitCase[] = [];
|
|
198
234
|
const baseline: JUnitCase[] = [];
|
|
235
|
+
const skippedRegressions: JUnitCase[] = [];
|
|
199
236
|
for (const shard of shards) {
|
|
200
237
|
const attempt = selected.get(shard.id);
|
|
201
238
|
const head = attempt?.currentJUnit === undefined ? undefined : readJUnit(attempt.currentJUnit, shard.files);
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
239
|
+
// LIGHT-RC-MEASURE ① — the baseline side reads only the files that exist in the baseline tree; none = not run.
|
|
240
|
+
const baselineFiles = attempt?.baselineFiles ?? shard.files;
|
|
241
|
+
const baselineSkipped = baselineFiles.length === 0;
|
|
242
|
+
const base = baselineSkipped ? [] : attempt?.baselineJUnit === undefined ? undefined : readJUnit(attempt.baselineJUnit, baselineFiles);
|
|
243
|
+
if (!attempt || attempt.currentExitCode === null || attempt.currentSignal
|
|
244
|
+
|| ![0, 1].includes(attempt.currentExitCode)
|
|
245
|
+
|| baselineFiles.some((file) => !shard.files.includes(file))
|
|
246
|
+
|| (!baselineSkipped && (attempt.baselineExitCode === null || attempt.baselineSignal || ![0, 1].includes(attempt.baselineExitCode)))
|
|
206
247
|
|| !head || !base
|
|
207
248
|
|| (attempt.currentExitCode === 0 && head.some((test) => test.failure !== undefined))
|
|
208
|
-
|| (attempt.baselineExitCode === 0 && base.some((test) => test.failure !== undefined))
|
|
249
|
+
|| (!baselineSkipped && attempt.baselineExitCode === 0 && base.some((test) => test.failure !== undefined))
|
|
209
250
|
|| (attempt.currentExitCode !== 0 && head.every((test) => test.failure === undefined))
|
|
210
|
-
|| (attempt.baselineExitCode !== 0 && base.every((test) => test.failure === undefined))) {
|
|
251
|
+
|| (!baselineSkipped && attempt.baselineExitCode !== 0 && base.every((test) => test.failure === undefined))) {
|
|
211
252
|
retryShardIds.push(shard.id);
|
|
212
253
|
continue;
|
|
213
254
|
}
|
|
214
|
-
current.push(...head);
|
|
215
|
-
baseline.push(...base);
|
|
255
|
+
current.push(...head.filter((test) => !test.skipped));
|
|
256
|
+
baseline.push(...base.filter((test) => !test.skipped));
|
|
257
|
+
const passedAtBase = new Set(base.filter((test) => !test.skipped && test.failure === undefined).map((test) => `${test.file}\u0000${test.name}`));
|
|
258
|
+
skippedRegressions.push(...head.filter((test) => test.skipped && passedAtBase.has(`${test.file}\u0000${test.name}`)));
|
|
216
259
|
}
|
|
217
260
|
if (retryShardIds.length > 0 || shards.length === 0) return { status: 'unmeasured', retryShardIds };
|
|
218
|
-
|
|
261
|
+
const baselineStatus = baseline.some((test) => test.failure !== undefined) ? 'test-fail' as const : 'pass' as const;
|
|
262
|
+
if (current.every((test) => test.failure === undefined)) {
|
|
263
|
+
if (skippedRegressions.length === 0) return { status: 'passed', retryShardIds: [] };
|
|
264
|
+
return { status: 'failed', retryShardIds: [], report: withSkippedRegressions(undefined, skippedRegressions, baselineStatus) };
|
|
265
|
+
}
|
|
219
266
|
const passedTestEvidence: GatePassedTestEvidence = {
|
|
220
267
|
status: 'available',
|
|
221
268
|
tests: baseline.filter((test) => test.failure === undefined).map(({ file, name }) => ({ file, name: `${file} > ${name}` })),
|
|
222
269
|
};
|
|
223
270
|
const report = buildGateBaselineReport(asGateLog(current), {
|
|
224
|
-
status:
|
|
271
|
+
status: baselineStatus,
|
|
225
272
|
output: asGateLog(baseline),
|
|
226
273
|
passedTestEvidence,
|
|
227
274
|
log: 'shard baseline JUnit complete',
|
|
228
275
|
});
|
|
276
|
+
if (skippedRegressions.length > 0) return { status: 'failed', retryShardIds: [], report: withSkippedRegressions(report, skippedRegressions, baselineStatus) };
|
|
229
277
|
return { status: allowsBaselineOnlyFailure(report) ? 'passed' : 'failed', retryShardIds: [], report };
|
|
230
278
|
}
|
|
@@ -39,7 +39,11 @@ export function planGateTestShards(
|
|
|
39
39
|
shard = { id: `shard-${shards.length + 1}`, files: [], plannedRssMb: 0, plannedSeconds: 0 };
|
|
40
40
|
shards.push(shard);
|
|
41
41
|
}
|
|
42
|
-
if (!shard)
|
|
42
|
+
if (!shard) {
|
|
43
|
+
const totalRssMb = sorted.reduce((sum, candidate) => sum + rssMb.get(candidate)!, 0);
|
|
44
|
+
const largestRssMb = rssMb.get(sorted[0]!)!;
|
|
45
|
+
throw new Error(`test files exceed ${shardCount} shard memory budgets (files=${unique.length} · totalRssMb=${Math.round(totalRssMb)} · largestRssMb=${Math.round(largestRssMb)} · budgetMb=${capacity} · neededShards≥${Math.ceil(totalRssMb / capacity)})`);
|
|
46
|
+
}
|
|
43
47
|
shard.files.push(file);
|
|
44
48
|
shard.plannedRssMb += rss;
|
|
45
49
|
shard.plannedSeconds += duration;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
1
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { debug } from '../debug/log.js';
|
|
4
5
|
import { prepareDeterministicChildEnvironment } from '../../scripts/lib/deterministic-env.js';
|
|
5
6
|
import { withBaselineWorktree } from '../self-implement/gate-baseline.js';
|
|
6
7
|
import { aggregateGateTestShards, type GateShardAttempt, type GateShardAggregate } from './shard-aggregate.js';
|
|
@@ -22,6 +23,13 @@ export type ShardProcess = (cwd: string, files: readonly string[]) => {
|
|
|
22
23
|
seconds?: number;
|
|
23
24
|
};
|
|
24
25
|
|
|
26
|
+
/** Absent only when the path provably is not a file there (missing, or not a regular file); any other stat error
|
|
27
|
+
* (permissions …) is not evidence of absence, so the file stays in the baseline run (fail-closed: unmeasured). */
|
|
28
|
+
const absentAtBaseline = (path: string): boolean => {
|
|
29
|
+
try { return !statSync(path).isFile(); }
|
|
30
|
+
catch (error) { const code = (error as NodeJS.ErrnoException).code; return code === 'ENOENT' || code === 'ENOTDIR'; }
|
|
31
|
+
};
|
|
32
|
+
|
|
25
33
|
/** One process per bundle and per revision; a failed runner is retried only for its own bundle. */
|
|
26
34
|
export function runShardedGateTests(
|
|
27
35
|
cwd: string,
|
|
@@ -71,20 +79,30 @@ export function runShardedGateTests(
|
|
|
71
79
|
}
|
|
72
80
|
const attempts: GateShardAttempt[] = [];
|
|
73
81
|
const baseline = baselineWorktree(cwd, baseRef, (dir) => {
|
|
82
|
+
// LIGHT-RC-MEASURE ① — bun silently skips a path that is not in the baseline tree (exit 0), so a shard holding a
|
|
83
|
+
// new test file could never yield a complete baseline JUnit. Run the baseline side on the files the base has; an
|
|
84
|
+
// unreadable tree is not evidence of absence, so then every file stays in (the old shape).
|
|
85
|
+
const treeReadable = (() => { try { return statSync(dir).isDirectory(); } catch { return false; } })();
|
|
86
|
+
const atBase = (shard: GateTestShard) => treeReadable ? shard.files.filter((file) => !absentAtBaseline(join(dir, file))) : [...shard.files];
|
|
74
87
|
let pending = shards;
|
|
75
88
|
for (let round = 1; round <= 2 && pending.length; round++) {
|
|
76
89
|
for (const shard of pending) {
|
|
77
|
-
const runSafely = (location: string): ReturnType<ShardProcess> => {
|
|
78
|
-
try { return run(location,
|
|
90
|
+
const runSafely = (location: string, selected: readonly string[]): ReturnType<ShardProcess> => {
|
|
91
|
+
try { return run(location, selected); }
|
|
79
92
|
catch { return { exitCode: null }; }
|
|
80
93
|
};
|
|
81
|
-
const
|
|
82
|
-
|
|
94
|
+
const baselineFiles = atBase(shard);
|
|
95
|
+
if (baselineFiles.length < shard.files.length) {
|
|
96
|
+
debug.log('self-dev.shard', 'baseline-files-absent', { shardId: shard.id, round, absent: shard.files.filter((file) => !baselineFiles.includes(file)) });
|
|
97
|
+
}
|
|
98
|
+
const current = runSafely(cwd, shard.files);
|
|
99
|
+
const base = baselineFiles.length ? runSafely(dir, baselineFiles) : { exitCode: 0 };
|
|
83
100
|
attempts.push({
|
|
84
101
|
shardId: shard.id, attempt: round,
|
|
85
102
|
currentJUnit: current.junit, baselineJUnit: base.junit,
|
|
86
103
|
currentExitCode: current.exitCode, baselineExitCode: base.exitCode,
|
|
87
104
|
currentSignal: current.signal, baselineSignal: base.signal,
|
|
105
|
+
baselineFiles,
|
|
88
106
|
});
|
|
89
107
|
}
|
|
90
108
|
const retry = new Set(aggregateGateTestShards(shards, attempts).retryShardIds);
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import type { SelfDevJobResult } from './
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export type SupervisorNext = 'harvest' | 'scope-decompose' | 'self-review' | 'human-gate' | 'proposal';
|
|
1
|
+
import type { SelfDevJobResult, SupervisorStopReason, SupervisorNext } from './run-types.js';
|
|
2
|
+
export type { SupervisorNext } from './run-types.js';
|
|
5
3
|
export type SupervisorVerdictEdge = { readonly meaning: string; readonly next: SupervisorNext };
|
|
6
4
|
|
|
7
5
|
// 목표 규칙: 사람 관문은 결제·공개·자격·비가역 결정에만. 지금 max-rounds·provider-exhausted·step-timeout 이 human-gate 인 것은
|
|
@@ -20,6 +18,7 @@ export const SUPERVISOR_VERDICT_EDGES = {
|
|
|
20
18
|
'step-timeout': { meaning: 'step budget exhausted', next: 'human-gate' },
|
|
21
19
|
'decomposable-no-progress': { meaning: 'stalled with a decomposition proposal', next: 'scope-decompose' },
|
|
22
20
|
'review-unobserved': { meaning: 'review was not observed', next: 'self-review' },
|
|
21
|
+
'review-oscillating': { meaning: 'review oscillation needs a human decision (its one repair is spent or cannot run here)', next: 'human-gate' },
|
|
23
22
|
'deliverable-unobserved': { meaning: 'deliverable was not observed', next: 'self-review' },
|
|
24
23
|
'deliverable-merged': { meaning: 'deliverable is merged', next: 'harvest' },
|
|
25
24
|
} as const satisfies Record<SupervisorStopReason, SupervisorVerdictEdge>;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { AbandonedClassification } from './abandoned-classification.js';
|
|
2
|
+
import type { DraftOnStopMode } from './draft-on-stop-mode.js';
|
|
3
|
+
export { DRAFT_ON_STOP_MODES, DEFAULT_DRAFT_ON_STOP, parseDraftOnStopMode } from './draft-on-stop-mode.js';
|
|
4
|
+
export type { DraftOnStopMode } from './draft-on-stop-mode.js';
|
|
2
5
|
|
|
3
6
|
/** Environment interruptions have a resumable branch, not a human draft decision. */
|
|
4
7
|
export function blockedDraftDisposition(classification: string | undefined): 'open-draft' | 'preserve-branch' {
|
|
@@ -7,19 +10,6 @@ export function blockedDraftDisposition(classification: string | undefined): 'op
|
|
|
7
10
|
: 'open-draft';
|
|
8
11
|
}
|
|
9
12
|
|
|
10
|
-
/**
|
|
11
|
-
* DRAFT-NOT-ARCHIVE (RFC-draft-pr-accumulation-root-fix R1 · 첫 조각)
|
|
12
|
-
*
|
|
13
|
-
* S: 멈춘 런은 산출을 draft PR 로 남겼다 — PR 이 «실패 보관소»가 되어 열린 PR 이 200 을 넘고 겹침 검사가 눈이 멀었다.
|
|
14
|
-
* C: 닫힌 147건 중 사람이 실제로 봐야 했던 것은 «주인 자리» 47건뿐이었다.
|
|
15
|
-
* Q: 어느 멈춤이 PR 을 열 자격이 있나?
|
|
16
|
-
* A: 사람 판단이 필요한 멈춤(needs-owner)만. 나머지(harvestable)는 수확 가지 `salvage/<run>/<leaf>` ⊕ 런 원장의 «사유 · 다음 수»로 남긴다.
|
|
17
|
-
* `tools.selfImplement.draftOnStop` = 'always'(기본 · 종전) | 'needs-owner-only'.
|
|
18
|
-
*/
|
|
19
|
-
export type DraftOnStopMode = 'needs-owner-only' | 'always';
|
|
20
|
-
export const DRAFT_ON_STOP_MODES = ['needs-owner-only', 'always'] as const satisfies readonly DraftOnStopMode[];
|
|
21
|
-
export const DEFAULT_DRAFT_ON_STOP: DraftOnStopMode = 'always';
|
|
22
|
-
|
|
23
13
|
/** landable = 승인된 산출(merge-approved-abandoned) — 다음 수가 `pr land` 이므로 수확 가지로 숨기지 않고 PR 로 남긴다(⛔ needs-owner 라벨은 안 단다). */
|
|
24
14
|
export type StopClass = 'needs-owner' | 'harvestable' | 'landable';
|
|
25
15
|
|
|
@@ -99,9 +89,3 @@ export function salvageBranchForRun(runId: string, branch: string): string {
|
|
|
99
89
|
const leaf = branch.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^[-.]+|[-.]+$/g, '').replace(/\.\.+/g, '.').replace(/\.lock$/i, '-lock') || 'branch';
|
|
100
90
|
return `salvage/${runShort}/${leaf}`;
|
|
101
91
|
}
|
|
102
|
-
|
|
103
|
-
export function parseDraftOnStopMode(raw: unknown): { mode: DraftOnStopMode; invalid: boolean } {
|
|
104
|
-
if (raw === undefined) return { mode: DEFAULT_DRAFT_ON_STOP, invalid: false };
|
|
105
|
-
if (typeof raw === 'string' && (DRAFT_ON_STOP_MODES as readonly string[]).includes(raw)) return { mode: raw as DraftOnStopMode, invalid: false };
|
|
106
|
-
return { mode: DEFAULT_DRAFT_ON_STOP, invalid: true };
|
|
107
|
-
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// 회전·사용량 저장소·선호 해석은 기존 함수를 부른다. 여기선 다시 만들지 않는다.
|
|
3
3
|
|
|
4
4
|
import type { RotationCandidate } from '../oauth/codex-account-rotation.js';
|
|
5
|
-
import { inspectCodexRotation } from '../oauth/codex-account-store.js';
|
|
6
|
-
import { codexPolicyAllowsCredits } from '../oauth/codex-quota-policy.js';
|
|
5
|
+
import { DEFAULT_CODEX_CREDIT_RESERVE, inspectCodexRotation } from '../oauth/codex-account-store.js';
|
|
6
|
+
import { codexPolicyAllowsCredits, codexPolicyAllowsFallback } from '../oauth/codex-quota-policy.js';
|
|
7
7
|
import { getUsageStore } from '../budget/usage-store.js';
|
|
8
8
|
import type { UsageSnapshot } from '../budget/types.js';
|
|
9
9
|
import { debug } from '../debug/log.js';
|
|
@@ -35,7 +35,7 @@ export interface BudgetCodexCandidate {
|
|
|
35
35
|
|
|
36
36
|
export interface DecideBudgetInput {
|
|
37
37
|
readonly preference: {
|
|
38
|
-
readonly chain: readonly { readonly provider: string; readonly model?: string }[];
|
|
38
|
+
readonly chain: readonly { readonly provider: string; readonly model?: string; readonly codexCredits?: true }[];
|
|
39
39
|
readonly budgetGate: { readonly onShortfall: BudgetGateOnShortfall };
|
|
40
40
|
};
|
|
41
41
|
readonly codexCandidates: readonly BudgetCodexCandidate[];
|
|
@@ -44,6 +44,8 @@ export interface DecideBudgetInput {
|
|
|
44
44
|
readonly maxUsedPercent: BudgetGateMaxUsedPercent;
|
|
45
45
|
/** codex 한도 정책이 credits 인가(`codexPolicyAllowsCredits` · 회전·Pod 배분과 같은 해석). 없으면 false. */
|
|
46
46
|
readonly codexCreditsAllowed?: boolean;
|
|
47
|
+
/** SUBSCRIPTION-EXHAUST-REROUTE — `llm.codexCreditReserve`. 잔액이 이 값 «초과»인 계정만 크레딧 후보다. 없으면 종전(> 0). */
|
|
48
|
+
readonly codexCreditReserve?: number;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
export interface BudgetDecision {
|
|
@@ -59,6 +61,13 @@ export interface BudgetInputs {
|
|
|
59
61
|
readonly grokUsedPercent: number | undefined;
|
|
60
62
|
readonly maxUsedPercent: BudgetGateMaxUsedPercent;
|
|
61
63
|
readonly codexCreditsAllowed?: boolean;
|
|
64
|
+
readonly codexCreditReserve?: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** `llm.codexCreditReserve` from the same config the preference was read from — invalid or absent = default. */
|
|
68
|
+
function budgetCreditReserve(config: ChildLlmPreferenceInput): number {
|
|
69
|
+
const raw = (config as { llm?: { codexCreditReserve?: unknown } }).llm?.codexCreditReserve;
|
|
70
|
+
return typeof raw === 'number' && Number.isFinite(raw) && raw >= 0 ? raw : DEFAULT_CODEX_CREDIT_RESERVE;
|
|
62
71
|
}
|
|
63
72
|
|
|
64
73
|
const WEEKLY_WINDOW_MINUTES = 7 * 24 * 60;
|
|
@@ -109,11 +118,15 @@ function codexCandidateUsable(candidate: BudgetCodexCandidate, cap: number | und
|
|
|
109
118
|
|
|
110
119
|
/** BUDGET-GATE(10-05) — 정책이 credits 면 구독 % 가 차도 크레딧 잔액이 «확인된» 계정으로 계속 간다(Pod 배분과 같은 결론).
|
|
111
120
|
* 잔액을 모르면 쓰지 않는다 — 크레딧은 돈이라 fail-closed. 잔액이 가장 큰 계정 하나를 돌려준다. */
|
|
112
|
-
function codexCreditCandidate(input: DecideBudgetInput): BudgetCodexCandidate | undefined {
|
|
113
|
-
|
|
121
|
+
function codexCreditCandidate(input: DecideBudgetInput, creditsStep = false): BudgetCodexCandidate | undefined {
|
|
122
|
+
// `codex-credits` 칸은 «체인이 거기까지 왔을 때»만 크레딧을 연다 — 정책(첫 칸)의 크레딧 금지와 별개다.
|
|
123
|
+
if (input.codexCreditsAllowed !== true && !creditsStep) return undefined;
|
|
124
|
+
// The credits step (new spend path) defaults to the reserve when none was passed — money, fail-closed; the policy path keeps > 0.
|
|
125
|
+
const floor = typeof input.codexCreditReserve === 'number' && Number.isFinite(input.codexCreditReserve) && input.codexCreditReserve >= 0
|
|
126
|
+
? input.codexCreditReserve : creditsStep && input.codexCreditsAllowed !== true ? DEFAULT_CODEX_CREDIT_RESERVE : 0;
|
|
114
127
|
return input.codexCandidates
|
|
115
128
|
.filter((candidate) => candidate.hasCredits !== false
|
|
116
|
-
&& typeof candidate.creditBalance === 'number' && Number.isFinite(candidate.creditBalance) && candidate.creditBalance >
|
|
129
|
+
&& typeof candidate.creditBalance === 'number' && Number.isFinite(candidate.creditBalance) && candidate.creditBalance > floor)
|
|
117
130
|
.sort((a, b) => (b.creditBalance! - a.creditBalance!) || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))[0];
|
|
118
131
|
}
|
|
119
132
|
|
|
@@ -121,7 +134,19 @@ function slotUsable(
|
|
|
121
134
|
provider: string,
|
|
122
135
|
input: DecideBudgetInput,
|
|
123
136
|
allowUnmeasured = false,
|
|
137
|
+
codexCreditsSlot = false,
|
|
124
138
|
): { usable: boolean; reason: string; unmeasured?: boolean } {
|
|
139
|
+
if (provider === CODEX_PROVIDER && codexCreditsSlot) {
|
|
140
|
+
// CODEX-CREDITS-STEP — 잔액이 «확인된» 계정만(모르면 못 쓴다 · 돈이라 fail-closed). 미측정 통과도 «없다».
|
|
141
|
+
const credit = codexCreditCandidate(input, true);
|
|
142
|
+
if (!credit) {
|
|
143
|
+
// 칸에 «닿았지만» 잔액 확인된 계정이 없다 — 실패한 도달도 남긴다.
|
|
144
|
+
try { debug.log('budget.gate', 'codex-credits-step', { outcome: 'skipped', why: 'codex-credits-unavailable' }); } catch { /* observation is fail-soft */ }
|
|
145
|
+
}
|
|
146
|
+
return credit
|
|
147
|
+
? { usable: true, reason: `codex-credits: ${credit.name} 크레딧 잔액 ${credit.creditBalance} (체인 마지막 칸 · 과금)` }
|
|
148
|
+
: { usable: false, reason: 'codex-credits: 잔액이 확인된 계정 없음' };
|
|
149
|
+
}
|
|
125
150
|
if (provider === CODEX_PROVIDER) {
|
|
126
151
|
const cap = capFor(input.maxUsedPercent, CODEX_PROVIDER);
|
|
127
152
|
const measuredUsable = input.codexCandidates.some((candidate) => codexCandidateUsable(candidate, cap));
|
|
@@ -139,16 +164,19 @@ function slotUsable(
|
|
|
139
164
|
}
|
|
140
165
|
if (provider === GROK_PROVIDER) {
|
|
141
166
|
const configured = capFor(input.maxUsedPercent, GROK_PROVIDER);
|
|
142
|
-
// 발사 관문은
|
|
143
|
-
// «못 쟀다»(undefined)는
|
|
167
|
+
// 발사 관문은 잰 주간 사용률에만 80% 상한을 적용한다.
|
|
168
|
+
// «못 쟀다»(undefined)는 allowUnmeasured 일 때 통과하고 unmeasured 를 남긴다(codex 와 같은 꼴).
|
|
169
|
+
// decideBudget 은 설정 상한을 그대로 쓰고 모름을 통과로 보지 않는다.
|
|
144
170
|
const cap = allowUnmeasured ? LAUNCH_GROK_USED_PERCENT_CAP : configured;
|
|
145
171
|
const known = typeof input.grokUsedPercent === 'number' && Number.isFinite(input.grokUsedPercent);
|
|
146
|
-
const
|
|
172
|
+
const measuredUsable = cap === undefined
|
|
147
173
|
? known
|
|
148
174
|
: known && (input.grokUsedPercent as number) < cap;
|
|
175
|
+
const unmeasured = allowUnmeasured && !known;
|
|
149
176
|
return {
|
|
150
|
-
usable,
|
|
177
|
+
usable: measuredUsable || unmeasured,
|
|
151
178
|
reason: formatGrokReason(input.grokUsedPercent, cap),
|
|
179
|
+
...(unmeasured ? { unmeasured: true } : {}),
|
|
152
180
|
};
|
|
153
181
|
}
|
|
154
182
|
return { usable: false, reason: `${provider}: 예산 판정 없음` };
|
|
@@ -176,13 +204,19 @@ function decideBudgetWithPolicy(input: DecideBudgetInput, allowUnmeasured: boole
|
|
|
176
204
|
let firstUnusable = false;
|
|
177
205
|
for (let index = 0; index < input.preference.chain.length; index++) {
|
|
178
206
|
const slot = input.preference.chain[index]!;
|
|
179
|
-
const judged = slotUsable(slot.provider, input, allowUnmeasured);
|
|
207
|
+
const judged = slotUsable(slot.provider, input, allowUnmeasured, slot.codexCredits === true);
|
|
180
208
|
reasons.push(judged.reason);
|
|
181
209
|
if (!judged.usable) {
|
|
182
210
|
if (index === 0) firstUnusable = true;
|
|
183
211
|
continue;
|
|
184
212
|
}
|
|
185
213
|
const action: BudgetAction = index === 0 || !firstUnusable ? 'proceed' : 'next-provider';
|
|
214
|
+
if (slot.codexCredits === true) {
|
|
215
|
+
try {
|
|
216
|
+
// 체인이 «마지막 칸»(유료)에 닿을 때마다 한 줄 — 앞 칸을 왜 못 썼나는 reasons 가 말한다(비밀 없음).
|
|
217
|
+
debug.log('budget.gate', 'codex-credits-step', { outcome: 'credits', action, reasons, launch: allowUnmeasured }, { level: 'warn' });
|
|
218
|
+
} catch { /* observation is fail-soft */ }
|
|
219
|
+
}
|
|
186
220
|
return {
|
|
187
221
|
decision: {
|
|
188
222
|
action,
|
|
@@ -230,8 +264,12 @@ export interface ReadBudgetInputsDeps {
|
|
|
230
264
|
/** 설정·codex 회전·grok 스냅숏을 읽어 판정 입력을 만든다. 판정 자체는 하지 않는다. */
|
|
231
265
|
export function readBudgetInputs(deps: ReadBudgetInputsDeps = {}): BudgetInputs {
|
|
232
266
|
const config = deps.config ?? deps.loadConfig?.() ?? loadLiveConfig();
|
|
233
|
-
const
|
|
267
|
+
const resolved = resolveChildLlmPreference(config);
|
|
234
268
|
const rotation = (deps.inspectCodex ?? inspectCodexRotation)();
|
|
269
|
+
// 정책 within-quota(한도 안에서만)는 크레딧을 «절대» 안 쓴다 — `codex-credits` 칸도 뺀다(회전·폴백 판정과 같은 해석).
|
|
270
|
+
const preference = rotation.policy && !codexPolicyAllowsFallback(rotation.policy.policy)
|
|
271
|
+
? { ...resolved, chain: resolved.chain.filter((slot) => slot.codexCredits !== true) }
|
|
272
|
+
: resolved;
|
|
235
273
|
const snapshot = deps.grokSnapshot
|
|
236
274
|
? deps.grokSnapshot()
|
|
237
275
|
: getUsageStore().getSnapshot('grok');
|
|
@@ -242,7 +280,9 @@ export function readBudgetInputs(deps: ReadBudgetInputsDeps = {}): BudgetInputs
|
|
|
242
280
|
grokUsedPercent: grokWeeklyUsedPercent(snapshot),
|
|
243
281
|
maxUsedPercent,
|
|
244
282
|
// 회전·Pod 배분과 같은 해석(`resolveCodexQuotaPolicy` → `codexPolicyAllowsCredits`)을 읽는다 — 다시 짓지 않는다.
|
|
245
|
-
...(rotation.policy && codexPolicyAllowsCredits(rotation.policy.policy) ? { codexCreditsAllowed: true
|
|
283
|
+
...(rotation.policy && codexPolicyAllowsCredits(rotation.policy.policy) ? { codexCreditsAllowed: true, codexCreditReserve: budgetCreditReserve(config) }
|
|
284
|
+
// CODEX-CREDITS-STEP — the `codex-credits` slot keeps the same reserve (a credit spend below it is the case the reserve exists for).
|
|
285
|
+
: preference.chain.some((slot) => slot.codexCredits === true) ? { codexCreditReserve: budgetCreditReserve(config) } : {}),
|
|
246
286
|
};
|
|
247
287
|
}
|
|
248
288
|
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
|
|
3
|
+
export const SMALL_CHILD_CONTEXT_TOKEN_BUDGET = 32_000;
|
|
4
|
+
|
|
5
|
+
export const CHILD_CONTEXT_COMPONENT_NAMES = [
|
|
6
|
+
'systemPrompt',
|
|
7
|
+
'agentsMd',
|
|
8
|
+
'claudeMd',
|
|
9
|
+
'toolSchemas',
|
|
10
|
+
'goal',
|
|
11
|
+
'ledger',
|
|
12
|
+
] as const;
|
|
13
|
+
|
|
14
|
+
export type ChildContextComponentName = typeof CHILD_CONTEXT_COMPONENT_NAMES[number];
|
|
15
|
+
export type ChildContextProfile = 'default' | 'small';
|
|
16
|
+
|
|
17
|
+
export interface ChildContextComponents {
|
|
18
|
+
readonly systemPrompt?: string;
|
|
19
|
+
readonly agentsMd?: string;
|
|
20
|
+
readonly claudeMd?: string;
|
|
21
|
+
readonly toolSchemas?: string;
|
|
22
|
+
readonly goal?: string;
|
|
23
|
+
readonly ledger?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ChildContextComponentMeasurement {
|
|
27
|
+
readonly inputBytes: number;
|
|
28
|
+
readonly includedBytes: number;
|
|
29
|
+
readonly truncated: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ChildContextComposition {
|
|
33
|
+
readonly text: string;
|
|
34
|
+
readonly profile: ChildContextProfile;
|
|
35
|
+
readonly budgetTokens: number | null;
|
|
36
|
+
/** UTF-8 bytes are a conservative upper bound on tokenizer tokens. */
|
|
37
|
+
readonly tokenUpperBound: number;
|
|
38
|
+
readonly components: Readonly<Record<ChildContextComponentName, ChildContextComponentMeasurement>>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ComposeChildContextOptions {
|
|
42
|
+
readonly profile?: ChildContextProfile;
|
|
43
|
+
readonly log?: (event: string, data: Record<string, unknown>) => void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const JOINER = '\n\n';
|
|
47
|
+
|
|
48
|
+
function utf8Bytes(value: string): number {
|
|
49
|
+
return Buffer.byteLength(value, 'utf8');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function prefixWithinUtf8Budget(value: string, byteBudget: number): string {
|
|
53
|
+
if (byteBudget <= 0) return '';
|
|
54
|
+
let included = '';
|
|
55
|
+
let bytes = 0;
|
|
56
|
+
for (const character of value) {
|
|
57
|
+
const characterBytes = utf8Bytes(character);
|
|
58
|
+
if (bytes + characterBytes > byteBudget) break;
|
|
59
|
+
included += character;
|
|
60
|
+
bytes += characterBytes;
|
|
61
|
+
}
|
|
62
|
+
return included;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function emptyMeasurements(): Record<ChildContextComponentName, ChildContextComponentMeasurement> {
|
|
66
|
+
return {
|
|
67
|
+
systemPrompt: { inputBytes: 0, includedBytes: 0, truncated: false },
|
|
68
|
+
agentsMd: { inputBytes: 0, includedBytes: 0, truncated: false },
|
|
69
|
+
claudeMd: { inputBytes: 0, includedBytes: 0, truncated: false },
|
|
70
|
+
toolSchemas: { inputBytes: 0, includedBytes: 0, truncated: false },
|
|
71
|
+
goal: { inputBytes: 0, includedBytes: 0, truncated: false },
|
|
72
|
+
ledger: { inputBytes: 0, includedBytes: 0, truncated: false },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function emitCompositionEvent(
|
|
77
|
+
log: ((event: string, data: Record<string, unknown>) => void) | undefined,
|
|
78
|
+
data: Record<string, unknown>,
|
|
79
|
+
): void {
|
|
80
|
+
try {
|
|
81
|
+
if (log) log('child.context-composition', data);
|
|
82
|
+
else debug.log('self-implement', 'child.context-composition', data);
|
|
83
|
+
} catch {
|
|
84
|
+
// Context composition must not fail because an observation sink is unavailable.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Composes the implementation child's first-turn context and records the byte
|
|
90
|
+
* contribution of every input component. The small profile spends its hard cap
|
|
91
|
+
* on executable context first and trims repository instruction files last.
|
|
92
|
+
*/
|
|
93
|
+
export function composeChildContext(
|
|
94
|
+
components: ChildContextComponents,
|
|
95
|
+
options: ComposeChildContextOptions = {},
|
|
96
|
+
): ChildContextComposition {
|
|
97
|
+
const profile = options.profile ?? 'default';
|
|
98
|
+
const budgetBytes = profile === 'small' ? SMALL_CHILD_CONTEXT_TOKEN_BUDGET : null;
|
|
99
|
+
const measurements = emptyMeasurements();
|
|
100
|
+
const included: Partial<Record<ChildContextComponentName, string>> = {};
|
|
101
|
+
const order: readonly ChildContextComponentName[] = profile === 'small'
|
|
102
|
+
? ['systemPrompt', 'toolSchemas', 'goal', 'ledger', 'agentsMd', 'claudeMd']
|
|
103
|
+
: CHILD_CONTEXT_COMPONENT_NAMES;
|
|
104
|
+
let usedBytes = 0;
|
|
105
|
+
let includedCount = 0;
|
|
106
|
+
|
|
107
|
+
for (const name of order) {
|
|
108
|
+
const value = components[name] ?? '';
|
|
109
|
+
const inputBytes = utf8Bytes(value);
|
|
110
|
+
const separatorBytes = includedCount > 0 && value.length > 0 ? utf8Bytes(JOINER) : 0;
|
|
111
|
+
const availableBytes = budgetBytes === null ? Number.POSITIVE_INFINITY : Math.max(0, budgetBytes - usedBytes - separatorBytes);
|
|
112
|
+
const includedValue = inputBytes <= availableBytes ? value : prefixWithinUtf8Budget(value, availableBytes);
|
|
113
|
+
const includedBytes = utf8Bytes(includedValue);
|
|
114
|
+
measurements[name] = { inputBytes, includedBytes, truncated: includedBytes < inputBytes };
|
|
115
|
+
if (includedValue.length === 0) continue;
|
|
116
|
+
included[name] = includedValue;
|
|
117
|
+
usedBytes += separatorBytes + includedBytes;
|
|
118
|
+
includedCount += 1;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const text = CHILD_CONTEXT_COMPONENT_NAMES
|
|
122
|
+
.flatMap((name) => included[name] === undefined ? [] : [included[name]!])
|
|
123
|
+
.join(JOINER);
|
|
124
|
+
const tokenUpperBound = utf8Bytes(text);
|
|
125
|
+
const result: ChildContextComposition = {
|
|
126
|
+
text,
|
|
127
|
+
profile,
|
|
128
|
+
budgetTokens: budgetBytes === null ? null : SMALL_CHILD_CONTEXT_TOKEN_BUDGET,
|
|
129
|
+
tokenUpperBound,
|
|
130
|
+
components: measurements,
|
|
131
|
+
};
|
|
132
|
+
emitCompositionEvent(options.log, {
|
|
133
|
+
profile,
|
|
134
|
+
budgetTokens: result.budgetTokens,
|
|
135
|
+
tokenUpperBound,
|
|
136
|
+
components: measurements,
|
|
137
|
+
});
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
@@ -11,9 +11,12 @@ import type {
|
|
|
11
11
|
import { DEFAULT_BUDGET_GATE } from '../user-config.js';
|
|
12
12
|
import { debug } from '../debug/log.js';
|
|
13
13
|
|
|
14
|
+
/** 체인 한 칸. `codexCredits` = `llm.fallbackChain` 의 `codex-credits` 칸(codex 를 선불 크레딧으로 · 마지막 수단). */
|
|
15
|
+
export type ChildLlmChainSlot = ChildLlmChainEntry & { readonly codexCredits?: true };
|
|
16
|
+
|
|
14
17
|
export interface ResolvedChildLlmPreference {
|
|
15
18
|
mode: ChildLlmPreferenceMode;
|
|
16
|
-
chain:
|
|
19
|
+
chain: ChildLlmChainSlot[];
|
|
17
20
|
budgetGate: {
|
|
18
21
|
minHeadroomPercent: number;
|
|
19
22
|
onShortfall: BudgetGateOnShortfall;
|
|
@@ -27,6 +30,8 @@ export type ChildLlmPreferenceInput = Pick<UserConfig, 'tools' | 'llm'> & Partia
|
|
|
27
30
|
const FALLBACK_NAME_TO_PROVIDER: Readonly<Record<string, string>> = {
|
|
28
31
|
'codex-rotate': 'openai-codex',
|
|
29
32
|
grok: 'grok',
|
|
33
|
+
// CODEX-CREDITS-STEP — provider 는 같은 codex 지만 «크레딧 칸»이라 따로 센다(아래 중복 판정).
|
|
34
|
+
'codex-credits': 'openai-codex',
|
|
30
35
|
};
|
|
31
36
|
|
|
32
37
|
function warnPreference(detail: string): void {
|
|
@@ -39,15 +44,18 @@ function warnPreference(detail: string): void {
|
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
/** `llm.fallbackChain` 이름을 자식 프로바이더 칸으로 옮긴다. 모르는 이름은 경고하고 건너뛴다. */
|
|
42
|
-
export function chainFromFallbackNames(names: readonly string[] | undefined):
|
|
43
|
-
const chain:
|
|
47
|
+
export function chainFromFallbackNames(names: readonly string[] | undefined): ChildLlmChainSlot[] {
|
|
48
|
+
const chain: ChildLlmChainSlot[] = [];
|
|
44
49
|
for (const name of names ?? []) {
|
|
45
50
|
const provider = FALLBACK_NAME_TO_PROVIDER[name];
|
|
46
51
|
if (!provider) {
|
|
47
52
|
warnPreference(`llm.fallbackChain 의 모르는 이름 '${name}' 을 건너뜀`);
|
|
48
53
|
continue;
|
|
49
54
|
}
|
|
50
|
-
|
|
55
|
+
const codexCredits = name === 'codex-credits';
|
|
56
|
+
if (!chain.some((entry) => entry.provider === provider && (entry.codexCredits === true) === codexCredits)) {
|
|
57
|
+
chain.push(codexCredits ? { provider, codexCredits: true } : { provider });
|
|
58
|
+
}
|
|
51
59
|
}
|
|
52
60
|
return chain;
|
|
53
61
|
}
|
|
@@ -60,7 +68,7 @@ export function resolveChildLlmPreference(config: ChildLlmPreferenceInput): Reso
|
|
|
60
68
|
const mode: ChildLlmPreferenceMode = explicitMode ?? (provider ? 'pinned' : 'auto');
|
|
61
69
|
const modeSource: ResolvedChildLlmPreference['source']['mode'] = explicitMode ? 'explicit' : 'inferred';
|
|
62
70
|
|
|
63
|
-
let chain:
|
|
71
|
+
let chain: ChildLlmChainSlot[];
|
|
64
72
|
let chainSource: ResolvedChildLlmPreference['source']['chain'];
|
|
65
73
|
if (mode === 'pinned') {
|
|
66
74
|
// 계정 회전은 여기 없다. provider 없는 model 은 pinned 가 아니다.
|