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
|
@@ -12,7 +12,7 @@ import { launchAndVerifyGoalDeliverable } from '../harness/deliverable-verify-cl
|
|
|
12
12
|
import type { DeployVerifyResult } from '../harness/browser-verify.js';
|
|
13
13
|
import { buildSelfOrchestrateDevSpec, executeOrchestrateReroute } from './dev-pipeline.js';
|
|
14
14
|
import type { DevPipelineDeps, OrchestrateRuntime } from './dev-pipeline.js';
|
|
15
|
-
import { resolveOrchestrateConcurrency } from './orchestrate.js';
|
|
15
|
+
import { resolveOrchestrateConcurrency, resumeKey } from './orchestrate.js';
|
|
16
16
|
import type { FailureClassification, SelfDevGoal, SelfDevJobResult } from './orchestrate.js';
|
|
17
17
|
import { superviseRun, type SupervisorDecision } from './run-supervisor.js';
|
|
18
18
|
import { readDecomposeProposals, applyDecomposeProposals } from './decompose-proposal.js';
|
|
@@ -421,6 +421,9 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
421
421
|
await recordRoundPrs(results);
|
|
422
422
|
results = await superviseRun({
|
|
423
423
|
initial: results,
|
|
424
|
+
// The add-repair-task branch below runs each authored review-oscillation repair goal as that goal's new
|
|
425
|
+
// feature (a fresh piece, same goal id) — the supervisor records the repair text, so a second oscillation stops.
|
|
426
|
+
repairGoalExecution: true,
|
|
424
427
|
limits,
|
|
425
428
|
enrich: (rs) => backfillDecomposeProposals([...rs], deps),
|
|
426
429
|
onDecision: (decision) => {
|
|
@@ -431,8 +434,28 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
431
434
|
onRound: (rs) => { try { baseRuntime.checkpoint?.([...rs]); } catch { /* fail-open */ } },
|
|
432
435
|
// ⭐ 방금 끝난 결과를 넘긴다 — orchestrateSelfDev 가 classifyResumeDisposition 으로
|
|
433
436
|
// skip/rerun 을 갈라준다(재발명 0 · 착지한 조각은 다시 안 돈다).
|
|
434
|
-
rerun: async (previous) => {
|
|
435
|
-
|
|
437
|
+
rerun: async (previous, invocation) => {
|
|
438
|
+
let addedRepairIds: string[] = [];
|
|
439
|
+
// A requested repair that cannot be bound to exactly one goal is held (not relaunched with the old strategy).
|
|
440
|
+
const unrepairedHold: string[] = [];
|
|
441
|
+
if (invocation.repairGoals) {
|
|
442
|
+
const replacements = new Map<SelfDevGoal, string>();
|
|
443
|
+
for (const [taskId, repairGoal] of Object.entries(invocation.repairGoals)) {
|
|
444
|
+
const source = previous.find((result) => result.taskId === taskId);
|
|
445
|
+
const matches = source ? currentGoals.filter((goal) => resumeKey(goal.feature) === resumeKey(source.feature)) : [];
|
|
446
|
+
if (matches.length === 1 && !replacements.has(matches[0]!)) replacements.set(matches[0]!, repairGoal);
|
|
447
|
+
else unrepairedHold.push(taskId);
|
|
448
|
+
}
|
|
449
|
+
currentGoals = currentGoals.map((goal) => replacements.has(goal) ? { ...goal, feature: replacements.get(goal)! } : goal);
|
|
450
|
+
spec = buildSelfOrchestrateDevSpec(currentGoals, input.concurrency);
|
|
451
|
+
try {
|
|
452
|
+
debug.log('self-dev.supervisor', 'oscillation-repair.executed', {
|
|
453
|
+
surface: 'orchestrate', replaced: replacements.size, requested: Object.keys(invocation.repairGoals).length, held: unrepairedHold,
|
|
454
|
+
});
|
|
455
|
+
} catch { /* fail-open */ }
|
|
456
|
+
}
|
|
457
|
+
// A review-oscillation decision attaches only its authored repair goals (above) — never deliverable fragments too.
|
|
458
|
+
if (currentDecision?.action === 'add-repair-task' && !currentDecision.oscillation) {
|
|
436
459
|
const appended = appendRepairFragments(currentGoals, currentDecision.classifications, {
|
|
437
460
|
seenFingerprints: repairFingerprints,
|
|
438
461
|
addedCount: repairFragmentsAdded,
|
|
@@ -441,6 +464,7 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
441
464
|
repairFragmentsAdded += appended.added.length;
|
|
442
465
|
for (const outcome of appended.added) repairFingerprints.set(outcome.fingerprint, (repairFingerprints.get(outcome.fingerprint) ?? 0) + 1);
|
|
443
466
|
repairAppend.push({ added: appended.added, skipped: appended.skipped });
|
|
467
|
+
addedRepairIds = appended.added.map((item) => `repair:${item.fingerprint}`);
|
|
444
468
|
spec = buildSelfOrchestrateDevSpec(currentGoals, input.concurrency);
|
|
445
469
|
if (appended.added.length === 0) {
|
|
446
470
|
currentDecision.why = `${currentDecision.why} — 수리 조각 추가 없음 (${appended.skipped.length}건 건너뜀)`;
|
|
@@ -460,6 +484,7 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
460
484
|
// 판정(decompose-and-retry)은 트리아지가 이미 했다. 여기는 그 답을 집행만 한다.
|
|
461
485
|
// ⛔ 의존성은 조각이 «들고 온 그대로» 물려준다 ⇒ dependsOn 이 없는 조각은
|
|
462
486
|
// orchestrateSelfDev 의 위상 병렬로 «자동으로 동시에» 돈다(대표 2026-08-19 기본 동작).
|
|
487
|
+
const goalsBeforeDecompose = new Set(currentGoals);
|
|
463
488
|
const applied = applyDecomposeProposals(currentGoals, previous, { alreadyDecomposed: decomposedFeatures });
|
|
464
489
|
if (applied.decomposed.length > 0) {
|
|
465
490
|
for (const f of applied.decomposed) decomposedFeatures.add(f);
|
|
@@ -484,8 +509,60 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
484
509
|
baseRuntime = runtimeWithParentRequest();
|
|
485
510
|
// ⛔⭐ 판정이 「사람이 볼 것」이라 한 조각은 집행이 다시 돌리지 않는다 — 판정과 집행이 갈리면
|
|
486
511
|
// `pr-opened` 조각이 duplicate-risk 로 재실행돼 PR 이 겹친다(2026-09-25 실측).
|
|
487
|
-
const resumeHold = currentDecision?.needsHuman ?? [];
|
|
488
|
-
|
|
512
|
+
const resumeHold = [...new Set([...(currentDecision?.needsHuman ?? []), ...unrepairedHold])];
|
|
513
|
+
// The engine's resume lookup is last-result-wins for each normalized feature.
|
|
514
|
+
// Use that exact predecessor, not any earlier task sharing the same feature.
|
|
515
|
+
const selectedPrior = new Map(previous.map((result) => [resumeKey(result.feature), result.taskId]));
|
|
516
|
+
const strategyByPriorId = new Map<string, 'rerun' | 'rework' | 'decompose-and-retry'>();
|
|
517
|
+
for (const id of currentDecision?.rerunnable ?? []) strategyByPriorId.set(id, 'rerun');
|
|
518
|
+
for (const id of currentDecision?.reworkable ?? []) strategyByPriorId.set(id, 'rework');
|
|
519
|
+
for (const id of currentDecision?.decomposable ?? []) strategyByPriorId.set(id, 'decompose-and-retry');
|
|
520
|
+
const strategyByGoal = new Map<SelfDevGoal, string>();
|
|
521
|
+
for (const goal of currentGoals) {
|
|
522
|
+
const predecessor = selectedPrior.get(resumeKey(goal.feature));
|
|
523
|
+
if (predecessor && strategyByPriorId.has(predecessor)) strategyByGoal.set(goal, strategyByPriorId.get(predecessor)!);
|
|
524
|
+
if (goal.id && addedRepairIds.includes(goal.id)) strategyByGoal.set(goal, 'add-repair-task');
|
|
525
|
+
}
|
|
526
|
+
// Pieces have fresh goal objects; the selected source must actually have been decomposed.
|
|
527
|
+
for (const id of currentDecision?.decomposable ?? []) {
|
|
528
|
+
const source = previous.find((result) => result.taskId === id);
|
|
529
|
+
if (!source || selectedPrior.get(resumeKey(source.feature)) !== id || !applied.decomposed.includes(source.feature)) continue;
|
|
530
|
+
for (const piece of source.decomposeProposal?.pieces ?? []) {
|
|
531
|
+
const goal = currentGoals.find((candidate) => !goalsBeforeDecompose.has(candidate) && candidate.id === piece.id && candidate.feature === piece.feature);
|
|
532
|
+
if (goal) strategyByGoal.set(goal, 'decompose-and-retry');
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
const requested = new Map<string, number>();
|
|
536
|
+
for (const strategy of strategyByGoal.values()) requested.set(strategy, (requested.get(strategy) ?? 0) + 1);
|
|
537
|
+
const launchedByStrategy = new Map<string, string[]>();
|
|
538
|
+
const next = await exec(spec, {
|
|
539
|
+
...baseRuntime, resumeFrom: [...previous], ...(resumeHold.length > 0 ? { resumeHold } : {}),
|
|
540
|
+
onTaskLaunched: (goal, taskId, priorTaskId) => {
|
|
541
|
+
baseRuntime.onTaskLaunched?.(goal, taskId, priorTaskId);
|
|
542
|
+
const strategy = strategyByGoal.get(goal);
|
|
543
|
+
if (!strategy) return;
|
|
544
|
+
if (strategy === 'add-repair-task' && !addedRepairIds.includes(goal.id ?? '')) return;
|
|
545
|
+
if (strategy === 'decompose-and-retry' && goalsBeforeDecompose.has(goal)
|
|
546
|
+
&& (priorTaskId === undefined || priorTaskId !== selectedPrior.get(resumeKey(goal.feature)))) return;
|
|
547
|
+
if (strategy !== 'add-repair-task' && strategy !== 'decompose-and-retry'
|
|
548
|
+
&& (priorTaskId === undefined || priorTaskId !== selectedPrior.get(resumeKey(goal.feature)))) return;
|
|
549
|
+
const launched = launchedByStrategy.get(strategy) ?? [];
|
|
550
|
+
launched.push(taskId);
|
|
551
|
+
launchedByStrategy.set(strategy, launched);
|
|
552
|
+
},
|
|
553
|
+
}, pipelineDeps);
|
|
554
|
+
// runSelfOrchestrateCliCommand → superviseRun.rerun → executeOrchestrateReroute → orchestrateSelfDev.
|
|
555
|
+
// Only task identities observed at dispatch count; a checkpoint result cannot claim another strategy's launch.
|
|
556
|
+
for (const [strategy, count] of requested) {
|
|
557
|
+
const returnedIds = new Set(next.results.map((result) => result.taskId));
|
|
558
|
+
const taskIds = (launchedByStrategy.get(strategy) ?? []).filter((id) => returnedIds.has(id));
|
|
559
|
+
try {
|
|
560
|
+
debug.log('self-dev.supervisor', 'strategy.launch', {
|
|
561
|
+
strategy, round: supervisedRound + 1, requested: count,
|
|
562
|
+
launched: taskIds.length, taskIds,
|
|
563
|
+
});
|
|
564
|
+
} catch { /* observation must not interrupt execution */ }
|
|
565
|
+
}
|
|
489
566
|
exitCode = next.exitCode;
|
|
490
567
|
supervisedRound += 1;
|
|
491
568
|
await recordRoundPrs(next.results);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SelfDevJobResult } from './run-types.js';
|
|
2
|
+
|
|
3
|
+
/** Error codes whose message is the only place the Pod failure reason survives — the harness Pod exit
|
|
4
|
+
* classifier (src/harness/harness-cli-command.ts) reads it back from this line (POD-EXIT-REASON-SHOWN). */
|
|
5
|
+
const MESSAGE_CODES = new Set(['pod-job-failed', 'pod-child-failed']);
|
|
6
|
+
|
|
7
|
+
/** One human summary line per job printed by `elanous self orchestrate` (src/index.ts). */
|
|
8
|
+
export function formatOrchestrateResultLine(r: Pick<SelfDevJobResult, 'status' | 'feature' | 'merged' | 'prUrl' | 'stage' | 'error'>): string {
|
|
9
|
+
const icon = r.status === 'done' ? '✅' : r.status === 'cancelled' ? '⛔' : '❌';
|
|
10
|
+
const disp = r.merged ? ` → merged ${r.prUrl}` : r.prUrl ? ` → PR ${r.prUrl}` : r.stage ? ` [${r.stage}]` : '';
|
|
11
|
+
const error = r.error ? ` — ${r.error.code}${MESSAGE_CODES.has(r.error.code) ? `: ${r.error.message}` : ''}` : '';
|
|
12
|
+
return ` ${icon} ${r.status} · ${r.feature.slice(0, 56)}${disp}${error}`;
|
|
13
|
+
}
|
|
@@ -23,6 +23,7 @@ import { parentUnlandedProgressLine } from './run-supervisor.js';
|
|
|
23
23
|
import { mkdirSync, openSync, writeFileSync, closeSync, renameSync, unlinkSync } from 'node:fs';
|
|
24
24
|
import { join, resolve } from 'node:path';
|
|
25
25
|
import { goalPathFromArgv, launchRegistryDir, removeLaunchBinding, writeLaunchBinding } from '../harness/launch-registry.js';
|
|
26
|
+
import { adoptRunCard } from '../task-agent/run-adopt.js';
|
|
26
27
|
import { availableParallelism, cpus } from 'node:os';
|
|
27
28
|
import { selfDevRunsDir } from './run-store.js';
|
|
28
29
|
import { HARNESS_RUN_ID_ENV, normalizeRunId } from '../harness/harness-space.js';
|
|
@@ -30,6 +31,8 @@ import { plannedSelfImplBranch } from '../harness/worktree-branch-prefix.js';
|
|
|
30
31
|
import { parseGoalId } from '../self-implement/goal-author.js';
|
|
31
32
|
import { isTransientExecutionFailure } from './execution-transient.js';
|
|
32
33
|
import type { AbandonedClassification } from '../self-implement/abandoned-classification.js';
|
|
34
|
+
import type { JobKind, SelfDevGoal, SelfDevJobResult } from './run-types.js';
|
|
35
|
+
export type { JobKind, SelfDevGoalType, SelfDevGoal, SelfDevJobResult } from './run-types.js';
|
|
33
36
|
import type { DeployVerifyFinding, DeployVerifyResult } from '../harness/browser-verify.js';
|
|
34
37
|
import type { LogQuery, LogStoreRow } from '../mss/logging/log-store.js';
|
|
35
38
|
import { observeDeliverables, type DeliverableObservationTarget } from '../harness/deliverable-observation.js';
|
|
@@ -80,9 +83,6 @@ const LEGIT_PIPELINE_FAIL_STAGES: ReadonlySet<string> = new Set([
|
|
|
80
83
|
'gate-failed', 'review-blocked', 'merge-conflict', 'timed-out', 'aborted', 'pr-declined',
|
|
81
84
|
]);
|
|
82
85
|
|
|
83
|
-
export type JobKind = 'dev' | 'search' | 'deploy' | 'media';
|
|
84
|
-
export type SelfDevGoalType = 'implement' | 'research' | 'document' | 'operate';
|
|
85
|
-
|
|
86
86
|
/** Maps a heterogeneous job kind to an existing TOX surface adapter. */
|
|
87
87
|
export interface JobKindDefinition {
|
|
88
88
|
surfaceKind: TaskSurfaceKind;
|
|
@@ -195,47 +195,6 @@ export function formatShardHandoffInput(
|
|
|
195
195
|
return compact.length <= boundedLength ? compact : JSON.stringify({ truncated: true });
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
export interface SelfDevGoal {
|
|
199
|
-
/** F1 job kind. Omitted remains the legacy `dev` self-implement job. */
|
|
200
|
-
kind?: JobKind;
|
|
201
|
-
/** Decomposition intent; deliberately distinct from executable `kind`. */
|
|
202
|
-
goalType?: SelfDevGoalType;
|
|
203
|
-
/** Feature/goal text → `elanous self implement <feature>` for dev jobs. */
|
|
204
|
-
feature: string;
|
|
205
|
-
/** Pod lease predecessor goal ID or PR number. */
|
|
206
|
-
after?: string | number;
|
|
207
|
-
base?: string;
|
|
208
|
-
autoMerge?: boolean;
|
|
209
|
-
/** G8 — attach `auto-review` opt-in label on PR (subject to eligibility self-assessment). */
|
|
210
|
-
autoReview?: boolean;
|
|
211
|
-
/** S3 — open a draft PR via the job's own merge-decision node (HITL).
|
|
212
|
-
* Promotion flows through the review node → disposition recorded
|
|
213
|
-
* internally (no external hand-merge). */
|
|
214
|
-
openPr?: boolean;
|
|
215
|
-
draft?: boolean;
|
|
216
|
-
/** Optional short title (≤ 80 chars). Default = feature head. */
|
|
217
|
-
title?: string;
|
|
218
|
-
/** 계획 브랜치가 알려지면 같은 워크트리의 실행을 직렬화한다. */
|
|
219
|
-
planBranch?: string;
|
|
220
|
-
/** 계획 브랜치가 없는 저작 골의 안정 식별자. */
|
|
221
|
-
goalId?: string;
|
|
222
|
-
/** S2 — goal-local id for dependency wiring (default = array index). */
|
|
223
|
-
id?: string;
|
|
224
|
-
/** S2 — goal-local ids this goal depends on (must complete first).
|
|
225
|
-
* The task becomes `ready` only after every dependency is `done`
|
|
226
|
-
* (topological parallel via the graph). Unknown/self ids are dropped. */
|
|
227
|
-
dependsOn?: string[];
|
|
228
|
-
/** Read-only handoff memory emitted by this shard for dependent child input.
|
|
229
|
-
* `[]` is a completed shard with no entries; null/undefined is unreadable. */
|
|
230
|
-
workingMemory?: readonly WorkingMemoryEntry[] | null;
|
|
231
|
-
/** 그 기억을 남긴 이 조각이 «착지했나». ⛔ 생략은 「모른다」이지 「착지」가 아니다. */
|
|
232
|
-
workingMemoryOutcome?: 'landed' | 'blocked' | 'unknown';
|
|
233
|
-
/** S2 — repo paths this job will touch. Two goals sharing a hot path
|
|
234
|
-
* are serialized (an implicit dependency edge is added, earlier-first)
|
|
235
|
-
* so their worktrees never merge concurrently. Cf. PLAN §8 risk 2. */
|
|
236
|
-
hotPaths?: string[];
|
|
237
|
-
}
|
|
238
|
-
|
|
239
198
|
interface SelfDevTerminalOutcome {
|
|
240
199
|
/** Stable TOX task identity, matching the returned `SelfDevJobResult.taskId`. */
|
|
241
200
|
taskId: string;
|
|
@@ -249,97 +208,6 @@ interface SelfDevTerminalOutcome {
|
|
|
249
208
|
parentNoPr?: true;
|
|
250
209
|
}
|
|
251
210
|
|
|
252
|
-
export interface SelfDevJobResult {
|
|
253
|
-
taskId: string;
|
|
254
|
-
feature: string;
|
|
255
|
-
/** Run outcome — done | failed | cancelled | blocked (awaiting parent landing). */
|
|
256
|
-
status: TaskStatus;
|
|
257
|
-
error?: { code: string; message: string };
|
|
258
|
-
durationMs?: number;
|
|
259
|
-
/** S3 — real pipeline disposition from the child `--json`
|
|
260
|
-
* (merged / pr-opened / gate-failed / review-blocked / pr-declined). */
|
|
261
|
-
stage?: string;
|
|
262
|
-
branch?: string;
|
|
263
|
-
/** Child confirmed the finished implementation was pushed for manual harvest. */
|
|
264
|
-
harvestable?: true;
|
|
265
|
-
worktreePath?: string;
|
|
266
|
-
prUrl?: string;
|
|
267
|
-
prNumber?: number;
|
|
268
|
-
merged?: boolean;
|
|
269
|
-
/** Child commit SHA, when observed by the Pod/host. */
|
|
270
|
-
checkedHeadCommit?: string;
|
|
271
|
-
/**
|
|
272
|
-
* This run's own `--base` (not main). A non-main completion mode
|
|
273
|
-
* (worktree-only, draft, `--base` other than main) lands commits here.
|
|
274
|
-
*/
|
|
275
|
-
base?: string;
|
|
276
|
-
/** Child finished with GOAL-COMPLETE (`ok=true`). Distinct from a main merge. */
|
|
277
|
-
ok?: boolean;
|
|
278
|
-
/** Commits this child added against its own `--base`. 0 is not completion progress. */
|
|
279
|
-
commitsAheadOfBase?: number;
|
|
280
|
-
/** A dependency is done but its result is not on main; no child was launched. */
|
|
281
|
-
blockReason?: 'parent-unlanded';
|
|
282
|
-
parentPrNumber?: number;
|
|
283
|
-
/** The upstream completed in a worktree without opening a PR. */
|
|
284
|
-
parentNoPr?: true;
|
|
285
|
-
// ⭐⭐⭐ `A1`(2026-08-19 · 대표 *"R3 가 서브 프로세스여도 잘 도는 안"*) — ***판정 3종***.
|
|
286
|
-
// 🚨 이 셋이 트리아지의 입력 전부인데 종전엔 자식 → 부모 경계에서 «전부» 사라졌다.
|
|
287
|
-
// 값은 전선에 «실려 있었고»(자식이 `r.result` 를 통째로 낸다) 파서가 버렸다.
|
|
288
|
-
// ⇒ 📌 서브프로세스에서 «먼저» 옳아야 한다 — 실행 방식을 바꾸지 않고 고치는 자리다.
|
|
289
|
-
/** auto-merge 를 «왜» 건너뛰었나 — 「도구 한계」와 「자식이 못 함」을 가르는 근거. */
|
|
290
|
-
mergeReason?: string;
|
|
291
|
-
/** 런이 «왜» 멈췄나. 없으면 「부모가 잘랐다」다. */
|
|
292
|
-
stopReason?: string;
|
|
293
|
-
/** 자식이 스스로 낸 완료 성격. */
|
|
294
|
-
completionDisposition?: string;
|
|
295
|
-
/** Abandoned-run classification from the child. Independent of completionDisposition. */
|
|
296
|
-
failureClassification?: AbandonedClassification;
|
|
297
|
-
/** Provider failure evidence from the child result; absent when unobserved. */
|
|
298
|
-
providerErrors?: { count: number; provider: string; category: 'quota' | 'credential' | 'request' | 'other' };
|
|
299
|
-
/** Stable child run identity used to join its run-ledger proposal. */
|
|
300
|
-
runId?: string;
|
|
301
|
-
/** Self review verdict bound to the PR head observed by the child; absent if either observation is missing. */
|
|
302
|
-
selfReview?: { verdict: 'pass' | 'fail'; head: string };
|
|
303
|
-
/** Whether the child review actually ran; omitted preserves legacy producers. */
|
|
304
|
-
reviewed?: boolean;
|
|
305
|
-
/** Why the child did not run review; omitted preserves legacy review-unobserved handling. */
|
|
306
|
-
reviewReason?: string;
|
|
307
|
-
/** The abandoned-run classifier observed a goal-side cause for this failed convergence. */
|
|
308
|
-
goalCauseObserved?: true;
|
|
309
|
-
/** Resume selection that decided whether this shard was carried forward or retried. */
|
|
310
|
-
resumeDisposition?: ResumeDisposition;
|
|
311
|
-
/**
|
|
312
|
-
* ⭐ 하니스가 이 조각에 대해 낸 「이렇게 쪼개라」(2026-08-19).
|
|
313
|
-
*
|
|
314
|
-
* ⛔ 이 값은 자식 결과로 «안 온다» — 전선 타입(SelfImplementDisposition)에 칸이 없다.
|
|
315
|
-
* 그래서 «중앙»이 원장에서 읽어 채운다(decompose-proposal.ts). 트리아지는 그것을 그냥 본다.
|
|
316
|
-
* ⇒ 📌 출구 모듈은 ***「이 값이 어디서 왔는지 몰라야」*** 한다 — 알면 실행 방식마다 갈래가 는다.
|
|
317
|
-
* ⚠️ undefined = 「제안이 없다」와 「아직 안 읽었다」가 «같은 값»이다. 채우는 자가 그것을 구분해 관측한다.
|
|
318
|
-
*/
|
|
319
|
-
decomposeProposal?: { pieces: Array<{ id: string; feature: string; dependsOn: readonly string[]; goalType?: string }> };
|
|
320
|
-
/**
|
|
321
|
-
* Parent-side observation of CONTRACT-CONFLICT goal-plan revision application attempts.
|
|
322
|
-
* undefined = the parent has not read the run ledger yet; it is not the same as attempted=0.
|
|
323
|
-
*/
|
|
324
|
-
goalPlanRevision?:
|
|
325
|
-
| { status: 'read'; attempted: number; applied: number; failureReasons: string[] }
|
|
326
|
-
| { status: 'read-failed'; reason: 'directory-missing' | 'unreadable-directory' | 'unreadable-files'; scannedFiles: number; unreadableFiles: number; ledgerDirectory: string };
|
|
327
|
-
/** ⭐ 관측(2026-07-21 대표 co-design·"재현 없이 진단") — 자식 goal-loop 화면 버퍼 tail
|
|
328
|
-
* (ANSI 제거·"docker logs <id>" 등가물). detached PTY goal-loop 은 스폰 프로세스 stdout 이
|
|
329
|
-
* 아니라 file-based 화면 버퍼에만 남으므로, 실패 진단의 유일한 cross-process 진실원. */
|
|
330
|
-
screenTail?: string;
|
|
331
|
-
/** 화면 버퍼에서 판정한 goal-loop 종결 상태(complete=성공 마커·incomplete·null=불명). */
|
|
332
|
-
screenOutcome?: 'complete' | 'incomplete' | null;
|
|
333
|
-
/** 화면 버퍼 공간 id — `elanous self screen --space <id>` 로 전체 전사 재생 가능. */
|
|
334
|
-
screenSpace?: string;
|
|
335
|
-
/** ⚠️ exit-code 실패인데 화면은 GOAL-COMPLETE = 스폰-신호 단절(false-failure). 조정 플래그. */
|
|
336
|
-
reconcileMismatch?: boolean;
|
|
337
|
-
/** ⭐ 이 시도의 «걸음» — 노드 진입 순서(2026-09-08 · 대표 지시).
|
|
338
|
-
* 🩸 그 전까지 이 배열엔 「요약 판정」만 있었고 걸음은 런 «안»에서 끝났다.
|
|
339
|
-
* ⛔ 관측용이다 — 슈퍼바이저가 이것으로 «무엇을 할지»는 별개 결정이다. */
|
|
340
|
-
walk?: readonly { node: string; round: number }[];
|
|
341
|
-
}
|
|
342
|
-
|
|
343
211
|
/**
|
|
344
212
|
* Resume identity for the legacy feature-only checkpoint format.
|
|
345
213
|
* It deliberately absorbs only trim, whitespace runs, and case; wording,
|
|
@@ -502,6 +370,11 @@ export type TriageAction =
|
|
|
502
370
|
| 'decompose-and-retry'
|
|
503
371
|
/** 기존 조각을 치환하거나 재실행하지 않고 수리 조각을 추가한다. */
|
|
504
372
|
| 'add-repair-task'
|
|
373
|
+
/**
|
|
374
|
+
* main 정합(LLM 충돌 해결)이 막힌 조각을 «조각당 한 번» 최신 main 위에서 다시 건다.
|
|
375
|
+
* 보존 가지는 지우지 않고 재발사 골의 참고로만 쓴다. 두 번째부터는 `needs-human`.
|
|
376
|
+
*/
|
|
377
|
+
| 'relaunch-on-main'
|
|
505
378
|
/** 실패가 아니었다(전송 불일치) — 건드리지 않는다. */
|
|
506
379
|
| 'no-action'
|
|
507
380
|
/** 모른다 — 사람이 본다. */
|
|
@@ -519,7 +392,11 @@ export interface FailureClassification {
|
|
|
519
392
|
}
|
|
520
393
|
|
|
521
394
|
/** 순수: 분류 → 다음 행동. ⛔ 한 자리에서만 정한다(소비자가 각자 매핑하면 갈린다). */
|
|
522
|
-
export function triageActionFor(
|
|
395
|
+
export function triageActionFor(
|
|
396
|
+
kind: FailureKind,
|
|
397
|
+
/** `main-sync-blocked` 만 읽는다 — 이 조각의 재발사 한 번을 이미 썼으면 true. */
|
|
398
|
+
options: { mainSyncRelaunchSpent?: boolean } = {},
|
|
399
|
+
): TriageAction {
|
|
523
400
|
switch (kind) {
|
|
524
401
|
case 'transient': return 'rerun';
|
|
525
402
|
case 'blocked-upstream': return 'rerun-after-upstream';
|
|
@@ -529,14 +406,22 @@ export function triageActionFor(kind: FailureKind): TriageAction {
|
|
|
529
406
|
case 'deliverable-broken':
|
|
530
407
|
case 'oversized-goal': return 'add-repair-task';
|
|
531
408
|
case 'false-failure': return 'no-action';
|
|
409
|
+
case 'main-sync-blocked': return options.mainSyncRelaunchSpent === true ? 'needs-human' : 'relaunch-on-main';
|
|
532
410
|
case 'awaiting-human':
|
|
533
411
|
case 'parent-unlanded':
|
|
534
|
-
case 'main-sync-blocked':
|
|
535
412
|
case 'provider-rejected': return 'needs-human';
|
|
536
413
|
default: return 'needs-human';
|
|
537
414
|
}
|
|
538
415
|
}
|
|
539
416
|
|
|
417
|
+
/**
|
|
418
|
+
* main 정합 충돌로 멈춘 결과만 «최신 main 위 재발사» 후보다. harvestable 이라도 다른 단계(timed-out 등)에서
|
|
419
|
+
* 멈춘 결과는 후보가 아니다 — 지금처럼 사람이 수확한다.
|
|
420
|
+
*/
|
|
421
|
+
export function isMainSyncRelaunchCandidate(result: Pick<SelfDevJobResult, 'stage'>): boolean {
|
|
422
|
+
return result.stage === 'merge-conflict';
|
|
423
|
+
}
|
|
424
|
+
|
|
540
425
|
const LEDGER_FAILURE_KIND: Partial<Record<AbandonedClassification, FailureKind>> = {
|
|
541
426
|
'implementation-deficit': 'unconverged',
|
|
542
427
|
'report-deficit': 'unconverged',
|
|
@@ -721,6 +606,8 @@ export function failureFromDeployFindings(
|
|
|
721
606
|
export function classifyFailures(
|
|
722
607
|
results: SelfDevJobResult[],
|
|
723
608
|
queryPreflight?: PreflightLogQuery,
|
|
609
|
+
/** 이 조각이 main 정합 재발사 한 번을 이미 썼나 — 생략은 «감독 없음» 이라 종전대로 needs-human. */
|
|
610
|
+
mainSyncRelaunchSpent?: (result: SelfDevJobResult) => boolean,
|
|
724
611
|
): FailureClassification[] {
|
|
725
612
|
return results.flatMap((result) => {
|
|
726
613
|
const preflightIdentifiers = [...new Set([result.runId, result.taskId].filter((id): id is string => Boolean(id)))];
|
|
@@ -736,7 +623,10 @@ export function classifyFailures(
|
|
|
736
623
|
taskId: result.taskId,
|
|
737
624
|
stage: result.stage ?? null,
|
|
738
625
|
kind,
|
|
739
|
-
action: triageActionFor(kind
|
|
626
|
+
action: triageActionFor(kind, {
|
|
627
|
+
// 생략 = 감독 없이 도는 경로(재발사할 주체가 없다) — 종전대로 needs-human. 재발사는 감독이 이력으로 셀 때만.
|
|
628
|
+
mainSyncRelaunchSpent: !isMainSyncRelaunchCandidate(result) || !mainSyncRelaunchSpent || mainSyncRelaunchSpent(result) === true,
|
|
629
|
+
}),
|
|
740
630
|
...(awaitingHuman ?? failureObservationFields(error?.code ?? 'UNKNOWN', error?.message ?? '')),
|
|
741
631
|
}];
|
|
742
632
|
});
|
|
@@ -784,8 +674,12 @@ export function triageRun(
|
|
|
784
674
|
hasUnmeasuredDeliverables = false,
|
|
785
675
|
/** Optional injected lookup of launch preflight observations; absence remains unknown. */
|
|
786
676
|
queryPreflight?: PreflightLogQuery,
|
|
677
|
+
/** 이 조각이 main 정합 재발사 한 번을 이미 썼나 — 생략은 «감독 없음» 이라 종전대로 needs-human. */
|
|
678
|
+
mainSyncRelaunchSpent?: (result: SelfDevJobResult) => boolean,
|
|
787
679
|
): {
|
|
788
680
|
classifications: FailureClassification[];
|
|
681
|
+
/** ⭐ main 정합이 막힌 조각 중 «첫 번» — 사람 수확 대신 최신 main 위에서 다시 건다. */
|
|
682
|
+
relaunchOnMain: string[];
|
|
789
683
|
/** 그대로 다시 걸면 되는 조각(일시적·상류대기). */
|
|
790
684
|
rerunnable: string[];
|
|
791
685
|
/** 다시 걸 수는 있으나 같은 결과일 수 있는 조각(수렴 실패). */
|
|
@@ -811,21 +705,23 @@ export function triageRun(
|
|
|
811
705
|
failureFromDeployFindings(taskId, observation.target, observation.findings));
|
|
812
706
|
const classifications = [
|
|
813
707
|
...deployClassifications,
|
|
814
|
-
...classifyFailures(results, queryPreflight),
|
|
708
|
+
...classifyFailures(results, queryPreflight, mainSyncRelaunchSpent),
|
|
815
709
|
];
|
|
816
710
|
const pick = (a: TriageAction) => classifications.filter((c) => c.action === a).map((c) => c.taskId);
|
|
817
711
|
const rerunnable = [...pick('rerun'), ...pick('rerun-after-upstream')];
|
|
818
712
|
const reworkable = pick('rework');
|
|
819
713
|
const decomposable = pick('decompose-and-retry');
|
|
820
714
|
const repairable = [...new Set(pick('add-repair-task'))]; // ⛔ finding 이 여럿이면 같은 taskId 가 겹친다
|
|
715
|
+
const relaunchOnMain = [...new Set(pick('relaunch-on-main'))];
|
|
821
716
|
return {
|
|
822
717
|
classifications,
|
|
718
|
+
relaunchOnMain,
|
|
823
719
|
rerunnable,
|
|
824
720
|
reworkable,
|
|
825
721
|
decomposable,
|
|
826
722
|
repairable,
|
|
827
723
|
needsHuman: pick('needs-human'),
|
|
828
|
-
actionable: rerunnable.length + reworkable.length + decomposable.length + repairable.length > 0,
|
|
724
|
+
actionable: rerunnable.length + reworkable.length + decomposable.length + repairable.length + relaunchOnMain.length > 0,
|
|
829
725
|
deliverableUnmeasured,
|
|
830
726
|
};
|
|
831
727
|
}
|
|
@@ -944,6 +840,8 @@ export interface OrchestrateSelfDevOptions {
|
|
|
944
840
|
* 🩸 2026-09-25 실측: 판정은 「재실행 1 · 사람 대기 2」였는데 `pr-opened` 가 `rerun-duplicate-risk` 로
|
|
945
841
|
* 분류돼 PR 을 이미 연 두 조각까지 «다시» 돌았다(같은 골·새 task id · 과금 팔 포함). */
|
|
946
842
|
resumeHold?: readonly string[];
|
|
843
|
+
/** Link a dispatched task to its exact goal and selected resume predecessor. */
|
|
844
|
+
onTaskLaunched?: (goal: SelfDevGoal, taskId: string, priorTaskId: string | undefined) => void;
|
|
947
845
|
/** S3 — called with the full current result set after every job
|
|
948
846
|
* settles (+ at finish) so callers can persist a resumable checkpoint.
|
|
949
847
|
* Default CLI wiring = saveSelfDevRun. Fail-soft in the caller. */
|
|
@@ -1028,7 +926,11 @@ export function writeRunPidRecord(runId: string, runsDir: string = selfDevRunsDi
|
|
|
1028
926
|
const cwd = process.cwd();
|
|
1029
927
|
const goalPath = goalPathFromArgv(process.argv, cwd);
|
|
1030
928
|
writeLaunchBinding(runId, { pid: process.pid, startedAt: Date.now() - Math.floor(process.uptime() * 1000), argv0: process.argv0,
|
|
1031
|
-
cwd, ...(goalPath ? { goalPath } : {}), runsDir: resolve(runsDir)
|
|
929
|
+
cwd, ...(goalPath ? { goalPath } : {}), runsDir: resolve(runsDir),
|
|
930
|
+
...(process.env.ELANOUS_POD_NAME ? { podName: process.env.ELANOUS_POD_NAME } : {}),
|
|
931
|
+
...(process.env.ELANOUS_TASK_CARD_ID ? { taskCardId: process.env.ELANOUS_TASK_CARD_ID } : {}) }, registryDir);
|
|
932
|
+
try { adoptRunCard({ runId, cwd, goalPath, runsDir, env: process.env }); }
|
|
933
|
+
catch (error) { try { debug.log('task-agent', 'run-adopt-failed', { runId, error: String(error) }); } catch { /* launch must continue */ } }
|
|
1032
934
|
}
|
|
1033
935
|
return pidPath;
|
|
1034
936
|
}
|
|
@@ -1160,6 +1062,10 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1160
1062
|
const goal = taskId ? taskByGoal.get(taskId) : undefined;
|
|
1161
1063
|
if (cancelling) throw new Error('orchestration cancelled by signal');
|
|
1162
1064
|
const started = baseSpawn({ ...input, feature: dependencyOutputFeature(input.spaceId, input.feature) });
|
|
1065
|
+
if (goal && taskId) {
|
|
1066
|
+
try { opts.onTaskLaunched?.(goal, taskId, priorByResumeKey.get(resumeKey(goal.feature))?.taskId); }
|
|
1067
|
+
catch { /* observation must not interrupt execution */ }
|
|
1068
|
+
}
|
|
1163
1069
|
return {
|
|
1164
1070
|
address: started.address,
|
|
1165
1071
|
done: started.done.then((d) => {
|
|
@@ -1508,6 +1414,8 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1508
1414
|
...(disp?.completionDisposition ? { completionDisposition: disp.completionDisposition } : {}),
|
|
1509
1415
|
...(disp?.failureClassification ? { failureClassification: disp.failureClassification } : {}),
|
|
1510
1416
|
...(disp?.providerErrors ? { providerErrors: disp.providerErrors } : {}),
|
|
1417
|
+
...(disp?.rework ? { rework: disp.rework } : {}),
|
|
1418
|
+
...(disp?.mustFix ? { reviewMustFix: disp.mustFix } : {}),
|
|
1511
1419
|
...(goalCauseObservedFromFailureClassification(disp?.failureClassification) === true
|
|
1512
1420
|
? { goalCauseObserved: true } : {}),
|
|
1513
1421
|
...(disp?.runId ? { runId: disp.runId } : {}),
|
|
@@ -24,6 +24,59 @@ import { claudeBackend, resolveBackendSpawn } from '../agent-mission/driver.js';
|
|
|
24
24
|
import { checkClaudeSubscription } from '../agent-mission/claude-subscription.js';
|
|
25
25
|
import { getAcpBackend, type AcpBackendSpec } from '../acp/backend-registry.js';
|
|
26
26
|
import type { SubscriptionReviewerSpec } from '../user-config.js';
|
|
27
|
+
import { debug } from '../debug/log.js';
|
|
28
|
+
|
|
29
|
+
export interface TeamclaudeSubscriptionProbe {
|
|
30
|
+
subscribed: boolean;
|
|
31
|
+
usedPercent?: number;
|
|
32
|
+
reason: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Read `teamclaude status --json`. The human `teamclaude status` text names neither "subscription" nor a
|
|
37
|
+
* "usage: N%" label, so the text probe failed on every review (10-10 · mbp 0/0). Accounts are subscription
|
|
38
|
+
* (oauth) accounts; quota buckets `unified5h`/`unified7d` are utilization ratios 0-1 (teamclaude
|
|
39
|
+
* `account-manager.js`). Returns undefined when stdout is not that JSON, so an old teamclaude falls back to text.
|
|
40
|
+
*/
|
|
41
|
+
export function parseTeamclaudeStatusJson(stdout: string): TeamclaudeSubscriptionProbe | undefined {
|
|
42
|
+
let doc: unknown;
|
|
43
|
+
try { doc = JSON.parse(stdout); } catch { return undefined; }
|
|
44
|
+
if (!doc || typeof doc !== 'object' || !Array.isArray((doc as { accounts?: unknown }).accounts)) return undefined;
|
|
45
|
+
const root = doc as { accounts: unknown[]; currentAccount?: unknown; currentAccounts?: unknown };
|
|
46
|
+
// Every account must carry the string `type`/`status` this parser reads; another schema is "not this JSON".
|
|
47
|
+
if (!root.accounts.every((a) => a && typeof a === 'object'
|
|
48
|
+
&& typeof (a as { type?: unknown }).type === 'string' && typeof (a as { status?: unknown }).status === 'string'
|
|
49
|
+
&& typeof (a as { disabled?: unknown }).disabled === 'boolean')) return undefined;
|
|
50
|
+
const current = typeof root.currentAccount === 'string' ? root.currentAccount
|
|
51
|
+
: root.currentAccounts && typeof root.currentAccounts === 'object'
|
|
52
|
+
&& typeof (root.currentAccounts as Record<string, unknown>).anthropic === 'string'
|
|
53
|
+
? (root.currentAccounts as Record<string, string>).anthropic : undefined;
|
|
54
|
+
type Account = { name?: unknown; type?: unknown; status?: unknown; disabled?: unknown; quota?: Record<string, unknown> | null };
|
|
55
|
+
const usable = (root.accounts as Account[]).filter((a) => a && typeof a === 'object'
|
|
56
|
+
&& a.type === 'oauth' && a.status === 'active' && a.disabled !== true);
|
|
57
|
+
if (usable.length === 0) return { subscribed: false, reason: 'no-active-oauth-account' };
|
|
58
|
+
const ratio = (v: unknown) => typeof v === 'number' && Number.isFinite(v) && v >= 0 && v <= 1 ? v : undefined;
|
|
59
|
+
// A bucket that is null was reset or not yet seen: teamclaude nulls `unified5h`/`unified7d` when their window
|
|
60
|
+
// expires (`_clearExpiredQuotas`), so the other measured bucket still gates. A present but invalid value
|
|
61
|
+
// (non-number, outside 0-1) or a missing key is not a measurement and fails closed. Both null is unmeasured.
|
|
62
|
+
const usedOf = (account: Account) => {
|
|
63
|
+
// A missing key (or no quota object) is not a reset: it stays unmeasured.
|
|
64
|
+
const raw = [account.quota?.unified5h, account.quota?.unified7d].filter((v) => v !== null);
|
|
65
|
+
const measured = raw.map(ratio);
|
|
66
|
+
if (measured.length === 0 || measured.some((v) => v === undefined)) return undefined;
|
|
67
|
+
return Math.max(...(measured as number[])) * 100;
|
|
68
|
+
};
|
|
69
|
+
// The usage that gates the review is the routed account's. The current account is the one the proxy routes to;
|
|
70
|
+
// without a usable current account, every usable account must be measured and the highest one counts.
|
|
71
|
+
const routed = usable.find((a) => a.name === current);
|
|
72
|
+
if (routed) {
|
|
73
|
+
const used = usedOf(routed);
|
|
74
|
+
return used === undefined ? { subscribed: true, reason: 'quota-unmeasured' } : { subscribed: true, usedPercent: used, reason: 'current-account' };
|
|
75
|
+
}
|
|
76
|
+
const all = usable.map(usedOf);
|
|
77
|
+
if (all.some((v) => v === undefined)) return { subscribed: true, reason: 'quota-unmeasured' };
|
|
78
|
+
return { subscribed: true, usedPercent: Math.max(...(all as number[])), reason: 'max-active-account' };
|
|
79
|
+
}
|
|
27
80
|
|
|
28
81
|
export interface SubscriptionReviewerDeps {
|
|
29
82
|
/** Returns measured Claude subscription usage; unknown usage fails closed. */
|
|
@@ -32,18 +85,26 @@ export interface SubscriptionReviewerDeps {
|
|
|
32
85
|
runStatus?: (command: string, args: string[], env: Record<string, string>) => { status: number | null; stdout?: string | Buffer | null };
|
|
33
86
|
}
|
|
34
87
|
|
|
35
|
-
/**
|
|
36
|
-
|
|
88
|
+
/**
|
|
89
|
+
* The runner and the subscription probe share the PTY backend's billing-env scrub.
|
|
90
|
+
* ⛔ The child must speak ACP: `teamclaude run` / `claude` start the interactive CLI, which never answers the ACP
|
|
91
|
+
* handshake (10-10 measured: the review hung with no timeout). Both executors therefore run the ACP adapter
|
|
92
|
+
* (`claude-agent-acp`); `cct` routes it through the teamclaude proxy by its base URL (`teamclaude env --no-mitm`).
|
|
93
|
+
*/
|
|
94
|
+
export function subscriptionReviewerSpawn(spec: SubscriptionReviewerSpec, env: NodeJS.ProcessEnv = process.env, proxyBaseUrl?: string): {
|
|
37
95
|
command: string; args: string[]; env: Record<string, string>; backendSpec: AcpBackendSpec;
|
|
38
96
|
} {
|
|
39
97
|
const executor = spec.executor ?? 'cct';
|
|
40
|
-
const { env:
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
98
|
+
const { env: scrubbed } = resolveBackendSpawn(claudeBackend, env);
|
|
99
|
+
const cleanEnv = executor === 'cct' && proxyBaseUrl ? { ...scrubbed, ANTHROPIC_BASE_URL: proxyBaseUrl } : scrubbed;
|
|
100
|
+
const backendSpec = getAcpBackend('claude');
|
|
101
|
+
return { command: backendSpec.command, args: [...backendSpec.args], env: cleanEnv, backendSpec };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** `teamclaude env --no-mitm` prints `export ANTHROPIC_BASE_URL=…`; only that line is read (never the proxy key). */
|
|
105
|
+
export function parseTeamclaudeBaseUrl(stdout: string): string | undefined {
|
|
106
|
+
const match = stdout.match(/^\s*export\s+ANTHROPIC_BASE_URL=["']?(https?:\/\/[^\s"']+)["']?\s*$/m);
|
|
107
|
+
return match?.[1];
|
|
47
108
|
}
|
|
48
109
|
|
|
49
110
|
/** Guard the ACP review before spawning. An unmeasured quota never authorizes subscription use. */
|
|
@@ -57,25 +118,53 @@ export function subscriptionReviewerAvailability(
|
|
|
57
118
|
const executor = spec.executor ?? 'cct';
|
|
58
119
|
const runStatus = deps.runStatus ?? ((command: string, args: string[], cleanEnv: Record<string, string>) =>
|
|
59
120
|
spawnSync(command, args, { env: { ...cleanEnv, NODE_ENV: process.env.NODE_ENV }, encoding: 'utf8', timeout: 5_000 }));
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
121
|
+
// One `--json` read serves both questions; the text regexes stay only for a teamclaude without `--json`.
|
|
122
|
+
let jsonProbe: TeamclaudeSubscriptionProbe | null | undefined;
|
|
123
|
+
const readJsonProbe = (cleanEnv: Record<string, string>) => {
|
|
124
|
+
if (jsonProbe !== undefined) return jsonProbe ?? undefined;
|
|
125
|
+
const result = runStatus('teamclaude', ['status', '--json'], cleanEnv);
|
|
126
|
+
jsonProbe = result.status === 0 ? parseTeamclaudeStatusJson(String(result.stdout ?? '')) ?? null : null;
|
|
127
|
+
if (jsonProbe) debug.log('self-dev.reviewer', 'subscription-probe', { source: 'json', ...jsonProbe });
|
|
128
|
+
return jsonProbe ?? undefined;
|
|
129
|
+
};
|
|
130
|
+
// Old teamclaude: one text read answers both questions and is logged once with both values.
|
|
131
|
+
let textProbe: { subscribed: boolean; usedPercent?: number } | undefined;
|
|
132
|
+
const readTextProbe = (cleanEnv: Record<string, string>) => {
|
|
133
|
+
if (textProbe) return textProbe;
|
|
134
|
+
const status = runStatus('teamclaude', ['status'], cleanEnv);
|
|
135
|
+
const out = String(status.stdout ?? '');
|
|
136
|
+
const ok = status.status === 0;
|
|
63
137
|
// Only a named usage percentage is accepted; a random percentage in status is not quota evidence.
|
|
64
|
-
const match =
|
|
65
|
-
|
|
138
|
+
const match = ok ? out.match(/(?:usage|used)\s*[:=]?\s*(\d+(?:\.\d+)?)\s*%/i) : null;
|
|
139
|
+
textProbe = {
|
|
140
|
+
subscribed: ok && /(?:subscription|claude\.ai|claude\s+(?:max|pro))/i.test(out)
|
|
141
|
+
&& !/(?:logged\s*out|not\s+logged\s+in|api[_ -]?key|not\s+authenticated)/i.test(out),
|
|
142
|
+
usedPercent: match ? Number(match[1]) : undefined,
|
|
143
|
+
};
|
|
144
|
+
debug.log('self-dev.reviewer', 'subscription-probe', { source: 'text', ...textProbe,
|
|
145
|
+
reason: ok ? 'text-read' : `exit-${status.status}` });
|
|
146
|
+
return textProbe;
|
|
147
|
+
};
|
|
148
|
+
const usedPercent = deps.usedPercent ?? (() => {
|
|
149
|
+
const probe = executor === 'cct' ? readJsonProbe(spawn.env) : undefined;
|
|
150
|
+
return probe ? probe.usedPercent : readTextProbe(spawn.env).usedPercent;
|
|
66
151
|
});
|
|
67
152
|
try {
|
|
68
153
|
const subscribed = deps.checkSubscription ?? ((cleanEnv: Record<string, string>) => {
|
|
69
154
|
if (executor === 'cc') return checkClaudeSubscription({ env: cleanEnv }).ok;
|
|
70
|
-
const
|
|
71
|
-
return
|
|
72
|
-
&& !/(?:logged\s*out|not\s+logged\s+in|api[_ -]?key|not\s+authenticated)/i.test(String(status.stdout));
|
|
155
|
+
const probe = readJsonProbe(cleanEnv);
|
|
156
|
+
return probe ? probe.subscribed : readTextProbe(cleanEnv).subscribed;
|
|
73
157
|
});
|
|
74
158
|
if (!subscribed(spawn.env)) return { reason: `${executor} subscription check failed` };
|
|
75
159
|
const used = usedPercent();
|
|
76
160
|
if (!Number.isFinite(cap) || cap < 0 || cap > 100 || used === undefined
|
|
77
161
|
|| !Number.isFinite(used) || used < 0 || used >= cap) return { reason: `Claude subscription usage unavailable or at harness cap (${cap}%)` };
|
|
78
|
-
return { spawn };
|
|
162
|
+
if (executor === 'cc') return { spawn };
|
|
163
|
+
const proxy = runStatus('teamclaude', ['env', '--no-mitm'], spawn.env);
|
|
164
|
+
const baseUrl = proxy.status === 0 ? parseTeamclaudeBaseUrl(String(proxy.stdout ?? '')) : undefined;
|
|
165
|
+
debug.log('self-dev.reviewer', 'proxy-base-url', { found: baseUrl !== undefined, exit: proxy.status });
|
|
166
|
+
if (!baseUrl) return { reason: 'cct proxy base URL unavailable' };
|
|
167
|
+
return { spawn: subscriptionReviewerSpawn(spec, env, baseUrl) };
|
|
79
168
|
} catch {
|
|
80
169
|
return { reason: `${executor} subscription check failed` };
|
|
81
170
|
}
|
|
@@ -97,7 +186,14 @@ export async function runSubscriptionReviewer(
|
|
|
97
186
|
try {
|
|
98
187
|
const text = await acpReview(prompt, availability.spawn);
|
|
99
188
|
if (text.trim()) return text;
|
|
100
|
-
|
|
189
|
+
debug.log('self-dev.reviewer', 'acp-review-failed', { reason: 'acp-empty-review' });
|
|
190
|
+
} catch (e) {
|
|
191
|
+
// ACP failure is not a completed review; the worst case stays the default reviewer.
|
|
192
|
+
// Only a reason code: the raw message may carry account or proxy details.
|
|
193
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
194
|
+
debug.log('self-dev.reviewer', 'acp-review-failed', {
|
|
195
|
+
reason: /handshake timeout/i.test(message) ? 'acp-handshake-timeout' : 'acp-error' });
|
|
196
|
+
}
|
|
101
197
|
}
|
|
102
198
|
const reason = availability.reason ?? 'ACP review failed';
|
|
103
199
|
return `${await defaultReview(prompt)}\n[reviewer fallback: ${reason}; default reviewer used]`;
|