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
|
@@ -15,12 +15,19 @@
|
|
|
15
15
|
* evidence-uncovered → derive-evidence-rejudge 런 출력·시험·배선에서 증거를 끌어내 1회 재판정
|
|
16
16
|
* review-repeat · review-out-of-scope · fabric · launch-failed · unclassified → needs-owner(새 라운드 없음)
|
|
17
17
|
*
|
|
18
|
+
* 사다리의 «출처»: `graphs/overlays/stop-heal-ladder.yaml` 이 갈래마다 처방 노드(id = 처방 이름)를 선언한다.
|
|
19
|
+
* 그 갈래에 얹힌 오버레이가 더한 노드 id 가 처방이다(source='graph'). 선언이 없거나 못 읽으면
|
|
20
|
+
* 위 표(`AUTOHEAL_ACTION_BY_CLASS`)로 간다(source='code-default'). 둘이 같은 답을 내는지는 시험이 문다.
|
|
21
|
+
*
|
|
18
22
|
* 모드 `tools.selfImplement.autoheal.mode` = `shadow`(기본: 할 일을 원장에만 적고 손대지 않는다) | `live`.
|
|
19
23
|
* ⛔ live 에서도 행동은 주입 seam 으로만 한다 — seam 이 없는 행동은 `needs-owner`(action-unwired)로 떨어진다.
|
|
20
24
|
* «안 이어진 손»을 「고쳤다」로 읽지 않게.
|
|
21
25
|
* 관측 = `debug.log('self-implement.autoheal', …)` ⊕ 원장 `event='autoheal'`.
|
|
22
26
|
*/
|
|
23
27
|
import { debug } from '../debug/log.js';
|
|
28
|
+
import { applyGraphOverlays, defaultOverlaysDir, loadGraphOverlays, selectOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
|
|
29
|
+
import type { GraphTemplateSpec } from './graph-yaml.js';
|
|
30
|
+
import { GRAPH_SPECS } from './graph-templates.js';
|
|
24
31
|
import { appendRunLedgerEntry, loadRunLedger, type RunLedgerEntry, type RunLedgerWriter } from './run-ledger.js';
|
|
25
32
|
import type { RunStopClass, RunStopRecord } from './run-stop.js';
|
|
26
33
|
|
|
@@ -48,6 +55,58 @@ export const AUTOHEAL_ACTION_BY_CLASS: Readonly<Record<RunStopClass, AutohealAct
|
|
|
48
55
|
unclassified: 'needs-owner',
|
|
49
56
|
};
|
|
50
57
|
|
|
58
|
+
/** 처방 노드 id 로 인정하는 이름 — 오버레이가 더한 노드 중 이 넷만 처방으로 읽는다. */
|
|
59
|
+
const HEAL_ACTION_NODE_IDS: ReadonlySet<string> = new Set<Exclude<AutohealAction, 'needs-owner'>>([
|
|
60
|
+
'clean-workspace-regate', 'rebase-regate', 'resume-from-salvage', 'derive-evidence-rejudge',
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
/** 처방이 «어디서» 왔나 — `graph` = 그 갈래에 얹힌 오버레이가 더한 노드 · `code-default` = 위 표. */
|
|
64
|
+
export type AutohealActionSource = 'graph' | 'code-default';
|
|
65
|
+
|
|
66
|
+
export interface AutohealPick {
|
|
67
|
+
action: AutohealAction;
|
|
68
|
+
source: AutohealActionSource;
|
|
69
|
+
/** source='graph' 일 때 그 처방 노드를 더한 오버레이. */
|
|
70
|
+
overlayId?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** 사다리를 읽어 오는 자리 — 활성 템플릿 선언 ⊕ 오버레이 목록. 시험이 갈아 끼운다. */
|
|
74
|
+
export interface AutohealLadder {
|
|
75
|
+
template: GraphTemplateSpec | undefined;
|
|
76
|
+
overlays: readonly GraphOverlaySpec[];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function loadDefaultLadder(): AutohealLadder {
|
|
80
|
+
return { template: GRAPH_SPECS['self-implement'], overlays: loadGraphOverlays(defaultOverlaysDir()).overlays };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 갈래 → 처방. 그 `stop_class` 에 얹힌 오버레이가 활성 템플릿에 더한 처방 노드 id 를 고른다.
|
|
85
|
+
* ⛔ 오버레이가 없거나 · 조건 키가 없거나 · 로드·적용이 실패하거나 · 처방 노드가 정확히 하나가 아니면
|
|
86
|
+
* «조용히» 코드 표로 간다 — 그 사실은 `source` 가 말한다. 던지지 않는다.
|
|
87
|
+
*/
|
|
88
|
+
export function pickAutohealAction(cls: RunStopClass, loadLadder: () => AutohealLadder = loadDefaultLadder): AutohealPick {
|
|
89
|
+
const codeDefault: AutohealPick = { action: AUTOHEAL_ACTION_BY_CLASS[cls] ?? 'needs-owner', source: 'code-default' };
|
|
90
|
+
try {
|
|
91
|
+
const { template, overlays } = loadLadder();
|
|
92
|
+
if (!template) return codeDefault;
|
|
93
|
+
const { applied } = selectOverlays(overlays, { graphId: template.graphId, stage: 'heal', state: { stop_class: cls } });
|
|
94
|
+
const declared = new Set(template.nodes.map((node) => node.nodeId));
|
|
95
|
+
for (const overlay of applied) {
|
|
96
|
+
const result = applyGraphOverlays(template, [overlay]);
|
|
97
|
+
if (!result.ok) {
|
|
98
|
+
observe('overlay-rejected', { stopClass: cls, overlayId: overlay.overlayId, rejections: result.rejections.map((r) => r.kind) });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const added = result.template.nodes.map((node) => node.nodeId).filter((id) => !declared.has(id) && HEAL_ACTION_NODE_IDS.has(id));
|
|
102
|
+
if (added.length === 1) return { action: added[0] as AutohealAction, source: 'graph', overlayId: overlay.overlayId };
|
|
103
|
+
}
|
|
104
|
+
} catch (error) {
|
|
105
|
+
observe('ladder-unreadable', { stopClass: cls, error: error instanceof Error ? error.message : String(error) });
|
|
106
|
+
}
|
|
107
|
+
return codeDefault;
|
|
108
|
+
}
|
|
109
|
+
|
|
51
110
|
/** 설정 원값 → 모드. 모르는 값은 «좁은 쪽»(shadow). */
|
|
52
111
|
export function parseAutohealMode(raw: unknown): AutohealMode {
|
|
53
112
|
return raw === 'live' ? 'live' : 'shadow';
|
|
@@ -84,6 +143,10 @@ export interface AutohealResult {
|
|
|
84
143
|
runId: string;
|
|
85
144
|
class: RunStopClass;
|
|
86
145
|
action: AutohealAction;
|
|
146
|
+
/** 처방을 «어디서» 골랐나 — 그래프 선언 또는 코드 표. */
|
|
147
|
+
source: AutohealActionSource;
|
|
148
|
+
/** source='graph' 일 때 처방 노드를 더한 오버레이. */
|
|
149
|
+
overlayId?: string;
|
|
87
150
|
mode: AutohealMode;
|
|
88
151
|
outcome: AutohealOutcome;
|
|
89
152
|
/** needs-owner 일 때 사람이 볼 이유(멈춘 원인 그대로 또는 행동 실패). */
|
|
@@ -98,6 +161,8 @@ export interface AutohealDeps {
|
|
|
98
161
|
/** 가드용 원장 읽기 — 기본 `loadRunLedger(runId)`. null = 원장 없음(첫 시도). */
|
|
99
162
|
loadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
|
|
100
163
|
writeLedger?: RunLedgerWriter;
|
|
164
|
+
/** 사다리 선언 읽기 — 기본은 활성 템플릿 ⊕ `graphs/overlays`. 던지면 코드 표로 간다. */
|
|
165
|
+
loadLadder?: () => AutohealLadder;
|
|
101
166
|
}
|
|
102
167
|
|
|
103
168
|
/**
|
|
@@ -128,8 +193,8 @@ function observe(event: string, data: Record<string, unknown>): void {
|
|
|
128
193
|
export async function autohealFromStop(ctx: AutohealContext, deps: AutohealDeps = {}): Promise<AutohealResult> {
|
|
129
194
|
const mode = deps.mode ?? DEFAULT_AUTOHEAL_MODE;
|
|
130
195
|
const cls = ctx.record.class;
|
|
131
|
-
const action =
|
|
132
|
-
const base = { runId: ctx.runId, class: cls, action, mode };
|
|
196
|
+
const { action, source, overlayId } = pickAutohealAction(cls, deps.loadLadder);
|
|
197
|
+
const base = { runId: ctx.runId, class: cls, action, source, ...(overlayId ? { overlayId } : {}), mode };
|
|
133
198
|
|
|
134
199
|
let ledger: readonly RunLedgerEntry[] | null = null;
|
|
135
200
|
try {
|
|
@@ -145,6 +210,8 @@ export async function autohealFromStop(ctx: AutohealContext, deps: AutohealDeps
|
|
|
145
210
|
return { ...base, outcome: 'already-attempted' };
|
|
146
211
|
}
|
|
147
212
|
|
|
213
|
+
observe('action-source', { stopClass: cls, action, source, overlayId: overlayId ?? null });
|
|
214
|
+
|
|
148
215
|
let outcome: AutohealOutcome;
|
|
149
216
|
let reason: string | undefined;
|
|
150
217
|
let detail: string | undefined;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/** LAND-QUEUE-P3 — the merge train's integration gate (changed-file tsc · changed tests · PWA reach/build) for ONE
|
|
2
|
+
* integration commit, run only on the gate host (node-b) through the GATE-REMOTE path (`runOnRemote`).
|
|
3
|
+
* Unlike `dispatchHeavyCheck` it never falls back to a local run: a busy host or an infra failure is «unmeasured».
|
|
4
|
+
* The only local commands are git (cat-file · rev-parse · push · diff). */
|
|
5
|
+
import { debug } from '../debug/log.js';
|
|
6
|
+
import { getDefaultLogStore } from '../mss/logging/log-store.js';
|
|
7
|
+
import {
|
|
8
|
+
realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote,
|
|
9
|
+
type GateRemoteRunner, type GateRemoteSettings, type RemoteRunOutcome,
|
|
10
|
+
} from './gate-remote.js';
|
|
11
|
+
|
|
12
|
+
export type TrainGateOutcome = 'pass' | 'fail' | 'unmeasured';
|
|
13
|
+
|
|
14
|
+
export interface TrainGateInput {
|
|
15
|
+
repo: string;
|
|
16
|
+
/** The integration commit (40-char sha, present locally — need not be checked out). */
|
|
17
|
+
commit: string;
|
|
18
|
+
/** The base the changed-file checks measure against (TSC_BASE_REF). */
|
|
19
|
+
baseSha: string;
|
|
20
|
+
/** Repo-relative changed paths of the integration commit vs baseSha. */
|
|
21
|
+
changedFiles: readonly string[];
|
|
22
|
+
/** Paths deleted by the integration commit — kept in `changedFiles` for tsc/PWA reach, never run as tests. */
|
|
23
|
+
deletedFiles?: readonly string[];
|
|
24
|
+
settings?: GateRemoteSettings;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface TrainGateResult { outcome: TrainGateOutcome; host: string; ms?: number; rc?: number; reason?: string }
|
|
28
|
+
|
|
29
|
+
export interface TrainGateObservation {
|
|
30
|
+
host: string; commit: string; baseSha: string; outcome: TrainGateOutcome;
|
|
31
|
+
rc?: number; ms?: number; reason?: string; changedFiles: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface TrainGateDeps {
|
|
35
|
+
sleep?: (ms: number) => Promise<void>;
|
|
36
|
+
now?: () => number;
|
|
37
|
+
/** Observation sink (default: category `merge-queue` in the log store, so a standalone CLI records it too). */
|
|
38
|
+
observe?: (entry: TrainGateObservation) => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const quote = (value: string) => `'${value.replaceAll("'", `'\\''`)}'`;
|
|
42
|
+
const TEST_FILE = /\.test\.[cm]?[jt]sx?$/;
|
|
43
|
+
|
|
44
|
+
/** The host-side shell body: each step runs only if the one before it passed. Exported for tests. */
|
|
45
|
+
export function trainGateScript(baseSha: string, changedFiles: readonly string[], deleted: ReadonlySet<string> = new Set()): string {
|
|
46
|
+
// A deleted test file is a changed path (tsc/PWA reach) but not something to run.
|
|
47
|
+
const tests = changedFiles.filter((file) => TEST_FILE.test(file) && !deleted.has(file));
|
|
48
|
+
const steps = [
|
|
49
|
+
`TSC_BASE_REF=${quote(baseSha)} bun scripts/ci-typecheck-changed.ts --local`,
|
|
50
|
+
...(tests.length ? [`bun run test:deterministic ${tests.map(quote).join(' ')}`] : []),
|
|
51
|
+
`bun scripts/ci-pwa-build-gate.ts --changed-files ${changedFiles.map(quote).join(' ')}`,
|
|
52
|
+
];
|
|
53
|
+
return steps.join(' && ');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function loadSettings(): Promise<GateRemoteSettings> {
|
|
57
|
+
try {
|
|
58
|
+
const { getUserConfig } = await import('../user-config.js');
|
|
59
|
+
return resolveGateRemoteSettings(getUserConfig().gateRemote);
|
|
60
|
+
} catch { return resolveGateRemoteSettings(undefined); }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function defaultObserve(entry: TrainGateObservation): void {
|
|
64
|
+
const store = getDefaultLogStore();
|
|
65
|
+
if (!store) return;
|
|
66
|
+
store.insertBatch([{ rec: { ts: new Date().toISOString(), category: 'merge-queue', event: 'train-gate', data: entry }, surface: 'merge-queue' }]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The integration gate runs only on the gate host (LAND-QUEUE-P3 · review must-fix): another configured host is «unmeasured». */
|
|
70
|
+
export const TRAIN_GATE_HOST = 'node-b';
|
|
71
|
+
|
|
72
|
+
export async function runTrainGateOnHost(input: TrainGateInput, runner: GateRemoteRunner = realGateRemoteRunner, deps: TrainGateDeps = {}): Promise<TrainGateResult> {
|
|
73
|
+
const settings = input.settings ?? await loadSettings();
|
|
74
|
+
const host = settings.host;
|
|
75
|
+
if (host !== TRAIN_GATE_HOST) {
|
|
76
|
+
const entry: TrainGateObservation = { host, commit: input.commit, baseSha: input.baseSha, outcome: 'unmeasured', reason: `host-not-gate-host (${host} ≠ ${TRAIN_GATE_HOST})`, changedFiles: input.changedFiles.length };
|
|
77
|
+
debug.log('merge-queue', 'train-gate', entry);
|
|
78
|
+
try { (deps.observe ?? defaultObserve)(entry); } catch { /* observation only */ }
|
|
79
|
+
return { outcome: 'unmeasured', host, reason: entry.reason };
|
|
80
|
+
}
|
|
81
|
+
const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
82
|
+
const now = deps.now ?? Date.now;
|
|
83
|
+
const deadline = now() + settings.slotWaitSeconds * 1000;
|
|
84
|
+
const script = trainGateScript(input.baseSha, input.changedFiles, new Set(input.deletedFiles ?? []));
|
|
85
|
+
let outcome: RemoteRunOutcome;
|
|
86
|
+
for (;;) {
|
|
87
|
+
try {
|
|
88
|
+
outcome = runOnRemote({
|
|
89
|
+
repo: input.repo, host, mirror: settings.mirror, commit: input.commit, refs: [input.baseSha],
|
|
90
|
+
argv: ['sh', '-c', script], installPwa: true, hostCap: settings.hostCap,
|
|
91
|
+
}, runner);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
outcome = { kind: 'infra', reason: `exception: ${error instanceof Error ? error.message : String(error)}` };
|
|
94
|
+
}
|
|
95
|
+
if (outcome.kind !== 'busy') break;
|
|
96
|
+
const left = deadline - now();
|
|
97
|
+
if (left <= 0) break;
|
|
98
|
+
await sleep(Math.min(15_000, left));
|
|
99
|
+
if (now() >= deadline) break;
|
|
100
|
+
}
|
|
101
|
+
const result: TrainGateResult = outcome.kind === 'ran'
|
|
102
|
+
? { outcome: outcome.rc === 0 ? 'pass' : 'fail', host, ms: outcome.ms, rc: outcome.rc }
|
|
103
|
+
: { outcome: 'unmeasured', host, reason: outcome.kind === 'busy' ? `host-busy (cap ${settings.hostCap} held for ${settings.slotWaitSeconds}s)` : outcome.reason };
|
|
104
|
+
const entry: TrainGateObservation = {
|
|
105
|
+
host, commit: input.commit, baseSha: input.baseSha, outcome: result.outcome,
|
|
106
|
+
rc: result.rc, ms: result.ms, reason: result.reason, changedFiles: input.changedFiles.length,
|
|
107
|
+
};
|
|
108
|
+
debug.log('merge-queue', 'train-gate', entry);
|
|
109
|
+
try { (deps.observe ?? defaultObserve)(entry); } catch (error) {
|
|
110
|
+
debug.log('merge-queue', 'train-gate-observe-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The merge train's `gate` seam: `(commitSha, prNumbers) → 'pass' | 'fail' | 'unmeasured'`. Changed files are the
|
|
116
|
+
* integration commit's diff against `baseSha` (local git only); a diff failure is «unmeasured», never a local run. */
|
|
117
|
+
export type TrainGate = (commitSha: string, prNumbers: readonly number[]) => Promise<TrainGateOutcome>;
|
|
118
|
+
|
|
119
|
+
export function trainGateOnHost(opts: { repo: string; baseSha: string; settings?: GateRemoteSettings }, runner: GateRemoteRunner = realGateRemoteRunner, deps: TrainGateDeps = {}): TrainGate {
|
|
120
|
+
const unmeasured = (commitSha: string, reason: string): 'unmeasured' => {
|
|
121
|
+
const entry: TrainGateObservation = { host: opts.settings?.host ?? TRAIN_GATE_HOST, commit: commitSha, baseSha: opts.baseSha, outcome: 'unmeasured', reason, changedFiles: 0 };
|
|
122
|
+
debug.log('merge-queue', 'train-gate', entry);
|
|
123
|
+
try { (deps.observe ?? defaultObserve)(entry); } catch { /* observation only */ }
|
|
124
|
+
return 'unmeasured';
|
|
125
|
+
};
|
|
126
|
+
return async (commitSha) => {
|
|
127
|
+
try {
|
|
128
|
+
const diff = runner.local('git', ['diff', '--name-status', '-z', opts.baseSha, commitSha], opts.repo);
|
|
129
|
+
if (diff.rc !== 0 || diff.error) return unmeasured(commitSha, 'changed-files-unavailable');
|
|
130
|
+
const { changedFiles, deletedFiles } = parseNameStatus(diff.stdout);
|
|
131
|
+
return (await runTrainGateOnHost({ repo: opts.repo, commit: commitSha, baseSha: opts.baseSha, changedFiles, deletedFiles, settings: opts.settings }, runner, deps)).outcome;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// Any preparation failure (local git spawn, parse, settings) is «unmeasured» — never a rejected promise, never a local run.
|
|
134
|
+
return unmeasured(commitSha, `prepare-failed: ${error instanceof Error ? error.message : String(error)}`.slice(0, 200));
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** `git diff --name-status -z` → changed paths (renames contribute both sides) ⊕ deleted paths. Exported for tests. */
|
|
140
|
+
export function parseNameStatus(out: string): { changedFiles: string[]; deletedFiles: string[] } {
|
|
141
|
+
const parts = out.split('\0').filter((part) => part !== '');
|
|
142
|
+
const changed: string[] = [];
|
|
143
|
+
const deleted: string[] = [];
|
|
144
|
+
for (let i = 0; i < parts.length;) {
|
|
145
|
+
const status = parts[i++]!;
|
|
146
|
+
if (/^[RC]/.test(status)) {
|
|
147
|
+
const from = parts[i++]; const to = parts[i++];
|
|
148
|
+
if (from) { changed.push(from); if (status.startsWith('R')) deleted.push(from); }
|
|
149
|
+
if (to) changed.push(to);
|
|
150
|
+
} else {
|
|
151
|
+
const path = parts[i++];
|
|
152
|
+
if (!path) break;
|
|
153
|
+
changed.push(path);
|
|
154
|
+
if (status === 'D') deleted.push(path);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { changedFiles: [...new Set(changed)], deletedFiles: [...new Set(deleted)] };
|
|
158
|
+
}
|
|
@@ -365,6 +365,15 @@ const SESSION_TOOL_FAMILY_RULES: SessionToolFamilyRule[] = [
|
|
|
365
365
|
'왜 실패', '기억', '회상', '알림', '이상 없', '뭐 돌', '뭐 하는 중',
|
|
366
366
|
]),
|
|
367
367
|
},
|
|
368
|
+
{
|
|
369
|
+
id: 'release-read',
|
|
370
|
+
description: 'Read-only release status, features, cells, schedules, and current operations.',
|
|
371
|
+
names: ['release_status', 'context_now'],
|
|
372
|
+
match: (text) => hasAny(text, [
|
|
373
|
+
'release', 'version', 'checklist', '발행', '버전', '릴리스', '피처',
|
|
374
|
+
'체크리스트', '칸', '컷', '일정', '판올림', '다음 판', '이번 판', '운영 상태',
|
|
375
|
+
]),
|
|
376
|
+
},
|
|
368
377
|
{
|
|
369
378
|
id: 'runtime-debug',
|
|
370
379
|
description: 'Runtime inspection, traces, and input/debug history.',
|
|
@@ -1721,7 +1730,7 @@ const ESSENTIAL_NATIVE_RULE_IDS = [
|
|
|
1721
1730
|
// Keep dev-harness in the assembly candidate set so the catalog policy below is the single model-exposure authority.
|
|
1722
1731
|
'agent', 'agent-output', 'agent-reply', 'agent-stop', 'agent-list', 'self-implement', 'self-orchestrate', 'dev-harness',
|
|
1723
1732
|
] as const;
|
|
1724
|
-
const ESSENTIAL_HOST_FAMILY_IDS = ['self-ops'] as const;
|
|
1733
|
+
const ESSENTIAL_HOST_FAMILY_IDS = ['self-ops', 'release-read'] as const;
|
|
1725
1734
|
const ESSENTIAL_RUNTIME_FAMILY_IDS = ['bash', 'run-shell', 'pty-shell', 'run-tests', 'elanous_skills_list', 'skill_exec', 'code-grounding'] as const;
|
|
1726
1735
|
const ESSENTIAL_OPTIONAL_TOOL_NAMES = [
|
|
1727
1736
|
'GetDashboardState',
|
|
@@ -80,6 +80,9 @@ export interface FetchApiWithRetryOpts {
|
|
|
80
80
|
/** Fallbacks still unused. When > 0, k consecutive overload-class
|
|
81
81
|
* failures throw OverloadFailoverError before another retry sleep. */
|
|
82
82
|
remainingFallbacks?: number;
|
|
83
|
+
/** BEDROCK-PROVIDER — 재시도 «직전»마다 요청을 다시 만든다(SigV4 서명은 `x-amz-date` 기준 수 분만 유효 —
|
|
84
|
+
* `retry-after` 대기가 길면 옛 서명은 403). 없으면 종전처럼 같은 `init` 을 다시 쓴다(다른 provider 불변). */
|
|
85
|
+
refreshInit?: () => Promise<RequestInit>;
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
/** Raised when overload repeats k times and a fallback is still unused.
|
|
@@ -128,6 +131,8 @@ export async function fetchApiWithRetry(
|
|
|
128
131
|
let lastErr: unknown;
|
|
129
132
|
while (attempt < maxAttempts) {
|
|
130
133
|
let response: Response | null = null;
|
|
134
|
+
// ⛔ try «밖» — 재서명 실패(자격 부재 등)는 재시도할 네트워크 오류가 아니다. 그대로 던진다.
|
|
135
|
+
if (attempt > 0 && opts.refreshInit) init = await opts.refreshInit();
|
|
131
136
|
try {
|
|
132
137
|
response = await fetch(url, init);
|
|
133
138
|
if (response.ok) {
|
|
@@ -179,7 +184,12 @@ export async function fetchApiWithRetry(
|
|
|
179
184
|
const fp = fingerprintError(err, `api:${opts.provider}`);
|
|
180
185
|
const doomStatus = tracker.record(fp);
|
|
181
186
|
const retryAfter = err instanceof ApiHttpError ? err.retryAfter : undefined;
|
|
182
|
-
|
|
187
|
+
// OpenRouter may report an upstream transient as a non-5xx HTTP status.
|
|
188
|
+
// Keep the original status/error for callers, but classify this specific body as retryable.
|
|
189
|
+
const policyError = opts.provider === 'openrouter' && err instanceof ApiHttpError
|
|
190
|
+
&& /Provider returned error/i.test(err.bodyText)
|
|
191
|
+
? Object.assign(new Error(err.message), { code: '503' }) : err;
|
|
192
|
+
const decision = decideRetry(policyError, {
|
|
183
193
|
attempt,
|
|
184
194
|
doomStatus,
|
|
185
195
|
retryAfter,
|
|
@@ -225,7 +225,8 @@ export function providerNamesFromFallbackChain(chain: readonly string[]): string
|
|
|
225
225
|
const out: string[] = [];
|
|
226
226
|
const seen = new Set<string>();
|
|
227
227
|
for (const step of chain) {
|
|
228
|
-
|
|
228
|
+
// `codex-credits`(체인 마지막 칸 · 크레딧)도 provider 는 openai-codex 다 — 이미 앞에 있으면 중복이라 빠진다.
|
|
229
|
+
const name = step === 'grok' ? 'grok' : step === 'codex-rotate' || step === 'codex-credits' ? 'openai-codex' : undefined;
|
|
229
230
|
if (!name || seen.has(name)) continue;
|
|
230
231
|
seen.add(name);
|
|
231
232
|
out.push(name);
|
|
@@ -3,7 +3,13 @@ import { execFileSync } from 'node:child_process';
|
|
|
3
3
|
import { cpSync, existsSync, lstatSync, mkdtempSync, mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { homedir, tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
+
import { gunzipSync } from 'node:zlib';
|
|
6
7
|
import { debug } from '../debug/log.js';
|
|
8
|
+
import { ensureInternalMarketIndex, ensureMarketIndex, type MarketFetchOptions } from '../plugins/install/market-fetch.js';
|
|
9
|
+
import { scanPackInternalRefs } from '../market/pack-internal-refs.js';
|
|
10
|
+
import { createPack } from '../knowledge/kgs/pack.js';
|
|
11
|
+
import { KgsSqliteStore } from '../knowledge/kgs/sqlite-store.js';
|
|
12
|
+
import type { KnowledgeCard, KnowledgeKind } from '../knowledge/kgs/types.js';
|
|
7
13
|
|
|
8
14
|
export interface GiftInstallOptions {
|
|
9
15
|
pack: string;
|
|
@@ -23,6 +29,119 @@ export type GiftInstallResult =
|
|
|
23
29
|
| { ok: true; names: string[]; paths: string[]; collisions: string[]; needsKeys: boolean; message: string }
|
|
24
30
|
| { ok: false; reason: string; message: string };
|
|
25
31
|
|
|
32
|
+
export type KnowledgePackInstallResult =
|
|
33
|
+
| { ok: true; packId: string; citations: string[] }
|
|
34
|
+
| { ok: false; reason: string };
|
|
35
|
+
|
|
36
|
+
/** Install a named knowledge pack from a configured, signed market; no gift code or skill target is involved. */
|
|
37
|
+
export async function installMarketKnowledgePack(input: {
|
|
38
|
+
pack: string;
|
|
39
|
+
market: string;
|
|
40
|
+
enterpriseId?: string;
|
|
41
|
+
marketOptions?: MarketFetchOptions;
|
|
42
|
+
fetch?: typeof fetch;
|
|
43
|
+
store?: Pick<KgsSqliteStore, 'writePack'>;
|
|
44
|
+
}): Promise<KnowledgePackInstallResult> {
|
|
45
|
+
try {
|
|
46
|
+
const verified = input.enterpriseId
|
|
47
|
+
? await ensureInternalMarketIndex(input.market, input.enterpriseId, input.marketOptions)
|
|
48
|
+
: await ensureMarketIndex(input.market, input.marketOptions);
|
|
49
|
+
const entry = verified.index.knowledgePacks?.find(item => item.name === input.pack);
|
|
50
|
+
if (!entry || (input.enterpriseId ? entry.visibility !== 'internal' || entry.enterpriseId !== input.enterpriseId : entry.visibility !== 'public')) {
|
|
51
|
+
return { ok: false, reason: 'pack-not-in-verified-market' };
|
|
52
|
+
}
|
|
53
|
+
const key = entry.artifact.key;
|
|
54
|
+
if (!key || key.startsWith('/') || key.includes('\\') || key.split('/').some(part => !part || part === '.' || part === '..')) {
|
|
55
|
+
return { ok: false, reason: 'invalid-artifact-key' };
|
|
56
|
+
}
|
|
57
|
+
const base = new URL(verified.market.url);
|
|
58
|
+
const artifactUrl = new URL(key, base);
|
|
59
|
+
if (key.includes('%') || key.includes('?') || key.includes('#') || base.protocol !== 'https:') return { ok: false, reason: 'invalid-artifact-key' };
|
|
60
|
+
if (artifactUrl.origin !== base.origin || !artifactUrl.pathname.startsWith(base.pathname) || artifactUrl.search || artifactUrl.hash) {
|
|
61
|
+
return { ok: false, reason: 'invalid-artifact-key' };
|
|
62
|
+
}
|
|
63
|
+
if (entry.artifact.bytes > MAX_DOWNLOAD_BYTES) return { ok: false, reason: 'artifact-mismatch' };
|
|
64
|
+
const response = await (input.fetch ?? fetch)(artifactUrl.href, { redirect: 'error' });
|
|
65
|
+
if (!response.ok || response.redirected || (response.url && response.url !== artifactUrl.href)) return { ok: false, reason: 'artifact-download-failed' };
|
|
66
|
+
const reader = response.body?.getReader();
|
|
67
|
+
if (!reader) return { ok: false, reason: 'artifact-download-failed' };
|
|
68
|
+
const chunks: Uint8Array[] = [];
|
|
69
|
+
let length = 0;
|
|
70
|
+
for (;;) {
|
|
71
|
+
const { done, value } = await reader.read();
|
|
72
|
+
if (done) break;
|
|
73
|
+
length += value.byteLength;
|
|
74
|
+
if (length > MAX_DOWNLOAD_BYTES || length > entry.artifact.bytes) { await reader.cancel(); return { ok: false, reason: 'artifact-mismatch' }; }
|
|
75
|
+
chunks.push(value);
|
|
76
|
+
}
|
|
77
|
+
const bytes = Buffer.concat(chunks);
|
|
78
|
+
if (bytes.length !== entry.artifact.bytes ||
|
|
79
|
+
createHash('sha256').update(bytes).digest('hex').toLowerCase() !== entry.artifact.sha256.toLowerCase()) {
|
|
80
|
+
return { ok: false, reason: 'artifact-mismatch' };
|
|
81
|
+
}
|
|
82
|
+
const archive = gunzipSync(bytes, { maxOutputLength: MAX_UNPACKED_BYTES });
|
|
83
|
+
const files = new Map<string, string>();
|
|
84
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
85
|
+
let endOffset = 0;
|
|
86
|
+
for (let offset = 0; offset + 512 <= archive.length;) {
|
|
87
|
+
const header = archive.subarray(offset, offset + 512);
|
|
88
|
+
if (header.every(byte => byte === 0)) { endOffset = offset; break; }
|
|
89
|
+
const field = (start: number, end: number) => header.subarray(start, end).toString('utf8').replace(/\0.*$/, '');
|
|
90
|
+
const checksum = parseInt(field(148, 156).trim(), 8);
|
|
91
|
+
const actualChecksum = header.reduce((sum, byte, index) => sum + (index >= 148 && index < 156 ? 32 : byte), 0);
|
|
92
|
+
if (checksum !== actualChecksum) return { ok: false, reason: 'invalid-archive' };
|
|
93
|
+
const size = parseInt(field(124, 136).trim(), 8);
|
|
94
|
+
const name = field(0, 100);
|
|
95
|
+
const prefix = field(345, 500);
|
|
96
|
+
const path = prefix ? `${prefix}/${name}` : name;
|
|
97
|
+
if (!Number.isSafeInteger(size) || size < 0 || !path || path.includes('\\') ||
|
|
98
|
+
path.split('/').some(part => !part || part === '.' || part === '..') || header[156] !== 48 ||
|
|
99
|
+
offset + 512 + size > archive.length || files.has(path)) return { ok: false, reason: 'invalid-archive' };
|
|
100
|
+
files.set(path, decoder.decode(archive.subarray(offset + 512, offset + 512 + size)));
|
|
101
|
+
offset += 512 + Math.ceil(size / 512) * 512;
|
|
102
|
+
if (files.size > MAX_ENTRIES) return { ok: false, reason: 'invalid-archive' };
|
|
103
|
+
}
|
|
104
|
+
if (!endOffset || archive.length - endOffset < 1024 || !archive.subarray(endOffset).every(byte => byte === 0)) return { ok: false, reason: 'invalid-archive' };
|
|
105
|
+
const manifest = JSON.parse(files.get('knowledge-pack.json') ?? 'null') as Record<string, unknown> | null;
|
|
106
|
+
if (files.size !== (Array.isArray(manifest?.content) ? manifest.content.length + 1 : -1)) return { ok: false, reason: 'invalid-content' };
|
|
107
|
+
if (!manifest || manifest.kind !== 'knowledge-pack' || manifest.name !== entry.name || manifest.version !== entry.version ||
|
|
108
|
+
!/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/.test(entry.name) || !/^\d+\.\d+\.\d+$/.test(entry.version) ||
|
|
109
|
+
typeof manifest.description !== 'string' || !manifest.description || manifest.description.length > 200 ||
|
|
110
|
+
!Array.isArray(manifest.content) || !manifest.content.length ||
|
|
111
|
+
!Array.isArray(manifest.dependencies) || manifest.dependencies.length !== 0 ||
|
|
112
|
+
manifest.visibility !== entry.visibility || typeof manifest.license !== 'string' || !manifest.license ||
|
|
113
|
+
!manifest.signature || typeof manifest.signature !== 'object' ||
|
|
114
|
+
(manifest.signature as Record<string, unknown>).algorithm !== 'ed25519' ||
|
|
115
|
+
(manifest.signature as Record<string, unknown>).keyId !== verified.keyId) return { ok: false, reason: 'invalid-manifest' };
|
|
116
|
+
const now = new Date().toISOString();
|
|
117
|
+
const cards: KnowledgeCard[] = [];
|
|
118
|
+
for (const item of manifest.content) {
|
|
119
|
+
if (!item || typeof item !== 'object') return { ok: false, reason: 'invalid-content' };
|
|
120
|
+
const { path, kind } = item as Record<string, unknown>;
|
|
121
|
+
if (typeof path !== 'string' || !/^content\/[a-z0-9-]+(?:\/[a-z0-9-]+)*\.md$/.test(path) || typeof kind !== 'string' ||
|
|
122
|
+
!['document', 'glossary', 'procedure', 'rule', 'qa'].includes(kind) || !files.has(path)) return { ok: false, reason: 'invalid-content' };
|
|
123
|
+
const body = files.get(path)!;
|
|
124
|
+
cards.push({ schema_version: 2, id: path, createdAt: now, updatedAt: now, author: entry.name,
|
|
125
|
+
title: body.match(/^# (.+)$/m)?.[1] ?? path, body, nature: 'fact',
|
|
126
|
+
kind: ({ procedure: 'playbook', glossary: 'wiki', qa: 'card', rule: 'checklist', document: 'note' } as Record<string, KnowledgeKind>)[kind]!,
|
|
127
|
+
reliability: 'self-reported', source: { kind: 'external', url: artifactUrl.href }, tags: [entry.name] });
|
|
128
|
+
}
|
|
129
|
+
if (cards.length > 200 || new Set(cards.map(card => card.id)).size !== cards.length ||
|
|
130
|
+
scanPackInternalRefs([...files].map(([path, text]) => ({ path, text }))).length) return { ok: false, reason: 'invalid-content' };
|
|
131
|
+
const pack = createPack({ id: { slug: entry.name, version: entry.version }, title: manifest.description as string,
|
|
132
|
+
intent: manifest.description as string, audience: input.enterpriseId ? 'team' : 'public', kind: 'generic',
|
|
133
|
+
author: entry.name, cards });
|
|
134
|
+
if (input.store) input.store.writePack(pack);
|
|
135
|
+
else {
|
|
136
|
+
const store = new KgsSqliteStore();
|
|
137
|
+
try { store.writePack(pack); } finally { store.close(); }
|
|
138
|
+
}
|
|
139
|
+
return { ok: true, packId: `pack:${entry.name}@${entry.version}`, citations: cards.map(card => `pack:${entry.name}@${entry.version}#${card.id}`) };
|
|
140
|
+
} catch {
|
|
141
|
+
return { ok: false, reason: 'knowledge-pack-install-failed' };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
26
145
|
// GK1 public bundle: packs/elanous-essentials/plugin.json extensions.ai.elanous.bundle.
|
|
27
146
|
const ESSENTIAL_SKILLS = ['youtube-master', 'omni-crawl', 'omni-digest', 'diagram-master', 'lecture-note-digitizer'];
|
|
28
147
|
// A malicious or broken gift must not exhaust the temp disk: cap the download, the unpacked total and the entry count.
|
package/src/skills/runner.ts
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
// substitute template variables, and run them through the selected LLM provider.
|
|
4
4
|
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
6
|
+
import type { SkillTier } from './skill-tier.js';
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { recordSkillRunSafe, type SkillRun } from './skill-feedback.js';
|
|
6
9
|
import { readFileSync, readdirSync, existsSync, statSync } from 'fs';
|
|
7
10
|
import { join } from 'path';
|
|
8
11
|
import { LOCAL_SKILLS_DIR } from '../config.js';
|
|
@@ -307,7 +310,7 @@ export interface SkillManifest {
|
|
|
307
310
|
}
|
|
308
311
|
|
|
309
312
|
/** Ordered weak→strong. Session 21. */
|
|
310
|
-
export type SkillTier
|
|
313
|
+
export type { SkillTier } from './skill-tier.js';
|
|
311
314
|
const TIER_RANK: Record<SkillTier, number> = { T3: 1, T2: 2, T1: 3 };
|
|
312
315
|
|
|
313
316
|
/** True when `active` is at least as strong as `min`. Missing `min`
|
|
@@ -690,6 +693,9 @@ export interface ExecuteSkillOpts {
|
|
|
690
693
|
* pure-builder input so tests and future callers can reason about
|
|
691
694
|
* the final message shape without opening the SQLite store. */
|
|
692
695
|
promptBankContext?: string;
|
|
696
|
+
/** Use this provider instead of resolving one from config/model hint
|
|
697
|
+
* (tests and hosts that already hold a provider). */
|
|
698
|
+
provider?: LLMProvider;
|
|
693
699
|
}
|
|
694
700
|
|
|
695
701
|
export interface ExecuteSkillResult {
|
|
@@ -968,6 +974,57 @@ export async function executeSkill(
|
|
|
968
974
|
args: string,
|
|
969
975
|
onChunk: (delta: string, full: string) => void,
|
|
970
976
|
opts: ExecuteSkillOpts = {},
|
|
977
|
+
): Promise<ExecuteSkillResult> {
|
|
978
|
+
// SK1: one feedback ledger line per run. Recording is fail-soft — the
|
|
979
|
+
// result returned and the exception thrown are exactly the run's own.
|
|
980
|
+
let started: number | undefined;
|
|
981
|
+
try { started = Date.now(); } catch { /* clock trouble must not block the skill */ }
|
|
982
|
+
const feedback = (outcome: SkillRun['outcome'], failureKind?: string): SkillRun => ({
|
|
983
|
+
skill: manifest.name,
|
|
984
|
+
runId: randomUUID(),
|
|
985
|
+
outcome,
|
|
986
|
+
...(failureKind ? { failureKind } : {}),
|
|
987
|
+
userCorrected: false,
|
|
988
|
+
retries: 0,
|
|
989
|
+
durationMs: started === undefined ? 0 : Math.max(0, Date.now() - started),
|
|
990
|
+
at: new Date().toISOString(),
|
|
991
|
+
});
|
|
992
|
+
const record = (outcome: SkillRun['outcome'], failureKind?: string): void => {
|
|
993
|
+
try {
|
|
994
|
+
recordSkillRunSafe(feedback(outcome, failureKind));
|
|
995
|
+
} catch (error) {
|
|
996
|
+
// Building the record itself failed — still fail-soft, still observed.
|
|
997
|
+
try {
|
|
998
|
+
debug.log('skill.feedback', 'record-failed', { skill: manifest.name, error: String(error) }, { level: 'warn' });
|
|
999
|
+
} catch { /* never let observation change the skill outcome */ }
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
let result: ExecuteSkillResult;
|
|
1003
|
+
try {
|
|
1004
|
+
result = await executeSkillUnrecorded(manifest, args, onChunk, opts);
|
|
1005
|
+
} catch (error) {
|
|
1006
|
+
record('failure', skillFailureKind(error));
|
|
1007
|
+
throw error;
|
|
1008
|
+
}
|
|
1009
|
+
record('success');
|
|
1010
|
+
return result;
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
/** Failure kind for the feedback ledger: the exception's name, else 'error'. */
|
|
1014
|
+
function skillFailureKind(error: unknown): string {
|
|
1015
|
+
try {
|
|
1016
|
+
const name = (error as { name?: unknown } | null)?.name;
|
|
1017
|
+
return typeof name === 'string' && name !== '' ? name : 'error';
|
|
1018
|
+
} catch {
|
|
1019
|
+
return 'error';
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
async function executeSkillUnrecorded(
|
|
1024
|
+
manifest: SkillManifest,
|
|
1025
|
+
args: string,
|
|
1026
|
+
onChunk: (delta: string, full: string) => void,
|
|
1027
|
+
opts: ExecuteSkillOpts,
|
|
971
1028
|
): Promise<ExecuteSkillResult> {
|
|
972
1029
|
debug.log('skill.router', 'executeSkill', {
|
|
973
1030
|
skill: manifest.name,
|
|
@@ -982,7 +1039,7 @@ export async function executeSkill(
|
|
|
982
1039
|
// vars. Previously getProvider(modelHint) — env-only — meant a user
|
|
983
1040
|
// with config.provider=openai-codex but XAI_API_KEY still in env
|
|
984
1041
|
// would see every skill fall back to Grok.
|
|
985
|
-
const provider: LLMProvider = resolveDefaultProvider(rawModelHint);
|
|
1042
|
+
const provider: LLMProvider = opts.provider ?? resolveDefaultProvider(rawModelHint);
|
|
986
1043
|
// If the skill's declared model belongs to a DIFFERENT provider
|
|
987
1044
|
// family than the one user-config resolved to, drop it. Example:
|
|
988
1045
|
// user has openai-codex configured but a skill's SKILL.md says
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { appendFileSync, readFileSync } from 'node:fs';
|
|
1
|
+
import { appendFileSync, mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
2
3
|
import { debug } from '../debug/log.js';
|
|
4
|
+
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
3
5
|
|
|
4
6
|
export interface SkillRun {
|
|
5
7
|
skill: string;
|
|
@@ -25,6 +27,34 @@ export function appendSkillRun(ledgerPath: string, run: SkillRun): void {
|
|
|
25
27
|
appendFileSync(ledgerPath, `${JSON.stringify(run)}\n`, 'utf8');
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Ledger for skill runs: `<root>/skills/feedback.jsonl`, root defaulting to the
|
|
32
|
+
* effective instance (state) root — never a skill folder. Creates the directory.
|
|
33
|
+
*/
|
|
34
|
+
export function skillFeedbackLedgerPath(root: string = effectiveInstanceRoot()): string {
|
|
35
|
+
const dir = join(root, 'skills');
|
|
36
|
+
mkdirSync(dir, { recursive: true });
|
|
37
|
+
return join(dir, 'feedback.jsonl');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Fail-soft record of one skill run: resolving or writing the ledger never
|
|
42
|
+
* throws to the caller; a failure leaves a single `record-failed` observation.
|
|
43
|
+
*/
|
|
44
|
+
export function recordSkillRunSafe(run: SkillRun, ledgerPath?: string): void {
|
|
45
|
+
try {
|
|
46
|
+
appendSkillRun(ledgerPath ?? skillFeedbackLedgerPath(), run);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
try {
|
|
49
|
+
debug.log('skill.feedback', 'record-failed', { skill: run.skill, error: String(error) }, { level: 'warn' });
|
|
50
|
+
} catch { /* observation must not break the skill result either */ }
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
debug.log('skill.feedback', 'recorded', { skill: run.skill, outcome: run.outcome, durationMs: run.durationMs });
|
|
55
|
+
} catch { /* fail-soft */ }
|
|
56
|
+
}
|
|
57
|
+
|
|
28
58
|
/** Read the JSONL ledger in append order; an absent ledger has no runs. */
|
|
29
59
|
export function readSkillRuns(ledgerPath: string): SkillRun[] {
|
|
30
60
|
let text: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type SkillTier = 'T3' | 'T2' | 'T1';
|