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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// system-lookback.ts 는 순수(의심 소스 매핑 + 프롬프트 빌더)였고, "실제 LLM 조사·소스 read 는
|
|
4
4
|
// 배선측이 수행"이라 명시돼 있었다. 이 모듈이 그 배선이다: 모순 신호 → 의심 소스 파일 READ-ONLY
|
|
5
|
-
// 발췌 → buildLookbackPrompt →
|
|
5
|
+
// 발췌 → buildLookbackPrompt → 역할 audit 이 고른 모델 조사 → 결함 리포트. 수정 권한 없음(READ-ONLY).
|
|
6
6
|
//
|
|
7
7
|
// escalate(mission-tool)가 시스템 결함 의심(systemSuspect) 페이즈에서 이 러너를 호출해 결함
|
|
8
8
|
// 리포트를 얻고, 그 리포트를 수리 미션 골에 실어 스폰한다(system-repair-spawn). 진단 해상도 사다리
|
|
@@ -12,18 +12,24 @@ import { readFileSync } from 'node:fs';
|
|
|
12
12
|
import { join } from 'node:path';
|
|
13
13
|
import type { ContradictionSignal } from './contradiction-detector.js';
|
|
14
14
|
import { buildLookbackPrompt, suspectSourceFiles } from './system-lookback.js';
|
|
15
|
+
import { resolveRoleLlm } from '../user-config.js';
|
|
16
|
+
import { debug } from '../debug/log.js';
|
|
15
17
|
|
|
16
|
-
/** R3 조사 LLM 호출 seam —
|
|
17
|
-
* llmReviewCritique(mission-se-bridge) 와 같은 streamLLM 패턴(모델만 Opus·진단은 길게 maxTokens 2500). */
|
|
18
|
+
/** R3 조사 LLM 호출 seam — 역할 audit 모델(READ-ONLY 진단). 테스트/재사용 위해 주입 가능. */
|
|
18
19
|
async function opusLookback(prompt: string): Promise<string> {
|
|
19
|
-
const { streamLLM, resolveDefaultProvider, getProvider } = await import('../llm.js');
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
const provider =
|
|
20
|
+
const { streamLLM, resolveDefaultProvider, getProvider, PROVIDERS } = await import('../llm.js');
|
|
21
|
+
const override = process.env.ELANOUS_LOOKBACK_MODEL;
|
|
22
|
+
const resolved = override ? undefined : resolveRoleLlm('audit');
|
|
23
|
+
const model = override || resolved!.model;
|
|
24
|
+
// 명시 env 모델의 provider 선택은 종전과 동일하다.
|
|
25
|
+
const provider = override
|
|
26
|
+
? (model.startsWith('claude-') ? getProvider(model) : resolveDefaultProvider(model))
|
|
27
|
+
: PROVIDERS[resolved!.provider];
|
|
28
|
+
const providerName = override ? provider?.name : resolved!.provider;
|
|
29
|
+
if (!provider) throw new Error(`Unknown audit provider: ${providerName}`);
|
|
30
|
+
debug.log('llm.role-pin', 'resolved', { site: 'system-lookback', role: 'audit', model, provider: providerName, source: override ? 'env' : resolved!.source });
|
|
25
31
|
return streamLLM([{ role: 'user', content: prompt }], () => {}, {
|
|
26
|
-
model,
|
|
32
|
+
model, provider, usageRole: 'audit', maxTokens: 2500,
|
|
27
33
|
});
|
|
28
34
|
}
|
|
29
35
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BENCH-ISOLATED-ARMS — 같은 골을 모델만 바꿔 여러 «팔»로 쏘는 벤치를 기준선과 떼어 놓는다.
|
|
3
|
+
*
|
|
4
|
+
* S: 벤치는 손 스크립트가 base sha 를 `bench/base-night-<sha12>` 로 push 하고 `harness ask --base` 로 쏜다.
|
|
5
|
+
* C: 그 벤치 가지로 다른 PR 이 squash 병합돼 기준선이 오염됐고(#26022), 팔 PR 이 PR 직전 main 동기화에서
|
|
6
|
+
* merge-conflict 로 «실패»로 셈돼 판정이 흐려졌다.
|
|
7
|
+
* A: 기준선 가지 이름을 `bench/<id>/base` 하나로 고정하고, 그 이름 «자체»를 벤치 표지로 쓴다 —
|
|
8
|
+
* 호스트 → self orchestrate → Pod → 안쪽 harness ask 까지 `--base` 가 이미 흐르므로 새 배관이 없다.
|
|
9
|
+
* - 팔 가지 = `bench/<id>/<arm>` (arm = 자식 모델에서 파생 ⊕ 런 접미 — 같은 모델 n 팔이 안 겹친다)
|
|
10
|
+
* - PR base = `bench/<id>/base` · 라벨 `elanous:bench`
|
|
11
|
+
* - PR 직전 main 동기화는 건너뛴다(관측 `bench`/`main-sync-skipped`) — 판정은 base 위 게이트·시험·리뷰
|
|
12
|
+
* - 원장 = `<config dir>/bench/<id>.jsonl` · 읽기 = `elanous bench ls <id>`
|
|
13
|
+
* ⛔ base 는 «자식 작업 가지의 출발점»(⊕ PR base)으로만 쓰인다 — 부모 cwd 를 base 트리로 옮기지 않는다.
|
|
14
|
+
* 부모·Pod 발사 코드는 지금 도는 코드다(원장 `parentCodeCommit` 이 그 커밋을 base sha 와 따로 적는다).
|
|
15
|
+
* ⛔ 착지 막기는 여기 몫이 아니다(LAND-BASE-MAIN-GUARD · base≠main 재사용 PR 거부).
|
|
16
|
+
*/
|
|
17
|
+
import { spawnSync } from 'node:child_process';
|
|
18
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
|
|
21
|
+
export const BENCH_LABEL = 'elanous:bench';
|
|
22
|
+
export const BENCH_LOG_CATEGORY = 'bench';
|
|
23
|
+
|
|
24
|
+
const BENCH_ID = /^[a-z0-9][a-z0-9._-]{0,63}$/i;
|
|
25
|
+
const SHA = /^[0-9a-f]{7,40}$/i;
|
|
26
|
+
|
|
27
|
+
export interface BenchSpec { readonly id: string; readonly sha?: string }
|
|
28
|
+
|
|
29
|
+
/** `--bench <id>[:<base-sha>]` 를 푼다. ⛔ 모르는 꼴은 «거부»한다 — 조용히 고치면 다른 기준선으로 돈다. */
|
|
30
|
+
export function parseBenchSpec(spec: string): BenchSpec {
|
|
31
|
+
const raw = spec.trim();
|
|
32
|
+
const colon = raw.indexOf(':');
|
|
33
|
+
const id = colon < 0 ? raw : raw.slice(0, colon);
|
|
34
|
+
const sha = colon < 0 ? undefined : raw.slice(colon + 1);
|
|
35
|
+
if (!BENCH_ID.test(id) || id === 'base') {
|
|
36
|
+
throw new Error(`--bench id 가 잘못됐다: ${JSON.stringify(id)} — 영숫자로 시작하는 [A-Za-z0-9._-] 64자 이내(슬래시 금지 · 'base' 금지)`);
|
|
37
|
+
}
|
|
38
|
+
if (sha !== undefined && !SHA.test(sha)) {
|
|
39
|
+
throw new Error(`--bench base sha 가 잘못됐다: ${JSON.stringify(sha)} — 16진 7~40자`);
|
|
40
|
+
}
|
|
41
|
+
return { id, ...(sha !== undefined ? { sha: sha.toLowerCase() } : {}) };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function benchBaseBranch(id: string): string { return `bench/${id}/base`; }
|
|
45
|
+
|
|
46
|
+
function stripRef(ref: string): string {
|
|
47
|
+
return ref.trim().replace(/^refs\/heads\//, '').replace(/^refs\/remotes\/origin\//, '').replace(/^origin\//, '');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** `bench/<id>/base` 면 id, 아니면 null. `origin/`·`refs/heads/` 접두는 벗긴다. */
|
|
51
|
+
export function benchIdFromBase(ref: string | undefined | null): string | null {
|
|
52
|
+
if (!ref) return null;
|
|
53
|
+
const m = /^bench\/([^/]+)\/base$/.exec(stripRef(ref));
|
|
54
|
+
return m && BENCH_ID.test(m[1]!) ? m[1]! : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** `bench/<id>/<arm>`(arm ≠ base) 면 {id, arm}, 아니면 null. */
|
|
58
|
+
export function parseBenchArmBranch(ref: string | undefined | null): { id: string; arm: string } | null {
|
|
59
|
+
if (!ref) return null;
|
|
60
|
+
const m = /^bench\/([^/]+)\/([^/]+)$/.exec(stripRef(ref));
|
|
61
|
+
if (!m || m[2] === 'base' || !BENCH_ID.test(m[1]!)) return null;
|
|
62
|
+
return { id: m[1]!, arm: m[2]! };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** 팔 이름 — 자식 모델의 마지막 토막(`openrouter/z-ai/glm-5.3-flash` → `glm-5.3-flash`) ⊕ 런 접미 6자.
|
|
66
|
+
* ⭐ 접미가 있어야 같은 모델 n 팔(sonnet1~3)이 같은 가지로 겹쳐 서로의 PR 을 덮지 않는다. */
|
|
67
|
+
export function benchArmName(childModel: string | undefined, runId: string | undefined): string {
|
|
68
|
+
const last = childModel?.trim().split('/').filter(Boolean).at(-1) ?? '';
|
|
69
|
+
const slug = last.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^[-.]+|[-.]+$/g, '').slice(0, 40) || 'default';
|
|
70
|
+
const suffix = (runId ?? '').toLowerCase().replace(/^run-/, '').replace(/[^a-z0-9]/g, '').slice(0, 6);
|
|
71
|
+
return suffix ? `${slug}-${suffix}` : slug;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** 벤치 base 위의 런이면 팔 가지 이름, 아니면 undefined(동작 불변). */
|
|
75
|
+
export function benchArmBranchForBase(base: string | undefined, childModel: string | undefined, runId: string | undefined): string | undefined {
|
|
76
|
+
const id = benchIdFromBase(base);
|
|
77
|
+
return id ? `bench/${id}/${benchArmName(childModel, runId)}` : undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type BenchGitRun = (args: readonly string[]) => { status: number | null; stdout: string; stderr: string };
|
|
81
|
+
|
|
82
|
+
export function defaultBenchGitRun(cwd: string): BenchGitRun {
|
|
83
|
+
return (args) => {
|
|
84
|
+
const r = spawnSync('git', [...args], { cwd, encoding: 'utf8', timeout: 120_000 });
|
|
85
|
+
return { status: r.status, stdout: String(r.stdout ?? ''), stderr: String(r.stderr ?? '') };
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface BenchBase { readonly id: string; readonly branch: string; readonly sha: string; readonly created: boolean }
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 기준선 가지를 고정한다 — 없으면 만들고, 있으면 sha 일치를 확인한다(불일치 = 거부).
|
|
93
|
+
* sha 생략: 가지가 «없으면» 발사 시점 origin/main 으로 만들고, «있으면» 그 가지의 sha 를 그대로 쓴다
|
|
94
|
+
* (첫 팔이 정한 기준선을 뒤 팔이 따라간다 — main 이 그 사이 움직여도 팔끼리 같은 땅).
|
|
95
|
+
*/
|
|
96
|
+
export function ensureBenchBase(spec: BenchSpec, run: BenchGitRun): BenchBase {
|
|
97
|
+
const branch = benchBaseBranch(spec.id);
|
|
98
|
+
const must = (args: readonly string[], what: string) => {
|
|
99
|
+
const r = run(args);
|
|
100
|
+
if (r.status !== 0) throw new Error(`bench: ${what} 실패 (git ${args.join(' ')} rc=${r.status ?? 'signal'}): ${r.stderr.trim().split('\n')[0] ?? ''}`);
|
|
101
|
+
return r.stdout.trim();
|
|
102
|
+
};
|
|
103
|
+
const trackingFetch = ['fetch', '--no-tags', 'origin', `+refs/heads/${branch}:refs/remotes/origin/${branch}`] as const;
|
|
104
|
+
const remote = run(['ls-remote', '--exit-code', 'origin', `refs/heads/${branch}`]);
|
|
105
|
+
if (remote.status !== 0 && remote.status !== 2) {
|
|
106
|
+
throw new Error(`bench: origin 의 ${branch} 를 못 읽었다 (rc=${remote.status ?? 'signal'}) — 「없다」로 읽지 않는다: ${remote.stderr.trim().split('\n')[0] ?? ''}`);
|
|
107
|
+
}
|
|
108
|
+
const existing = remote.status === 0 ? remote.stdout.trim().split(/\s+/)[0]?.toLowerCase() : undefined;
|
|
109
|
+
if (existing) {
|
|
110
|
+
if (spec.sha && !existing.startsWith(spec.sha)) {
|
|
111
|
+
throw new Error(`bench: ${branch} 가 이미 ${existing.slice(0, 12)} 에 있다 — 요청 ${spec.sha.slice(0, 12)} 와 다르다(거부 · 다른 기준선이면 새 bench id 를 써라)`);
|
|
112
|
+
}
|
|
113
|
+
must(trackingFetch, `${branch} fetch`);
|
|
114
|
+
return { id: spec.id, branch, sha: existing, created: false };
|
|
115
|
+
}
|
|
116
|
+
must(['fetch', '--no-tags', 'origin', 'main'], 'origin main fetch');
|
|
117
|
+
const sha = must(['rev-parse', '--verify', `${spec.sha ?? 'origin/main'}^{commit}`], 'base sha 해석').toLowerCase();
|
|
118
|
+
must(['push', 'origin', `${sha}:refs/heads/${branch}`], `${branch} push`);
|
|
119
|
+
// push 는 원격 추적 ref 를 안 만든다 — 로컬 기질의 worktree 가 `origin/<branch>` 를 찾도록 한 번 당긴다.
|
|
120
|
+
must(trackingFetch, `${branch} fetch`);
|
|
121
|
+
return { id: spec.id, branch, sha, created: true };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface BenchLedgerRow {
|
|
125
|
+
readonly ts: string;
|
|
126
|
+
readonly event: 'launched' | 'finished';
|
|
127
|
+
readonly benchId: string;
|
|
128
|
+
readonly baseBranch: string;
|
|
129
|
+
readonly baseSha: string;
|
|
130
|
+
/** 부모(발사 프로세스)가 도는 코드 커밋 — base sha 와 따로 적는다(base 는 작업 가지 출발점에만 쓰인다). */
|
|
131
|
+
readonly parentCodeCommit?: string | null;
|
|
132
|
+
/** `harness.imageCommit` (Pod 이미지 pin) — 없으면 null(«못 읽음»과 «없음»을 같은 값으로: 원장엔 설정값만 싣는다). */
|
|
133
|
+
readonly imageCommit: string | null;
|
|
134
|
+
readonly childLlmProvider: string | null;
|
|
135
|
+
readonly childLlmModel: string | null;
|
|
136
|
+
/** 같은 bench id ⊕ 같은 자식 모델의 몇 번째 발사인가(1부터). */
|
|
137
|
+
readonly round: number;
|
|
138
|
+
readonly entrance?: string;
|
|
139
|
+
readonly substrate?: string;
|
|
140
|
+
readonly seat?: string;
|
|
141
|
+
readonly exitCode?: number;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function benchLedgerPath(id: string, configDir: string): string {
|
|
145
|
+
return join(configDir, 'bench', `${id}.jsonl`);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function readBenchLedger(id: string, configDir: string): BenchLedgerRow[] {
|
|
149
|
+
const path = benchLedgerPath(id, configDir);
|
|
150
|
+
if (!existsSync(path)) return [];
|
|
151
|
+
const rows: BenchLedgerRow[] = [];
|
|
152
|
+
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
153
|
+
if (!line.trim()) continue;
|
|
154
|
+
try { rows.push(JSON.parse(line) as BenchLedgerRow); } catch { /* 깨진 줄은 건너뛴다 — 수는 renderBenchLs 가 따로 안 센다 */ }
|
|
155
|
+
}
|
|
156
|
+
return rows;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function nextBenchRound(rows: readonly BenchLedgerRow[], childLlmModel: string | null): number {
|
|
160
|
+
return rows.filter((row) => row.event === 'launched' && (row.childLlmModel ?? null) === childLlmModel).length + 1;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function appendBenchLedger(row: BenchLedgerRow, configDir: string): void {
|
|
164
|
+
const path = benchLedgerPath(row.benchId, configDir);
|
|
165
|
+
mkdirSync(join(configDir, 'bench'), { recursive: true, mode: 0o700 });
|
|
166
|
+
appendFileSync(path, `${JSON.stringify(row)}\n`, { mode: 0o600 });
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function renderBenchLs(id: string, rows: readonly BenchLedgerRow[]): string {
|
|
170
|
+
if (rows.length === 0) return `bench ${id}: 원장 줄 0 (기록 없음)`;
|
|
171
|
+
const lines = [`bench ${id}: ${rows.length}줄`];
|
|
172
|
+
for (const row of rows) {
|
|
173
|
+
lines.push([
|
|
174
|
+
row.ts, row.event, `round=${row.round}`, `base=${row.baseSha.slice(0, 12)}`,
|
|
175
|
+
`parent=${row.parentCodeCommit ? row.parentCodeCommit.slice(0, 12) : 'unknown'}`,
|
|
176
|
+
`image=${row.imageCommit ? row.imageCommit.slice(0, 12) : 'none'}`,
|
|
177
|
+
`child=${row.childLlmProvider ?? '-'}/${row.childLlmModel ?? '-'}`,
|
|
178
|
+
...(row.substrate ? [`substrate=${row.substrate}`] : []),
|
|
179
|
+
...(row.exitCode !== undefined ? [`rc=${row.exitCode}`] : []),
|
|
180
|
+
].join(' '));
|
|
181
|
+
}
|
|
182
|
+
return lines.join('\n');
|
|
183
|
+
}
|
package/src/boot/acp-server.ts
CHANGED
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
// test.
|
|
26
26
|
|
|
27
27
|
import { mkdirSync } from 'node:fs';
|
|
28
|
-
import {
|
|
29
|
-
import { dirname
|
|
28
|
+
import { defaultUnixSocketPath } from './acp-socket-path.js';
|
|
29
|
+
import { dirname } from 'node:path';
|
|
30
30
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
31
31
|
|
|
32
32
|
import {
|
|
@@ -38,6 +38,8 @@ import { runAcpServer, type AcpServerOptions } from '../acp/server.js';
|
|
|
38
38
|
import type { LlmBrand } from '../llm-vision-capability.js';
|
|
39
39
|
import { DEFAULT_NEXUS_HTTP_PORT } from '../nexus/default-port.js';
|
|
40
40
|
|
|
41
|
+
export { defaultUnixSocketPath } from './acp-socket-path.js';
|
|
42
|
+
|
|
41
43
|
export type AcpBootTransport = 'stdio' | 'unix-socket' | 'websocket';
|
|
42
44
|
|
|
43
45
|
export interface AcpBootOptions {
|
|
@@ -56,11 +58,6 @@ export interface AcpBootOptions {
|
|
|
56
58
|
toolCwd?: string;
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
/** Default socket path — XDG-ish; `~/.elanous/elanous.sock`. */
|
|
60
|
-
export function defaultUnixSocketPath(): string {
|
|
61
|
-
return joinPath(getElanousConfigDir(), 'elanous.sock');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
61
|
/** Default websocket bind port. Mnemonic: π × 10⁴. */
|
|
65
62
|
export const DEFAULT_WEBSOCKET_PORT = DEFAULT_NEXUS_HTTP_PORT;
|
|
66
63
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { join as joinPath } from 'node:path';
|
|
2
|
+
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
3
|
+
|
|
4
|
+
/** Default socket path — XDG-ish; `~/.elanous/elanous.sock`. */
|
|
5
|
+
export function defaultUnixSocketPath(): string {
|
|
6
|
+
return joinPath(getElanousConfigDir(), 'elanous.sock');
|
|
7
|
+
}
|
|
@@ -20,6 +20,7 @@ export interface BriefWeeklyActions extends BriefActionCount {
|
|
|
20
20
|
export type BriefDomain = (typeof BRIEF_DOMAINS)[number];
|
|
21
21
|
export type BriefPriority = (typeof BRIEF_PRIORITIES)[number];
|
|
22
22
|
export type BriefSlot = (typeof BRIEF_SLOTS)[number];
|
|
23
|
+
export type BriefSendSlot = BriefSlot | 'realtime';
|
|
23
24
|
|
|
24
25
|
const KST = 'Asia/Seoul';
|
|
25
26
|
|
|
@@ -95,6 +96,12 @@ function needsDecision(item: BriefItem, today: string): boolean {
|
|
|
95
96
|
return item.priority === 'P0' || (item.deadline !== null && deadlineDate(item.deadline) === today);
|
|
96
97
|
}
|
|
97
98
|
|
|
99
|
+
/** Unsent decisions needing immediate delivery, using the same KST deadline rule as slot pages. */
|
|
100
|
+
export function pendingRealtime(items: readonly BriefItem[], now: Date): BriefItem[] {
|
|
101
|
+
const today = dateKey(now, { timeZone: KST });
|
|
102
|
+
return items.filter(item => item.sent_at === null && needsDecision(item, today));
|
|
103
|
+
}
|
|
104
|
+
|
|
98
105
|
/**
|
|
99
106
|
* One briefing page. Item text is copied verbatim.
|
|
100
107
|
* Order: decisions due (P0, then a deadline of today) → domain groups →
|
|
@@ -105,13 +112,13 @@ export function composeBriefMarkdown(items: readonly BriefItem[], slot: BriefSlo
|
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
/** The ids are exactly the rows represented by the composed page, after deduplication. */
|
|
108
|
-
export function composeBriefPage(items: readonly BriefItem[], slot:
|
|
115
|
+
export function composeBriefPage(items: readonly BriefItem[], slot: BriefSendSlot, now: Date): { markdown: string; ids: number[] } {
|
|
109
116
|
const today = dateKey(now, { timeZone: KST });
|
|
110
117
|
// A duplicate left out of a delivered page stays unsent in the ledger, but must not reappear on a later page.
|
|
111
118
|
// A new undeliverable observation after a sent page is a new occurrence, not an old duplicate.
|
|
112
119
|
const deliveredClaims = new Set(items.filter(item => item.sent_at !== null).map(item => normalizeClaim(item.text)));
|
|
113
|
-
const
|
|
114
|
-
|
|
120
|
+
const candidates = slot === 'realtime' ? pendingRealtime(items, now) : items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now));
|
|
121
|
+
const eligible = candidates.filter(item => item.source === 'outbound.undeliverable' || !deliveredClaims.has(normalizeClaim(item.text)));
|
|
115
122
|
// Duplicate claims keep the copy that needs a decision today (P0 or due today), then the higher priority, then the earliest (ACP must-fix).
|
|
116
123
|
const rank = (item: BriefItem) => [needsDecision(item, today) ? 0 : 1, BRIEF_PRIORITIES.indexOf(item.priority), item.id];
|
|
117
124
|
const better = (a: BriefItem, b: BriefItem) => { const x = rank(a), y = rank(b); return x[0]! - y[0]! || x[1]! - y[1]! || x[2]! - y[2]!; };
|
|
@@ -354,6 +361,7 @@ export class BriefItemsLedger {
|
|
|
354
361
|
* requirement funnel contributes ephemeral lines without adding ledger rows.
|
|
355
362
|
*/
|
|
356
363
|
compose(slot: string): string {
|
|
364
|
+
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
357
365
|
return this.composeWithIds(slot).markdown;
|
|
358
366
|
}
|
|
359
367
|
|
|
@@ -361,7 +369,7 @@ export class BriefItemsLedger {
|
|
|
361
369
|
return db.query('SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all() as BriefItem[];
|
|
362
370
|
}
|
|
363
371
|
|
|
364
|
-
private pageFromDb(db: Database, slot:
|
|
372
|
+
private pageFromDb(db: Database, slot: BriefSendSlot): { markdown: string; ids: number[] } {
|
|
365
373
|
const items = this.itemsFromDb(db);
|
|
366
374
|
const now = this.now();
|
|
367
375
|
const morningCutoff = Date.parse(`${dateKey(now, { timeZone: KST })}T08:30:00+09:00`);
|
|
@@ -383,26 +391,26 @@ export class BriefItemsLedger {
|
|
|
383
391
|
const composed = composeBriefPage([...items, ...funnelItems], slot, now);
|
|
384
392
|
// Ephemeral funnel lines appear on the page but have no ledger row to mark sent.
|
|
385
393
|
const page = { markdown: composed.markdown, ids: composed.ids.filter(id => id > 0) };
|
|
386
|
-
const candidates = items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now)).length;
|
|
394
|
+
const candidates = (slot === 'realtime' ? pendingRealtime(items, now) : items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now))).length;
|
|
387
395
|
this.log('briefing.items', 'composed', { slot, candidates, bytes: Buffer.byteLength(page.markdown) });
|
|
388
396
|
return page;
|
|
389
397
|
}
|
|
390
398
|
|
|
391
399
|
/** Read-only page and the exact ledger item ids printed on it (after deduplication). */
|
|
392
400
|
composeWithIds(slot: string): { markdown: string; ids: number[] } {
|
|
393
|
-
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
394
|
-
return this.using(db => this.pageFromDb(db, slot as
|
|
401
|
+
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
402
|
+
return this.using(db => this.pageFromDb(db, slot as BriefSendSlot));
|
|
395
403
|
}
|
|
396
404
|
|
|
397
405
|
/** Hold the ledger's SQLite writer lock from selecting unsent rows through delivery and marking.
|
|
398
406
|
* A failed delivery rolls back and releases the lock; the next sender can retry.
|
|
399
407
|
*/
|
|
400
|
-
withSendLock<T>(slot: string, work: (page: { markdown: string; ids: number[] }, markSent: (ids: readonly number[], slot:
|
|
401
|
-
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
408
|
+
withSendLock<T>(slot: string, work: (page: { markdown: string; ids: number[] }, markSent: (ids: readonly number[], slot: BriefSendSlot) => number) => T): T {
|
|
409
|
+
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
402
410
|
return this.using(db => {
|
|
403
411
|
db.exec('BEGIN IMMEDIATE');
|
|
404
412
|
try {
|
|
405
|
-
const page = this.pageFromDb(db, slot as
|
|
413
|
+
const page = this.pageFromDb(db, slot as BriefSendSlot);
|
|
406
414
|
const result = work(page, (ids, sentSlot) => {
|
|
407
415
|
if (sentSlot !== slot || ids.length !== page.ids.length || ids.some((id, index) => id !== page.ids[index])) {
|
|
408
416
|
throw new BriefItemsInputError('marked ids must match composed page');
|
|
@@ -418,7 +426,7 @@ export class BriefItemsLedger {
|
|
|
418
426
|
});
|
|
419
427
|
}
|
|
420
428
|
|
|
421
|
-
private markSentInDb(db: Database, ids: readonly number[], slot:
|
|
429
|
+
private markSentInDb(db: Database, ids: readonly number[], slot: BriefSendSlot): number {
|
|
422
430
|
const at = this.now().toISOString();
|
|
423
431
|
const insert = db.query('INSERT INTO sends (item_id, slot, sent_at) VALUES (?, ?, ?)');
|
|
424
432
|
let count = 0;
|
|
@@ -431,8 +439,8 @@ export class BriefItemsLedger {
|
|
|
431
439
|
* Records that these items went out in a slot (append-only); later composes leave them out (ACP must-fix).
|
|
432
440
|
* Only an actual sender calls this — compose itself stays read-only (no flag marks items it did not send).
|
|
433
441
|
*/
|
|
434
|
-
markSent(ids: readonly number[], slot:
|
|
435
|
-
if (!(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
442
|
+
markSent(ids: readonly number[], slot: BriefSendSlot): number {
|
|
443
|
+
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
436
444
|
return this.using(db => db.transaction(() => this.markSentInDb(db, ids, slot))());
|
|
437
445
|
}
|
|
438
446
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// Grok budget fetcher adapter.
|
|
2
2
|
//
|
|
3
3
|
// Reuses `fetchGrokUsage` (src/grok/usage.ts). Existing subscription token
|
|
4
|
-
// only.
|
|
5
|
-
//
|
|
6
|
-
// never written into RateWindow.remainingPercent.
|
|
4
|
+
// only. Maps an explicitly returned weekly period + creditUsagePercent into
|
|
5
|
+
// the provider's weekly quota window; credit balances remain on the credits axis.
|
|
7
6
|
|
|
8
7
|
import {
|
|
9
8
|
fetchGrokUsage,
|
|
9
|
+
grokUsageToSubscriptionAxis,
|
|
10
10
|
grokUsageToCreditAxis,
|
|
11
11
|
type GrokUsage,
|
|
12
12
|
} from '../../grok/usage.js';
|
|
@@ -36,10 +36,20 @@ export function createGrokFetcher(opts: GrokFetcherOpts = {}): ProviderFetcher {
|
|
|
36
36
|
|
|
37
37
|
export function grokUsageToSnapshot(usage: GrokUsage, fetchedAt: number = Date.now()): UsageSnapshot {
|
|
38
38
|
const credits = creditsFromGrokUsage(usage);
|
|
39
|
+
const subscription = grokUsageToSubscriptionAxis(usage);
|
|
40
|
+
const windows = subscription.status === 'available'
|
|
41
|
+
? [{
|
|
42
|
+
kind: 'weekly' as const,
|
|
43
|
+
windowMinutes: 10_080,
|
|
44
|
+
limit: 100,
|
|
45
|
+
used: 100 - subscription.remainingPercent,
|
|
46
|
+
remainingPercent: subscription.remainingPercent,
|
|
47
|
+
resetsAt: subscription.resetsAt,
|
|
48
|
+
}]
|
|
49
|
+
: [];
|
|
39
50
|
return {
|
|
40
51
|
provider: 'grok' as UsageProvider,
|
|
41
|
-
|
|
42
|
-
windows: [],
|
|
52
|
+
windows,
|
|
43
53
|
...(credits ? { credits } : {}),
|
|
44
54
|
fetchedAt,
|
|
45
55
|
source: 'oauth-api',
|
package/src/budget/llm-cost.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { findGrokModel } from '../grok/models.js';
|
|
|
11
11
|
import { getUserConfig } from '../user-config.js';
|
|
12
12
|
import { BUILTIN_CATALOG } from '../intelligence-map/model-catalog.js';
|
|
13
13
|
import { getCatalog } from '../registry/loader.js';
|
|
14
|
+
import { byokCostFor, type ByokActualCost, type ByokPartialCost } from '../llm/openrouter-byok-cost.js';
|
|
14
15
|
|
|
15
16
|
export interface LlmPricingUsd {
|
|
16
17
|
inputPerM: number;
|
|
@@ -23,6 +24,13 @@ export interface LlmPricingUsd {
|
|
|
23
24
|
longContext?: { thresholdTokens: number; inputPerM: number; outputPerM: number; cacheReadPerM?: number; cacheWritePerM?: number };
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
/** AWS Bedrock Global Standard prices, USD per million tokens (AWS pricing API, ap-northeast-2). */
|
|
28
|
+
export const BEDROCK_PRICING_USD: Readonly<Record<string, LlmPricingUsd>> = {
|
|
29
|
+
'claude-haiku-5-5': { inputPerM: 0.1, outputPerM: 0.5, cacheWritePerM: 0.125, cacheReadPerM: 0.01 },
|
|
30
|
+
'claude-sonnet-5-5': { inputPerM: 2, outputPerM: 10, cacheWritePerM: 2.5, cacheReadPerM: 0.1 },
|
|
31
|
+
'claude-opus-5-5': { inputPerM: 4, outputPerM: 20, cacheWritePerM: 5, cacheReadPerM: 0.2 },
|
|
32
|
+
};
|
|
33
|
+
|
|
26
34
|
export interface LlmCostUsage {
|
|
27
35
|
model: string;
|
|
28
36
|
inputTokens?: number;
|
|
@@ -46,7 +54,7 @@ export type LlmCostEstimate =
|
|
|
46
54
|
kind: 'known';
|
|
47
55
|
model: string;
|
|
48
56
|
usd: number;
|
|
49
|
-
source: 'catalog' | 'config' | 'registry';
|
|
57
|
+
source: 'catalog' | 'bedrock-catalog' | 'config' | 'registry';
|
|
50
58
|
cacheReadPricedAt: 'cache-read' | 'input-rate';
|
|
51
59
|
cacheWritePricedAt: 'cache-write' | 'input-rate';
|
|
52
60
|
/** 장문맥 단가로 매겼으면 `'long-context'` — 없으면 기본 단가. */
|
|
@@ -56,7 +64,7 @@ export type LlmCostEstimate =
|
|
|
56
64
|
kind: 'partial';
|
|
57
65
|
model: string;
|
|
58
66
|
usd: number;
|
|
59
|
-
source: 'catalog' | 'config' | 'registry';
|
|
67
|
+
source: 'catalog' | 'bedrock-catalog' | 'config' | 'registry';
|
|
60
68
|
cacheReadPricedAt: 'cache-read' | 'input-rate';
|
|
61
69
|
cacheWritePricedAt: 'cache-write' | 'input-rate';
|
|
62
70
|
pricedTier?: 'long-context';
|
|
@@ -147,6 +155,21 @@ export function normalizePricingModelId(model: string): string {
|
|
|
147
155
|
return m;
|
|
148
156
|
}
|
|
149
157
|
|
|
158
|
+
/** Normalize a Bedrock Anthropic model id to its bare Claude pricing id. */
|
|
159
|
+
export function bedrockPricingModelId(model: string): string {
|
|
160
|
+
return model.trim()
|
|
161
|
+
.replace(/^bedrock\//, '')
|
|
162
|
+
.replace(/^[a-z0-9-]+\.anthropic\./i, '')
|
|
163
|
+
.replace(/^anthropic\./, '')
|
|
164
|
+
.replace(/-v1:0$/, '');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function isBedrockPricingModel(model: string): boolean {
|
|
168
|
+
const trimmed = model.trim();
|
|
169
|
+
return /^(?:bedrock\/|[a-z0-9-]+\.anthropic\.|anthropic\.)/i.test(trimmed)
|
|
170
|
+
&& bedrockPricingModelId(trimmed).startsWith('claude-');
|
|
171
|
+
}
|
|
172
|
+
|
|
150
173
|
/** 저장소의 모델 정본(intelligence-map BUILTIN_CATALOG) — 손 카탈로그 넷에 없는 모델(Claude 5 계열 등)의 입력·출력 단가.
|
|
151
174
|
* 캐시 단가는 거기 없다 → Anthropic 모델은 공식 규칙(읽기 0.1× · 쓰기 5분 1.25×)으로 파생한다. 다른 벤더는 입력 단가로 매기고
|
|
152
175
|
* `cacheReadPricedAt: 'input-rate'` 로 그 사실을 드러낸다(추측하지 않는다). */
|
|
@@ -174,8 +197,8 @@ function registryPricing(model: string): LlmPricingUsd | undefined {
|
|
|
174
197
|
function resolvePricing(
|
|
175
198
|
model: string,
|
|
176
199
|
opts?: EstimateLlmCostOptions,
|
|
177
|
-
): { pricing: LlmPricingUsd; source: 'catalog' | 'config' | 'registry' } | undefined {
|
|
178
|
-
// ⭐ 순서: 손 카탈로그(정확) → 정규화 id → config 오버레이 → 저장소 정본 → 레지스트리. 앞이 이긴다.
|
|
200
|
+
): { pricing: LlmPricingUsd; source: 'catalog' | 'bedrock-catalog' | 'config' | 'registry' } | undefined {
|
|
201
|
+
// ⭐ 순서: 손 카탈로그(정확) → 정규화 id → config 오버레이 → Bedrock 표 → 저장소 정본 → 레지스트리. 앞이 이긴다.
|
|
179
202
|
const normalized = normalizePricingModelId(model);
|
|
180
203
|
for (const id of normalized === model ? [model] : [model, normalized]) {
|
|
181
204
|
const catalog = catalogPricing(id);
|
|
@@ -185,6 +208,10 @@ function resolvePricing(
|
|
|
185
208
|
const overlay = opts?.configPricing?.[id];
|
|
186
209
|
if (validPricing(overlay)) return { pricing: overlay, source: 'config' };
|
|
187
210
|
}
|
|
211
|
+
if (isBedrockPricingModel(model)) {
|
|
212
|
+
const bedrock = BEDROCK_PRICING_USD[bedrockPricingModelId(model)];
|
|
213
|
+
if (validPricing(bedrock)) return { pricing: bedrock, source: 'bedrock-catalog' };
|
|
214
|
+
}
|
|
188
215
|
const builtin = builtinCatalogPricing(normalized);
|
|
189
216
|
if (validPricing(builtin)) return { pricing: builtin, source: 'catalog' };
|
|
190
217
|
const registry = registryPricing(model);
|
|
@@ -297,11 +324,16 @@ export function llmUsageCostFields(
|
|
|
297
324
|
usage: Omit<LlmCostUsage, 'model'>,
|
|
298
325
|
opts?: EstimateLlmCostOptions,
|
|
299
326
|
billing?: BillingRoute,
|
|
300
|
-
): { cost: LlmCostEstimate | IncludedLlmCost | ActualLlmCost } {
|
|
327
|
+
): { cost: LlmCostEstimate | IncludedLlmCost | ActualLlmCost | ByokActualCost | ByokPartialCost } {
|
|
301
328
|
const resolved = opts ?? { configPricing: readLlmConfigPricing() };
|
|
302
329
|
const estimate = estimateLlmCost({ model, ...usage }, resolved);
|
|
303
330
|
// ⛔⭐ 구독을 API 단가로 «known» 이라 적지 않는다 — 09-25 벤치에서 codex 구독 팔이 `$7.81 known` 으로 보였다.
|
|
304
331
|
// ⭐ BACKLOG C7 — provider 가 실어 보낸 «실제 청구액»이 있으면 그것이 비용이다(추정은 곁에 남긴다).
|
|
332
|
+
// OR-BYOK-COST — BYOK 면 «OR 청구 + 상류 청구»가 비용이다(상류를 모르면 partial · 0 으로 가정하지 않는다).
|
|
333
|
+
if (billing !== 'subscription' && billing !== 'local') {
|
|
334
|
+
const byok = byokCostFor(model, usage as Parameters<typeof byokCostFor>[1], estimate.kind === 'known' || estimate.kind === 'partial' ? estimate.usd : undefined);
|
|
335
|
+
if (byok) return { cost: byok };
|
|
336
|
+
}
|
|
305
337
|
const reported = (usage as { reportedCostUsd?: unknown }).reportedCostUsd;
|
|
306
338
|
if (typeof reported === 'number' && Number.isFinite(reported) && billing !== 'subscription' && billing !== 'local') {
|
|
307
339
|
return { cost: { kind: 'actual', model, usd: reported, source: 'provider-reported', ...(estimate.kind === 'known' || estimate.kind === 'partial' ? { estimateUsd: estimate.usd } : {}) } };
|
package/src/budget/types.ts
CHANGED
|
@@ -158,18 +158,24 @@ export type ResetCreditExpiryAxis =
|
|
|
158
158
|
| { readonly status: 'expired'; readonly expiresAt: string; readonly hasUnknownExpiry: boolean };
|
|
159
159
|
|
|
160
160
|
export interface AccountUsageRow {
|
|
161
|
-
|
|
161
|
+
/** `zai` = GLM Coding Plan(ZAI-CODING-PLAN-PROVIDER) — `ZAI_API_KEY` 가 있을 때만 행이 생긴다. */
|
|
162
|
+
readonly provider: 'codex' | 'grok' | 'openrouter' | 'zai';
|
|
162
163
|
readonly accountName: string;
|
|
163
164
|
readonly accountCount: number;
|
|
164
165
|
readonly soleAccount: boolean;
|
|
165
166
|
readonly credits: CreditAxis;
|
|
166
167
|
readonly subscription: SubscriptionAxis;
|
|
167
168
|
readonly resetCredits: ResetCreditExpiryAxis;
|
|
169
|
+
/** 행 끝에 붙는 한 줄(출처·실수치) — 없으면 종전 문면과 바이트 동일. */
|
|
170
|
+
readonly note?: string;
|
|
168
171
|
}
|
|
169
172
|
|
|
170
173
|
export interface UnifiedUsageReport {
|
|
171
174
|
readonly rows: readonly AccountUsageRow[];
|
|
172
|
-
|
|
175
|
+
/** `zai` 는 키가 있을 때만 실린다(없으면 종전 JSON 과 같다). */
|
|
176
|
+
readonly accountCounts: Readonly<Record<'codex' | 'grok' | 'openrouter', number>> & { readonly zai?: number };
|
|
177
|
+
/** GLM Coding Plan 상세(창 · 우리 적산 · 잔액 사용 · 마지막 한도 코드) — 키가 있을 때만. */
|
|
178
|
+
readonly zaiCodingPlan?: import('../llm/zai-coding-plan.js').ZaiUsageView;
|
|
173
179
|
}
|
|
174
180
|
|
|
175
181
|
export interface TurnSummary {
|